'Using the Uniswap v3 Subgraph or other options, how to find liquidity pools containing a given token symbol?

I am trying to get a list of all pools containing a token symbol with Uniswap v3 for arbitrage opportunities. For example, if I want to find all pools containing "WETH".

Using the subgraph,

{
    tokens(first: 10, where:{symbol:"WETH"}){
    id
    name
    symbol
  }
}

Returns:

{
  "data": {
    "tokens": [
      {
        "id": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
        "name": "Wrapped Ether",
        "symbol": "WETH"
      }
    ]
  }
}

Once I have a selected pool, I then will have token0 and token1 to use later in factory.getPool().

Now to find the pools that contain WETH, I use the graph to check if token0 OR token1 contains the WETH ID, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.

// search token0
{
    pools(first:10, where: {
    token0:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",            
}){
    token0{
      name
      symbol
      id
    }
    token1{
      name
      symbol
      id
    }
    }
}


// search token1
{
    pools(first:10, where: {
    token1:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",            
}){
    token0{
      name
      symbol
      id
    }
    token1{
      name
      symbol
      id
    }
    }
}

Now I have a list of all pools that that contain "WETH" and the pool ID's to use in factory to perform swaps.

So, what I would like to know is if there is a much simpler way of doing this please!?



Solution 1:[1]

I think you could use the "whitelistPools" property available in the Token query object.

Here is an example, tested on Uniswap v3 explorer and it works:

{
  token(id:"0x6b175474e89094c44da98b954eedeac495271d0f") {
    symbol,
    name,
    whitelistPools (orderBy: liquidity, orderDirection: desc) {
      id,
      token0 { id, symbol, decimals},
      token1 { id, symbol, decimals },
      liquidity,
      feeTier
    }
  }
}

In the example above I just passed in the DAI token address and I got a list of pools containing the given token. You can also know where our given token is a "token0" or "token1" (actually token0 is just the one with a smaller address hex value).

From the resulting list, you get a list of pools that you can easily filter from your code.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 DharmanBot