Docs
Sök⌘ K
  • Home
  • Om The Graph
  • Nätverk som stöds
  • Protocol Contracts
  • Subgrafer
    • Underströmmar
      • Token API
        • AI Suite
          • Indexing
            • Resources
              Subgrafer > Developing > Deploying

              6 minutes

              Deploying a Subgraph to Multiple Networks

              This page explains how to deploy a Subgraph to multiple networks. To deploy a Subgraph you need to first install the Graph CLI⁠. If you have not created a Subgraph already, see Creating a Subgraph.

              Deploying the Subgraph to multiple networks

              In some cases, you will want to deploy the same Subgraph to multiple networks without duplicating all of its code. The main challenge that comes with this is that the contract addresses on these networks are different.

              Using graph-cli

              Both graph build (since v0.29.0) and graph deploy (since v0.32.0) accept two new options:

              1Options:23      ...4      --network <name>          Network configuration to use from the networks config file5      --network-file <path>     Networks config file path (default: "./networks.json")

              You can use the --network option to specify a network configuration from a json standard file (defaults to networks.json) to easily update your Subgraph during development.

              Note: The init command will now auto-generate a networks.json based on the provided information. You will then be able to update existing or add additional networks.

              If you don’t have a networks.json file, you’ll need to manually create one with the following structure:

              1{2    "network1": { // nätverkets namn3        "dataSource1": { // namn på datakällan4            "address": "0xabc...", // Avtalets adress (frivillig uppgift)5            "startBlock": 123456 // startBlock (valfritt)6        },7        "dataSource2": {8            "address": "0x123...",9            "startBlock": 12344410        }11    },12    "network2": {13        "dataSource1": {14            "address": "0x987...",15            "startBlock": 12316        },17        "dataSource2": {18            "address": "0xxyz..",19            "startBlock": 45620        }21    },22    ...23}

              Note: You don’t have to specify any of the templates (if you have any) in the config file, only the dataSources. If there are any templates declared in the subgraph.yaml file, their network will be automatically updated to the one specified with the --network option.

              Now, let’s assume you want to be able to deploy your Subgraph to the mainnet and sepolia networks, and this is your subgraph.yaml:

              1# ...2dataSources:3  - kind: ethereum/contract4    name: Gravity5    network: mainnet6    source:7      address: '0x123...'8      abi: Gravity9    mapping:10      kind: ethereum/events

              Så här ska nätverkets konfigurationsfil se ut:

              1{2  "mainnet": {3    "Gravity": {4      "address": "0x123..."5    }6  },7  "sepolia": {8    "Gravity": {9      "address": "0xabc..."10    }11  }12}

              Nu kan vi köra något av följande kommandon:

              1# Using default networks.json file2yarn build --network sepolia34# Using custom named file5yarn build --network sepolia --network-file path/to/config

              The build command will update your subgraph.yaml with the sepolia configuration and then re-compile the Subgraph. Your subgraph.yaml file now should look like this:

              1# ...2dataSources:3  - kind: ethereum/contract4    name: Gravity5    network: sepolia6    source:7      address: '0xabc...'8      abi: Gravity9    mapping:10      kind: ethereum/events

              Now you are ready to yarn deploy.

              Note: As mentioned earlier, since graph-cli 0.32.0 you can directly run yarn deploy with the --network option:

              1# Using default networks.json file2yarn deploy --network sepolia34# Using custom named file5yarn deploy --network sepolia --network-file path/to/config

              Använda subgraph.yaml mallen

              One way to parameterize aspects like contract addresses using older graph-cli versions is to generate parts of it with a templating system like Mustache⁠ or Handlebars⁠.

              To illustrate this approach, let’s assume a Subgraph should be deployed to mainnet and Sepolia using different contract addresses. You could then define two config files providing the addresses for each network:

              1{2  "network": "mainnet",3  "address": "0x123..."4}

              och

              1{2  "network": "sepolia",3  "address": "0xabc..."4}

              Along with that, you would substitute the network name and addresses in the manifest with variable placeholders {{network}} and {{address}} and rename the manifest to e.g. subgraph.template.yaml:

              1# ...2dataSources:3  - kind: ethereum/contract4    name: Gravity5    network: mainnet6    network: {{network}}7    source:8      address: '0x2E645469f354BB4F5c8a05B3b30A929361cf77eC'9      address: '{{address}}'10      abi: Gravity11    mapping:12      kind: ethereum/events

              In order to generate a manifest to either network, you could add two additional commands to package.json along with a dependency on mustache:

              1{2  ...3  "scripts": {4    ...5    "prepare:mainnet": "mustache config/mainnet.json subgraph.template.yaml > subgraph.yaml",6    "prepare:sepolia": "mustache config/sepolia.json subgraph.template.yaml > subgraph.yaml"7  },8  "devDependencies": {9    ...10    "mustache": "^3.1.0"11  }12}

              To deploy this Subgraph for mainnet or Sepolia you would now simply run one of the two following commands:

              1# Mainnet:2yarn prepare:mainnet && yarn deploy34# Sepolia:5yarn prepare:sepolia && yarn deploy

              A working example of this can be found here⁠.

              Note: This approach can also be applied to more complex situations, where it is necessary to substitute more than contract addresses and network names or where generating mappings or ABIs from templates as well.

              This will give you the chainHeadBlock which you can compare with the latestBlock on your Subgraph to check if it is running behind. synced informs if the Subgraph has ever caught up to the chain. health can currently take the values of healthy if no errors occurred, or failed if there was an error which halted the progress of the Subgraph. In this case, you can check the fatalError field for details on this error.

              Subgraph Studio Subgraph archive policy

              A Subgraph version in Studio is archived if and only if it meets the following criteria:

              • The version is not published to the network (or pending publish)
              • The version was created 45 or more days ago
              • The Subgraph hasn’t been queried in 30 days

              In addition, when a new version is deployed, if the Subgraph has not been published, then the N-2 version of the Subgraph is archived.

              Every Subgraph affected with this policy has an option to bring the version in question back.

              Checking Subgraph health

              If a Subgraph syncs successfully, that is a good sign that it will continue to run well forever. However, new triggers on the network might cause your Subgraph to hit an untested error condition or it may start to fall behind due to performance issues or issues with the node operators.

              Graph Node exposes a GraphQL endpoint which you can query to check the status of your Subgraph. On the hosted service, it is available at https://api.thegraph.com/index-node/graphql. On a local node, it is available on port 8030/graphql by default. The full schema for this endpoint can be found here⁠. Here is an example query that checks the status of the current version of a Subgraph:

              1{2  indexingStatusForCurrentVersion(subgraphName: "org/subgraph") {3    synced4    health5    fatalError {6      message7      block {8        number9        hash10      }11      handler12    }13    chains {14      chainHeadBlock {15        number16      }17      latestBlock {18        number19      }20    }21  }22}

              This will give you the chainHeadBlock which you can compare with the latestBlock on your Subgraph to check if it is running behind. synced informs if the Subgraph has ever caught up to the chain. health can currently take the values of healthy if no errors occurred, or failed if there was an error which halted the progress of the Subgraph. In this case, you can check the fatalError field for details on this error.

              ⁠Edit on GitHub⁠

              Deploying Using Subgraph StudioPublishing to the Decentralized Network
              On this page
              • Deploying the Subgraph to multiple networks
              • Using graph-cli
              • Använda subgraph.yaml mallen
              • Subgraph Studio Subgraph archive policy
              • Checking Subgraph health
              The GraphStatusTestnetBrand AssetsForumSecurityPrivacy PolicyTerms of Service