Transfer: display estimated transaction fee, requires #6302

pull/7/head
xiphon 4 years ago
parent ef2b0cfa4a
commit b5fafb55c9

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

@ -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 {
@ -155,7 +157,7 @@ Rectangle {
Amount <font size='2'> ( </font> <a href='#'>Change account</a><font size='2'> )</font>") Amount <font size='2'> ( </font> <a href='#'>Change account</a><font size='2'> )</font>")
+ 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: {
@ -186,14 +188,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
@ -217,14 +266,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

@ -575,6 +575,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;

@ -248,6 +248,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;