Skip to content

Send Subgraph Data On-chain with Phat Contract x The Graph Template

License

Notifications You must be signed in to change notification settings

Phala-Network/the-graph-phat-contract

Repository files navigation

The Graph Starter Kit

⚠️ Important ⚠️

This guide references the mumbai testnet chain.

The mumbai testnet is deprecated since 2024/04/08, meaning the steps to deploy to a testnet will no longer work out of the box.

You can opt to use the amoy testnet or any other EVM testnet instead.

🔎 Overview

The Graph Starter Kit is your one-stop solution to connect any subgraph API from The Graph and return the data to your smart contract. Developers now have wide-ranging support for all EVM-compatible blockchains, including but not limited to Ethereum, Polygon, Arbitrum, Avalanche, Binance Smart Chain, Optimism, and zkSync.

Below is the high level design of the Request-and-Response model between the Consumer Contract and Phala's Phat Contract x Subgraphs from The Graph.

This starter kit empowers you to initiate the data request from the smart contract side for data from subgraphs on The Graph. The request is then seamlessly sent to your script for processing. You have the liberty to call any subgraph APIs to fulfill the request and define the response data structure that will be replied to your smart contract.

🏃 Quick Start

To kickstart your journey with The Graph Starter Kit, you will use the @phala/fn CLI tool.

Install the @phala/fn CLI tool. You can do this using your node package manager (npm) or use node package execute (npx). For the purpose of this tutorial, we will be using npx.

Once you have the CLI tool installed, you can create your first Phala Oracle template with the following command.

npx @phala/fn@latest init example
🚨 Note 🚨

When selecting your template, elect thegraph-phat-contract.

npx @phala/fn@latest init example
? Please select one of the templates for your "example" project: 
  phat-contract-starter-kit: Send data from any API to your smart contract with Javascript. 
  lensapi-oracle-consumer-contract: Send data from Lens API to your smart contract to empower your Web3 Social dApp. 
  vrf-oracle: TEE-guarded Verifiable Random Function template to bring randomness to your smart contract. 
  airstack-phat-contract: Request an account’s data from Airstack’s API to compute trust score and send to your Web3 dApp on-chain. 
❯ thegraph-phat-contract: Connect your subgraphs from The Graph to your on-chain dApps via Phat Contract.  

🛑 Not so fast! What is it exactly that we are building? 🛑

What are we building?

The artifact we are compiling is a JavaScript file, serving as the Phat Contract Oracle's tailored logic. This script is designed to respond to requests initiated from the Consumer Contract. The diagram provided above offers a visual representation of this request-response interaction.

Why is it important?

In the context of the off-chain environment, on-chain Smart Contracts are inherently limited. Their functionality is confined to the information available to them within the on-chain ecosystem. This limitation underscores the critical need for a secure off-chain oracle, such as the Phat Contract. This oracle is capable of fetching and transforming data, thereby enhancing the intelligence and awareness of Smart Contracts about on-chain activities. This is a pivotal step towards bridging the gap between the on-chain and off-chain worlds, making Smart Contracts not just smart, but also informed.

After creating The Graph template repo, cd into the new project and install the package dependencies. You can do this with the following command:

npm install

Now, build the default Phat Contract script with this command:

npx @phala/fn build

To simulate the expected result locally, run the Phat Contract script now with the npx @phala/fn run command to test the expected output when passing an encoded hexstring and the secrets into the main function of the Phat Contract. This is helpful to test locally quick to understand the functionality of your compiled Phat Contract.

Go to https://playground.ethers.org to decode and encode the hexstring you want to pass into your Phat Contract main function. In this example, the hexstring 0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000de1683287529b9b4c3132af8aad210644b259cfd represents types uint id and address target Here is what you will enter in the playground:

  • utils.defaultAbiCoder.decode(['uint id', 'address target'], '0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000de1683287529b9b4c3132af8aad210644b259cfd')
  • [ BigNumber { value: "1" }, "0xdE1683287529B9B4C3132af8AaD210644B259CfD", id: BigNumber { value: "1" }, target: "0xdE1683287529B9B4C3132af8AaD210644B259CfD" ] You can easily validate this by encoding the types and data with the utils.defaultAbiCoder.encode() function like below.
  • utils.defaultAbiCoder.encode(['uint id', 'address target'], [1, "0xdE1683287529B9B4C3132af8AaD210644B259CfD"])
  • "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000de1683287529b9b4c3132af8aad210644b259cfd"
npx @phala/fn run dist/index.js -a 0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000de1683287529b9b4c3132af8aad210644b259cfd '{"apiUrl": "https://gateway.thegraph.com/api/", "apiKey": "cd22a01e5b7f9828cddcb52caf03ee79"}'

Finally, run the local end-to-end tests with this command. Here we will simulate locally the interaction between the Phat Contract and the Consumer Contract with hardhat.

npm run localhost-test 

🥳 Congratulations!

You have successfully completed the quick start. For the next steps, you will learn how to deploy your Phala Oracle and connect to the consumer contract for the EVM testnet chain to start testing the request-response model live.

For a deeper dive into the details, click here, or continue reading to learn about the valuable features the Phala Oracle can offer to your on-chain consumer contract.


🪄 Features and Benefits

  • Wide support for all mainstream blockchains
  • Verifiable and decentralized: every Oracle is running on decentralized infrastructure that require no operations and can be easily verified
  • Support private data: your Oracle state is protected by cryptography and hardware
  • No extra cost: the only cost is the gas fee of response data which is sent as a transaction
  • High frequency: the request is synced to Oracle within one minute, and the latency of response is only limited by blockchain’s block interval

🏗️ Use cases & Examples

You could use the Oracle to:

📚 Resources

About

Send Subgraph Data On-chain with Phat Contract x The Graph Template

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published