Updated on 2026-08-14

This commit is contained in:
Tangem 2019-02-22 16:35:25 +03:00
parent 21538aee90
commit 3fa19dbdc9
3 changed files with 104 additions and 66 deletions

View file

@ -26,5 +26,5 @@ public interface AdaliteApi {
@Headers("Content-Type: application/json")
@POST(ServerApiAdalite.ADALITE_SEND)
Call<AdaliteResponse> adaliteSend(@Body AdaliteBody adaliteBody);
Call<List> adaliteSend(@Body AdaliteBody adaliteBody);
}

View file

@ -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<AdaliteResponseUtxo> call = adaliteApi.adaliteUnspent("[\"" + wallet + "\"]");
call.enqueue(new Callback<AdaliteResponseUtxo>() {
switch (method) {
case ADALITE_ADDRESS:
Call<AdaliteResponse> addressCall = adaliteApi.adaliteAddress(wallet);
addressCall.enqueue(new Callback<AdaliteResponse>() {
@Override
public void onResponse(@NonNull Call<AdaliteResponse> call, @NonNull Response<AdaliteResponse> 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<AdaliteResponse> 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<AdaliteResponseUtxo> outputsCall = adaliteApi.adaliteUnspent("[\"" + wallet + "\"]");
outputsCall.enqueue(new Callback<AdaliteResponseUtxo>() {
@Override
public void onResponse(@NonNull Call<AdaliteResponseUtxo> call, @NonNull Response<AdaliteResponseUtxo> response) {
if (response.code() == 200) {
@ -79,46 +108,37 @@ public class ServerApiAdalite {
Log.e(TAG, "requestData " + method + " onFailure " + t.getMessage());
}
});
} else {
Call<AdaliteResponse> call;
switch (method) {
case ADALITE_ADDRESS:
call = adaliteApi.adaliteAddress(wallet);
break;
break;
// case ADALITE_TRANSACTION:
// call = adaliteApi.adaliteTransaction(tx);
// break;
case ADALITE_SEND:
Call<List> sendCall = adaliteApi.adaliteSend(new AdaliteBody(tx));
sendCall.enqueue(new Callback<List>() {
@Override
public void onResponse(@NonNull Call<List> call, @NonNull Response<List> 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<List> 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<AdaliteResponse>() {
@Override
public void onResponse(@NonNull Call<AdaliteResponse> call, @NonNull Response<AdaliteResponse> 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<AdaliteResponse> call, @NonNull Throwable t) {
responseListener.onFail(method, String.valueOf(t.getMessage()));
Log.e(TAG, "requestData " + method + " onFailure " + t.getMessage());
}
});
}
}
}

View file

@ -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<DataItem> 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<DataItem> 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<CborBuilder> 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()) {