From eed78217b40c606dd7a9d8653cb2d5606ea0e87a Mon Sep 17 00:00:00 2001 From: aetherum Date: Thu, 1 Jan 2015 20:14:20 +1100 Subject: [PATCH 1/4] Added Groestlcoin Support --- .../batm/server/extensions/ICurrencies.java | 1 + .../res/batm-extensions.xml | 14 +- server_extensions_extra/res/groestl.png | Bin 0 -> 25923 bytes .../GroestlcoinAddressValidator.java | 61 +++++++ .../groestlcoin/GroestlcoinExtension.java | 125 ++++++++++++++ .../sources/FixPriceRateSource.java | 54 +++++++ .../sources/GroestlcoinTickerRateSource.java | 122 ++++++++++++++ .../sources/GroestlcoinTickerResponse.java | 153 ++++++++++++++++++ .../sources/IGroestlcoinTickerRateAPI.java | 31 ++++ .../groestlcoind/GroestlcoindRPCWallet.java | 120 ++++++++++++++ 10 files changed, 674 insertions(+), 7 deletions(-) create mode 100644 server_extensions_extra/res/groestl.png create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/GroestlcoinAddressValidator.java create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/GroestlcoinExtension.java create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/FixPriceRateSource.java create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerRateSource.java create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/IGroestlcoinTickerRateAPI.java create mode 100644 server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/wallets/groestlcoind/GroestlcoindRPCWallet.java diff --git a/server_extensions_api/src/com/generalbytes/batm/server/extensions/ICurrencies.java b/server_extensions_api/src/com/generalbytes/batm/server/extensions/ICurrencies.java index 9d3eb00..8e8e1a2 100644 --- a/server_extensions_api/src/com/generalbytes/batm/server/extensions/ICurrencies.java +++ b/server_extensions_api/src/com/generalbytes/batm/server/extensions/ICurrencies.java @@ -25,6 +25,7 @@ public interface ICurrencies { public static final String MAX = "MAX"; public static final String LEO = "LEO"; public static final String NLG = "NLG"; + public static final String GRS = "GRS"; public static final String ICG = "ICG"; public static final String NBT = "NBT"; diff --git a/server_extensions_extra/res/batm-extensions.xml b/server_extensions_extra/res/batm-extensions.xml index 9150c97..81020a4 100644 --- a/server_extensions_extra/res/batm-extensions.xml +++ b/server_extensions_extra/res/batm-extensions.xml @@ -120,24 +120,24 @@ - - + + - NLG + GRS - NLG + GRS - - NLG + + GRS - + diff --git a/server_extensions_extra/res/groestl.png b/server_extensions_extra/res/groestl.png new file mode 100644 index 0000000000000000000000000000000000000000..1d13f09c15d1d15aefd2a3a971426d4247aa636f GIT binary patch literal 25923 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 getSupportedCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.GRS); + return result; + } + +} diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/FixPriceRateSource.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/FixPriceRateSource.java new file mode 100644 index 0000000..688b673 --- /dev/null +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/FixPriceRateSource.java @@ -0,0 +1,54 @@ +package com.generalbytes.batm.server.extensions.extra.groestlcoin.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; + } + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.GRS); + return result; + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (ICurrencies.GRS.equalsIgnoreCase(cryptoCurrency)) { + return rate; + } + return null; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.EUR); + return result; + } + + @Override + public String getPreferredFiatCurrency() { + return preferedFiatCurrency; + } +} diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerRateSource.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerRateSource.java new file mode 100644 index 0000000..51b2a37 --- /dev/null +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerRateSource.java @@ -0,0 +1,122 @@ +/************************************************************************************* + * Copyright (C) 2014 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.groestlcoin.sources; + +import com.generalbytes.batm.server.extensions.ICurrencies; +import com.generalbytes.batm.server.extensions.IRateSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import si.mazi.rescu.RestProxyFactory; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public class GroestlcoinTickerRateSource implements IRateSource{ + private static final Logger log = LoggerFactory.getLogger(GroestlcoinTickerRateSource.class); + + private static HashMap rateAmounts = new HashMap(); + private static HashMap rateTimes = new HashMap(); + private static final long MAXIMUM_ALLOWED_TIME_OFFSET = 30 * 1000; //30sec + + private IGroestlcoinTickerRateAPI api; + + public GroestlcoinTickerRateSource() { + api = RestProxyFactory.createProxy(IGroestlcoinTickerRateAPI.class, "https://markets.groestlcoin.com"); + } + + @Override + public BigDecimal getExchangeRateLast(String cryptoCurrency, String fiatCurrency) { + if (!(ICurrencies.GRS.equalsIgnoreCase(cryptoCurrency))) { + return null; + } + if (!(ICurrencies.EUR.equalsIgnoreCase(fiatCurrency))) { + return null; + } + + 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 GroestlcoinTicker 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 GroestlcoinTicker 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 (!(ICurrencies.GRS.equalsIgnoreCase(cryptoCurrency))) { + return null; + } + if (!(ICurrencies.EUR.equalsIgnoreCase(fiatCurrency))) { + return null; + } + GroestlcoinTickerResponse ticker = api.getTicker(); + if (ticker != null && ticker.getEUR() != null) { + if (ICurrencies.EUR.equalsIgnoreCase(fiatCurrency)){ + return ticker.getEUR().getSell15m(); + } + return null; + } + return null; + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.GRS); + return result; + } + + @Override + public Set getFiatCurrencies() { + Set result = new HashSet(); + result.add(ICurrencies.EUR); + return result; + } + + @Override + public String getPreferredFiatCurrency() { + return ICurrencies.EUR; + } + + public static void main(String[] args) { + BigDecimal exchangeRateLast = (new GroestlcoinTickerRateSource()).getExchangeRateLast("GRS", "EUR"); + System.out.println("exchangeRateLast = " + exchangeRateLast); + } + + +} diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java new file mode 100644 index 0000000..aeb117b --- /dev/null +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java @@ -0,0 +1,153 @@ +/************************************************************************************* + * Copyright (C) 2014 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.Groestlcoin.sources; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.math.BigDecimal; + +public class GroestlcoinTickerResponse { + @JsonProperty("EUR") + private EUR euro; + @JsonProperty("BTC") + private BTC btc; + + public class BTC { + private String code; + private String symbol; + private BigDecimal buy; + private BigDecimal sell; + private BigDecimal buy15m; + private BigDecimal sell15m; + + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + + public String getSymbol() { + return symbol; + } + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + 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 BigDecimal getBuy15m() { + return buy15m; + } + + public void setBuy15m(BigDecimal buy15m) { + this.buy15m = buy15m; + } + + public BigDecimal getSell15m() { + return sell15m; + } + + public void setSell15m(BigDecimal sell15m) { + this.sell15m = sell15m; + } + } + + public class EUR { + private String code; + private String symbol; + private BigDecimal buy; + private BigDecimal sell; + private BigDecimal buy15m; + private BigDecimal sell15m; + + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + + public String getSymbol() { + return symbol; + } + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + 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 BigDecimal getBuy15m() { + return buy15m; + } + + public void setBuy15m(BigDecimal buy15m) { + this.buy15m = buy15m; + } + + public BigDecimal getSell15m() { + return sell15m; + } + + public void setSell15m(BigDecimal sell15m) { + this.sell15m = sell15m; + } + } + + + public EUR getEUR() { + return euro; + } + public void setEUR(EUR euro) { + this.euro = euro; + } + public BTC getBTC() { + return btc; + } + public void setBTC(BTC btc) { + this.btc = btc; + } +} diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/IGroestlcoinTickerRateAPI.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/IGroestlcoinTickerRateAPI.java new file mode 100644 index 0000000..dafa59a --- /dev/null +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/IGroestlcoinTickerRateAPI.java @@ -0,0 +1,31 @@ +/************************************************************************************* + * Copyright (C) 2014 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.groestlcoin.sources; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/api/v1/") +@Produces(MediaType.APPLICATION_JSON) +public interface IGroestlcoinTickerRateAPI { + @GET + @Path("ticker") + GroestlcoinTickerResponse getTicker(); +} diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/wallets/groestlcoind/GroestlcoindRPCWallet.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/wallets/groestlcoind/GroestlcoindRPCWallet.java new file mode 100644 index 0000000..8aebb1d --- /dev/null +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/wallets/groestlcoind/GroestlcoindRPCWallet.java @@ -0,0 +1,120 @@ +/************************************************************************************* + * Copyright (C) 2014 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.groestlcoin.wallets.groestlcoind; + +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 GroestlcoindRPCWallet implements IWallet{ + private static final Logger log = LoggerFactory.getLogger(GroestlcoindRPCWallet.class); + private static final String CRYPTO_CURRENCY = ICurrencies.GRS; + + public GroestlcoindRPCWallet(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("Groestlcoind wallet error: unknown cryptocurrency."); + return null; + } + + log.info("Groestlcoind 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("Groestlcoind 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("Groestlcoind wallet error: unknown cryptocurrency: " + cryptoCurrency); + return null; + } + try { + double balance = getClient(rpcURL).getBalance(accountName); + return new BigDecimal(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; + } + +} From b623a9242106817f6bebee6a19bc6a9c9359630a Mon Sep 17 00:00:00 2001 From: aetherum Date: Thu, 1 Jan 2015 20:18:58 +1100 Subject: [PATCH 2/4] Added Groestlcoin Support --- .../extra/groestlcoin/sources/GroestlcoinTickerResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java index aeb117b..333a56a 100644 --- a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/sources/GroestlcoinTickerResponse.java @@ -15,7 +15,7 @@ * Web : http://www.generalbytes.com * ************************************************************************************/ -package com.generalbytes.batm.server.extensions.extra.Groestlcoin.sources; +package com.generalbytes.batm.server.extensions.extra.groestlcoin.sources; import com.fasterxml.jackson.annotation.JsonProperty; From 6b32fca999e2348332988a071984d5ec528ccc7f Mon Sep 17 00:00:00 2001 From: nuggetbram Date: Thu, 1 Jan 2015 22:48:04 +1100 Subject: [PATCH 3/4] Fixed Typo --- .../extensions/extra/groestlcoin/GroestlcoinExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/GroestlcoinExtension.java b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/GroestlcoinExtension.java index 87ac1af..b809d1d 100644 --- a/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/GroestlcoinExtension.java +++ b/server_extensions_extra/src/com/generalbytes/batm/server/extensions/extra/groestlcoin/GroestlcoinExtension.java @@ -86,7 +86,7 @@ public class GroestlcoinExtension implements IExtension{ StringTokenizer st = new StringTokenizer(sourceLogin,":"); String prefix = st.nextToken(); - if ("nlgfix".equalsIgnoreCase(prefix)) { + if ("grsfix".equalsIgnoreCase(prefix)) { BigDecimal rate = BigDecimal.ZERO; if (st.hasMoreTokens()) { try { From 3d39b6da7407f0b7c386a022bbea4c672aa5f090 Mon Sep 17 00:00:00 2001 From: nuggetbram Date: Sun, 4 Jan 2015 10:49:26 +1100 Subject: [PATCH 4/4] Update batm-extensions.xml --- .../res/batm-extensions.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/server_extensions_extra/res/batm-extensions.xml b/server_extensions_extra/res/batm-extensions.xml index 81020a4..9b59c7d 100644 --- a/server_extensions_extra/res/batm-extensions.xml +++ b/server_extensions_extra/res/batm-extensions.xml @@ -120,6 +120,25 @@ + + + + + + + + + NLG + + + + NLG + + + NLG + + +