Updated on 2026-08-14
This commit is contained in:
parent
a6e6ffab96
commit
ff22469cde
20 changed files with 12 additions and 630 deletions
|
|
@ -96,18 +96,6 @@ public class ElectrumRequest {
|
|||
return request;
|
||||
}
|
||||
|
||||
public static ElectrumRequest getHeader(String wallet, String height) {
|
||||
ElectrumRequest request = new ElectrumRequest();
|
||||
try {
|
||||
request.walletAddress = wallet;
|
||||
request.jsRequestData = new JSONObject("{ \"method\":\"" + METHOD_GetHeader + "\", \"params\":[\"" + height + "\"] }");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
request.error = e.toString();
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
public static ElectrumRequest listUnspent(String wallet) {
|
||||
ElectrumRequest request = new ElectrumRequest();
|
||||
try {
|
||||
|
|
@ -133,18 +121,6 @@ public class ElectrumRequest {
|
|||
return request;
|
||||
}
|
||||
|
||||
public static ElectrumRequest listHistory(String wallet) {
|
||||
ElectrumRequest request = new ElectrumRequest();
|
||||
try {
|
||||
request.walletAddress = wallet;
|
||||
request.jsRequestData = new JSONObject("{ \"method\":\"" + METHOD_GetHistory + "\", \"params\":[\"" + wallet + "\"] }");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
request.error = e.toString();
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
public static ElectrumRequest getTransaction(String wallet, String tx_hash) {
|
||||
ElectrumRequest request = new ElectrumRequest();
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import android.util.Log;
|
|||
import com.tangem.data.network.request.InfuraRequest;
|
||||
import com.tangem.data.network.task.InfuraTask;
|
||||
import com.tangem.domain.wallet.Blockchain;
|
||||
import com.tangem.domain.wallet.LastSignStorage;
|
||||
import com.tangem.presentation.fragment.LoadedWallet;
|
||||
|
||||
import org.json.JSONException;
|
||||
|
|
@ -92,7 +91,6 @@ public class ETHRequestTask extends InfuraTask {
|
|||
JSONObject msg = request.getAnswer();
|
||||
JSONObject err = msg.getJSONObject("error");
|
||||
hashTX = err.getString("message");
|
||||
LastSignStorage.setLastMessage(loadedWallet.getCard().getWallet(), hashTX);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -100,8 +98,6 @@ public class ETHRequestTask extends InfuraTask {
|
|||
hashTX = hashTX.substring(2);
|
||||
}
|
||||
BigInteger bigInt = new BigInteger(hashTX, 16); //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(loadedWallet.getCard().getWallet());
|
||||
LastSignStorage.setLastMessage(loadedWallet.getCard().getWallet(), "");
|
||||
Log.e("TX_RESULT", hashTX);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,14 @@
|
|||
package com.tangem.data.network.task.loaded_wallet;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
|
||||
import com.tangem.data.network.request.ElectrumRequest;
|
||||
import com.tangem.data.network.task.ElectrumTask;
|
||||
import com.tangem.domain.wallet.BitcoinException;
|
||||
import com.tangem.domain.wallet.CoinEngine;
|
||||
import com.tangem.domain.wallet.CoinEngineFactory;
|
||||
import com.tangem.domain.wallet.LastSignStorage;
|
||||
import com.tangem.domain.wallet.SharedData;
|
||||
import com.tangem.domain.wallet.TangemCard;
|
||||
import com.tangem.presentation.fragment.LoadedWallet;
|
||||
import com.tangem.util.BTCUtils;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
|
@ -20,8 +16,6 @@ import org.json.JSONObject;
|
|||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class UpdateWalletInfoTask extends ElectrumTask {
|
||||
|
|
@ -103,17 +97,6 @@ public class UpdateWalletInfoTask extends ElectrumTask {
|
|||
else if (request.isMethod(ElectrumRequest.METHOD_SendTransaction)) {
|
||||
try {
|
||||
String hashTX = request.getResultString();
|
||||
try {
|
||||
LastSignStorage.setLastMessage(loadedWallet.getCard().getWallet(), hashTX);
|
||||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X"))
|
||||
hashTX = hashTX.substring(2);
|
||||
BigInteger bigInt = new BigInteger(hashTX, 16); //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(loadedWallet.getCard().getWallet());
|
||||
LastSignStorage.setLastMessage(loadedWallet.getCard().getWallet(), "");
|
||||
// Log.e("TX_RESULT", hashTX);
|
||||
} catch (Exception e) {
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
|
|
@ -150,7 +133,7 @@ public class UpdateWalletInfoTask extends ElectrumTask {
|
|||
engine.switchNode(loadedWallet.getCard());
|
||||
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(loadedWallet, nodeAddress, nodePort);
|
||||
// loadedWallet.updateTasks.add(updateWalletInfoTask);
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.getHeader(mWalletAddress, String.valueOf(height)), ElectrumRequest.getTransaction(mWalletAddress, hash));
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.getTransaction(mWalletAddress, hash));
|
||||
}
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
|
|
@ -159,61 +142,6 @@ public class UpdateWalletInfoTask extends ElectrumTask {
|
|||
}
|
||||
}
|
||||
|
||||
// get history
|
||||
else if (request.isMethod(ElectrumRequest.METHOD_GetHistory)) {
|
||||
try {
|
||||
String mWalletAddress = request.getParams().getString(0);
|
||||
JSONArray jsHistoryArray = request.getResultArray();
|
||||
try {
|
||||
loadedWallet.getCard().getHistoryTransactions().clear();
|
||||
for (int i = 0; i < jsHistoryArray.length(); i++) {
|
||||
JSONObject jsUnspent = jsHistoryArray.getJSONObject(i);
|
||||
TangemCard.HistoryTransaction trHistory = new TangemCard.HistoryTransaction();
|
||||
trHistory.txID = jsUnspent.getString("tx_hash");
|
||||
trHistory.Height = jsUnspent.getInt("height");
|
||||
loadedWallet.getCard().getHistoryTransactions().add(trHistory);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
}
|
||||
|
||||
for (int i = 0; i < jsHistoryArray.length(); i++) {
|
||||
JSONObject jsUnspent = jsHistoryArray.getJSONObject(i);
|
||||
Integer height = jsUnspent.getInt("height");
|
||||
String hash = jsUnspent.getString("tx_hash");
|
||||
if (height != -1) {
|
||||
String nodeAddress = engine.getNode(loadedWallet.getCard());
|
||||
int nodePort = engine.getNodePort(loadedWallet.getCard());
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(loadedWallet, nodeAddress, nodePort);
|
||||
// loadedWallet.updateTasks.add(updateWalletInfoTask);
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.getHeader(mWalletAddress, String.valueOf(height)), ElectrumRequest.getTransaction(mWalletAddress, hash));
|
||||
}
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
}
|
||||
}
|
||||
|
||||
// get header
|
||||
else if (request.isMethod(ElectrumRequest.METHOD_GetHeader)) {
|
||||
try {
|
||||
JSONObject jsHeader = request.getResult();
|
||||
try {
|
||||
loadedWallet.getCard().getHaedersInfo();
|
||||
loadedWallet.getCard().UpdateHeaderInfo(new TangemCard.HeaderInfo(jsHeader.getInt("block_height"), jsHeader.getInt("timestamp")));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
}
|
||||
}
|
||||
|
||||
// get transaction
|
||||
else if (request.isMethod(ElectrumRequest.METHOD_GetTransaction)) {
|
||||
try {
|
||||
|
|
@ -224,27 +152,6 @@ public class UpdateWalletInfoTask extends ElectrumTask {
|
|||
if (tx.txID.equals(txHash))
|
||||
tx.Raw = raw;
|
||||
}
|
||||
List<TangemCard.HistoryTransaction> listHTx = loadedWallet.getCard().getHistoryTransactions();
|
||||
for (TangemCard.HistoryTransaction tx : listHTx) {
|
||||
if (tx.txID.equals(txHash)) {
|
||||
tx.Raw = raw;
|
||||
try {
|
||||
ArrayList<byte[]> prevHashes = BTCUtils.getPrevTX(raw);
|
||||
boolean isOur = false;
|
||||
for (byte[] hash : prevHashes) {
|
||||
String checkID = BTCUtils.toHex(hash);
|
||||
for (TangemCard.HistoryTransaction txForCheck : listHTx) {
|
||||
if (txForCheck.txID.equals(checkID))
|
||||
isOur = true;
|
||||
}
|
||||
}
|
||||
tx.isInput = !isOur;
|
||||
} catch (BitcoinException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
Log.e("TX", raw);
|
||||
}
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
engine.switchNode(loadedWallet.getCard());
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import com.tangem.data.network.task.ElectrumTask;
|
|||
import com.tangem.domain.wallet.Blockchain;
|
||||
import com.tangem.domain.wallet.CoinEngine;
|
||||
import com.tangem.domain.wallet.CoinEngineFactory;
|
||||
import com.tangem.domain.wallet.LastSignStorage;
|
||||
import com.tangem.domain.wallet.SharedData;
|
||||
import com.tangem.domain.wallet.TangemCard;
|
||||
import com.tangem.presentation.activity.SendTransactionActivity;
|
||||
|
|
@ -81,13 +80,9 @@ public class ConnectTask extends ElectrumTask {
|
|||
String hashTX = request.getResultString();
|
||||
|
||||
try {
|
||||
LastSignStorage.setLastMessage(sendTransactionActivity.getCard().getWallet(), hashTX);
|
||||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X")) {
|
||||
hashTX = hashTX.substring(2);
|
||||
}
|
||||
BigInteger bigInt = new BigInteger(hashTX, 16); //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(sendTransactionActivity.getCard().getWallet());
|
||||
LastSignStorage.setLastMessage(sendTransactionActivity.getCard().getWallet(), "");
|
||||
Log.e("TX_RESULT", hashTX);
|
||||
sendTransactionActivity.finishWithSuccess();
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import android.util.Log;
|
|||
import com.tangem.data.network.request.InfuraRequest;
|
||||
import com.tangem.data.network.task.InfuraTask;
|
||||
import com.tangem.domain.wallet.Blockchain;
|
||||
import com.tangem.domain.wallet.LastSignStorage;
|
||||
import com.tangem.presentation.activity.SendTransactionActivity;
|
||||
|
||||
import org.json.JSONException;
|
||||
|
|
@ -41,7 +40,6 @@ public class ETHRequestTask extends InfuraTask {
|
|||
JSONObject msg = request.getAnswer();
|
||||
JSONObject err = msg.getJSONObject("error");
|
||||
hashTX = err.getString("message");
|
||||
LastSignStorage.setLastMessage(sendTransactionActivity.getCard().getWallet(), hashTX);
|
||||
Log.e("Send_TX_Error:", hashTX);
|
||||
sendTransactionActivity.finishWithError(hashTX);
|
||||
return;
|
||||
|
|
@ -51,9 +49,6 @@ public class ETHRequestTask extends InfuraTask {
|
|||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X")) {
|
||||
hashTX = hashTX.substring(2);
|
||||
}
|
||||
BigInteger bigInt = new BigInteger(hashTX, 16); //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(sendTransactionActivity.getCard().getWallet());
|
||||
LastSignStorage.setLastMessage(sendTransactionActivity.getCard().getWallet(), "");
|
||||
BigInteger nonce = sendTransactionActivity.getCard().getConfirmedTXCount();
|
||||
nonce.add(BigInteger.valueOf(1));
|
||||
sendTransactionActivity.getCard().setConfirmedTXCount(nonce);
|
||||
|
|
|
|||
|
|
@ -369,9 +369,6 @@ public class BtcCashEngine extends CoinEngine {
|
|||
// TODO slice signFromCard to hashes.length parts
|
||||
}
|
||||
|
||||
LastSignStorage.setLastSignDate(mCard.getWallet(), new Date());
|
||||
|
||||
|
||||
for (int i = 0; i < unspentOutputs.size(); ++i) {
|
||||
BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0 + i * 64, 32 + i * 64));
|
||||
BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64));
|
||||
|
|
|
|||
|
|
@ -417,9 +417,6 @@ public class BtcEngine extends CoinEngine {
|
|||
// TODO slice signFromCard to hashes.length parts
|
||||
}
|
||||
|
||||
LastSignStorage.setLastSignDate(mCard.getWallet(), new Date());
|
||||
|
||||
|
||||
for (int i = 0; i < unspentOutputs.size(); ++i) {
|
||||
BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0 + i * 64, 32 + i * 64));
|
||||
BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64));
|
||||
|
|
|
|||
|
|
@ -357,8 +357,6 @@ public class EthEngine extends CoinEngine {
|
|||
return null;
|
||||
}
|
||||
|
||||
LastSignStorage.setLastSignDate(mCard.getWallet(), new Date());
|
||||
|
||||
BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32));
|
||||
BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64));
|
||||
s = CryptoUtil.toCanonicalised(s);
|
||||
|
|
|
|||
|
|
@ -1,145 +0,0 @@
|
|||
package com.tangem.domain.wallet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Created by dvol on 30.10.2017.
|
||||
*/
|
||||
|
||||
public class LastSignStorage {
|
||||
|
||||
private static SharedPreferences sharedPreferences=null;
|
||||
|
||||
private static Set<String> cards = new ArraySet<>();
|
||||
private static Map<String, Date> dates = new ArrayMap<>();
|
||||
private static Map<String, String> txCol = new ArrayMap<>();
|
||||
private static Map<String, String> txCompleteCol = new ArrayMap<>();
|
||||
|
||||
public static void Init(Context context) {
|
||||
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
cards=sharedPreferences.getStringSet("LastSign_Cards", cards);
|
||||
for (int i = 0; i < cards.size(); i++) {
|
||||
String wallet = cards.toArray()[i].toString();
|
||||
Date dt = new Date();
|
||||
dt.setTime(sharedPreferences.getLong("LastSign_" + wallet, 0));
|
||||
dates.put(wallet, dt);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean needInit() {
|
||||
return sharedPreferences==null;
|
||||
}
|
||||
|
||||
static class CompleteTx
|
||||
{
|
||||
public String TX;
|
||||
public boolean isComplete;
|
||||
}
|
||||
public static Map<String, CompleteTx> GetTxList()
|
||||
{
|
||||
Set<String > wallets=sharedPreferences.getStringSet("LastSign_Cards", cards);
|
||||
Map<String, CompleteTx> txList = new ArrayMap<>();
|
||||
|
||||
for (int i = 0; i < wallets.size(); i++) {
|
||||
String wallet = wallets.toArray()[i].toString();
|
||||
String tx = sharedPreferences.getString("LastSignTX_" + wallet, "");
|
||||
boolean complete = sharedPreferences.getBoolean("LastSignTXComplete_" + wallet, false);
|
||||
CompleteTx txComplete = new CompleteTx();
|
||||
txComplete.isComplete = complete;
|
||||
txComplete.TX = tx;
|
||||
txList.put(wallet, txComplete);
|
||||
}
|
||||
|
||||
return txList;
|
||||
}
|
||||
public static Date getLastSignDate(String wallet) {
|
||||
if (dates.containsKey(wallet)) return dates.get(wallet);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void setLastSignDate(String wallet, Date date) {
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
if (!cards.contains(wallet)) {
|
||||
cards.add(wallet);
|
||||
editor.putStringSet("LastSign_Cards", cards);
|
||||
}
|
||||
dates.put(wallet, date);
|
||||
editor.putLong("LastSign_" + wallet, date.getTime());
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public static void setLastTX(String wallet, String tx) {
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
if (!cards.contains(wallet)) {
|
||||
cards.add(wallet);
|
||||
editor.putStringSet("LastSign_Cards", cards);
|
||||
}
|
||||
|
||||
editor.putString("LastSignTX_" + wallet, tx);
|
||||
editor.putBoolean("LastSignTXComplete_" + wallet, false);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public static void setLastMessage(String wallet, String message) {
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
if (!cards.contains(wallet)) {
|
||||
cards.add(wallet);
|
||||
editor.putStringSet("LastSign_Cards", cards);
|
||||
}
|
||||
|
||||
editor.putString("LastSignMessage_" + wallet, message);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
public static String getLastMessage(String wallet)
|
||||
{
|
||||
try {
|
||||
String msg = sharedPreferences.getString("LastSignMessage_" + wallet, "");
|
||||
return msg;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static void setTxWasSend(String wallet)
|
||||
{
|
||||
|
||||
Map<String, CompleteTx> txList = GetTxList();
|
||||
if(txList.containsKey(wallet))
|
||||
{
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
editor.putBoolean("LastSignTXComplete_" + wallet, true);
|
||||
editor.apply();
|
||||
}
|
||||
}
|
||||
public static boolean getNeedTxSend(String wallet)
|
||||
{
|
||||
Map<String, CompleteTx> txList = GetTxList();
|
||||
if(txList.containsKey(wallet))
|
||||
{
|
||||
boolean complete = txList.get(wallet).isComplete;
|
||||
return !complete;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String getTxForSend(String wallet)
|
||||
{
|
||||
Map<String, CompleteTx> txList = GetTxList();
|
||||
if(txList.containsKey(wallet))
|
||||
{
|
||||
return txList.get(wallet).TX;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
|
@ -272,83 +272,6 @@ public class TangemCard {
|
|||
this.remainingSignatures = remainingSignatures;
|
||||
}
|
||||
|
||||
|
||||
public int getCountOutputs() {
|
||||
int count = 0;
|
||||
for (int i = 0; i < mHistoryTransactions.size(); ++i) {
|
||||
if (mHistoryTransactions.get(i).isInput)
|
||||
continue;
|
||||
++count;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static int UNIX_TIME_2017_01_01 = 1483228800;
|
||||
|
||||
public String getLastInputDescription() {
|
||||
|
||||
if (hasUnspentInfo()) {
|
||||
if (mUnspentTransactions.size() > 0) {
|
||||
|
||||
long maxUDT = 0;
|
||||
int UnspentTransactionsAmount = 0;
|
||||
|
||||
for (int i = 0; i < mUnspentTransactions.size(); ++i) {
|
||||
UnspentTransactionsAmount += mUnspentTransactions.get(i).Amount;
|
||||
long unix_time = GetTimestamp(mUnspentTransactions.get(i).Height);
|
||||
|
||||
if (unix_time < UNIX_TIME_2017_01_01) {
|
||||
return "-- -- --";
|
||||
}
|
||||
unix_time = unix_time * 1000L;
|
||||
if (unix_time > maxUDT) maxUDT = unix_time;
|
||||
}
|
||||
|
||||
Calendar cd = Calendar.getInstance();
|
||||
cd.setTimeInMillis(maxUDT);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
//sb.append(String.format("%02d/%02d/%04d %02d:%02d:%02d", cd.get(Calendar.DAY_OF_MONTH), cd.get(Calendar.MONTH) + 1, cd.get(Calendar.YEAR), cd.get(Calendar.HOUR), cd.get(Calendar.MINUTE), cd.get(Calendar.SECOND)));
|
||||
sb.append(Util.formatDateTime(new Date(maxUDT)));
|
||||
|
||||
if (balanceUnconfirmed != null && balanceUnconfirmed != 0) {
|
||||
return "awaiting confirmation...";
|
||||
}
|
||||
return sb.toString();
|
||||
|
||||
} else {
|
||||
if (balanceUnconfirmed != null) {
|
||||
if (balanceUnconfirmed != 0) {
|
||||
return "awaiting confirmation...";
|
||||
} else {
|
||||
return "-- -- --";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return "-- -- --";
|
||||
|
||||
}
|
||||
|
||||
private int indexfOfUnspentTransaction(String txID) {
|
||||
if (hasUnspentInfo()) {
|
||||
for (int i = 0; i < mUnspentTransactions.size(); i++) {
|
||||
if (mUnspentTransactions.get(i).txID.equals(txID)) return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public String getLastSignedDescription() {
|
||||
Date dt = LastSignStorage.getLastSignDate(getWallet());
|
||||
if (dt != null) {
|
||||
return Util.formatDateTime(dt);
|
||||
|
||||
} else {
|
||||
return "Not supported";
|
||||
}
|
||||
}
|
||||
|
||||
public String getPIN() {
|
||||
return PIN;
|
||||
}
|
||||
|
|
@ -361,7 +284,6 @@ public class TangemCard {
|
|||
balanceConfirmed = null;
|
||||
balanceUnconfirmed = null;
|
||||
mUnspentTransactions = null;
|
||||
mHistoryTransactions = null;
|
||||
balanceDecimal = null;
|
||||
balanceDecimalAlter = null;
|
||||
setIsBalanceEqual(false);
|
||||
|
|
@ -709,32 +631,6 @@ public class TangemCard {
|
|||
return signingMethod;
|
||||
}
|
||||
|
||||
public static class HeaderInfo {
|
||||
public HeaderInfo() {
|
||||
|
||||
}
|
||||
|
||||
public HeaderInfo(Integer height, Integer timestamp) {
|
||||
Height = height;
|
||||
TmStamp = timestamp;
|
||||
}
|
||||
|
||||
public Integer TmStamp;
|
||||
public Integer Height;
|
||||
|
||||
public Bundle getAsBundle() {
|
||||
Bundle B = new Bundle();
|
||||
B.putInt("TmStamp", TmStamp);
|
||||
B.putInt("Height", Height);
|
||||
return B;
|
||||
}
|
||||
|
||||
public void LoadFromBundle(Bundle B) {
|
||||
TmStamp = B.getInt("TmStamp");
|
||||
Height = B.getInt("Height");
|
||||
}
|
||||
}
|
||||
|
||||
public static class UnspentTransaction {
|
||||
public String txID;
|
||||
public Integer Amount;
|
||||
|
|
@ -759,130 +655,13 @@ public class TangemCard {
|
|||
}
|
||||
}
|
||||
|
||||
public static int CountOurTx(List<HistoryTransaction> listHTx) {
|
||||
int count = 0;
|
||||
for (HistoryTransaction tx : listHTx) {
|
||||
|
||||
if (tx.Raw == null)
|
||||
continue;
|
||||
|
||||
String raw = tx.Raw;
|
||||
//Log.e("H", tx.txID + " - ?");
|
||||
try {
|
||||
ArrayList<byte[]> prevHashes = BTCUtils.getPrevTX(raw);
|
||||
|
||||
boolean isOur = false;
|
||||
for (byte[] hash : prevHashes) {
|
||||
String checkID = BTCUtils.toHex(hash);
|
||||
|
||||
for (HistoryTransaction txForCheck : listHTx) {
|
||||
String id = txForCheck.txID;
|
||||
//Log.e("H:", checkID + " - " + id);
|
||||
if (id.equals(checkID)) {
|
||||
isOur = true;
|
||||
//Log.e("H", tx.txID + " - Complete");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isOur) {
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tx.isInput = !isOur;
|
||||
} catch (BitcoinException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
public static class HistoryTransaction {
|
||||
public String txID;
|
||||
public Integer Height;
|
||||
public String Raw = "";
|
||||
public boolean isInput = false;
|
||||
|
||||
public Bundle getAsBundle() {
|
||||
Bundle B = new Bundle();
|
||||
B.putString("txID", txID);
|
||||
B.putInt("Height", Height);
|
||||
B.putString("Raw", Raw);
|
||||
B.putBoolean("Input", isInput);
|
||||
return B;
|
||||
}
|
||||
|
||||
public void LoadFromBundle(Bundle B) {
|
||||
txID = B.getString("txID");
|
||||
Height = B.getInt("Height");
|
||||
Raw = B.getString("Raw");
|
||||
isInput = B.getBoolean("Input");
|
||||
}
|
||||
}
|
||||
|
||||
private List<UnspentTransaction> mUnspentTransactions = null;
|
||||
private List<HistoryTransaction> mHistoryTransactions = null;
|
||||
private List<HeaderInfo> mHeaders = null;
|
||||
|
||||
public List<UnspentTransaction> getUnspentTransactions() {
|
||||
if (mUnspentTransactions == null) mUnspentTransactions = new ArrayList<>();
|
||||
return mUnspentTransactions;
|
||||
}
|
||||
|
||||
public boolean hasUnspentInfo() {
|
||||
return mUnspentTransactions != null;
|
||||
}
|
||||
|
||||
public List<HistoryTransaction> getHistoryTransactions() {
|
||||
if (mHistoryTransactions == null) mHistoryTransactions = new ArrayList<>();
|
||||
return mHistoryTransactions;
|
||||
}
|
||||
|
||||
public List<HistoryTransaction> getOutputTransactions() {
|
||||
if (mHistoryTransactions == null) mHistoryTransactions = new ArrayList<>();
|
||||
return mHistoryTransactions;
|
||||
}
|
||||
|
||||
public boolean hasHistoryInfo() {
|
||||
return mHistoryTransactions != null;
|
||||
}
|
||||
|
||||
public List<HeaderInfo> getHaedersInfo() {
|
||||
if (mHeaders == null) mHeaders = new ArrayList<>();
|
||||
return mHeaders;
|
||||
}
|
||||
|
||||
public void UpdateHeaderInfo(HeaderInfo info) {
|
||||
boolean newItem = true;
|
||||
for (int i = 0; i < mHeaders.size(); ++i) {
|
||||
if (mHeaders.get(i).Height == info.Height) {
|
||||
newItem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (newItem) {
|
||||
mHeaders.add(info);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetTimestamp(int height) {
|
||||
if (mHeaders == null)
|
||||
return 0;
|
||||
for (int i = 0; i < mHeaders.size(); ++i) {
|
||||
if (mHeaders.get(i).Height == height) {
|
||||
return mHeaders.get(i).TmStamp;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public boolean hasHeaderInfo() {
|
||||
return mHeaders != null;
|
||||
}
|
||||
|
||||
public TangemCard(String UID) {
|
||||
this.UID = UID;
|
||||
}
|
||||
|
|
@ -1154,20 +933,6 @@ public class TangemCard {
|
|||
}
|
||||
B.putBundle("UnspentTransactions", BB);
|
||||
}
|
||||
if (mHeaders != null) {
|
||||
Bundle BB = new Bundle();
|
||||
for (Integer i = 0; i < mHeaders.size(); i++) {
|
||||
BB.putBundle(i.toString(), mHeaders.get(i).getAsBundle());
|
||||
}
|
||||
B.putBundle("Headers", BB);
|
||||
}
|
||||
if (mHistoryTransactions != null) {
|
||||
Bundle BB = new Bundle();
|
||||
for (Integer i = 0; i < mHistoryTransactions.size(); i++) {
|
||||
BB.putBundle(i.toString(), mHistoryTransactions.get(i).getAsBundle());
|
||||
}
|
||||
B.putBundle("HistoryTransactions", BB);
|
||||
}
|
||||
B.putFloat("rate", rate);
|
||||
B.putFloat("rateAlter", rateAlter);
|
||||
B.putString("confirmTx", getConfirmedTXCount().toString(16));
|
||||
|
|
@ -1301,28 +1066,6 @@ public class TangemCard {
|
|||
i++;
|
||||
}
|
||||
}
|
||||
if (B.containsKey("Headers")) {
|
||||
mHeaders = new ArrayList<>();
|
||||
Bundle BB = B.getBundle("Headers");
|
||||
Integer i = 0;
|
||||
while (BB.containsKey(i.toString())) {
|
||||
HeaderInfo t = new HeaderInfo();
|
||||
t.LoadFromBundle(BB.getBundle(i.toString()));
|
||||
mHeaders.add(t);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if (B.containsKey("HistoryTransactions")) {
|
||||
mHistoryTransactions = new ArrayList<>();
|
||||
Bundle BB = B.getBundle("HistoryTransactions");
|
||||
Integer i = 0;
|
||||
while (BB.containsKey(i.toString())) {
|
||||
HistoryTransaction t = new HistoryTransaction();
|
||||
t.LoadFromBundle(BB.getBundle(i.toString()));
|
||||
mHistoryTransactions.add(t);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if (B.containsKey("rate"))
|
||||
rate = B.getFloat("rate");
|
||||
if (B.containsKey("rateAlter"))
|
||||
|
|
|
|||
|
|
@ -399,8 +399,6 @@ public class TokenEngine extends CoinEngine {
|
|||
return null;
|
||||
}
|
||||
|
||||
LastSignStorage.setLastSignDate(mCard.getWallet(), new Date());
|
||||
|
||||
BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32));
|
||||
BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64));
|
||||
s = CryptoUtil.toCanonicalised(s);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ package com.tangem.domain.wallet;
|
|||
*/
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
public class UnspentOutputInfo {
|
||||
public class UnspentOutputInfo {
|
||||
public final byte[] txHash;
|
||||
public final Transaction.Script script;
|
||||
public final long value;
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
|
|||
}
|
||||
|
||||
if (!engineCoin.checkAmountValue(card, txAmount, txFee, minFeeInInternalUnits, isIncludeFee)) {
|
||||
finishActivityWithError(Activity.RESULT_CANCELED, getString(R.string.not_enough_funds_or_incorrect_amount))
|
||||
finishActivityWithError(Activity.RESULT_CANCELED, getString(R.string.not_enough_funds_on_your_card))
|
||||
return@setOnClickListener
|
||||
}
|
||||
|
||||
|
|
@ -344,7 +344,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
|
|||
override fun onInfuraFail(method: String, message: String) {
|
||||
when (method) {
|
||||
ServerApiHelper.INFURA_ETH_GAS_PRICE -> {
|
||||
|
||||
finishActivityWithError(Activity.RESULT_CANCELED, getString(R.string.cannot_obtain_data_from_blockchain))
|
||||
}
|
||||
|
||||
else -> {
|
||||
|
|
|
|||
|
|
@ -57,9 +57,6 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco
|
|||
if (PINStorage.needInit())
|
||||
PINStorage.Init(context)
|
||||
|
||||
if (LastSignStorage.needInit())
|
||||
LastSignStorage.Init(context)
|
||||
|
||||
if (Issuer.needInit())
|
||||
Issuer.Init(context)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ import com.tangem.data.network.request.ElectrumRequest
|
|||
import com.tangem.domain.cardReader.NfcManager
|
||||
import com.tangem.domain.wallet.Blockchain
|
||||
import com.tangem.domain.wallet.CoinEngineFactory
|
||||
import com.tangem.domain.wallet.LastSignStorage
|
||||
import com.tangem.domain.wallet.TangemCard
|
||||
import com.tangem.wallet.R
|
||||
import org.json.JSONException
|
||||
|
|
@ -70,13 +69,9 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback
|
|||
var hashTX = it.resultString
|
||||
|
||||
try {
|
||||
LastSignStorage.setLastMessage(card!!.wallet, hashTX)
|
||||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X")) {
|
||||
hashTX = hashTX.substring(2)
|
||||
}
|
||||
val bigInt = BigInteger(hashTX, 16) //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(card!!.wallet)
|
||||
LastSignStorage.setLastMessage(card!!.wallet, "")
|
||||
Log.e("TX_RESULT", hashTX)
|
||||
finishWithSuccess()
|
||||
} catch (e: Exception) {
|
||||
|
|
@ -104,20 +99,12 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback
|
|||
val tmp = infuraResponse.result
|
||||
hashTX = tmp
|
||||
} catch (e: JSONException) {
|
||||
// val msg = request.getAnswer()
|
||||
// val err = msg!!.getJSONObject("error")
|
||||
// hashTX = err.getString("message")
|
||||
// LastSignStorage.setLastMessage(card!!.wallet, hashTX)
|
||||
return
|
||||
}
|
||||
|
||||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X")) {
|
||||
hashTX = hashTX.substring(2)
|
||||
}
|
||||
val bigInt = BigInteger(hashTX, 16) //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(card!!.wallet)
|
||||
LastSignStorage.setLastMessage(card!!.wallet, "")
|
||||
// Log.e("TX_RESULT", hashTX)
|
||||
|
||||
|
||||
val nonce = card!!.confirmedTXCount
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
} else if (!engine.isBalanceNotZero(card))
|
||||
showSingleToast(R.string.wallet_empty)
|
||||
else if (!engine.isBalanceAlterNotZero(card))
|
||||
showSingleToast(R.string.not_enough_funds_or_incorrect_amount)
|
||||
showSingleToast(R.string.not_enough_eth_for_gas)
|
||||
else if (engine.awaitingConfirmation(card))
|
||||
showSingleToast(R.string.please_wait_while_previous)
|
||||
else if (!engine.checkUnspentTransaction(card))
|
||||
|
|
@ -263,7 +263,6 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
val height = jsUnspent.getInt("height")
|
||||
val hash = jsUnspent.getString("tx_hash")
|
||||
if (height != -1) {
|
||||
requestElectrum(card!!, ElectrumRequest.getHeader(walletAddress, height.toString()))
|
||||
requestElectrum(card!!, ElectrumRequest.getTransaction(walletAddress, hash))
|
||||
}
|
||||
}
|
||||
|
|
@ -272,20 +271,6 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
}
|
||||
}
|
||||
|
||||
if (it.isMethod(ElectrumRequest.METHOD_GetHeader)) {
|
||||
try {
|
||||
val jsHeader = it.result
|
||||
try {
|
||||
card!!.haedersInfo
|
||||
card!!.UpdateHeaderInfo(TangemCard.HeaderInfo(jsHeader.getInt("block_height"), jsHeader.getInt("timestamp")))
|
||||
} catch (e: JSONException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
} catch (e: JSONException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
if (it.isMethod(ElectrumRequest.METHOD_GetTransaction)) {
|
||||
try {
|
||||
val txHash = it.txHash
|
||||
|
|
@ -295,47 +280,13 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
if (tx.txID == txHash)
|
||||
tx.Raw = raw
|
||||
}
|
||||
val listHTx = card!!.historyTransactions
|
||||
for (tx in listHTx) {
|
||||
if (tx.txID == txHash) {
|
||||
tx.Raw = raw
|
||||
try {
|
||||
val prevHashes = BTCUtils.getPrevTX(raw)
|
||||
var isOur = false
|
||||
for (hash in prevHashes) {
|
||||
val checkID = BTCUtils.toHex(hash)
|
||||
for (txForCheck in listHTx) {
|
||||
if (txForCheck.txID == checkID)
|
||||
isOur = true
|
||||
}
|
||||
}
|
||||
tx.isInput = !isOur
|
||||
} catch (e: BitcoinException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e: JSONException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
if (it.isMethod(ElectrumRequest.METHOD_SendTransaction)) {
|
||||
try {
|
||||
var hashTX = it.resultString
|
||||
try {
|
||||
LastSignStorage.setLastMessage(card!!.wallet, hashTX)
|
||||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X"))
|
||||
hashTX = hashTX.substring(2)
|
||||
val bigInt = BigInteger(hashTX, 16) //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(card!!.wallet)
|
||||
LastSignStorage.setLastMessage(card!!.wallet, "")
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
} catch (e: JSONException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (requestCounter == 0) updateViews()
|
||||
|
|
@ -384,11 +335,12 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
|
||||
// request rate info listener
|
||||
serverApiHelper!!.setRateInfoData {
|
||||
|
||||
requestCounter--
|
||||
val rate = it.priceUsd.toFloat()
|
||||
card!!.rate = rate
|
||||
card!!.rateAlter = rate
|
||||
|
||||
requestCounter--
|
||||
if (requestCounter == 0) {
|
||||
srlLoadedWallet!!.isRefreshing = false
|
||||
updateViews()
|
||||
|
|
@ -484,9 +436,6 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
if (hashTX.startsWith("0x") || hashTX.startsWith("0X")) {
|
||||
hashTX = hashTX.substring(2)
|
||||
}
|
||||
val bigInt = BigInteger(hashTX, 16) //TODO: очень плохой способ
|
||||
LastSignStorage.setTxWasSend(card!!.wallet)
|
||||
LastSignStorage.setLastMessage(card!!.wallet, "")
|
||||
|
||||
Log.e("$TAG TX_RESULT", hashTX)
|
||||
|
||||
|
|
@ -532,7 +481,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific
|
|||
|
||||
private fun requestInfura(method: String, contract: String) {
|
||||
requestCounter++
|
||||
serverApiHelper!!.infura(method, 67, card!!.wallet, contract, LastSignStorage.getTxForSend(card!!.wallet))
|
||||
serverApiHelper!!.infura(method, 67, card!!.wallet, contract, "")
|
||||
}
|
||||
|
||||
private fun requestCardVerify() {
|
||||
|
|
|
|||
|
|
@ -290,12 +290,6 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback {
|
|||
tvBlockchain.text = card!!.blockchainName
|
||||
tvValidationNode.text = card!!.validationNodeDescription
|
||||
|
||||
when {
|
||||
card!!.lastInputDescription.contains("awaiting") -> tvInputs.setTextColor(ContextCompat.getColor(context!!, R.color.not_confirmed))
|
||||
card!!.lastInputDescription.contains("None") -> tvInputs.setTextColor(ContextCompat.getColor(context!!, R.color.primary_dark))
|
||||
else -> tvInputs.setTextColor(ContextCompat.getColor(context!!, R.color.confirmed))
|
||||
}
|
||||
|
||||
ivBlockchain.setImageResource(card!!.blockchain.getLogoImageResource(card!!.blockchainID, card!!.tokenSymbol))
|
||||
|
||||
if (card!!.isReusable!!)
|
||||
|
|
@ -307,7 +301,6 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback {
|
|||
|
||||
if (card!!.status == TangemCard.Status.Loaded || card!!.status == TangemCard.Status.Purged) {
|
||||
|
||||
tvLastSigned.text = card!!.lastSignedDescription
|
||||
when {
|
||||
card!!.remainingSignatures == 0 -> {
|
||||
tvRemainingSignatures.setTextColor(ContextCompat.getColor(context!!, R.color.not_confirmed))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue