This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This is The Graph Protocol's smart contracts monorepo - a decentralized network for querying and indexing blockchain data. It uses pnpm workspaces to manage multiple packages.
# Install dependencies (uses pnpm)
pnpm install
# Build all packages
pnpm build
# Clean build artifacts
pnpm clean
# Deep clean (including node_modules)
pnpm clean:all# Run all tests
pnpm test
# Run tests with coverage
pnpm test:coverage
# Test a specific package
cd packages/<package-name> && pnpm test
# Test a single file (in contracts package)
cd packages/contracts && npx hardhat test test/<FILE_NAME>.ts
# Run Foundry tests (in horizon/subgraph-service)
cd packages/horizon && pnpm test
# Run integration tests
cd packages/horizon && pnpm test:integration
# Run deployment tests
cd packages/horizon && pnpm test:deployment# Run all linters
pnpm lint
# Format code
pnpm format
# Individual linters
pnpm lint:ts # TypeScript/JavaScript
pnpm lint:sol # Solidity
pnpm lint:natspec # NatSpec comments
pnpm lint:md # Markdown
pnpm lint:json # JSON files
pnpm lint:yaml # YAML files-
contracts - Original Graph Protocol contracts (staking, curation, disputes)
- Uses Hardhat for development
- Contains E2E testing framework for protocol validation
-
horizon - Next iteration of The Graph protocol
- Uses Hardhat + Foundry for testing
- Deployment via Hardhat Ignition
- Migration path from original protocol
-
subgraph-service - Data service implementation for Graph Horizon
- Manages disputes and allocations
- Part of the Horizon ecosystem
-
interfaces - Shared contract interfaces
- Centralized repository for all Solidity contract interfaces
- Used by multiple packages/programs for contract implementation and interaction
- Generates TypeScript types for distribution via npm
- Defaults to ethers v6 type generation
- Includes Wagmi type generation support
- Includes ethers v5 type generation
- Published types can be imported by any TypeScript program
-
token-distribution - Token locking and vesting contracts
- GraphTokenLockWallet and GraphTokenLockManager
- L2 token distribution functionality
-
toolshed - Shared development utilities
- Deployment helpers
- Test fixtures
- Hardhat extensions
- Proxy Upgradeable Pattern: Most contracts use OpenZeppelin's upgradeable proxy pattern
- Storage Separation: Storage contracts are separate from logic contracts
- Governor/Controller Pattern: Access control through Governor and Controller contracts
- Modular Design: Clear separation between protocol layers and services
- Unit Tests: TypeScript tests using Hardhat Test Environment
- Foundry Tests: Solidity tests (
.t.solfiles) for horizon and subgraph-service - Integration Tests: Cross-contract interaction testing
- E2E Tests: Full protocol deployment and operation validation
- Contract addresses stored in
addresses.jsonfiles per package - Multi-network support (mainnet, testnets, Arbitrum chains)
- Hardhat Ignition for deployment management
- Migration scripts for upgrading from original protocol to Horizon
Horizon packages use both Hardhat and Foundry. When developing:
- Use
forge testfor Foundry tests - Use
pnpm test:integrationfor integration tests - Set required RPC URLs using
npx hardhat vars set <variable>
For contract verification on block explorers:
npx hardhat vars set ARBISCAN_API_KEY <your-key>When making changes that should be published:
# Create a changeset
pnpm changeset
# Version packages (maintainer only)
pnpm changeset version
# Publish to npm (maintainer only)
pnpm changeset publish- Audit reports available in
audits/directories - Use existing proxy patterns and access control mechanisms
- Follow established upgrade procedures for contract modifications
- Report security issues through Immunefi bounty program