currency-rate 2.0.0 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- metadata +8 -119
- data/.document +0 -5
- data/.gitignore +0 -20
- data/.rspec +0 -1
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -68
- data/LICENSE.txt +0 -20
- data/README.md +0 -73
- data/Rakefile +0 -43
- data/currency-rate.gemspec +0 -41
- data/lib/adapter.rb +0 -100
- data/lib/adapters/crypto/binance_adapter.rb +0 -42
- data/lib/adapters/crypto/bitfinex_adapter.rb +0 -41
- data/lib/adapters/crypto/bitpay_adapter.rb +0 -29
- data/lib/adapters/crypto/bitstamp_adapter.rb +0 -26
- data/lib/adapters/crypto/coin_market_cap_adapter.rb +0 -29
- data/lib/adapters/crypto/coinbase_adapter.rb +0 -30
- data/lib/adapters/crypto/exmo_adapter.rb +0 -27
- data/lib/adapters/crypto/hit_BTC_adapter.rb +0 -64
- data/lib/adapters/crypto/huobi_adapter.rb +0 -25
- data/lib/adapters/crypto/kraken_adapter.rb +0 -46
- data/lib/adapters/crypto/localbitcoins_adapter.rb +0 -25
- data/lib/adapters/crypto/okcoin_adapter.rb +0 -17
- data/lib/adapters/crypto/paxful_adapter.rb +0 -18
- data/lib/adapters/crypto/poloniex_adapter.rb +0 -33
- data/lib/adapters/crypto/yadio_adapter.rb +0 -19
- data/lib/adapters/fiat/bonbast_adapter.rb +0 -23
- data/lib/adapters/fiat/coinmonitor_adapter.rb +0 -13
- data/lib/adapters/fiat/currency_layer_adapter.rb +0 -31
- data/lib/adapters/fiat/fixer_adapter.rb +0 -17
- data/lib/adapters/fiat/forge_adapter.rb +0 -34
- data/lib/adapters/fiat/free_forex_adapter.rb +0 -36
- data/lib/container.rb +0 -203
- data/lib/currency_rate.rb +0 -41
- data/lib/currency_rate/version.rb +0 -3
- data/lib/exceptions.rb +0 -9
- data/lib/storage/file_storage.rb +0 -34
- data/lib/storage/serializers/yaml_serializer.rb +0 -15
- data/lib/utils/string_extensions.rb +0 -19
data/lib/adapter.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class Adapter
|
3
|
-
include Singleton
|
4
|
-
|
5
|
-
SUPPORTED_CURRENCIES = []
|
6
|
-
FETCH_URL = nil
|
7
|
-
|
8
|
-
attr_reader :rates
|
9
|
-
attr_accessor :container
|
10
|
-
attr_accessor :api_key
|
11
|
-
|
12
|
-
def name(format=:snake_case)
|
13
|
-
@camel_case_name ||= self.class.name.gsub(/^.*::/, "").sub("Adapter", "")
|
14
|
-
@snake_case_name ||= @camel_case_name.to_snake_case
|
15
|
-
format == :camel_case ? @camel_case_name : @snake_case_name
|
16
|
-
end
|
17
|
-
|
18
|
-
def get_rate(from, to)
|
19
|
-
@rates = @container.storage.read(self.name) if @rates.nil? && @container.storage.exists?(self.name)
|
20
|
-
return BigDecimal(rates[to]) if ANCHOR_CURRENCY == from && rates[to]
|
21
|
-
return BigDecimal(1 / rates[from]) if ANCHOR_CURRENCY == to && rates[from]
|
22
|
-
return BigDecimal(rates[to] / rates[from]) if rates[from] && rates[to]
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
|
26
|
-
def fetch_rates
|
27
|
-
begin
|
28
|
-
@rates = normalize(exchange_data)
|
29
|
-
rescue StandardError => e
|
30
|
-
@container.log(:error, e)
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def normalize(data)
|
36
|
-
@rates = if data.nil?
|
37
|
-
@container.log(:warn, "#{self.name}#normalize: data is nil")
|
38
|
-
return nil
|
39
|
-
else
|
40
|
-
parse_raw_data(data)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def exchange_data
|
45
|
-
raise "FETCH_URL is not defined!" unless self.class::FETCH_URL
|
46
|
-
|
47
|
-
begin
|
48
|
-
if self.class::FETCH_URL.kind_of?(Hash)
|
49
|
-
self.class::FETCH_URL.each_with_object({}) do |(name, url), result|
|
50
|
-
result[name] = request url
|
51
|
-
end
|
52
|
-
else
|
53
|
-
result = request self.class::FETCH_URL
|
54
|
-
end
|
55
|
-
rescue StandardError => e
|
56
|
-
@container.log(:error, e)
|
57
|
-
nil
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def url_with_api_key(url)
|
62
|
-
if url.include?("__API_KEY__")
|
63
|
-
if api_key.nil?
|
64
|
-
@container.log(:error, "API key for #{self.name} is not set")
|
65
|
-
return nil
|
66
|
-
else
|
67
|
-
url.sub("__API_KEY__", api_key.strip)
|
68
|
-
end
|
69
|
-
else
|
70
|
-
url
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def request(url)
|
75
|
-
unless url = url_with_api_key(url)
|
76
|
-
return nil
|
77
|
-
end
|
78
|
-
http_client = HTTP.timeout(connect: @container.connect_timeout, read: @container.read_timeout)
|
79
|
-
http_client
|
80
|
-
.headers("Accept" => "application/json; version=1")
|
81
|
-
.headers("Content-Type" => "text/plain")
|
82
|
-
.get(url)
|
83
|
-
.to_s
|
84
|
-
end
|
85
|
-
|
86
|
-
def parse_raw_data(data)
|
87
|
-
if data.kind_of?(Hash)
|
88
|
-
data.each { |k,v| data[k] = parse_raw_data(v) }
|
89
|
-
data
|
90
|
-
else
|
91
|
-
begin
|
92
|
-
return JSON.parse(data)
|
93
|
-
rescue JSON::ParserError
|
94
|
-
return data
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class BinanceAdapter < Adapter
|
3
|
-
# No need to use it for fetching, just additional information about supported currencies
|
4
|
-
SUPPORTED_CURRENCIES = %w(
|
5
|
-
ADA ADX AGI AMB ARK ARN AST BAT BCC BCD BCN BLZ BNB BNT BQX
|
6
|
-
BRD BTG BTS CDT CMT CND CVC DCR DGD DLT DNT EDO ELF ENG ENJ
|
7
|
-
EOS ETC ETH EVX FUN GAS GNT GRS GTO GVT GXS HOT HSR ICN ICX
|
8
|
-
INS KEY KMD KNC LRC LSK LTC LUN MCO MDA MFT MOD MTH MTL NAS
|
9
|
-
NAV NEO NXS OAX OMG ONT OST PAX PHX POA POE PPT QKC QLC QSP
|
10
|
-
RCN RDN REN REP REQ RLC RPX RVN SKY SNM SNT SUB SYS TNB TNT
|
11
|
-
TRX USDC USDT VEN VET VIA VIB WAN WPR WTC XEM XLM XMR XRP
|
12
|
-
XVG XZC ZEC ZEN ZIL ZRX
|
13
|
-
)
|
14
|
-
|
15
|
-
ANCHOR_CURRENCY = "BTC"
|
16
|
-
|
17
|
-
FETCH_URL = {
|
18
|
-
"Binance" => "https://api.binance.com/api/v3/ticker/price",
|
19
|
-
"Blockchain" => "https://blockchain.info/ticker"
|
20
|
-
}
|
21
|
-
|
22
|
-
def normalize(data)
|
23
|
-
return nil unless data = super
|
24
|
-
binance_result = data["Binance"].reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, hash|
|
25
|
-
if hash["symbol"].index(ANCHOR_CURRENCY) == 0
|
26
|
-
result[hash["symbol"].sub(ANCHOR_CURRENCY, "")] = BigDecimal(hash["price"].to_s)
|
27
|
-
elsif hash["symbol"].index(ANCHOR_CURRENCY) == 3
|
28
|
-
result[hash["symbol"].sub(ANCHOR_CURRENCY, "")] = 1 / BigDecimal(hash["price"].to_s)
|
29
|
-
end
|
30
|
-
result
|
31
|
-
end
|
32
|
-
|
33
|
-
blockchain_result = data["Blockchain"].reduce({}) do |result, (key, value)|
|
34
|
-
result[key] = BigDecimal(value["last"].to_s)
|
35
|
-
result
|
36
|
-
end
|
37
|
-
|
38
|
-
binance_result.merge(blockchain_result)
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class BitfinexAdapter < Adapter
|
3
|
-
# No need to use it for fetching, just additional information about supported currencies
|
4
|
-
SUPPORTED_CURRENCIES = %w(
|
5
|
-
AGI AID AIO ANT ATM AUC AVT BAB BAT BCI BFT BNT BSV BTG CBT CFI CND CTX
|
6
|
-
DAD DAI DAT DGB DASH DTA DTH EDO ELF EOS ESS ETC ETH ETP EUR FSN FUN GBP
|
7
|
-
GNT HOT IOS IOT IQX JPY KNC LRC LTC LYM MIT MKR MNA MTN NCA NEO ODE OMG
|
8
|
-
OMNI ORS PAI POA POY QSH QTM RBT RCN RDN REP REQ RLC RRT SAN SEE SEN SNG
|
9
|
-
SNT SPK STJ TNB TRX USD USDT UTK VEE VET WAX WPR XLM XMR XRP XTZ XVG YYW ZCN
|
10
|
-
ZEC ZIL ZRX
|
11
|
-
)
|
12
|
-
|
13
|
-
ASSET_MAP = {
|
14
|
-
"DSH" => "DASH",
|
15
|
-
"OMN" => "OMNI",
|
16
|
-
"UST" => "USDT",
|
17
|
-
}
|
18
|
-
|
19
|
-
ANCHOR_CURRENCY = "BTC"
|
20
|
-
|
21
|
-
FETCH_URL = "https://api.bitfinex.com/v2/tickers?symbols=ALL"
|
22
|
-
|
23
|
-
def normalize(data)
|
24
|
-
return nil unless data = super
|
25
|
-
data.reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, pair_info|
|
26
|
-
pair_name = pair_info[0].sub("t", "")
|
27
|
-
key = pair_name.sub(ANCHOR_CURRENCY, "")
|
28
|
-
key = ASSET_MAP[key] || key
|
29
|
-
|
30
|
-
if pair_name.index(ANCHOR_CURRENCY) == 0
|
31
|
-
result[key] = BigDecimal(pair_info[7].to_s)
|
32
|
-
elsif pair_name.index(ANCHOR_CURRENCY) == 3
|
33
|
-
result[key] = 1 / BigDecimal(pair_info[7].to_s)
|
34
|
-
end
|
35
|
-
|
36
|
-
result
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class BitpayAdapter < Adapter
|
3
|
-
# No need to use it for fetching, just additional information about supported currencies
|
4
|
-
SUPPORTED_CURRENCIES = %w(
|
5
|
-
AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BCH BDT BGN BHD BIF BMD
|
6
|
-
BND BOB BRL BSD BTN BWP BZD CAD CDF CHF CLF CLP CNY COP CRC CUP CVE CZK
|
7
|
-
DJF DKK DOP DZD EGP ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GUSD GYD
|
8
|
-
HKD HNL HRK HTG HUF IDR ILS INR IQD IRR ISK JEP JMD JOD JPY KES KGS KHR
|
9
|
-
KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT
|
10
|
-
MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PAX PEN
|
11
|
-
PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLL
|
12
|
-
SOS SRD STN SVC SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD
|
13
|
-
USDC UYU UZS VEF VES VND VUV WST XAF XAG XAU XCD XOF XPF YER ZAR ZMW ZWL
|
14
|
-
)
|
15
|
-
|
16
|
-
ANCHOR_CURRENCY = "BTC"
|
17
|
-
|
18
|
-
FETCH_URL = "https://bitpay.com/api/rates"
|
19
|
-
|
20
|
-
def normalize(data)
|
21
|
-
return nil unless data = super
|
22
|
-
data.reject { |rate| rate["code"] == ANCHOR_CURRENCY }.reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, rate|
|
23
|
-
result["#{rate['code'].upcase}"] = BigDecimal(rate["rate"].to_s)
|
24
|
-
result
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class BitstampAdapter < Adapter
|
3
|
-
SUPPORTED_CURRENCIES = %w(
|
4
|
-
BCH ETH LTC XRP
|
5
|
-
)
|
6
|
-
|
7
|
-
ANCHOR_CURRENCY = "BTC"
|
8
|
-
|
9
|
-
FETCH_URL = Hash[SUPPORTED_CURRENCIES.collect { |currency| [ currency, "https://www.bitstamp.net/api/v2/ticker/#{currency}#{ANCHOR_CURRENCY}/".downcase ] }]
|
10
|
-
FETCH_URL["USD"] = "https://www.bitstamp.net/api/ticker/"
|
11
|
-
|
12
|
-
def normalize(data)
|
13
|
-
return nil unless data = super
|
14
|
-
data.reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, (key, value)|
|
15
|
-
if key == "USD"
|
16
|
-
result[key] = BigDecimal(value["last"].to_s)
|
17
|
-
else
|
18
|
-
result[key] = 1 / BigDecimal(value["last"].to_s)
|
19
|
-
end
|
20
|
-
|
21
|
-
result
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class CoinMarketCapAdapter < Adapter
|
3
|
-
# No need to use it for fetching, just additional information about supported currencies
|
4
|
-
SUPPORTED_CURRENCIES = %w(
|
5
|
-
ADA AE AION AOA ARDR ARK BAT BCD BCH BCN BCZERO BNB BNT BSV
|
6
|
-
BTC BTG BTM BTS CNX CRO DAI DASH DCN DCR DEX DGB DGD DGTX DOGE
|
7
|
-
ELA EOS ETC ETH ETN ETP FCT GNT GUSD HOT ICX INB IOST KCS KMD
|
8
|
-
LINK LKY LRC LSK LTC MAID MANA MCO MGO MIOTA MKR MONA MXM NANO
|
9
|
-
NEO NEXO NPXS ODE OMG ONT PAX PIVX POLY PPT QTUM RDD REP REPO
|
10
|
-
RVN SNT STEEM STRAT TRX TUSD USDC USDT VET WAN WAVES WAX WTC
|
11
|
-
XEM XIN XLM XMR XRP XTZ XVG XZC ZEC ZIL ZRX
|
12
|
-
)
|
13
|
-
|
14
|
-
ANCHOR_CURRENCY = "BTC"
|
15
|
-
FETCH_URL = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=__API_KEY__"
|
16
|
-
|
17
|
-
def normalize(data)
|
18
|
-
return nil unless data = super
|
19
|
-
data["data"].each_with_object({ "anchor" => ANCHOR_CURRENCY }) do |payload, result|
|
20
|
-
if payload["symbol"] == ANCHOR_CURRENCY
|
21
|
-
result["USD"] = BigDecimal(payload["quote"]["USD"]["price"].to_s)
|
22
|
-
else
|
23
|
-
result[payload["symbol"]] = result["USD"] / BigDecimal(payload["quote"]["USD"]["price"].to_s)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class CoinbaseAdapter < Adapter
|
3
|
-
# No need to use it for fetching, just additional information about supported currencies
|
4
|
-
SUPPORTED_CURRENCIES = %w(
|
5
|
-
AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BAT BBD BCH BDT BGN BHD BIF BMD
|
6
|
-
BND BOB BRL BSD BTC BTN BWP BYN BYR BZD CAD CDF CHF CLF CLP CNH CNY COP CRC
|
7
|
-
CUC CVE CZK DJF DKK DOP DZD EEK EGP ERN ETB ETC ETH EUR FJD FKP GBP GEL GGP
|
8
|
-
GHS GIP GMD GNF GTQ GYD HKD HNL HRK HTG HUF IDR ILS IMP INR IQD ISK JEP JMD
|
9
|
-
JOD JPY KES KGS KHR KMF KRW KWD KYD KZT LAK LBP LKR LRD LSL LTC LTL LVL LYD
|
10
|
-
MAD MDL MGA MKD MMK MNT MOP MRO MTL MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK
|
11
|
-
NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SEK
|
12
|
-
SGD SHP SLL SOS SRD SSP STD SVC SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH
|
13
|
-
UGX USD SDC UYU UZS VEF VND VUV WST XAF XAG XAU XCD XDR XOF XPD XPF XPT YER
|
14
|
-
ZAR ZEC ZMK ZMW ZRX ZWL
|
15
|
-
)
|
16
|
-
|
17
|
-
ANCHOR_CURRENCY = "BTC"
|
18
|
-
|
19
|
-
FETCH_URL = "https://api.coinbase.com/v2/exchange-rates?currency=#{ANCHOR_CURRENCY}"
|
20
|
-
|
21
|
-
def normalize(data)
|
22
|
-
return nil unless data = super
|
23
|
-
data["data"]["rates"].reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, (currency, rate)|
|
24
|
-
result[currency] = BigDecimal(rate.to_s)
|
25
|
-
result
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class ExmoAdapter < Adapter
|
3
|
-
# No need to use it for fetching, just additional information about supported currencies
|
4
|
-
SUPPORTED_CURRENCIES = %w(
|
5
|
-
ADA BCH BTC BTCZ BTG DASH DOGE DXT EOS ETC ETH EUR GAS GNT GUSD HB
|
6
|
-
HBZ INK KICK LSK LTC MNX NEO OMG PLN QTUM RUB SMART STQ TRX TRY UAH
|
7
|
-
USD USDT WAVES XEM XLM XMR XRP ZEC ZRX
|
8
|
-
)
|
9
|
-
|
10
|
-
ANCHOR_CURRENCY = "BTC"
|
11
|
-
|
12
|
-
FETCH_URL = "https://api.exmo.com/v1/ticker/"
|
13
|
-
|
14
|
-
def normalize(data)
|
15
|
-
return nil unless data = super
|
16
|
-
data.reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, (key, value)|
|
17
|
-
if key.split("_")[0] == ANCHOR_CURRENCY
|
18
|
-
result[key.sub("#{self.class::ANCHOR_CURRENCY}_", "")] = BigDecimal(value["avg"].to_s)
|
19
|
-
elsif key.split("_")[1] == ANCHOR_CURRENCY
|
20
|
-
result[key.sub("_#{self.class::ANCHOR_CURRENCY}", "")] = 1 / BigDecimal(value["avg"].to_s)
|
21
|
-
end
|
22
|
-
result
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class HitBTCAdapter < Adapter
|
3
|
-
SUPPORTED_CURRENCIES = %w(
|
4
|
-
ZRC EDG IHT AEON SOC HBAR ZRX OPT APPC DRGN PTOY
|
5
|
-
XDN OKB CHSB NCT GUSD GET FUN EXP EMRX REV GHOST
|
6
|
-
BMH SNC DTR ERD SCL HMQ ACT ETC QTUM MTX SBTC
|
7
|
-
KIND SMT BTB SWFTC 1ST UTT AXPR NMR EVX IOTA XPRM
|
8
|
-
STMX SALT DGB NTK AMM ALGO ORMEUS BDG BQX EKO FYP
|
9
|
-
IPX HOT MG BTS ADX CRPT WAXP POA PLBT SHIP HTML
|
10
|
-
BOX GNO UBT BTT ZEN VEO POA20 BCPT SRN XPR ETHBNT
|
11
|
-
MANA QKC MLN FLP SOLO TRUE VSYS JST GNT BOS PHB
|
12
|
-
ZEC ESH SWM NANO VIBE HVN SOLVE ELEC LRC AGI LNC
|
13
|
-
WAVES WTC ONT STRAT GNX NEU BCN XPNT ECA ARDR KIN
|
14
|
-
LSK USE IOTX CRO IDH LINK OAX CPT NGC XNS KEY TKY
|
15
|
-
HSR TNT SMART TRST DCR WINGS GT MKR ONE DOGE ARN
|
16
|
-
ACAT BMC RAISE EXM TIME REX FDZ HT MTH SCC BET
|
17
|
-
DENT IDRT IPL ZAP CMCT TDP XAUR MTL NEBL SUSDT BAT
|
18
|
-
STEEM CUR BYTZ PRO LOOM USD DRG DICE ADK COMP DRT
|
19
|
-
XTZ WETH EURS CHZ NEO NPLC XCON LEVL PAX AIM PART
|
20
|
-
PRE ERK HEDG FET PAXG DAG AVA CUTE NEXO DAY PITCH
|
21
|
-
MITX NXT POWR PLR CVCOIN TUSD MYST DLT REM RLC DNA
|
22
|
-
FOTA SBD ELF TEL C20 PNT CND UTK ASI CVC ETP ETH
|
23
|
-
ZIL ARPA INK NPXS LEO MESH NIM DATX FXT PBT GST
|
24
|
-
BSV GAS CBC MCO SENT GBX XRC POE SUR LOC WIKI PPT
|
25
|
-
CVT APM LEND NUT DOV KMD AYA LUN XEM RVN BCD XMR
|
26
|
-
NWC USG CLO NLC2 BBTC BERRY ART GRIN VITAE XBP OMG
|
27
|
-
MDA KRL BCH POLY PLA BANCA ENJ TRIGX UUU PASS ANT
|
28
|
-
LAMB BIZZ RFR AMB ROOBEE BST LCC RCN MIN BUSD DIT
|
29
|
-
PPC AE IQ BNK CENNZ SUB OCN DGD VRA STX AERGO HGT
|
30
|
-
TRAD IGNIS REP DAPP DNT CDT YCC SNGLS ICX PKT COV
|
31
|
-
PAY ABYSS BLZ DAV TKN ERT SPC SEELE XZC MAID AUTO
|
32
|
-
REN DATA AUC TV LAVA KAVA DAI DAPS ADA COCOS MITH
|
33
|
-
SETH NRG PHX DASH VLX CHAT VET EOSDT ZSC KNC DGTX
|
34
|
-
CEL SHORTUSD IOST BNB PBTT XMC EMC VIB BNT STORJ
|
35
|
-
ATOM LCX SC FTT BTM XLM TRX CELR BRD DBIX ETN SNT
|
36
|
-
MOF HEX XUC PLU FACE TNC SIG PXG BDP BTX TAU DCT
|
37
|
-
YOYOW SYBC SWT MAN GLEEC EOS XVG NAV CURE XRP KICK
|
38
|
-
BRDG LTC USDC MATIC FTX BTG PMA
|
39
|
-
).freeze
|
40
|
-
|
41
|
-
ANCHOR_CURRENCY = "BTC".freeze
|
42
|
-
|
43
|
-
FETCH_URL = "https://api.hitbtc.com/api/2/public/ticker".freeze
|
44
|
-
|
45
|
-
def normalize(data)
|
46
|
-
return nil unless data = super
|
47
|
-
|
48
|
-
data.each_with_object({ "anchor" => ANCHOR_CURRENCY }) do |pair_info, result|
|
49
|
-
pair_name = pair_info["symbol"]
|
50
|
-
next unless pair_name.include?(ANCHOR_CURRENCY)
|
51
|
-
next unless pair_info["last"]
|
52
|
-
|
53
|
-
key = pair_name.sub(ANCHOR_CURRENCY, "")
|
54
|
-
|
55
|
-
result[key] =
|
56
|
-
if pair_name.index(ANCHOR_CURRENCY) == 0
|
57
|
-
BigDecimal(pair_info["last"])
|
58
|
-
else
|
59
|
-
1 / BigDecimal(pair_info["last"])
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class HuobiAdapter < Adapter
|
3
|
-
FETCH_URL = "https://api.huobi.pro/market/tickers".freeze
|
4
|
-
|
5
|
-
ANCHOR_CURRENCY = "BTC"
|
6
|
-
|
7
|
-
def normalize(data)
|
8
|
-
return nil unless data = super
|
9
|
-
|
10
|
-
data["data"].each_with_object({ "anchor" => ANCHOR_CURRENCY }) do |pair_info, result|
|
11
|
-
pair_name = pair_info["symbol"].upcase
|
12
|
-
next unless pair_name.include?(ANCHOR_CURRENCY)
|
13
|
-
|
14
|
-
key = pair_name.sub(ANCHOR_CURRENCY, "")
|
15
|
-
|
16
|
-
result[key] =
|
17
|
-
if pair_name.index(ANCHOR_CURRENCY) == 0
|
18
|
-
BigDecimal(pair_info["close"].to_s)
|
19
|
-
else
|
20
|
-
1 / BigDecimal(pair_info["close"].to_s)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module CurrencyRate
|
2
|
-
class KrakenAdapter < Adapter
|
3
|
-
SUPPORTED_CURRENCIES = %w(
|
4
|
-
ADA BCH BSV BTC DAI DASH EOS ETC ETH GNO LTC MLN
|
5
|
-
NMC QTUM REP USDC XDG XLM XMR XRP XTZ ZEC
|
6
|
-
)
|
7
|
-
|
8
|
-
ASSET_MAP = {
|
9
|
-
"XXBTZ" => "BTC",
|
10
|
-
"XETCX" => "ETC",
|
11
|
-
"XETHX" => "ETH",
|
12
|
-
"XLTCX" => "LTC",
|
13
|
-
"XREPX" => "REP",
|
14
|
-
"XXLMX" => "XLM",
|
15
|
-
"XXMRX" => "XMR",
|
16
|
-
"XXRPX" => "XRP",
|
17
|
-
"XZECX" => "ZEC",
|
18
|
-
"XZUSD" => "USD",
|
19
|
-
"BTC" => "XBT",
|
20
|
-
}
|
21
|
-
|
22
|
-
ANCHOR_CURRENCY = "BTC"
|
23
|
-
|
24
|
-
FETCH_URL = "https://api.kraken.com/0/public/Ticker?pair=#{ %w(ADAXBT BCHXBT BSVXBT DASHXBT EOSXBT GNOXBT QTUMXBT XTZXBT XETCXXBT XETHXXBT XLTCXXBT XREPXXBT XXLMXXBT XXMRXXBT XXRPXXBT XZECXXBT XXBTZUSD XBTDAI XBTUSDC).join(",") }"
|
25
|
-
|
26
|
-
def normalize(data)
|
27
|
-
return nil unless data = super
|
28
|
-
data["result"].reduce({ "anchor" => ANCHOR_CURRENCY }) do |result, (pair, value)|
|
29
|
-
key = ta(pair.sub(ta(ANCHOR_CURRENCY), ""))
|
30
|
-
|
31
|
-
if %w(USD DAI USDC).include?(key)
|
32
|
-
result[key] = BigDecimal(value["c"].first.to_s)
|
33
|
-
else
|
34
|
-
result[key] = 1 / BigDecimal(value["c"].first.to_s)
|
35
|
-
end
|
36
|
-
result
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def translate_asset(asset)
|
41
|
-
ASSET_MAP[asset] || asset
|
42
|
-
end
|
43
|
-
alias_method :ta, :translate_asset
|
44
|
-
|
45
|
-
end
|
46
|
-
end
|