• 译文出自:登链翻译计划 [1]

  • 译者:张小风 [2]

  • 校对:Tiny 熊 [3]

Uniswap 是一个建立在以太坊上的去中心化协议,用户可以交换 ERC-20 代币,不需要买家和卖家创造需求。它是最受欢迎的去中心化交易所 (DEX),在撰写本文时,总价值锁定超过 14 亿美元 [4]。

Uniswap 使用 y=k*x 做市商机制来确定代币的价格,该产品保持不变,用于确定交易价格。

The Graph 是一个用于查询以太坊和 IPFS 数据的索引协议。任何人都可以贡献和创建 subgraph,从而使区块链数据的访问变得容易(参考: 使用 TheGraph 完善 Web3 事件数据检索 [5]。

The Graph 有多个 subgraph,如 Aave[6]、ENS[7]、Balancer[8] 和 MakerDAO[9]。为了查询这些 subgraph 的数据,我们将使用 GraphQL。

GraphQL[10] 是一种开源的数据查询和操作语言,用于 Facebook 创建的 API。

Uniswap subgraph 可以在 Uniswap V2 Subgraph [11] 找到。

建立 Uniswap sdk。

为了进行 GraphQL 查询,我们需要两个包,一个用于进行 GraphQL 查询,另一个用于使用新的高性能的 System.Text.Json 反序列化数据。为了添加软件包,我们可以运行 cli 命令。

    dotnet add package GraphQL.Client --version 3.2.0  

    dotnet add package GraphQL.Cliente.Serializer.SystemTextJson --version 3.2.0  

现在,我们可以创建我们的 Uniswap.cs 类,它将通过构造函数注入来接收 IGraphQLClient。

    public class Uniswap : IUniswap  
    {  
        private readonly IGraphQLClient_graphQLClient;  

        public Uniswap(IGraphQLClient graphQLHttpClient)  
        {  
           _graphQLClient = graphQLHttpClient ?? throw new ArgumentNullException(nameof(graphQLHttpClient));  
        }  

获得流动性最高的市场交易对

我们现在可以调用 Uniswap V2 subgraph。创建一个名为 GetMostLiquidMarketPairs 的方法,并使用 GraphQL 进行第一个查询。为了创建查询,实例化 GraphQLRequest 类,并将 Query 属性设置为所需的 GraphQL 查询:

    ///   
    /// Get the first 150 most liquid market pairs ordered by desc  
    ///   
    ///   
    public async Task GetMostLiquidMarketPairs()  
    {  
        var query = new GraphQLRequest  
        {  
            Query = @"  
            {  
                pairs(first: 150, orderBy: reserveETH orderDirection: desc){  
                token0 {  
                  symbol  
                }  
                token1 {  
                  symbol  
                }  
                reserveETH  
                reserveUSD  
              }  
            }  
            "  
        };  

GetMostLiquidMarketPairs.cs

现在我们可以通过使用 GraphQL 客户端 (SendQueryAsync.cs) 中的 SendQueryAsync 方法来调用 API:

    GraphQLResponse response = await_graphQLClient.SendQueryAsync(query);  

调用 Uniswap V2subgraph

我们将得到以下 JSON 响应 (GetMostLiquidMarketPairs.json)。

    {  
      "pairs": [  
        {  
          "reserveETH": "3054879.156087123647945100225370331",  
          "reserveUSD": "1743372228.452697253933797109410237",  
          "token0": {  
            "symbol": "UETH"  
          },  
          "token1": {  
            "symbol": "ULCK"  
          }  
        },  
        {  
          "reserveETH": "244080.0678437459262731",  
          "reserveUSD": "159910793.9406229506814469778929296",  
          "token0": {  
            "symbol": "WBTC"  
          },  
          "token1": {  
            "symbol": "WETH"  
          }  
        },  
        {  
          "reserveETH": "194482.309033213794313742",  
          "reserveUSD": "127433830.4304311482666341163887563",  
          "token0": {  
            "symbol": "DAI"  
          },  
          "token1": {  
            "symbol": "WETH"  
          }  
        },  
        {  
          "reserveETH": "188948.216124956584332354",  
          "reserveUSD": "123806052.2355680797669692758593685",  
          "token0": {  
            "symbol": "WETH"  
          },  
          "token1": {  
            "symbol": "USDT"  
          }  
        },  

GetMostLiquidMarketPairs JSON response

将 Uniswap 类添加到 DI 容器

为了能够访问建立的 Uniswap 类,我们将把它添加到 DI 容器中。为此,我们将创建 IUniswap 接口,并创建扩展方法 AddUniswap,可以在下面的代码中看到。我们为 IServiceCollection 接口创建一个扩展方法,因为在使用这个 sdk 时,我们只需在 StartUp.cs 类中添加 services.AddUniswap();

    public static class UniswapExtension  
    {  
        public static void AddUniswap(this IServiceCollection services)  
        {  
            services.AddSingleton(ctx =>  
            {  
                var graphQLOptions = new GraphQLHttpClientOptions  
                {  
                    EndPoint = new Uri("https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2")  
                };  
                return new GraphQLHttpClient(graphQLOptions, new SystemTextJsonSerializer());  
            });  

            services.AddSingleton(ctx =>  
            {  
                IGraphQLClient graphQLClient = ctx.GetRequiredService();  
                return new Uniswap(graphQLClient);  
            });  
        }  
    }  

AddUniswap.cs

在上面的代码中,我们已经使用了 HttpClient 类型的客户端,它只是一个为某些特定用途预先配置的 HttpClient

使用 Uniswap sdk

现在已经建立了 sdk,我们可以在自己的 API 中使用它。在下面的例子中,将通过构造函数注入得到 IUniwap 接口,然后我们就可以调用它的方法,如下面的示例控制器所示 :

    [ApiController]  
    [Route("[controller]")]  
    public class WeatherForecastController : ControllerBase  
    {  
        private readonly ILogger_logger;  
        private readonly IUniswap_uniswap;  


        public WeatherForecastController(ILogger logger, IUniswap uniswap)  
        {  
           _logger = logger;  
           _uniswap = uniswap;  
        }  

        [HttpGet]  
        public async Task Get(string project = null)  
        {  
            var result = await_uniswap.GetMostLiquidMarketPairs();  
            return result;  
        }  
    }  

使用 IUniswap.cs

Uniswap .NET 标准库

这个完整的库是免费的,可以下载并通过运行 cli 命令添加到你的项目中。

    dotnet add package Uniswap.dotnet --version 1.0.1  

你也可以通过 nuget (.NET 的官方包管理器)或 GitHub 来添加这个包。

Uniswap.dotnet 1.0.1[12] - 在 TheGraph GraphQL API 上为 Uniswap V2 Subgraph 提供的 dotnet 标准封装器 .

strykerin/Uniswap-dotnet(代码库)[13] 在 TheGraph GraphQL API 上的 Uniswap V2 Subgraph 的 dotnet 标准封装器。

结论

在这篇文章中,我们为 Uniswap V2 subgraph 构建了一个 dotnet 包装器,以获得去中心化交易所的分析结果,如获得流动性最高的交易对。

参考文献

  1. Uniswap[14] 在 Ethereumuniswap.org 上自动提供流动性的完全去中心化协议

  2. 什么是 Uniswap?[15]- 去中心化代币交易所指南 .

  3. [自动做市算法在很多场合被常规采用,从金融市场到博彩市场。

  4. 使用 DeFi Pulse API[16] 获取 DeFi 项目数据使用


本翻译由 Cell Network[17] 赞助支持。

来源:https://medium.com/coinmonks/get-uniswap-data-using-the-graph-79d0c6f7b9f2

参考资料

[1]

登链翻译计划 :https://github.com/lbc-team/Pioneer

[2]

张小风 :https://learnblockchain.cn/people/74

[3]

Tiny 熊 :https://learnblockchain.cn/people/15

[4]

14 亿美元 :https://defipulse.com/uniswap

[5]

使用 TheGraph 完善 Web3 事件数据检索 :https://learnblockchain.cn/article/1589

[6]

Aave:https://thegraph.com/explorer/subgraph/aave/protocol

[7]

ENS:https://thegraph.com/explorer/subgraph/ensdomains/ens

[8]

Balancer:https://thegraph.com/explorer/subgraph/balancer-labs/balancer

[9]

MakerDAO:https://thegraph.com/explorer/subgraph/protofire/makerdao-governance

[10]

GraphQL:https://en.wikipedia.org/wiki/GraphQL

[11]

Uniswap V2 Subgraph :https://thegraph.com/explorer/subgraph/uniswap/uniswap-v2

[12]

Uniswap.dotnet 1.0.1:https://www.nuget.org/packages/Uniswap.dotnet/

[13]

strykerin/Uniswap-dotnet(代码库):https://github.com/strykerin/Uniswap-dotnet

[14]

Uniswap:https://uniswap.org/

[15]

什么是 Uniswap?:https://decrypt.co/resources/what-is-uniswap

[16]

使用 DeFi Pulse API:https://reitter.medium.com/get-defi-projects-data-with-defi-pulse-api-81721f8e6dd2

[17]

Cell Network:https://www.cellnetwork.io/?utm_souce=learnblockchain

使用 TheGraph 获取 Uniswap 数据 (c#)