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]找到。
为了进行 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 查询:
/// <summary>
/// Get the first 150 most liquid market pairs ordered by desc
/// </summary>
/// <returns></returns>
public async Task<Pools> 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<Pools> response = await _graphQLClient.SendQueryAsync<Pools>(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 容器中。为此,我们将创建IUniswap
接口,并创建扩展方法AddUniswap
,可以在下面的代码中看到。我们为IServiceCollection
接口创建一个扩展方法,因为在使用这个 sdk 时,我们只需在StartUp.cs
类中添加services.AddUniswap();
。
public static class UniswapExtension
{
public static void AddUniswap(this IServiceCollection services)
{
services.AddSingleton<IGraphQLClient>(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<IUniswap>(ctx =>
{
IGraphQLClient graphQLClient = ctx.GetRequiredService<IGraphQLClient>();
return new Uniswap(graphQLClient);
});
}
}
AddUniswap.cs
在上面的代码中,我们已经使用了 HttpClient 类型的客户端,它只是一个为某些特定用途预先配置的HttpClient
。
现在已经建立了 sdk,我们可以在自己的 API 中使用它。在下面的例子中,将通过构造函数注入得到IUniwap
接口,然后我们就可以调用它的方法,如下面的示例控制器所示:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger;
private readonly IUniswap _uniswap;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IUniswap uniswap)
{
_logger = logger;
_uniswap = uniswap;
}
[HttpGet]
public async Task<Pools> Get(string project = null)
{
var result = await _uniswap.GetMostLiquidMarketPairs();
return result;
}
}
使用 IUniswap.cs
这个完整的库是免费的,可以下载并通过运行 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 包装器,以获得去中心化交易所的分析结果,如获得流动性最高的交易对。
本翻译由 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