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 cdda894..6c5bc99 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 @@ -27,6 +27,7 @@ public class Currencies { public static final String BCH = "BCH"; //Bitcoin Cash public static final String BTX = "BTX"; //BitCore public static final String ETH = "ETH"; + public static final String EFL = "EFL"; public static final String LTC = "LTC"; public static final String VIA = "VIA"; public static final String DEX = "DEX"; @@ -71,6 +72,7 @@ public class Currencies { crypto.add(BTC); crypto.add(BCH); crypto.add(BTX); + crypto.add(EFL); crypto.add(ETH); crypto.add(LTC); crypto.add(VIA); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/dash/sources/coinmarketcap/CoinmarketcapRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/dash/sources/coinmarketcap/CoinmarketcapRateSource.java index 823df81..d11fa6c 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/dash/sources/coinmarketcap/CoinmarketcapRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/dash/sources/coinmarketcap/CoinmarketcapRateSource.java @@ -45,6 +45,7 @@ public class CoinmarketcapRateSource implements IRateSource { result.add(Currencies.XMR); result.add(Currencies.POT); result.add(Currencies.FLASH); + result.add(Currencies.EFL); return result; } @@ -69,14 +70,27 @@ public class CoinmarketcapRateSource implements IRateSource { if (!getFiatCurrencies().contains(fiatCurrency)) { return null; } + + /** + * Cannot get specific ticker by coin code, only by name or 'id value' + * Get specific ID values for your coin from https://api.coinmarketcap.com/v2/listings/ + * for instance data[105] -> id 234 for e-Gulden + */ + CMCTicker[] tickers; - if(Currencies.FLASH.equalsIgnoreCase(cryptoCurrency)){ - tickers = api.getTickers(cryptoCurrency,fiatCurrency); - }else + if(Currencies.FLASH.equalsIgnoreCase(cryptoCurrency)) { + tickers = api.getTickers(cryptoCurrency, fiatCurrency); + } else if (Currencies.EFL.equalsIgnoreCase(cryptoCurrency)) { + tickers = api.getTickers("234", fiatCurrency); + } else { tickers = api.getTickers(fiatCurrency); + } for (int i = 0; i < tickers.length; i++) { CMCTicker ticker = tickers[i]; + + System.out.println("Ticker symbol: " + ticker.getSymbol()); + if (cryptoCurrency.equalsIgnoreCase(ticker.getSymbol())) { if (Currencies.EUR.equalsIgnoreCase(fiatCurrency)) { return ticker.getPrice_eur(); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/EguldenAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/EguldenAddressValidator.java new file mode 100644 index 0000000..20bf9cb --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/EguldenAddressValidator.java @@ -0,0 +1,51 @@ +/************************************************************************************* + * 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.egulden; + +import com.generalbytes.batm.server.coinutil.AddressFormatException; +import com.generalbytes.batm.server.coinutil.Base58; +import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; + +public class EguldenAddressValidator implements ICryptoAddressValidator { + + @Override + public boolean isAddressValid(String address) { + if (address.startsWith("L") || address.startsWith("E")) { + try { + Base58.decodeToBigInteger(address); + Base58.decodeChecked(address); + } catch (AddressFormatException e) { + e.printStackTrace(); + return false; + } + return true; + }else{ + return false; + } + } + + @Override + public boolean isPaperWalletSupported() { + return false; + } + + @Override + public boolean mustBeBase58Address() { + return true; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/EguldenExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/EguldenExtension.java new file mode 100644 index 0000000..ec11431 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/EguldenExtension.java @@ -0,0 +1,128 @@ +/************************************************************************************* + * 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.egulden; + +import com.generalbytes.batm.server.extensions.*; +import com.generalbytes.batm.server.extensions.extra.egulden.sources.FixPriceRateSource; +import com.generalbytes.batm.server.extensions.extra.egulden.wallets.eguldend.EguldendRPCWallet; +import com.generalbytes.batm.server.extensions.watchlist.IWatchList; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +public class EguldenExtension implements IExtension{ + @Override + public String getName() { + return "BATM e-Gulden extension"; + } + + @Override + public IExchange createExchange(String exchangeLogin) { + return null; + } + + @Override + public IWallet createWallet(String walletLogin) { + if (walletLogin !=null && !walletLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(walletLogin,":"); + String walletType = st.nextToken(); + + if ("eguldend".equalsIgnoreCase(walletType)) { + //"eguldend: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 EguldendRPCWallet(rpcURL,accountName); + } + } + } + return null; + } + + @Override + public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { + if (Currencies.EFL.equalsIgnoreCase(cryptoCurrency)) { + return new EguldenAddressValidator(); + } + return null; + } + + @Override + public IPaperWalletGenerator createPaperWalletGenerator(String cryptoCurrency) { + return null; + } + + @Override + public IPaymentProcessor createPaymentProcessor(String paymentProcessorLogin) { + return null; //no payment processors available + } + + @Override + public IRateSource createRateSource(String sourceLogin) { + if (sourceLogin != null && !sourceLogin.trim().isEmpty()) { + StringTokenizer st = new StringTokenizer(sourceLogin,":"); + String exchangeType = st.nextToken(); + + if ("eflfix".equalsIgnoreCase(exchangeType)) { + BigDecimal rate = BigDecimal.ZERO; + if (st.hasMoreTokens()) { + try { + rate = new BigDecimal(st.nextToken()); + } catch (Throwable e) { + } + } + String preferedFiatCurrency = Currencies.USD; + if (st.hasMoreTokens()) { + preferedFiatCurrency = st.nextToken().toUpperCase(); + } + return new FixPriceRateSource(rate, preferedFiatCurrency); + } + + } + return null; + } + @Override + public Set getSupportedCryptoCurrencies() { + Set result = new HashSet(); + result.add(Currencies.EFL); + 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/egulden/sources/FixPriceRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/sources/FixPriceRateSource.java new file mode 100644 index 0000000..875435e --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/sources/FixPriceRateSource.java @@ -0,0 +1,54 @@ +package com.generalbytes.batm.server.extensions.extra.egulden.sources; + +import com.generalbytes.batm.server.extensions.Currencies; +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; + +public class FixPriceRateSource implements IRateSource { + private BigDecimal rate = BigDecimal.ZERO; + + private String preferedFiatCurrency = Currencies.USD; + + public FixPriceRateSource(BigDecimal rate,String preferedFiatCurrency) { + this.rate = rate; + for (String fiatCurrency : Currencies.FIAT_CURRENCIES) { + if (fiatCurrency.equalsIgnoreCase(preferedFiatCurrency)) { + this.preferedFiatCurrency = fiatCurrency; + break; + } + } + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(Currencies.EFL); + return result; + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (Currencies.EFL.equalsIgnoreCase(cryptoCurrency)) { + return rate; + } + return null; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(Currencies.USD); + result.add(Currencies.EUR); + return result; + } + + @Override + public String getPreferredFiatCurrency() { + return preferedFiatCurrency; + } + +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/wallets/eguldend/EguldendRPCWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/wallets/eguldend/EguldendRPCWallet.java new file mode 100644 index 0000000..4995a66 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/egulden/wallets/eguldend/EguldendRPCWallet.java @@ -0,0 +1,120 @@ +/************************************************************************************* + * 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.egulden.wallets.eguldend; + +import com.azazar.bitcoin.jsonrpcclient.BitcoinException; +import com.azazar.bitcoin.jsonrpcclient.BitcoinJSONRPCClient; +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; + +public class EguldendRPCWallet implements IWallet{ + private static final Logger log = LoggerFactory.getLogger(EguldendRPCWallet.class); + private static final String CRYPTO_CURRENCY = Currencies.EFL; + + public EguldendRPCWallet(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("Eguldend wallet error: unknown cryptocurrency."); + return null; + } + + log.info("Eguldend 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("Eguldend 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("Eguldend 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/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index 23ac2c9..7844d09 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -64,6 +64,7 @@ XMR POT BTX + EFL @@ -477,4 +478,16 @@ + + + + + + + + + EFL + + + diff --git a/server_extensions_extra/src/main/resources/efl.png b/server_extensions_extra/src/main/resources/efl.png new file mode 100644 index 0000000..b3f2759 Binary files /dev/null and b/server_extensions_extra/src/main/resources/efl.png differ diff --git a/server_extensions_test/src/main/java/com/generalbytes/batm/server/extensions/test/Tester.java b/server_extensions_test/src/main/java/com/generalbytes/batm/server/extensions/test/Tester.java index c705d50..60cb592 100644 --- a/server_extensions_test/src/main/java/com/generalbytes/batm/server/extensions/test/Tester.java +++ b/server_extensions_test/src/main/java/com/generalbytes/batm/server/extensions/test/Tester.java @@ -411,6 +411,8 @@ public class Tester { } System.out.println(" " + cryptoCurrency); } + System.out.println("Selected Crypto Currency: "+ selectedCryptoCurrency); + final BigDecimal exchangeRateLast = rs.getExchangeRateLast(selectedCryptoCurrency, preferredFiatCurrency); if (exchangeRateLast != null) { System.out.println("Exchange Rate Last: 1 " + selectedCryptoCurrency + " = " + exchangeRateLast.stripTrailingZeros().toPlainString() + " " + preferredFiatCurrency);