cryptoexchange 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -1
  3. data/cryptoexchange.gemspec +4 -4
  4. data/lib/cryptoexchange/client.rb +3 -0
  5. data/lib/cryptoexchange/error.rb +6 -0
  6. data/lib/cryptoexchange/exchanges/anx/services/market.rb +4 -7
  7. data/lib/cryptoexchange/exchanges/bancor/market.rb +8 -0
  8. data/lib/cryptoexchange/exchanges/bancor/services/market.rb +36 -0
  9. data/lib/cryptoexchange/exchanges/bancor/services/pair.rb +24 -0
  10. data/lib/cryptoexchange/exchanges/bigone/market.rb +8 -0
  11. data/lib/cryptoexchange/exchanges/bigone/services/market.rb +49 -0
  12. data/lib/cryptoexchange/exchanges/bigone/services/order_book.rb +44 -0
  13. data/lib/cryptoexchange/exchanges/bigone/services/pairs.rb +23 -0
  14. data/lib/cryptoexchange/exchanges/bigone/services/trades.rb +32 -0
  15. data/lib/cryptoexchange/exchanges/bitflyer/services/market.rb +4 -5
  16. data/lib/cryptoexchange/exchanges/bittrex/services/market.rb +7 -0
  17. data/lib/cryptoexchange/exchanges/coinbene/market.rb +8 -0
  18. data/lib/cryptoexchange/exchanges/coinbene/services/market.rb +52 -0
  19. data/lib/cryptoexchange/exchanges/coinbene/services/order_book.rb +43 -0
  20. data/lib/cryptoexchange/exchanges/coinbene/services/pairs.rb +27 -0
  21. data/lib/cryptoexchange/exchanges/coinbene/services/trades.rb +32 -0
  22. data/lib/cryptoexchange/exchanges/cryptopia/services/market.rb +7 -0
  23. data/lib/cryptoexchange/exchanges/ethfinex/market.rb +8 -0
  24. data/lib/cryptoexchange/exchanges/ethfinex/services/market.rb +52 -0
  25. data/lib/cryptoexchange/exchanges/ethfinex/services/order_book.rb +52 -0
  26. data/lib/cryptoexchange/exchanges/ethfinex/services/pairs.rb +26 -0
  27. data/lib/cryptoexchange/exchanges/ethfinex/services/trades.rb +33 -0
  28. data/lib/cryptoexchange/exchanges/koinex/market.rb +8 -0
  29. data/lib/cryptoexchange/exchanges/koinex/services/market.rb +49 -0
  30. data/lib/cryptoexchange/exchanges/koinex/services/pairs.rb +26 -0
  31. data/lib/cryptoexchange/exchanges/liqui/services/market.rb +7 -0
  32. data/lib/cryptoexchange/exchanges/novaexchange/services/market.rb +7 -0
  33. data/lib/cryptoexchange/exchanges/radar_relay/market.rb +8 -0
  34. data/lib/cryptoexchange/exchanges/radar_relay/radar_relay.yml +409 -0
  35. data/lib/cryptoexchange/exchanges/radar_relay/services/market.rb +44 -0
  36. data/lib/cryptoexchange/exchanges/radar_relay/services/pairs.rb +22 -0
  37. data/lib/cryptoexchange/exchanges/trade_ogre/market.rb +8 -0
  38. data/lib/cryptoexchange/exchanges/trade_ogre/services/market.rb +48 -0
  39. data/lib/cryptoexchange/exchanges/trade_ogre/services/order_book.rb +46 -0
  40. data/lib/cryptoexchange/exchanges/trade_ogre/services/pairs.rb +25 -0
  41. data/lib/cryptoexchange/exchanges/trade_ogre/services/trades.rb +31 -0
  42. data/lib/cryptoexchange/exchanges/zb/market.rb +8 -0
  43. data/lib/cryptoexchange/exchanges/zb/services/market.rb +39 -0
  44. data/lib/cryptoexchange/exchanges/zb/services/order_book.rb +44 -0
  45. data/lib/cryptoexchange/exchanges/zb/services/pairs.rb +24 -0
  46. data/lib/cryptoexchange/exchanges/zb/services/trades.rb +32 -0
  47. data/lib/cryptoexchange/helpers/numeric_helper.rb +2 -0
  48. data/lib/cryptoexchange/services/market.rb +2 -0
  49. data/lib/cryptoexchange/services/pairs.rb +7 -1
  50. data/lib/cryptoexchange/version.rb +1 -1
  51. metadata +45 -10
