diff --git a/app/src/main/java/com/tangem/data/network/Server.java b/app/src/main/java/com/tangem/data/network/Server.java index daf83d7554..82bece6c7d 100644 --- a/app/src/main/java/com/tangem/data/network/Server.java +++ b/app/src/main/java/com/tangem/data/network/Server.java @@ -39,6 +39,7 @@ public class Server { public static class Method { public static final String ADDRESS_BALANCE = "api/v2/get_address_balance/{network}/{address}"; public static final String UNSPENT_TX = "api/v2/get_tx_unspent/{network}/{address}"; + public static final String GET_TX = "api/v2/get_tx/{network}/{txid}"; public static final String SEND_TRANSACTION = "api/v2/send_tx/{network}"; } } diff --git a/app/src/main/java/com/tangem/data/network/ServerApiSoChain.java b/app/src/main/java/com/tangem/data/network/ServerApiSoChain.java index df8cac1af1..2f4d171a6f 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiSoChain.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiSoChain.java @@ -24,6 +24,7 @@ public class ServerApiSoChain { return requestsCount <= 0; } + public interface AddressInfoListener { void onSuccess(SoChain.Response.AddressBalance response); @@ -50,6 +51,20 @@ public class ServerApiSoChain { sendTxListener = listener; } + + public interface TransactionInfoListener { + void onSuccess(SoChain.Response.GetTx response); + + void onFail(String message); + } + + private TransactionInfoListener txInfoListener; + + public void setTransactionInfoListener(TransactionInfoListener listener) { + txInfoListener=listener; + } + + private String getNetwork(Blockchain blockchain) throws Exception { switch (blockchain) { case Bitcoin: @@ -140,4 +155,29 @@ public class ServerApiSoChain { }); } + public void requestTransactionInfo(Blockchain blockchain, String txId) throws Exception { + requestsCount++; + SoChainApi api = App.Companion.getNetworkComponent().getRetrofitSoChain().create(SoChainApi.class); + + Call call = api.getTx(getNetwork(blockchain), txId); + call.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + Log.i(TAG, "requestAddressBalance onResponse " + response.code()); + if (response.code() == 200) { + requestsCount--; + txInfoListener.onSuccess(response.body()); + } else { + txInfoListener.onFail(String.valueOf(response.code())); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e(TAG, "requestAddressBalance onFailure " + t.getMessage()); + txInfoListener.onFail(String.valueOf(t.getMessage())); + } + }); + } + } diff --git a/app/src/main/java/com/tangem/data/network/SoChainApi.java b/app/src/main/java/com/tangem/data/network/SoChainApi.java index ddb982d09a..ea1f3fb89d 100644 --- a/app/src/main/java/com/tangem/data/network/SoChainApi.java +++ b/app/src/main/java/com/tangem/data/network/SoChainApi.java @@ -17,6 +17,9 @@ public interface SoChainApi { @GET(Server.ApiSoChain.Method.UNSPENT_TX) Call getUnspentTx(@Path("network") String network, @Path("address") String address); + @GET(Server.ApiSoChain.Method.GET_TX) + Call getTx(@Path("network") String network, @Path("txid") String txId); + @Headers("Content-Type: application/json") @POST(Server.ApiSoChain.Method.SEND_TRANSACTION) Call sendTransaction(@Path("network") String network, @Body SoChain.Request.SendTx body); diff --git a/app/src/main/java/com/tangem/data/network/model/SoChain.kt b/app/src/main/java/com/tangem/data/network/model/SoChain.kt index cc42d6204a..65a7103689 100644 --- a/app/src/main/java/com/tangem/data/network/model/SoChain.kt +++ b/app/src/main/java/com/tangem/data/network/model/SoChain.kt @@ -52,5 +52,19 @@ class SoChain { var status: String? = null var data: Data? = null } + + class GetTx { + class Data { + // restricted data + var network: String? = null + var address: String? = null + var txid: String? = null + var tx_hex: String? = null + } + + var status: String? = null + var data: Data? = null + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java index 6e2ea3aef5..291eb989b5 100644 --- a/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/wallet/btc/BtcEngine.java @@ -758,7 +758,7 @@ public class BtcEngine extends CoinEngine { Log.i(TAG, "onSuccess: " + electrumRequest.getMethod()); try { if (electrumRequest.getResultString() != null) { - App.pendingTransactionsStorage.removeTransaction(ctx.getCard(), electrumRequest.txHash); + App.pendingTransactionsStorage.removeTransaction(ctx.getCard(), electrumRequest.txHash); //TODO Need remove transaction by RAW HEX } } catch (Exception e) { @@ -789,7 +789,43 @@ public class BtcEngine extends CoinEngine { serverApiElectrum.requestData(ctx, ElectrumRequest.getTransaction(ctx.getCoinData().getWallet(), txHash)); } } else { - throw new Exception("Not supported!"); + ServerApiSoChain serverApi = new ServerApiSoChain(); + + ServerApiSoChain.TransactionInfoListener listener = new ServerApiSoChain.TransactionInfoListener() { + @Override + public void onSuccess(SoChain.Response.GetTx response) { + Log.i(TAG, "onSuccess: GetTx"); + try { + if (response.getData() != null && response.getData().getTx_hex() != null && response.getData().getTxid() != null) { + App.pendingTransactionsStorage.removeTransaction(ctx.getCard(), response.getData().getTx_hex()); + } + + } catch (Exception e) { + Log.e(TAG, "onFail: GetTx" + response); + } + if (serverApi.isRequestsSequenceCompleted()) { + blockchainRequestsCallbacks.onComplete(!ctx.hasError()); + } else { + blockchainRequestsCallbacks.onProgress(); + } + } + + @Override + public void onFail(String message) { + Log.i(TAG, "onFail: GetTx " + message); + if (serverApi.isRequestsSequenceCompleted()) { + blockchainRequestsCallbacks.onComplete(false);//serverApiElectrum.isErrorOccurred(), serverApiElectrum.getError()); + } else { + blockchainRequestsCallbacks.onProgress(); + } + } + }; + + serverApi.setTransactionInfoListener(listener); + for (PendingTransactionsStorage.TransactionInfo pendingTx : App.pendingTransactionsStorage.getTransactions(ctx.getCard()).getTransactions()) { + String txId = BTCUtils.toHex(BTCUtils.reverse(CryptoUtil.doubleSha256(BTCUtils.fromHex(pendingTx.getTx())))); + serverApi.requestTransactionInfo(ctx.getBlockchain(), txId); + } } } }