초안 작성 날짜 | 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 인덱싱을 구현할 수 있을 것으로 예상됩니다.
구현은 Dexscreener 사양에 따라 MySQL 백엔드를 사용하는 Node.js 기반 인덱서와 함께 완전히 독립된 Docker 컨테이너로 수행됩니다. 소수의 테이블 block
, asset
, pair
, event
인덱싱에 사용되며 다음 4개의 엔드포인트를 지원합니다.
GET /latest-block
/events
의 데이터를 사용할 수 있는 최신 블록을 반환합니다.
{
"block": {
"blockNumber": 12341234,
"blockTimestamp": 1698126147
}
}
blockTimestamp
set.timestamp
에서 가져온 것입니다.GET /asset?id=:string
특정 파라체인의 자산에 대한 정보를 반환합니다. AssetHub의 assets
팔레트(예: USDT의 경우 1984) 또는 HydraDX의 assetRegistry
팔레트(예: NODL의 경우 26)의 id
를 사용합니다.
우리가 어떤 자산을 가지고 있는지 dexscreener에게 어떻게 알릴 수 있나요? 별도의 엔드포인트인가요?
{
"asset": {
"id": "1000019",
"name": "DED",
"symbol": "DED",
"totalSupply": 10000000,
"circulatingSupply": 900000,
"coinGeckoId": "moonbeam"
}
}
assetRegistry.assets
및 xyk.poolAssets
(일부 오프체인 메타데이터(예: Symbol 및 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
스왑 이벤트(eventType = 스왑) 및 풀 유동성 추가/제거 이벤트를 반환합니다.
{
"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
ExtrinsicHash입니다.txnIndex
외부 ID입니다.maker
외부 서명자의 ss58 주소입니다(논의: 기술적으로 서명자는 테이커입니다).pairId
pair
일치합니다.asset0In
및 asset1Out
이벤트에서 직접 가져옵니다. (아니요: 라우팅된 스왑을 쌍에 매핑해야 합니다)reserves
및 풀 추가/제거 이벤트에 대한 전략은 무엇입니까? 우리는 Dexscreener가 사용자를 스왑 인터페이스에 직접 연결할 것으로 기대합니다.
풀의 경우:
질문 : 이 터치 포인트가 맞나요? 우리는 이것이 Assetid와 pairid가 무엇이어야 하는지에 영향을 미치고 다음 질문을 직접적으로 제한한다고 믿습니다.
dexScreener를 사용하는 대부분의 사람들은 degens 또는 차익 거래자라고 가정합니다. 그들은 LRNA를 구입할 수 없으므로 LRNA가 존재하지 않는 척할 수 있습니까? 유일한 문제는 일부 거래가 검열된다는 것입니다. 하지만 LP가 LRNA로 지불되고 LRNA가 다른 것으로 교환되는 상황이 있습니다.
질문: 복잡한 거래를 이벤트에 어떻게 매핑해야 합니까?
dexscreener 인덱서에 구현된 라우팅된 스왑에서 하나 이상의 쌍으로의 매핑을 계산해야 합니다. Matthias는 볼륨의 일부 임계값을 기반으로 쌍을 동적으로 생성할 것을 권장합니다. 이 경우 "가상으로" 생성할 쌍이 무엇인지에 대한 질문입니다.
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