diff --git a/currencies/src/main/java/com/generalbytes/batm/common/currencies/CryptoCurrency.java b/currencies/src/main/java/com/generalbytes/batm/common/currencies/CryptoCurrency.java index 415fcfb5b..815c30f8c 100644 --- a/currencies/src/main/java/com/generalbytes/batm/common/currencies/CryptoCurrency.java +++ b/currencies/src/main/java/com/generalbytes/batm/common/currencies/CryptoCurrency.java @@ -34,7 +34,7 @@ * CryptoCurrency.valueOf("$PAC") returns IllegalArgumentException. */ public enum CryptoCurrency { - + XLM("Stellar"), ADA("Cardano Ada"), ANON("ANON"), AQUA("Aquachain"), @@ -124,15 +124,14 @@ public enum CryptoCurrency { NULS("NULS"), MUE("MonetaryUnit"), XPM("Primecoin"), - ZPAE("ZelaaPayAE"), - + ZPAE("ZelaaPayAE --test"), + TBCH("test BCH"), TBTC("test BTC"), TETH("test ETH"), TLTC("test LTC"), TRMG("test RMG"), - TXRP("test XRP"), - ; + TXRP("test XRP"); private static Map cryptoCurrenciesUpperCase = new HashMap<>(); private static Map cryptoCurrencies = new LinkedHashMap<>(); diff --git a/server_extensions_extra/build.gradle b/server_extensions_extra/build.gradle index 582ee8fcd..cb11b34e3 100644 --- a/server_extensions_extra/build.gradle +++ b/server_extensions_extra/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation("com.vdurmont:emoji-java:3.1.3") //for chat emojis implementation("com.nexmo:client:5.5.0") // sms provider implementation("org.bitcoinj:bitcoinj-core:0.16.1") + // Note when updating bitcoinj: block.io depends on libdohj for doge and ltc // which depends on bitcoinj and extends some classes, it must be compatible version // and it will break at runtime if the version is substituted for an incompatible one @@ -95,6 +96,11 @@ dependencies { implementation("com.google.protobuf:protobuf-java:3.13.0") implementation("com.onfido:onfido-api-java:2.3.1") + // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' + // https://mvnrepository.com/artifact/com.google.code.gson/gson + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' + testImplementation("junit:junit:4.13.1") testImplementation("org.assertj:assertj-core:3.19.0") testImplementation("ch.qos.logback:logback-classic:1.2.9") diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceComExchange.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceComExchange.java index 05e219680..d6a34805e 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceComExchange.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceComExchange.java @@ -39,7 +39,7 @@ public class BinanceComExchange extends BinanceExchange { SUPPORTED_FIATS.add(CryptoCurrency.DAI.getCode()); SUPPORTED_FIATS.add(CryptoCurrency.USDC.getCode()); SUPPORTED_FIATS.add(CryptoCurrency.USDT.getCode()); - + SUPPORTED_FIATS.add(CryptoCurrency.XLM.getCode()); SUPPORTED_CRYPTOS.add(new SupportedCryptoCurrency(CryptoCurrency.BAT.getCode())); SUPPORTED_CRYPTOS.add(new SupportedCryptoCurrency(CryptoCurrency.BCH.getCode())); SUPPORTED_CRYPTOS.add(new SupportedCryptoCurrency(CryptoCurrency.BNB.getCode())); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceUsExchange.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceUsExchange.java index 88a4cf0cb..368a73303 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceUsExchange.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/binance/BinanceUsExchange.java @@ -35,7 +35,7 @@ public class BinanceUsExchange extends BinanceExchange { SUPPORTED_FIATS.add(CryptoCurrency.BUSD.getCode()); SUPPORTED_FIATS.add(CryptoCurrency.USDC.getCode()); SUPPORTED_FIATS.add(CryptoCurrency.USDT.getCode()); - + SUPPORTED_FIATS.add(CryptoCurrency.XLM.getCode()); SUPPORTED_CRYPTOS.add(new SupportedCryptoCurrency(CryptoCurrency.BAT.getCode())); SUPPORTED_CRYPTOS.add(new SupportedCryptoCurrency(CryptoCurrency.BCH.getCode())); SUPPORTED_CRYPTOS.add(new SupportedCryptoCurrency(CryptoCurrency.BNB.getCode())); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitfinex/BitfinexExchange.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitfinex/BitfinexExchange.java index d3575b658..9008b0c80 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitfinex/BitfinexExchange.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitfinex/BitfinexExchange.java @@ -78,6 +78,7 @@ public class BitfinexExchange implements IExchangeAdvanced, IRateSourceAdvanced static { FIAT_CURRENCIES.add(FiatCurrency.USD.getCode()); FIAT_CURRENCIES.add(CryptoCurrency.USDT.getCode()); + FIAT_CURRENCIES.add(CryptoCurrency.XLM.getCode()); } /** diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitflyer/BitFlyerExchange.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitflyer/BitFlyerExchange.java index 737f1ea7f..2b29e72b1 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitflyer/BitFlyerExchange.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/bitflyer/BitFlyerExchange.java @@ -64,6 +64,7 @@ enum TradableLimitFor {BUY, SELL} static { CRYPTO_CURRENCIES.add(CryptoCurrency.BTC.getCode()); + CRYPTO_CURRENCIES.add(CryptoCurrency.XLM.getCode()); } private void initConstants(String baseUrl) { diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinbase/CoinbaseExchange.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinbase/CoinbaseExchange.java index c689a580c..f09c28033 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinbase/CoinbaseExchange.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinbase/CoinbaseExchange.java @@ -81,7 +81,7 @@ private static void initConstants() { FIAT_CURRENCIES.add(FiatCurrency.GBP.getCode()); FIAT_CURRENCIES.add(FiatCurrency.SGD.getCode()); FIAT_CURRENCIES.add(FiatCurrency.USD.getCode()); - + CRYPTO_CURRENCIES.add(CryptoCurrency.XLM.getCode()); CRYPTO_CURRENCIES.add(CryptoCurrency.ADA.getCode()); CRYPTO_CURRENCIES.add(CryptoCurrency.BAT.getCode()); CRYPTO_CURRENCIES.add(CryptoCurrency.BCH.getCode()); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinzix/CoinZixExchange.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinzix/CoinZixExchange.java index 554f92566..f898a6a0d 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinzix/CoinZixExchange.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/exchanges/coinzix/CoinZixExchange.java @@ -53,7 +53,7 @@ public class CoinZixExchange implements IRateSourceAdvanced, IExchangeAdvanced { private static void initConstants() { FIAT_CURRENCIES.add(FiatCurrency.EUR.getCode()); - + CRYPTO_CURRENCIES.add(CryptoCurrency.XLM.getCode()); CRYPTO_CURRENCIES.add(CryptoCurrency.BTC.getCode()); CRYPTO_CURRENCIES.add(CryptoCurrency.ETH.getCode()); CRYPTO_CURRENCIES.add(CryptoCurrency.EGLD.getCode()); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/sources/coingecko/CoinGeckoRateSource.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/sources/coingecko/CoinGeckoRateSource.java index 5bda11773..3a892134e 100644 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/sources/coingecko/CoinGeckoRateSource.java +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/bitcoin/sources/coingecko/CoinGeckoRateSource.java @@ -39,6 +39,7 @@ public class CoinGeckoRateSource implements IRateSource { static { // from https://api.coingecko.com/api/v3/coins/list + CRYPTOCURRENCIES.put(CryptoCurrency.XLM.getCode(), "XLM"); CRYPTOCURRENCIES.put(CryptoCurrency.ANON.getCode(), "anon"); CRYPTOCURRENCIES.put(CryptoCurrency.ANT.getCode(), "aragon"); CRYPTOCURRENCIES.put(CryptoCurrency.BAT.getCode(), "basic-attention-token"); diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarCoinExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarCoinExtension.java new file mode 100644 index 000000000..d3d5631af --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarCoinExtension.java @@ -0,0 +1,113 @@ +package com.generalbytes.batm.server.extensions.extra.stellar; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.generalbytes.batm.common.currencies.CryptoCurrency; +import com.generalbytes.batm.server.extensions.AbstractExtension; +import com.generalbytes.batm.server.extensions.ExtensionsUtil; +import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; +import com.generalbytes.batm.server.extensions.IWallet; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.StellarCoinWallet; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.consts.Const; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.Wallet; +import com.google.gson.Gson; + +public class StellarCoinExtension extends AbstractExtension { + private static final Logger log = LoggerFactory.getLogger(StellarCoinExtension.class); + String requestBody; + + @Override + public String getName() { + return "BATM Stellarcoin extension"; + } + + @Override + public IWallet createWallet(String walletLogin, String tunnelPassword) { + + log.debug("Stellar:CreateWallet Started"); + if (walletLogin != null && !walletLogin.trim().isEmpty()) { + try { + log.debug("Stellar: Step 1"); + StringTokenizer st = new StringTokenizer(walletLogin, ":"); + String walletType = st.nextToken(); + + if ("bpventures.us".equalsIgnoreCase(walletType)) { + log.debug("Stellar: Step 2"); + String secret = st.nextToken(); + String apikey = st.nextToken(); + String hostname = st.nextToken(); + String testnet = st.nextToken(); + if (testnet.equals("true")) { + log.debug("Stellar: Step 3"); + requestBody = "{\"testnet\":"+ testnet+" , \"secret\":"+secret+"}"; + } + try { + log.debug("Stellar: Step 4"); + URL url = new URL(hostname + Const.ADDWALLET); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Authorization", "Token " + apikey); + connection.setDoOutput(true); + try (OutputStream os = connection.getOutputStream()) { + byte[] input = requestBody.getBytes("utf-8"); + os.write(input, 0, input.length); + } + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + Gson gson = new Gson(); + Wallet wallet = gson.fromJson(reader.readLine(), Wallet.class); + wallet.setApiKey(apikey); + wallet.setSecret(secret); + log.debug("Stellar: Step 5"); + return new StellarCoinWallet(wallet); + } + } catch (IOException e) { + e.printStackTrace(); + } + connection.disconnect(); + + } catch (IOException e) { + e.printStackTrace(); + } + + } + } catch (Exception e) { + ExtensionsUtil.logExtensionParamsException("createWallet", getClass().getSimpleName(), walletLogin, e); + } + } + return null; + + } + + @Override + public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { + log.debug("Stellar: Step 6"); + if (CryptoCurrency.XLM.getCode().equalsIgnoreCase(cryptoCurrency)) { + return new StellarcoinAddressValidator(); + } + return null; + } + + @Override + public Set getSupportedCryptoCurrencies() { + log.debug("Stellar: Step 7"); + Set result = new HashSet(); + result.add(CryptoCurrency.XLM.getCode()); + return result; + } + +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidator.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidator.java new file mode 100644 index 000000000..6a0150683 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidator.java @@ -0,0 +1,51 @@ +package com.generalbytes.batm.server.extensions.extra.stellar; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.generalbytes.batm.server.coinutil.AddressFormatException; +import com.generalbytes.batm.server.coinutil.Base58; +import com.generalbytes.batm.server.extensions.ExtensionsUtil; +import com.generalbytes.batm.server.extensions.ICryptoAddressValidator; + +public class StellarcoinAddressValidator implements ICryptoAddressValidator { + private static final Logger log = LoggerFactory.getLogger("batm.master.extensions.StellarcoinAddressValidator"); + + @Override + public boolean isAddressValid(String address) { + if (address.length() < 56) { + System.out.println("Error: Stellar public keys should be 56 characters long"); + return false; + } else if (address.equals("0")) { + System.out.println( + "Error: Although technically the correct length, a key of all zeros is not a valid Stellar public key.\n" + + ""); + return false; + } + + else if (!address.startsWith("G")) { + System.out.println("Error:Stellar public keys should start with the letter G"); + return false; + } else + + if (!StringUtils.isAlphanumeric(address)) { + System.out.println("Error: Stellar public keys should only contain alphanumeric characters."); + return false; + } + return true; + } + + @Override + public boolean mustBeBase58Address() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isPaperWalletSupported() { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarCoinWallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarCoinWallet.java new file mode 100644 index 000000000..8a05091a1 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarCoinWallet.java @@ -0,0 +1,197 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.util.HashSet; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.generalbytes.batm.common.currencies.CryptoCurrency; +import com.generalbytes.batm.server.extensions.IWallet; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.consts.Const; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.SiginEnvelopeResponse; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.TransactionResponse; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.Wallet; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class StellarCoinWallet implements IWallet { + private static final Logger log = LoggerFactory.getLogger(StellarCoinWallet.class); + private static final String CRYPTO_CURRENCY = CryptoCurrency.XLM.getCode(); + Wallet wallet; + + public StellarCoinWallet(Wallet wallet) { + this.wallet = wallet; + + } + + @Override + public String getCryptoAddress(String cryptoCurrency) { + + return wallet.getPubkey(); + } + + @Override + public Set getCryptoCurrencies() { + Set result = new HashSet<>(); + result.add(CRYPTO_CURRENCY); + return result; + } + + @Override + public String getPreferredCryptoCurrency() { + return CRYPTO_CURRENCY; + } + + @Override + public BigDecimal getCryptoBalance(String cryptoCurrency) { + // Replace this with the Stellar address you want to check + String stellarAddress = wallet.getPubkey(); + + try { + // Set up the Horizon testnet URL + String horizonURL = Const.BALANCEAPI + stellarAddress; + + // Create an HTTP connection + URL url = new URL(horizonURL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + // Read the response + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + // Parse and print the balance information + return new BigDecimal(response.toString()); + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, String description) { + + String paymentUrl = String.format(Const.TRANSACTION, wallet.getId()); + + String requestBody = "{\"asset_code\":\"XLM\",\"asset_issuer\":\"\",\"destination\":\"" + destinationAddress + + "\",\"amount\":\"" + amount + + "\",\"memo_type\":\"text\",\"memo\":\"xyz\",\"create_account\":true,\"check_balance\":true,\"base_fee\":10000}"; + + URL url = null; + try { + url = new URL(paymentUrl); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + HttpURLConnection connection = null; + try { + connection = (HttpURLConnection) url.openConnection(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // Set the request method to POST + try { + connection.setRequestMethod("POST"); + } catch (ProtocolException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Authorization", wallet.getApiKey()); + connection.setDoOutput(true); + + // Write the request body + try (OutputStream os = connection.getOutputStream()) { + byte[] input = requestBody.getBytes("utf-8"); + os.write(input, 0, input.length); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // Get the response + try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) { + StringBuilder response = new StringBuilder(); + String responseLine; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + + if (connection.getResponseCode() >= 200 && connection.getResponseCode() < 300) { + Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ").create(); + SiginEnvelopeResponse apiResponse = gson.fromJson(response.toString(), SiginEnvelopeResponse.class); + + String broadUrl = String.format(Const.BRODCAST, wallet.getId()); + + String envelopeBody = "{\"envelope\":\"" + apiResponse.getSignedEnvelope() + "\"}"; + + URL braodCasturl = new URL(broadUrl); + HttpURLConnection broadcastConnection = (HttpURLConnection) url.openConnection(); + + // Set the request method to POST + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Authorization", wallet.getApiKey()); + connection.setDoOutput(true); + + // Write the request body + try (OutputStream os = connection.getOutputStream()) { + byte[] input = requestBody.getBytes("utf-8"); + os.write(input, 0, input.length); + } + + // Get the response + try (BufferedReader brreader = new BufferedReader( + new InputStreamReader(connection.getInputStream(), "utf-8"))) { + StringBuilder broadCastResponse = new StringBuilder(); + String broadCastresponseLine; + while ((broadCastresponseLine = brreader.readLine()) != null) { + broadCastResponse.append(broadCastresponseLine.trim()); + } + + if (connection.getResponseCode() >= 200 && connection.getResponseCode() < 300) { + // Assuming you have the JSON response in a String variable called jsonResponse + gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").create(); + TransactionResponse transactionResponse = gson.fromJson(broadCastResponse.toString(), + TransactionResponse.class); + return transactionResponse.toString(); + } + } finally { + connection.disconnect(); + } + } + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + connection.disconnect(); + } + return null; + + } + +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/consts/Const.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/consts/Const.java new file mode 100644 index 000000000..1c0f0e026 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/consts/Const.java @@ -0,0 +1,11 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.consts; + +public class Const { + + public static final String ADDWALLET = "/wallet/add/"; + public static final String TRANSACTION = "/wallet/%s/sign-envelope/payment/"; + public static final String GETWALLET = "/wallet/%s/"; + public static final String BRODCAST="/wallet/%s/submit-transaction-onchain/"; + public static final String BALANCEAPI="https://horizon-mainnet.stellar.org/accounts/"; + +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Link.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Link.java new file mode 100644 index 000000000..14e9b7c8a --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Link.java @@ -0,0 +1,16 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; +import com.google.gson.annotations.SerializedName; + +public class Link { + @SerializedName("href") + private String href; + + // Add getters and setters as needed + + @Override + public String toString() { + return "Link{" + + "href='" + href + '\'' + + '}'; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Links.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Links.java new file mode 100644 index 000000000..a036945e8 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Links.java @@ -0,0 +1,44 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; +import com.google.gson.annotations.SerializedName; + +public class Links { + @SerializedName("self") + private Link self; + + @SerializedName("account") + private Link account; + + @SerializedName("ledger") + private Link ledger; + + @SerializedName("operations") + private Link operations; + + @SerializedName("effects") + private Link effects; + + @SerializedName("precedes") + private Link precedes; + + @SerializedName("succeeds") + private Link succeeds; + + @SerializedName("transaction") + private Link transaction; + + // Add getters and setters as needed + + @Override + public String toString() { + return "Links{" + + "self=" + self + + ", account=" + account + + ", ledger=" + ledger + + ", operations=" + operations + + ", effects=" + effects + + ", precedes=" + precedes + + ", succeeds=" + succeeds + + ", transaction=" + transaction + + '}'; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Preconditions.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Preconditions.java new file mode 100644 index 000000000..4fac92c11 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Preconditions.java @@ -0,0 +1,16 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; +import com.google.gson.annotations.SerializedName; + +public class Preconditions { + @SerializedName("timebounds") + private TimeBounds timeBounds; + + // Add getters and setters as needed + + @Override + public String toString() { + return "Preconditions{" + + "timeBounds=" + timeBounds + + '}'; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/SiginEnvelopeResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/SiginEnvelopeResponse.java new file mode 100644 index 000000000..fca55f972 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/SiginEnvelopeResponse.java @@ -0,0 +1,86 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +import com.google.gson.annotations.SerializedName; +import java.util.Date; + +public class SiginEnvelopeResponse { + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getEnvelope() { + return envelope; + } + + public void setEnvelope(String envelope) { + this.envelope = envelope; + } + + public String getSignedEnvelope() { + return signedEnvelope; + } + + public void setSignedEnvelope(String signedEnvelope) { + this.signedEnvelope = signedEnvelope; + } + + @SerializedName("id") + private String id; + + @SerializedName("created") + private Date created; + + @SerializedName("modified") + private Date modified; + + @SerializedName("status") + private String status; + + @SerializedName("envelope") + private String envelope; + + @SerializedName("signed_envelope") + private String signedEnvelope; + + // Add getters and setters as needed + + @Override + public String toString() { + return "ApiResponse{" + + "id='" + id + '\'' + + ", created=" + created + + ", modified=" + modified + + ", status='" + status + '\'' + + ", envelope='" + envelope + '\'' + + ", signedEnvelope='" + signedEnvelope + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TimeBounds.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TimeBounds.java new file mode 100644 index 000000000..f943a0dfc --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TimeBounds.java @@ -0,0 +1,20 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; +import com.google.gson.annotations.SerializedName; + +public class TimeBounds { + @SerializedName("min_time") + private long minTime; + + @SerializedName("max_time") + private long maxTime; + + // Add getters and setters as needed + + @Override + public String toString() { + return "TimeBounds{" + + "minTime=" + minTime + + ", maxTime=" + maxTime + + '}'; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TransactionResponse.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TransactionResponse.java new file mode 100644 index 000000000..ab91540b3 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TransactionResponse.java @@ -0,0 +1,102 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +import com.google.gson.annotations.SerializedName; +import java.util.Date; +import java.util.List; + +public class TransactionResponse { + @SerializedName("memo") + private String memo; + + @SerializedName("memo_bytes") + private String memoBytes; + + @SerializedName("_links") + private Links links; + + @SerializedName("id") + private String id; + + @SerializedName("paging_token") + private String pagingToken; + + @SerializedName("successful") + private boolean successful; + + @SerializedName("hash") + private String hash; + + public String getHash() { + return hash; + } + + public void setHash(String hash) { + this.hash = hash; + } + + @SerializedName("ledger") + private int ledger; + + @SerializedName("created_at") + private Date createdAt; + + @SerializedName("source_account") + private String sourceAccount; + + @SerializedName("source_account_sequence") + private String sourceAccountSequence; + + @SerializedName("fee_account") + private String feeAccount; + + @SerializedName("fee_charged") + private String feeCharged; + + @SerializedName("max_fee") + private String maxFee; + + @SerializedName("operation_count") + private int operationCount; + + @SerializedName("envelope_xdr") + private String envelopeXdr; + + @SerializedName("result_xdr") + private String resultXdr; + + @SerializedName("result_meta_xdr") + private String resultMetaXdr; + + @SerializedName("fee_meta_xdr") + private String feeMetaXdr; + + @SerializedName("memo_type") + private String memoType; + + @SerializedName("signatures") + private List signatures; + + @SerializedName("valid_after") + private Date validAfter; + + @SerializedName("valid_before") + private Date validBefore; + + @SerializedName("preconditions") + private Preconditions preconditions; + + // Add getters and setters as needed + + @Override + public String toString() { + return "HorizonResponse{" + "memo='" + memo + '\'' + ", memoBytes='" + memoBytes + '\'' + ", links=" + links + + ", id='" + id + '\'' + ", pagingToken='" + pagingToken + '\'' + ", successful=" + successful + + ", hash='" + hash + '\'' + ", ledger=" + ledger + ", createdAt=" + createdAt + ", sourceAccount='" + + sourceAccount + '\'' + ", sourceAccountSequence='" + sourceAccountSequence + '\'' + ", feeAccount='" + + feeAccount + '\'' + ", feeCharged='" + feeCharged + '\'' + ", maxFee='" + maxFee + '\'' + + ", operationCount=" + operationCount + ", envelopeXdr='" + envelopeXdr + '\'' + ", resultXdr='" + + resultXdr + '\'' + ", resultMetaXdr='" + resultMetaXdr + '\'' + ", feeMetaXdr='" + feeMetaXdr + '\'' + + ", memoType='" + memoType + '\'' + ", signatures=" + signatures + ", validAfter=" + validAfter + + ", validBefore=" + validBefore + ", preconditions=" + preconditions + '}'; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Wallet.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Wallet.java new file mode 100644 index 000000000..fe7977795 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Wallet.java @@ -0,0 +1,35 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +public class Wallet { + private String id; + private String pubkey; + private String secret; + private String apiKey; + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getPubkey() { + return pubkey; + } + public void setPubkey(String pubkey) { + this.pubkey = pubkey; + } + public String getSecret() { + return secret; + } + public void setSecret(String secret) { + this.secret = secret; + } + public String getApiKey() { + return apiKey; + } + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + + +} diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index f50640f75..690c91619 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -120,10 +120,12 @@ + XLM BTC ETH + XLM BTC ETH BCH @@ -133,6 +135,7 @@ BIZZ + XLM BTC ETH BCH @@ -143,6 +146,7 @@ Fiat currency is THB. + XLM BTC BCH DOGE @@ -154,6 +158,7 @@ + XLM BTC ETH LTC @@ -163,6 +168,7 @@ + XLM BCH BTC ETH @@ -171,6 +177,7 @@ + XLM BTC ETH LTC @@ -182,6 +189,7 @@ + XLM BTC LINDA SYS @@ -231,10 +239,12 @@ VOLTZ THBX MUSD + XLM + XLM $PAC ANON ANT @@ -379,6 +389,7 @@ + XLM BTC ETH LTC @@ -396,6 +407,7 @@ + XLM ADA BCH BTC @@ -428,6 +440,7 @@ + XLM ADA BAT BCH @@ -462,6 +475,7 @@ + XLM ADA BCH BTC @@ -472,6 +486,7 @@ + XLM BCH BTC BURST @@ -551,6 +566,7 @@ + XLM ANON ANT BAT @@ -619,6 +635,7 @@ + XLM ANON ANON ANT @@ -688,6 +705,7 @@ + XLM BAT BCH BNB @@ -714,6 +732,7 @@ + XLM BAT BCH BNB @@ -810,6 +829,7 @@ + XLM BCH BTC ETH @@ -1424,6 +1444,25 @@ + + + + + + + + XLM + + + + XLM + USD is default fiat currency. + + + + + + diff --git a/server_extensions_extra/src/main/resources/stellar.png b/server_extensions_extra/src/main/resources/stellar.png new file mode 100644 index 000000000..66144748c Binary files /dev/null and b/server_extensions_extra/src/main/resources/stellar.png differ diff --git a/server_extensions_extra/src/main/resources/stellar.svg b/server_extensions_extra/src/main/resources/stellar.svg new file mode 100644 index 000000000..1dc664b06 --- /dev/null +++ b/server_extensions_extra/src/main/resources/stellar.svg @@ -0,0 +1,655 @@ + +Created with Fabric.js 3.5.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server_extensions_extra/src/test/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidatorTest.java b/server_extensions_extra/src/test/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidatorTest.java new file mode 100644 index 000000000..dd4c32649 --- /dev/null +++ b/server_extensions_extra/src/test/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidatorTest.java @@ -0,0 +1,21 @@ +package com.generalbytes.batm.server.extensions.extra.stellar; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class StellarcoinAddressValidatorTest { + + @Test + public void isAddressValid() { + StellarcoinAddressValidator v = new StellarcoinAddressValidator(); + assertTrue(v.isAddressValid("GDKTRWA5IA2H7OOZSYVD3M46HBBJEJX3AHCNM3AQO4T6PYAKXZ2R4A5N")); + assertTrue(v.isAddressValid("GBE4WIINUARNQW6F6W2CNN6ZXZELG5EL3HZILX4FDXEVBBZHHTHBCXKZ")); + assertTrue(v.isAddressValid("GB7ZCPDQ6PYQ26BBZP44C456HJ7CUIEFZEVXO2OEP6YSF5W2CHI7LSEY")); + assertTrue(v.isAddressValid("GCGU5GS2NJUVXFK6XLLCTYUNYP7L5LUKKIOFE4RUXEASRRQBNT726YEK")); + assertTrue(v.isAddressValid("GCKGBPWQFOLORZPVWSXEG76C6ROJUB2KPWZDIKUVJZ7LOBU5O5JGSBOF")); + assertTrue(v.isAddressValid("GBBKY3EWSK7KYJC5TMTLGQZ2YTBEDPRIBV54ITSHCVHKQWUHWPSBPYEB")); + assertTrue(v.isAddressValid("GBELI2EJ6WTXJXB2HM7IEK7JCAYM5PYCC5KPAL3TWLQP6SZBO2KEHTMS")); + } +} \ No newline at end of file