import QtQuick 2.13 import QtQuick.Controls 2.13 import QtQuick.Layouts 1.13 import QtQuick.Dialogs 1.3 import utils 1.0 import StatusQ.Controls 0.1 import shared.views 1.0 import shared.popups 1.0 import shared.stores 1.0 import shared.controls 1.0 // TODO: replace with StatusModal ModalPopup { id: root readonly property var asset: {"name": "Ethereum", "symbol": "ETH"} title: qsTr("Contract interaction") property var estimateGasFunction: (function(userAddress) { return 0; }) property var onSendTransaction: (function(userAddress, gasLimit, gasPrice, password){ return ""; }) property var onSuccess: (function(){}) Component.onCompleted: { // Not Refactored Yet // RootStore.walletModelInst.gasView.getGasPricePredictions() } height: 540 function sendTransaction() { // Not Refactored Yet // try { // let responseStr = RootStore.profileModelInst.ens.setPubKey(root.ensUsername, // selectFromAccount.selectedAccount.address, // gasSelector.selectedGasLimit, // gasSelector.eip1599Enabled ? "" : gasSelector.selectedGasPrice, // gasSelector.selectedTipLimit, // gasSelector.selectedOverallLimit, // transactionSigner.enteredPassword) // let response = JSON.parse(responseStr) // if (!response.success) { // if (Utils.isInvalidPasswordMessage(response.result)){ // //% "Wrong password" // transactionSigner.validationError = qsTrId("wrong-password") // return // } // sendingError.text = response.result // return sendingError.open() // } // onSuccess(); // root.close(); // } catch (e) { // console.error('Error sending the transaction', e) // sendingError.text = "Error sending the transaction: " + e.message; // return sendingError.open() // } } property MessageDialog sendingError: MessageDialog { id: sendingError //% "Error sending the transaction" title: qsTrId("error-sending-the-transaction") icon: StandardIcon.Critical standardButtons: StandardButton.Ok } TransactionStackView { id: stack height: parent.height anchors.fill: parent anchors.leftMargin: Style.current.padding anchors.rightMargin: Style.current.padding onGroupActivated: { root.title = group.headerText btnNext.text = group.footerText } TransactionFormGroup { id: group1 headerText: root.title //% "Continue" footerText: qsTrId("continue") StatusAccountSelector { id: selectFromAccount accounts: walletSectionAccounts.model selectedAccount: { const currAcc = walletSectionCurrent if (currAcc.walletType !== Constants.watchWalletType) { return currAcc } return null } // Not Refactored Yet // currency: RootStore.defaultCurrency width: stack.width //% "Choose account" label: qsTrId("choose-account") showBalanceForAssetSymbol: "ETH" minRequiredAssetBalance: 0 onSelectedAccountChanged: if (isValid) { gasSelector.estimateGas() } } RecipientSelector { id: selectRecipient visible: false // Not Refactored Yet // ensModule: root.store.contactsModuleInst // accounts: RootStore.walletModelInst.accountsView.accounts contacts: RootStore.contactsModuleInst.model.addedContacts selectedRecipient: { "address": RootStore.utilsModelInst.ensRegisterAddress, "type": RecipientSelector.Type.Address } readOnly: true currentIndex: index onSelectedRecipientChanged: if (isValid) { gasSelector.estimateGas() } } GasSelector { id: gasSelector visible: true anchors.top: selectFromAccount.bottom anchors.topMargin: Style.current.padding // Not Refactored Yet // gasPrice: parseFloat(RootStore.gasPrice) // getGasEthValue: RootStore.gasEthValue // getFiatValue: RootStore.fiatValue // defaultCurrency: RootStore.defaultCurrency property var estimateGas: Backpressure.debounce(gasSelector, 600, function() { let estimatedGas = root.estimateGasFunction(selectFromAccount.selectedAccount); gasSelector.selectedGasLimit = estimatedGas return estimatedGas; }) } GasValidator { id: gasValidator anchors.top: gasSelector.bottom selectedAccount: selectFromAccount.selectedAccount selectedAsset: root.asset selectedAmount: 0 selectedGasEthValue: gasSelector.selectedGasEthValue } } TransactionFormGroup { id: group3 headerText: root.title //% "Sign with password" footerText: qsTrId("sign-with-password") TransactionPreview { id: pvwTransaction width: stack.width fromAccount: selectFromAccount.selectedAccount gas: { "value": gasSelector.selectedGasEthValue, "symbol": "ETH", "fiatValue": gasSelector.selectedGasFiatValue } toAccount: selectRecipient.selectedRecipient asset: root.asset // Not Refactored Yet // currency: RootStore.defaultCurrency // amount: { // const fiatValue = RootStore.walletModelInst.balanceView.getFiatValue(0, root.asset.symbol, currency) // return { "value": 0, "fiatValue": fiatValue } // } } } TransactionFormGroup { id: group4 headerText: root.title //% "Sign with password" footerText: qsTrId("sign-with-password") TransactionSigner { id: transactionSigner width: stack.width // Not Refactored Yet // signingPhrase: RootStore.walletModelInst.utilsView.signingPhrase } } } footer: Item { width: parent.width height: btnNext.height StatusRoundButton { id: btnBack anchors.left: parent.left icon.name: "arrow-right" icon.width: 20 icon.height: 16 icon.rotation: 180 visible: stack.currentGroup.showBackBtn enabled: stack.currentGroup.isValid || stack.isLastGroup onClicked: { if (typeof stack.currentGroup.onBackClicked === "function") { return stack.currentGroup.onBackClicked() } stack.back() } } Component { id: transactionSettingsConfirmationPopupComponent TransactionSettingsConfirmationPopup { } } StatusButton { id: btnNext anchors.right: parent.right //% "Next" text: qsTrId("next") enabled: stack.currentGroup.isValid onClicked: { const validity = stack.currentGroup.validate() if (validity.isValid && !validity.isPending) { if (stack.isLastGroup) { return root.sendTransaction() } if(gasSelector.eip1599Enabled && stack.currentGroup === group2 && gasSelector.advancedMode){ if(gasSelector.showPriceLimitWarning || gasSelector.showTipLimitWarning){ Global.openPopup(transactionSettingsConfirmationPopupComponent, { currentBaseFee: gasSelector.latestBaseFeeGwei, currentMinimumTip: gasSelector.perGasTipLimitFloor, currentAverageTip: gasSelector.perGasTipLimitAverage, tipLimit: gasSelector.selectedTipLimit, suggestedTipLimit: gasSelector.perGasTipLimitFloor, priceLimit: gasSelector.selectedOverallLimit, suggestedPriceLimit: gasSelector.latestBaseFeeGwei + gasSelector.perGasTipLimitFloor, showPriceLimitWarning: gasSelector.showPriceLimitWarning, showTipLimitWarning: gasSelector.showTipLimitWarning, onConfirm: function(){ stack.next(); } }) return } } stack.next() } } } } } /*##^## Designer { D{i:0;autoSize:true;height:480;width:640} } ##^##*/