From 1533956af3e76d78855e176cdfbd725d772112b8 Mon Sep 17 00:00:00 2001 From: Noah Seidman Date: Thu, 19 Apr 2018 14:06:36 -0400 Subject: [PATCH 01/20] Added DigiByte Extension. --- README.md | 2 +- .../batm/server/extensions/ICurrencies.java | 1 + .../digibyte/DigiByteAddressValidator.java | 58 ++++++ .../extra/digibyte/DigiByteExtension.java | 133 ++++++++++++++ .../digibyte/sources/FixPriceRateSource.java | 59 +++++++ .../sources/coinmarketcap/CMCTicker.java | 166 ++++++++++++++++++ .../CoinmarketcapRateSource.java | 94 ++++++++++ .../coinmarketcap/ICoinmarketcapAPI.java | 33 ++++ .../wallets/digibyted/DigiByteRPCWallet.java | 119 +++++++++++++ .../src/main/resources/batm-extensions.xml | 20 +++ .../src/main/resources/digibyte.png | Bin 0 -> 13054 bytes 11 files changed, 684 insertions(+), 1 deletion(-) create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java create mode 100644 server_extensions_extra/src/main/resources/digibyte.png diff --git a/README.md b/README.md index a1f2f9f..fd098bc 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Here is the list of functionality that can be extended with extenstions API: Content ======= * **server_extensions_api** - contains extension api that all extensions use to extend BATM Server's functionality. -* **server_extensions_extra** - reference extension implementation that implements BTC, LTC, DASH,FLASH, DOGE, NLG, ICG, NBT, GRS and MAX coin support functionality. +* **server_extensions_extra** - reference extension implementation that implements BTC, LTC, DGB, DASH, FLASH, DOGE, NLG, ICG, NBT, GRS and MAX coin support functionality. * **server_extensions_test** - contains tester for testing the extensions without requirement of having a BATM server Note for developers diff --git a/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java b/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java index 0548431..dc81276 100644 --- a/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java +++ b/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java @@ -27,6 +27,7 @@ public interface ICurrencies { public static final String VIA = "VIA"; public static final String DEX = "DEX"; public static final String DASH = "DASH"; + public static final String DGB = "DGB"; public static final String DOGE = "DOGE"; public static final String FLASH = "FLASH";// FLASH Coin public static final String MAX = "MAX"; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java new file mode 100644 index 0000000..ccfb47f --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java @@ -0,0 +1,58 @@ +/************************************************************************************* + * Copyright (C) 2014-2016 GENERAL BYTES s.r.o. All rights reserved. + * + * This software may be distributed and modified under the terms of the GNU + * General Public License version 2 (GPL2) as published by the Free Software + * Foundation and appearing in the file GPL2.TXT included in the packaging of + * this file. Please note that GPL2 Section 2[b] requires that all works based + * on this software must also be made publicly available under the terms of + * the GPL2 ("Copyleft"). + * + * Contact information + * ------------------- + * + * GENERAL BYTES s.r.o. + * Web : http://www.generalbytes.com + * + ************************************************************************************/ +package com.generalbytes.batm.server.extensions.extra.digibyte; + +import com.generalbytes.batm.server.coinutil.AddressFormatException; +import com.generalbytes.batm.server.coinutil.Base58; +import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; + +public class DigiByteAddressValidator implements ICryptoAddressValidator { + + @Override + public boolean isAddressValid(String address) { + char[] addressChars = address.toCharArray(); + //Check for invalid characters; ensure alphanumeric and no fobidden characters exist + for (char addressCharacter : addressChars) { + if (!(((addressCharacter >= '0' && addressCharacter <= '9') || + (addressCharacter >= 'a' && addressCharacter <= 'z') || + (addressCharacter >= 'A' && addressCharacter <= 'Z')) && + addressCharacter != 'l' && addressCharacter != 'I' && + addressCharacter != '0' && addressCharacter != 'O')) { + return false; + } + } + try { + Base58.decodeToBigInteger(address); + Base58.decodeChecked(address); + return true; + } catch (AddressFormatException e) { + e.printStackTrace(); + return false; + } + } + + @Override + public boolean isPaperWalletSupported() { + return false; + } + + @Override + public boolean mustBeBase58Address() { + return true; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java new file mode 100644 index 0000000..91fa325 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java @@ -0,0 +1,133 @@ +/************************************************************************************* + * Copyright (C) 2014-2016 GENERAL BYTES s.r.o. All rights reserved. + * + * This software may be distributed and modified under the terms of the GNU + * General Public License version 2 (GPL2) as published by the Free Software + * Foundation and appearing in the file GPL2.TXT included in the packaging of + * this file. Please note that GPL2 Section 2[b] requires that all works based + * on this software must also be made publicly available under the terms of + * the GPL2 ("Copyleft"). + * + * Contact information + * ------------------- + * + * GENERAL BYTES s.r.o. + * Web : http://www.generalbytes.com + * + ************************************************************************************/ +package com.generalbytes.batm.server.extensions.extra.digibyte; + +import com.generalbytes.batm.server.extensions.*; +import com.generalbytes.batm.server.extensions.extra.digibyte.sources.FixPriceRateSource; +import com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap.CoinmarketcapRateSource; +import com.generalbytes.batm.server.extensions.extra.digibyte.wallets.digibyted.DigiByteRPCWallet; +import com.generalbytes.batm.server.extensions.watchlist.IWatchList; + +import java.math.BigDecimal; +import java.util.*; + +public class DigiByteExtension implements IExtension{ + @Override + public String getName() { + return "BATM DigiByte extra extension"; + } + + @Override + public IExchange createExchange(String exchangeLogin) { + return null; + } + + @Override + public IPaymentProcessor createPaymentProcessor(String paymentProcessorLogin) { + return null; //no payment processors available + } + + @Override + public IWallet createWallet(String walletLogin) { + if (walletLogin !=null && !walletLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(walletLogin,":"); + String walletType = st.nextToken(); + + if ("digibyted".equalsIgnoreCase(walletType)) { + //"digibyted:protocol:user:password:ip:port:accountname" + + String protocol = st.nextToken(); + String username = st.nextToken(); + String password = st.nextToken(); + String hostname = st.nextToken(); + String port = st.nextToken(); + String accountName =""; + if (st.hasMoreTokens()) { + accountName = st.nextToken(); + } + + + if (protocol != null && username != null && password != null && hostname !=null && port != null && accountName != null) { + String rpcURL = protocol +"://" + username +":" + password + "@" + hostname +":" + port; + return new DigiByteRPCWallet(rpcURL,accountName); + } + } + + } + return null; + } + + @Override + public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { + if (ICurrencies.DGB.equalsIgnoreCase(cryptoCurrency)) { + return new DigiByteAddressValidator(); + } + return null; + } + + @Override + public IPaperWalletGenerator createPaperWalletGenerator(String cryptoCurrency) { + return null; + } + + @Override + public IRateSource createRateSource(String sourceLogin) { + if (sourceLogin != null && !sourceLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(sourceLogin, ":"); + String exchangeType = st.nextToken(); + if ("digibytefix".equalsIgnoreCase(exchangeType)) { + BigDecimal rate = BigDecimal.ZERO; + if (st.hasMoreTokens()) { + try { + rate = new BigDecimal(st.nextToken()); + } catch (Throwable e) { + } + } + String preferedFiatCurrency = ICurrencies.USD; + if (st.hasMoreTokens()) { + preferedFiatCurrency = st.nextToken().toUpperCase(); + } + return new FixPriceRateSource(rate, preferedFiatCurrency); + } else if ("coinmarketcap".equalsIgnoreCase(exchangeType)) { + String preferedFiatCurrency = ICurrencies.USD; + if (st.hasMoreTokens()) { + preferedFiatCurrency = st.nextToken().toUpperCase(); + } + return new CoinmarketcapRateSource(preferedFiatCurrency); + } + } + return null; + } + + @Override + public Set getSupportedCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.DGB); + return result; + } + + @Override + public Set getSupportedWatchListsNames() { + return null; + } + + @Override + public IWatchList getWatchList(String name) { + return null; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java new file mode 100644 index 0000000..1f01b92 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java @@ -0,0 +1,59 @@ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources; + +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IRateSource; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by b00lean on 7/31/14. + */ +public class FixPriceRateSource implements IRateSource { + private BigDecimal rate = BigDecimal.ZERO; + + private String preferedFiatCurrency = ICurrencies.USD; + + public FixPriceRateSource(BigDecimal rate,String preferedFiatCurrency) { + this.rate = rate; + if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = ICurrencies.EUR; + } + if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = ICurrencies.USD; + } + if (ICurrencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = ICurrencies.CAD; + } + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.DGB); + return result; + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (ICurrencies.DGB.equalsIgnoreCase(cryptoCurrency)) { + return rate; + } + return null; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.CAD); + result.add(ICurrencies.USD); + result.add(ICurrencies.EUR); + return result; + } + @Override + public String getPreferredFiatCurrency() { + return preferedFiatCurrency; + } + +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java new file mode 100644 index 0000000..290c98e --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java @@ -0,0 +1,166 @@ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.math.BigDecimal; + +/** + * Created by kkyovsky on 11/29/17. + */ + +public class CMCTicker { + private String id; + private String name; + private String symbol; + private BigDecimal rank; + private BigDecimal price_usd; + private BigDecimal price_eur; + private BigDecimal price_cad; + private BigDecimal price_btc; + + @JsonProperty("24h_volume_usd") + private BigDecimal _24h_volume_usd; + private BigDecimal market_cap_usd; + private BigDecimal available_supply; + private BigDecimal total_supply; + private BigDecimal max_supply; + private BigDecimal percent_change_1h; + private BigDecimal percent_change_24h; + private BigDecimal percent_change_7d; + private long last_updated; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public BigDecimal getRank() { + return rank; + } + + public void setRank(BigDecimal rank) { + this.rank = rank; + } + + public BigDecimal getPrice_usd() { + return price_usd; + } + + public void setPrice_usd(BigDecimal price_usd) { + this.price_usd = price_usd; + } + + public BigDecimal getPrice_cad() { + return price_cad; + } + + public void setPrice_cad(BigDecimal price_cad) { + this.price_cad = price_cad; + } + + public BigDecimal getPrice_eur() { + return price_eur; + } + + public void setPrice_eur(BigDecimal price_eur) { + this.price_eur = price_eur; + } + + public BigDecimal getPrice_btc() { + return price_btc; + } + + public void setPrice_btc(BigDecimal price_btc) { + this.price_btc = price_btc; + } + + public BigDecimal get_24h_volume_usd() { + return _24h_volume_usd; + } + + public void set_24h_volume_usd(BigDecimal _24h_volume_usd) { + this._24h_volume_usd = _24h_volume_usd; + } + + public BigDecimal getMarket_cap_usd() { + return market_cap_usd; + } + + public void setMarket_cap_usd(BigDecimal market_cap_usd) { + this.market_cap_usd = market_cap_usd; + } + + public BigDecimal getAvailable_supply() { + return available_supply; + } + + public void setAvailable_supply(BigDecimal available_supply) { + this.available_supply = available_supply; + } + + public BigDecimal getTotal_supply() { + return total_supply; + } + + public void setTotal_supply(BigDecimal total_supply) { + this.total_supply = total_supply; + } + + public BigDecimal getMax_supply() { + return max_supply; + } + + public void setMax_supply(BigDecimal max_supply) { + this.max_supply = max_supply; + } + + public BigDecimal getPercent_change_1h() { + return percent_change_1h; + } + + public void setPercent_change_1h(BigDecimal percent_change_1h) { + this.percent_change_1h = percent_change_1h; + } + + public BigDecimal getPercent_change_24h() { + return percent_change_24h; + } + + public void setPercent_change_24h(BigDecimal percent_change_24h) { + this.percent_change_24h = percent_change_24h; + } + + public BigDecimal getPercent_change_7d() { + return percent_change_7d; + } + + public void setPercent_change_7d(BigDecimal percent_change_7d) { + this.percent_change_7d = percent_change_7d; + } + + public long getLast_updated() { + return last_updated; + } + + public void setLast_updated(long last_updated) { + this.last_updated = last_updated; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java new file mode 100644 index 0000000..b99f020 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java @@ -0,0 +1,94 @@ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap; + +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IRateSource; +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; +import si.mazi.rescu.RestProxyFactory; + +/** + * Created by kkyovsky on 11/29/17. + */ + +public class CoinmarketcapRateSource implements IRateSource { + + private ICoinmarketcapAPI api; + + private String preferredFiatCurrency = ICurrencies.USD; + + public CoinmarketcapRateSource(String preferedFiatCurrency) { + this(); + if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = ICurrencies.EUR; + } + if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = ICurrencies.USD; + } + if (ICurrencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = ICurrencies.CAD; + } + } + + public CoinmarketcapRateSource() { + api = RestProxyFactory.createProxy(ICoinmarketcapAPI.class, "https://api.coinmarketcap.com"); + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.DGB); + result.add(ICurrencies.BTC); + result.add(ICurrencies.BCH); + result.add(ICurrencies.BTX); + result.add(ICurrencies.LTC); + result.add(ICurrencies.ETH); + result.add(ICurrencies.DASH); + result.add(ICurrencies.XMR); + result.add(ICurrencies.POT); + return result; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.USD); + result.add(ICurrencies.EUR); + result.add(ICurrencies.CAD); + return result; + } + + + @Override + public String getPreferredFiatCurrency() { + return preferredFiatCurrency; + } + + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (!getFiatCurrencies().contains(fiatCurrency)) { + return null; + } + CMCTicker[] tickers; + if (!ICurrencies.BTC.equalsIgnoreCase(cryptoCurrency)) { + tickers = api.getTickers(cryptoCurrency, fiatCurrency); + } else { + tickers = api.getTickers(fiatCurrency); + } + + for (int i = 0; i < tickers.length; i++) { + CMCTicker ticker = tickers[i]; + if (cryptoCurrency.equalsIgnoreCase(ticker.getSymbol())) { + if (ICurrencies.EUR.equalsIgnoreCase(fiatCurrency)) { + return ticker.getPrice_eur(); + } else if (ICurrencies.USD.equalsIgnoreCase(fiatCurrency)) { + return ticker.getPrice_usd(); + } else if (ICurrencies.CAD.equalsIgnoreCase(fiatCurrency)) { + return ticker.getPrice_cad(); + } + } + } + return null; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java new file mode 100644 index 0000000..7c79e27 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java @@ -0,0 +1,33 @@ +/************************************************************************************* + * Copyright (C) 2014-2016 GENERAL BYTES s.r.o. All rights reserved. + * + * This software may be distributed and modified under the terms of the GNU + * General Public License version 2 (GPL2) as published by the Free Software + * Foundation and appearing in the file GPL2.TXT included in the packaging of + * this file. Please note that GPL2 Section 2[b] requires that all works based + * on this software must also be made publicly available under the terms of + * the GPL2 ("Copyleft"). + * + * Contact information + * ------------------- + * + * GENERAL BYTES s.r.o. + * Web : http://www.generalbytes.com + * + ************************************************************************************/ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + +@Path("/v1/ticker") +@Produces(MediaType.APPLICATION_JSON) +public interface ICoinmarketcapAPI { + @GET + @Path("/") + CMCTicker[] getTickers(@QueryParam("convert") String fiatCurrency); + + @GET + @Path("/{cryptoToGet}/?convert={convert}") + CMCTicker[] getTickers(@PathParam("cryptoToGet") String cryptoToGet, @QueryParam("convert") String fiatCurrency); +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java new file mode 100644 index 0000000..9507a51 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java @@ -0,0 +1,119 @@ +/************************************************************************************* + * Copyright (C) 2014-2016 GENERAL BYTES s.r.o. All rights reserved. + * + * This software may be distributed and modified under the terms of the GNU + * General Public License version 2 (GPL2) as published by the Free Software + * Foundation and appearing in the file GPL2.TXT included in the packaging of + * this file. Please note that GPL2 Section 2[b] requires that all works based + * on this software must also be made publicly available under the terms of + * the GPL2 ("Copyleft"). + * + * Contact information + * ------------------- + * + * GENERAL BYTES s.r.o. + * Web : http://www.generalbytes.com + * + ************************************************************************************/ +package com.generalbytes.batm.server.extensions.extra.digibyte.wallets.digibyted; + +import com.azazar.bitcoin.jsonrpcclient.BitcoinException; +import com.azazar.bitcoin.jsonrpcclient.BitcoinJSONRPCClient; +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IWallet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.net.MalformedURLException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class DigiByteRPCWallet implements IWallet{ + private static final Logger log = LoggerFactory.getLogger(DigiByteRPCWallet.class); + private static final String CRYPTO_CURRENCY = ICurrencies.DGB; + + public DigiByteRPCWallet(String rpcURL, String accountName) { + this.rpcURL = rpcURL; + this.accountName = accountName; + } + + private String rpcURL; + private String accountName; + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(CRYPTO_CURRENCY); + return result; + + } + + @Override + public String getPreferredCryptoCurrency() { + return CRYPTO_CURRENCY; + } + + @Override + public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, String description) { + if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { + log.error("Digibyted wallet error: unknown cryptocurrency."); + return null; + } + + log.info("Digibyted sending coins from " + accountName + " to: " + destinationAddress + " " + amount); + try { + String result = getClient(rpcURL).sendFrom(accountName, destinationAddress,amount.doubleValue()); + log.debug("result = " + result); + return result; + } catch (BitcoinException e) { + e.printStackTrace(); + return null; + } + } + + @Override + public String getCryptoAddress(String cryptoCurrency) { + if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { + log.error("Digibyted wallet error: unknown cryptocurrency."); + return null; + } + + try { + List addressesByAccount = getClient(rpcURL).getAddressesByAccount(accountName); + if (addressesByAccount == null || addressesByAccount.size() == 0) { + return null; + }else{ + return addressesByAccount.get(0); + } + } catch (BitcoinException e) { + e.printStackTrace(); + return null; + } + } + + @Override + public BigDecimal getCryptoBalance(String cryptoCurrency) { + if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { + log.error("Digibyted wallet error: unknown cryptocurrency: " + cryptoCurrency); + return null; + } + try { + double balance = getClient(rpcURL).getBalance(accountName); + return BigDecimal.valueOf(balance); + } catch (BitcoinException e) { + e.printStackTrace(); + return null; + } + } + + private BitcoinJSONRPCClient getClient(String rpcURL) { + try { + return new BitcoinJSONRPCClient(rpcURL); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + return null; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index 7146710..d32539f 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -227,6 +227,26 @@ + + + + + + + + + DGB + + + + DGB + + + + DGB + + + diff --git a/server_extensions_extra/src/main/resources/digibyte.png b/server_extensions_extra/src/main/resources/digibyte.png new file mode 100644 index 0000000000000000000000000000000000000000..592454a0fe46b63b73a314ed26cdfe6738c4cf0c GIT binary patch literal 13054 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 Date: Thu, 19 Apr 2018 17:06:27 -0400 Subject: [PATCH 02/20] Minor tweaks to the Coinmarketcap rate-source. --- .../sources/coinmarketcap/CMCTicker.java | 41 +++++++++++++++++++ .../CoinmarketcapRateSource.java | 11 ++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java index 290c98e..e34ebe3 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java @@ -19,7 +19,16 @@ public class CMCTicker { @JsonProperty("24h_volume_usd") private BigDecimal _24h_volume_usd; + @JsonProperty("market_cap_usd") private BigDecimal market_cap_usd; + @JsonProperty("24h_volume_cad") + private BigDecimal _24h_volume_cad; + @JsonProperty("market_cap_cad") + private BigDecimal market_cap_cad; + @JsonProperty("24h_volume_eur") + private BigDecimal _24h_volume_eur; + @JsonProperty("market_cap_eur") + private BigDecimal market_cap_eur; private BigDecimal available_supply; private BigDecimal total_supply; private BigDecimal max_supply; @@ -104,6 +113,38 @@ public class CMCTicker { return market_cap_usd; } + public void setMarket_cap_eur(BigDecimal market_cap_eur) { + this.market_cap_eur = market_cap_eur; + } + + public BigDecimal get_24h_volume_eur() { + return _24h_volume_eur; + } + + public void set_24h_volume_eur(BigDecimal _24h_volume_eur) { + this._24h_volume_eur = _24h_volume_eur; + } + + public BigDecimal getMarket_cap_eur() { + return market_cap_eur; + } + + public BigDecimal get_24h_volume_cad() { + return _24h_volume_cad; + } + + public void set_24h_volume_cad(BigDecimal _24h_volume_cad) { + this._24h_volume_cad = _24h_volume_cad; + } + + public BigDecimal getMarket_cap_cad() { + return market_cap_cad; + } + + public void setMarket_cap_cad(BigDecimal market_cap_cad) { + this.market_cap_cad = market_cap_cad; + } + public void setMarket_cap_usd(BigDecimal market_cap_usd) { this.market_cap_usd = market_cap_usd; } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java index b99f020..1f56e29 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java @@ -18,7 +18,6 @@ public class CoinmarketcapRateSource implements IRateSource { private String preferredFiatCurrency = ICurrencies.USD; public CoinmarketcapRateSource(String preferedFiatCurrency) { - this(); if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { this.preferredFiatCurrency = ICurrencies.EUR; } @@ -70,8 +69,10 @@ public class CoinmarketcapRateSource implements IRateSource { if (!getFiatCurrencies().contains(fiatCurrency)) { return null; } + CMCTicker[] tickers; - if (!ICurrencies.BTC.equalsIgnoreCase(cryptoCurrency)) { + if (!ICurrencies.BTC.equalsIgnoreCase(cryptoCurrency) && !cryptoCurrency + .equalsIgnoreCase("bitcoin")) { tickers = api.getTickers(cryptoCurrency, fiatCurrency); } else { tickers = api.getTickers(fiatCurrency); @@ -91,4 +92,10 @@ public class CoinmarketcapRateSource implements IRateSource { } return null; } + +// public static void main(String[] args) { +// CoinmarketcapRateSource rs = new CoinmarketcapRateSource(ICurrencies.EUR); +// BigDecimal exchangeRateLast = rs.getExchangeRateLast(ICurrencies.BTC, ICurrencies.EUR); +// System.out.println("exchangeRateLast = " + exchangeRateLast); +// } } \ No newline at end of file From 73bc13811dee004c73d9f028b17a6523b0e6dc09 Mon Sep 17 00:00:00 2001 From: Noah Date: Thu, 19 Apr 2018 21:59:55 -0400 Subject: [PATCH 03/20] Ensure first character of the address is D || 3 || S. --- .../digibyte/DigiByteAddressValidator.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java index ccfb47f..d84a2a5 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java @@ -25,23 +25,27 @@ public class DigiByteAddressValidator implements ICryptoAddressValidator { @Override public boolean isAddressValid(String address) { - char[] addressChars = address.toCharArray(); - //Check for invalid characters; ensure alphanumeric and no fobidden characters exist - for (char addressCharacter : addressChars) { - if (!(((addressCharacter >= '0' && addressCharacter <= '9') || - (addressCharacter >= 'a' && addressCharacter <= 'z') || - (addressCharacter >= 'A' && addressCharacter <= 'Z')) && - addressCharacter != 'l' && addressCharacter != 'I' && - addressCharacter != '0' && addressCharacter != 'O')) { + if (address.startsWith("D") ||address.startsWith("3") || address.startsWith("S")) { + char[] addressChars = address.toCharArray(); + //Check for invalid characters; ensure alphanumeric and no fobidden characters exist + for (char addressCharacter : addressChars) { + if (!(((addressCharacter >= '0' && addressCharacter <= '9') || + (addressCharacter >= 'a' && addressCharacter <= 'z') || + (addressCharacter >= 'A' && addressCharacter <= 'Z')) && + addressCharacter != 'l' && addressCharacter != 'I' && + addressCharacter != '0' && addressCharacter != 'O')) { + return false; + } + } + try { + Base58.decodeToBigInteger(address); + Base58.decodeChecked(address); + return true; + } catch (AddressFormatException e) { + e.printStackTrace(); return false; } - } - try { - Base58.decodeToBigInteger(address); - Base58.decodeChecked(address); - return true; - } catch (AddressFormatException e) { - e.printStackTrace(); + } else { return false; } } From 74e5d07ef5155b3de2cc25b3cd8067444d6d13c8 Mon Sep 17 00:00:00 2001 From: Noah Date: Thu, 19 Apr 2018 22:15:01 -0400 Subject: [PATCH 04/20] Handle the case that the received addresses isn't all capitals, for whatever reason. --- .../extensions/extra/digibyte/DigiByteAddressValidator.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java index d84a2a5..6aeb8fb 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java @@ -25,9 +25,11 @@ public class DigiByteAddressValidator implements ICryptoAddressValidator { @Override public boolean isAddressValid(String address) { - if (address.startsWith("D") ||address.startsWith("3") || address.startsWith("S")) { + //For whatever reason this may occur, cover the case + String lowercase = address.toLowerCase(); + if (lowercase.startsWith("d") ||lowercase.startsWith("3") || lowercase.startsWith("s")) { char[] addressChars = address.toCharArray(); - //Check for invalid characters; ensure alphanumeric and no fobidden characters exist + //Check for invalid characters; ensure alphanumeric and no forbidden characters exist for (char addressCharacter : addressChars) { if (!(((addressCharacter >= '0' && addressCharacter <= '9') || (addressCharacter >= 'a' && addressCharacter <= 'z') || From 9fef42b37b004495c4e3c8726bd49c18732eb0c3 Mon Sep 17 00:00:00 2001 From: Noah Seidman Date: Fri, 20 Apr 2018 09:46:07 -0400 Subject: [PATCH 05/20] Formatting. --- .../extensions/extra/digibyte/DigiByteAddressValidator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java index 6aeb8fb..23ce906 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java @@ -27,13 +27,13 @@ public class DigiByteAddressValidator implements ICryptoAddressValidator { public boolean isAddressValid(String address) { //For whatever reason this may occur, cover the case String lowercase = address.toLowerCase(); - if (lowercase.startsWith("d") ||lowercase.startsWith("3") || lowercase.startsWith("s")) { + if (lowercase.startsWith("d") || lowercase.startsWith("3") || lowercase.startsWith("s")) { char[] addressChars = address.toCharArray(); //Check for invalid characters; ensure alphanumeric and no forbidden characters exist for (char addressCharacter : addressChars) { if (!(((addressCharacter >= '0' && addressCharacter <= '9') || - (addressCharacter >= 'a' && addressCharacter <= 'z') || - (addressCharacter >= 'A' && addressCharacter <= 'Z')) && + (addressCharacter >= 'a' && addressCharacter <= 'z') || + (addressCharacter >= 'A' && addressCharacter <= 'Z')) && addressCharacter != 'l' && addressCharacter != 'I' && addressCharacter != '0' && addressCharacter != 'O')) { return false; From 16e2de97c4f4ac76277d0abbca8aecbcb747687a Mon Sep 17 00:00:00 2001 From: Noah Seidman Date: Mon, 23 Apr 2018 09:53:30 -0400 Subject: [PATCH 06/20] Added Livecoin rate source support. Tested for USD and EUR preferred currencies. --- .../digibyte/DigiByteAddressValidator.java | 8 +- .../extra/digibyte/DigiByteExtension.java | 38 ++-- .../digibyte/sources/FixPriceRateSource.java | 5 +- .../sources/coinmarketcap/CMCTicker.java | 207 ------------------ .../CoinmarketcapRateSource.java | 101 --------- .../coinmarketcap/ICoinmarketcapAPI.java | 33 --- .../sources/livecoin/ILiveCoinAPI.java | 16 ++ .../sources/livecoin/LiveCoinRateSource.java | 69 ++++++ .../sources/livecoin/LiveCoinTicker.java | 14 ++ .../wallets/digibyted/DigiByteRPCWallet.java | 19 +- .../src/main/resources/batm-extensions.xml | 2 +- 11 files changed, 142 insertions(+), 370 deletions(-) delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/ILiveCoinAPI.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinTicker.java diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java index 23ce906..f55acbc 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteAddressValidator.java @@ -32,10 +32,10 @@ public class DigiByteAddressValidator implements ICryptoAddressValidator { //Check for invalid characters; ensure alphanumeric and no forbidden characters exist for (char addressCharacter : addressChars) { if (!(((addressCharacter >= '0' && addressCharacter <= '9') || - (addressCharacter >= 'a' && addressCharacter <= 'z') || - (addressCharacter >= 'A' && addressCharacter <= 'Z')) && - addressCharacter != 'l' && addressCharacter != 'I' && - addressCharacter != '0' && addressCharacter != 'O')) { + (addressCharacter >= 'a' && addressCharacter <= 'z') || + (addressCharacter >= 'A' && addressCharacter <= 'Z')) && + addressCharacter != 'l' && addressCharacter != 'I' && + addressCharacter != '0' && addressCharacter != 'O')) { return false; } } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java index 91fa325..8e6a52e 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java @@ -17,16 +17,25 @@ ************************************************************************************/ package com.generalbytes.batm.server.extensions.extra.digibyte; -import com.generalbytes.batm.server.extensions.*; +import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IExchange; +import com.generalbytes.batm.server.extensions.IExtension; +import com.generalbytes.batm.server.extensions.IPaperWalletGenerator; +import com.generalbytes.batm.server.extensions.IPaymentProcessor; +import com.generalbytes.batm.server.extensions.IRateSource; +import com.generalbytes.batm.server.extensions.IWallet; import com.generalbytes.batm.server.extensions.extra.digibyte.sources.FixPriceRateSource; -import com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap.CoinmarketcapRateSource; +import com.generalbytes.batm.server.extensions.extra.digibyte.sources.livecoin.LiveCoinRateSource; import com.generalbytes.batm.server.extensions.extra.digibyte.wallets.digibyted.DigiByteRPCWallet; import com.generalbytes.batm.server.extensions.watchlist.IWatchList; - import java.math.BigDecimal; -import java.util.*; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +public class DigiByteExtension implements IExtension { -public class DigiByteExtension implements IExtension{ @Override public String getName() { return "BATM DigiByte extra extension"; @@ -44,8 +53,8 @@ public class DigiByteExtension implements IExtension{ @Override public IWallet createWallet(String walletLogin) { - if (walletLogin !=null && !walletLogin.trim().isEmpty()) { - StringTokenizer st = new StringTokenizer(walletLogin,":"); + if (walletLogin != null && !walletLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(walletLogin, ":"); String walletType = st.nextToken(); if ("digibyted".equalsIgnoreCase(walletType)) { @@ -56,15 +65,16 @@ public class DigiByteExtension implements IExtension{ String password = st.nextToken(); String hostname = st.nextToken(); String port = st.nextToken(); - String accountName =""; + String accountName = ""; if (st.hasMoreTokens()) { accountName = st.nextToken(); } - - if (protocol != null && username != null && password != null && hostname !=null && port != null && accountName != null) { - String rpcURL = protocol +"://" + username +":" + password + "@" + hostname +":" + port; - return new DigiByteRPCWallet(rpcURL,accountName); + if (protocol != null && username != null && password != null && hostname != null + && port != null && accountName != null) { + String rpcURL = + protocol + "://" + username + ":" + password + "@" + hostname + ":" + port; + return new DigiByteRPCWallet(rpcURL, accountName); } } @@ -103,12 +113,12 @@ public class DigiByteExtension implements IExtension{ preferedFiatCurrency = st.nextToken().toUpperCase(); } return new FixPriceRateSource(rate, preferedFiatCurrency); - } else if ("coinmarketcap".equalsIgnoreCase(exchangeType)) { + } else if ("livecoin".equalsIgnoreCase(exchangeType)) { String preferedFiatCurrency = ICurrencies.USD; if (st.hasMoreTokens()) { preferedFiatCurrency = st.nextToken().toUpperCase(); } - return new CoinmarketcapRateSource(preferedFiatCurrency); + return new LiveCoinRateSource(preferedFiatCurrency); } } return null; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java index 1f01b92..4d16518 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java @@ -2,7 +2,6 @@ package com.generalbytes.batm.server.extensions.extra.digibyte.sources; import com.generalbytes.batm.server.extensions.ICurrencies; import com.generalbytes.batm.server.extensions.IRateSource; - import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; @@ -11,11 +10,12 @@ import java.util.Set; * Created by b00lean on 7/31/14. */ public class FixPriceRateSource implements IRateSource { + private BigDecimal rate = BigDecimal.ZERO; private String preferedFiatCurrency = ICurrencies.USD; - public FixPriceRateSource(BigDecimal rate,String preferedFiatCurrency) { + public FixPriceRateSource(BigDecimal rate, String preferedFiatCurrency) { this.rate = rate; if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { this.preferedFiatCurrency = ICurrencies.EUR; @@ -51,6 +51,7 @@ public class FixPriceRateSource implements IRateSource { result.add(ICurrencies.EUR); return result; } + @Override public String getPreferredFiatCurrency() { return preferedFiatCurrency; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java deleted file mode 100644 index e34ebe3..0000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CMCTicker.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap; - -import com.fasterxml.jackson.annotation.JsonProperty; -import java.math.BigDecimal; - -/** - * Created by kkyovsky on 11/29/17. - */ - -public class CMCTicker { - private String id; - private String name; - private String symbol; - private BigDecimal rank; - private BigDecimal price_usd; - private BigDecimal price_eur; - private BigDecimal price_cad; - private BigDecimal price_btc; - - @JsonProperty("24h_volume_usd") - private BigDecimal _24h_volume_usd; - @JsonProperty("market_cap_usd") - private BigDecimal market_cap_usd; - @JsonProperty("24h_volume_cad") - private BigDecimal _24h_volume_cad; - @JsonProperty("market_cap_cad") - private BigDecimal market_cap_cad; - @JsonProperty("24h_volume_eur") - private BigDecimal _24h_volume_eur; - @JsonProperty("market_cap_eur") - private BigDecimal market_cap_eur; - private BigDecimal available_supply; - private BigDecimal total_supply; - private BigDecimal max_supply; - private BigDecimal percent_change_1h; - private BigDecimal percent_change_24h; - private BigDecimal percent_change_7d; - private long last_updated; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getSymbol() { - return symbol; - } - - public void setSymbol(String symbol) { - this.symbol = symbol; - } - - public BigDecimal getRank() { - return rank; - } - - public void setRank(BigDecimal rank) { - this.rank = rank; - } - - public BigDecimal getPrice_usd() { - return price_usd; - } - - public void setPrice_usd(BigDecimal price_usd) { - this.price_usd = price_usd; - } - - public BigDecimal getPrice_cad() { - return price_cad; - } - - public void setPrice_cad(BigDecimal price_cad) { - this.price_cad = price_cad; - } - - public BigDecimal getPrice_eur() { - return price_eur; - } - - public void setPrice_eur(BigDecimal price_eur) { - this.price_eur = price_eur; - } - - public BigDecimal getPrice_btc() { - return price_btc; - } - - public void setPrice_btc(BigDecimal price_btc) { - this.price_btc = price_btc; - } - - public BigDecimal get_24h_volume_usd() { - return _24h_volume_usd; - } - - public void set_24h_volume_usd(BigDecimal _24h_volume_usd) { - this._24h_volume_usd = _24h_volume_usd; - } - - public BigDecimal getMarket_cap_usd() { - return market_cap_usd; - } - - public void setMarket_cap_eur(BigDecimal market_cap_eur) { - this.market_cap_eur = market_cap_eur; - } - - public BigDecimal get_24h_volume_eur() { - return _24h_volume_eur; - } - - public void set_24h_volume_eur(BigDecimal _24h_volume_eur) { - this._24h_volume_eur = _24h_volume_eur; - } - - public BigDecimal getMarket_cap_eur() { - return market_cap_eur; - } - - public BigDecimal get_24h_volume_cad() { - return _24h_volume_cad; - } - - public void set_24h_volume_cad(BigDecimal _24h_volume_cad) { - this._24h_volume_cad = _24h_volume_cad; - } - - public BigDecimal getMarket_cap_cad() { - return market_cap_cad; - } - - public void setMarket_cap_cad(BigDecimal market_cap_cad) { - this.market_cap_cad = market_cap_cad; - } - - public void setMarket_cap_usd(BigDecimal market_cap_usd) { - this.market_cap_usd = market_cap_usd; - } - - public BigDecimal getAvailable_supply() { - return available_supply; - } - - public void setAvailable_supply(BigDecimal available_supply) { - this.available_supply = available_supply; - } - - public BigDecimal getTotal_supply() { - return total_supply; - } - - public void setTotal_supply(BigDecimal total_supply) { - this.total_supply = total_supply; - } - - public BigDecimal getMax_supply() { - return max_supply; - } - - public void setMax_supply(BigDecimal max_supply) { - this.max_supply = max_supply; - } - - public BigDecimal getPercent_change_1h() { - return percent_change_1h; - } - - public void setPercent_change_1h(BigDecimal percent_change_1h) { - this.percent_change_1h = percent_change_1h; - } - - public BigDecimal getPercent_change_24h() { - return percent_change_24h; - } - - public void setPercent_change_24h(BigDecimal percent_change_24h) { - this.percent_change_24h = percent_change_24h; - } - - public BigDecimal getPercent_change_7d() { - return percent_change_7d; - } - - public void setPercent_change_7d(BigDecimal percent_change_7d) { - this.percent_change_7d = percent_change_7d; - } - - public long getLast_updated() { - return last_updated; - } - - public void setLast_updated(long last_updated) { - this.last_updated = last_updated; - } -} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java deleted file mode 100644 index 1f56e29..0000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/CoinmarketcapRateSource.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap; - -import com.generalbytes.batm.server.extensions.ICurrencies; -import com.generalbytes.batm.server.extensions.IRateSource; -import java.math.BigDecimal; -import java.util.HashSet; -import java.util.Set; -import si.mazi.rescu.RestProxyFactory; - -/** - * Created by kkyovsky on 11/29/17. - */ - -public class CoinmarketcapRateSource implements IRateSource { - - private ICoinmarketcapAPI api; - - private String preferredFiatCurrency = ICurrencies.USD; - - public CoinmarketcapRateSource(String preferedFiatCurrency) { - if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferredFiatCurrency = ICurrencies.EUR; - } - if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferredFiatCurrency = ICurrencies.USD; - } - if (ICurrencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferredFiatCurrency = ICurrencies.CAD; - } - } - - public CoinmarketcapRateSource() { - api = RestProxyFactory.createProxy(ICoinmarketcapAPI.class, "https://api.coinmarketcap.com"); - } - - @Override - public Set getCryptoCurrencies() { - Set result = new HashSet(); - result.add(ICurrencies.DGB); - result.add(ICurrencies.BTC); - result.add(ICurrencies.BCH); - result.add(ICurrencies.BTX); - result.add(ICurrencies.LTC); - result.add(ICurrencies.ETH); - result.add(ICurrencies.DASH); - result.add(ICurrencies.XMR); - result.add(ICurrencies.POT); - return result; - } - - @Override - public Set getFiatCurrencies() { - Set result = new HashSet(); - result.add(ICurrencies.USD); - result.add(ICurrencies.EUR); - result.add(ICurrencies.CAD); - return result; - } - - - @Override - public String getPreferredFiatCurrency() { - return preferredFiatCurrency; - } - - - @Override - public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { - if (!getFiatCurrencies().contains(fiatCurrency)) { - return null; - } - - CMCTicker[] tickers; - if (!ICurrencies.BTC.equalsIgnoreCase(cryptoCurrency) && !cryptoCurrency - .equalsIgnoreCase("bitcoin")) { - tickers = api.getTickers(cryptoCurrency, fiatCurrency); - } else { - tickers = api.getTickers(fiatCurrency); - } - - for (int i = 0; i < tickers.length; i++) { - CMCTicker ticker = tickers[i]; - if (cryptoCurrency.equalsIgnoreCase(ticker.getSymbol())) { - if (ICurrencies.EUR.equalsIgnoreCase(fiatCurrency)) { - return ticker.getPrice_eur(); - } else if (ICurrencies.USD.equalsIgnoreCase(fiatCurrency)) { - return ticker.getPrice_usd(); - } else if (ICurrencies.CAD.equalsIgnoreCase(fiatCurrency)) { - return ticker.getPrice_cad(); - } - } - } - return null; - } - -// public static void main(String[] args) { -// CoinmarketcapRateSource rs = new CoinmarketcapRateSource(ICurrencies.EUR); -// BigDecimal exchangeRateLast = rs.getExchangeRateLast(ICurrencies.BTC, ICurrencies.EUR); -// System.out.println("exchangeRateLast = " + exchangeRateLast); -// } -} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java deleted file mode 100644 index 7c79e27..0000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/coinmarketcap/ICoinmarketcapAPI.java +++ /dev/null @@ -1,33 +0,0 @@ -/************************************************************************************* - * Copyright (C) 2014-2016 GENERAL BYTES s.r.o. All rights reserved. - * - * This software may be distributed and modified under the terms of the GNU - * General Public License version 2 (GPL2) as published by the Free Software - * Foundation and appearing in the file GPL2.TXT included in the packaging of - * this file. Please note that GPL2 Section 2[b] requires that all works based - * on this software must also be made publicly available under the terms of - * the GPL2 ("Copyleft"). - * - * Contact information - * ------------------- - * - * GENERAL BYTES s.r.o. - * Web : http://www.generalbytes.com - * - ************************************************************************************/ -package com.generalbytes.batm.server.extensions.extra.digibyte.sources.coinmarketcap; - -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; - -@Path("/v1/ticker") -@Produces(MediaType.APPLICATION_JSON) -public interface ICoinmarketcapAPI { - @GET - @Path("/") - CMCTicker[] getTickers(@QueryParam("convert") String fiatCurrency); - - @GET - @Path("/{cryptoToGet}/?convert={convert}") - CMCTicker[] getTickers(@PathParam("cryptoToGet") String cryptoToGet, @QueryParam("convert") String fiatCurrency); -} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/ILiveCoinAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/ILiveCoinAPI.java new file mode 100644 index 0000000..1e19cd7 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/ILiveCoinAPI.java @@ -0,0 +1,16 @@ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources.livecoin; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/exchange") +@Produces(MediaType.APPLICATION_JSON) +public interface ILiveCoinAPI { + + @GET + @Path("/ticker?currencyPair={currencyPair}") + LiveCoinTicker getTicker(@PathParam("currencyPair") String currencyPair); +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java new file mode 100644 index 0000000..bf49c73 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java @@ -0,0 +1,69 @@ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources.livecoin; + +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IRateSource; +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; +import si.mazi.rescu.RestProxyFactory; + +public class LiveCoinRateSource implements IRateSource { + + private ILiveCoinAPI api; + + private String preferredFiatCurrency = ICurrencies.USD; + + public LiveCoinRateSource(String preferedFiatCurrency) { + if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = ICurrencies.EUR; + } + if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = ICurrencies.USD; + } + if (ICurrencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = ICurrencies.CAD; + } + api = RestProxyFactory.createProxy(ILiveCoinAPI.class, "https://api.livecoin.net"); + } + + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.DGB); + return result; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.USD); + result.add(ICurrencies.EUR); + return result; + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (!getFiatCurrencies().contains(fiatCurrency) || !getCryptoCurrencies().contains(cryptoCurrency)) { + return null; + } + //Grab the last dgb rate in btc + LiveCoinTicker dgbBtc = api.getTicker(ICurrencies.DGB + "/" + ICurrencies.BTC); + + //Grab the last btc rate in the selected fiat currency + LiveCoinTicker btcFiat = api.getTicker(ICurrencies.BTC + "/" + fiatCurrency); + + BigDecimal lastDgbPriceInBtc = dgbBtc.getLast(); + BigDecimal lastBtcPriceInFiat = btcFiat.getLast(); + + //Multiply the last dgb/btc rate by the last btc/fiat rate to get the last dgb/fiat rate + BigDecimal lastDgbPriceInFiat = lastDgbPriceInBtc.multiply(lastBtcPriceInFiat); + + return lastDgbPriceInFiat; + } + + @Override + public String getPreferredFiatCurrency() { + return preferredFiatCurrency; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinTicker.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinTicker.java new file mode 100644 index 0000000..3cc6267 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinTicker.java @@ -0,0 +1,14 @@ +package com.generalbytes.batm.server.extensions.extra.digibyte.sources.livecoin; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.math.BigDecimal; + +public class LiveCoinTicker { + + @JsonProperty("last") + private BigDecimal last; + + public BigDecimal getLast() { + return last; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java index 9507a51..c7535e5 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java @@ -21,16 +21,16 @@ import com.azazar.bitcoin.jsonrpcclient.BitcoinException; import com.azazar.bitcoin.jsonrpcclient.BitcoinJSONRPCClient; import com.generalbytes.batm.server.extensions.ICurrencies; import com.generalbytes.batm.server.extensions.IWallet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.math.BigDecimal; import java.net.MalformedURLException; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DigiByteRPCWallet implements IWallet { -public class DigiByteRPCWallet implements IWallet{ private static final Logger log = LoggerFactory.getLogger(DigiByteRPCWallet.class); private static final String CRYPTO_CURRENCY = ICurrencies.DGB; @@ -56,15 +56,18 @@ public class DigiByteRPCWallet implements IWallet{ } @Override - public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, String description) { + public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, + String description) { if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { log.error("Digibyted wallet error: unknown cryptocurrency."); return null; } - log.info("Digibyted sending coins from " + accountName + " to: " + destinationAddress + " " + amount); + log.info("Digibyted sending coins from " + accountName + " to: " + destinationAddress + " " + + amount); try { - String result = getClient(rpcURL).sendFrom(accountName, destinationAddress,amount.doubleValue()); + String result = getClient(rpcURL) + .sendFrom(accountName, destinationAddress, amount.doubleValue()); log.debug("result = " + result); return result; } catch (BitcoinException e) { @@ -84,7 +87,7 @@ public class DigiByteRPCWallet implements IWallet{ List addressesByAccount = getClient(rpcURL).getAddressesByAccount(accountName); if (addressesByAccount == null || addressesByAccount.size() == 0) { return null; - }else{ + } else { return addressesByAccount.get(0); } } catch (BitcoinException e) { diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index d32539f..25a68dc 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -241,7 +241,7 @@ DGB - + DGB From 8bff6dd10b205712ebedfa9eae40ed267f253bbb Mon Sep 17 00:00:00 2001 From: Noah Seidman Date: Mon, 23 Apr 2018 09:56:00 -0400 Subject: [PATCH 07/20] Removed unsupported currency. --- .../extra/digibyte/sources/livecoin/LiveCoinRateSource.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java index bf49c73..ec5b393 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java @@ -20,9 +20,6 @@ public class LiveCoinRateSource implements IRateSource { if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { this.preferredFiatCurrency = ICurrencies.USD; } - if (ICurrencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferredFiatCurrency = ICurrencies.CAD; - } api = RestProxyFactory.createProxy(ILiveCoinAPI.class, "https://api.livecoin.net"); } From 845ebdba1d10ebd74d287a0245ef748d5df69ceb Mon Sep 17 00:00:00 2001 From: xdustinface Date: Sun, 29 Apr 2018 11:27:48 +0200 Subject: [PATCH 08/20] Created SmartCash API rate source extension. --- server_extensions_extra/build.gradle | 4 +- .../extra/smartcash/SmartcashExtension.java | 7 + .../sources/smartcash/APIResponse.java | 67 +++++++++ .../sources/smartcash/ISmartCashAPI.java | 41 ++++++ .../smartcash/SmartCashRateSource.java | 131 ++++++++++++++++++ .../src/main/resources/batm-extensions.xml | 6 +- 6 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java diff --git a/server_extensions_extra/build.gradle b/server_extensions_extra/build.gradle index 7da0690..081ed6e 100644 --- a/server_extensions_extra/build.gradle +++ b/server_extensions_extra/build.gradle @@ -29,6 +29,8 @@ dependencies { compile(group: 'com.github.mmazi', name: 'rescu', version: '1.9.1') compile(group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1') compile(group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.8.0') + compile(group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.2') + compile(group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.8.2') compile(group: 'org.knowm.xchange', name: 'xchange-core', version: '4.2.1') compile(group: 'com.google.guava', name: 'guava', version: '18.0') compile(group: 'com.google.zxing', name: 'core', version: '2.3.0') @@ -65,4 +67,4 @@ publishing { from components.java } } -} \ No newline at end of file +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/SmartcashExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/SmartcashExtension.java index c80590b..5fc47dc 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/SmartcashExtension.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/SmartcashExtension.java @@ -19,6 +19,7 @@ package com.generalbytes.batm.server.extensions.extra.smartcash; import com.generalbytes.batm.server.extensions.*; import com.generalbytes.batm.server.extensions.extra.smartcash.sources.FixPriceRateSource; +import com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash.SmartCashRateSource; import com.generalbytes.batm.server.extensions.extra.smartcash.wallets.smartcashd.SmartcashRPCWallet; import com.generalbytes.batm.server.extensions.watchlist.IWatchList; @@ -99,6 +100,12 @@ public class SmartcashExtension implements IExtension{ preferedFiatCurrency = st.nextToken().toUpperCase(); } return new FixPriceRateSource(rate,preferedFiatCurrency); + }else if ("smartapi".equalsIgnoreCase(exchangeType)) { + String preferredFiatCurrency = Currencies.USD; + if (st.hasMoreTokens()) { + preferredFiatCurrency = st.nextToken(); + } + return new SmartCashRateSource(preferredFiatCurrency); } } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java new file mode 100644 index 0000000..c7df692 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java @@ -0,0 +1,67 @@ +/* ## +# Part of the SmartCash API price extension +# +# Copyright 2018 dustinface +# Created 29.04.2018 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +## */ + +package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; + +import java.math.BigDecimal; + +public class APIResponse { + + public BigDecimal count; + public Item[] items; + public Last last; + public String resource; + public BigDecimal status; + public BigDecimal execution; + + public static class Item { + public String updated; + public Currencies currencies; + } + + public static class Currencies { + public BigDecimal USD; + public BigDecimal EUR; + public BigDecimal CHF; + } + + public class Last { + public String id; + public String created; + } + + public BigDecimal getPrice(String fiatCurrency) { + + if (fiatCurrency.equalsIgnoreCase("USD")) { + return this.items[0].currencies.USD; + }else if (fiatCurrency.equalsIgnoreCase("EUR")) { + return this.items[0].currencies.EUR; + }else if (fiatCurrency.equalsIgnoreCase("CHF")) { + return this.items[0].currencies.CHF; + } + + return null; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java new file mode 100644 index 0000000..4d2a2a9 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java @@ -0,0 +1,41 @@ +/* ## +# Part of the SmartCash API price extension +# +# Copyright 2018 dustinface +# Created 29.04.2018 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +## */ + +package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +@Path("/v1/") +@Produces(MediaType.APPLICATION_JSON) +public interface ISmartCashAPI { + + @GET + @Path("exchange/currencies?limit=2") + public APIResponse returnResponse(); +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java new file mode 100644 index 0000000..dde433f --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java @@ -0,0 +1,131 @@ +/* ## +# Part of the SmartCash API price extension +# +# Copyright 2018 dustinface +# Created 29.04.2018 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +## */ + +package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; + +import com.generalbytes.batm.server.extensions.Currencies; +import com.generalbytes.batm.server.extensions.Currencies; +import com.generalbytes.batm.server.extensions.IRateSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import si.mazi.rescu.ClientConfig; +import si.mazi.rescu.RestProxyFactory; +import si.mazi.rescu.serialization.jackson.DefaultJacksonObjectMapperFactory; +import si.mazi.rescu.serialization.jackson.JacksonObjectMapperFactory; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public class SmartCashRateSource implements IRateSource{ + private static final Logger log = LoggerFactory.getLogger(SmartCashRateSource.class); + + private String preferedFiatCurrency; + private ISmartCashAPI api; + + private static HashMap rateAmounts = new HashMap(); + private static HashMap rateTimes = new HashMap(); + private static final long MAXIMUM_ALLOWED_TIME_OFFSET = 30 * 1000; //30sec + + public SmartCashRateSource(String preferedFiatCurrency) { + if (preferedFiatCurrency == null) { + preferedFiatCurrency = Currencies.USD; + } + this.preferedFiatCurrency = preferedFiatCurrency; + + api = RestProxyFactory.createProxy(ISmartCashAPI.class, "https://api.smartcash.cc"); + } + + @Override + public Set getFiatCurrencies() { + Set fiatCurrencies = new HashSet(); + fiatCurrencies.add(Currencies.USD); + fiatCurrencies.add(Currencies.EUR); + fiatCurrencies.add(Currencies.CHF); + return fiatCurrencies; + } + + @Override + public String getPreferredFiatCurrency() { + return this.preferedFiatCurrency; + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(Currencies.SMART); + return result; + } + + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + + String key = cryptoCurrency +"_" + fiatCurrency; + synchronized (rateAmounts) { + long now = System.currentTimeMillis(); + BigDecimal amount = rateAmounts.get(key); + if (amount == null) { + BigDecimal result = getExchangeRateLastSync(cryptoCurrency, fiatCurrency); + log.debug("Called smartcash exchange for rate: " + key + " = " + result); + rateAmounts.put(key,result); + rateTimes.put(key,now+MAXIMUM_ALLOWED_TIME_OFFSET); + return result; + }else { + Long expirationTime = rateTimes.get(key); + if (expirationTime > now) { + return rateAmounts.get(key); + }else{ + //do the job; + BigDecimal result = getExchangeRateLastSync(cryptoCurrency, fiatCurrency); + log.debug("Called smartcash exchange for rate: " + key + " = " + result); + rateAmounts.put(key,result); + rateTimes.put(key,now+MAXIMUM_ALLOWED_TIME_OFFSET); + return result; + } + } + } + + } + + private BigDecimal getExchangeRateLastSync(String cryptoCurrency, String fiatCurrency) { + if (!Currencies.SMART.equalsIgnoreCase(cryptoCurrency)) { + return null; //unsupported currency + } + APIResponse response = api.returnResponse(); + + if (response != null) { + return response.getPrice(fiatCurrency); + } + + return null; + } + +} diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index 7146710..964ee56 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -327,6 +327,10 @@ SMART + + + SMART + @@ -432,6 +436,6 @@ BTX - + From f5cc8b3b3ef92b81c1e77874a44fc772bade5b7b Mon Sep 17 00:00:00 2001 From: xdustinface Date: Wed, 2 May 2018 13:20:57 +0200 Subject: [PATCH 09/20] Changed licence --- .../sources/smartcash/APIResponse.java | 22 +++++-------------- .../sources/smartcash/ISmartCashAPI.java | 22 +++++-------------- .../smartcash/SmartCashRateSource.java | 22 +++++-------------- 3 files changed, 18 insertions(+), 48 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java index c7df692..6e8b582 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java @@ -4,23 +4,13 @@ # Copyright 2018 dustinface # Created 29.04.2018 # -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: +* This software may be distributed and modified under the terms of the GNU +* General Public License version 2 (GPL2) as published by the Free Software +* Foundation and appearing in the file GPL2.TXT included in the packaging of +* this file. Please note that GPL2 Section 2[b] requires that all works based +* on this software must also be made publicly available under the terms of +* the GPL2 ("Copyleft"). # -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. ## */ package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java index 4d2a2a9..e95f8b4 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/ISmartCashAPI.java @@ -4,23 +4,13 @@ # Copyright 2018 dustinface # Created 29.04.2018 # -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: +* This software may be distributed and modified under the terms of the GNU +* General Public License version 2 (GPL2) as published by the Free Software +* Foundation and appearing in the file GPL2.TXT included in the packaging of +* this file. Please note that GPL2 Section 2[b] requires that all works based +* on this software must also be made publicly available under the terms of +* the GPL2 ("Copyleft"). # -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. ## */ package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java index dde433f..3a315e7 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java @@ -4,23 +4,13 @@ # Copyright 2018 dustinface # Created 29.04.2018 # -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: +* This software may be distributed and modified under the terms of the GNU +* General Public License version 2 (GPL2) as published by the Free Software +* Foundation and appearing in the file GPL2.TXT included in the packaging of +* this file. Please note that GPL2 Section 2[b] requires that all works based +* on this software must also be made publicly available under the terms of +* the GPL2 ("Copyleft"). # -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. ## */ package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; From 4f6d5fbefa1b681ecc530b38d9efc896519518da Mon Sep 17 00:00:00 2001 From: xdustinface Date: Thu, 3 May 2018 15:34:30 +0200 Subject: [PATCH 10/20] Added more currencies of smartapi. --- .../sources/smartcash/APIResponse.java | 29 +++++++++++++------ .../smartcash/SmartCashRateSource.java | 16 ++++++---- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java index 6e8b582..1e51207 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/APIResponse.java @@ -16,6 +16,7 @@ package com.generalbytes.batm.server.extensions.extra.smartcash.sources.smartcash; import java.math.BigDecimal; +import java.lang.reflect.Field; public class APIResponse { @@ -28,13 +29,21 @@ public class APIResponse { public static class Item { public String updated; - public Currencies currencies; + public Currency currencies; } - public static class Currencies { + public static class Currency { public BigDecimal USD; public BigDecimal EUR; public BigDecimal CHF; + public BigDecimal CAD; + public BigDecimal AUD; + public BigDecimal GBP; + public BigDecimal BRL; + public BigDecimal VEF; + public BigDecimal SGD; + public BigDecimal KRW; + public BigDecimal JPY; } public class Last { @@ -44,14 +53,16 @@ public class APIResponse { public BigDecimal getPrice(String fiatCurrency) { - if (fiatCurrency.equalsIgnoreCase("USD")) { - return this.items[0].currencies.USD; - }else if (fiatCurrency.equalsIgnoreCase("EUR")) { - return this.items[0].currencies.EUR; - }else if (fiatCurrency.equalsIgnoreCase("CHF")) { - return this.items[0].currencies.CHF; + BigDecimal price = null; + + try { + Field field = this.items[0].currencies.getClass().getDeclaredField(fiatCurrency); + field.setAccessible(true); + price = (BigDecimal)field.get(this.items[0].currencies); + } catch (Exception e){ + } - return null; + return price; } } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java index 3a315e7..2757c72 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/smartcash/sources/smartcash/SmartCashRateSource.java @@ -33,6 +33,7 @@ import java.math.BigDecimal; import java.util.HashMap; import java.util.HashSet; import java.util.Set; +import java.lang.reflect.Field; public class SmartCashRateSource implements IRateSource{ private static final Logger log = LoggerFactory.getLogger(SmartCashRateSource.class); @@ -45,9 +46,11 @@ public class SmartCashRateSource implements IRateSource{ private static final long MAXIMUM_ALLOWED_TIME_OFFSET = 30 * 1000; //30sec public SmartCashRateSource(String preferedFiatCurrency) { - if (preferedFiatCurrency == null) { + + if (!getFiatCurrencies().contains(preferedFiatCurrency)) { preferedFiatCurrency = Currencies.USD; } + this.preferedFiatCurrency = preferedFiatCurrency; api = RestProxyFactory.createProxy(ISmartCashAPI.class, "https://api.smartcash.cc"); @@ -56,9 +59,13 @@ public class SmartCashRateSource implements IRateSource{ @Override public Set getFiatCurrencies() { Set fiatCurrencies = new HashSet(); - fiatCurrencies.add(Currencies.USD); - fiatCurrencies.add(Currencies.EUR); - fiatCurrencies.add(Currencies.CHF); + + Field[] fields = APIResponse.Currency.class.getFields(); + + for (Field f : fields) { + fiatCurrencies.add(f.getName()); + } + return fiatCurrencies; } @@ -74,7 +81,6 @@ public class SmartCashRateSource implements IRateSource{ return result; } - @Override public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { From 6b957d21159da507677e862789240bec7d9e2f42 Mon Sep 17 00:00:00 2001 From: Artur Kowalski Date: Wed, 9 May 2018 12:53:32 +0200 Subject: [PATCH 11/20] prepare futurocoin --- .../batm/server/extensions/ICurrencies.java | 1 + .../FuturocoinAddressValidator.java | 34 +++++ .../extra/futurocoin/FuturocoinExtension.java | 133 ++++++++++++++++++ .../sources/FixPriceRateSource.java | 50 +++++++ .../futurocoin/sources/yobit/IYobitAPI.java | 18 +++ .../sources/yobit/YobitRateSource.java | 49 +++++++ .../futurocoin/sources/yobit/dto/Ticker.java | 87 ++++++++++++ .../sources/yobit/dto/YobitResponse.java | 13 ++ .../futurocoind/FuturocoinRPCWallet.java | 100 +++++++++++++ .../src/main/resources/fto.png | Bin 0 -> 22187 bytes 10 files changed, 485 insertions(+) create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinAddressValidator.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/Ticker.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java create mode 100644 server_extensions_extra/src/main/resources/fto.png diff --git a/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java b/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java index 0548431..f4b8439 100644 --- a/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java +++ b/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/ICurrencies.java @@ -29,6 +29,7 @@ public interface ICurrencies { public static final String DASH = "DASH"; public static final String DOGE = "DOGE"; public static final String FLASH = "FLASH";// FLASH Coin + public static final String FTO = "FTO"; public static final String MAX = "MAX"; public static final String LEO = "LEO"; public static final String NLG = "NLG"; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinAddressValidator.java new file mode 100644 index 0000000..bf270d5 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinAddressValidator.java @@ -0,0 +1,34 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin; + +import com.generalbytes.batm.server.coinutil.AddressFormatException; +import com.generalbytes.batm.server.coinutil.Base58; +import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; + +public class FuturocoinAddressValidator implements ICryptoAddressValidator { + + @Override + public boolean isAddressValid(String address) { + if (address.startsWith("F") || address.startsWith("6")) { + try { + Base58.decodeToBigInteger(address); + Base58.decodeChecked(address); + } catch (AddressFormatException e) { + e.printStackTrace(); + return false; + } + return true; + }else{ + return false; + } + } + + @Override + public boolean mustBeBase58Address() { + return true; + } + + @Override + public boolean isPaperWalletSupported() { + return false; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java new file mode 100644 index 0000000..df9c5be --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java @@ -0,0 +1,133 @@ +/************************************************************************************* + * Copyright (C) 2014-2016 GENERAL BYTES s.r.o. All rights reserved. + * + * This software may be distributed and modified under the terms of the GNU + * General Public License version 2 (GPL2) as published by the Free Software + * Foundation and appearing in the file GPL2.TXT included in the packaging of + * this file. Please note that GPL2 Section 2[b] requires that all works based + * on this software must also be made publicly available under the terms of + * the GPL2 ("Copyleft"). + * + * Contact information + * ------------------- + * + * GENERAL BYTES s.r.o. + * Web : http://www.generalbytes.com + * + ************************************************************************************/ +package com.generalbytes.batm.server.extensions.extra.futurocoin; + +import com.generalbytes.batm.server.extensions.*; +import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.FixPriceRateSource; +import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.YobitRateSource; +import com.generalbytes.batm.server.extensions.extra.futurocoin.wallets.futurocoind.FuturocoinRPCWallet; +import com.generalbytes.batm.server.extensions.watchlist.IWatchList; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +//import com.generalbytes.batm.server.extensions.extra.dogecoin.sources.chainso.ChainSoRateSource; +//import com.generalbytes.batm.server.extensions.extra.dogecoin.wallets.blockio.BlockIOWallet; + +public class FuturocoinExtension implements IExtension{ + @Override + public String getName() { + return "BATM Futurocoin extra extension"; + } + + @Override + public IExchange createExchange(String exchangeLogin) { + return null; + } + + @Override + public IPaymentProcessor createPaymentProcessor(String paymentProcessorLogin) { + return null; //no payment processors available + } + + @Override + public IWallet createWallet(String walletLogin) { + if (walletLogin !=null && !walletLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(walletLogin,":"); + String walletType = st.nextToken(); + + if ("futurocoind".equalsIgnoreCase(walletType)) { + String protocol = st.nextToken(); + String username = st.nextToken(); + String password = st.nextToken(); + String hostname = st.nextToken(); + String port = st.nextToken(); + String accountName =""; + if (st.hasMoreTokens()) { + accountName = st.nextToken(); + } + + + if (protocol != null && username != null && password != null && hostname !=null && port != null && accountName != null) { + String rpcURL = protocol +"://" + username +":" + password + "@" + hostname +":" + port; + return new FuturocoinRPCWallet(rpcURL,accountName); + } + } + + } + return null; + } + + @Override + public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { + if (ICurrencies.FTO.equalsIgnoreCase(cryptoCurrency)) { + return new FuturocoinAddressValidator(); + } + return null; + } + + @Override + public IPaperWalletGenerator createPaperWalletGenerator(String cryptoCurrency) { + return null; + } + + @Override + public IRateSource createRateSource(String sourceLogin) { + if (sourceLogin != null && !sourceLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(sourceLogin, ":"); + String exchangeType = st.nextToken(); + + if ("futurocoinfix".equalsIgnoreCase(exchangeType)) { + BigDecimal rate = BigDecimal.ZERO; + if (st.hasMoreTokens()) { + try { + rate = new BigDecimal(st.nextToken()); + } catch (Throwable e) { + } + } + String preferedFiatCurrency = ICurrencies.USD; + if (st.hasMoreTokens()) { + preferedFiatCurrency = st.nextToken().toUpperCase(); + } + return new FixPriceRateSource(rate, preferedFiatCurrency); + } else if ("yobit".equalsIgnoreCase(exchangeType)) { + return new YobitRateSource(); + } + } + return null; + } + + @Override + public Set getSupportedCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.FTO); + return result; + } + + @Override + public Set getSupportedWatchListsNames() { + return null; + } + + @Override + public IWatchList getWatchList(String name) { + return null; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java new file mode 100644 index 0000000..849909f --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java @@ -0,0 +1,50 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin.sources; + +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IRateSource; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by woolly_sammoth on 11/12/14. + */ +public class FixPriceRateSource implements IRateSource { + private BigDecimal rate = BigDecimal.ZERO; + + private String preferedFiatCurrency = ICurrencies.USD; + + public FixPriceRateSource(BigDecimal rate, String preferedFiatCurrency) { + this.rate = rate; + if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = ICurrencies.USD; + } + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.FTO); + return result; + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (ICurrencies.FTO.equalsIgnoreCase(cryptoCurrency)) { + return rate; + } + return null; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.USD); + return result; + } + @Override + public String getPreferredFiatCurrency() { + return preferedFiatCurrency; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java new file mode 100644 index 0000000..731fcfd --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java @@ -0,0 +1,18 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit; + +import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.Ticker; +import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.YobitResponse; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/api/3/") +@Produces(MediaType.APPLICATION_JSON) +public interface IYobitAPI { + @GET + @Path("ticker/{cryptocurrency}_{fiatcurrency}") + YobitResponse getTicker(@PathParam("cryptocurrency") String cryptoCurrency, @PathParam("fiatcurrency") String fiatCurrency); +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java new file mode 100644 index 0000000..31a2542 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java @@ -0,0 +1,49 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit; + +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IRateSource; +import com.generalbytes.batm.server.extensions.extra.bitcoin.sources.bity.IBity; +import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.Ticker; +import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.YobitResponse; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; + +public class YobitRateSource implements IRateSource { + + private IYobitAPI api; + + public YobitRateSource() { + api = RestProxyFactory.createProxy(IBity.class, "https://yobit.net"); + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.FTO); + return result; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.USD); + return result; + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (!getFiatCurrencies().contains(fiatCurrency) || !getCryptoCurrencies().contains(cryptoCurrency)) { + return null; + } + + YobitResponse response = api.getTicker(cryptoCurrency.toLowerCase(), fiatCurrency.toLowerCase()); + return response.getFot_usd().getLast(); + } + + @Override + public String getPreferredFiatCurrency() { + return ICurrencies.USD; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/Ticker.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/Ticker.java new file mode 100644 index 0000000..f9579ab --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/Ticker.java @@ -0,0 +1,87 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto; + +import java.math.BigDecimal; + +public class Ticker { + private BigDecimal high; + private BigDecimal low; + private BigDecimal avg; + private BigDecimal vol; + private BigDecimal vol_cur; + private BigDecimal last; + private BigDecimal buy; + private BigDecimal sell; + private long updated; + + public BigDecimal getHigh() { + return high; + } + + public void setHigh(BigDecimal high) { + this.high = high; + } + + public BigDecimal getLow() { + return low; + } + + public void setLow(BigDecimal low) { + this.low = low; + } + + public BigDecimal getAvg() { + return avg; + } + + public void setAvg(BigDecimal avg) { + this.avg = avg; + } + + public BigDecimal getVol() { + return vol; + } + + public void setVol(BigDecimal vol) { + this.vol = vol; + } + + public BigDecimal getVol_cur() { + return vol_cur; + } + + public void setVol_cur(BigDecimal vol_cur) { + this.vol_cur = vol_cur; + } + + public BigDecimal getLast() { + return last; + } + + public void setLast(BigDecimal last) { + this.last = last; + } + + public BigDecimal getBuy() { + return buy; + } + + public void setBuy(BigDecimal buy) { + this.buy = buy; + } + + public BigDecimal getSell() { + return sell; + } + + public void setSell(BigDecimal sell) { + this.sell = sell; + } + + public long getUpdated() { + return updated; + } + + public void setUpdated(long updated) { + this.updated = updated; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java new file mode 100644 index 0000000..642a8e3 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java @@ -0,0 +1,13 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto; + +public class YobitResponse { + private Ticker fot_usd; + + public Ticker getFot_usd() { + return fot_usd; + } + + public void setFot_usd(Ticker fot_usd) { + this.fot_usd = fot_usd; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java new file mode 100644 index 0000000..29b71c8 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java @@ -0,0 +1,100 @@ +package com.generalbytes.batm.server.extensions.extra.futurocoin.wallets.futurocoind; + +import com.azazar.bitcoin.jsonrpcclient.BitcoinException; +import com.azazar.bitcoin.jsonrpcclient.BitcoinJSONRPCClient; +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IWallet; +import java.math.BigDecimal; +import java.net.MalformedURLException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class FuturocoinRPCWallet implements IWallet { + + private static final Logger log = LoggerFactory.getLogger(FuturocoinRPCWallet.class); + private static final String CRYPTO_CURRENCY = ICurrencies.FTO; + + public FuturocoinRPCWallet(String rpcURL, String accountName) { + this.rpcURL = rpcURL; + this.accountName = accountName; + } + + private String rpcURL; + private String accountName; + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(CRYPTO_CURRENCY); + return result; + + } + + @Override + public String getPreferredCryptoCurrency() { + return CRYPTO_CURRENCY; + } + + @Override + public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, String description) { + if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { + log.error("Futurocoind wallet error: unknown cryptocurrency."); + return null; + } + + log.info("Futurocoind sending coins from " + accountName + " to: " + destinationAddress + " " + amount); + try { + String result = getClient(rpcURL).sendFrom(accountName, destinationAddress,amount.doubleValue()); + log.debug("result = " + result); + return result; + } catch (BitcoinException e) { + e.printStackTrace(); + return null; + } + } + + @Override + public String getCryptoAddress(String cryptoCurrency) { + if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { + log.error("Futurocoind wallet error: unknown cryptocurrency."); + return null; + } + + try { + List addressesByAccount = getClient(rpcURL).getAddressesByAccount(accountName); + if (addressesByAccount == null || addressesByAccount.size() == 0) { + return null; + }else{ + return addressesByAccount.get(0); + } + } catch (BitcoinException e) { + e.printStackTrace(); + return null; + } + } + + @Override + public BigDecimal getCryptoBalance(String cryptoCurrency) { + if (!CRYPTO_CURRENCY.equalsIgnoreCase(cryptoCurrency)) { + log.error("Futurocoind wallet error: unknown cryptocurrency: " + cryptoCurrency); + return null; + } + try { + double balance = getClient(rpcURL).getBalance(accountName); + return BigDecimal.valueOf(balance); + } catch (BitcoinException e) { + e.printStackTrace(); + return null; + } + } + + private BitcoinJSONRPCClient getClient(String rpcURL) { + try { + return new BitcoinJSONRPCClient(rpcURL); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/server_extensions_extra/src/main/resources/fto.png b/server_extensions_extra/src/main/resources/fto.png new file mode 100644 index 0000000000000000000000000000000000000000..350b38ac9e76810e6a85498c67957904b55ef064 GIT binary patch literal 22187 zcmXVYcOcdO_y3g@H?+98Mk-m?&bn3+3d!!;d+%}W>`~#8y@gye?nRQ7k-c*X$)1f9HhMJig0)fyxdHhHl0wEdv_j8#7yn_0k z5e#eP}eVK`v*-T%W5Xq@rBR~jlY^G$J#rC69uPN!cEpQ$5$hc+DJ2B3XAII z?-i);lEm z-eAxt-G4sM3*mzx#Jv$>Xau>&MHVgq^UVKdTiIbqKAHQKHY$lW)E~PT5*Etci^Gf0 zlI{2gzK{{dfnGN)O7lwUD>P~}tjwVyROazk0~bF8!*5(vhA(eck8!szO12w8g2@&V zVR-`0ad;;8c5CO?c?km$X9&)>C z>Dck&|CV~2<-8?b2sG^-Z>bD!Fc(>+f;vHrH>Xh01xJWlsVI-Nd}xGgs7B7hhlbc2 zgfPYdC`=uD#bS{GvR(pr%Gy+BW)oxh>HayfG0gbRe+iGw_7%L#6outXWfIRYV^NE>U(F`VG=Bh+m!V z&UOr_EZU)M2%C)$ysxo)$?dMCO*?t=n;Q)Gdz1s&ez>Au{Ft;~G$3BBoC9}yy(4Lz zO;F6+9*dENxMwSir?Jr;RY3Vn#!sAVEeUo{n6=UJJ6yE2_f%xRXRjFy^iKR9DY5i#-yidf+ z9>wA8ER1%3H{8J(s^}V;-K;s++c6amwgY+_F-vX!!D`^nEoL-ZH`e1yo2x`(k8W#! zcGMIOTrG@BO{3P;-PyPu?uY8~E+P}`rkdMV$g8)BSPbu@xQ+1l--i>V7zf(wm7zyE zG3FECu7{qW_6;isSm6?onixK-a>+#sKgKruoCTY_Dw|sHJ=?p8S^Eu?9nteelJErj z2Sj?A%q;H8%o( zefmF&hH0q(m%h+>EN$Bc71Wms{_(vbCa|nlNM9tYY~aTNALQ)(jc_ZZY1l8)z{(}8 zNuBk3nU|102W6H()son7z*4w@Xh%oL>_A9gtH|}%h*$8dz;Bb3utDZ) z3_G6AY+52|1sX+B*TCarY>qY{?dbT5i4Z^Xvq5;Rm$-1ix=ex+kXHs^2}1Pu5VPx3 z`<`nD|CT{&r4`O<8d|a>K&umDF})mK#;DkNTQSCJ17$@-spQ7snTd@gK3!BkJtk*~ z;4jd^)T1t|%`xv&gccJF7_CC#3%r6~e?bJ^4Rt?%|V?t}|5m2a)<@AYDm!PYM2vR-c+W2sUn#4TYOj)80nM8+893b3=$`kCLacB% z)@zW)9S>V#L?jXAC2hI;-lo=f@ik~nW8f@blHB&a93QNsF6=_JP? z%L1k)wAv~%9d}0={PIf7nXI5~I(1|X<_x9$yO-yAI~WH>W1qszUN#v^#$Rn#*U@&X5X zeQHWMH)0iQc1BC$H$byHnQ~Emar%*jCH_WSm&wUb1_e}&`)}w*d7Z_@<|W4slp_&E z+H0m3+yCV?J?GRi`SF!%C))(5Ep22JKPLV?K?-I2r>NZo(n_%J8!OZfXm#GbxEe}N zFhJR2#0>r9(U&LO+XoX1EF5~;UxYS$m@}c-#8V=)!a?TN{c}p{5&pC5N7T~-{V?20 z??K@!PO_dfyTA8MwM#2mpTe4!1Wb!*3#kP%n1t^e-*tADKvxzIcdWUDq?nr-vK$3+ zm||&ll{=D@>MmZi5b!oyCIdQ+slsa%sGm`OuaGaP8_aDVpc;npd$-*hxIb7ye40qu zekq*2M8;7^M%hGTMoQ>joxMd_YK6PpVPlsy;1qCVttHXc0x{iJ_$9HXn~HP)WVQT|?M0eG$>vhB$I)T8xcD<; zAxdj|)K`yP8pu;3LhOU6?2%ungoti3ZbhV$4+^9!X z*#W5|iADp7>q7oVaH?}63KsXht^LW-3{k9Jq}v-8K5(p84L$-Srr(xzjt z&)#3!o4GuYfZMg`>1Jy+;FLDLKLXwbfW=J5PP4aF8Two+#{3rtVs>?EN+Va1qbQz1 z086XIu&znT9s9R8Db~jJw-Qy=nq}YXwWwpq@l+VsPl}Z+E~5;wjt*G@M}N3V#wJBR zCgKG_s$4)7Hv!#6RBP4LJeKzQk!Bh>6n&F(N^WVPH{H!LaEWP(qI==>%nhEOlITR+}Tw$me=ruaUMhI`OfrAf>5AbD{U{|%c-lg zkad5K1a1Sd!=UMpJ~U`dxnmvCMAWe<+QGg-#znQQ%hNsP2ZZjv$(g7?TBRy8zwtK3 zekF(5TcJpB(;vxq3WpySr|Hy0N2?)e*(i1?2?o4trSLZR-fme#>~Sw+uoCM_{KGDj z=FKQSrZy4?pFaQkQP{&uLxE~>nXA5gH;4$O3Y+$z?b>6r=ln5Ga*Gr+l&O4N{a7w` zKAj)mLo;^QjD~c|?+fIG1YY?pf|hzZz<;#XNAS?eS#V2;o7fr*_;0N!u+_P%TjJK> zyl6awYYA;TYA!O$h&B7PlyaP8G7wlgVClmZq z>w4={o&|GgaQPI#wYH#ie$63Fjr;*fw(O$L`Edy|7&mF_#+D8`y1W zh!rLZ`D+D$<=}6&fmEZqV_g(=1mdi6yP>bInZ>QnT>$;EnY(FI1=WCwUEMAud*+F^ zb`ECd4;rRfIYdaH^QXVox7{Fc>=&-2R2D2I{i|)yPr}T@G#W`JU4kx|70`B|Qoop- zF}AVkq$?eW5M^xY9Hst_j(Qw^Le+EVzV;*^AH}Ip`6V^^s&73?S(yJBXW`Fr9jshW zYqo2o<*Fcwq%*PMQrqXZ!@A-XY0C-AWbFV`a1jv(+O9OU>&qOW5+~|CG;aer8UfJL zc`}mz!&P5%o%_y2)(1W@8y&t~crIKvxoe`xD6|DL6t!aRG8{!uNwRkSh8q zWq&)um#6#^kt)-VsOm9(v+rZ@%~a5DlH#UhxJaa0U!1sMLk98@Lkf2WfMb|=6M|Gf zIKyyK zPOhelfKNuMJ;@L4#UU?SU18i?Xe4pHL~v7;V+ZM8mi;G_A(~P$H8;rx8Z<=k z;6h_++)0hMqK;`nA)m^OjEem#%fO6IODf&I_qJbL!0)W~*ob(Av&QX9gd%IWuunZe zGo&a>VnY_VR3&8Bakk5Xcq^jZy4@KXWHsR#^b)B;we3rK_UmQLh$f{)+z?`CNep6k z2^TQodG?&(Uz&*=PPozRX6inIFCxnAl;2rIC7@>vpDk9c_=Q zzCsh6A4TA>)t(8@9Nzj#fy+Qbqj=Sy>4xFlO+v^vr|d5^#32*P3(2IH_TnFnbeZhr zHeQX6h9WVuL&gJ}(;{Z%`u!mKd5+>6Tif?~JuM=m_)hOU?n(2#ZmO1BVoTdZl1Jhm z=QhY>io8)%TcuRHY58=Pe}4EsZHB?DY9rHG`@OIO3&IQi!gu0ghR3|X0LEg**SrwE_3dNoen0OaRa5|DsT5%k|sy=oCnUfLe z9{&&_ISX-mf7OsX`B$c&U2hI|D^re0;-w-0k9mr5fy7svr+-=4O4+uCMnm=FJc@X!|auiy2Nd!SVL8W~~yg1;bi6?e{imwlt!wQqJWDD*1r682E%59vsE} z!H+Ce=?$#f=0VF2aK_Fe-u4w~i|-F>Y{Y3mXQ$ZHuQ#w4LolGOyPU|+9O7<$<#Qpe z&g*NoPfIMDp2D7YnM`}eJuTwDnuSc@b^;~(?SvpL;bDLI`f_Tc*c|r&!I_8JcBH3C z3~sRF*4Pjs7$TRAbC0!J)|l(n3FP_#$zCQ)=rYL*%Pi;LZ7y5BM`R&Ku2R?s09<{= zgLXC6>Ws$IW$3ldg@XefY@n7(&1Yr0uPdqed8x}!$qz=g+3C!#*Nsz5OH^Jrn=>~$ zo9J_~3Vum1RRsCd0zJ|L$HYsN*5bZS&mQb;)wjii#dXuH*k;UZ3uy#CNWRSvaymcO zG#}pc1M*GWkP++_1ArahFIhAO4@pGhm@<(*zk<$kaqfKRw3=Oo9Op(!y3(hjFO^(4 z++epA8`bKU7eXj@&9rT~Ra4Brb#v`rMPo#S?i;7bgg@PSDq~#B8scmbJWs$6E);=Q?p#uwZTrM8 z5=oib5c_TR!Q4iXjAGA(QmbhJIXIulwEfx8zoGo8^@+I#rX;V;%*>sWp31U^sIZ2s z<}6eYm|ibTO=Zl*8@=qH#^T(c(=b!yyOVC1zN`j_J*&V%X+*`D_-p!nQ1xdAK%mr6 zcF;lBHN-Bvh8_W?Lffuyn!2YuFj`-I4Drt6VZg~|vQjfcF?ajt`D3zHrQD*&00eH) z1nun6cv8Qtp0~8|!jyG_G8CM%prX>fn?MMAecjiC*xPh0Kbd`uK&LgoFqhJofvsQ6 z8TATGXBn#;s24?jFH^kv{+^i;_T}Hw3fH5N-$ApKr6D2(FAsJ;J?mpOlxiGY-%f!q zC=stJseR-7gsSNm@{WwwkByHh5i^m|j|r~r=)bs~Fk52Hev0^O397QkT(u&P>h5tj z7x4q1po@p^zpkDF?Sj;>!`#aDXpONoPOS4I$@<=HvV?>0^|aFY}RSx^CL1YVlRPm?27o zweYg6Szf`99Pvh5b*1mw0)Go>pGSQl|NE7Y>RKf-f! zbkAQWJwAu2g7p3J!WIC$lkEOouV%i5W(LTqFp0|Re`Qatl-T=d5HfdNY8o8Sgt$d{ z9m>9BoI9YVcVzGSVnvi6iF&hy2y`EnMy&AcEa@rs*Z@2m1UB1%<}KW}wndotKtfTm zhu0NYU^B0rmwE97v8ojq=%h9rM&=h#}oA zVUc~w)n|OmAVDa#<^63{TryHI?+OhJ5+nw*(wQA&I630x#BNjE>gn!A$eUr;K~p$K z`nqYb_JNz2NzmN{FIk&gh)NG<|DZ=j!yPCl0Lc9d8lNBi3JQX?O%S9!MZVhGj29qk zui1{ID+bWV7H@A9IpVkFWu?XE7A*Uw23g=u-xYq`;d%$GyhwIw-}il1Q`-5jbjW?NOE+4KcAc z9JHj2Xwo>1Kea`W;HzAcEWR<)g@9>s-l$O=AWtqCy}~-6ZsIzNqACpx#*x+KCHQ`& zn2#yzv@RP{DB;I_A6y)j7qeJ?bm6A@(kSMF$L$#xiH_t*& zl0x}1pn0yKU&(w8K-7}VL>?Or&2t|X|FFuh{GX}45vn*ojg`k9@}b|FaY0RGQJjJk z=aB_gWn}}`9FmdAyoF@GaejWUkt&k`t+P`3TQ-9?vjpm*oc|hV{(oGvsUWBFNmVg|y?;a_U z#o#)FxTLs`=6dh{u=-MLXYg70Kd|ng^ZX~TAiYYuOIVD$iRq;w3NH|rq8clQ>pC_p z4+T?Hb?f^a{zPhpqT%CazmMSuzBI;=<&U!vUqC|W*p*$kC_}T! zYODmuXc1YY82?zfZ*bjKQc2HMR(sE&1y-?A(YWT#tBP~@(rKmzI34);JrPr{y-8~Drsuc|$6vAxLQmP{PTw&UNG2a89lL=e;pbQNd zPi?xF+A=2q#l*+xH7Sa!;&PFSlV80CN#W(@NO3mSwdH<d!$V3Yhw^0fYQav@IH+efg+ zusEvfcX2d2LVwGeRT<4a$}Nhl2cRP#8A<)sX>soDu$D4)Yd-hKYlAenG3egZEq2k} z%Q~nA&(Q=P=~QtEMrMXzL3fQ2BQ--b?qaZkZ9fj>Y=JuOy1tKd>R%7`@>JEHyN1ew zUAEmo$!_#qF&3&N{xQ9WS0LA!I+k%8mh6mm4dwe2^%c4&f@Yim*>5xI*mAtc zirm6s-Ro+4$fRprei*O?>Z}r18s}sNnX!(!mdeXyf|@bC;RTD=b$VI=BeH}7YzojD z09(2vh{y)bah%_A9DKo$%_R>z7-%z_3SaTjTJN1YiI$tvdK>l+Sq!zkQ5~ki1r|JS zO;PH3GZdA&wIv|6~EaG|CIB^JL~J`q&-8YJO{ux95^7@fKwe@PW{N+(ieU7%&U1DZW- z&J5;nbB$%$bCdV)ibPl|a0tnGCZQI7jvHg)PW zmvAp;%^z@ftUc7D-BbY6{NK2{#M;aREqnxAu})D`c6OBvca`(C_T!_)h&ya@ zWuEvi#}5?CK7gzjvv&HER)q8PkGn^IAI%Czj#E+`NnpC{vb;vR3Ii0JgeEa8u>3zU zL(z~|$OqlxP^aKKYX#ZWd=FB`Rt?Q}4<7Npyzac}l{)dJ%1K<$sd}9P_1*p-3#qiH z!18uDF=A`|KyawSoEn;M>Yn4dd1c)1qw^m#SWnuyr4y$rZh&S*V5&ec+~)pQle+ca z>^`Nn*5+p8U7yQ|N=wjdoIq&cP&;t36q>(=)mEXOeGu=I%>wt;w&ONTG4FX9ldacS z`4RJnPFm}>(fi!D!y;EC+9t8F@<8iT&5a6&E%5z2%)|qyQ;F*E%_-vcOVzUdN2N=` z`O`Tpd%IG^s|fg=yk?4u*DxvPBZVNXUqiCBubLQ(h7<8N2Pf%khzti6-_)#~JZ%fw z*7c&NxdrCmv#OA}I#Ufmk1T1iuMo0w=T+T(kUPm|cY|~4Ay{umlHIhOm~T5_RZJ^Z zR80wF-ehE_0#jCwo16CfzZT>9MSN;Pd@0X=N=CoEvWi?o(RbL4iMMR7aWNJTCvqz0 zH;Il1QLnuoyq+2gTYwUn7*wbFT{^O~Qp^v)O_zD$f&ddU<2~@{FnOoDbqc!2N<`Qs znZ_3nz7f~SKb;!SVWkadZT_i|`JtwKUgz6ChESR}{*PU|@AJtxoO`ZS`ugu%V6XmO z1_WAWnYaAD@h^+XYqpKS2K^|iou%-8w7izD^ z8Kx|WUE-1(@|FH1J5>j7-aKStX7FV>nR^#GjkU4k&yY3qd81|dXqn;|m70+Jk6nVx z7Z1OYkZAj4TB@;i-@+maDC8`@Vn-KMJFa!R>Kgg^y6qBH|7ca$ht%|Z7JY4e-JBco1P zjB-B=W-4dK+Wvv`bl>@Ok2evndrA=upeiqHfV<2Te=`k{#0Qxk@ufoNF;#kP@7>;+ z@*AVUQMN%hhfY$zdgDJW_nM3!I9iB5J3Y;p*zv?0mrA}-2}|M0IHz1}2>iV>?@&>S z!x8X%rW}3LZ`-B^Vs1)Z7kyv;;zdBKadM8w40Z+6L^52lMDU%IrvxFtDa?=-7XB^U zOKdzZJ#$iM9W8-UDs@+WJZ>E89EZdu&k8dpwFI#55=jM6V`6^1}aMNi)om?k#tGV#qOw4?s+z#(v%6#}EDxUz3 z)+f1E;-HC`xnu_9&r8m=yy@s{q$}}4;urg+$S8Q(!Jx`)s*2N^vzd4{cYE&UFLzbr zTW0q>3Ww(%F4nCY<@0@bE7zB)AigVk<&e!}YtGM!o8)89K(zNwDpxe~_xy>fS?;}L z@Ef~eAT{Id;XzMJghHKI;qz>V4{J6RVw?O#KU@C-coNV9wTH$Yt4}}b-XFhwKs;N% zSybL7Qat!LSkU-Wq!YkJn-_*A$o{wEZCr*EPHM=Lx z9+TzDDOgtZ?jL_DYQ6EbEJSGim#N+w#e{4i4`RCXL09-Er!Rc-8(&9pjX-AuWI460 z5N#J>^%};EnOUH4SR@$`AdjfnGX9$fU5-QD?i=tseR`bUipcJXGq|Q zi^_7sG^KP5J2tv5!CBD{M;B*nXE!2UsJNuqd;wp7HTjpyKGqa<`hnNcCuiRk;vG?& zAadUjSAK>wMtf+tbTf_%|EiS`%+(WOHHw!Y+W&Q8u_+!b{&8a#@=e<=LmkziylB#E zFf#?Tb>tWCC9)AL&Bm!lLs-%Pqh3*eXTL$VSqa>NcaLVBe4^!852zZ zb+<(C8{a}WKN->PIb+ZWPId)lkS^tS(JcC6Za|o?Q5LKhoo)gtK846 zb*gjsnoaeM5wY}uaox;V%yw7qybz_fWeT|(t@}wXQ-@oO70$K#siA4vJiV+!I96dr zq^Db&y5%{Jg`4opZgXW`oz)`E2YwRD8+cTVOKD2}*#Ik4W4+|Ces_XRxl~fTqb7gC z`d!M@vFHR7`MBmv-*=jFBcbu{C#lysSM4t)RvGM58sLv|2LN25W`W496nq%ldLQ(+lZgqK-=h z9s@mWh3X5^ZuQ9cKoEI6svCkkuF#(({2sUl@u4><4%6cz}bJ_QvSR(sL}lQnd!ia{phsJcK#dCo<}N|-^9zMYjSXiK_GviO1{qv$d3yIrXC ztck0V%3n6ROwhxY%zuufQS{%0=(H#qlXyRVN&KC7-+NZ!WjC{vdCZbq%%$S@U zy0$3E^X-=wkPcXHLA7oRn%}dqZ|Ei9Uje$yAv-dD1lXdAAN&qZ6!tG`c6Q-J*tlj~ zSkAsT9lvBzHePv41KTqC@oGn!%42=)mSFwa&}@W|SOdw9kF%I~isjd#yQ((_l`CqT zoZ+k zn%DrjnVZ!^jM+Lifq~D24xcnx)0pJ)JXG$XvG?iz$L4nRJZ9wMkSMiX|InxYqM7Pc zYST@3gTttA`7WcpwkJ7gS-wy`t-aKvZ^fG?tZ%q~v-3+zCH28TDt|^>=JQ@%z1gm3 zFHH@jewuZo{By?|-tJ37?{xgggpM89bY7yL6ncWS`hJN{t69Lxc@CpP*&B`nV4=P8 zY-rO%ds?vHgg{dB0R1;<#6(0tpnNv|H^&202 z$b#M*h=eiB+fU<9LglS&V7`3PrxFv|snl3rvzy`}s@np#aeAFn9p!(c^L1B;|6Ep! z|AD_r0}W`+>0fJtFHu2r&R2g=f1p)mNMESygrqYi;nHbE88! za-Ol?A}um~?D;NI;#5eVRZos9WJc=7QIOv36G7dzxew($&CjeGrNNG{-d(S&#r9vW zeO;u+sd<@Jc*pxaif0BEf zRHma6M$fj-SP@U{YniPc@0FpY^qCR!{>z&@)!(}|arEU$KgVn38$2W;&Y!k?(6)<-IREhQD|rogJVTUV;`e%={ithgtT zQR%3=q29$r{AQ-eHf9$?0dWG1}`+aiLXnnH+BCu!u4sem_R^Y6%Dr& z)ly~Q#zL=lqrNHXSn@}GBp1!V72Hy+TRsF zI*JXa|FLZ%1*F;Yv3r1ZEytP(=`~O_l{c8v0xK2MMuK=$6hAO9x$H9EGZHfGVF4zS zt7r;6pw9gcau&Y7llNsxhD9!BzV3-$aNQ%^>3^%?X3x+@(zMqt7FCJ2)EzF!(V>W( zqK-WZ#p>;NKJZW>0=)ZOOJqN8n^oV_M~eTZhQdoDglzPF$p+LcgKf{6;Lk`6LGk>d zEZBfnI9b23vQinT-X6KmCqeJZgbdb5+07QGm(W}q%C{80AZvG;>7$g_aA)cixE@$j0LT6p;;|94Kmfg zE@nWHl0hz`k~){uQND5`j(U6%rcG&n;^{m)&CrmCq^!6P4zEqS?xMZo{0V_1dY2g; zdIbTbkCzK*iR;a_Cj6r4<|&3_ar9Mv1IL@{g1T5S(}H!9+N=NTlimy|eKs%R6jai; z^m)gt&id{5|3scUXohZXZVy^fy-!>j4Fhh+&@V3guYC)wtkQAiM+eq6tpU6@<8>x4u z@h8VSl_w+GbQ%t8eGHBP7W19kR04E(OXz7yogRQ`UKK2Q5)qYka_X$N?zla>IoK~D zSnAI8>IZ>DM8R{ISHmyG;F4iadkg5R9Q5|cI=wN^4r67gZ+@mo#jDbu!ueT#o=9H) zCz>z-OXckyhSS~Es3~Cjl&KKO)+{8G=%NbN$hFdpj-K#%9?wb9jg{Pql9bUBqT|_( zHt7q0wI|Vgjx{~`9KwjKif!6&P$?)R8_7V5)1No`zq%3htYFzRuI#~InSLGv3C%Sb zb55SGkk4iyjoP$8%(UM*UAOA@*jDwi$R_CPPPCe4+BuwChc>TBaagc?wHY zz2n=>`zY!ly<~Q8GW#nbyzC3oR_~)oAjjN0Kvg7A#~x=qfpGz&V7bf{5qP-rpJra9m4Mmc?CJI`6E#0${&1v1Rj;*fUU{#ogf=m%3{F{s z5eh*$=gb;EWHm>bzI4;F>z#76unr$PvfSMm|hULpp-R8b24!nj!2*I{m0+UF62Yyf80CNf`z#02RFRjAC zdmm>+?jv?i{2rrLGrLNqK@xq-BEJRomeJUqS&`4EGUwg9r-07%U|6ckNzyBR^TmOc z5{OYk(=RCpXmF`WN_bwuz;_{WX>m3NhI(MH{Ax&qFi9o0!t#Ce+r3F`T!%`DVrJSY z=5*+27GwSTvVF;RtI(v7Zy(GzK2I;KPc($jDo3^*sD~;7{o?7s>g3G4=ODzXv7Q)6Pug zjQ+~pOr*G$9i#qiSD7*trnBA)Oa>1v7MBT9wxUaY%9Nj%DLfw)t#qpC0gm}7cK#}R zBU#&IUP3-_srGR&!=G;^QzZlAg~rjkDE%P&D!fFq7}+g!S8u))CM{l7Oe>uJHzF30 z?uUy}zT?-0y=NQRNcZ@pX?F&Nu4jM2r}|Z=E?NJv>2rW$Vf`T|4|d9^Z&y0X>otab zm6nj8iv3-<`S8AB!#s_<=?tKHC^NrqCR|~aPM$9OK69yh&}#fD{6V9J@yt+A#OoVD zc8&5E{~5@wiRnCFb{Hh=1)8F&1Vl;yBy2rBJA(WrM<>c;G&X43CIx=EPtkPiv3{%v+AcBJ@qk6i494G@I281kJaJS)Y~#x5Hu?-i3T zKo_e($hqadml#zI!KC6AUv09N+B&!HL^&R&Jk|RHW%Aui&RiqVu%ci|B9i>uEkj9!nEvrIDU*G*9Ph+M|me;d2HGr~i%sx0H^cfO_6a z%EKrwGhpil5dexE5d4$N2AV{D0~e=F#DOJiZbReGxkGexakM~Fk^2296g?M_Ws5nj zppS1cFK0`ZR}n5v>-s-O@wnTu`8eO{7>;Bp;H0;5+^nOc81sIR`@kAGp*QVd5cllG zSr$_9p|YM_M8EAlgaKl{AmAKuMt9i$z9#;vz^*U%KmcR+Ch9QEq5JfuU2f7Zg&?|8 zpRi18ycHdKL@l=UXxru;Jhw zr{Qp^AGzjwlMD^9fP3z8G!>BL@97@q6%#k_+=LBa?x>(Mb8LosUt=O9fcgtO6h+?u zX%`Par(FL71GIOj_8s*MB-^`ToaQDrvT?g+I{}I8=wMLPDfz{4N@KCuin)`Zo?3>| z7)8=5kN=cUt*SB3M?J~QT{vMh2EdKo5r`|#^tF;*XBpM=jNBz+&!xr@@y>quSZ?5N@hJ7}i zCgX_zQq7%(qNDlvCgZHUj24=JE&7(pcfD2K>egga$s@7g1KtdeLc--6(YK!|qo>bA zGp&{v>)U|45EpfgL2k@r#q(LQVRQ?}&RK%jsq~w&<$hC^QJmQ%v3!LugjQ5BR zu5qzd+AG_cJY;|no)6E|c1(U%P;sCP=kyCjlG67me;;+10yAmSipg|kt>JEUTVL}& zqCHvBp>eD)lRqV-m{(2u=>S!9A@@W~T6Y%mGkZkAjs7s`>}Kh&`lHULFxY`?(&`<= zEODx4vH2@dfE)Op(R06FFZyvY0{HRNhpvyAts|!eg;alJEKb!VtE@I%yp8Tr$Ko58 z7wle(g;(8I>`Veld7=RI8_mL^{i3eS5YKY>uKfYI*M2MfvfnI?9VlFV2(~ zP6r?$RL%nap`7_BkHMoSzXI_Z#U0m@sZ1dsvEZ(4h*Ps3iSJq-Y@OZ9gDQ3|{Ut5I zjrllFKQ0=Ej|?wR5D{;H1F*vVrhN_f8#_Ttq==MzyRL`fB*Ehb$aP;#{EaS#fK+L# zGy|~n|Rg0 zp$;dlihBi|vLLg{yFevpcg-!nZhm9TIE{{Bo|(6AFQk1#uh{9>)2&QoVUnh&^Z0hq zMt);i(O_b&=JZ+rGi?AfVGGs7$($E?`q@Y}Z|CMQ2EQ+(?o{Zv<&R6uJ{|@&ztQ;2 zJC-bE#g$cM82{)B>&MbbcOcO_Wr)_2ih(wMefe8wu=6VyAd_%{MFBhflaIe^r{jTn zcQwi{7WtToiCOh+X3F@(m(JvPO;^yy$@>iKhL&9-XB`X`#rp)uGkqPjR{Z!LjC`lhOPTX zaiz<>5*=V}PZ!0d>dvh(8h=A3TYSItUETT)J%-;GYDUrk01_2PzQc>XsKEGqdOO*d4s}p zWlr$z{Hvz@5mg>m&H)Gio^Bf6yo#c$|0YDrK14?B{o49j?pHragPVlLgf#ROnn#BQ zz}03UAN@IiefAAd-_}Xc%wj2zKfB9qQB3J$`IZA(5lM6;#9!k45f7`P%daaPl^~9{ zJ}kV6hWEk=seBpHnC!Ra?aqxg%R|ES-yC1Pr@(dLSF2ki&dpri8~b_~L)m{pD`2*@ zdCvCx^|^nyOd)aA5>oZEW0Jx{<+Fp&G8@9O)-}H?$eEYfx4)-`op}Ri&6vk-v?HaF z&goYg(S8SLvn8?FE3J3W`w^0QVdY&Rl25TmTPOY8{rNlcq|^GZU=Z~99jttu&nFyb z{hXcCEz6;?L1?ExX0pIWB=;8LMEAXQEJC79S&*f&=mq_|?9kTt3+Fy@tL2+ZzWvRn zEmzAmx-LnALE3ZZ`CX{2zR2PO<@^$F7Na38)NB`zgr-~VB`beVQfIve6maDx!X$dJ zV;c9!fmx-h$PO5cIO~T0CE%AbejJTsS7}}{Rg|53gu}`dS2k#g5dS`6+Iw|hKj22y z9=ih#g!7+KfeDSnAphh);`B!5!f9{pvIJV+5;to2cg1via)Fzw=KWa5xj|6j{P0q; zx{&u-tlmKCtkiExhz4*#DYM?CGky7!M6&l>fl1m3XyP${ujEUKL|>@qa?$}qp1@&(6vrU_Emsx>XZ zpt(e2Zj5yKc$z6=MFatkQfT5x7%^hN z#QU(it^yA;k1E0GqHF33m_ZZJX+c>A6^+~=Fzo}sexBaQTAwFR#vL|O{UGle-6_8; zwvK{!Zl zk={XggqJiNA#{5GVq;@~|5OR(saxiFDh(zUoeASZvWbbb<625$3|EII_dR4ZCxk~GM+&$_sTFGmoc9SpIXz zN;35ubmedKH*cFG#$qXPHr-#!$(#Q(_{_mL{gS{KFDWsBx7xl=NP+d;V^&HkbaZp^ z^Xk>cPN}2t%)EiYpg^}igqXMSQ`W-A96xh16?w-?Ba14K`_|u$T+xwj1YTFmzfW3sdJvi{_5%cQ@j(RoA!2 zC~_sL$&if^_j50g7B*Yq;E~mF(0hT1+Mo3H=zD`dlO9|Rp!F)x6NF9avA>EFH<>l~ z=)fN5hG=MB?u{+gYrc`HHv<0C0roJg$|pcBkJ9}H8j}MCmYf0TFMA2&^G+{_?NA zq3PN&ZSVN zOPGlKODL^FryG)U_KU{EtArVazmRG`pr?pWdKdJV06n09z~J}jmvkW4eUluRZ>($$ z%CG$q^7GErlijps&)uQO=h+&0OLJ$SR+KDD$&JXKn@pWxlD|{%W+U%}Q z51V3VDj4`O|I%4|K8A(&qK8Nc{wSLqZ&I1ji#g!88y>~=;#a%>Ukzs-57qnr;gKzC zi|j_FNRoXWN|q=ZB@~f8NlYWg5+6xO2`RfMWEY0AW|=`~ChJ(Uk0ngjY!Sa(-`DT& zamJZ*&U2pUx$oQD$O@-hrIx@RB8U?nt@(ETSJP)5<7LF>pq3?AqDSu}Cn+WO;ImknwhuXy= zC?u!`pmhsJ`){o;0M)rTcP0dJOd$fIbi?M+#rdu;~{;8Z{moM`D2rc^clMo;8J`JrcD^1!Ms|SY+untiH0pr4V~gZ z?gBEqBM4H0`DdZWi%%vu+TGoDdOJ*7z`K)}AMaKn)RZ-0DU``ZszHuBp6KdDuU@&t zqV56XK8w>>33Q6HT)XfPi@;X;fnVUx@h5)zo?6H(Dj0;BUi!sgGn~iFE~m|Q1K3}a z#$chR?iU3d5ewTptP5?=R>5>NHg#6TT#m`KvHRk5ejg>>pz-95^xz@bvlUE}at5{# zK4>9h(s|{&Ush&GCH>knn-5Dxb1uhy>grtik#V6WL^VP1y>{}G3(%zxMd|b_-s%Gy zTvyWC+a+Aaf0B(w%K~JW%uPiYgd$3p-BTnExVfA;u zT`0B)n`cj|Qog^+lomimpwPTtO}B;8IgJ@ZLJoKeRg7g|M&|5i7)=lZm5*IeY0aRzWyNEGwjlhsRinGxYAgN|?B z+XWtsT&uT9(ccuTtrc;DDmUoEXvGa*;&bg&K2UMY!j}$M7z%LN{f&SSo9{6oY3V)_?CF}X)x6^Z7pU!87 zeFl>kxK_EnK!mvD53S5aDX7SC&JRgzYmbf>HcIQ%n!&i=x7S4w*I`)$?C~TnVkWxO zCN0x-MQldtw#!6X0*7sj;?h+?l!9?wSLxurdt+*>G z0(ON*fvD3&I-oM7;y9P337XkzJmF&=`vNK2NTcCg>J?qy~{&Ft% zP0T|M_hOI4tQ*yiS>@q{j3m8X%?6GlrC-)nVW_Lme=Y1HE1uBia^3Od6!14H30b9$ za{7B>V9;j?!J|{ zUX0`^=!PJfe1f8++|5t{Ya-MLD2b{(6}0)t8~eCc_s$*@3WWsRtdJ`7FKP%HrFaaN}%)&Fbphv{F%d~|G2&brK!zhaI zc7j6tU9MP{IqxWlL!sl%MCQG4UiFqd`vN>_;K>oAXQd)wLk+G6O_Fsx*z~h?XhHk`8+ul6> z%=TqC4BqVxCYt%@wn^@-=e71Zv*-g2w(W?0@nJ>M4Wl}gSErQDw`VkV+`D^^k z`USRzkUU|Soaz8~KSfEwzxYl*_&yh1pZJ!WrAz{~Cu+iPYv<>@cF4GJ^`ltVLwY|7 z+a#UmSF;G1WC6ii-eSusi6$@UvQ1wH!uaqB@_FgHcl0XYrMn0TGW(vln$g&V68#lZ zB5@$%M3p44+e8j5Gi>q2<%w@!Sw+<+1!NMY75PcRBY7zK?qT<6ep^Eo8ZJ&iL;pL|WcA%E%yhx_K6gVyx<0VSYz7*_&S@cmd3Oohx;Sd1$C4Q9KD8cHkG?h95=>{?yYF(;`R_h1jS7CD4uq2;l z;!lzWLK(^Y*nW0np_6IT<%KxGO8UZFbG)C*%@?mvkXb-R&geaZ=P#!lZtK;MRZ_OK z#oLp3yaqqt<&k(>_V)S1`|)oSZ>cEjPbfW5q6hW}R9vWZz!D|@<=!>h^lrxA`Egk) zR$lEVQ(v|-J}B3?_zlvBcf=A-gbr43*X`mGDlOk@fG%&kr@99hVTY)Ki@gX8VzG+i zqn{7IRYSeZI_3Jc*iJZh)o;_o`#dg!RfQGc(y*_bOFk%Fy^g z&z$aWf&3jt?~fSaKPQ%;L{zJwV5x%)!HWO`3Yy9YesYIdDt6_ds8dg>S(@Shel5aG zGdW#i5Rvrdpmhe=OT(Q;lVH_Le1+tLlB*w-;IGiUyQp(v%~J$CzIvL<4Q(9=!kHwr z7nM&_eLzgXjm*FtCl3>14CJ!96 zE>#cuCl@=ttqZUEqD207+04xTXZbK?34x2veewTNu>NQ1_ziRi?b>v9Irt6-zOtlH zi7nr>%*s34@%@wzxNmoi0wEG+2V6d={^XR_;WDiXk=ClJGfaI#r@W8PFIU{u)ix{d z#^ay2U6-=_hibPOO^ee@#lQLOw^`p<=H+nretNL<^?#ul`C!>aqn_!TR53g{9=#x{ zwqLqIR=a83l;j4PAQvrde{M|c4L3ekhkY&F#vD?6kyG^(4KEjU_Pr<=ZkXSGy|i7r z((z#NO})avzPKdRn(_2Cjt2rZ=J(kKoo1Is?xsBY4p*?_P+?7#?Oh_HJ7h3yL0VI` zyZBF&M}lgF&x=ws1Xsb&zLI=V6MFD`uuutQo05d$kzb;(!PInspiKjt+gsHBypX;6 zhz~cC)bzi%fq34)>T9GHkZd@!tVH6P1vcb z3EQ@659mJFTQG#prZGf9fD+`-0CDmYR{8>{o&*#$#1}R}x&-N;74&~iF7n z;$>UI%*GX)x1&je?3(}0gsa?CQ|j5b%zNfSw9Q;-Q&TMji%lUq6~6~9bV&~WGhp_| z9tB{wX$oV(0J$g*S6!73Snj36Y+#!R!kFPJX4`z=nfVX&Ak|ygX|mtCTbz#jPB;(-@to@%3u$BPUvu6XSS1<-%G#n8)$c{$svif zXsCHqqIm_o1e5v@d+|1HdV-^wt)dUb^%skHn-yWBZ98jdw&6X{wt8z;lJCh+IajX=I&aZCXR zt!zT3;w)3vgH--iEvu52*G1TSsOm}(<~0fnRvLecde(73P|DI_+$#xcV8WrjaI3F| z{w3K#T!`TphrfXCPGDQ&!M&G|QP|s(F7y?PD{WnTjp9lYv~G(*LSPUK!A`dcR~EmJ z{6~gs?}+IPTU4EtO?9Tx?<#~Rk0=Gt-LzubwJmO>aDD0H(b-X7$&#kWsjBd=XH}LDTVQ4~GW`#o`^luj z&^$BvZ$xW<*EL)A#cMpY`~_!La9JQ|BB4&iK$5qofVQsMr*9Q^NI zy#Es%y}5%swQsp|BIcfUIJbK6t*b_XLskK8OBrpOa5D0?n(i*!q5*>0B{E;5aqS#M zO>7mXTv8xc3V_Sw7lzr}`0UMR6~Lk9G-9qrBi~DnGZgyUsO~sH+mQ~yns_-*<=cZk z4(z~yec*)SCZM!{o4BpMyT-R8ZLCq<+Q4V89TmQR-yp!ckl}(O7#HgRaxIS=yqx^> z?=Ec!9eQL2*|a2W%c&*Ecbq7s!(sIE8=HVgLqPW1`@Nbk zE(OnA>zO*g_

9VeEJ44IQh~FID*)x7{n!TROSVy+$4y;wi&%ybjH$+A2b^8ao3+1gMA{J*9E%QTYH_ao2;Rv$yioriO7%^#N2hoVw%?YA$` zW$CqKj#{0GrtPy3Ro#932hcU8!X!`KE~FoIWd$i)6|e0u)7*pakUc8UHU^v zg7{Q%?171QhAk1#`(IxDLmJH6JIH-SV~00a?dPCOTdzQn;>aQE%=!!;hs7fVCL$bqcR+j#TolYMF`7bkw@2g%+HFfbzK&dC&i zHi>8CrS$dYuh3x`;<3qk4mxKuLsq(?hK+auor_K=uE~CsDu^K(aL9MRTF8@}>rx-z%o-YX4!}lP^2eVS;3Tk+BB6Dx|q=naPigivA<{?)5m%D7s2h=WFgr zt!2&N(}Fw{m0!NJT<>iQuB-`i7X>RX@0s=`_Otmzy{A^;*%`UL0SG26ra= z#j?h&I%~`6S6a9B`CBjHW&B*L=#ig;S zq|qFiJ0u20L&Z5ug#Rci?Bz2GR#u*@`#jdQd2#Qv%{!TXkzL;_tDR}@=hR=H$*b#@ znR1NAj^OxC^KfUX^t!s~2?kGa@YKg^+^4+`Qz>NQTgmX1KaIRk$~Y5jmX2osBdC&#U}A0^oJ?&`?gB5cH2&m*cXrY6Ni56 zwymvcJWCju*q!gU75G!;{@Z^cNH%h-c3rIDR2@~kBS>6s{|EyDvAdgh?#sk!smgQ+ Pp+#K2XsA=5WfS;+NDw)Y literal 0 HcmV?d00001 From 8f670b159d535a8b7ceefbaa71602ad77083751e Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 15 May 2018 20:26:19 -0400 Subject: [PATCH 12/20] Replaces ICurrencies with Currencies use. --- .../batm/server/extensions/Currencies.java | 1 + .../extra/digibyte/DigiByteExtension.java | 12 ++++----- .../digibyte/sources/FixPriceRateSource.java | 27 ++++++++++--------- .../sources/livecoin/LiveCoinRateSource.java | 24 +++++++++-------- .../wallets/digibyted/DigiByteRPCWallet.java | 10 ++++--- 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/Currencies.java b/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/Currencies.java index 22ea896..9c2111c 100644 --- a/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/Currencies.java +++ b/server_extensions_api/src/main/java/com/generalbytes/batm/server/extensions/Currencies.java @@ -75,6 +75,7 @@ public class Currencies { crypto.add(VIA); crypto.add(DEX); crypto.add(DASH); + crypto.add(DGB); crypto.add(DOGE); crypto.add(FLASH); crypto.add(MAX); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java index 8e6a52e..bc20129 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/DigiByteExtension.java @@ -17,8 +17,8 @@ ************************************************************************************/ package com.generalbytes.batm.server.extensions.extra.digibyte; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; -import com.generalbytes.batm.server.extensions.ICurrencies; import com.generalbytes.batm.server.extensions.IExchange; import com.generalbytes.batm.server.extensions.IExtension; import com.generalbytes.batm.server.extensions.IPaperWalletGenerator; @@ -29,6 +29,7 @@ import com.generalbytes.batm.server.extensions.extra.digibyte.sources.FixPriceRa import com.generalbytes.batm.server.extensions.extra.digibyte.sources.livecoin.LiveCoinRateSource; import com.generalbytes.batm.server.extensions.extra.digibyte.wallets.digibyted.DigiByteRPCWallet; import com.generalbytes.batm.server.extensions.watchlist.IWatchList; + import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; @@ -77,14 +78,13 @@ public class DigiByteExtension implements IExtension { return new DigiByteRPCWallet(rpcURL, accountName); } } - } return null; } @Override public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { - if (ICurrencies.DGB.equalsIgnoreCase(cryptoCurrency)) { + if (Currencies.DGB.equalsIgnoreCase(cryptoCurrency)) { return new DigiByteAddressValidator(); } return null; @@ -108,13 +108,13 @@ public class DigiByteExtension implements IExtension { } catch (Throwable e) { } } - String preferedFiatCurrency = ICurrencies.USD; + String preferedFiatCurrency = Currencies.USD; if (st.hasMoreTokens()) { preferedFiatCurrency = st.nextToken().toUpperCase(); } return new FixPriceRateSource(rate, preferedFiatCurrency); } else if ("livecoin".equalsIgnoreCase(exchangeType)) { - String preferedFiatCurrency = ICurrencies.USD; + String preferedFiatCurrency = Currencies.USD; if (st.hasMoreTokens()) { preferedFiatCurrency = st.nextToken().toUpperCase(); } @@ -127,7 +127,7 @@ public class DigiByteExtension implements IExtension { @Override public Set getSupportedCryptoCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.DGB); + result.add(Currencies.DGB); return result; } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java index 4d16518..805baad 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/FixPriceRateSource.java @@ -1,7 +1,8 @@ package com.generalbytes.batm.server.extensions.extra.digibyte.sources; -import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IRateSource; + import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; @@ -13,31 +14,31 @@ public class FixPriceRateSource implements IRateSource { private BigDecimal rate = BigDecimal.ZERO; - private String preferedFiatCurrency = ICurrencies.USD; + private String preferedFiatCurrency = Currencies.USD; public FixPriceRateSource(BigDecimal rate, String preferedFiatCurrency) { this.rate = rate; - if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferedFiatCurrency = ICurrencies.EUR; + if (Currencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = Currencies.EUR; } - if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferedFiatCurrency = ICurrencies.USD; + if (Currencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = Currencies.USD; } - if (ICurrencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferedFiatCurrency = ICurrencies.CAD; + if (Currencies.CAD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = Currencies.CAD; } } @Override public Set getCryptoCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.DGB); + result.add(Currencies.DGB); return result; } @Override public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { - if (ICurrencies.DGB.equalsIgnoreCase(cryptoCurrency)) { + if (Currencies.DGB.equalsIgnoreCase(cryptoCurrency)) { return rate; } return null; @@ -46,9 +47,9 @@ public class FixPriceRateSource implements IRateSource { @Override public Set getFiatCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.CAD); - result.add(ICurrencies.USD); - result.add(ICurrencies.EUR); + result.add(Currencies.CAD); + result.add(Currencies.USD); + result.add(Currencies.EUR); return result; } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java index ec5b393..96a79c3 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/sources/livecoin/LiveCoinRateSource.java @@ -1,24 +1,26 @@ package com.generalbytes.batm.server.extensions.extra.digibyte.sources.livecoin; -import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IRateSource; + import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; + import si.mazi.rescu.RestProxyFactory; public class LiveCoinRateSource implements IRateSource { private ILiveCoinAPI api; - private String preferredFiatCurrency = ICurrencies.USD; + private String preferredFiatCurrency = Currencies.USD; public LiveCoinRateSource(String preferedFiatCurrency) { - if (ICurrencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferredFiatCurrency = ICurrencies.EUR; + if (Currencies.EUR.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = Currencies.EUR; } - if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferredFiatCurrency = ICurrencies.USD; + if (Currencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferredFiatCurrency = Currencies.USD; } api = RestProxyFactory.createProxy(ILiveCoinAPI.class, "https://api.livecoin.net"); } @@ -27,15 +29,15 @@ public class LiveCoinRateSource implements IRateSource { @Override public Set getCryptoCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.DGB); + result.add(Currencies.DGB); return result; } @Override public Set getFiatCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.USD); - result.add(ICurrencies.EUR); + result.add(Currencies.USD); + result.add(Currencies.EUR); return result; } @@ -45,10 +47,10 @@ public class LiveCoinRateSource implements IRateSource { return null; } //Grab the last dgb rate in btc - LiveCoinTicker dgbBtc = api.getTicker(ICurrencies.DGB + "/" + ICurrencies.BTC); + LiveCoinTicker dgbBtc = api.getTicker(Currencies.DGB + "/" + Currencies.BTC); //Grab the last btc rate in the selected fiat currency - LiveCoinTicker btcFiat = api.getTicker(ICurrencies.BTC + "/" + fiatCurrency); + LiveCoinTicker btcFiat = api.getTicker(Currencies.BTC + "/" + fiatCurrency); BigDecimal lastDgbPriceInBtc = dgbBtc.getLast(); BigDecimal lastBtcPriceInFiat = btcFiat.getLast(); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java index c7535e5..5d7246b 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/digibyte/wallets/digibyted/DigiByteRPCWallet.java @@ -19,20 +19,22 @@ package com.generalbytes.batm.server.extensions.extra.digibyte.wallets.digibyted import com.azazar.bitcoin.jsonrpcclient.BitcoinException; import com.azazar.bitcoin.jsonrpcclient.BitcoinJSONRPCClient; -import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IWallet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.math.BigDecimal; import java.net.MalformedURLException; import java.util.HashSet; import java.util.List; import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class DigiByteRPCWallet implements IWallet { private static final Logger log = LoggerFactory.getLogger(DigiByteRPCWallet.class); - private static final String CRYPTO_CURRENCY = ICurrencies.DGB; + private static final String CRYPTO_CURRENCY = Currencies.DGB; public DigiByteRPCWallet(String rpcURL, String accountName) { this.rpcURL = rpcURL; From e4d5aa3c102053d675c04c05bff763c5f0ac4e96 Mon Sep 17 00:00:00 2001 From: Artur Kowalski Date: Wed, 16 May 2018 08:42:06 +0200 Subject: [PATCH 13/20] Fix imports. Add FuturocoinExtension to batm-extensions.xml --- .../extra/futurocoin/FuturocoinExtension.java | 9 +++------ .../sources/FixPriceRateSource.java | 14 +++++++------- .../futurocoin/sources/yobit/IYobitAPI.java | 1 - .../sources/yobit/YobitRateSource.java | 13 +++++++------ .../sources/yobit/dto/YobitResponse.java | 2 +- .../futurocoind/FuturocoinRPCWallet.java | 8 ++++++-- .../sources/MaxcoinTickerRateSource.java | 1 - .../src/main/resources/batm-extensions.xml | 19 +++++++++++++++++++ 8 files changed, 43 insertions(+), 24 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java index df9c5be..14cca7b 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/FuturocoinExtension.java @@ -28,9 +28,6 @@ import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; -//import com.generalbytes.batm.server.extensions.extra.dogecoin.sources.chainso.ChainSoRateSource; -//import com.generalbytes.batm.server.extensions.extra.dogecoin.wallets.blockio.BlockIOWallet; - public class FuturocoinExtension implements IExtension{ @Override public String getName() { @@ -77,7 +74,7 @@ public class FuturocoinExtension implements IExtension{ @Override public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { - if (ICurrencies.FTO.equalsIgnoreCase(cryptoCurrency)) { + if (Currencies.FTO.equalsIgnoreCase(cryptoCurrency)) { return new FuturocoinAddressValidator(); } return null; @@ -102,7 +99,7 @@ public class FuturocoinExtension implements IExtension{ } catch (Throwable e) { } } - String preferedFiatCurrency = ICurrencies.USD; + String preferedFiatCurrency = Currencies.USD; if (st.hasMoreTokens()) { preferedFiatCurrency = st.nextToken().toUpperCase(); } @@ -117,7 +114,7 @@ public class FuturocoinExtension implements IExtension{ @Override public Set getSupportedCryptoCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.FTO); + result.add(Currencies.FTO); return result; } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java index 849909f..ca1eac6 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/FixPriceRateSource.java @@ -1,6 +1,6 @@ package com.generalbytes.batm.server.extensions.extra.futurocoin.sources; -import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IRateSource; import java.math.BigDecimal; @@ -13,25 +13,25 @@ import java.util.Set; public class FixPriceRateSource implements IRateSource { private BigDecimal rate = BigDecimal.ZERO; - private String preferedFiatCurrency = ICurrencies.USD; + private String preferedFiatCurrency = Currencies.USD; public FixPriceRateSource(BigDecimal rate, String preferedFiatCurrency) { this.rate = rate; - if (ICurrencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { - this.preferedFiatCurrency = ICurrencies.USD; + if (Currencies.USD.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = Currencies.USD; } } @Override public Set getCryptoCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.FTO); + result.add(Currencies.FTO); return result; } @Override public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { - if (ICurrencies.FTO.equalsIgnoreCase(cryptoCurrency)) { + if (Currencies.FTO.equalsIgnoreCase(cryptoCurrency)) { return rate; } return null; @@ -40,7 +40,7 @@ public class FixPriceRateSource implements IRateSource { @Override public Set getFiatCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.USD); + result.add(Currencies.USD); return result; } @Override diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java index 731fcfd..f89f839 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/IYobitAPI.java @@ -1,6 +1,5 @@ package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit; -import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.Ticker; import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.YobitResponse; import javax.ws.rs.GET; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java index 31a2542..28fe9ac 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java @@ -1,15 +1,16 @@ package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit; -import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IRateSource; import com.generalbytes.batm.server.extensions.extra.bitcoin.sources.bity.IBity; -import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.Ticker; import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.YobitResponse; import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; +import si.mazi.rescu.RestProxyFactory; + public class YobitRateSource implements IRateSource { private IYobitAPI api; @@ -21,14 +22,14 @@ public class YobitRateSource implements IRateSource { @Override public Set getCryptoCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.FTO); + result.add(Currencies.FTO); return result; } @Override public Set getFiatCurrencies() { Set result = new HashSet(); - result.add(ICurrencies.USD); + result.add(Currencies.USD); return result; } @@ -39,11 +40,11 @@ public class YobitRateSource implements IRateSource { } YobitResponse response = api.getTicker(cryptoCurrency.toLowerCase(), fiatCurrency.toLowerCase()); - return response.getFot_usd().getLast(); + return response.getFto_usd().getLast(); } @Override public String getPreferredFiatCurrency() { - return ICurrencies.USD; + return Currencies.USD; } } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java index 642a8e3..8f2e2d7 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/dto/YobitResponse.java @@ -3,7 +3,7 @@ package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.d public class YobitResponse { private Ticker fot_usd; - public Ticker getFot_usd() { + public Ticker getFto_usd() { return fot_usd; } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java index 29b71c8..74f7927 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/wallets/futurocoind/FuturocoinRPCWallet.java @@ -2,8 +2,12 @@ package com.generalbytes.batm.server.extensions.extra.futurocoin.wallets.futuroc import com.azazar.bitcoin.jsonrpcclient.BitcoinException; import com.azazar.bitcoin.jsonrpcclient.BitcoinJSONRPCClient; -import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IWallet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.math.BigDecimal; import java.net.MalformedURLException; import java.util.HashSet; @@ -13,7 +17,7 @@ import java.util.Set; public class FuturocoinRPCWallet implements IWallet { private static final Logger log = LoggerFactory.getLogger(FuturocoinRPCWallet.class); - private static final String CRYPTO_CURRENCY = ICurrencies.FTO; + private static final String CRYPTO_CURRENCY = Currencies.FTO; public FuturocoinRPCWallet(String rpcURL, String accountName) { this.rpcURL = rpcURL; diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/maxcoin/sources/MaxcoinTickerRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/maxcoin/sources/MaxcoinTickerRateSource.java index 28d6070..7f0589a 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/maxcoin/sources/MaxcoinTickerRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/maxcoin/sources/MaxcoinTickerRateSource.java @@ -17,7 +17,6 @@ ************************************************************************************/ package com.generalbytes.batm.server.extensions.extra.maxcoin.sources; -import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IRateSource; import org.slf4j.Logger; diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index 7146710..8c5ee41 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -434,4 +434,23 @@ + + + + + + + + + FTO + + + FTO + + + + FTO + + + From 8b6f067f0a33079b4b722b781cd3edcf59a14212 Mon Sep 17 00:00:00 2001 From: Artur Kowalski Date: Thu, 17 May 2018 12:52:01 +0200 Subject: [PATCH 14/20] change IBity to IYobitAPI --- .../extra/futurocoin/sources/yobit/YobitRateSource.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java index 28fe9ac..bb515f9 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/futurocoin/sources/yobit/YobitRateSource.java @@ -2,7 +2,6 @@ package com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit; import com.generalbytes.batm.server.extensions.Currencies; import com.generalbytes.batm.server.extensions.IRateSource; -import com.generalbytes.batm.server.extensions.extra.bitcoin.sources.bity.IBity; import com.generalbytes.batm.server.extensions.extra.futurocoin.sources.yobit.dto.YobitResponse; import java.math.BigDecimal; @@ -16,7 +15,7 @@ public class YobitRateSource implements IRateSource { private IYobitAPI api; public YobitRateSource() { - api = RestProxyFactory.createProxy(IBity.class, "https://yobit.net"); + api = RestProxyFactory.createProxy(IYobitAPI.class, "https://yobit.net"); } @Override From 92608ebe3e5cd04f6c9e88a63e170f25104add8b Mon Sep 17 00:00:00 2001 From: Vlado Dimitriev Date: Tue, 22 May 2018 10:51:58 +0200 Subject: [PATCH 15/20] BPUB-577 & BATM-512 - fix for issue. removed project version from build.gradle files of server_extensions_api and server_extensions_extra. --- .gitignore | 10 +++++++++- server_extensions_api/build.gradle | 1 - server_extensions_extra/build.gradle | 3 +-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 77921c6..c48608a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,12 @@ out/ *.iml target install-libs.sh -.mvn-repo \ No newline at end of file +.mvn-repo +..gitignore.swp +.project +.classpath +.settings/ +/bin/ +bin/ +*/bin/ + diff --git a/server_extensions_api/build.gradle b/server_extensions_api/build.gradle index 7540019..7ea3800 100644 --- a/server_extensions_api/build.gradle +++ b/server_extensions_api/build.gradle @@ -4,7 +4,6 @@ apply plugin: "gb-gradle" apply plugin: 'maven-publish' group = projectGroup -version = projectVersion jar { baseName 'batm_server_extensions_api' diff --git a/server_extensions_extra/build.gradle b/server_extensions_extra/build.gradle index 7da0690..fedf4fb 100644 --- a/server_extensions_extra/build.gradle +++ b/server_extensions_extra/build.gradle @@ -4,7 +4,6 @@ apply plugin: "gb-gradle" apply plugin: 'maven-publish' group = projectGroup -version = projectVersion jar { baseName 'batm_server_extensions_extra' @@ -22,7 +21,7 @@ artifacts { } dependencies { - compile project(':server_extensions_api'); + compile project(':server_extensions_api') compile(group: 'com.azazar', name: 'bitcoin-json-rpc-client', version: '1.0') compile(group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25') compile(group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25') From d196d1dfab5697816dff22f7b967214c6bf0d3ca Mon Sep 17 00:00:00 2001 From: Vlado Dimitriev Date: Tue, 22 May 2018 16:07:31 +0200 Subject: [PATCH 16/20] BPUB-577 & BATM-512 version has been put back to build.gradle files for the extensions but an archiveName has been added, so that the jar plugin is not using the default values. --- server_extensions_api/build.gradle | 2 ++ server_extensions_extra/build.gradle | 2 ++ 2 files changed, 4 insertions(+) diff --git a/server_extensions_api/build.gradle b/server_extensions_api/build.gradle index 7ea3800..acbccab 100644 --- a/server_extensions_api/build.gradle +++ b/server_extensions_api/build.gradle @@ -4,9 +4,11 @@ apply plugin: "gb-gradle" apply plugin: 'maven-publish' group = projectGroup +version = projectVersion jar { baseName 'batm_server_extensions_api' + archiveName "${baseName}-${classifier}.${extension}" } distributions { diff --git a/server_extensions_extra/build.gradle b/server_extensions_extra/build.gradle index fedf4fb..2f6a7e7 100644 --- a/server_extensions_extra/build.gradle +++ b/server_extensions_extra/build.gradle @@ -4,9 +4,11 @@ apply plugin: "gb-gradle" apply plugin: 'maven-publish' group = projectGroup +version = projectVersion jar { baseName 'batm_server_extensions_extra' + archiveName "${baseName}-${classifier}.${extension}" } configurations { From 98ebef2a81ec3fe6b2762e49c1e65177bb27a488 Mon Sep 17 00:00:00 2001 From: Radovan Panak Date: Tue, 22 May 2018 16:28:44 +0200 Subject: [PATCH 17/20] bump Gradle version to 4.7 --- gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a5fe1cb94b9ee5ce57e6113458225bcba12d83e3..91ca28c8b802289c3a438766657a5e98f20eff03 100644 GIT binary patch delta 7397 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 delta 7284 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 Date: Tue, 22 May 2018 16:29:42 +0200 Subject: [PATCH 18/20] add editor config --- .editorconfig | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..571e10c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 4 +tab_width = 4 +trim_trailing_whitespace = true +insert_final_newline = false From f3dbbad3cc4cde0e306f931985e8a33076630fd9 Mon Sep 17 00:00:00 2001 From: Radovan Panak Date: Tue, 22 May 2018 16:31:52 +0200 Subject: [PATCH 19/20] Fix build for people lacking properly configured publishing properties --- server_extensions_api/build.gradle | 24 +++++++++++++----------- server_extensions_extra/build.gradle | 24 +++++++++++++----------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/server_extensions_api/build.gradle b/server_extensions_api/build.gradle index acbccab..01662ca 100644 --- a/server_extensions_api/build.gradle +++ b/server_extensions_api/build.gradle @@ -26,20 +26,22 @@ dependencies { compile(group: 'com.sun.mail', name: 'javax.mail', version: '1.4.7') } -publishing { - repositories { - maven { - credentials { - username gbArtifactoryUser - password gbArtifactoryPassword +if (hasProperty('gbArtifactoryUser') && hasProperty('gbArtifactoryPassword') && hasProperty('gbArtifactoryUploadUrl')) { + publishing { + repositories { + maven { + credentials { + username gbArtifactoryUser + password gbArtifactoryPassword + } + url gbArtifactoryUploadUrl } - url gbArtifactoryUploadUrl } - } - publications { - mavenJava(MavenPublication) { - from components.java + publications { + mavenJava(MavenPublication) { + from components.java + } } } } \ No newline at end of file diff --git a/server_extensions_extra/build.gradle b/server_extensions_extra/build.gradle index 05b5cae..a883732 100644 --- a/server_extensions_extra/build.gradle +++ b/server_extensions_extra/build.gradle @@ -52,20 +52,22 @@ distributions { } } -publishing { - repositories { - maven { - credentials { - username gbArtifactoryUser - password gbArtifactoryPassword +if (hasProperty('gbArtifactoryUser') && hasProperty('gbArtifactoryPassword') && hasProperty('gbArtifactoryUploadUrl')) { + publishing { + repositories { + maven { + credentials { + username gbArtifactoryUser + password gbArtifactoryPassword + } + url gbArtifactoryUploadUrl } - url gbArtifactoryUploadUrl } - } - publications { - mavenJava(MavenPublication) { - from components.java + publications { + mavenJava(MavenPublication) { + from components.java + } } } } From 7bfd470f55fcd67011a80381839c71299bd0a6f3 Mon Sep 17 00:00:00 2001 From: Radovan Panak Date: Tue, 22 May 2018 16:40:10 +0200 Subject: [PATCH 20/20] fix jar name --- server_extensions_api/build.gradle | 2 +- server_extensions_extra/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_extensions_api/build.gradle b/server_extensions_api/build.gradle index 01662ca..c853918 100644 --- a/server_extensions_api/build.gradle +++ b/server_extensions_api/build.gradle @@ -8,7 +8,7 @@ version = projectVersion jar { baseName 'batm_server_extensions_api' - archiveName "${baseName}-${classifier}.${extension}" + archiveName "${baseName}.${extension}" } distributions { diff --git a/server_extensions_extra/build.gradle b/server_extensions_extra/build.gradle index a883732..bc98d20 100644 --- a/server_extensions_extra/build.gradle +++ b/server_extensions_extra/build.gradle @@ -8,7 +8,7 @@ version = projectVersion jar { baseName 'batm_server_extensions_extra' - archiveName "${baseName}-${classifier}.${extension}" + archiveName "${baseName}.${extension}" } configurations {