Subgraph Deployment with Goldsky
Documentation Index
For AI agents, the full documentation index is at /docs/llms.txt.
This guide covers how to deploy and manage subgraphs for Mezo protocols using Goldsky’s infrastructure. Subgraphs enable efficient querying of blockchain data through GraphQL APIs.
Overview
Section titled “Overview”Subgraphs provide:
- Indexed Data: Fast access to blockchain data
- GraphQL API: Flexible querying interface
- Real-time Updates: Live data synchronization
- Custom Logic: Transform and aggregate on-chain data
Repository Structure
Section titled “Repository Structure”Mezo subgraph repositories typically contain:
- schema.graphql: GraphQL schema definitions
- subgraph.yaml: Subgraph manifest
- src/: Mapping logic (AssemblyScript)
- abis/: Contract ABIs
- tests/: Unit tests
Development Setup
Section titled “Development Setup”Prerequisites
Section titled “Prerequisites”- Node.js 18+ (check repository’s
.nvmrcfor exact version) - npm or yarn package manager
- Git
- Graph CLI
- Goldsky account
Installation
Section titled “Installation”- Clone the subgraph repository:
git clone https://github.com/mezo-org/subgraphs.gitcd subgraphs- Install dependencies:
npm install# oryarn install- Install Graph CLI:
npm install -g @graphprotocol/graph-cliSubgraph Development
Section titled “Subgraph Development”Schema Definition
Section titled “Schema Definition”Define your data models in schema.graphql:
type Token @entity { id: ID! name: String! symbol: String! decimals: Int! totalSupply: BigInt!}
type Transfer @entity { id: ID! from: Bytes! to: Bytes! amount: BigInt! timestamp: BigInt! transactionHash: Bytes!}Subgraph Manifest
Section titled “Subgraph Manifest”Configure your subgraph in subgraph.yaml:
specVersion: 0.0.5schema: file: ./schema.graphqldataSources: - kind: ethereum name: MUSDToken network: mezo-mainnet source: address: "0x..." # Contract address abi: MUSD startBlock: 0 mapping: kind: ethereum/events apiVersion: 0.0.7 language: wasm/assemblyscript entities: - Token - Transfer abis: - name: MUSD file: ./abis/MUSD.json eventHandlers: - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer file: ./src/mapping.tsMapping Logic
Section titled “Mapping Logic”Implement event handlers in src/mapping.ts:
import { Transfer as TransferEvent } from "../generated/MUSDToken/MUSD"import { Transfer, Token } from "../generated/schema"import { BigInt } from "@graphprotocol/graph-ts"
export function handleTransfer(event: TransferEvent): void { // Create transfer entity let transfer = new Transfer( event.transaction.hash.toHex() + "-" + event.logIndex.toString() )
transfer.from = event.params.from transfer.to = event.params.to transfer.amount = event.params.value transfer.timestamp = event.block.timestamp transfer.transactionHash = event.transaction.hash
transfer.save()
// Update token entity let token = Token.load("1") if (token == null) { token = new Token("1") token.name = "Mezo USD" token.symbol = "MUSD" token.decimals = 18 token.totalSupply = BigInt.fromI32(0) }
token.save()}Code Generation
Section titled “Code Generation”Generate TypeScript types from your schema:
# Generate typesgraph codegen
# Build subgraphgraph buildTesting
Section titled “Testing”Unit Tests
Section titled “Unit Tests”Write unit tests for your mappings:
import { describe, test, assert } from "matchstick-as/assembly/index"import { handleTransfer } from "../src/mapping"import { createTransferEvent } from "./utils"
describe("MUSD Transfer", () => { test("Should create transfer entity", () => { let event = createTransferEvent( "0xfrom", "0xto", BigInt.fromI32(1000) )
handleTransfer(event)
assert.fieldEquals( "Transfer", event.transaction.hash.toHex(), "amount", "1000" ) })})Run tests:
# Run all testsnpm test
# Run specific testgraph testDeployment with Goldsky
Section titled “Deployment with Goldsky”Prerequisites
Section titled “Prerequisites”- Create Goldsky Account: Sign up at goldsky.com
- Install Goldsky CLI:
npm install -g @goldsky/cli- Authenticate:
goldsky loginDeployment Process
Section titled “Deployment Process”- Deploy Subgraph:
# Deploy to Goldskygoldsky subgraph deploy <subgraph-name> <version>
# Examplegoldsky subgraph deploy musd-subgraph 1.0.0- Monitor Deployment:
# Check deployment statusgoldsky subgraph status <subgraph-name>
# View logsgoldsky subgraph logs <subgraph-name>Configuration
Section titled “Configuration”Create a Goldsky configuration file:
{ "version": "1", "name": "musd-subgraph", "schema": "./schema.graphql", "dataSources": [ { "name": "MUSD", "network": "mezo-mainnet", "address": "0x...", "startBlock": 0 } ]}Querying Subgraphs
Section titled “Querying Subgraphs”GraphQL Queries
Section titled “GraphQL Queries”Once deployed, query your subgraph:
# Get recent transfers{ transfers(first: 10, orderBy: timestamp, orderDirection: desc) { id from to amount timestamp transactionHash }}
# Get token information{ token(id: "1") { name symbol decimals totalSupply }}
# Filter transfers by address{ transfers(where: { from: "0x..." }) { id to amount timestamp }}Client Integration
Section titled “Client Integration”Integrate subgraph queries in your dApp:
import { request, gql } from 'graphql-request'
const endpoint = 'https://api.goldsky.com/api/public/project_...'
const query = gql` { transfers(first: 10, orderBy: timestamp, orderDirection: desc) { id from to amount timestamp } }`
async function getTransfers() { const data = await request(endpoint, query) return data.transfers}Apollo Client Integration
Section titled “Apollo Client Integration”import { ApolloClient, InMemoryCache, gql } from '@apollo/client'
const client = new ApolloClient({ uri: 'https://api.goldsky.com/api/public/project_...', cache: new InMemoryCache()})
const GET_TRANSFERS = gql` query GetTransfers { transfers(first: 10, orderBy: timestamp, orderDirection: desc) { id from to amount timestamp } }`
client.query({ query: GET_TRANSFERS }) .then(result => console.log(result))Monitoring and Maintenance
Section titled “Monitoring and Maintenance”Health Checks
Section titled “Health Checks”Monitor subgraph health:
# Check sync statusgoldsky subgraph status <subgraph-name>
# View sync laggoldsky subgraph info <subgraph-name>Updating Subgraphs
Section titled “Updating Subgraphs”Deploy new versions:
# Deploy updated versiongoldsky subgraph deploy <subgraph-name> <new-version>
# Examplegoldsky subgraph deploy musd-subgraph 1.1.0Error Handling
Section titled “Error Handling”Common issues and solutions:
- Sync Lag: Check RPC endpoint health
- Failed Handlers: Review mapping logic and logs
- Schema Mismatches: Ensure schema matches deployment
Best Practices
Section titled “Best Practices”Schema Design
Section titled “Schema Design”- Entities: Use meaningful entity names
- Relationships: Define clear entity relationships
- Indexing: Index frequently queried fields
- Immutability: Use immutable IDs for entities
Mapping Logic
Section titled “Mapping Logic”- Error Handling: Handle null values gracefully
- Gas Efficiency: Minimize entity loads and saves
- Consistency: Maintain data consistency
- Testing: Write comprehensive unit tests
Performance
Section titled “Performance”- Start Block: Set appropriate start blocks
- Batch Processing: Process events in batches
- Caching: Use entity caching effectively
- Pagination: Implement proper pagination in queries
Additional Resources
Section titled “Additional Resources”- Goldsky Documentation - Goldsky platform docs
- The Graph Documentation - Subgraph development guide
- GraphQL Documentation - GraphQL query language
- AssemblyScript Documentation - Mapping language
Support
Section titled “Support”For subgraph development support:
- Join the Mezo Discord
- Check subgraph repository issues on GitHub
- Review the FAQ
- Contact Goldsky Support