refactor: separate slots for sending eth and tokens
This commit is contained in:
parent
fd976c770d
commit
5f7f899c3b
|
@ -1,5 +1,6 @@
|
|||
import algorithm, atomics, sequtils, strformat, strutils, sugar, sequtils, json, parseUtils, std/wrapnils, tables
|
||||
import NimQml, json, sequtils, chronicles, strutils, strformat, json, stint
|
||||
import web3/ethhexstrings
|
||||
|
||||
import
|
||||
../../../status/[status, settings, wallet, tokens],
|
||||
|
@ -108,6 +109,41 @@ QtObject:
|
|||
proc sendTransaction*(self: TransactionsView, from_addr: string, to: string, assetAddress: string, value: string, gas: string, gasPrice: string, password: string, uuid: string) {.slot.} =
|
||||
self.sendTransaction("transactionSent", from_addr, to, assetAddress, value, gas, gasPrice, password, uuid)
|
||||
|
||||
proc transferEth*(self: TransactionsView, from_addr: string, to_addr: string, value: string, gas: string, gasPrice: string, password: string, uuid: string): bool {.slot.} =
|
||||
try:
|
||||
if not validate(HexDataStr(from_addr)): return false
|
||||
if from_addr.len != 42: return false
|
||||
if not validate(HexDataStr(to_addr)): return false
|
||||
if to_addr.len != 42: return false
|
||||
if parseFloat(value) < 0: return false
|
||||
if parseInt(gas) < 0: return false
|
||||
if parseFloat(gasPrice) <= 0: return false
|
||||
if uuid.isEmptyOrWhitespace(): return false
|
||||
|
||||
self.sendTransaction("transactionSent", from_addr, to_addr, ZERO_ADDRESS, value, gas, gasPrice, password, uuid)
|
||||
except Exception as e:
|
||||
error "Error sending eth transfer transaction", msg = e.msg
|
||||
return false
|
||||
return true
|
||||
|
||||
proc transferTokens*(self: TransactionsView, from_addr: string, to_addr: string, assetAddress: string, value: string, gas: string, gasPrice: string, password: string, uuid: string): bool {.slot.} =
|
||||
try:
|
||||
if not validate(HexDataStr(from_addr)): return false
|
||||
if from_addr.len != 42: return false
|
||||
if not validate(HexDataStr(to_addr)): return false
|
||||
if to_addr.len != 42: return false
|
||||
if not validate(HexDataStr(assetAddress)): return false
|
||||
if assetAddress.len != 42: return false
|
||||
if parseFloat(value) <= 0: return false
|
||||
if parseInt(gas) <= 0: return false
|
||||
if parseFloat(gasPrice) <= 0: return false
|
||||
if uuid.isEmptyOrWhitespace(): return false
|
||||
self.sendTransaction("transactionSent", from_addr, to_addr, assetAddress, value, gas, gasPrice, password, uuid)
|
||||
except Exception as e:
|
||||
error "Error sending token transfer transaction", msg = e.msg
|
||||
return false
|
||||
return true
|
||||
|
||||
proc checkRecentHistory*(self: TransactionsView) {.slot.} =
|
||||
var addresses:seq[string] = @[]
|
||||
for acc in self.status.wallet.accounts:
|
||||
|
|
|
@ -9,6 +9,7 @@ import chronicles
|
|||
import nbaser
|
||||
import stew/byteutils
|
||||
from base32 import nil
|
||||
import web3/ethhexstrings
|
||||
|
||||
const HTTPS_SCHEME = "https"
|
||||
const IPFS_GATEWAY = ".infura.status.im"
|
||||
|
@ -91,6 +92,19 @@ proc toAPIRequest(message: string): APIRequest =
|
|||
hostname: data{"hostname"}.getStr()
|
||||
)
|
||||
|
||||
proc validateInput(from_addr, to_addr, value, gas, gasPrice, data: string): bool =
|
||||
if not validate(HexDataStr(from_addr)): return false
|
||||
if from_addr.len != 42: return false
|
||||
if to_addr != "":
|
||||
if not validate(HexDataStr(to_addr)): return false
|
||||
if to_addr.len != 42: return false
|
||||
if parseFloat(value) < 0: return false
|
||||
if parseInt(gas) <= 0: return false
|
||||
if parseFloat(gasPrice) <= 0: return false
|
||||
if data != "":
|
||||
if not validate(HexDataStr(data)): return false
|
||||
return true
|
||||
|
||||
proc process(self: ProviderModel, data: Web3SendAsyncReadOnly): string =
|
||||
if AUTH_METHODS.contains(data.payload.rpcMethod) and not self.permissions.hasPermission(data.hostname, Permission.Web3):
|
||||
return $ %* {
|
||||
|
@ -118,16 +132,26 @@ proc process(self: ProviderModel, data: Web3SendAsyncReadOnly): string =
|
|||
else:
|
||||
""
|
||||
|
||||
let validInput = validateInput(fromAddress, to, value, selectedGasLimit, selectedGasPrice, txData)
|
||||
|
||||
var success: bool
|
||||
# TODO make this async
|
||||
let response = wallet.sendTransaction(fromAddress, to, value, selectedGasLimit, selectedGasPrice, password, success, txData)
|
||||
let errorMessage = if not success:
|
||||
if response == "":
|
||||
"web3-response-error"
|
||||
var errorMessage = ""
|
||||
var response = ""
|
||||
|
||||
if validInput:
|
||||
# TODO make this async
|
||||
response = wallet.sendTransaction(fromAddress, to, value, selectedGasLimit, selectedGasPrice, password, success, txData)
|
||||
errorMessage = if not success:
|
||||
if response == "":
|
||||
"web3-response-error"
|
||||
else:
|
||||
response
|
||||
else:
|
||||
response
|
||||
""
|
||||
else:
|
||||
""
|
||||
success = false
|
||||
errorMessage = "Invalid input"
|
||||
|
||||
|
||||
return $ %* {
|
||||
"type": ResponseTypes.Web3SendAsyncCallback,
|
||||
|
|
|
@ -19,7 +19,19 @@ ModalPopup {
|
|||
property alias transactionSigner: transactionSigner
|
||||
|
||||
property var sendTransaction: function(selectedGasLimit, selectedGasPrice, enteredPassword) {
|
||||
let responseStr = walletModel.transactionsView.sendTransaction(selectFromAccount.selectedAccount.address,
|
||||
let success = false
|
||||
if(root.selectedAsset.address == Constants.zeroAddress){
|
||||
success = walletModel.transactionsView.transferEth(
|
||||
selectFromAccount.selectedAccount.address,
|
||||
selectRecipient.selectedRecipient.address,
|
||||
root.selectedAmount,
|
||||
selectedGasLimit,
|
||||
selectedGasPrice,
|
||||
enteredPassword,
|
||||
stack.uuid)
|
||||
} else {
|
||||
success = walletModel.transactionsView.transferTokens(
|
||||
selectFromAccount.selectedAccount.address,
|
||||
selectRecipient.selectedRecipient.address,
|
||||
root.selectedAsset.address,
|
||||
root.selectedAmount,
|
||||
|
@ -27,6 +39,13 @@ ModalPopup {
|
|||
selectedGasPrice,
|
||||
enteredPassword,
|
||||
stack.uuid)
|
||||
}
|
||||
|
||||
if(!success){
|
||||
sendingError.text = qsTr("Invalid transaction parameters")
|
||||
return sendingError.open()
|
||||
}
|
||||
|
||||
|
||||
root.close()
|
||||
}
|
||||
|
|
|
@ -27,7 +27,19 @@ ModalPopup {
|
|||
|
||||
function sendTransaction() {
|
||||
stack.currentGroup.isPending = true
|
||||
walletModel.transactionsView.sendTransaction(selectFromAccount.selectedAccount.address,
|
||||
let success = false
|
||||
if(txtAmount.selectedAsset.address == ""){
|
||||
success = walletModel.transactionsView.transferEth(
|
||||
selectFromAccount.selectedAccount.address,
|
||||
selectRecipient.selectedRecipient.address,
|
||||
txtAmount.selectedAmount,
|
||||
gasSelector.selectedGasLimit,
|
||||
gasSelector.selectedGasPrice,
|
||||
transactionSigner.enteredPassword,
|
||||
stack.uuid)
|
||||
} else {
|
||||
success = walletModel.transactionsView.transferTokens(
|
||||
selectFromAccount.selectedAccount.address,
|
||||
selectRecipient.selectedRecipient.address,
|
||||
txtAmount.selectedAsset.address,
|
||||
txtAmount.selectedAmount,
|
||||
|
@ -35,6 +47,12 @@ ModalPopup {
|
|||
gasSelector.selectedGasPrice,
|
||||
transactionSigner.enteredPassword,
|
||||
stack.uuid)
|
||||
}
|
||||
|
||||
if(!success){
|
||||
sendingError.text = qsTr("Invalid transaction parameters")
|
||||
return sendingError.open()
|
||||
}
|
||||
}
|
||||
|
||||
TransactionStackView {
|
||||
|
|
Loading…
Reference in New Issue