Updated on 2026-08-14
This commit is contained in:
parent
22697fd237
commit
7b3e4dcc7b
9 changed files with 98 additions and 65 deletions
|
|
@ -7,14 +7,19 @@ import com.tangem.data.network.request.ElectrumRequest;
|
|||
import com.tangem.domain.wallet.SharedData;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
/**
|
||||
* Created by dvol on 16.07.2017.
|
||||
|
|
@ -56,8 +61,11 @@ public class ElectrumTask extends AsyncTask<ElectrumRequest, Integer, List<Elect
|
|||
|
||||
InetAddress serverAddress = InetAddress.getByName(Host);
|
||||
Log.v(logTag, "Connecting..."+Host);
|
||||
Socket socket = new Socket(serverAddress, Port);
|
||||
// Socket socket = new Socket(serverAddress, Port);
|
||||
Socket socket = new Socket();
|
||||
socket.setSoTimeout(5000);
|
||||
socket.bind(new InetSocketAddress(0));
|
||||
socket.connect(new InetSocketAddress(serverAddress, Port));
|
||||
try {
|
||||
OutputStream os = socket.getOutputStream();
|
||||
out = new OutputStreamWriter(os, "UTF-8");
|
||||
|
|
|
|||
|
|
@ -18,13 +18,16 @@ import java.nio.ByteBuffer;
|
|||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
|
||||
import static com.tangem.util.FormatUtil.GetDecimalFormat;
|
||||
import static com.tangem.util.FormatUtil.stringToBigDecimal;
|
||||
|
||||
/**
|
||||
* Created by Ilia on 15.02.2018.
|
||||
|
|
@ -232,21 +235,13 @@ public class BtcEngine extends CoinEngine {
|
|||
}
|
||||
|
||||
public boolean CheckAmount(TangemCard card, String amount) throws Exception {
|
||||
DecimalFormat decimalFormat = GetDecimalFormat();
|
||||
BigDecimal amountValue = (BigDecimal) decimalFormat.parse(amount);
|
||||
|
||||
// Convert Balance to BigDecimal
|
||||
BigDecimal maxValue = new BigDecimal(GetBalanceValue(card));
|
||||
maxValue = maxValue.divide(new BigDecimal(1000));
|
||||
|
||||
//if (use_mCurrency) {
|
||||
amountValue = amountValue.divide(new BigDecimal(1000));
|
||||
//}
|
||||
|
||||
// DecimalFormat decimalFormat = GetDecimalFormat();
|
||||
// BigDecimal amountValue = (BigDecimal) decimalFormat.parse(amount);
|
||||
BigDecimal amountValue = stringToBigDecimal(amount,Locale.US);
|
||||
BigDecimal maxValue = stringToBigDecimal(GetBalanceValue(card),Locale.US);
|
||||
if (amountValue.compareTo(maxValue) > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -298,12 +298,12 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
|
|||
|
||||
finalFee = Math.round(finalFee) / (float) 10000;
|
||||
|
||||
if (request.getBlockCount() == FeeRequest.MINIMAL) {
|
||||
if ((request.getBlockCount() == FeeRequest.MINIMAL) && (minFee == null)) {
|
||||
minFee = String.valueOf(finalFee);
|
||||
minFeeInInternalUnits = mCard.InternalUnitsFromString(String.valueOf(finalFee));
|
||||
} else if (request.getBlockCount() == FeeRequest.NORMAL) {
|
||||
} else if ((request.getBlockCount() == FeeRequest.NORMAL) && (normalFee == null)) {
|
||||
normalFee = String.valueOf(finalFee);
|
||||
} else if (request.getBlockCount() == FeeRequest.PRIORITY) {
|
||||
} else if ((request.getBlockCount() == FeeRequest.PRIORITY) && (maxFee == null)) {
|
||||
maxFee = String.valueOf(finalFee);
|
||||
}
|
||||
|
||||
|
|
@ -514,20 +514,16 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
|
|||
|
||||
String nodeAddress = engineCoin.GetNextNode(mCard);
|
||||
int nodePort = engineCoin.GetNextNodePort(mCard);
|
||||
//ConnectTask connectTaskEx = new ConnectTask(Blockchain.getNextServiceHost(mCard), Blockchain.getNextServicePort(mCard), data);
|
||||
ConnectTask connectTaskEx = new ConnectTask(nodeAddress, nodePort, data);
|
||||
|
||||
//connectTaskEx.execute(ElectrumRequest.CheckBalance(mCard.getWallet()));
|
||||
connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(mCard.getWallet()));
|
||||
}
|
||||
|
||||
String nodeAddress = engineCoin.GetNode(mCard);
|
||||
int nodePort = engineCoin.GetNodePort(mCard);
|
||||
ConnectTask connectTask = new ConnectTask(nodeAddress, nodePort, data);
|
||||
|
||||
//ConnectTask connectTask = new ConnectTask(Blockchain.getServiceHost(mCard), Blockchain.getServicePort(mCard));
|
||||
|
||||
connectTask.execute(/*ElectrumRequest.CheckBalance(mCard.getWallet()), */ElectrumRequest.GetFee(mCard.getWallet()));
|
||||
// String nodeAddress = engineCoin.GetNode(mCard);
|
||||
// int nodePort = engineCoin.GetNodePort(mCard);
|
||||
// ConnectTask connectTask = new ConnectTask(nodeAddress, nodePort, data);
|
||||
//
|
||||
//
|
||||
// connectTask.execute(ElectrumRequest.GetFee(mCard.getWallet()));
|
||||
|
||||
int calcSize = 256;
|
||||
try {
|
||||
|
|
@ -543,7 +539,8 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
|
|||
|
||||
ConnectFeeTask feeTask = new ConnectFeeTask(sharedFee);
|
||||
|
||||
feeTask.execute(FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.NORMAL),
|
||||
feeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
|
||||
FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.NORMAL),
|
||||
FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.MINIMAL),
|
||||
FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.PRIORITY));
|
||||
}
|
||||
|
|
@ -608,7 +605,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap
|
|||
switch (keyCode) {
|
||||
case KeyEvent.KEYCODE_BACK:
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("message", "Operation canceled");
|
||||
// intent.putExtra("message", "Operation canceled");
|
||||
setResult(Activity.RESULT_CANCELED, intent);
|
||||
finish();
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap
|
|||
|
||||
btnVerify.setOnClickListener(v -> {
|
||||
String strAmount;
|
||||
strAmount = etAmount.getText().toString();
|
||||
strAmount = etAmount.getText().toString().replace(",",".");
|
||||
CoinEngine engine1 = CoinEngineFactory.Create(mCard.getBlockchain());
|
||||
|
||||
Log.i(TAG, mCard.getBlockchain().getOfficialName());
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -416,7 +416,7 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
|
|||
|
||||
updateTasks.add(updateWalletInfoTask);
|
||||
|
||||
updateWalletInfoTask.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
ElectrumRequest.GetTransaction(mWalletAddress, hash));
|
||||
}
|
||||
}
|
||||
|
|
@ -456,7 +456,7 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
|
|||
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort);
|
||||
updateTasks.add(updateWalletInfoTask);
|
||||
|
||||
updateWalletInfoTask.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
ElectrumRequest.GetTransaction(mWalletAddress, hash));
|
||||
}
|
||||
|
||||
|
|
@ -903,15 +903,11 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
|
|||
int nodePort = engine.GetNextNodePort(mCard);
|
||||
UpdateWalletInfoTask connectTaskEx = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
|
||||
connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(mCard.getWallet()));
|
||||
}
|
||||
|
||||
String nodeAddress = Objects.requireNonNull(engine).GetNode(mCard);
|
||||
int nodePort = engine.GetNodePort(mCard);
|
||||
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
|
||||
updateTasks.add(updateWalletInfoTask);
|
||||
updateWalletInfoTask.execute(ElectrumRequest.ListUnspent(mCard.getWallet())
|
||||
,ElectrumRequest.ListHistory(mCard.getWallet())
|
||||
);
|
||||
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
|
||||
updateTasks.add(updateWalletInfoTask);
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(mCard.getWallet()));
|
||||
}
|
||||
|
||||
RateInfoTask taskRate = new RateInfoTask();
|
||||
ExchangeRequest rate = ExchangeRequest.GetRate(mCard.getWallet(), "bitcoin", "bitcoin");
|
||||
|
|
@ -932,8 +928,8 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
|
|||
UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data);
|
||||
|
||||
updateTasks.add(updateWalletInfoTask);
|
||||
updateWalletInfoTask.execute(ElectrumRequest.ListUnspent(mCard.getWallet())
|
||||
,ElectrumRequest.ListHistory(mCard.getWallet())
|
||||
updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(mCard.getWallet())
|
||||
// ElectrumRequest.ListHistory(mCard.getWallet())
|
||||
);
|
||||
|
||||
RateInfoTask taskRate = new RateInfoTask();
|
||||
|
|
@ -1023,8 +1019,9 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
|
|||
}
|
||||
|
||||
public void ErrorOnUpdate(String message) {
|
||||
mCard.setError(getString(R.string.cannot_obtain_data_from_blockchain));
|
||||
updateViews();
|
||||
// mCard.setError(getString(R.string.cannot_obtain_data_from_blockchain));
|
||||
// mCard.setError(message);
|
||||
// updateViews();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1450,13 +1447,13 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre
|
|||
int nodePort = engine.GetNodePort(mCard);
|
||||
|
||||
UpdateWalletInfoTask connectTask = new UpdateWalletInfoTask(nodeAddress, nodePort);
|
||||
connectTask.execute(ElectrumRequest.Broadcast(mCard.getWallet(), tx));
|
||||
connectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.Broadcast(mCard.getWallet(), tx));
|
||||
} else if (mCard.getBlockchain() == Blockchain.BitcoinCash || mCard.getBlockchain() == Blockchain.BitcoinCashTestNet) {
|
||||
String nodeAddress = engine.GetNode(mCard);
|
||||
int nodePort = engine.GetNodePort(mCard);
|
||||
|
||||
UpdateWalletInfoTask connectTask = new UpdateWalletInfoTask(nodeAddress, nodePort);
|
||||
connectTask.execute(ElectrumRequest.Broadcast(mCard.getWallet(), tx));
|
||||
connectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.Broadcast(mCard.getWallet(), tx));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
|
|||
if (height != -1) {
|
||||
RequestWalletInfoTask task = new RequestWalletInfoTask(request.Host, request.Port);
|
||||
requestTasks.add(task);
|
||||
task.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
ElectrumRequest.GetTransaction(mWalletAddress, hash));
|
||||
}
|
||||
}
|
||||
|
|
@ -225,7 +225,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
|
|||
RequestWalletInfoTask task = new RequestWalletInfoTask(request.Host, request.Port);
|
||||
requestTasks.add(task);
|
||||
|
||||
task.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)),
|
||||
ElectrumRequest.GetTransaction(mWalletAddress, hash));
|
||||
}
|
||||
}
|
||||
|
|
@ -754,9 +754,9 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
|
|||
|
||||
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
|
||||
|
||||
|
||||
requestTasks.add(task);
|
||||
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
|
||||
// task.execute(ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
|
||||
RateInfoTask taskRate = new RateInfoTask();
|
||||
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin", "bitcoin");
|
||||
taskRate.execute(rate);
|
||||
|
|
@ -778,7 +778,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
|
|||
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
|
||||
|
||||
requestTasks.add(task);
|
||||
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
|
||||
RateInfoTask taskRate = new RateInfoTask();
|
||||
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin-cash", "bitcoin-cash");
|
||||
taskRate.execute(rate);
|
||||
|
|
@ -838,18 +838,12 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
|
|||
int nodePort = engine.GetNextNodePort(card);
|
||||
RequestWalletInfoTask connectTaskEx = new RequestWalletInfoTask(nodeAddress, nodePort, data);
|
||||
connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(card.getWallet()));
|
||||
|
||||
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
|
||||
requestTasks.add(task);
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
|
||||
}
|
||||
|
||||
String nodeAddress = engine.GetNode(card);
|
||||
int nodePort = engine.GetNodePort(card);
|
||||
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
|
||||
|
||||
requestTasks.add(task);
|
||||
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
|
||||
RateInfoTask taskRate = new RateInfoTask();
|
||||
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin", "bitcoin");
|
||||
taskRate.execute(rate);
|
||||
|
||||
} else if (card.getBlockchain() == Blockchain.BitcoinCashTestNet || card.getBlockchain() == Blockchain.BitcoinCash) {
|
||||
SharedData data = new SharedData(SharedData.COUNT_REQUEST);
|
||||
for (int i = 0; i < data.allRequest; ++i) {
|
||||
|
|
@ -865,7 +859,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis
|
|||
RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort);
|
||||
|
||||
requestTasks.add(task);
|
||||
task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet()));
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet()));
|
||||
RateInfoTask taskRate = new RateInfoTask();
|
||||
ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin-cash", "bitcoin-cash");
|
||||
taskRate.execute(rate);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
|||
import java.math.BigInteger;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.DecimalFormatSymbols;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Created by Ilia on 15.02.2018.
|
||||
|
|
@ -33,8 +34,49 @@ public class FormatUtil {
|
|||
return myFormatter;
|
||||
}
|
||||
|
||||
public static BigDecimal stringToBigDecimal(final String formattedString,
|
||||
final Locale locale)
|
||||
{
|
||||
final DecimalFormatSymbols symbols;
|
||||
final char groupSeparatorChar;
|
||||
final String groupSeparator;
|
||||
final char decimalSeparatorChar;
|
||||
final String decimalSeparator;
|
||||
String fixedString;
|
||||
final BigDecimal number;
|
||||
|
||||
symbols = new DecimalFormatSymbols(locale);
|
||||
groupSeparatorChar = symbols.getGroupingSeparator();
|
||||
decimalSeparatorChar = symbols.getDecimalSeparator();
|
||||
|
||||
if(groupSeparatorChar == '.')
|
||||
{
|
||||
groupSeparator = "\\" + groupSeparatorChar;
|
||||
}
|
||||
else
|
||||
{
|
||||
groupSeparator = Character.toString(groupSeparatorChar);
|
||||
}
|
||||
|
||||
if(decimalSeparatorChar == '.')
|
||||
{
|
||||
decimalSeparator = "\\" + decimalSeparatorChar;
|
||||
}
|
||||
else
|
||||
{
|
||||
decimalSeparator = Character.toString(decimalSeparatorChar);
|
||||
}
|
||||
|
||||
fixedString = formattedString.replaceAll(groupSeparator , "");
|
||||
fixedString = fixedString.replaceAll(decimalSeparator , ".");
|
||||
number = new BigDecimal(fixedString);
|
||||
|
||||
return (number);
|
||||
}
|
||||
|
||||
public static long ConvertStringToLong(String caption) throws Exception {
|
||||
BigDecimal d = new BigDecimal(caption);
|
||||
// BigDecimal d = new BigDecimal(caption);
|
||||
BigDecimal d = stringToBigDecimal(caption,Locale.US);
|
||||
d = d.multiply(new BigDecimal(100000));
|
||||
d = d.setScale(5);
|
||||
BigInteger b = d.toBigInteger();
|
||||
|
|
|
|||
|
|
@ -203,10 +203,10 @@
|
|||
android:id="@+id/etAmount"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:fontFamily="@font/montserrat_light"
|
||||
android:hint="@string/enter_amount"
|
||||
android:inputType="numberDecimal"
|
||||
android:digits="0123456789.,"
|
||||
android:padding="12dp"
|
||||
android:textColor="@color/colorPrimaryDark"
|
||||
android:textSize="@dimen/text_size_large"
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintWidth_min="150dp"/>
|
||||
app:layout_constraintWidth_min="150dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvCurrency"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue