Merge pull request #2739

b5fafb5 Transfer: display estimated transaction fee, requires #6302 (xiphon)
This commit is contained in:
luigi1111 2020-04-13 15:35:44 -05:00
commit 6a889bdaa1
No known key found for this signature in database
GPG key ID: F4ACA0183641E010
4 changed files with 75 additions and 6 deletions

View file

@ -133,3 +133,7 @@ function capitalize(s){
if (typeof s !== 'string') return '' if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1) return s.charAt(0).toUpperCase() + s.slice(1)
} }
function removeTrailingZeros(value) {
return (value + '').replace(/(\.\d*[1-9])0+$/, '$1');
}

View file

@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import moneroComponents.Clipboard 1.0 import moneroComponents.Clipboard 1.0
@ -38,6 +39,7 @@ import "../components"
import "../components" as MoneroComponents import "../components" as MoneroComponents
import "." 1.0 import "." 1.0
import "../js/TxUtils.js" as TxUtils import "../js/TxUtils.js" as TxUtils
import "../js/Utils.js" as Utils
Rectangle { Rectangle {
@ -180,7 +182,7 @@ Rectangle {
%1 <a href='#'>(%2)</a>".arg(qsTr("Amount")).arg(qsTr("Change account")) %1 <a href='#'>(%2)</a>".arg(qsTr("Amount")).arg(qsTr("Change account"))
+ translationManager.emptyString + translationManager.emptyString
copyButton: !isNaN(amountLine.text) && persistentSettings.fiatPriceEnabled copyButton: !isNaN(amountLine.text) && persistentSettings.fiatPriceEnabled
copyButtonText: fiatApiCurrencySymbol() + " ~" + fiatApiConvertToFiat(amountLine.text) copyButtonText: "~%1 %2".arg(fiatApiConvertToFiat(amountLine.text)).arg(fiatApiCurrencySymbol())
copyButtonEnabled: false copyButtonEnabled: false
onLabelLinkActivated: { onLabelLinkActivated: {
@ -211,14 +213,61 @@ Rectangle {
regExp: /^(\d{1,8})?([\.]\d{1,12})?$/ regExp: /^(\d{1,8})?([\.]\d{1,12})?$/
} }
} }
MoneroComponents.TextPlain {
id: feeLabel
Layout.alignment: Qt.AlignRight
Layout.topMargin: 12
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 14
color: MoneroComponents.Style.defaultFontColor
property bool estimating: false
property var estimatedFee: null
property string estimatedFeeFiat: {
if (!persistentSettings.fiatPriceEnabled || estimatedFee == null) {
return "";
}
const fiatFee = fiatApiConvertToFiat(estimatedFee);
return " (%1 %3)".arg(fiatFee < 0.01 ? "<0.01" : "~" + fiatFee).arg(fiatApiCurrencySymbol());
}
property var fee: {
estimatedFee = null;
estimating = sendButton.enabled;
if (!sendButton.enabled) {
return;
}
currentWallet.estimateTransactionFeeAsync(
addressLine.text,
walletManager.amountFromString(amountLine.text),
priorityModelV5.get(priorityDropdown.currentIndex).priority,
function (amount) {
estimatedFee = Utils.removeTrailingZeros(amount);
estimating = false;
});
}
text: {
if (!sendButton.enabled || estimatedFee == null) {
return ""
}
return "%1: ~%2 XMR".arg(qsTr("Fee")).arg(estimatedFee) +
estimatedFeeFiat +
translationManager.emptyString;
}
BusyIndicator {
anchors.right: parent.right
running: feeLabel.estimating
height: parent.height
}
}
} }
ColumnLayout { ColumnLayout {
visible: appWindow.walletMode >= 2 visible: appWindow.walletMode >= 2
Layout.fillWidth: true Layout.alignment: Qt.AlignTop
Label { Label {
id: transactionPriority id: transactionPriority
Layout.topMargin: 12 Layout.topMargin: 0
text: qsTr("Transaction priority") + translationManager.emptyString text: qsTr("Transaction priority") + translationManager.emptyString
fontBold: false fontBold: false
fontSize: 16 fontSize: 16
@ -242,14 +291,12 @@ Rectangle {
} }
StandardDropdown { StandardDropdown {
Layout.fillWidth: true Layout.preferredWidth: 200
id: priorityDropdown id: priorityDropdown
Layout.topMargin: 5 Layout.topMargin: 5
currentIndex: 0 currentIndex: 0
} }
} }
// Make sure dropdown is on top
z: parent.z + 1
} }
// recipient address input // recipient address input

View file

@ -600,6 +600,19 @@ void Wallet::disposeTransaction(UnsignedTransaction *t)
delete t; delete t;
} }
void Wallet::estimateTransactionFeeAsync(const QString &destination,
quint64 amount,
PendingTransaction::Priority priority,
const QJSValue &callback)
{
m_scheduler.run([this, destination, amount, priority] {
const uint64_t fee = m_walletImpl->estimateTransactionFee(
{std::make_pair(destination.toStdString(), amount)},
static_cast<Monero::PendingTransaction::Priority>(priority));
return QJSValueList({QString::fromStdString(Monero::Wallet::displayAmount(fee))});
}, callback);
}
TransactionHistory *Wallet::history() const TransactionHistory *Wallet::history() const
{ {
return m_history; return m_history;

View file

@ -250,6 +250,11 @@ public:
//! deletes unsigned transaction and frees memory //! deletes unsigned transaction and frees memory
Q_INVOKABLE void disposeTransaction(UnsignedTransaction * t); Q_INVOKABLE void disposeTransaction(UnsignedTransaction * t);
Q_INVOKABLE void estimateTransactionFeeAsync(const QString &destination,
quint64 amount,
PendingTransaction::Priority priority,
const QJSValue &callback);
//! returns transaction history //! returns transaction history
TransactionHistory * history() const; TransactionHistory * history() const;