Using Graph Protocol
You can use The Graph indexing protocol to create subgraphs on SKALE Chain data. You can reach out to the Graph community to request a Graph node, or you may run your own Graph node. These instructions assume you are using the SKALE-IMA-SDK and running your own graph node.
SKALE Chains deployed before Dec 2021 aren’t compatible with EIP-1898, and as such can’t be used with the Graph. |
-
Install Prerequisites
-
docker
-
docker-compose
-
nodejs
-
npm
-
yarn
-
truffle
-
-
Start the SKALE-IMA-SDK
Follow instructions here to setup the SKALE-IMA-SDK on a machine.
-
Configure a Graph Node
git clone https://github.com/graphprotocol/graph-node/ cd graph-node/docker
Then modify the
docker-compose.yml
file:ethereum: 'skale:http://host.docker.internal:15000' (1) ... extra_hosts: - "host.docker.internal:host-gateway" (2)
1 Replace with your SKALE Chain endpoint if not using the SKALE-IMA-SDK. 2 Add this if using host.docker.internal
on a Linux machine. -
Start the Graph Node
docker-compose up -d
To follow the container output, run
docker logs docker_graph-node_1 --follow
-
Prepare the Subgraph test
In another terminal on the same machine, execute:
git clone https://github.com/skalenetwork/se-integrations/ cd se-integrations/graph-protocol/
Modify the .env file.
SKALE_CHAIN=https://YOURSKALECHAINIP:PORT ACCOUNT=yourAccountFromMetamask PRIVATE_KEY=<PRIVATE_KEY> CONTRACT_ADDRESS=<CONTRACT_ADDRESS> (1)
1 You will add the contract address in step 7. -
Deploy Test contract
npm install truffle compile truffle migrate
-
Add deployed MyToken Contract address to subgraph.yaml
... dataSources: - kind: ethereum/contract name: MyToken network: skale (1) source: address: 'CONTRACT_ADDRESS' (2) abi: MyToken ...
1 Change from mainnet
toskale
to match docker-compose.yml in graph-node.2 Replace with deployed contract address. -
Add deployed MyToken contract address to .env file
-
Execute yarn
yarn && yarn codegen
-
Create local Subgraph
yarn create-local
Expected output:
Created subgraph: skaleToken Done in 1.04s.
Expected output in Graph-node container:
Dec 17 23:18:38.892 INFO Received subgraph_create request, params: SubgraphCreateParams { name: SubgraphName("skaleToken") }, component: JsonRpcServer
-
Deploy to Local
yarn deploy-local
-
Verify graph-node terminal
Expected output in graph-node container:
graph-node_1 | Apr 23 20:20:58.952 INFO Scanning blocks [0, 0], range_size: 1, subgraph_id: QmbWZiRDpGb95WkA1QH8UM3wsUMZeBmr6ZW2UJaMtGZADB, component: SubgraphInstanceManager > BlockStream
-
Execute graph test
truffle test --network skale test/myToken.test.forgraph.js
Expected output:
MyToken ... ✓ In the test (237ms) 1 passing (242ms)
-
Execute token test
truffle test --network skale test/myToken.test.js
Output:
... MyBalance ✓ enough account balance MyToken ✓ deploys a contract ✓ has a default token value (1042ms) ✓ can update token value (1042ms) 4 passing (3s)
-
Check your GraphQL:
-
Perform a test query:
{ myTokens(orderBy: tokenValue, orderDirection: asc) { id owner } }
Expected output:
{ "data": { "myTokens": [ { "id": "0x2", "owner": "..." }... ] } }