tonight's moon is a

Samuel Metcalfe

MSc Financial Technology (1st Class Hons.), University of Exeter · BSc Financial Mathematics, University of Kent

Software engineer: reliable distributed systems, payments infrastructure and blockchain protocols.

My first venture into crypto was in 2014, mining Litecoin on a PC I had built at home, mostly for games. After my degree I decided to trade crypto full time for a year, on the strength of a £1,300 interest-free overdraft and not a great deal else. It went better than a sensible person would have predicted. Within a year the overdraft had paid for a master's in Financial Technology at the University of Exeter, and I finished it with first-class honours.

After the MSc I spent roughly 2.5 years working for myself in crypto, trading both on- and off-chain, and running self-hosted blockchain infrastructure from Hetzner servers. This is what led me to my first official job at Edge & Node, building The Graph (GRT), where I spent just over 2.5 years and got promoted twice along the way. I started out as a research analyst, in a small economics research team, designing the algorithm and latency linear regression model that ranks protocol participants and decides which of them earn paid indexing work. My work then moved from research to engineering to build out more of the Direct Indexing Payments (DIPs) stack.

1.7Bgateway query records replayed by the daily selection pipelineDocumented in the selection service's README: the daily measurement job replays recent gateway query traffic from Redpanda.
35Mchain RPC requests routed daily by my Go load balancerMeasured from the balancer's own metrics: about 25,000 requests a minute averaged across Arbitrum, Avalanche, Ethereum and their testnets. Private repo; demo on request.
113/119dipper changes merged Dec 2025 to Aug 2026, excluding bot dependency updatesClick to see the merged pull requests on GitHub; the other 6 in that window were automated dependency updates.
19security findings fixed across The Graph, including a critical issuance vulnerability13 OpenZeppelin findings on The Graph's Horizon contracts and 5 high-severity findings from the TRST audit of the indexer service. Separately, investigated and patched a vulnerability, reported through The Graph's Immunefi bug bounty, that would have let an attacker earn protocol issuance without contest.
8services and tools built or maintained across The Graph ecosystemThe 6 services on this page, plus the CCIP bridge capacity monitor and the end-to-end payments test harness in local-network.
01

Selected work

The indexing payments stack on The Graph, end to end.

Flagship · who gets paid · Python

Picks which indexers are offered paid indexing work. Taken from research prototype to production in Kubernetes. It replays about 1.7 billion gateway query records daily from Redpanda, sampling them for my latency linear regression. Indexers are scored on economic security, price, latency, uptime and success rate, preferring those already synced, and agreements go to a group with a high decentralisation score.

Paying side · Rust

Offers indexing agreements to indexers and manages each from proposal through settlement and withdrawal. Designed the agreement lifecycle state machine, chain listener and recovery paths that keep a dataset served when an indexer rejects, never answers or quietly stops indexing. Moved payments from off-chain signed vouchers to on-chain escrow across 4 repositories.

Who earns rewards · Python

Decides which indexers qualify for The Graph's indexing rewards and records the decisions on-chain on Arbitrum. Built the service and the criteria it enforces: a rolling 28-day window counting days an indexer served queries meeting published thresholds for response status, latency and freshness. Took it to production with RPC failover, gas bounds, a circuit breaker, and Slack and Opsgenie alerting.

Receiving side · Rust

The service indexers run to receive, verify and answer agreement proposals over gRPC. Wrote 25 of 26 changes merged to its DIPs code from January to August 2026. Rebuilt the trust model: proposals are attributed to whoever actually signed them and accepted only if that signer is on the protocol's on-chain list of approved payers, not a sender field anyone could fill in.

Accepting side · TypeScript

Moved on-chain acceptance onto its own parallel loop so agreements stopped expiring unaccepted under a backlog, then fixed 3 ways the agent quietly cost indexers money: dropped final payments, allocations left indexing unpaid, and live agreements destroyed by closing a stale allocation.

Shared record · AssemblyScript

Created the shared view of the on-chain record both sides read: indexes agreement and offer events from The Graph's contracts and serves them from a single GraphQL endpoint, so the paying service can reconcile and backfill without calling contracts over RPC on every catch-up pass.

