Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Comp-Updated #879

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
1 change: 1 addition & 0 deletions website/src/pages/ar/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/cs/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/de/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/en/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
139 changes: 139 additions & 0 deletions website/src/pages/en/subgraphs/cookbook/subgraph-composition.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
---
title: Enhance Your Subgraph Build Using Subgraph Composition with Sushiswap v3 on Base
sidebarTitle: 'Using Subgraph Composition with Sushiswap v3 on Base'
---

Leverage Subgraph composition to speed up development time. Create a base Subgraph with essential data, then build additional Subgraphs on top of it.

> Important Reminders:
>
> - Subgraph composition is built into the CLI, and you can deploy with [Subgraph Studio](https://thegraph.com/studio/).
> - You can use existing Subgraphs, but they must be redeployed with `specVersion` 1.3.0, which doesn't require you to write new code.
> - You may want to restructure your Subgraph to split out the logic as you move to a composable Subgraph world.

## Introduction

Composable Subgraphs enable you to combine multiple Subgraphs' data sources into a new Subgraph, facilitating faster and more flexible Subgraph development. Subgraph composition empowers you to create and maintain smaller, focused subgraphs that collectively form a larger, interconnected dataset.

### Benefits of Composition

Subgraph composition is a powerful feature for scaling, allowing you to:

- Reuse, mix, and combine existing data
- Streamline development and queries
- Use multiple data sources (up to five source Subgraphs)
- Speed up your Subgraph's syncing speed
- Handle errors and optimize the resync

## Architecture Overview

The setup for this example involves two Subgraphs:

1. **Source Subgraph**: Tracks event data as entities.
2. **Dependent Subgraph**: Uses the source Subgraph as a data source.

You can find these in the `source` and `dependent` directories.

- The **source Subgraph** is a basic event-tracking Subgraph that records events emitted by relevant contracts.
- The **dependent Subgraph** references the source Subgraph as a data source, using the entities from the source as triggers.

While the source Subgraph is a standard Subgraph, the dependent Subgraph uses the Subgraph composition feature.

### Source Subgraph

The source Subgraph tracks events from the Sushiswap v3 Subgraph on the Base chain. This Subgraph's configuration file is `source/subgraph.yaml`.

> The `source/subgraph.yaml` employs the advanced Subgraph feature, [declarative `eth_calls`](https://thegraph.com/docs/en/subgraphs/developing/creating/advanced/#declared-eth_call). To review the code for this `source/subgraph.yaml`, check out the [source Subgraph example repo](https://github.com/incrypto32/subgraph-composition-sample-subgraph/blob/a5f13cb4b961f92d5c5631dca589c54feb1c0a19/source/subgraph.yaml).

### Dependent Subgraph

The dependent Subgraph is in the `dependent/subgraph.yaml` file, which specifies the source Subgraph as a data source. This Subgraph uses entities from the source to trigger specific actions based on changes to those entities.

> To review the code for this `dependent/subgraph.yaml`, check out the [dependent Subgraph example repo](https://github.com/incrypto32/subgraph-composition-sample-subgraph/blob/main/dependant/subgraph.yaml).

## Get Started

The following is a guide that illustrates how to use one Subgraph as a data source for another. This example uses:

- Sushiswap v3 Subgraph on Base chain
- Two Subgraphs (but you can use up to **5 source** Subgraphs in your own development).

### Step 1. Set Up Your Source Subgraph

To set the source Subgraph as a data source in the dependent Subgraph, include the following in `subgraph.yaml`:

```yaml
specVersion: 1.3.0
schema:
file: ./schema.graphql
dataSources:
- kind: subgraph
name: Factory
network: base
source:
address: 'QmdXu8byAFCGSDWsB5gMQjWr6GUvEVB7S1hemfxNuomerz'
startBlock: 82522
```

Here, `source.address` refers to the Deployment ID of the source Subgraph, and `startBlock` specifies the block from which indexing should begin.

### Step 2. Define Handlers in Dependent Subgraph

Below is an example of defining handlers in the dependent Subgraph:

```typescript
export function handleInitialize(trigger: EntityTrigger<Initialize>): void {
if (trigger.operation === EntityOp.Create) {
let entity = trigger.data
let poolAddressParam = Address.fromBytes(entity.poolAddress)

// Update pool sqrt price and tick
let pool = Pool.load(poolAddressParam.toHexString()) as Pool
pool.sqrtPrice = entity.sqrtPriceX96
pool.tick = BigInt.fromI32(entity.tick)
pool.save()

// Update token prices
let token0 = Token.load(pool.token0) as Token
let token1 = Token.load(pool.token1) as Token

// Update ETH price in USD
let bundle = Bundle.load('1') as Bundle
bundle.ethPriceUSD = getEthPriceInUSD()
bundle.save()

updatePoolDayData(entity)
updatePoolHourData(entity)

// Update derived ETH price for tokens
token0.derivedETH = findEthPerToken(token0)
token1.derivedETH = findEthPerToken(token1)
token0.save()
token1.save()
}
}
```

In this example, the `handleInitialize` function is triggered when a new `Initialize` entity is created in the source Subgraph, passed as `EntityTrigger<Initialize>`. The handler updates the pool and token entities based on data from the new `Initialize` entity.

`EntityTrigger` has three fields:

1. `operation`: Specifies the operation type, which can be `Create`, `Modify`, or `Remove`.
2. `type`: Indicates the entity type.
3. `data`: Contains the entity data.

Developers can then determine specific actions for the entity data based on the operation type.

## Key Takeaways

- Use this powerful tool to quickly scale your Subgraph development and reuse existing data.
- The setup includes creating a base source Subgraph and referencing it in a dependent Subgraph.
- You define handlers in the dependent Subgraph to perform actions based on changes in the source Subgraph's entities.

This approach unlocks composability and scalability, simplifying both development and maintenance efficiency.

## Additional Resources

To use other advanced features in your Subgraph, check out [Subgraph advanced features](/developing/creating/advanced/) and [this Subgraph composition example repo](https://github.com/incrypto32/subgraph-composition-sample-subgraph).

To learn how to define three source Subgraphs, check out [this Subgraph composition example repo](https://github.com/isum/subgraph-composition-example).
1 change: 1 addition & 0 deletions website/src/pages/es/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/fr/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1164,7 +1164,6 @@ De même que pour les sources de données dynamiques de contrat, les utilisateur
##### Exemple `subgraph.yaml`

```yaml

---
templates:
- kind: file/ipfs
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/hi/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/it/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/ja/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/ko/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/mr/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/nl/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/pl/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/pt/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/ro/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/ru/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/sv/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/tr/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/uk/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/ur/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/vi/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/zh/subgraphs/cookbook/_meta.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export default {
'subgraph-composition': '',
'subgraph-debug-forking': '',
near: '',
cosmos: '',
Expand Down