起草日期 | 2024 年 5 月 9 日 |
执行 | 2024年5月13日 - 2024年7月12日 |
描述 | 开发开源 DEXScreener 集成 |
作者 | 苏拉布·尼约吉 (Sourabh Niyogi) 和马蒂亚斯·芬克 (Matthias Funke) |
Dexscreener 是活跃交易者的领先用户界面,总结了最近的 DEX 活动。目前,DEXScreener 代表 Stellaswap(在 Moonbeam 上),但对 Polkadot 生态系统的覆盖率较差。该提案涉及在未来 60 天内开发 Dexscreener,用于:
预计其他 defi Polkadot 平行链可以使用此端点为其链实现类似的 DEX 索引。
该实现将使用完全独立的 Docker 容器来完成,并使用 MySQL 后端的基于 Node.js 的索引器,遵循 Dexscreener 规范。少量表block
, asset
, pair
, event
将用于索引并支持以下 4 个端点
GET /latest-block
返回来自/events
的数据可用的最新块
{
"block": {
"blockNumber": 12341234,
"blockTimestamp": 1698126147
}
}
blockTimestamp
来自set.timestamp
GET /asset?id=:string
返回特定平行链上资产的信息。我们使用 AssetHub 中assets
托盘的id
(例如 USDT 的 1984)或 HydraDX 中assetRegistry
托盘的 ID(例如 NODL 的 26)
我们如何告诉 dexscreener 我们拥有哪些资产?这是一个单独的端点吗?
{
"asset": {
"id": "1000019",
"name": "DED",
"symbol": "DED",
"totalSupply": 10000000,
"circulatingSupply": 900000,
"coinGeckoId": "moonbeam"
}
}
assetRegistry.assets
和xyk.poolAssets
(我们需要加入一些链下元数据,例如符号和 coinGeckoId)哪些字段是可选的?可能并不存在所有资产的 coinGeckoId,或者可能不知道流通供应量。
assets.asset
和poolassets.asset
GET /pair?id=:string
我们同意 ID 始终按升序排序(使用数字,而不是字符串),因此我们可以对 ID 为 5 和 100019 的资产对使用5-100019
这样的字符串。
另一对不存在。
{
"pair": {
"id": "5-100019",
"dexKey": "hydradx",
"asset0Id": "5",
"asset1Id": "100019",
"feeBps": 30
}
}
id
将来自xyk.poolAssets
或poolassets.asset
, asset0Id
和asset1ID
可解析feeBps
GET /events?fromBlock=:number&toBlock=:number
返回 Swap 事件(eventType = swap)和池添加/删除流动性事件
{
"events": [
{
"block": {
"blockNumber": 12344321,
"blockTimestamp": 1673319600
},
"eventType": "swap",
"txnId": "0x1118d6bde171a4df1238f5eb69c4b9fff4d4e0169c91268dfa3661d6571faea9",
"txnIndex": 3,
"eventIndex": "12344321-5",
"maker": "7KjNuVyjY5Jv3znWGXSBBHt7Ls6Uwm1LmhswrGGDSYNUAwKW",
"pairId": "5-100019",
"asset0In": 10000,
"asset1Out": 20000,
"priceNative": 2,
"reserves": { "asset0": 100, "asset1": 50 }
},
...
]
}
txnID
是 ExtrinsicHashtxnIndex
是 ExtrinsicIDmaker
是外部签名者的 ss58 地址(讨论:从技术上讲,签名者就是接受者)pairId
与pair
对匹配asset0In
和asset1Out
直接从事件中获取。 (否:我们需要将路由交换映射到该对)reserves
和矿池添加/删除事件的策略是什么? 我们的期望是 Dexscreener 将用户直接链接到交换界面:
对于池:
问题:这个接触点正确吗?我们认为这对 assetid 和pairid 应该是什么有影响,并直接限制了以下问题。
假设大多数使用 dexScreener 的人都是德根斯或套利者。他们买不到LRNA,所以我们可以假装LRNA不存在吗?唯一的问题是某些交易会受到审查,但在某些情况下,LP 会以 LRNA 支付,然后 LRNA 会被交换为其他东西。
问题:复杂的交易应该如何映射到事件?
我们需要计算从路由交换到一对或多对的映射,在 dexscreener 索引器中实现。马蒂亚斯建议我们根据某个数量阈值动态创建对,在这种情况下,问题是要“虚拟”创建哪些对。
iBTC 到 USDT 的流程可能是这样的:
...如果某人实际上拥有 2 池或 4 池代币,我们将它们映射如下:
HydraDX 示例:
https://Hydradx.subscan.io/extrinsic/5081726-2
应摄取为:450.391786 USDT -> 0.15 WETH
https://Hydradx.subscan.io/extrinsic/5081141-2
应摄取为:500 USDT -> 0.00808666 WBTC
https://Hydradx.subscan.io/extrinsic/5080488-0
80.9981538781 vDOT > 51616.002281331759 HDX
https://Hydradx.subscan.io/extrinsic/4589219-2?event=4589219-13
应显示:10799.9040616235 INTR -> 772.6816006249018 4-Pool(强制映射到 USDT*)
评论:在这种情况下,用户确实想拥有 4 个池。
https://Hydradx.subscan.io/extrinsic/4705161-3?event=4705161-37
应显示:8899.9696696365 INTR -> 38.8922321335 vDOT