Your First Ethereum Subgraph
The substreams init
command allows you to easily auto-generate several types of Substreams projects. In this specific tutorial, you will learn how to bootstrap an EVM Substreams-powered Subgraph to filter all the EVM information (events and calls) with almost no-code needed
Before You Begin
Create the Project
The substreams init
command allows you choose among several code-generation tools, depending on your needs. In this example, you will create an EVM Substreams module that streams data to a subgraph.
In a command-line terminal, run
substreams init
.Choose
ethereum-subgraph
. Now, you will input the parameters needed to create your EVM Substreams-powered Subgraph.Project name
: give a name to the project. This will be used to create the folder in your computer.Select the chain
: select the EVM chain (Arbitrum, Ethereum Mainnet, Polygon...)Contract address
: input the smart contract address that you want to index. The ABI will be fetched from the corresponding blockchain scanner (e.g. Etherscan or Arbiscan). This might take a few seconds to complete.Verify the ABI
: the CLI will try to download the ABI the given smart contract address. If it is able to fetch it, the ABI will be shown in the screen, so you just have to confirm it is correct. If it is NOT able to fetch it, probably because the smart contract is not verified, you can input the ABI yourself.Initial block number
: input the block where you want to start indexing.Contract short name
: give an alias to the smart contract. This is useful in case you will track several smart contracts. The generated code will be prefix with the alias name.What do you want to track from this contract?
: you can choose to track events, calls or both.Is it a factory contract?
: choose whether the smart contract is a factory contract. If it is, you will be required to provide the event that signals the creation of new contracts and the address of one of the created contracts (so that the ABI can be retrieved).Add another contract
: choose if you want to index another contract. You track as many contracts as you need.Subgraph feed mode
: there are two in which subgraphs can receive data from Substreams: entities and triggersEntities: all the logic lives in the Substreams, so you can't modify the subgraph code in AssemblyScript.
Triggers: the logic lives in the subgraph, so you CAN modify the subgraph code in AssemblyScript and create your own aggregations. In this case, the Substreams only acts as a bridge between the chain and the subgraph.
Tip: Choose triggers if you want to place the code logic in the subgraph. You will be able to access the events and calls directly within the subgraph and create your own entities.
Directory
: choose the directory where the project will be created.Package build
: whether you want the Substreams package to the built. The Substreams package is the binary that extracts all the data from the blockchain. Always selectYes, build it
. Otherwise, you'd have to unzip the project and build it yourself.
Inspect the Project
Now, let's inspect the project and understand all the files created. Note that in this example, the following options have been chosen:
Track events and calls.
No factory contract.
Use triggers to feed data into the subgraph.
Depending on the options you choose in the codegen tool, the files created might differ, but the overall structure should remain the same.
In an IDE of your choice (e.g. VSCode), open the project.
The
src/mappings.ts
file contains the source of the subgraph. Here, you define thehandleEvents
function, which receives all the filtered events from the Substreams. You can manipulate and aggregate the events to create the subgraph entities that you need.The
.spkg
file is the binary file generated by the Substreams. Essentially, this file contains the all the source code to filter the events that you selected when running thesubstreams init
command. The Graph Node (i.e. the software that runs your subgraph) uses thespkg
file to extract the blockchain data and provide it as AssemblyScript code to thehandleEvents
function.The
schema.graphql
file contains the subgraph entities. You can use this file to define the output model of your subgraph. The entities defined in the GraphQL schema are generated into AssemblyScript code by running thegraph codegen
command.The
subgraph.yaml
file is the configuration file of the subgraph. It defines the source code of the subgraph (in this case, Substreams) and the handler that will receive the data extracted from the blockchain (in this case, thehandleEvents
function).
Build the Project
Before deploying your subgraph, you must install and generate all the necessary code:
Run
npm install
to install the dependencies of the project.Run
npm run generate
to generate the output of the Substreams (i.e. the events and calls) in AssemblyScript. This allows you to access the output of the Substreams inside the AssemblyScript code. In this case, theEventsCalls
object, representing the events and calls extracted from the blockchain.Run
npm run codegen
to generate the subgraph entities that you have defined in theschema.graphql
file.
Test the Subgraph
After installing all the necessary depdendencies of the project, you are now able to deploy the subgraph a local Graph Node.
Before publishing to decentralized network, you can test your subgraph locally, thus not incurring in any costs associated with the deployment. You can run a Graph Node instance (the software that indexers use) in a Docker environment, and replicate the deployment locally.
In the project that you created previously, the dev-environment
folders contains all the necessary files to spin up a Docker-based Graph Node environment (note that you will need Docker installed and available in your computer).
Spin up the environment by running the
dev-environment/start.sh
script. This script will create a Graph Node instance, a Postgres node and an IPFS node (all these dependencies are necessary for the local Graph Node to succesfully work).Once the Graph Node has started, in another command-line session, create a new subgraph using the NPM scripts provided in the project:
Note: The NPM scripts, defined in the scripts
section of the package.json
file, are just a wrapped of the Graph CLI commands.
The previous command connects to the local Graph Node and creates a subgraph. You can always remove the subgraph using the npm run remove-local
command.
Deploy the subgraph.
The previous command deploys the subgraph to the local Graph Node. You can now go back to the logs of the local Graph Node and check out the subgraph indexing.
In a production environment, you will publish your subgraph to the The Graph decentralized network (note for EVM chains you can also use The Graph Studio).
Last updated