@@ -0,0 +1,43 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Coinbene
3
+ module Services
4
+ class OrderBook < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ true
8
+ end
9
+ end
10
+
11
+ def fetch(market_pair)
12
+ output = super(ticker_url(market_pair))
13
+ adapt(output, market_pair)
14
+ end
15
+
16
+ def ticker_url(market_pair)
17
+ "#{Cryptoexchange::Exchanges::Coinbene::Market::API_URL}/market/orderbooks?symbol=#{market_pair.base}#{market_pair.target}"
18
+ end
19
+
20
+ def adapt(output, market_pair)
21
+ order_book = Cryptoexchange::Models::OrderBook.new
22
+ order_book.base = market_pair.base
23
+ order_book.target = market_pair.target
24
+ order_book.market = Coinbene::Market::NAME
25
+ order_book.asks = adapt_orders output["orderbook"]["asks"]
26
+ order_book.bids = adapt_orders output["orderbook"]["bids"]
27
+ order_book.timestamp = output['timestamp'] / 1000
28
+ order_book.payload = output
29
+ order_book
30
+ end
31
+
32
+ def adapt_orders(orders)
33
+ orders.collect do |order|
34
+ Cryptoexchange::Models::Order.new \
35
+ price: order['price'],
36
+ amount: order['quantity'],
37
+ timestamp: nil
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Coinbene
3
+ module Services
4
+ class Pairs < Cryptoexchange::Services::Pairs
5
+ PAIRS_URL = "#{Cryptoexchange::Exchanges::Coinbene::Market::API_URL}/market/ticker?symbol=all"
6
+
7
+ def fetch
8
+ output = super
9
+ adapt(output)
10
+ end
11
+
12
+ def adapt(output)
13
+ output['ticker'].map do |pair|
14
+ separator = /(USDT|BTC|ETH)\z/ =~ pair['symbol']
15
+ base = pair['symbol'][0..separator - 1]
16
+ target = pair['symbol'][separator..-1]
17
+ Cryptoexchange::Models::MarketPair.new(
18
+ base: base,
19
+ target: target,
20
+ market: Coinbene::Market::NAME
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Coinbene
3
+ module Services
4
+ class Trades < Cryptoexchange::Services::Market
5
+ def fetch(market_pair)
6
+ output = super(ticker_url(market_pair))
7
+ adapt(output, market_pair)
8
+ end
9
+
10
+ def ticker_url(market_pair)
11
+ "#{Cryptoexchange::Exchanges::Coinbene::Market::API_URL}/market/trades?symbol=#{market_pair.base}#{market_pair.target}"
12
+ end
13
+
14
+ def adapt(output, market_pair)
15
+ output['trades'].collect do |trade|
16
+ tr = Cryptoexchange::Models::Trade.new
17
+ tr.trade_id = trade['tradeid'] == '--' ? nil : trade['tradeid']
18
+ tr.base = market_pair.base
19
+ tr.target = market_pair.target
20
+ tr.type = trade['take'] == '--' ? nil : trade['take']
21
+ tr.price = trade['price']
22
+ tr.amount = trade['quantity']
23
+ tr.timestamp = Time.parse(trade['time']).to_i
24
+ tr.payload = trade
25
+ tr.market = Coinbene::Market::NAME
26
+ tr
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -20,6 +20,7 @@ module Cryptoexchange::Exchanges
20
20
  end
21
21
 
22
22
  def adapt(output)
23
+ handle_invalid(output)
23
24
  data = output['Data']
24
25
  base, target = data['Label'].split('/')
25
26
 
@@ -38,6 +39,12 @@ module Cryptoexchange::Exchanges
38
39
  ticker.payload = data
39
40
  ticker
40
41
  end
42
+
43
+ def handle_invalid(output)
44
+ if !output['Error'].nil?
45
+ raise Cryptoexchange::ResultParseError, { response: output }
46
+ end
47
+ end
41
48
  end
42
49
  end
43
50
  end
@@ -0,0 +1,8 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Ethfinex
3
+ class Market
4
+ NAME = 'ethfinex'
5
+ API_URL = 'https://api.ethfinex.com'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,52 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Ethfinex
3
+ module Services
4
+ class Market < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ true
8
+ end
9
+ end
10
+
11
+ def fetch(market_pair)
12
+ output = super(ticker_url(market_pair))
13
+ adapt(output, market_pair)
14
+ end
15
+
16
+ def ticker_url(market_pair)
17
+ "#{Cryptoexchange::Exchanges::Ethfinex::Market::API_URL}/v2/ticker/t#{market_pair.base.upcase}#{market_pair.target.upcase}"
18
+ end
19
+
20
+ def adapt(output, market_pair)
21
+ ticker = Cryptoexchange::Models::Ticker.new
22
+ ticker.base = market_pair.base
23
+ ticker.target = market_pair.target
24
+ ticker.market = Ethfinex::Market::NAME
25
+
26
+ # [
27
+ # BID,
28
+ # BID_SIZE,
29
+ # ASK,
30
+ # ASK_SIZE,
31
+ # DAILY_CHANGE,
32
+ # DAILY_CHANGE_PERC,
33
+ # LAST_PRICE,
34
+ # VOLUME,
35
+ # HIGH,
36
+ # LOW
37
+ # ]
38
+
39
+ ticker.ask = NumericHelper.to_d(output[2])
40
+ ticker.bid = NumericHelper.to_d(output[0])
41
+ ticker.last = NumericHelper.to_d(output[-4])
42
+ ticker.high = NumericHelper.to_d(output[-2])
43
+ ticker.low = NumericHelper.to_d(output[-1])
44
+ ticker.volume = NumericHelper.to_d(output[-3])
45
+ ticker.timestamp = Time.now.to_i
46
+ ticker.payload = output
47
+ ticker
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Ethfinex
3
+ module Services
4
+ class OrderBook < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ true
8
+ end
9
+ end
10
+ def fetch(market_pair)
11
+ pre_output = super(order_book_url(market_pair))
12
+ output = split(pre_output)
13
+ adapt(output, market_pair)
14
+ end
15
+
16
+ def order_book_url(market_pair)
17
+ "#{Cryptoexchange::Exchanges::Ethfinex::Market::API_URL}/v2/book/t#{market_pair.base}#{market_pair.target}/P0"
18
+ end
19
+
20
+ def split(pre_output)
21
+ output = [[], []] # output[0] = bids | output[1] = asks
22
+ pre_output.map do |order|
23
+ (order[-1].to_f > 0 ? output[0].push(order) : output[1].push(order))
24
+ end
25
+ output
26
+ end
27
+
28
+ def adapt(output, market_pair)
29
+ order_book = Cryptoexchange::Models::OrderBook.new
30
+ timestamp = Time.now.to_i
31
+ order_book.base = market_pair.base
32
+ order_book.target = market_pair.target
33
+ order_book.market = Ethfinex::Market::NAME
34
+ order_book.asks = adapt_orders(output[1], timestamp)
35
+ order_book.bids = adapt_orders(output[0], timestamp)
36
+ order_book.timestamp = timestamp
37
+ order_book.payload = output
38
+ order_book
39
+ end
40
+
41
+ def adapt_orders(orders, timestamp)
42
+ orders.collect do |order_entry|
43
+ Cryptoexchange::Models::Order.new(price: NumericHelper.to_d(order_entry[0]),
44
+ amount: NumericHelper.to_d(order_entry[-1].abs),
45
+ timestamp: timestamp)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,26 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Ethfinex
3
+ module Services
4
+ class Pairs < Cryptoexchange::Services::Pairs
5
+ PAIRS_URL = "#{Cryptoexchange::Exchanges::Ethfinex::Market::API_URL}/v1/symbols"
6
+
7
+ def fetch
8
+ output = super
9
+ adapt(output)
10
+ end
11
+
12
+ def adapt(output)
13
+ market_pairs = []
14
+ output.each do |pair|
15
+ market_pairs << Cryptoexchange::Models::MarketPair.new(
16
+ base: pair[0..2],
17
+ target: pair[3..-1],
18
+ market: Ethfinex::Market::NAME
19
+ )
20
+ end
21
+ market_pairs
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Ethfinex
3
+ module Services
4
+ class Trades < Cryptoexchange::Services::Market
5
+ def fetch(market_pair)
6
+ output = super(ticker_url(market_pair))
7
+ adapt(output, market_pair)
8
+ end
9
+
10
+ def ticker_url(market_pair)
11
+ "#{Cryptoexchange::Exchanges::Ethfinex::Market::API_URL}/v2/trades/t#{market_pair.base}#{market_pair.target}/hist"
12
+ end
13
+
14
+ def adapt(output, market_pair)
15
+
16
+ output.collect do |trade|
17
+ tr = Cryptoexchange::Models::Trade.new
18
+ tr.trade_id = trade[0]
19
+ tr.base = market_pair.base
20
+ tr.target = market_pair.target
21
+ tr.market = Ethfinex::Market::NAME
22
+ tr.type = (trade[-2].to_f > 0 ? "buy" : "sell")
23
+ tr.price = trade[-1]
24
+ tr.amount = trade[-2].abs
25
+ tr.timestamp = Time.now.to_i
26
+ tr.payload = trade
27
+ tr
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,8 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Koinex
3
+ class Market
4
+ NAME = 'koinex'
5
+ API_URL = 'https://koinex.in/api'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,49 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Koinex
3
+ module Services
4
+ class Market < Cryptoexchange::Services::Market
5
+ class << self
6
+ def supports_individual_ticker_query?
7
+ false
8
+ end
9
+ end
10
+
11
+ def fetch
12
+ output = super(ticker_url)
13
+ adapt_all(output)
14
+ end
15
+
16
+ def ticker_url
17
+ "#{Cryptoexchange::Exchanges::Koinex::Market::API_URL}/ticker"
18
+ end
19
+
20
+ def adapt_all(output)
21
+ output["stats"].map do |pair, tickers|
22
+ base = pair
23
+ target = "INR"
24
+ market_pair = Cryptoexchange::Models::MarketPair.new(
25
+ base: base,
26
+ target: target,
27
+ market: Koinex::Market::NAME
28
+ )
29
+ adapt(market_pair, tickers, [pair, tickers])
30
+ end
31
+ end
32
+
33
+ def adapt(market_pair, tickers, output)
34
+ ticker = Cryptoexchange::Models::Ticker.new
35
+ ticker.base = market_pair.base
36
+ ticker.target = market_pair.target
37
+ ticker.market = Koinex::Market::NAME
38
+ ticker.last = NumericHelper.to_d(tickers['last_traded_price'].to_f)
39
+ ticker.bid = NumericHelper.to_d(tickers['highest_bid'].to_f)
40
+ ticker.ask = NumericHelper.to_d(tickers['lowest_ask'].to_f)
41
+ ticker.volume = NumericHelper.to_d(tickers['vol_24hrs'].to_f)
42
+ ticker.timestamp = Time.now.to_i
43
+ ticker.payload = output
44
+ ticker
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,26 @@
1
+ module Cryptoexchange::Exchanges
2
+ module Koinex
3
+ module Services
4
+ class Pairs < Cryptoexchange::Services::Pairs
5
+ PAIRS_URL = "#{Cryptoexchange::Exchanges::Koinex::Market::API_URL}/ticker"
6
+
7
+ def fetch
8
+ output = super
9
+ adapt(output["prices"])
10
+ end
11
+
12
+ def adapt(output)
13
+ market_pairs = []
14
+ output.each do |currency, price|
15
+ market_pairs << Cryptoexchange::Models::MarketPair.new(
16
+ base: currency,
17
+ target: "INR",
18
+ market: Koinex::Market::NAME
19
+ )
20
+ end
21
+ market_pairs
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -21,6 +21,7 @@ module Cryptoexchange::Exchanges
21
21
  end
22
22
 
23
23
  def adapt(output, market_pair)
24
+ handle_invalid(output)
24
25
  market = output["#{market_pair.base}_#{market_pair.target}".downcase]
25
26
 
26
27
  ticker = Cryptoexchange::Models::Ticker.new
@@ -37,6 +38,12 @@ module Cryptoexchange::Exchanges
37
38
  ticker.payload = market
38
39
  ticker
39
40
  end
41
+
42
+ def handle_invalid(output)
43
+ if output['success'] == 0
44
+ raise Cryptoexchange::ResultParseError, { response: output }
45
+ end
46
+ end
40
47
  end
41
48
  end
42
49
  end
@@ -22,6 +22,7 @@ module Cryptoexchange::Exchanges
22
22
  end
23
23
 
24
24
  def adapt(output, market_pair)
25
+ handle_invalid(output)
25
26
  market = output['markets'][0]
26
27
 
27
28
  ticker = Cryptoexchange::Models::Ticker.new
@@ -38,6 +39,12 @@ module Cryptoexchange::Exchanges
38
39
  ticker.payload = market
39
40
  ticker
40
41
  end
42
+
43
+ def handle_invalid(output)
44
+ if output['message'] == 'No such market listed'
45
+ raise Cryptoexchange::ResultParseError, { response: output }
46
+ end
47
+ end
41
48
  end
42
49
  end
43
50
  end
@@ -0,0 +1,8 @@
1
+ module Cryptoexchange::Exchanges
2
+ module RadarRelay
3
+ class Market
4
+ NAME = 'radar_relay'
5
+ API_URL = 'https://api.radarrelay.com/v0'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,409 @@
1
+ :pairs:
2
+ - :base: DAI
3
+ :target: WETH
4
+ - :base: AGI
5
+ :target: WETH
6
+ - :base: AE
7
+ :target: WETH
8
+ - :base: AION
9
+ :target: WETH
10
+ - :base: AIR
11
+ :target: WETH
12
+ - :base: AIX
13
+ :target: WETH
14
+ - :base: ANT
15
+ :target: WETH
16
+ - :base: ARN
17
+ :target: WETH
18
+ - :base: ART
19
+ :target: WETH
20
+ - :base: BAT
21
+ :target: WETH
22
+ - :base: BLT
23
+ :target: WETH
24
+ - :base: BNTY
25
+ :target: WETH
26
+ - :base: CAG
27
+ :target: WETH
28
+ - :base: CAT
29
+ :target: WETH
30
+ - :base: CBT
31
+ :target: WETH
32
+ - :base: CDT
33
+ :target: WETH
34
+ - :base: CFI
35
+ :target: WETH
36
+ - :base: CND
37
+ :target: WETH
38
+ - :base: CRED
39
+ :target: WETH
40
+ - :base: CVC
41
+ :target: WETH
42
+ - :base: DATA
43
+ :target: WETH
44
+ - :base: DCL
45
+ :target: WETH
46
+ - :base: DENT
47
+ :target: WETH
48
+ - :base: DGD
49
+ :target: WETH
50
+ - :base: DGPT
51
+ :target: WETH
52
+ - :base: DNT
53
+ :target: WETH
54
+ - :base: DOV
55
+ :target: WETH
56
+ - :base: EBTC
57
+ :target: WETH
58
+ - :base: ENO
59
+ :target: WETH
60
+ - :base: ENTRP
61
+ :target: WETH
62
+ - :base: EQC
63
+ :target: WETH
64
+ - :base: ETHOS
65
+ :target: WETH
66
+ - :base: EVC
67
+ :target: WETH
68
+ - :base: FDX
69
+ :target: WETH
70
+ - :base: FLIP
71
+ :target: WETH
72
+ - :base: FUCK
73
+ :target: WETH
74
+ - :base: FUEL
75
+ :target: WETH
76
+ - :base: FUN
77
+ :target: WETH
78
+ - :base: FYN
79
+ :target: WETH
80
+ - :base: GBT
81
+ :target: WETH
82
+ - :base: GMT
83
+ :target: WETH
84
+ - :base: GNO
85
+ :target: WETH
86
+ - :base: GOAL
87
+ :target: WETH
88
+ - :base: GRID
89
+ :target: WETH
90
+ - :base: GUP
91
+ :target: WETH
92
+ - :base: HDG
93
+ :target: WETH
94
+ - :base: HGT
95
+ :target: WETH
96
+ - :base: ICX
97
+ :target: WETH
98
+ - :base: IFT
99
+ :target: WETH
100
+ - :base: INS
101
+ :target: WETH
102
+ - :base: INXT
103
+ :target: WETH
104
+ - :base: JNT
105
+ :target: WETH
106
+ - :base: KICK
107
+ :target: WETH
108
+ - :base: LEND
109
+ :target: WETH
110
+ - :base: LNK
111
+ :target: WETH
112
+ - :base: LOC
113
+ :target: WETH
114
+ - :base: MANA
115
+ :target: WETH
116
+ - :base: MBRS
117
+ :target: WETH
118
+ - :base: MKR
119
+ :target: WETH
120
+ - :base: MLN
121
+ :target: WETH
122
+ - :base: MTL
123
+ :target: WETH
124
+ - :base: NEWB
125
+ :target: WETH
126
+ - :base: NMR
127
+ :target: WETH
128
+ - :base: OMG
129
+ :target: WETH
130
+ - :base: PLU
131
+ :target: WETH
132
+ - :base: POE
133
+ :target: WETH
134
+ - :base: POW
135
+ :target: WETH
136
+ - :base: POWR
137
+ :target: WETH
138
+ - :base: PPT
139
+ :target: WETH
140
+ - :base: PTOY
141
+ :target: WETH
142
+ - :base: QSP
143
+ :target: WETH
144
+ - :base: QVT
145
+ :target: WETH
146
+ - :base: RCN
147
+ :target: WETH
148
+ - :base: RDN
149
+ :target: WETH
150
+ - :base: REAL
151
+ :target: WETH
152
+ - :base: REP
153
+ :target: WETH
154
+ - :base: REQ
155
+ :target: WETH
156
+ - :base: RHOC
157
+ :target: WETH
158
+ - :base: RLC
159
+ :target: WETH
160
+ - :base: RPL
161
+ :target: WETH
162
+ - :base: RVT
163
+ :target: WETH
164
+ - :base: SALT
165
+ :target: WETH
166
+ - :base: SNIP
167
+ :target: WETH
168
+ - :base: SNM
169
+ :target: WETH
170
+ - :base: SNT
171
+ :target: WETH
172
+ - :base: SPANK
173
+ :target: WETH
174
+ - :base: STORJ
175
+ :target: WETH
176
+ - :base: STORM
177
+ :target: WETH
178
+ - :base: STU
179
+ :target: WETH
180
+ - :base: SUB
181
+ :target: WETH
182
+ - :base: TAU
183
+ :target: WETH
184
+ - :base: TIX
185
+ :target: WETH
186
+ - :base: TKR
187
+ :target: WETH
188
+ - :base: UKG
189
+ :target: WETH
190
+ - :base: VEE
191
+ :target: WETH
192
+ - :base: WAND
193
+ :target: WETH
194
+ - :base: WAX
195
+ :target: WETH
196
+ - :base: WLK
197
+ :target: WETH
198
+ - :base: XAUR
199
+ :target: WETH
200
+ - :base: XGM
201
+ :target: WETH
202
+ - :base: XRL
203
+ :target: WETH
204
+ - :base: ZRX
205
+ :target: WETH
206
+ # - :base: WETH
207
+ # :target: DAI
208
+ # - :base: AGI
209
+ # :target: DAI
210
+ # - :base: AE
211
+ # :target: DAI
212
+ # - :base: AION
213
+ # :target: DAI
214
+ # - :base: AIR
215
+ # :target: DAI
216
+ # - :base: AIX
217
+ # :target: DAI
218
+ # - :base: ANT
219
+ # :target: DAI
220
+ # - :base: ARN
221
+ # :target: DAI
222
+ # - :base: ART
223
+ # :target: DAI
224
+ # - :base: BAT
225
+ # :target: DAI
226
+ # - :base: BLT
227
+ # :target: DAI
228
+ # - :base: BNTY
229
+ # :target: DAI
230
+ # - :base: CAG
231
+ # :target: DAI
232
+ # - :base: CAT
233
+ # :target: DAI
234
+ # - :base: CBT
235
+ # :target: DAI
236
+ # - :base: CDT
237
+ # :target: DAI
238
+ # - :base: CFI
239
+ # :target: DAI
240
+ # - :base: CND
241
+ # :target: DAI
242
+ # - :base: CRED
243
+ # :target: DAI
244
+ # - :base: CVC
245
+ # :target: DAI
246
+ # - :base: DATA
247
+ # :target: DAI
248
+ # - :base: DCL
249
+ # :target: DAI
250
+ # - :base: DENT
251
+ # :target: DAI
252
+ # - :base: DGD
253
+ # :target: DAI
254
+ # - :base: DGPT
255
+ # :target: DAI
256
+ # - :base: DNT
257
+ # :target: DAI
258
+ # - :base: DOV
259
+ # :target: DAI
260
+ # - :base: EBTC
261
+ # :target: DAI
262
+ # - :base: ENO
263
+ # :target: DAI
264
+ # - :base: ENTRP
265
+ # :target: DAI
266
+ # - :base: EQC
267
+ # :target: DAI
268
+ # - :base: ETHOS
269
+ # :target: DAI
270
+ # - :base: EVC
271
+ # :target: DAI
272
+ # - :base: FDX
273
+ # :target: DAI
274
+ # - :base: FLIP
275
+ # :target: DAI
276
+ # - :base: FUCK
277
+ # :target: DAI
278
+ # - :base: FUEL
279
+ # :target: DAI
280
+ # - :base: FUN
281
+ # :target: DAI
282
+ # - :base: FYN
283
+ # :target: DAI
284
+ # - :base: GBT
285
+ # :target: DAI
286
+ # - :base: GMT
287
+ # :target: DAI
288
+ # - :base: GNO
289
+ # :target: DAI
290
+ # - :base: GOAL
291
+ # :target: DAI
292
+ # - :base: GRID
293
+ # :target: DAI
294
+ # - :base: GUP
295
+ # :target: DAI
296
+ # - :base: HDG
297
+ # :target: DAI
298
+ # - :base: HGT
299
+ # :target: DAI
300
+ # - :base: ICX
301
+ # :target: DAI
302
+ # - :base: IFT
303
+ # :target: DAI
304
+ # - :base: INS
305
+ # :target: DAI
306
+ # - :base: INXT
307
+ # :target: DAI
308
+ # - :base: JNT
309
+ # :target: DAI
310
+ # - :base: KICK
311
+ # :target: DAI
312
+ # - :base: LEND
313
+ # :target: DAI
314
+ # - :base: LNK
315
+ # :target: DAI
316
+ # - :base: LOC
317
+ # :target: DAI
318
+ # - :base: MANA
319
+ # :target: DAI
320
+ # - :base: MBRS
321
+ # :target: DAI
322
+ # - :base: MKR
323
+ # :target: DAI
324
+ # - :base: MLN
325
+ # :target: DAI
326
+ # - :base: MTL
327
+ # :target: DAI
328
+ # - :base: NEWB
329
+ # :target: DAI
330
+ # - :base: NMR
331
+ # :target: DAI
332
+ # - :base: OMG
333
+ # :target: DAI
334
+ # - :base: PLU
335
+ # :target: DAI
336
+ # - :base: POE
337
+ # :target: DAI
338
+ # - :base: POW
339
+ # :target: DAI
340
+ # - :base: POWR
341
+ # :target: DAI
342
+ # - :base: PPT
343
+ # :target: DAI
344
+ # - :base: PTOY
345
+ # :target: DAI
346
+ # - :base: QSP
347
+ # :target: DAI
348
+ # - :base: QVT
349
+ # :target: DAI
350
+ # - :base: RCN
351
+ # :target: DAI
352
+ # - :base: RDN
353
+ # :target: DAI
354
+ # - :base: REAL
355
+ # :target: DAI
356
+ # - :base: REP
357
+ # :target: DAI
358
+ # - :base: REQ
359
+ # :target: DAI
360
+ # - :base: RHOC
361
+ # :target: DAI
362
+ # - :base: RLC
363
+ # :target: DAI
364
+ # - :base: RPL
365
+ # :target: DAI
366
+ # - :base: RVT
367
+ # :target: DAI
368
+ # - :base: SALT
369
+ # :target: DAI
370
+ # - :base: SNIP
371
+ # :target: DAI
372
+ # - :base: SNM
373
+ # :target: DAI
374
+ # - :base: SNT
375
+ # :target: DAI
376
+ # - :base: SPANK
377
+ # :target: DAI
378
+ # - :base: STORJ
379
+ # :target: DAI
380
+ # - :base: STORM
381
+ # :target: DAI
382
+ # - :base: STU
383
+ # :target: DAI
384
+ # - :base: SUB
385
+ # :target: DAI
386
+ # - :base: TAU
387
+ # :target: DAI
388
+ # - :base: TIX
389
+ # :target: DAI
390
+ # - :base: TKR
391
+ # :target: DAI
392
+ # - :base: UKG
393
+ # :target: DAI
394
+ # - :base: VEE
395
+ # :target: DAI
396
+ # - :base: WAND
397
+ # :target: DAI
398
+ # - :base: WAX
399
+ # :target: DAI
400
+ # - :base: WLK
401
+ # :target: DAI
402
+ # - :base: XAUR
403
+ # :target: DAI
404
+ # - :base: XGM
405
+ # :target: DAI
406
+ # - :base: XRL
407
+ # :target: DAI
408
+ # - :base: ZRX
409
+ # :target: DAI