Uniswap 是一个建立在以太坊上的去中心化协议,易信外汇代理easyforex-ib.com用户可以交换 ERC-20 代币,不需要买家和卖家创造需求。它是最受欢迎的去中心化交易所(DEX)。
Uniswap 使用y=k*x做市商机制来确定代币的价格,该产品保持不变,用于确定交易价格。
The Graph 是一个用于查询以太坊和 IPFS 数据的索引协议。任何人都可以贡献和创建 subgraph,从而使区块链数据的访问变得容易(参考: 使用 TheGraph 完善 Web3 事件数据检索。
The Graph 有多个 subgraph,如Aave、ENS、Balancer和MakerDAO。为了查询这些 subgraph 的数据,我们将使用 GraphQL。
GraphQL是一种开源的数据查询和操作语言,用于 Facebook 创建的 API。
Uniswap subgraph 可以在Uniswap V2 Subgraph 找到。
建立 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 } } " };
现在我们可以通过使用 GraphQL 客户端(SendQueryAsync.cs)中的SendQueryAsync方法来调用 API:
GraphQLResponseresponse = await _graphQLClient.SendQueryAsync (query);
我们将得到以下 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" } },
将 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("") }; return new GraphQLHttpClient(graphQLOptions, new SystemTextJsonSerializer()); }); services.AddSingleton (ctx => { IGraphQLClient graphQLClient = ctx.GetRequiredService (); return new Uniswap(graphQLClient); }); } }
在上面的代码中,我们已经使用了 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; } }
Uniswap .NET 标准库
这个完整的库是免费的,可以下载并通过运行 cli 命令添加到你的项目中。
dotnet add package Uniswap.dotnet --version 1.0.1
你也可以通过 nuget(.NET 的官方包管理器)或 GitHub 来添加这个包。
Uniswap.dotnet 1.0.1 – 在 TheGraph GraphQL API 上为 Uniswap V2 Subgraph 提供的 dotnet 标准封装器.
strykerin/Uniswap-dotnet(代码库)在 TheGraph GraphQL API 上的 Uniswap V2 Subgraph 的 dotnet 标准封装器。