Updated on 2026-08-14
This commit is contained in:
parent
21538aee90
commit
3fa19dbdc9
3 changed files with 104 additions and 66 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue