Uniswap API 指南:获取流动池数据、代币信息与创建图表

·

在之前的文章中,我们介绍了如何使用简单的 REST API 获取 Uniswap 交易数据。本文将重点展示如何通过单一的 GraphQL API 接口,高效获取最新的 Uniswap 流动池信息、代币数据及资金余额。

什么是 Uniswap 流动池?

在 Uniswap 上,任何用户都可以为一对代币创建流动池。创建过程中,需要为两个代币提供初始流动性以启动价格发现机制。每个流动池本质上是一个 ERC20 代币智能合约,由 Uniswap 工厂合约创建。

下面我们将通过具体示例,演示如何获取新创建的流动池列表。本文示例基于 Uniswap V2。

获取 Uniswap 流动池的 API 方法

要获取新创建的 Uniswap 流动池,我们需要使用以下 GraphQL 查询语句。查询端点为:https://graphql.bitquery.io/

{
 ethereum {
 arguments(smartContractAddress: {is: "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f"}, smartContractEvent: {is: "PairCreated"}, options: {desc: "block.height", limit: 3}) {
 block {
 height
 }
 argument {
 name
 }
 reference {
 address
 }
 }
 }
}

查询结果解析

执行上述查询后,将返回类似以下结果:

{
 "data": {
 "ethereum": {
 "arguments": [
 {
 "block": {
 "height": 10836664
 },
 "argument": {
 "name": "token0"
 },
 "reference": {
 "address": "0x930ed81ad809603baf727117385d01f04354612e"
 }
 },
 {
 "block": {
 "height": 10836664
 },
 "argument": {
 "name": "pair"
 },
 "reference": {
 "address": "0x7bc3a77b1b8daa4bf4b38c710119b932c5b27925"
 }
 },
 {
 "block": {
 "height": 10836664
 },
 "argument": {
 "name": "token1"
 },
 "reference": {
 "address": "0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8"
 }
 }
 ]
 }
 }
}

理解查询与返回结果

此查询从 Uniswap 事件中提取数据。每当创建新流动池时,Uniswap 会发出名为 PairCreated 的事件,并包含三个主要参数:

查询中使用了 Uniswap 工厂合约地址(0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f),并设置 limit 为 3 以获取最新的 3 个参数。

从结果中可以看到,这些参数分别对应 token0 地址、token1 地址和新创建的流动池地址。

获取代币详细信息

要了解特定代币的详细信息,只需使用代币地址运行以下查询:

{
 ethereum {
 address(address: {is: "0x930ed81ad809603baf727117385d01f04354612e"}) {
 annotation
 address
 smartContract {
 contractType
 currency {
 symbol
 name
 decimals
 tokenType
 }
 }
 balance
 }
 }
}

查询结果将包含代币符号、名称、小数位数和类型等详细信息:

{
 "data": {
 "ethereum": {
 "address": [
 {
 "annotation": "",
 "address": "0x930ed81ad809603baf727117385d01f04354612e",
 "smartContract": {
 "contractType": "Token",
 "currency": {
 "symbol": "SOLARITE",
 "name": "SOLARITE",
 "decimals": 18,
 "tokenType": "ERC20"
 }
 },
 "balance": 0
 }
 ]
 }
 }
}

获取流动池详细信息

获取流动池初始流动性数据

创建流动池时,需要为两个代币提供初始流动性。要了解池中两种代币的初始金额,可运行以下查询:

此查询获取流动池接收的前两笔交易(这里以之前结果中的流动池地址 0x7bc3a77b1b8daa4bf4b38c710119b932c5b27925 为例):

{
 ethereum {
 transfers(options: {asc: "block.timestamp.time", limit: 2}, amount: {gt: 0}, receiver: {is: "0x7bc3a77b1b8daa4bf4b38c710119b932c5b27925"}) {
 block {
 timestamp {
 time(format: "%Y-%m-%d %H:%M:%S")
 }
 height
 }
 address: sender {
 address
 annotation
 }
 currency {
 address
 symbol
 }
 amount
 transaction {
 hash
 }
 external
 }
 }
}

查询结果将显示初始流动性的详细信息:

{
 "data": {
 "ethereum": {
 "transfers": [
 {
 "block": {
 "timestamp": {
 "time": "2020-09-10 22:10:16"
 },
 "height": 10836664
 },
 "address": {
 "address": "0x37d50885b44500a2eacab7c93dd349590600f05f",
 "annotation": null
 },
 "currency": {
 "address": "0x930ed81ad809603baf727117385d01f04354612e",
 "symbol": "SOLARITE"
 },
 "amount": 0.08,
 "transaction": {
 "hash": "0xf69e4560ae36fd2948cfe5b6a5d22654b46307fe0ef04022bc68c8a3ee55f957"
 },
 "external": true
 },
 {
 "block": {
 "timestamp": {
 "time": "2020-09-10 22:10:16"
 },
 "height": 10836664
 },
 "address": {
 "address": "0x37d50885b44500a2eacab7c93dd349590600f05f",
 "annotation": null
 },
 "currency": {
 "address": "0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8",
 "symbol": "yDAI+yUSDC+yUSDT+yTUSD"
 },
 "amount": 200,
 "transaction": {
 "hash": "0xf69e4560ae36fd2948cfe5b6a5d22654b46307fe0ef04022bc68c8a3ee55f957"
 },
 "external": true
 }
 ]
 }
 }
}

获取流动池中各代币的总余额

要检查 Uniswap 流动池中两种代币的当前余额,可使用以下查询:

默认情况下,每个流动池的代币名称为 "UNI-V2",因为流动池本身也是一个 ERC20 代币。

{
 ethereum {
 address(address: {is: "0x7bc3a77b1b8daa4bf4b38c710119b932c5b27925"}) {
 balances {
 currency {
 symbol
 }
 value
 }
 }
 }
}

查询结果将显示池中各代币的余额:

{
 "data": {
 "ethereum": {
 "address": [
 {
 "balances": [
 {
 "currency": {
 "symbol": "UNI-V2"
 },
 "value": 0
 },
 {
 "currency": {
 "symbol": "SOLARITE"
 },
 "value": 619.42286725
 },
 {
 "currency": {
 "symbol": "yDAI+yUSDC+yUSDT+yTUSD"
 },
 "value": 199915.11344483
 }
 ]
 }
 ]
 }
 }
}

高级数据应用与可视化

掌握了基础数据获取方法后,您可以进一步利用这些API创建丰富的图表和分析工具。通过流动池数据,您可以:

👉 查看实时链上数据工具 获取更深入的市场洞察和分析能力。

常见问题

如何区分 Uniswap V2 和 V3 的API?

Uniswap V2 和 V3 使用不同的工厂合约地址。V2 工厂地址为 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f,而 V3 有多个工厂地址取决于部署的网络。查询时需要指定正确的合约地址。

GraphQL 与 REST API 相比有什么优势?

GraphQL 允许客户端精确指定需要的数据字段,减少过度获取和数据传输量。单个查询可以获取多个相关数据点,提高了查询效率和数据一致性。

这些API数据是否实时更新?

是的,通过区块链索引服务提供的数据通常是实时或近实时的。大多数服务提供每秒更新的区块链数据,确保您获取的是最新状态。

是否需要认证才能使用这些API?

大多数区块链数据API服务提供免费和付费 tiers。简单查询通常不需要认证,但高频或复杂查询可能需要API密钥。建议查看具体服务的文档了解详细限制。

能否获取历史流动池数据?

可以,通过指定区块高度或时间范围参数,您可以查询历史任意时间点的流动池状态和代币余额。这对于回测分析和历史研究非常有用。

总结

GraphQL API 提供了高度灵活和高效的方式来获取 Uniswap 及其他 DeFi 协议的数据。通过本文介绍的方法,您可以轻松获取流动池创建信息、代币详细数据和资金余额情况。

这些数据对于开发者构建DeFi分析工具、研究人员进行市场分析以及投资者做出明智决策都具有重要价值。随着DeFi生态的不断发展,掌握这些API使用技能将变得越来越重要。

在未来文章中,我们将继续介绍如何获取其他DeFi协议的数据,帮助您全面掌握区块链数据获取和分析技能。