Node operations

Off the clock · Infrastructure

I run a Graph Protocol indexer on mainnet and testnet, the same software I spent years building payment rails for, behind a fleet of 6 chain archive nodes and my Go load balancer, routing roughly 35 million RPC requests daily, plus validators on crypto networks. All on my own Proxmox and KVM hosts with ZFS storage, automated snapshots, Ansible configuration and Docker deployment.

LLM GPU workstation

Off the clock · AI

I built my own at-home LLM GPU workstation that serves self-hosted open-weight models with speculative decoding. I use this workstation to run some of my coding-agent sessions locally, instead of against a cloud API. This gives me access to 24/7 compute, which is useful for tasks with longer time horizons.

Options data pipeline

Off the clock · Quant

I run my own stock options data collection pipeline, tracking prices for over 100,000 options contracts covering stocks in the S&P 500. This pipeline's goal is to investigate profitable trading strategies around selling volatility risk premium from a quantitative analysis perspective.

Smart contracts & security

Protocol security · Solidity · EVM

Fixed 5 high-severity findings from the TRST third-party security audit of The Graph's indexer service, and addressed 13 OpenZeppelin audit findings across The Graph's Horizon upgrade contracts. Investigated and patched a subgraph withholding vulnerability, reported through The Graph's Immunefi bug bounty, that would have let an attacker earn protocol issuance without contest. Wrote the EVM-facing components of dipper and the rewards eligibility oracle.

Cross-chain GRT

Bridging · CCIP

Worked with Chainlink to integrate GRT with CCIP for The Graph's cross-chain token launch and pushed for Avalanche support. Deployed GRT on Base with a council-approved risk assessment. Built the council-required bridge monitor: every 5 minutes it checks CCIP rate-limiter capacity across Base, Avalanche, Arbitrum and Solana, paging on-call when capacity runs low or looks anomalous. Scoped contracts for delegating GRT across chains.

02

Elsewhere

Outside the payments stack.

RustBuilt dipper's agreement lifecycle and chain listener; rebuilt the proposal trust model in indexer-rs. PythonThe indexer selection service and the rewards eligibility oracle, both running in production. GoA load balancer fronting my own EVM node fleet, routing roughly 35 million RPC requests a day. Private repo; demo on request. TypeScriptParallel on-chain acceptance and 3 payment-loss fixes in the indexer agent. SQLSchema design, migrations and analytical queries across dipper and the daily selection pipeline. PostgreSQLAsync persistence and schema migrations in dipper; agreement storage in indexer-rs. GraphQLCreated the indexing payments subgraph, serving on-chain events from 1 endpoint. DockerEverything I self-host runs in it, and the local-network stack I used for end-to-end payment testing. Kafkadipper streams agreement lifecycle events to it. RedpandaThe selection pipeline replays about 1.7 billion gateway query records from it every day. AnsibleMy Proxmox and KVM hosts are configured entirely through it. KubernetesThe selection service, its daily measurement job, and the rewards oracle all run on it in production. ProxmoxThe hypervisor under my home fleet of chain nodes and services. SolidityAddressed 13 OpenZeppelin audit findings on The Graph's Horizon contracts; scoped the cross-chain delegation contracts. EthereumI run an archive node, moved DIPs to on-chain escrow payments, and deployed GRT on Base. AssemblyScriptThe mappings in the indexing payments subgraph. gRPCdipper's services and indexer-rs's proposal handling speak it to each other. ZFSThe storage under my fleet, with automated snapshot policies. scikit-learnThe latency regression in the selection service: encoding, scaling and a linear model fitted daily. Chainlink CCIPWorked with Chainlink's team on GRT's cross-chain launch and built the bridge capacity monitoring for it. AvalancheBuilt an ERC20 token launch at the 2024 Avalanche hackathon; an Avalanche node also runs in my home fleet. Swiftapple-juice, a Mac battery management CLI shipped via Homebrew.
03

Get in touch

Something I could help with? I'd like to hear about it.