fix(@desktop/wallet): send modal not working with bridge hop (mainnet to optimism)

Fixes #12615
This commit is contained in:
Sale Djenic 2023-11-02 12:40:43 +01:00 committed by saledjenic
parent 52dd0abbce
commit 94953bb925
11 changed files with 35 additions and 30 deletions

View File

@ -104,8 +104,10 @@ proc authenticate*(self: Controller, keyUid = "") =
keyUid: keyUid) keyUid: keyUid)
self.events.emit(SIGNAL_SHARED_KEYCARD_MODULE_AUTHENTICATE_USER, data) self.events.emit(SIGNAL_SHARED_KEYCARD_MODULE_AUTHENTICATE_USER, data)
proc suggestedRoutes*(self: Controller, account: string, amount: Uint256, token: string, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): string = proc suggestedRoutes*(self: Controller, accountFrom: string, accountTo: string, amount: Uint256, token: string, disabledFromChainIDs,
let suggestedRoutes = self.transactionService.suggestedRoutes(account, amount, token, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs, sendType, lockedInAmounts) disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): string =
let suggestedRoutes = self.transactionService.suggestedRoutes(accountFrom, accountTo, amount, token, disabledFromChainIDs,
disabledToChainIDs, preferredChainIDs, sendType, lockedInAmounts)
return suggestedRoutes.toJson() return suggestedRoutes.toJson()
proc transfer*(self: Controller, from_addr: string, to_addr: string, tokenSymbol: string, proc transfer*(self: Controller, from_addr: string, to_addr: string, tokenSymbol: string,

View File

@ -24,7 +24,8 @@ method refreshWalletAccounts*(self: AccessInterface) {.base.} =
method getTokenBalanceOnChain*(self: AccessInterface, address: string, chainId: int, symbol: string): CurrencyAmount {.base.} = method getTokenBalanceOnChain*(self: AccessInterface, address: string, chainId: int, symbol: string): CurrencyAmount {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method suggestedRoutes*(self: AccessInterface, account: string, amount: UInt256, token: string, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): string {.base.} = method suggestedRoutes*(self: AccessInterface, accountFrom: string, accountTo: string, amount: UInt256, token: string, disabledFromChainIDs,
disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): string {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method suggestedRoutesReady*(self: AccessInterface, suggestedRoutes: SuggestedRoutesDto) {.base.} = method suggestedRoutesReady*(self: AccessInterface, suggestedRoutes: SuggestedRoutesDto) {.base.} =

View File

@ -25,7 +25,7 @@ export io_interface
logScope: logScope:
topics = "wallet-send-module" topics = "wallet-send-module"
const cancelledRequest* = "cancelled" const authenticationCanceled* = "authenticationCanceled"
# Shouldn't be public ever, use only within this module. # Shouldn't be public ever, use only within this module.
type TmpSendTransactionDetails = object type TmpSendTransactionDetails = object
@ -279,7 +279,7 @@ method authenticateAndTransfer*(self: Module, fromAddr: string, toAddr: string,
method onUserAuthenticated*(self: Module, password: string, pin: string) = method onUserAuthenticated*(self: Module, password: string, pin: string) =
if password.len == 0: if password.len == 0:
self.transactionWasSent() self.transactionWasSent(chainId = 0, txHash = "", uuid = self.tmpSendTransactionDetails.uuid, error = authenticationCanceled)
else: else:
self.tmpPin = pin self.tmpPin = pin
let doHashing = self.tmpPin.len == 0 let doHashing = self.tmpPin.len == 0
@ -323,12 +323,13 @@ method onTransactionSigned*(self: Module, keycardFlowType: string, keycardEvent:
method transactionWasSent*(self: Module, chainId: int, txHash, uuid, error: string) = method transactionWasSent*(self: Module, chainId: int, txHash, uuid, error: string) =
if txHash.len == 0: if txHash.len == 0:
self.view.sendTransactionSentSignal(chainId = 0, txHash = "", uuid = self.tmpSendTransactionDetails.uuid, error = cancelledRequest) self.view.sendTransactionSentSignal(chainId = 0, txHash = "", uuid = self.tmpSendTransactionDetails.uuid, error)
return return
self.view.sendTransactionSentSignal(chainId, txHash, uuid, error) self.view.sendTransactionSentSignal(chainId, txHash, uuid, error)
method suggestedRoutes*(self: Module, account: string, amount: UInt256, token: string, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): string = method suggestedRoutes*(self: Module, accountFrom: string, accountTo: string, amount: UInt256, token: string, disabledFromChainIDs,
return self.controller.suggestedRoutes(account, amount, token, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs, sendType, lockedInAmounts) disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): string =
return self.controller.suggestedRoutes(accountFrom, accountTo, amount, token, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs, sendType, lockedInAmounts)
method suggestedRoutesReady*(self: Module, suggestedRoutes: SuggestedRoutesDto) = method suggestedRoutesReady*(self: Module, suggestedRoutes: SuggestedRoutesDto) =
self.tmpSendTransactionDetails.paths = suggestedRoutes.best self.tmpSendTransactionDetails.paths = suggestedRoutes.best

View File

@ -203,6 +203,7 @@ QtObject:
proc setTransactionRoute*(self: View, routes: TransactionRoutes) = proc setTransactionRoute*(self: View, routes: TransactionRoutes) =
self.transactionRoutes = routes self.transactionRoutes = routes
self.suggestedRoutesReady(newQVariant(self.transactionRoutes)) self.suggestedRoutesReady(newQVariant(self.transactionRoutes))
proc suggestedRoutes*(self: View, amount: string): string {.slot.} = proc suggestedRoutes*(self: View, amount: string): string {.slot.} =
var parsedAmount = stint.u256(0) var parsedAmount = stint.u256(0)
try: try:
@ -210,9 +211,10 @@ QtObject:
except Exception as e: except Exception as e:
discard discard
return self.delegate.suggestedRoutes(self.selectedSenderAccount.address(), return self.delegate.suggestedRoutes(self.selectedSenderAccount.address(), self.selectedRecipient,
parsedAmount, self.selectedAssetSymbol, self.fromNetworksModel.getRouteDisabledNetworkChainIds(), parsedAmount, self.selectedAssetSymbol, self.fromNetworksModel.getRouteDisabledNetworkChainIds(),
self.toNetworksModel.getRouteDisabledNetworkChainIds(), self.toNetworksModel.getRoutePreferredNetworkChainIds(), self.sendType, self.fromNetworksModel.getRouteLockedChainIds()) self.toNetworksModel.getRouteDisabledNetworkChainIds(), self.toNetworksModel.getRoutePreferredNetworkChainIds(),
self.sendType, self.fromNetworksModel.getRouteLockedChainIds())
proc switchSenderAccountByAddress*(self: View, address: string) = proc switchSenderAccountByAddress*(self: View, address: string) =
let (account, index) = self.senderAccounts.getItemByAddress(address) let (account, index) = self.senderAccounts.getItemByAddress(address)

View File

@ -91,11 +91,9 @@ proc toTransactionSignature(jsonObj: JsonNode): TransactionSignature =
discard jsonObj.getProp(ResponseParamTxSignatureS, result.s) discard jsonObj.getProp(ResponseParamTxSignatureS, result.s)
var v: int var v: int
discard jsonObj.getProp(ResponseParamTxSignatureV, v) discard jsonObj.getProp(ResponseParamTxSignatureV, v)
## The signature must conform to the secp256k1 curve R, S and V values, where the V value must be 27 or 28 for legacy reasons. result.v = "00"
## Transform V from 0/1 to 27/28 (1b/1c) according to the yellow paper https://ethereum.github.io/yellowpaper/paper.pdf
result.v = "1b"
if v == 1: if v == 1:
result.v = "1c" result.v = "01"
proc toKeycardEvent(jsonObj: JsonNode): KeycardEvent = proc toKeycardEvent(jsonObj: JsonNode): KeycardEvent =
discard jsonObj.getProp(ResponseParamErrorKey, result.error) discard jsonObj.getProp(ResponseParamErrorKey, result.error)

View File

@ -14,7 +14,8 @@ proc sortAsc[T](t1, t2: T): int =
type type
GetSuggestedRoutesTaskArg* = ref object of QObjectTaskArg GetSuggestedRoutesTaskArg* = ref object of QObjectTaskArg
account: string accountFrom: string
accountTo: string
amount: Uint256 amount: Uint256
token: string token: string
disabledFromChainIDs: seq[int] disabledFromChainIDs: seq[int]
@ -88,12 +89,14 @@ const getSuggestedRoutesTask*: Task = proc(argEncoded: string) {.gcsafe, nimcall
except: except:
discard discard
let response = eth.suggestedRoutes(arg.account, amountAsHex, arg.token, arg.disabledFromChainIDs, arg.disabledToChainIDs, arg.preferredChainIDs, ord(arg.sendType), lockedInAmounts).result let response = eth.suggestedRoutes(arg.accountFrom, arg.accountTo, amountAsHex, arg.token, arg.disabledFromChainIDs,
arg.disabledToChainIDs, arg.preferredChainIDs, ord(arg.sendType), lockedInAmounts).result
var bestPaths = response["Best"].getElems().map(x => x.toTransactionPathDto()) var bestPaths = response["Best"].getElems().map(x => x.toTransactionPathDto())
# retry along with unpreferred chains incase no route is possible with preferred chains # retry along with unpreferred chains incase no route is possible with preferred chains
if(bestPaths.len == 0 and arg.preferredChainIDs.len > 0): if(bestPaths.len == 0 and arg.preferredChainIDs.len > 0):
let response = eth.suggestedRoutes(arg.account, amountAsHex, arg.token, arg.disabledFromChainIDs, arg.disabledToChainIDs, @[], ord(arg.sendType), lockedInAmounts).result let response = eth.suggestedRoutes(arg.accountFrom, arg.accountTo, amountAsHex, arg.token, arg.disabledFromChainIDs,
arg.disabledToChainIDs, @[], ord(arg.sendType), lockedInAmounts).result
bestPaths = response["Best"].getElems().map(x => x.toTransactionPathDto()) bestPaths = response["Best"].getElems().map(x => x.toTransactionPathDto())
bestPaths.sort(sortAsc[TransactionPathDto]) bestPaths.sort(sortAsc[TransactionPathDto])

View File

@ -427,11 +427,6 @@ QtObject:
try: try:
let response = transactions.proceedWithTransactionsSignatures(signatures) let response = transactions.proceedWithTransactionsSignatures(signatures)
self.sendTransactionSentSignal(fromAddr, toAddr, uuid, selectedRoutes, response) self.sendTransactionSentSignal(fromAddr, toAddr, uuid, selectedRoutes, response)
if response.result{"hashes"} != nil:
for route in selectedRoutes:
for hash in response.result["hashes"][$route.fromNetwork.chainID]:
self.watchTransaction(hash.getStr, fromAddr, toAddr, $PendingTransactionTypeDto.WalletTransfer, " ", route.fromNetwork.chainID, track = false)
self.events.emit(SIGNAL_TRANSACTION_SENT, TransactionSentArgs(chainId: route.fromNetwork.chainID, txHash: hash.getStr, uuid: uuid , error: ""))
except Exception as e: except Exception as e:
self.sendTransactionSentSignal(fromAddr, toAddr, uuid, @[], RpcResponse[JsonNode](), fmt"Error proceeding with transactions signatures: {e.msg}") self.sendTransactionSentSignal(fromAddr, toAddr, uuid, @[], RpcResponse[JsonNode](), fmt"Error proceeding with transactions signatures: {e.msg}")
@ -451,12 +446,14 @@ QtObject:
error "error handling suggestedRoutesReady response", errDesription=e.msg error "error handling suggestedRoutesReady response", errDesription=e.msg
self.events.emit(SIGNAL_SUGGESTED_ROUTES_READY, SuggestedRoutesArgs(suggestedRoutes: suggestedRoutesDto)) self.events.emit(SIGNAL_SUGGESTED_ROUTES_READY, SuggestedRoutesArgs(suggestedRoutes: suggestedRoutesDto))
proc suggestedRoutes*(self: Service, account: string, amount: Uint256, token: string, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): SuggestedRoutesDto = proc suggestedRoutes*(self: Service, accountFrom: string, accountTo: string, amount: Uint256, token: string, disabledFromChainIDs,
disabledToChainIDs, preferredChainIDs: seq[int], sendType: SendType, lockedInAmounts: string): SuggestedRoutesDto =
let arg = GetSuggestedRoutesTaskArg( let arg = GetSuggestedRoutesTaskArg(
tptr: cast[ByteAddress](getSuggestedRoutesTask), tptr: cast[ByteAddress](getSuggestedRoutesTask),
vptr: cast[ByteAddress](self.vptr), vptr: cast[ByteAddress](self.vptr),
slot: "suggestedRoutesReady", slot: "suggestedRoutesReady",
account: account, accountFrom: accountFrom,
accountTo: accountTo,
amount: amount, amount: amount,
token: token, token: token,
disabledFromChainIDs: disabledFromChainIDs, disabledFromChainIDs: disabledFromChainIDs,

View File

@ -29,8 +29,9 @@ proc suggestedFees*(chainId: int): RpcResponse[JsonNode] {.raises: [Exception].}
let payload = %* [chainId] let payload = %* [chainId]
return core.callPrivateRPC("wallet_getSuggestedFees", payload) return core.callPrivateRPC("wallet_getSuggestedFees", payload)
proc suggestedRoutes*(account: string, amount: string, token: string, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs: seq[int], sendType: int, lockedInAmounts: var Table[string, string]): RpcResponse[JsonNode] {.raises: [Exception].} = proc suggestedRoutes*(accountFrom: string, accountTo: string, amount: string, token: string, disabledFromChainIDs,
let payload = %* [sendType, account, amount, token, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs, 1 , lockedInAmounts] disabledToChainIDs, preferredChainIDs: seq[int], sendType: int, lockedInAmounts: var Table[string, string]): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [sendType, accountFrom, accountTo, amount, token, disabledFromChainIDs, disabledToChainIDs, preferredChainIDs, 1, lockedInAmounts]
return core.callPrivateRPC("wallet_getSuggestedRoutes", payload) return core.callPrivateRPC("wallet_getSuggestedRoutes", payload)
rpc(getEstimatedLatestBlockNumber, "wallet"): rpc(getEstimatedLatestBlockNumber, "wallet"):

View File

@ -507,7 +507,7 @@ StatusDialog {
d.isPendingTx = false d.isPendingTx = false
if (uuid !== d.uuid) return if (uuid !== d.uuid) return
if (!!error) { if (!!error) {
if (error.includes(Constants.walletSection.cancelledMessage)) { if (error.includes(Constants.walletSection.authenticationCanceled)) {
return return
} }
sendingError.text = error sendingError.text = error

View File

@ -1109,7 +1109,7 @@ QtObject {
} }
readonly property QtObject walletSection: QtObject { readonly property QtObject walletSection: QtObject {
readonly property string cancelledMessage: "cancelled" readonly property string authenticationCanceled: "authenticationCanceled"
} }
// list of symbols for which pngs are stored to avoid // list of symbols for which pngs are stored to avoid

2
vendor/status-go vendored

@ -1 +1 @@
Subproject commit 4fddcb54ff173a3dbfa3fb67710cce6dfe38af7c Subproject commit ce121710d9f3b13fd9a6562ca97c947c294564e2