mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-11-17 08:17:59 +00:00
Merge pull request #2739
b5fafb5
Transfer: display estimated transaction fee, requires #6302 (xiphon)
This commit is contained in:
commit
6a889bdaa1
4 changed files with 75 additions and 6 deletions
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue