Skip to content

Commit

Permalink
Support fragments in GQL queries for subgraph watchers (#510)
Browse files Browse the repository at this point in the history
* Avoid updating latest block metrics on RPC errors

* Handle fragments in subgraph GQL queries

* Upgrade package versions

* Move private method in util graph database

---------

Co-authored-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
  • Loading branch information
nikugogoi and prathamesh0 authored May 17, 2024
1 parent 1ca7454 commit b57aa76
Show file tree
Hide file tree
Showing 19 changed files with 120 additions and 88 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"packages": [
"packages/*"
],
"version": "0.2.88",
"version": "0.2.89",
"npmClient": "yarn",
"useWorkspaces": true,
"command": {
Expand Down
2 changes: 1 addition & 1 deletion packages/cache/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/cache",
"version": "0.2.88",
"version": "0.2.89",
"description": "Generic object cache",
"main": "dist/index.js",
"scripts": {
Expand Down
12 changes: 6 additions & 6 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/cli",
"version": "0.2.88",
"version": "0.2.89",
"main": "dist/index.js",
"license": "AGPL-3.0",
"scripts": {
Expand All @@ -15,13 +15,13 @@
},
"dependencies": {
"@apollo/client": "^3.7.1",
"@cerc-io/cache": "^0.2.88",
"@cerc-io/ipld-eth-client": "^0.2.88",
"@cerc-io/cache": "^0.2.89",
"@cerc-io/ipld-eth-client": "^0.2.89",
"@cerc-io/libp2p": "^0.42.2-laconic-0.1.4",
"@cerc-io/nitro-node": "^0.1.15",
"@cerc-io/peer": "^0.2.88",
"@cerc-io/rpc-eth-client": "^0.2.88",
"@cerc-io/util": "^0.2.88",
"@cerc-io/peer": "^0.2.89",
"@cerc-io/rpc-eth-client": "^0.2.89",
"@cerc-io/util": "^0.2.89",
"@ethersproject/providers": "^5.4.4",
"@graphql-tools/utils": "^9.1.1",
"@ipld/dag-cbor": "^8.0.0",
Expand Down
24 changes: 13 additions & 11 deletions packages/cli/src/chain-head-exporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import debug from 'debug';
import { ethers } from 'ethers';
import JsonRpcProvider = ethers.providers.JsonRpcProvider;

import { fetchLatestBlockNumber } from '@cerc-io/util';

const log = debug('laconic:chain-head-exporter');

// Env overrides:
Expand Down Expand Up @@ -57,16 +55,20 @@ async function main (): Promise<void> {
registers: [metricsRegister],
labelNames: ['chain'] as const,
async collect () {
const [
latestEthBlockNumber,
latestFilBlockNumber
] = await Promise.all([
fetchLatestBlockNumber(ethProvider),
fetchLatestBlockNumber(filProvider)
]);
try {
const [
latestEthBlockNumber,
latestFilBlockNumber
] = await Promise.all([
ethProvider.getBlockNumber(),
filProvider.getBlockNumber()
]);

this.set({ chain: 'ethereum' }, latestEthBlockNumber);
this.set({ chain: 'filecoin' }, latestFilBlockNumber);
this.set({ chain: 'ethereum' }, latestEthBlockNumber);
this.set({ chain: 'filecoin' }, latestFilBlockNumber);
} catch (err) {
log('Error fetching latest block number', err);
}
}
});

Expand Down
4 changes: 2 additions & 2 deletions packages/codegen/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/codegen",
"version": "0.2.88",
"version": "0.2.89",
"description": "Code generator",
"private": true,
"main": "index.js",
Expand All @@ -20,7 +20,7 @@
},
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
"dependencies": {
"@cerc-io/util": "^0.2.88",
"@cerc-io/util": "^0.2.89",
"@graphql-tools/load-files": "^6.5.2",
"@npmcli/package-json": "^5.0.0",
"@poanet/solidity-flattener": "https://github.com/vulcanize/solidity-flattener.git",
Expand Down
10 changes: 5 additions & 5 deletions packages/codegen/src/templates/indexer-template.handlebars
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import JSONbig from 'json-bigint';
{{/if}}
import { ethers, constants } from 'ethers';
{{#if (subgraphPath)}}
import { SelectionNode } from 'graphql';
import { GraphQLResolveInfo } from 'graphql';
{{/if}}

import { JsonFragment } from '@ethersproject/abi';
Expand Down Expand Up @@ -458,9 +458,9 @@ export class Indexer implements IndexerInterface {
entity: new () => Entity,
id: string,
block: BlockHeight,
selections: ReadonlyArray<SelectionNode> = []
queryInfo: GraphQLResolveInfo
): Promise<any> {
const data = await this._graphWatcher.getEntity(entity, id, this._relationsMap, block, selections);
const data = await this._graphWatcher.getEntity(entity, id, this._relationsMap, block, queryInfo);

return data;
}
Expand All @@ -470,9 +470,9 @@ export class Indexer implements IndexerInterface {
block: BlockHeight,
where: { [key: string]: any } = {},
queryOptions: QueryOptions = {},
selections: ReadonlyArray<SelectionNode> = []
queryInfo: GraphQLResolveInfo
): Promise<any[]> {
return this._graphWatcher.getEntities(entity, this._relationsMap, block, where, queryOptions, selections);
return this._graphWatcher.getEntities(entity, this._relationsMap, block, where, queryOptions, queryInfo);
}

{{/if}}
Expand Down
10 changes: 5 additions & 5 deletions packages/codegen/src/templates/package-template.handlebars
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
"dependencies": {
"@apollo/client": "^3.3.19",
"@cerc-io/cli": "^0.2.88",
"@cerc-io/ipld-eth-client": "^0.2.88",
"@cerc-io/solidity-mapper": "^0.2.88",
"@cerc-io/util": "^0.2.88",
"@cerc-io/cli": "^0.2.89",
"@cerc-io/ipld-eth-client": "^0.2.89",
"@cerc-io/solidity-mapper": "^0.2.89",
"@cerc-io/util": "^0.2.89",
{{#if (subgraphPath)}}
"@cerc-io/graph-node": "^0.2.88",
"@cerc-io/graph-node": "^0.2.89",
{{/if}}
"@ethersproject/providers": "^5.4.4",
"debug": "^4.3.1",
Expand Down
6 changes: 2 additions & 4 deletions packages/codegen/src/templates/resolvers-template.handlebars
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,11 @@ export const createResolvers = async (indexerArg: IndexerInterface, eventWatcher
log('{{this.queryName}}', id, JSON.stringify(block, jsonBigIntStringReplacer));
gqlTotalQueryCount.inc(1);
gqlQueryCount.labels('{{this.queryName}}').inc(1);
assert(info.fieldNodes[0].selectionSet);

// Set cache-control hints
// setGQLCacheHints(info, block, gqlCacheConfig);

return indexer.getSubgraphEntity({{this.entityName}}, id, block, info.fieldNodes[0].selectionSet.selections);
return indexer.getSubgraphEntity({{this.entityName}}, id, block, info);
},

{{this.pluralQueryName}}: async (
Expand All @@ -123,7 +122,6 @@ export const createResolvers = async (indexerArg: IndexerInterface, eventWatcher
log('{{this.pluralQueryName}}', JSON.stringify(block, jsonBigIntStringReplacer), JSON.stringify(where, jsonBigIntStringReplacer), first, skip, orderBy, orderDirection);
gqlTotalQueryCount.inc(1);
gqlQueryCount.labels('{{this.pluralQueryName}}').inc(1);
assert(info.fieldNodes[0].selectionSet);

// Set cache-control hints
// setGQLCacheHints(info, block, gqlCacheConfig);
Expand All @@ -133,7 +131,7 @@ export const createResolvers = async (indexerArg: IndexerInterface, eventWatcher
block,
where,
{ limit: first, skip, orderBy, orderDirection },
info.fieldNodes[0].selectionSet.selections
info
);
},

Expand Down
10 changes: 5 additions & 5 deletions packages/graph-node/package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "@cerc-io/graph-node",
"version": "0.2.88",
"version": "0.2.89",
"main": "dist/index.js",
"license": "AGPL-3.0",
"devDependencies": {
"@cerc-io/solidity-mapper": "^0.2.88",
"@cerc-io/solidity-mapper": "^0.2.89",
"@ethersproject/providers": "^5.4.4",
"@graphprotocol/graph-ts": "^0.22.0",
"@nomiclabs/hardhat-ethers": "^2.0.2",
Expand Down Expand Up @@ -51,9 +51,9 @@
"dependencies": {
"@apollo/client": "^3.3.19",
"@cerc-io/assemblyscript": "0.19.10-watcher-ts-0.1.2",
"@cerc-io/cache": "^0.2.88",
"@cerc-io/ipld-eth-client": "^0.2.88",
"@cerc-io/util": "^0.2.88",
"@cerc-io/cache": "^0.2.89",
"@cerc-io/ipld-eth-client": "^0.2.89",
"@cerc-io/util": "^0.2.89",
"@types/json-diff": "^0.5.2",
"@types/yargs": "^17.0.0",
"bn.js": "^4.11.9",
Expand Down
22 changes: 17 additions & 5 deletions packages/graph-node/src/watcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import debug from 'debug';
import path from 'path';
import fs from 'fs';
import { ContractInterface, utils, providers } from 'ethers';
import { SelectionNode } from 'graphql';
import { GraphQLResolveInfo, SelectionNode } from 'graphql';

import { ResultObject } from '@cerc-io/assemblyscript/lib/loader';
import {
Expand Down Expand Up @@ -321,13 +321,15 @@ export class GraphWatcher {
id: string,
relationsMap: Map<any, { [key: string]: any }>,
block: BlockHeight,
selections: ReadonlyArray<SelectionNode> = []
queryInfo: GraphQLResolveInfo
): Promise<any> {
const dbTx = await this._database.createTransactionRunner();

try {
const selections = this._getSelectionsFromGQLInfo(queryInfo);

// Get entity from the database.
const result = await this._database.getEntityWithRelations(dbTx, entity, id, relationsMap, block, selections);
const result = await this._database.getEntityWithRelations(dbTx, entity, id, relationsMap, block, selections, queryInfo);
await dbTx.commitTransaction();

// Resolve any field name conflicts in the entity result.
Expand All @@ -346,7 +348,7 @@ export class GraphWatcher {
block: BlockHeight,
where: { [key: string]: any } = {},
queryOptions: QueryOptions,
selections: ReadonlyArray<SelectionNode> = []
queryInfo: GraphQLResolveInfo
): Promise<any> {
const dbTx = await this._database.createTransactionRunner();

Expand All @@ -357,8 +359,10 @@ export class GraphWatcher {
queryOptions.limit = DEFAULT_LIMIT;
}

const selections = this._getSelectionsFromGQLInfo(queryInfo);

// Get entities from the database.
const entities = await this._database.getEntities(dbTx, entity, relationsMap, block, where, queryOptions, selections);
const entities = await this._database.getEntities(dbTx, entity, relationsMap, block, where, queryOptions, selections, queryInfo);
await dbTx.commitTransaction();

return entities;
Expand Down Expand Up @@ -553,6 +557,14 @@ export class GraphWatcher {
return acc;
}, {});
}

_getSelectionsFromGQLInfo (queryInfo: GraphQLResolveInfo): readonly SelectionNode[] {
const [fieldNode] = queryInfo.fieldNodes;
const selectionSet = fieldNode.selectionSet;
assert(selectionSet, `selectionSet not present in GQL fieldNode ${fieldNode.name}`);

return selectionSet.selections;
}
}

export const getGraphDbAndWatcher = async (
Expand Down
6 changes: 3 additions & 3 deletions packages/ipld-eth-client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/ipld-eth-client",
"version": "0.2.88",
"version": "0.2.89",
"description": "IPLD ETH Client",
"main": "dist/index.js",
"scripts": {
Expand All @@ -20,8 +20,8 @@
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
"dependencies": {
"@apollo/client": "^3.7.1",
"@cerc-io/cache": "^0.2.88",
"@cerc-io/util": "^0.2.88",
"@cerc-io/cache": "^0.2.89",
"@cerc-io/util": "^0.2.89",
"cross-fetch": "^3.1.4",
"debug": "^4.3.1",
"ethers": "^5.4.4",
Expand Down
2 changes: 1 addition & 1 deletion packages/peer/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/peer",
"version": "0.2.88",
"version": "0.2.89",
"description": "libp2p module",
"main": "dist/index.js",
"exports": "./dist/index.js",
Expand Down
8 changes: 4 additions & 4 deletions packages/rpc-eth-client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/rpc-eth-client",
"version": "0.2.88",
"version": "0.2.89",
"description": "RPC ETH Client",
"main": "dist/index.js",
"scripts": {
Expand All @@ -19,9 +19,9 @@
},
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
"dependencies": {
"@cerc-io/cache": "^0.2.88",
"@cerc-io/ipld-eth-client": "^0.2.88",
"@cerc-io/util": "^0.2.88",
"@cerc-io/cache": "^0.2.89",
"@cerc-io/ipld-eth-client": "^0.2.89",
"@cerc-io/util": "^0.2.89",
"chai": "^4.3.4",
"ethers": "^5.4.4",
"left-pad": "^1.3.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/solidity-mapper/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/solidity-mapper",
"version": "0.2.88",
"version": "0.2.89",
"main": "dist/index.js",
"license": "AGPL-3.0",
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion packages/test/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/test",
"version": "0.2.88",
"version": "0.2.89",
"main": "dist/index.js",
"license": "AGPL-3.0",
"private": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/tracing-client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cerc-io/tracing-client",
"version": "0.2.88",
"version": "0.2.89",
"description": "ETH VM tracing client",
"main": "dist/index.js",
"scripts": {
Expand Down
8 changes: 4 additions & 4 deletions packages/util/package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"name": "@cerc-io/util",
"version": "0.2.88",
"version": "0.2.89",
"main": "dist/index.js",
"license": "AGPL-3.0",
"dependencies": {
"@apollo/utils.keyvaluecache": "^1.0.1",
"@cerc-io/nitro-node": "^0.1.15",
"@cerc-io/peer": "^0.2.88",
"@cerc-io/solidity-mapper": "^0.2.88",
"@cerc-io/peer": "^0.2.89",
"@cerc-io/solidity-mapper": "^0.2.89",
"@cerc-io/ts-channel": "1.0.3-ts-nitro-0.1.1",
"@ethersproject/properties": "^5.7.0",
"@ethersproject/providers": "^5.4.4",
Expand Down Expand Up @@ -52,7 +52,7 @@
"yargs": "^17.0.1"
},
"devDependencies": {
"@cerc-io/cache": "^0.2.88",
"@cerc-io/cache": "^0.2.89",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@types/bunyan": "^1.8.8",
"@types/express": "^4.17.14",
Expand Down
Loading

0 comments on commit b57aa76

Please sign in to comment.