Дата составления | 9 мая 2024 г. |
Выполнение | 13 мая 2024 г. - 12 июля 2024 г. |
Описание | Разработать интеграцию с DEXScreener с открытым исходным кодом. |
Авторы | Сураб Нийоги и Маттиас Функе |
Dexscreener — это ведущий пользовательский интерфейс для активных трейдеров, в котором подводятся итоги недавней активности DEX. В настоящее время DEXScreener представляет Stellaswap (на Moonbeam), но в остальном плохо охватывает экосистему Polkadot. Это предложение касается разработки Dexscreener в течение следующих 60 дней для:
Ожидается, что другие парачейны Defi Polkadot смогут использовать конечную точку этого для реализации аналогичной индексации DEX для своей цепочки.
Реализация будет осуществляться с использованием полностью автономного контейнера Docker с индексатором на основе Node.js и серверной частью MySQL в соответствии со спецификацией Dexscreener. Небольшое количество block
таблиц, asset
, pair
и event
будет использоваться для индексации и поддерживать следующие 4 конечные точки.
GET /latest-block
Возвращает последний блок, в котором будут доступны данные из /events
{
"block": {
"blockNumber": 12341234,
"blockTimestamp": 1698126147
}
}
blockTimestamp
взят из set.timestamp
GET /asset?id=:string
Возвращает информацию об активе в конкретном парачейне. Мы используем id
из палитры assets
в AssetHub (например, 1984 для USDT) или палитры assetRegistry
в HydraDX (например, 26 для NODL).
Как нам сообщить 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
Мы согласны с тем, что идентификаторы всегда будут сортироваться по возрастанию (с использованием чисел, а не строк), поэтому мы можем использовать строку типа 5-100019
для пары активов с идентификаторами 5 и 100019.
Другой пары не существует.
{
"pair": {
"id": "5-100019",
"dexKey": "hydradx",
"asset0Id": "5",
"asset1Id": "100019",
"feeBps": 30
}
}
id
будет взят из xyk.poolAssets
poolassets.asset
с разрешимыми asset0Id
и asset1ID
feeBps
для Hydradx? GET /events?fromBlock=:number&toBlock=:number
Возвращает события свопа (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
— это ExtrinsicID.maker
— это адрес ss58 подписывающего лица (ОБСУЖДАЙТЕ: технически подписывающее лицо является получателем)pairId
соответствует pair
asset0In
и asset1Out
берутся непосредственно из события. (НЕТ: нам нужно сопоставить маршрутизируемый обмен с парой)reserves
и событий добавления/удаления пула в омнипуле Hydradx? Мы ожидаем, что Dexscreener свяжет пользователей напрямую с интерфейсом подкачки:
и для бассейнов:
Вопрос : правильная ли эта точка касания? Мы считаем, что это влияет на то, какими должны быть активы и пары, и напрямую ограничивает следующий вопрос.
Предполагается, что большинство людей, использующих dexScreener, являются дегенератами или арбитражерами. Они не могут купить LRNA, поэтому мы можем сделать вид, что LRNA не существует? Единственная проблема заключается в том, что некоторые транзакции будут подвергаться цензуре, но бывают ситуации, когда LP выплачиваются в LRNA, а затем LRNA заменяется на что-то другое.
Вопрос: Как сложные сделки следует сопоставлять с событиями?
Нам нужно вычислить сопоставление маршрутизируемого свопа с одной или несколькими парами, реализованными в индексаторе dexscreener. Маттиас рекомендует создавать пары динамически на основе некоторого порога объема, и в этом случае вопрос в том, какие пары создавать «виртуально».
Переход iBTC в USDT может выглядеть следующим образом:
... Если у кого-то действительно есть токены с 2 или 4 пулами, мы сопоставляем их следующим образом:
Примеры HydraDX:
https://hyradx.subscan.io/extrinsic/5081726-2
Должен приниматься как: 450,391786 USDT -> 0,15 WETH.
https://hyradx.subscan.io/extrinsic/5081141-2
Должно приниматься как: 500 USDT -> 0,00808666 WBTC.
https://hyradx.subscan.io/extrinsic/5080488-0
80.9981538781 vDOT > 51616.002281331759 HDX
https://hyradx.subscan.io/extrinsic/4589219-2?event=4589219-13
Должно отображаться: 10799.9040616235 INTR -> 772.6816006249018 4-пул (сила сопоставлена с USDT*)
Комментарий: в данном случае пользователь очень хотел иметь 4-пул.
https://hyradx.subscan.io/extrinsic/4705161-3?event=4705161-37
Должно отображаться: 8899,9696696365 INTR -> 38,8922321335 vDOT.