blob: 69a03d553cbbd440de3fc8220a8bffcd21ef3d66 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import { fetchAsync, logUtils } from '@0x/utils';
const PARADEX_BASE_URL = 'https://api.paradex.io/consumer/v0';
const ACTIVE_MARKETS_URL = PARADEX_BASE_URL + '/markets';
const ORDERBOOK_ENDPOINT = PARADEX_BASE_URL + '/orderbook';
const TOKEN_INFO_ENDPOINT = PARADEX_BASE_URL + '/tokens';
export const PARADEX_SOURCE = 'paradex';
export type ParadexActiveMarketsResponse = ParadexMarket[];
export interface ParadexMarket {
id: string;
symbol: string;
baseToken: string;
quoteToken: string;
minOrderSize: string;
maxOrderSize: string;
priceMaxDecimals: number;
amountMaxDecimals: number;
// These are not native to the Paradex API response. We tag them on later
// by calling the token endpoint and joining on symbol.
baseTokenAddress?: string;
quoteTokenAddress?: string;
}
export interface ParadexOrderbookResponse {
marketId: number;
marketSymbol: string;
bids: ParadexOrder[];
asks: ParadexOrder[];
}
export interface ParadexOrder {
amount: string;
price: string;
}
export type ParadexTokenInfoResponse = ParadexTokenInfo[];
export interface ParadexTokenInfo {
name: string;
symbol: string;
address: string;
}
export class ParadexSource {
private readonly _apiKey: string;
constructor(apiKey: string) {
this._apiKey = apiKey;
}
/**
* Call Paradex API to find out which markets they are maintaining orderbooks for.
*/
public async getActiveMarketsAsync(): Promise<ParadexActiveMarketsResponse> {
logUtils.log('Getting all active Paradex markets.');
const resp = await fetchAsync(ACTIVE_MARKETS_URL, {
headers: { 'API-KEY': this._apiKey },
});
const markets: ParadexActiveMarketsResponse = await resp.json();
logUtils.log(`Got ${markets.length} markets.`);
return markets;
}
/**
* Call Paradex API to find out their token information.
*/
public async getTokenInfoAsync(): Promise<ParadexTokenInfoResponse> {
logUtils.log('Getting token information from Paradex.');
const resp = await fetchAsync(TOKEN_INFO_ENDPOINT, {
headers: { 'API-KEY': this._apiKey },
});
const tokens: ParadexTokenInfoResponse = await resp.json();
logUtils.log(`Got information for ${tokens.length} tokens.`);
return tokens;
}
/**
* Retrieve orderbook from Paradex API for a given market.
* @param marketSymbol String representing the market we want data for.
*/
public async getMarketOrderbookAsync(marketSymbol: string): Promise<ParadexOrderbookResponse> {
logUtils.log(`${marketSymbol}: Retrieving orderbook.`);
const marketOrderbookUrl = `${ORDERBOOK_ENDPOINT}?market=${marketSymbol}`;
const resp = await fetchAsync(marketOrderbookUrl, {
headers: { 'API-KEY': this._apiKey },
});
const orderbookResponse: ParadexOrderbookResponse = await resp.json();
return orderbookResponse;
}
}
|