Updated on 2026-08-14

This commit is contained in:
Tangem 2018-10-09 17:40:45 +03:00
parent a6e6ffab96
commit ff22469cde
20 changed files with 12 additions and 630 deletions

View file

@ -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 {

View file

@ -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);

View file

@ -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());

View file

@ -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) {

View file

@ -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);

View file

@ -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));

View file

@ -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));

View file

@ -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);

View file

@ -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 "";
}
}

View file

@ -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"))

View file

@ -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);

View file

@ -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;

View file

@ -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 -> {

View file

@ -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)

View file

@ -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

View file

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

View file

@ -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))