From 3fa19dbdc9cfad9861fdc84b46f3c5316b832a87 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 22 Feb 2019 16:35:25 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/data/network/AdaliteApi.java | 2 +- .../tangem/data/network/ServerApiAdalite.java | 92 +++++++++++-------- .../domain/wallet/cardano/CardanoEngine.java | 76 +++++++++------ 3 files changed, 104 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/com/tangem/data/network/AdaliteApi.java b/app/src/main/java/com/tangem/data/network/AdaliteApi.java index c8f84c7283..8af94a92c5 100644 --- a/app/src/main/java/com/tangem/data/network/AdaliteApi.java +++ b/app/src/main/java/com/tangem/data/network/AdaliteApi.java @@ -26,5 +26,5 @@ public interface AdaliteApi { @Headers("Content-Type: application/json") @POST(ServerApiAdalite.ADALITE_SEND) - Call adaliteSend(@Body AdaliteBody adaliteBody); + Call adaliteSend(@Body AdaliteBody adaliteBody); } diff --git a/app/src/main/java/com/tangem/data/network/ServerApiAdalite.java b/app/src/main/java/com/tangem/data/network/ServerApiAdalite.java index 0dd2db15c2..b057787494 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiAdalite.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiAdalite.java @@ -6,6 +6,8 @@ import com.tangem.data.network.model.AdaliteBody; import com.tangem.data.network.model.AdaliteResponse; import com.tangem.data.network.model.AdaliteResponseUtxo; +import java.util.List; + import androidx.annotation.NonNull; import retrofit2.Call; import retrofit2.Callback; @@ -38,6 +40,8 @@ public class ServerApiAdalite { void onSuccess(String method, AdaliteResponseUtxo adaliteResponseUtxo); + void onSuccess(String method, List listResponse); + void onFail(String method, String message); } @@ -58,9 +62,34 @@ public class ServerApiAdalite { AdaliteApi adaliteApi = retrofitAdalite.create(AdaliteApi.class); - if (method.equals(ADALITE_UNSPENT_OUTPUTS)) { - Call call = adaliteApi.adaliteUnspent("[\"" + wallet + "\"]"); - call.enqueue(new Callback() { + switch (method) { + case ADALITE_ADDRESS: + + Call addressCall = adaliteApi.adaliteAddress(wallet); + addressCall.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.code() == 200) { + requestsCount--; + 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()); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + responseListener.onFail(method, String.valueOf(t.getMessage())); + Log.e(TAG, "requestData " + method + " onFailure " + t.getMessage()); + } + }); + break; + + case ADALITE_UNSPENT_OUTPUTS: + Call outputsCall = adaliteApi.adaliteUnspent("[\"" + wallet + "\"]"); + outputsCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.code() == 200) { @@ -79,46 +108,37 @@ public class ServerApiAdalite { Log.e(TAG, "requestData " + method + " onFailure " + t.getMessage()); } }); - } else { - Call call; - switch (method) { - case ADALITE_ADDRESS: - call = adaliteApi.adaliteAddress(wallet); - break; + break; -// case ADALITE_TRANSACTION: -// call = adaliteApi.adaliteTransaction(tx); -// break; + case ADALITE_SEND: + Call sendCall = adaliteApi.adaliteSend(new AdaliteBody(tx)); + sendCall.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.code() == 200) { + requestsCount--; + 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()); + } + } - case ADALITE_SEND: - call = adaliteApi.adaliteSend(new AdaliteBody(tx)); - break; + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + responseListener.onFail(method, String.valueOf(t.getMessage())); + Log.e(TAG, "requestData " + method + " onFailure " + t.getMessage()); + } + }); + break; default: - call = adaliteApi.adaliteAddress(wallet); + responseListener.onFail(method, "undeclared method"); + Log.e(TAG, "requestData " + method + " onFailure - undeclared method"); break; } - call.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - if (response.code() == 200) { - requestsCount--; - 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()); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - responseListener.onFail(method, String.valueOf(t.getMessage())); - Log.e(TAG, "requestData " + method + " onFailure " + t.getMessage()); - } - }); - } } } diff --git a/app/src/main/java/com/tangem/domain/wallet/cardano/CardanoEngine.java b/app/src/main/java/com/tangem/domain/wallet/cardano/CardanoEngine.java index a71c452502..76ec313cdc 100644 --- a/app/src/main/java/com/tangem/domain/wallet/cardano/CardanoEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/cardano/CardanoEngine.java @@ -38,7 +38,10 @@ import co.nstant.in.cbor.CborDecoder; import co.nstant.in.cbor.CborEncoder; import co.nstant.in.cbor.CborException; import co.nstant.in.cbor.builder.ArrayBuilder; +import co.nstant.in.cbor.model.Array; +import co.nstant.in.cbor.model.ByteString; import co.nstant.in.cbor.model.DataItem; +import co.nstant.in.cbor.model.UnsignedInteger; import static com.tangem.domain.wallet.Base58.decodeBase58; import static com.tangem.domain.wallet.Base58.encodeBase58; @@ -151,21 +154,19 @@ public class CardanoEngine extends CoinEngine { ByteArrayInputStream bais = new ByteArrayInputStream(decAddress); try { - List list = new CborDecoder(bais).decode(); -// DataItem[] array = (DataItem[]) list.toArray(); TODO: Complete -// byte[] addressDataEncoded = (byte[]) array[0].getTag().getValue(); -// int crc32Checksum = (int) array[1].getTag().getValue(); -// CRC32 Checksum = new CRC32(); -// Checksum.update(); -// if (crc32Checksum !== CRC32(addressDataEncoded)) { -// return false -// } - } catch (CborException e) { - return false; - } + List addressList = ((Array)new CborDecoder(bais).decode().get(0)).getDataItems(); + byte[] addressBytes = ((ByteString)addressList.get(0)).getBytes(); + long addressChecksum = ((UnsignedInteger)addressList.get(1)).getValue().longValue(); + final CRC32 crc32 = new CRC32(); + crc32.update(addressBytes); + long calculatedChecksum = crc32.getValue(); - if (address.length() < 30) { //TODO: Check + if (addressChecksum != calculatedChecksum) { + return false; + } + + } catch (Exception e) { return false; } @@ -545,16 +546,21 @@ public class CardanoEngine extends CoinEngine { DataItem witnessBodyItem = new CborBuilder().add(witnessBody).build().get(0); witnessBodyItem.setTag(24); + //array of witnesses + CborBuilder witnessBuilder = new CborBuilder(); + ArrayBuilder witnessArrayBuilder = witnessBuilder.addArray(); + //witness type + witness body + for (CardanoData.UnspentOutput utxo : coinData.getUnspentOutputs()) { + witnessArrayBuilder + .addArray() + .add(0) + .add(witnessBodyItem) + .end(); + } + baos.reset(); - new CborEncoder(baos).encode(new CborBuilder() - .addArray() - .addArray() - .add(0) - .add(witnessBodyItem) - .end() - .end() - .build()); + new CborEncoder(baos).encode(witnessBuilder.build()); byte[] witness = baos.toByteArray(); baos.reset(); @@ -569,7 +575,7 @@ public class CardanoEngine extends CoinEngine { // .build()); byte[] txForSend = baos.toByteArray(); notifyOnNeedSendTransaction(txForSend); -// String hex = BTCUtils.toHex(txForSend); + //String hex = BTCUtils.toHex(txForSend); return txForSend; } }; @@ -630,6 +636,12 @@ public class CardanoEngine extends CoinEngine { } } + @Override + public void onSuccess(String method, List listResponse) { + Log.e(TAG, "Wrong response type for requestBalanceAndUnspentTransactions"); + ctx.setError("Wrong response type for requestBalanceAndUnspentTransactions"); + } + @Override public void onFail(String method, String message) { Log.i(TAG, "onFail: " + method + " " + message); @@ -666,8 +678,20 @@ public class CardanoEngine extends CoinEngine { final ServerApiAdalite.ResponseListener responseListener = new ServerApiAdalite.ResponseListener() { @Override public void onSuccess(String method, AdaliteResponse adaliteResponse) { + Log.e(TAG, "Wrong response type for requestSendTransaction"); + ctx.setError("Wrong response type for requestSendTransaction"); + } + + @Override + public void onSuccess(String method, AdaliteResponseUtxo adaliteResponseUtxo) { + Log.e(TAG, "Wrong response type for requestSendTransaction"); + ctx.setError("Wrong response type for requestSendTransaction"); + } + + @Override + public void onSuccess(String method, List listResponse) { if (method.equals(ServerApiAdalite.ADALITE_SEND)) { - String resultString = adaliteResponse.toString(); + String resultString = listResponse.toString(); try { if (resultString.isEmpty()) { ctx.setError("No response from node"); @@ -689,12 +713,6 @@ public class CardanoEngine extends CoinEngine { } } - @Override - public void onSuccess(String method, AdaliteResponseUtxo adaliteResponseUtxo) { - Log.e(TAG, "Wrong response type for ADALITE_SEND"); - ctx.setError("Wrong response type for ADALITE_SEND"); - } - @Override public void onFail(String method, String message) { if (!serverApiAdalite.isRequestsSequenceCompleted()) {