diff --git a/app/src/main/java/com/tangem/data/network/BlockcypherApi.java b/app/src/main/java/com/tangem/data/network/BlockcypherApi.java index d8de09d725..8bba6dfdee 100644 --- a/app/src/main/java/com/tangem/data/network/BlockcypherApi.java +++ b/app/src/main/java/com/tangem/data/network/BlockcypherApi.java @@ -15,13 +15,13 @@ import retrofit2.http.Query; public interface BlockcypherApi { @GET(Server.ApiBlockcypher.Method.MAIN) - Call blockcypherMain(@Path("blockchain") String blockchain, @Path("network") String network); + Call blockcypherMain(@Path("blockchain") String blockchain, @Path("network") String network, @Query("token") String token); @GET(Server.ApiBlockcypher.Method.ADDRESS) - Call blockcypherAddress(@Path("blockchain") String blockchain, @Path("network") String network, @Path("address") String address); + Call blockcypherAddress(@Path("blockchain") String blockchain, @Path("network") String network, @Path("address") String address, @Query("token") String token); @GET(Server.ApiBlockcypher.Method.TXS) - Call blockcypherTxs(@Path("blockchain") String blockchain, @Path("network") String network, @Path("txHash") String txHash); + Call blockcypherTxs(@Path("blockchain") String blockchain, @Path("network") String network, @Path("txHash") String txHash, @Query("token") String token); @Headers("Content-Type: application/json") @POST(Server.ApiBlockcypher.Method.PUSH) diff --git a/app/src/main/java/com/tangem/data/network/ServerApiBlockcypher.java b/app/src/main/java/com/tangem/data/network/ServerApiBlockcypher.java index 6b8bc2a6f1..88e38c3037 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiBlockcypher.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiBlockcypher.java @@ -32,8 +32,9 @@ public class ServerApiBlockcypher { return requestsCount <= 0; } - private ResponseListener responseListener; + private String apiKey = null; + private ResponseListener responseListener; private TxResponseListener txResponseListener; public interface ResponseListener { @@ -71,17 +72,24 @@ public class ServerApiBlockcypher { switch (method) { case BLOCKCYPHER_ADDRESS: - Call addressCall = blockcypherApi.blockcypherAddress(blockchain, network, wallet); + Call addressCall = blockcypherApi.blockcypherAddress(blockchain, network, wallet, apiKey); addressCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { requestsCount--; - if (response.code() == 200) { - responseListener.onSuccess(method, response.body()); - Log.i(TAG, "requestData " + method + " onResponse " + response.code()); - } else { - responseListener.onFail(method, String.valueOf(response.code())); - Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + switch (response.code()) { + case 200: + responseListener.onSuccess(method, response.body()); + Log.i(TAG, "requestData " + method + " onResponse " + response.code()); + break; + case 429: + apiKey = getRandomApiKey(); + requestData(blockchainID, method, wallet, tx); + break; + default: + responseListener.onFail(method, String.valueOf(response.code())); + Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + break; } } @@ -95,17 +103,24 @@ public class ServerApiBlockcypher { break; case BLOCKCYPHER_FEE: - Call feeCall = blockcypherApi.blockcypherMain(blockchain, network); + Call feeCall = blockcypherApi.blockcypherMain(blockchain, network, apiKey); feeCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { requestsCount--; - if (response.code() == 200) { - responseListener.onSuccess(method, response.body()); - Log.i(TAG, "requestData " + method + " onResponse " + response.code()); - } else { - responseListener.onFail(method, String.valueOf(response.code())); - Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + switch (response.code()) { + case 200: + responseListener.onSuccess(method, response.body()); + Log.i(TAG, "requestData " + method + " onResponse " + response.code()); + break; + case 429: + apiKey = getRandomApiKey(); + requestData(blockchainID, method, wallet, tx); + break; + default: + responseListener.onFail(method, String.valueOf(response.code())); + Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + break; } } @@ -119,17 +134,24 @@ public class ServerApiBlockcypher { break; case BLOCKCYPHER_TXS: - Call txsCall = blockcypherApi.blockcypherTxs(blockchain, network, tx); + Call txsCall = blockcypherApi.blockcypherTxs(blockchain, network, tx, apiKey); txsCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call,@NonNull Response response) { requestsCount--; - if (response.code() == 200) { - txResponseListener.onSuccess(response.body()); - Log.i(TAG, "requestData " + method + " onResponse " + response.code()); - } else { - txResponseListener.onFail(String.valueOf(response.code())); - Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + switch (response.code()) { + case 200: + txResponseListener.onSuccess(response.body()); + Log.i(TAG, "requestData " + method + " onResponse " + response.code()); + break; + case 429: + apiKey = getRandomApiKey(); + requestData(blockchainID, method, wallet, tx); + break; + default: + txResponseListener.onFail(String.valueOf(response.code())); + Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + break; } } @@ -143,19 +165,24 @@ public class ServerApiBlockcypher { break; case BLOCKCYPHER_SEND: - BlockcypherToken blockcypherToken = BlockcypherToken.values()[new Random().nextInt(BlockcypherToken.values().length)]; - - Call sendCall = blockcypherApi.blockcypherPush(blockchain, network, new BlockcypherBody(tx), blockcypherToken.getToken()); + Call sendCall = blockcypherApi.blockcypherPush(blockchain, network, new BlockcypherBody(tx), apiKey); sendCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { requestsCount--; - if (response.code() == 201) { - responseListener.onSuccess(method, response.body()); - Log.i(TAG, "requestData " + method + " onResponse " + response.code()); - } else { - responseListener.onFail(method, String.valueOf(response.code())); - Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + switch (response.code()) { + case 201: + responseListener.onSuccess(method, response.body()); + Log.i(TAG, "requestData " + method + " onResponse " + response.code()); + break; + case 429: + apiKey = getRandomApiKey(); + requestData(blockchainID, method, wallet, tx); + break; + default: + responseListener.onFail(method, String.valueOf(response.code())); + Log.e(TAG, "requestData " + method + " onResponse " + response.code()); + break; } } @@ -175,4 +202,9 @@ public class ServerApiBlockcypher { break; } } + + private String getRandomApiKey() { + return BlockcypherToken + .values()[new Random().nextInt(BlockcypherToken.values().length)].getToken(); + } }