Entwurfsdatum | 9. Mai 2024 |
Durchführung | 13. Mai 2024 – 12. Juli 2024 |
Beschreibung | Entwickeln Sie die Open-Source-DEXScreener-Integration |
Autoren | Sourabh Niyogi und Matthias Funke |
Dexscreener ist eine führende Benutzeroberfläche für aktive Händler, die die jüngsten DEX-Aktivitäten zusammenfasst. Derzeit vertritt DEXScreener Stellaswap (auf Moonbeam), deckt das Polkadot-Ökosystem jedoch ansonsten nur schlecht ab. Dieser Vorschlag betrifft die Entwicklung von Dexscreener in den nächsten 60 Tagen für:
Es wird erwartet, dass andere Defi-Polkadot-Fallschirme den Endpunkt nutzen können, um eine ähnliche DEX-Indizierung für ihre Kette zu implementieren.
Die Implementierung erfolgt mit einem vollständig eigenständigen Docker-Container mit einem Node.js-basierten Indexer unter Verwendung eines MySQL-Backends gemäß der Dexscreener-Spezifikation. Eine kleine Anzahl von Tabellen block
, asset
, pair
event
wird für die Indizierung verwendet und unterstützt die folgenden 4 Endpunkte
GET /latest-block
Gibt den neuesten Block zurück, in dem Daten von /events
verfügbar sein werden
{
"block": {
"blockNumber": 12341234,
"blockTimestamp": 1698126147
}
}
blockTimestamp
stammt von set.timestamp
GET /asset?id=:string
Gibt Informationen zu einem Asset in der spezifischen Parachain zurück. Wir verwenden die id
aus der assets
-Palette in AssetHub (z. B. 1984 für USDT) oder assetRegistry
Palette in HydraDX (z. B. 26 für NODL).
Wie teilen wir dexscreener mit, über welche Assets wir verfügen? Ist das ein separater Endpunkt?
{
"asset": {
"id": "1000019",
"name": "DED",
"symbol": "DED",
"totalSupply": 10000000,
"circulatingSupply": 900000,
"coinGeckoId": "moonbeam"
}
}
assetRegistry.assets
und xyk.poolAssets
(wir müssen einige Off-Chain-Metadaten zusammenführen, z. B. Symbol und CoinGeckoId)Welche Felder sind optional? Möglicherweise gibt es nicht für alle Vermögenswerte eine CoinGeckoId oder der Umlaufbestand ist möglicherweise nicht bekannt.
assets.asset
und poolassets.asset
GET /pair?id=:string
Wir stimmen zu, dass die IDs immer in aufsteigender Reihenfolge sortiert werden (unter Verwendung von Zahlen, nicht von Zeichenfolgen), sodass wir eine Zeichenfolge wie 5-100019
für das Asset-Paar mit den IDs 5 und 100019 verwenden können.
Das andere Paar existiert nicht.
{
"pair": {
"id": "5-100019",
"dexKey": "hydradx",
"asset0Id": "5",
"asset1Id": "100019",
"feeBps": 30
}
}
id
stammt von xyk.poolAssets
oder poolassets.asset
, wobei asset0Id
und asset1ID
auflösbar sindfeeBps
für Hydradx? GET /events?fromBlock=:number&toBlock=:number
Gibt Swap-Ereignisse (eventType = Swap) und Pool-Liquiditätsereignisse zum Hinzufügen/Entfernen zurück
{
"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
ist der ExtrinsicHashtxnIndex
ist die ExtrinsicIDmaker
ist die SS58-Adresse des Unterzeichners des Extrinsic (Diskussion: Technisch gesehen ist der Unterzeichner der Abnehmer)pairId
stimmt mit dem pair
übereinasset0In
und asset1Out
werden direkt aus dem Ereignis übernommen. (NEIN: Wir müssen den gerouteten Swap dem Paar zuordnen)reserves
und Pool-Hinzufügen/Entfernen-Ereignisse in Hydradx Omnipool? Wir gehen davon aus, dass der Dexscreener Benutzer direkt mit einer Swap-Schnittstelle verbindet:
und für Pools:
Frage : Ist dieser Berührungspunkt korrekt? Wir glauben, dass dies Auswirkungen auf die Asset-ID und die Paar-ID hat und die folgende Frage direkt einschränkt.
Es wird davon ausgegangen, dass die meisten Leute, die dexScreener verwenden, Degens oder Arbitrageure sind. Sie können LRNA nicht kaufen, also können wir so tun, als ob LRNA nicht existiert? Das einzige Problem ist, dass einige Transaktionen zensiert werden, aber es gibt Situationen, in denen LPs in LRNA bezahlt werden und die LRNA dann gegen etwas anderes getauscht wird.
Frage: Wie sollen komplexe Trades auf Ereignisse abgebildet werden?
Wir müssen die Zuordnung von einem gerouteten Swap zu einem oder mehreren Paaren berechnen, implementiert im Dexscreener-Indexer. Matthias empfiehlt, dass wir die Paare dynamisch basierend auf einem bestimmten Volumenschwellenwert erstellen. In diesem Fall ist es eine Frage, welche Paare „virtuell“ erstellt werden sollen.
iBTC zu USDT könnte so aussehen:
... Wenn jemand tatsächlich 2-Pool- oder 4-Pool-Tokens hat, ordnen wir diese wie folgt zu:
HydraDX-Beispiele:
https://hydradx.subscan.io/extrinsic/5081726-2
Sollte wie folgt aufgenommen werden: 450,391786 USDT -> 0,15 WETH
https://hydradx.subscan.io/extrinsic/5081141-2
Sollte wie folgt aufgenommen werden: 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
Sollte Folgendes anzeigen: 10799.9040616235 INTR -> 772.6816006249018 4-Pool (erzwungene Zuordnung zu USDT*)
Kommentar: In diesem Fall wollte der Benutzer unbedingt einen 4-Pool besitzen.
https://hydradx.subscan.io/extrinsic/4705161-3?event=4705161-37
Sollte Folgendes anzeigen: 8899.9696696365 INTR -> 38.8922321335 vDOT