From 8bbaee932b518cff56e1d2bd9961c62ccd327209 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 19 Dec 2018 13:18:46 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/domain/wallet/btc/BtcEngine.java | 4 +- .../tangem/domain/wallet/ltc/LtcEngine.java | 76 ++++++++++++++++++- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java index 01a8818e17..80f0e11d56 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java @@ -623,7 +623,7 @@ public class BtcEngine extends CoinEngine { serverApiElectrum.electrumRequestData(ctx, ElectrumRequest.listUnspent(coinData.getWallet())); } - private Integer calculateEstimatedTransactionSize(String outputAddress, String outAmount) { + protected Integer calculateEstimatedTransactionSize(String outputAddress, String outAmount) { //todo - правильней было бы использовать constructPayment try { // String myAddress = coinData.getWallet(); @@ -708,7 +708,7 @@ public class BtcEngine extends CoinEngine { } @Override - public void requestFee(BlockchainRequestsCallbacks blockchainRequestsCallbacks, String targetAddress, Amount amount) { + public void requestFee(BlockchainRequestsCallbacks blockchainRequestsCallbacks, String targetAddress, Amount amount) throws Exception { final int calcSize = calculateEstimatedTransactionSize(targetAddress, amount.toValueString()); Log.e(TAG, String.format("Estimated tx size %d", calcSize)); coinData.minFee = null; diff --git a/app/src/main/java/com/tangem/domain/wallet/ltc/LtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/ltc/LtcEngine.java index 46c444bcac..4ab77928ef 100644 --- a/app/src/main/java/com/tangem/domain/wallet/ltc/LtcEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/ltc/LtcEngine.java @@ -2,16 +2,20 @@ package com.tangem.domain.wallet.ltc; import android.net.Uri; import android.text.InputFilter; +import android.util.Log; +import com.tangem.data.network.ElectrumRequest; +import com.tangem.data.network.ServerApiElectrum; import com.tangem.domain.wallet.BTCUtils; import com.tangem.domain.wallet.BalanceValidator; import com.tangem.domain.wallet.Base58; import com.tangem.domain.wallet.CoinData; +import com.tangem.domain.wallet.CoinEngine; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.Transaction; import com.tangem.domain.wallet.UnspentOutputInfo; -import com.tangem.domain.wallet.bch.BtcCashEngine; import com.tangem.domain.wallet.btc.BtcData; +import com.tangem.domain.wallet.btc.BtcEngine; import com.tangem.tangemcard.data.TangemCard; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.tasks.SignTask; @@ -21,9 +25,12 @@ import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.util.DerEncodingUtil; import com.tangem.wallet.R; +import org.json.JSONException; + import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import java.math.BigInteger; +import java.math.RoundingMode; import java.nio.ByteBuffer; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; @@ -31,8 +38,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class LtcEngine extends BtcCashEngine { - +public class LtcEngine extends BtcEngine { + private static final String TAG = LtcEngine.class.getSimpleName(); public BtcData coinData = null; public LtcEngine(TangemContext context) throws Exception { @@ -487,4 +494,67 @@ public class LtcEngine extends BtcCashEngine { } }; } + + private final static BigDecimal relayFee = new BigDecimal(0.00001); + + @Override + public void requestFee(BlockchainRequestsCallbacks blockchainRequestsCallbacks, String targetAddress, Amount amount) throws Exception { + final int calcSize = calculateEstimatedTransactionSize(targetAddress, amount.toValueString()); + Log.e(TAG, String.format("Estimated tx size %d", calcSize)); + coinData.minFee=null; + coinData.maxFee=null; + coinData.normalFee=null; + + final ServerApiElectrum serverApiElectrum = new ServerApiElectrum(); + + final ServerApiElectrum.ElectrumRequestDataListener electrumListener = new ServerApiElectrum.ElectrumRequestDataListener () { + @Override + public void onSuccess(ElectrumRequest electrumRequest) { + BigDecimal fee; + if (electrumRequest.isMethod(ElectrumRequest.METHOD_GetFee)) { + try { + fee = new BigDecimal(electrumRequest.getResultString()); //fee per KB + + if (fee.equals(BigDecimal.ZERO)) { + serverApiElectrum.electrumRequestData(ctx, ElectrumRequest.getFee()); + } + +// if (calcSize != 0) { + fee = fee.multiply(new BigDecimal(calcSize)).divide(new BigDecimal(1024)); // (per KB -> per byte)*size +// } else { +// serverApiElectrum.electrumRequestData(ctx, ElectrumRequest.getFee()); +// } + + //compare fee to usual relay fee + if (fee.compareTo(relayFee) < 0) { + fee = relayFee; + } + fee = fee.setScale(8, RoundingMode.DOWN); + + CoinEngine.Amount feeAmount = new CoinEngine.Amount(fee, ctx.getBlockchain().getCurrency()); + coinData.minFee = feeAmount; + coinData.normalFee = feeAmount; + coinData.maxFee = feeAmount; +// if (coinData.minFee != null && coinData.normalFee != null && coinData.maxFee != null) { + blockchainRequestsCallbacks.onComplete(true); +// } else { +// blockchainRequestsCallbacks.onProgress(); +// } + + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + @Override + public void onFail(ElectrumRequest electrumRequest) { + ctx.setError(electrumRequest.getError()); + blockchainRequestsCallbacks.onComplete(false); + } + }; + serverApiElectrum.setElectrumRequestData(electrumListener); + + serverApiElectrum.electrumRequestData(ctx, ElectrumRequest.getFee()); + } } \ No newline at end of file