在之前的文章中,我们介绍了如何使用简单的 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 的事件,并包含三个主要参数:
- token0:第一个 ERC20 代币地址
- token1:第二个 ERC20 代币地址
- pair:新创建的流动池(配对)代币地址
查询中使用了 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协议的数据,帮助您全面掌握区块链数据获取和分析技能。