From 9f3ce2ce3c24dad36b11f06c23539583a1bb0f61 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 25 Mar 2019 18:28:59 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/domain/wallet/xrp/XrpData.java | 17 +++++++- .../tangem/domain/wallet/xrp/XrpEngine.java | 43 +++++++++++++------ .../tangem/card_common/tasks/SignTask.java | 1 + 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpData.java b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpData.java index e6f3be777f..76f3c70eb7 100644 --- a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpData.java +++ b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpData.java @@ -14,6 +14,7 @@ public class XrpData extends CoinData { } private Long balanceConfirmed, balanceUnconfirmed, sequence; + private Long reserve = 20000000L; @Override public void loadFromBundle(Bundle B) { @@ -21,7 +22,8 @@ public class XrpData extends CoinData { if (B.containsKey("BalanceConfirmed")) balanceConfirmed = B.getLong("BalanceConfirmed"); else balanceConfirmed = null; - if (B.containsKey("BalanceUnconfirmed")) balanceUnconfirmed = B.getLong("BalanceUnconfirmed"); + if (B.containsKey("BalanceUnconfirmed")) + balanceUnconfirmed = B.getLong("BalanceUnconfirmed"); else balanceUnconfirmed = null; if (B.containsKey("Sequence")) sequence = B.getLong("Sequence"); } @@ -48,7 +50,10 @@ public class XrpData extends CoinData { // balanceUnconfirmed is just the latest balance, it equals balanceConfirmed if no unconfirmed transaction present public CoinEngine.InternalAmount getBalanceInInternalUnits() { - return new CoinEngine.InternalAmount(BigDecimal.valueOf(balanceUnconfirmed), "Drops"); + if (balanceUnconfirmed != null) + return new CoinEngine.InternalAmount(BigDecimal.valueOf(balanceUnconfirmed).subtract(BigDecimal.valueOf(reserve)), "Drops"); + else + return new CoinEngine.InternalAmount(BigDecimal.valueOf(balanceConfirmed).subtract(BigDecimal.valueOf(reserve)), "Drops"); } // public Long getBalanceUnconfirmed() { @@ -71,6 +76,14 @@ public class XrpData extends CoinData { return sequence; } + public void setReserve(Long reserve) { + this.reserve = reserve; + } + + public CoinEngine.InternalAmount getReserveInInternalUnits() { + return new CoinEngine.InternalAmount(BigDecimal.valueOf(reserve), "Drops"); + } + public boolean hasBalanceInfo() { return balanceConfirmed != null || balanceUnconfirmed != null; } diff --git a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java index 870d6f4eee..7ed6e32161 100644 --- a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java @@ -72,7 +72,7 @@ public class XrpEngine extends CoinEngine { public String getBalanceHTML() { Amount balance = getBalance(); if (balance != null) { - return balance.toDescriptionString(getDecimals()); + return " " + balance.toDescriptionString(getDecimals()) + "
+ " + convertToAmount(coinData.getReserveInInternalUnits()).toDescriptionString(getDecimals()) + " reserve"; } else { return ""; } @@ -158,7 +158,7 @@ public class XrpEngine extends CoinEngine { } public Uri getShareWalletUri() { - return Uri.parse(ctx.getCoinData().getWallet()); + return Uri.parse("ripple:" + ctx.getCoinData().getWallet()); } @Override @@ -350,14 +350,24 @@ public class XrpEngine extends CoinEngine { public SignTask.TransactionToSign constructTransaction(Amount amountValue, Amount feeValue, boolean IncFee, String targetAddress) throws Exception { checkBlockchainDataExists(); + String amount, fee; + + if (IncFee) { + amount = convertToInternalAmount(amountValue).subtract(convertToInternalAmount(feeValue)).setScale(0).toPlainString(); + } else { + amount = Long.toString(convertToInternalAmount(amountValue).longValueExact()); + } + + fee = Long.toString(convertToInternalAmount(feeValue).longValueExact()); + Payment payment = new Payment(); // Put `as` AccountID field Account, `Object` o payment.as(AccountID.Account, coinData.getWallet()); payment.as(AccountID.Destination, targetAddress); - payment.as(com.ripple.core.coretypes.Amount.Amount, amountValue); + payment.as(com.ripple.core.coretypes.Amount.Amount, amount); payment.as(UInt32.Sequence, coinData.getSequence()); - payment.as(com.ripple.core.coretypes.Amount.Fee, feeValue); + payment.as(com.ripple.core.coretypes.Amount.Fee, fee); SignedTransaction signedTx = payment.prepare(canonisePubKey(ctx.getCard().getWalletPublicKeyRar())); @@ -391,9 +401,11 @@ public class XrpEngine extends CoinEngine { } @Override - public byte[] onSignCompleted(byte[] signFromCard) { + public byte[] onSignCompleted(byte[] signFromCard) throws Exception { signedTx.addSign(signFromCard); - return BTCUtils.fromHex(signedTx.tx_blob); + byte[] txForSend = BTCUtils.fromHex(signedTx.tx_blob); + notifyOnNeedSendTransaction(txForSend); + return txForSend; } }; } @@ -486,13 +498,13 @@ public class XrpEngine extends CoinEngine { ServerApiRipple.ResponseListener rippleListener = new ServerApiRipple.ResponseListener() { @Override public void onSuccess(String method, RippleResponse rippleResponse) { - BigDecimal minFee = new BigDecimal(rippleResponse.getResult().getDrops().getMinimum_fee()).divide(new BigDecimal(getDecimals())); - BigDecimal normalFee = new BigDecimal(rippleResponse.getResult().getDrops().getOpen_ledger_fee()).divide(new BigDecimal(getDecimals())); - BigDecimal maxFee = new BigDecimal(rippleResponse.getResult().getDrops().getMedian_fee()).divide(new BigDecimal(getDecimals())); + InternalAmount minFee = new InternalAmount(Long.valueOf(rippleResponse.getResult().getDrops().getMinimum_fee()), "Drops"); + InternalAmount normalFee = new InternalAmount(Long.valueOf(rippleResponse.getResult().getDrops().getOpen_ledger_fee()), "Drops"); + InternalAmount maxFee = new InternalAmount(Long.valueOf(rippleResponse.getResult().getDrops().getMedian_fee()), "Drops"); - coinData.minFee = new Amount(minFee.setScale(getDecimals(), RoundingMode.UP), getFeeCurrency()); - coinData.normalFee = new Amount(normalFee.setScale(getDecimals(), RoundingMode.UP), getFeeCurrency()); - coinData.maxFee = new Amount(maxFee.setScale(getDecimals(), RoundingMode.UP), getFeeCurrency()); + coinData.minFee = convertToAmount(minFee); + coinData.normalFee = convertToAmount(normalFee); + coinData.maxFee = convertToAmount(maxFee); blockchainRequestsCallbacks.onComplete(true); } @@ -555,4 +567,11 @@ public class XrpEngine extends CoinEngine { serverApiRipple.requestData(ServerApiRipple.RIPPLE_SUBMIT, "", txStr); } + @Override + public int pendingTransactionTimeoutInSeconds() { return 10; } + + public boolean needMultipleLinesForBalance() { + return true; + } + } diff --git a/card-common/src/main/java/com/tangem/card_common/tasks/SignTask.java b/card-common/src/main/java/com/tangem/card_common/tasks/SignTask.java index 7d4a0d5d8e..d3eebd6bda 100644 --- a/card-common/src/main/java/com/tangem/card_common/tasks/SignTask.java +++ b/card-common/src/main/java/com/tangem/card_common/tasks/SignTask.java @@ -85,6 +85,7 @@ public class SignTask extends CustomReadCardTask { } transactionToSign.onSignCompleted(signResult.getTLV(TLV.Tag.TAG_Signature).Value); + //TODO: maybe we should move notifyOnNeedSendTransaction(txForSend) here? mNotifications.onReadProgress(protocol, 100); }