2020-09-01 03:49:05 +00:00
import QtQuick 2.13
import QtQuick . Controls 2.13
import QtQuick . Layouts 1.13
import QtQuick . Dialogs 1.3
import "../../../../imports"
import "../../../../shared"
ModalPopup {
id: root
feat: enable token transactions
Fixes #788.
Fixes #853.
Fixes #856.
refactor: gas estimation and transaction sends have been abstracted to allow calling `estimateGas`, `send`, and `call` on the contract method (similar to the web3 API).
Moved sticker pack gas estimation and purchase tx over to the new API
*Sticker purchase:*
- gas estimate is done using new API and debounced using a timer
*Wallet send transaction:*
- tokens can now be sent
- gas is estimated correctly for a token tx, and debounced using a timer
***NOTE***
1. If attempting to send tokens on testnet, you must use a custom token as the token addresses in the pre-built list are for mainnet and will not work on testnet.
2. The new API should support all existing gas estimates, send txs, and calls. The loading of sticker pack data, balance, count, purchased sticker packs, etc, can be moved over to the new API. Almost all of the `eth_sendTransaction`, `eth_gasEstimate`, and `eth_call` could be move over as well (that's the idea at least).
2020-09-07 09:39:17 +00:00
readonly property var asset: JSON . parse ( walletModel . getStatusToken ( ) )
2020-09-01 03:49:05 +00:00
property int stickerPackId: - 1
property string packPrice
property bool showBackBtn: false
title: qsTr ( "Authorize %1 %2" ) . arg ( Utils . stripTrailingZeros ( packPrice ) ) . arg ( asset . symbol )
property MessageDialog sendingError: MessageDialog {
id: sendingError
title: qsTr ( "Error sending the transaction" )
icon: StandardIcon . Critical
standardButtons: StandardButton . Ok
}
property MessageDialog sendingSuccess: MessageDialog {
id: sendingSuccess
//% "Success sending the transaction"
title: qsTrId ( "success-sending-the-transaction" )
icon: StandardIcon . NoIcon
standardButtons: StandardButton . Ok
onAccepted: {
root . close ( )
}
}
onClosed: {
stack . reset ( )
}
function sendTransaction ( ) {
let responseStr = chatsModel . buyStickerPack ( root . stickerPackId ,
selectFromAccount . selectedAccount . address ,
root . packPrice ,
gasSelector . selectedGasLimit ,
gasSelector . selectedGasPrice ,
transactionSigner . enteredPassword )
let response = JSON . parse ( responseStr )
if ( response . error ) {
if ( response . error . message . includes ( "could not decrypt key with given password" ) ) {
transactionSigner . validationError = qsTr ( "Wrong password" )
return
}
sendingError . text = response . error . message
return sendingError . open ( )
}
2020-09-14 17:38:23 +00:00
sendingSuccess . text = qsTr ( "Transaction sent to the blockchain. You can watch the progress on Etherscan: %2%1" ) . arg ( response . result ) . arg ( walletModel . etherscanLink )
2020-09-01 03:49:05 +00:00
sendingSuccess . open ( )
}
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 . label = group . footerText
}
TransactionFormGroup {
id: group1
headerText: qsTr ( "Authorize %1 %2" ) . arg ( Utils . stripTrailingZeros ( root . packPrice ) ) . arg ( root . asset . symbol )
footerText: qsTr ( "Continue" )
StackView.onActivated: {
btnBack . visible = root . showBackBtn
}
AccountSelector {
id: selectFromAccount
accounts: walletModel . accounts
selectedAccount: walletModel . currentAccount
currency: walletModel . defaultCurrency
width: stack . width
label: qsTr ( "Choose account" )
showBalanceForAssetSymbol: root . asset . symbol
minRequiredAssetBalance: root . packPrice
reset: function ( ) {
accounts = Qt . binding ( function ( ) { return walletModel . accounts } )
selectedAccount = Qt . binding ( function ( ) { return walletModel . currentAccount } )
showBalanceForAssetSymbol = Qt . binding ( function ( ) { return root . asset . symbol } )
minRequiredAssetBalance = Qt . binding ( function ( ) { return root . packPrice } )
}
feat: enable token transactions
Fixes #788.
Fixes #853.
Fixes #856.
refactor: gas estimation and transaction sends have been abstracted to allow calling `estimateGas`, `send`, and `call` on the contract method (similar to the web3 API).
Moved sticker pack gas estimation and purchase tx over to the new API
*Sticker purchase:*
- gas estimate is done using new API and debounced using a timer
*Wallet send transaction:*
- tokens can now be sent
- gas is estimated correctly for a token tx, and debounced using a timer
***NOTE***
1. If attempting to send tokens on testnet, you must use a custom token as the token addresses in the pre-built list are for mainnet and will not work on testnet.
2. The new API should support all existing gas estimates, send txs, and calls. The loading of sticker pack data, balance, count, purchased sticker packs, etc, can be moved over to the new API. Almost all of the `eth_sendTransaction`, `eth_gasEstimate`, and `eth_call` could be move over as well (that's the idea at least).
2020-09-07 09:39:17 +00:00
onSelectedAccountChanged: gasSelector . estimateGas ( )
2020-09-01 03:49:05 +00:00
}
RecipientSelector {
id: selectRecipient
visible: false
accounts: walletModel . accounts
contacts: profileModel . addedContacts
selectedRecipient: { "address" : chatsModel . stickerMarketAddress , "type" : RecipientSelector . Type . Address }
readOnly: true
feat: enable token transactions
Fixes #788.
Fixes #853.
Fixes #856.
refactor: gas estimation and transaction sends have been abstracted to allow calling `estimateGas`, `send`, and `call` on the contract method (similar to the web3 API).
Moved sticker pack gas estimation and purchase tx over to the new API
*Sticker purchase:*
- gas estimate is done using new API and debounced using a timer
*Wallet send transaction:*
- tokens can now be sent
- gas is estimated correctly for a token tx, and debounced using a timer
***NOTE***
1. If attempting to send tokens on testnet, you must use a custom token as the token addresses in the pre-built list are for mainnet and will not work on testnet.
2. The new API should support all existing gas estimates, send txs, and calls. The loading of sticker pack data, balance, count, purchased sticker packs, etc, can be moved over to the new API. Almost all of the `eth_sendTransaction`, `eth_gasEstimate`, and `eth_call` could be move over as well (that's the idea at least).
2020-09-07 09:39:17 +00:00
onSelectedRecipientChanged: gasSelector . estimateGas ( )
2020-09-01 03:49:05 +00:00
}
GasSelector {
id: gasSelector
visible: false
slowestGasPrice: parseFloat ( walletModel . safeLowGasPrice )
fastestGasPrice: parseFloat ( walletModel . fastestGasPrice )
getGasEthValue: walletModel . getGasEthValue
getFiatValue: walletModel . getFiatValue
defaultCurrency: walletModel . defaultCurrency
reset: function ( ) {
slowestGasPrice = Qt . binding ( function ( ) { return parseFloat ( walletModel . safeLowGasPrice ) } )
fastestGasPrice = Qt . binding ( function ( ) { return parseFloat ( walletModel . fastestGasPrice ) } )
}
feat: enable token transactions
Fixes #788.
Fixes #853.
Fixes #856.
refactor: gas estimation and transaction sends have been abstracted to allow calling `estimateGas`, `send`, and `call` on the contract method (similar to the web3 API).
Moved sticker pack gas estimation and purchase tx over to the new API
*Sticker purchase:*
- gas estimate is done using new API and debounced using a timer
*Wallet send transaction:*
- tokens can now be sent
- gas is estimated correctly for a token tx, and debounced using a timer
***NOTE***
1. If attempting to send tokens on testnet, you must use a custom token as the token addresses in the pre-built list are for mainnet and will not work on testnet.
2. The new API should support all existing gas estimates, send txs, and calls. The loading of sticker pack data, balance, count, purchased sticker packs, etc, can be moved over to the new API. Almost all of the `eth_sendTransaction`, `eth_gasEstimate`, and `eth_call` could be move over as well (that's the idea at least).
2020-09-07 09:39:17 +00:00
property var estimateGas: Backpressure . debounce ( gasSelector , 600 , function ( ) {
if ( ! ( root . stickerPackId > - 1 && selectFromAccount . selectedAccount && root . packPrice && parseFloat ( root . packPrice ) > 0 ) ) {
selectedGasLimit = 325000
return
2020-09-01 03:49:05 +00:00
}
feat: enable token transactions
Fixes #788.
Fixes #853.
Fixes #856.
refactor: gas estimation and transaction sends have been abstracted to allow calling `estimateGas`, `send`, and `call` on the contract method (similar to the web3 API).
Moved sticker pack gas estimation and purchase tx over to the new API
*Sticker purchase:*
- gas estimate is done using new API and debounced using a timer
*Wallet send transaction:*
- tokens can now be sent
- gas is estimated correctly for a token tx, and debounced using a timer
***NOTE***
1. If attempting to send tokens on testnet, you must use a custom token as the token addresses in the pre-built list are for mainnet and will not work on testnet.
2. The new API should support all existing gas estimates, send txs, and calls. The loading of sticker pack data, balance, count, purchased sticker packs, etc, can be moved over to the new API. Almost all of the `eth_sendTransaction`, `eth_gasEstimate`, and `eth_call` could be move over as well (that's the idea at least).
2020-09-07 09:39:17 +00:00
selectedGasLimit = chatsModel . buyPackGasEstimate ( root . stickerPackId , selectFromAccount . selectedAccount . address , root . packPrice )
} )
2020-09-01 03:49:05 +00:00
}
GasValidator {
id: gasValidator
anchors.bottom: parent . bottom
anchors.bottomMargin: 8
selectedAccount: selectFromAccount . selectedAccount
selectedAsset: root . asset
selectedAmount: parseFloat ( packPrice )
selectedGasEthValue: gasSelector . selectedGasEthValue
reset: function ( ) {
selectedAccount = Qt . binding ( function ( ) { return selectFromAccount . selectedAccount } )
selectedAsset = Qt . binding ( function ( ) { return root . asset } )
selectedAmount = Qt . binding ( function ( ) { return parseFloat ( packPrice ) } )
selectedGasEthValue = Qt . binding ( function ( ) { return gasSelector . selectedGasEthValue } )
}
}
}
TransactionFormGroup {
id: group3
headerText: qsTr ( "Authorize %1 %2" ) . arg ( Utils . stripTrailingZeros ( root . packPrice ) ) . arg ( root . asset . symbol )
footerText: qsTr ( "Sign with password" )
StackView.onActivated: {
btnBack . visible = true
}
TransactionPreview {
id: pvwTransaction
width: stack . width
fromAccount: selectFromAccount . selectedAccount
gas: {
"value" : gasSelector . selectedGasEthValue ,
"symbol" : "ETH" ,
"fiatValue" : gasSelector . selectedGasFiatValue
}
toAccount: selectRecipient . selectedRecipient
asset: root . asset
currency: walletModel . defaultCurrency
amount: {
const fiatValue = walletModel . getFiatValue ( root . packPrice || 0 , root . asset . symbol , currency )
return { "value" : root . packPrice , "fiatValue" : fiatValue }
}
reset: function ( ) {
fromAccount = Qt . binding ( function ( ) { return selectFromAccount . selectedAccount } )
toAccount = Qt . binding ( function ( ) { return selectRecipient . selectedRecipient } )
asset = Qt . binding ( function ( ) { return root . asset } )
amount = Qt . binding ( function ( ) { return { "value" : root . packPrice , "fiatValue" : walletModel . getFiatValue ( root . packPrice , root . asset . symbol , currency ) } } )
gas = Qt . binding ( function ( ) {
return {
"value" : gasSelector . selectedGasEthValue ,
"symbol" : "ETH" ,
"fiatValue" : gasSelector . selectedGasFiatValue
}
} )
}
}
}
TransactionFormGroup {
id: group4
headerText: qsTr ( "Send %1 %2" ) . arg ( Utils . stripTrailingZeros ( root . packPrice ) ) . arg ( root . asset . symbol )
footerText: qsTr ( "Sign with password" )
TransactionSigner {
id: transactionSigner
width: stack . width
signingPhrase: walletModel . signingPhrase
reset: function ( ) {
signingPhrase = Qt . binding ( function ( ) { return walletModel . signingPhrase } )
}
}
}
}
footer: Item {
anchors.top: parent . top
anchors.left: parent . left
anchors.right: parent . right
StyledButton {
id: btnBack
anchors.left: parent . left
//% "Back"
label: qsTrId ( "back" )
onClicked: {
if ( stack . isFirstGroup ) {
return root . close ( )
}
stack . back ( )
}
}
StyledButton {
id: btnNext
anchors.right: parent . right
label: qsTr ( "Next" )
disabled: ! stack . currentGroup . isValid
onClicked: {
const isValid = stack . currentGroup . validate ( )
if ( stack . currentGroup . validate ( ) ) {
if ( stack . isLastGroup ) {
return root . sendTransaction ( )
}
stack . next ( )
}
}
}
2020-09-14 17:38:23 +00:00
Connections {
target: chatsModel
onTransactionWasSent: {
toastMessage . title = qsTr ( "Transaction pending..." )
toastMessage . source = "../../../img/loading.svg"
toastMessage . iconColor = Style . current . primary
toastMessage . iconRotates = true
toastMessage . link = ` $ { walletModel . etherscanLink } / $ { txResult } `
toastMessage . open ( )
}
onTransactionCompleted: {
toastMessage . title = ! success ? qsTr ( "Could not buy Stickerpack" ) : qsTr ( "Stickerpack bought successfully" ) ;
if ( success ) {
toastMessage . source = "../../../img/check-circle.svg"
toastMessage . iconColor = Style . current . success
} else {
toastMessage . source = "../../../img/block-icon.svg"
toastMessage . iconColor = Style . current . danger
}
toastMessage . link = ` $ { walletModel . etherscanLink } / $ { txHash } `
toastMessage . open ( )
}
}
2020-09-01 03:49:05 +00:00
}
}
/ * # # ^ # #
Designer {
D { i: 0 ; autoSize: true ; height: 480 ; width: 640 }
}
# # ^ # # * /