From 7f45cb367fb1a3f283c3b417f13dbabe69a41b33 Mon Sep 17 00:00:00 2001 From: Mohit Date: Fri, 24 Nov 2023 18:03:57 +0530 Subject: [PATCH 1/8] This is initial structure commit for supporting XLM to BATM extension module. --- .../common/currencies/CryptoCurrency.java | 1 + .../extra/stellar/StellarCoinExtension.java | 33 + .../stellar/StellarcoinAddressValidator.java | 32 + .../wallets/stellar/StellarCoinWallet.java | 78 +++ .../wallets/stellar/StellarWalletApi.java | 33 + .../stellar/wallets/stellar/dto/Amount.java | 31 + .../stellar/wallets/stellar/dto/Balance.java | 31 + .../stellar/dto/CreateTransactionRequest.java | 24 + .../stellar/wallets/stellar/dto/Payment.java | 22 + .../wallets/stellar/dto/Transaction.java | 49 ++ .../stellar/wallets/stellar/dto/Wallet.java | 22 + .../wallets/stellar/dto/WalletAddress.java | 40 ++ .../src/main/resources/batm-extensions.xml | 23 + .../src/main/resources/stellar.png | Bin 0 -> 3801 bytes .../src/main/resources/stellar.svg | 655 ++++++++++++++++++ 15 files changed, 1074 insertions(+) create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarCoinExtension.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidator.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarCoinWallet.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Wallet.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java create mode 100644 server_extensions_extra/src/main/resources/stellar.png create mode 100644 server_extensions_extra/src/main/resources/stellar.svg 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..0b88b87ad 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 @@ -132,6 +132,7 @@ public enum CryptoCurrency { TLTC("test LTC"), TRMG("test RMG"), TXRP("test XRP"), + XLM("Stellar") ; private static Map cryptoCurrenciesUpperCase = new HashMap<>(); 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..b792493e4 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarCoinExtension.java @@ -0,0 +1,33 @@ +package com.generalbytes.batm.server.extensions.extra.stellar; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.generalbytes.batm.server.extensions.AbstractExtension; +import com.generalbytes.batm.server.extensions.IWallet; + +public class StellarCoinExtension extends AbstractExtension { + private static final Logger log = LoggerFactory.getLogger(StellarCoinExtension.class); + + @Override + public String getName() { + return "BATM Stellarcoin extension"; + } + + @Override + public IWallet createWallet(String walletLogin, String tunnelPassword) { + return null; + + } + +} 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..509a3ea0b --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidator.java @@ -0,0 +1,32 @@ +package com.generalbytes.batm.server.extensions.extra.stellar; + +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) { + // TODO Auto-generated method stub + return false; + } + + @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..937aec651 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarCoinWallet.java @@ -0,0 +1,78 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar; + +import com.generalbytes.batm.common.currencies.CryptoCurrency; +import com.generalbytes.batm.server.extensions.IWallet; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Amount; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Balance; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.CreateTransactionRequest; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Transaction; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Wallet; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Payment; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.WalletAddress; +import okhttp3.HttpUrl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import si.mazi.rescu.HttpStatusIOException; +import si.mazi.rescu.RestProxyFactory; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class StellarCoinWallet implements IWallet{ + private static final Logger log = LoggerFactory.getLogger(StellarCoinWallet.class); + private static final String CRYPTO_CURRENCY = CryptoCurrency.XLM.getCode(); + + + public StellarCoinWallet(String protocol, String host, int port) { + String url = new HttpUrl.Builder().scheme(protocol).host(host).port(port).build().toString(); + + } + + + + + @Override + public String getCryptoAddress(String cryptoCurrency) { + + return null; + } + + @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) { + + return null; + } + + @Override + public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, String description) { + + return null; + } + + + private CreateTransactionRequest createTransactionRequest(String destinationAddress, BigDecimal quantity) { + + + return null; + } + + + +} + + diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java new file mode 100644 index 000000000..201194a20 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java @@ -0,0 +1,33 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.CreateTransactionRequest; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Transaction; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Wallet; +import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.WalletAddress; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.util.List; + + +@Path("/v2/wallets") +@Produces(MediaType.APPLICATION_JSON) +public interface StellarWalletApi { + @GET + @Path("/{walletId}") + Wallet getWallet(@PathParam("walletId") String walletId) throws IOException; + + @GET + @Path("/{walletId}/addresses") + List getWalletAddresses(@PathParam("walletId") String walletId) throws IOException; + + @POST + @Path("/{walletId}/transactions") + @Consumes(MediaType.APPLICATION_JSON) + Transaction createTransaction(@PathParam("walletId") String walletId, CreateTransactionRequest requestBody) throws IOException; +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java new file mode 100644 index 000000000..d4dac3ba0 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java @@ -0,0 +1,31 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +import java.math.BigDecimal; + +public class Amount { + private BigDecimal quantity; + private String unit; + + public BigDecimal getQuantity() { + return quantity; + } + + public void setQuantity(BigDecimal quantity) { + this.quantity = quantity; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + @Override + public String toString() { + return "Amount{" + "quantity=" + quantity + + ", unit='" + unit + '\'' + + '}'; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java new file mode 100644 index 000000000..967f31425 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java @@ -0,0 +1,31 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +public class Balance { + private Amount available; + private Amount reward; + private Amount total; + + public Amount getAvailable() { + return available; + } + + public void setAvailable(Amount available) { + this.available = available; + } + + public Amount getReward() { + return reward; + } + + public void setReward(Amount reward) { + this.reward = reward; + } + + public Amount getTotal() { + return total; + } + + public void setTotal(Amount total) { + this.total = total; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java new file mode 100644 index 000000000..a586b29f6 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java @@ -0,0 +1,24 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +import java.util.List; + +public class CreateTransactionRequest { + private String passphrase; + private List payments; + + public String getPassphrase() { + return passphrase; + } + + public void setPassphrase(String passphrase) { + this.passphrase = passphrase; + } + + public List getPayments() { + return payments; + } + + public void setPayments(List payments) { + this.payments = payments; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java new file mode 100644 index 000000000..d63709fa0 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java @@ -0,0 +1,22 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +public class Payment { + private String address; + private Amount amount; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Amount getAmount() { + return amount; + } + + public void setAmount(Amount amount) { + this.amount = amount; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java new file mode 100644 index 000000000..96c0a9297 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java @@ -0,0 +1,49 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +public class Transaction { + private String id; + private Amount amount; + private Amount fee; + private String status; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Amount getAmount() { + return amount; + } + + public void setAmount(Amount amount) { + this.amount = amount; + } + + public Amount getFee() { + return fee; + } + + public void setFee(Amount fee) { + this.fee = fee; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "Transaction{" + "id='" + id + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", status='" + status + '\'' + + '}'; + } +} 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..378d431a2 --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Wallet.java @@ -0,0 +1,22 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +public class Wallet { + private String id; + private Balance balance; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Balance getBalance() { + return balance; + } + + public void setBalance(Balance balance) { + this.balance = balance; + } +} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java new file mode 100644 index 000000000..aa3256d5e --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java @@ -0,0 +1,40 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; + +import com.fasterxml.jackson.annotation.JsonValue; + +public class WalletAddress { + private String id; + private State state; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + public enum State { + USED("used"), + UNUSED("unused"); + + private final String value; + + State(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + } +} diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index f50640f75..a59d9aa8f 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -1424,6 +1424,29 @@ + + + + + + XLM + + + + + XLM + This variant generates new addresses for each transaction and does not forward payments from temporary address + + + + 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 0000000000000000000000000000000000000000..66144748ce6f090a22fe148b361d9659a5d013d7 GIT binary patch literal 3801 zcmZ{nX*ARU_s4&!s3sw0MD`428#IJ0Wh|2=L`1_F3}R50Y%{j($}(X_LS+p@h{RZm zB*SFMHe<<}U6$?syGNtYKLFqh1%P=J0H_iH0PL0d+4Sbof(31$2M3tZ ziPXlU#O8xA(qWqgfkAA_QKH9>WOfPye#_itwDna`u=%f#Z6VH>6zbH0a7&Wb`L%IZ zJ`u^7@FY=jVaaQWE+!^Hnt!V;Z8Wq0aSSJp(tFbW9mfZo98}$wX1&;<{YH3x+V_}< z7R$-g!n9}gQF`CqQrfAckGpM|iUew=C90?H@D65$(%`&Oxi#!uN~vywLe6RdYV-wi zpKY%qXwdWXASt{OOb67@4~FhWA;8NcQL0!BE=G zN1TSz_++7L(!d3G?u)iQoJ9S7X|b0Ng&hbI!~|h-G1|qYR!diBb?O{TU4KDz1}L}e z>D=bvJ$c}vFy%`r`#<+HfA>q6MiP2Oe&Eps%=_YY?%VuJDWIlP3^p>4gRef|}n z^SiKxOXR!wM=8v-I$KwloX$(}Kir0O@@>CNEX~6zQ_d!PpJQv7>^D2!X*kr8_%tPb ze#{~!X6_%k!o0Oc;c6X?X)t`e$>!~5ZIPzt(z4F_Qxb{vnvI98G_D-6@{6{#Zot5} z;t{AlLu83>|FVZ>nmXAd`d!ELQsdSZJ=^fq%82NG!!KXyu7zTZwRhQr&cVkfiE2~R zv%U4cVOiBu&p#SrjjdQYjD#`-!Cj$EF*eXYseDY~L|owEDk|Q`adv$)pp$C&TqlsR zU#bqL!WZ9Glq8+`~-LYioR?y1J zoQ|?Y^Qu{{$c}=Y`jXYX`^Yu@QP4+qKC7C-Tl4bWGyYhwzbEAeY6DVqN?(l8+YdU$ zO|!g4>aye6OGuwyw}bqoduKGfesq*FBO6ko&$oZMW|z$jZtbHYRptD+6^VbIRd@f` z&ma;DFM?(;|cB6uOk3=jjgP zQnc$QZO@cgUaO;kV!l7vjGJkDv|D2+Z0*on$lcJRLuKq%=ok=^b}GM~Tk|h4zq|Q_ znGsJS6hQkugHADOtqi88I$Ed`K_9GBqv``c*<`ho360cs^<3Ziw$3|pPj0D2$X#$L zJR6i9L%Qqe)`zhDOlya?z!x<(5ZcL8p=Z&YC&nJZD_``v0_ZaP2%nSAf?$#bGb zQ@(}!<1F*Uc+r5grqFj2QRpJ5%dq0Ti4(xtnDm-pAKUvEVfNjNA`k%8nj~)F`!3+^ zH+{|FABMp<4R(rn@OT4Ttt^lf2xo(y`Wiysw01*(mPZz0?ZsZ48vx3LF>Cv_?dA}< z!TyPnGcoFxW3^+>2cnSuTH`o%&N0URC-l!p+otXbma~v$G^T=PCi!4HkuHtBgpN_by7$iVBuwfxtHCL-Q%38KN+ukYV`am0F=7d=WACv2y2?-0nqn6-G3{3 zNBM)3ng*VhsL5)+R9Pv~skL7feC6XOt_^fOf^WW(8TbVY>B$%Nfhxa_-5n&(dRu_ln+q#KrnTTB}u7}#OczJg>!!G z6ajT+yD6p|VEt?yTt7J+o~6Gna9iBz^|VUMD?7g z1Dg0W{o23ya0^4VUFdti1q1GgY z5oALc7Z+n%2S>G?4++skwRl*0x4x-dW{|cS)e!z-#K6qSK{A(8Rfm-2q>&~6OoGMm z{M?neOx7Fh@60=*Lay2biTYiZG}yvQT$NjNO|OAlcE$-kW2>U7e{Fe~w;8L(LNLE0 zz4K~6d6XRCbm;PA;w|!AfPv5JgHB5Gy7#CNdWN0LBt2T@8eSJOr&#-hW5i;iW>4wE zA0e3_D9>nWE0}rMUOO(FKHYo*m}nO)G&pl;@ONv-LN*}jb#zBhaAVsA&y*KuV~dtY zSag(S*Lk@rkyzgr+gvbO>hLX&QBsSR$O#18A_e5*Ph!E!ws%}X&gix zns^+zyiZeP&&i1+#oj&8s=QA%X3ZW@ZLUfPS%0r*{WCbI_cFy~;in9oI<;N6P~>1nKRStxD*(#c4;cWX4-df*$#);uy2&^Hf2R^ zV3K2F6X!1FHdKvO>VE#ZBdvB5I3Phd=j|Ax4&Nx}Sy{^`X;6{nr_x0(2 z^q9X#yy%lgYH1XoI8$`_4Q)d4{`R6-Pl@&-)r|?8awu z!_Q*o@$!X>zACcYLJg9IN#<+5Y?c0VUr!F%N&wG?ZP-C0Y-+{zIfEdkT7yP?#PH{jLd4eD#yFO~V^8nJGxG=Q-%@pae@1O+m zXf=J>^JBXRBCjazYQ8+iC|Rfuz>TfSzssJV_p7SqOulf5%Qa2#!k3R9L$H0*=(Q`S z03zw8(23zO=CbO)4hA45NLl5NzB#$CCs)BG@%h8!sATiPLf`>*CQJ6cn9j1e7 zJ$5SN9Je+igBD-?nh-c7P<6zfq$jZvANt%Hh667i~mrs77p^e-Y-U7d-j1>tHjgOu)$)k7l3<9_kL@($8{>V|Gr;Ufqv= zKGVye))l@EE^Pt|CxbV`G7OM>mK|>u^o%cQD)c)p-nR*n?e$g0hs?C(*~nnSuvGb2 zMD3*RbgpjXw!&)$c5WAi)TSH+I@?H~Vk;o61-TrZ)WxmM=8$8Lbddg-(fp*N-%i{| z$I8di-p5JR;fd1`00pRmqKv$}jDn)Myu2z@SrrD8f*?r<3HaYa nrNy%Qks$e>3qGz`CvP8ntk?f`rnG34M-G6{F@}?Gqr(3WK;&LA literal 0 HcmV?d00001 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 From dbb3628627d9e0a88141ff71b4f1e7c95895b496 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Fri, 1 Dec 2023 17:57:32 +0530 Subject: [PATCH 2/8] Wallet creation , Address validation , API response handling. --- .../extra/stellar/StellarCoinExtension.java | 62 ++++++++++++++++-- .../stellar/StellarcoinAddressValidator.java | 25 ++++++- .../wallets/stellar/StellarCoinWallet.java | 65 +++++++------------ .../stellar/wallets/stellar/consts/Const.java | 9 +++ .../stellar/wallets/stellar/dto/Wallet.java | 38 ++++++----- 5 files changed, 133 insertions(+), 66 deletions(-) create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/consts/Const.java 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 index b792493e4..a680eeb13 100644 --- 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 @@ -3,18 +3,21 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.StringTokenizer; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.HttpClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.generalbytes.batm.server.extensions.AbstractExtension; +import com.generalbytes.batm.server.extensions.ExtensionsUtil; 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); @@ -26,8 +29,53 @@ public String getName() { @Override public IWallet createWallet(String walletLogin, String tunnelPassword) { + if (walletLogin !=null && !walletLogin.trim().isEmpty()) { + try { + StringTokenizer st = new StringTokenizer(walletLogin, ":"); + String walletType = st.nextToken(); + + if ("startcoind".equalsIgnoreCase(walletType)) { + String apikey = st.nextToken(); + String hostname = st.nextToken(); + String requestBody="{\"testnet\": "+Const.TESTNET+"}"; + try { + URL url = new URL(hostname+Const.CREATEWALLET); + 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); + + 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; + + } - } + } 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 index 509a3ea0b..6a0150683 100644 --- 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 @@ -1,5 +1,6 @@ package com.generalbytes.batm.server.extensions.extra.stellar; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,8 +14,26 @@ public class StellarcoinAddressValidator implements ICryptoAddressValidator { @Override public boolean isAddressValid(String address) { - // TODO Auto-generated method stub - return false; + 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 @@ -28,5 +47,5 @@ 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 index 937aec651..c510710fa 100644 --- 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 @@ -2,13 +2,9 @@ import com.generalbytes.batm.common.currencies.CryptoCurrency; import com.generalbytes.batm.server.extensions.IWallet; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Amount; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Balance; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.CreateTransactionRequest; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Transaction; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Wallet; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Payment; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.WalletAddress; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.Transaction; +import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.Wallet; + import okhttp3.HttpUrl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,58 +17,47 @@ import java.util.List; import java.util.Set; -public class StellarCoinWallet implements IWallet{ - private static final Logger log = LoggerFactory.getLogger(StellarCoinWallet.class); - private static final String CRYPTO_CURRENCY = CryptoCurrency.XLM.getCode(); - - - public StellarCoinWallet(String protocol, String host, int port) { - String url = new HttpUrl.Builder().scheme(protocol).host(host).port(port).build().toString(); - - } - - - - +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 null; + + return wallet.getPubkey(); } @Override public Set getCryptoCurrencies() { - Set result = new HashSet<>(); - result.add(CRYPTO_CURRENCY); - return result; + Set result = new HashSet<>(); + result.add(CRYPTO_CURRENCY); + return result; } @Override public String getPreferredCryptoCurrency() { - return CRYPTO_CURRENCY; + return CRYPTO_CURRENCY; } @Override public BigDecimal getCryptoBalance(String cryptoCurrency) { - - return null; + + return null; } @Override public String sendCoins(String destinationAddress, BigDecimal amount, String cryptoCurrency, String description) { - - return null; - } - - - private CreateTransactionRequest createTransactionRequest(String destinationAddress, BigDecimal quantity) { - + return description; - 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..9745a96ec --- /dev/null +++ b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/consts/Const.java @@ -0,0 +1,9 @@ +package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.consts; + +public class Const { + + public static final String CREATEWALLET = "/wallet/create/"; + public static final String TRANSACTION = "/wallet/%s/sign-envelope/payment/"; + public static final String GETWALLET = "/wallet/%s/"; + public static final String TESTNET="true"; +} 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 index 378d431a2..2854ba412 100644 --- 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 @@ -2,21 +2,27 @@ public class Wallet { private String id; - private Balance balance; + private String pubkey; + private String secret; + 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 getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Balance getBalance() { - return balance; - } - - public void setBalance(Balance balance) { - this.balance = balance; - } } From 9d3223b90f594741cc89a38fc646a2308ff43134 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Tue, 9 Jan 2024 18:02:46 +0530 Subject: [PATCH 3/8] send transaction and balance --- .../extra/stellar/StellarCoinExtension.java | 7 +- .../wallets/stellar/StellarCoinWallet.java | 94 +++++++++++++++---- .../wallets/stellar/StellarWalletApi.java | 33 ------- .../stellar/wallets/stellar/consts/Const.java | 5 +- .../src/main/resources/batm-extensions.xml | 1 + 5 files changed, 87 insertions(+), 53 deletions(-) delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java 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 index a680eeb13..093a7758f 100644 --- 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 @@ -21,6 +21,7 @@ public class StellarCoinExtension extends AbstractExtension { private static final Logger log = LoggerFactory.getLogger(StellarCoinExtension.class); + String requestBody; @Override public String getName() { @@ -37,7 +38,11 @@ public IWallet createWallet(String walletLogin, String tunnelPassword) { if ("startcoind".equalsIgnoreCase(walletType)) { String apikey = st.nextToken(); String hostname = st.nextToken(); - String requestBody="{\"testnet\": "+Const.TESTNET+"}"; + String testnet = st.nextToken(); + if(testnet.equals("true")) + { + requestBody="{\"testnet\": "+testnet+"}"; + } try { URL url = new URL(hostname+Const.CREATEWALLET); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 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 index c510710fa..40ff2f1bd 100644 --- 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 @@ -1,21 +1,23 @@ package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar; -import com.generalbytes.batm.common.currencies.CryptoCurrency; -import com.generalbytes.batm.server.extensions.IWallet; -import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.Transaction; -import com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto.Wallet; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.math.BigDecimal; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URL; +import java.util.HashSet; +import java.util.Set; -import okhttp3.HttpUrl; +import org.apache.http.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import si.mazi.rescu.HttpStatusIOException; -import si.mazi.rescu.RestProxyFactory; -import java.math.BigDecimal; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +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.Wallet; +import com.google.logging.type.HttpRequest; public class StellarCoinWallet implements IWallet { private static final Logger log = LoggerFactory.getLogger(StellarCoinWallet.class); @@ -47,17 +49,75 @@ public String getPreferredCryptoCurrency() { @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 = "https://horizon-mainnet.stellar.org/accounts/" + 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) { - return 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}"; + String apitoken = Const.KEY; + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(paymentUrl)) + .header("Content-Type", "application/json").header("Authorization", apitoken) + .POST(ofString(requestBody)).build(); + HttpResponse httpResponse = httpClient.send(request, BodyHandlers.ofString()); + + if (httpResponse.statusCode() >= 200 && httpResponse.statusCode() < 300) { + String broadUrl = String.format(Const.BRODCAST, wallet.getId()); + String requestbodyenvelope = "{\"envelope\":\"" + envelope + "\"}"; + String apitoken = Const.KEY; + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(broadUrl)) + .header("Content-Type", "application/json").header("Authorization", apitoken) + .POST(ofString(requestBody)).build(); + HttpResponse httpResponse = httpClient.send(request, BodyHandlers.ofString()); + System.out.println("Response is " + httpResponse); + if (httpResponse.statusCode() >= 200 && httpResponse.statusCode() < 300) { + System.out.println("API Response:\n" + httpResponse.body()); + return httpResponse.body(); + } else { + System.out.println("Error Response Code: " + httpResponse.statusCode()); + System.out.println("Error Response Body: " + httpResponse.body()); + return null; + } + return httpResponse.body(); + } else { + + return null; + } - + } } diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java deleted file mode 100644 index 201194a20..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/StellarWalletApi.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.CreateTransactionRequest; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Transaction; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.Wallet; -import com.generalbytes.batm.server.extensions.extra.cardano.wallets.dto.WalletAddress; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.util.List; - - -@Path("/v2/wallets") -@Produces(MediaType.APPLICATION_JSON) -public interface StellarWalletApi { - @GET - @Path("/{walletId}") - Wallet getWallet(@PathParam("walletId") String walletId) throws IOException; - - @GET - @Path("/{walletId}/addresses") - List getWalletAddresses(@PathParam("walletId") String walletId) throws IOException; - - @POST - @Path("/{walletId}/transactions") - @Consumes(MediaType.APPLICATION_JSON) - Transaction createTransaction(@PathParam("walletId") String walletId, CreateTransactionRequest requestBody) throws IOException; -} 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 index 9745a96ec..18115ac19 100644 --- 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 @@ -1,9 +1,10 @@ package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.consts; public class Const { - + public static final String CREATEWALLET = "/wallet/create/"; public static final String TRANSACTION = "/wallet/%s/sign-envelope/payment/"; public static final String GETWALLET = "/wallet/%s/"; - public static final String TESTNET="true"; + public static final String BRODCAST="/wallet/%s/submit-transaction-onchain/"; + } diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index a59d9aa8f..e957e8b93 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -1429,6 +1429,7 @@ + XLM From d246989ecf0d9bacfb5e624ce4ed4496edcfb0d2 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Thu, 11 Jan 2024 17:18:07 +0530 Subject: [PATCH 4/8] Refining Transaction code --- .../extra/stellar/StellarCoinExtension.java | 2 +- .../wallets/stellar/StellarCoinWallet.java | 188 ++++++++++++------ .../stellar/wallets/stellar/consts/Const.java | 1 + .../stellar/wallets/stellar/dto/Amount.java | 31 --- .../stellar/wallets/stellar/dto/Balance.java | 31 --- .../stellar/dto/CreateTransactionRequest.java | 24 --- .../stellar/wallets/stellar/dto/Link.java | 16 ++ .../stellar/wallets/stellar/dto/Links.java | 44 ++++ .../stellar/wallets/stellar/dto/Payment.java | 22 -- .../wallets/stellar/dto/Preconditions.java | 16 ++ .../stellar/dto/SiginEnvelopeResponse.java | 86 ++++++++ .../wallets/stellar/dto/TimeBounds.java | 20 ++ .../wallets/stellar/dto/Transaction.java | 49 ----- .../stellar/dto/TransactionResponse.java | 102 ++++++++++ .../stellar/wallets/stellar/dto/Wallet.java | 7 + .../wallets/stellar/dto/WalletAddress.java | 40 ---- 16 files changed, 424 insertions(+), 255 deletions(-) delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Link.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Links.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Preconditions.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/SiginEnvelopeResponse.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TimeBounds.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java create mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/TransactionResponse.java delete mode 100644 server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java 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 index 093a7758f..9b321760d 100644 --- 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 @@ -59,7 +59,7 @@ public IWallet createWallet(String walletLogin, String tunnelPassword) { while ((line = reader.readLine()) != null) { Gson gson = new Gson(); Wallet wallet = gson.fromJson(reader.readLine(), Wallet.class); - + wallet.setApiKey(apikey); return new StellarCoinWallet(wallet); } } catch (IOException e) { 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 index 40ff2f1bd..8a05091a1 100644 --- 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 @@ -1,23 +1,29 @@ 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.URI; +import java.net.MalformedURLException; +import java.net.ProtocolException; import java.net.URL; import java.util.HashSet; import java.util.Set; -import org.apache.http.HttpResponse; 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.logging.type.HttpRequest; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; public class StellarCoinWallet implements IWallet { private static final Logger log = LoggerFactory.getLogger(StellarCoinWallet.class); @@ -50,73 +56,141 @@ public String getPreferredCryptoCurrency() { @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 = "https://horizon-mainnet.stellar.org/accounts/" + 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(); - } + 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}"; - String apitoken = Const.KEY; - HttpRequest request = HttpRequest.newBuilder().uri(URI.create(paymentUrl)) - .header("Content-Type", "application/json").header("Authorization", apitoken) - .POST(ofString(requestBody)).build(); - HttpResponse httpResponse = httpClient.send(request, BodyHandlers.ofString()); - - if (httpResponse.statusCode() >= 200 && httpResponse.statusCode() < 300) { - String broadUrl = String.format(Const.BRODCAST, wallet.getId()); - String requestbodyenvelope = "{\"envelope\":\"" + envelope + "\"}"; - String apitoken = Const.KEY; - HttpRequest request = HttpRequest.newBuilder().uri(URI.create(broadUrl)) - .header("Content-Type", "application/json").header("Authorization", apitoken) - .POST(ofString(requestBody)).build(); - HttpResponse httpResponse = httpClient.send(request, BodyHandlers.ofString()); - System.out.println("Response is " + httpResponse); - if (httpResponse.statusCode() >= 200 && httpResponse.statusCode() < 300) { - System.out.println("API Response:\n" + httpResponse.body()); - return httpResponse.body(); - } else { - System.out.println("Error Response Code: " + httpResponse.statusCode()); - System.out.println("Error Response Body: " + httpResponse.body()); - return null; + + 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()); } - return httpResponse.body(); - } else { - return null; + 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 index 18115ac19..f842f6c8d 100644 --- 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 @@ -6,5 +6,6 @@ public class Const { 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/Amount.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java deleted file mode 100644 index d4dac3ba0..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Amount.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; - -import java.math.BigDecimal; - -public class Amount { - private BigDecimal quantity; - private String unit; - - public BigDecimal getQuantity() { - return quantity; - } - - public void setQuantity(BigDecimal quantity) { - this.quantity = quantity; - } - - public String getUnit() { - return unit; - } - - public void setUnit(String unit) { - this.unit = unit; - } - - @Override - public String toString() { - return "Amount{" + "quantity=" + quantity + - ", unit='" + unit + '\'' + - '}'; - } -} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java deleted file mode 100644 index 967f31425..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Balance.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; - -public class Balance { - private Amount available; - private Amount reward; - private Amount total; - - public Amount getAvailable() { - return available; - } - - public void setAvailable(Amount available) { - this.available = available; - } - - public Amount getReward() { - return reward; - } - - public void setReward(Amount reward) { - this.reward = reward; - } - - public Amount getTotal() { - return total; - } - - public void setTotal(Amount total) { - this.total = total; - } -} diff --git a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java deleted file mode 100644 index a586b29f6..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/CreateTransactionRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; - -import java.util.List; - -public class CreateTransactionRequest { - private String passphrase; - private List payments; - - public String getPassphrase() { - return passphrase; - } - - public void setPassphrase(String passphrase) { - this.passphrase = passphrase; - } - - public List getPayments() { - return payments; - } - - public void setPayments(List payments) { - this.payments = payments; - } -} 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/Payment.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java deleted file mode 100644 index d63709fa0..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Payment.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; - -public class Payment { - private String address; - private Amount amount; - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public Amount getAmount() { - return amount; - } - - public void setAmount(Amount amount) { - this.amount = amount; - } -} 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/Transaction.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java deleted file mode 100644 index 96c0a9297..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/Transaction.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; - -public class Transaction { - private String id; - private Amount amount; - private Amount fee; - private String status; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Amount getAmount() { - return amount; - } - - public void setAmount(Amount amount) { - this.amount = amount; - } - - public Amount getFee() { - return fee; - } - - public void setFee(Amount fee) { - this.fee = fee; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - @Override - public String toString() { - return "Transaction{" + "id='" + id + '\'' + - ", amount=" + amount + - ", fee=" + fee + - ", status='" + status + '\'' + - '}'; - } -} 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 index 2854ba412..fe7977795 100644 --- 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 @@ -4,6 +4,7 @@ public class Wallet { private String id; private String pubkey; private String secret; + private String apiKey; public String getId() { return id; } @@ -22,6 +23,12 @@ public String getSecret() { 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/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java deleted file mode 100644 index aa3256d5e..000000000 --- a/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/wallets/stellar/dto/WalletAddress.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.generalbytes.batm.server.extensions.extra.stellar.wallets.stellar.dto; - -import com.fasterxml.jackson.annotation.JsonValue; - -public class WalletAddress { - private String id; - private State state; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public State getState() { - return state; - } - - public void setState(State state) { - this.state = state; - } - - public enum State { - USED("used"), - UNUSED("unused"); - - private final String value; - - State(String value) { - this.value = value; - } - - @JsonValue - public String getValue() { - return value; - } - } -} From ebc821a7323eebefc886c121b8829e6a69b954f1 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Thu, 11 Jan 2024 18:07:19 +0530 Subject: [PATCH 5/8] Stellar dependency fixes --- server_extensions_extra/build.gradle | 6 + .../extra/stellar/StellarCoinExtension.java | 104 ++++++++++-------- 2 files changed, 62 insertions(+), 48 deletions(-) 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/stellar/StellarCoinExtension.java b/server_extensions_extra/src/main/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarCoinExtension.java index 9b321760d..9f5b5e77c 100644 --- 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 @@ -11,9 +11,12 @@ 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.startcoin.StartcoinAddressValidator; 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; @@ -30,57 +33,62 @@ public String getName() { @Override public IWallet createWallet(String walletLogin, String tunnelPassword) { - if (walletLogin !=null && !walletLogin.trim().isEmpty()) { - try { - StringTokenizer st = new StringTokenizer(walletLogin, ":"); - String walletType = st.nextToken(); + if (walletLogin != null && !walletLogin.trim().isEmpty()) { + try { + StringTokenizer st = new StringTokenizer(walletLogin, ":"); + String walletType = st.nextToken(); - if ("startcoind".equalsIgnoreCase(walletType)) { - String apikey = st.nextToken(); - String hostname = st.nextToken(); - String testnet = st.nextToken(); - if(testnet.equals("true")) - { - requestBody="{\"testnet\": "+testnet+"}"; - } - try { - URL url = new URL(hostname+Const.CREATEWALLET); - 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); - return new StellarCoinWallet(wallet); - } - } catch (IOException e) { - e.printStackTrace(); - } - connection.disconnect(); + if ("startcoind".equalsIgnoreCase(walletType)) { + String apikey = st.nextToken(); + String hostname = st.nextToken(); + String testnet = st.nextToken(); + if (testnet.equals("true")) { + requestBody = "{\"testnet\": " + testnet + "}"; + } + try { + URL url = new URL(hostname + Const.CREATEWALLET); + 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); + 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); - } - } + } catch (IOException e) { + e.printStackTrace(); + } + + } + } catch (Exception e) { + ExtensionsUtil.logExtensionParamsException("createWallet", getClass().getSimpleName(), walletLogin, e); + } + } return null; - - } - + } + + @Override + public ICryptoAddressValidator createAddressValidator(String cryptoCurrency) { + if (CryptoCurrency.XLM.getCode().equalsIgnoreCase(cryptoCurrency)) { + return new StellarcoinAddressValidator(); + } + return null; + } } From be7bf8683a77729c7d779cd8e8871a99d8138d43 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Mon, 11 Mar 2024 11:58:44 +0530 Subject: [PATCH 6/8] adding rate source --- .../common/currencies/CryptoCurrency.java | 6 ++---- .../exchanges/binance/BinanceComExchange.java | 2 +- .../exchanges/binance/BinanceUsExchange.java | 2 +- .../exchanges/bitfinex/BitfinexExchange.java | 1 + .../exchanges/bitflyer/BitFlyerExchange.java | 1 + .../exchanges/coinbase/CoinbaseExchange.java | 2 +- .../exchanges/coinzix/CoinZixExchange.java | 2 +- .../coingecko/CoinGeckoRateSource.java | 1 + .../src/main/resources/batm-extensions.xml | 20 +++++++++++++++++++ 9 files changed, 29 insertions(+), 8 deletions(-) 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 0b88b87ad..d13408e2a 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 @@ -125,15 +125,13 @@ public enum CryptoCurrency { MUE("MonetaryUnit"), XPM("Primecoin"), ZPAE("ZelaaPayAE"), - + XLM("Stellar"), TBCH("test BCH"), TBTC("test BTC"), TETH("test ETH"), TLTC("test LTC"), TRMG("test RMG"), - TXRP("test XRP"), - XLM("Stellar") - ; + TXRP("test XRP"); private static Map cryptoCurrenciesUpperCase = new HashMap<>(); private static Map cryptoCurrencies = new LinkedHashMap<>(); 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/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index e957e8b93..a47168caf 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 From 1a21c2374e2523ef3352425c78ff5990bb306eaf Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Fri, 15 Mar 2024 15:53:56 +0530 Subject: [PATCH 7/8] Adding Stellar wallet support with secret key --- .../extensions/extra/stellar/StellarCoinExtension.java | 8 +++++--- .../extra/stellar/wallets/stellar/consts/Const.java | 2 +- .../src/main/resources/batm-extensions.xml | 9 ++------- 3 files changed, 8 insertions(+), 11 deletions(-) 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 index 9f5b5e77c..921985e71 100644 --- 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 @@ -38,15 +38,16 @@ public IWallet createWallet(String walletLogin, String tunnelPassword) { StringTokenizer st = new StringTokenizer(walletLogin, ":"); String walletType = st.nextToken(); - if ("startcoind".equalsIgnoreCase(walletType)) { + if ("bpventures.us".equalsIgnoreCase(walletType)) { + String secret = st.nextToken(); String apikey = st.nextToken(); String hostname = st.nextToken(); String testnet = st.nextToken(); if (testnet.equals("true")) { - requestBody = "{\"testnet\": " + testnet + "}"; + requestBody = "{\"testnet\":"+ testnet+" , \"secret\":"+secret+"}"; } try { - URL url = new URL(hostname + Const.CREATEWALLET); + URL url = new URL(hostname + Const.ADDWALLET); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); @@ -63,6 +64,7 @@ public IWallet createWallet(String walletLogin, String tunnelPassword) { Gson gson = new Gson(); Wallet wallet = gson.fromJson(reader.readLine(), Wallet.class); wallet.setApiKey(apikey); + wallet.setSecret(secret); return new StellarCoinWallet(wallet); } } catch (IOException e) { 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 index f842f6c8d..1c0f0e026 100644 --- 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 @@ -2,7 +2,7 @@ public class Const { - public static final String CREATEWALLET = "/wallet/create/"; + 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/"; diff --git a/server_extensions_extra/src/main/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index a47168caf..4d30f94b1 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -1446,17 +1446,12 @@ - + + XLM - - - - - XLM - This variant generates new addresses for each transaction and does not forward payments from temporary address From 847bf2cdf0e5183b9b6716eb5caefb2dd99fc30d Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Wed, 20 Mar 2024 17:34:29 +0530 Subject: [PATCH 8/8] Test added --- .../common/currencies/CryptoCurrency.java | 6 +++--- .../extra/stellar/StellarCoinExtension.java | 19 ++++++++++++++++- .../src/main/resources/batm-extensions.xml | 4 ++-- .../StellarcoinAddressValidatorTest.java | 21 +++++++++++++++++++ 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 server_extensions_extra/src/test/java/com/generalbytes/batm/server/extensions/extra/stellar/StellarcoinAddressValidatorTest.java 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 d13408e2a..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,8 +124,8 @@ public enum CryptoCurrency { NULS("NULS"), MUE("MonetaryUnit"), XPM("Primecoin"), - ZPAE("ZelaaPayAE"), - XLM("Stellar"), + ZPAE("ZelaaPayAE --test"), + TBCH("test BCH"), TBTC("test BTC"), TETH("test ETH"), 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 index 921985e71..d3d5631af 100644 --- 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 @@ -6,6 +6,8 @@ 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; @@ -16,7 +18,6 @@ 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.startcoin.StartcoinAddressValidator; 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; @@ -33,20 +34,26 @@ public String getName() { @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"); @@ -65,6 +72,7 @@ public IWallet createWallet(String walletLogin, String tunnelPassword) { 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) { @@ -87,10 +95,19 @@ public IWallet createWallet(String walletLogin, String tunnelPassword) { @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/resources/batm-extensions.xml b/server_extensions_extra/src/main/resources/batm-extensions.xml index 4d30f94b1..690c91619 100644 --- a/server_extensions_extra/src/main/resources/batm-extensions.xml +++ b/server_extensions_extra/src/main/resources/batm-extensions.xml @@ -1446,11 +1446,11 @@ - + - + XLM 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