mirror of
https://github.com/status-im/status-desktop.git
synced 2025-01-09 22:06:25 +00:00
833848188c
The disconnect notifications were operating on `WalletConnectService.currentSessionProposal`. This object stores the current session object on connect, but it's not necessarily the same session the user wants to disconnect. To fix this I'm getting the active sessions from status-go when the disconnect request is received (from Status or dapp). If the topic matches to any connection topic owned by the users accounts we'll show a notification. (cherry picked from commit fea4e8ed7695acbbabf3c39da955bf4bab1962c3)
153 lines
5.5 KiB
QML
153 lines
5.5 KiB
QML
import QtQuick 2.15
|
|
|
|
import StatusQ.Core.Utils 0.1
|
|
|
|
QObject {
|
|
id: root
|
|
|
|
required property var controller
|
|
/// \c dappsJson serialized from status-go.wallet.GetDapps
|
|
signal dappsListReceived(string dappsJson)
|
|
signal activeSessionsReceived(var activeSessionsJsonObj, bool success)
|
|
signal userAuthenticated(string topic, string id, string password, string pin, string payload)
|
|
signal userAuthenticationFailed(string topic, string id)
|
|
|
|
function addWalletConnectSession(sessionJson) {
|
|
return controller.addWalletConnectSession(sessionJson)
|
|
}
|
|
|
|
function deactivateWalletConnectSession(topic) {
|
|
return controller.deactivateWalletConnectSession(topic)
|
|
}
|
|
|
|
function updateWalletConnectSessions(activeTopicsJson) {
|
|
return controller.updateSessionsMarkedAsActive(activeTopicsJson)
|
|
}
|
|
|
|
function authenticateUser(topic, id, address, payload) {
|
|
let ok = controller.authenticateUser(topic, id, address, payload)
|
|
if(!ok) {
|
|
root.userAuthenticationFailed()
|
|
}
|
|
}
|
|
|
|
// Returns the hex encoded signature of the message or empty string if error
|
|
function signMessageUnsafe(topic, id, address, password, message) {
|
|
return controller.signMessageUnsafe(address, password, message)
|
|
}
|
|
|
|
// Returns the hex encoded signature of the message or empty string if error
|
|
function signMessage(topic, id, address, password, message) {
|
|
return controller.signMessage(address, password, message)
|
|
}
|
|
|
|
// Returns the hex encoded signature of the typedDataJson or empty string if error
|
|
function safeSignTypedData(topic, id, address, password, typedDataJson, chainId, legacy) {
|
|
return controller.safeSignTypedData(address, password, typedDataJson, chainId, legacy)
|
|
}
|
|
|
|
// Remove leading zeros from hex number as expected by status-go
|
|
function stripLeadingZeros(hexNumber) {
|
|
let fixed = hexNumber.replace(/^0x0*/, '0x')
|
|
return fixed == '0x' ? '0x0' : fixed;
|
|
}
|
|
|
|
// Strip leading zeros from numbers as expected by status-go
|
|
function prepareTxForStatusGo(txObj) {
|
|
let tx = Object.assign({}, txObj)
|
|
if (txObj.gasLimit) {
|
|
tx.gasLimit = stripLeadingZeros(txObj.gasLimit)
|
|
}
|
|
if (txObj.gas) {
|
|
tx.gas = stripLeadingZeros(txObj.gas)
|
|
}
|
|
if (txObj.gasPrice) {
|
|
tx.gasPrice = stripLeadingZeros(txObj.gasPrice)
|
|
}
|
|
if (txObj.nonce) {
|
|
tx.nonce = stripLeadingZeros(txObj.nonce)
|
|
}
|
|
if (txObj.maxFeePerGas) {
|
|
tx.maxFeePerGas = stripLeadingZeros(txObj.maxFeePerGas)
|
|
}
|
|
if (txObj.maxPriorityFeePerGas) {
|
|
tx.maxPriorityFeePerGas = stripLeadingZeros(txObj.maxPriorityFeePerGas)
|
|
}
|
|
if (txObj.value) {
|
|
tx.value = stripLeadingZeros(txObj.value)
|
|
}
|
|
return tx
|
|
}
|
|
|
|
// Empty maxFeePerGas will fetch the current chain's maxFeePerGas
|
|
// Returns ui/imports/utils -> Constants.TransactionEstimatedTime values
|
|
function getEstimatedTime(chainId, maxFeePerGasHex) {
|
|
return controller.getEstimatedTime(chainId, maxFeePerGasHex)
|
|
}
|
|
|
|
// Returns nim's SuggestedFeesDto; see src/app_service/service/transaction/dto.nim
|
|
// Returns all value initialized to 0 if error
|
|
function getSuggestedFees(chainId) {
|
|
return JSON.parse(controller.getSuggestedFeesJson(chainId))
|
|
}
|
|
|
|
// Returns the hex encoded signature of the transaction or empty string if error
|
|
function signTransaction(topic, id, address, chainId, password, txObj) {
|
|
let tx = prepareTxForStatusGo(txObj)
|
|
return controller.signTransaction(address, chainId, password, JSON.stringify(tx))
|
|
}
|
|
|
|
// Returns the hash of the transaction or empty string if error
|
|
function sendTransaction(topic, id, address, chainId, password, txObj) {
|
|
let tx = prepareTxForStatusGo(txObj)
|
|
return controller.sendTransaction(address, chainId, password, JSON.stringify(tx))
|
|
}
|
|
|
|
/// \c getDapps triggers an async response to \c dappsListReceived
|
|
function getDapps() {
|
|
return controller.getDapps()
|
|
}
|
|
|
|
/// \c getActiveSessions triggers an async response to \c activeSessionsReceived
|
|
/// \returns true if the request was sent successfully
|
|
function getActiveSessions() {
|
|
return controller.getActiveSessions()
|
|
}
|
|
|
|
function hexToDec(hex) {
|
|
return controller.hexToDecBigString(hex)
|
|
}
|
|
|
|
// Return just the modified fields { "maxFeePerGas": "0x<...>", "maxPriorityFeePerGas": "0x<...>" }
|
|
function convertFeesInfoToHex(feesInfoJson) {
|
|
return controller.convertFeesInfoToHex(feesInfoJson)
|
|
}
|
|
|
|
// Handle async response from controller
|
|
Connections {
|
|
target: controller
|
|
|
|
function onDappsListReceived(dappsJson) {
|
|
root.dappsListReceived(dappsJson)
|
|
}
|
|
|
|
function onActiveSessionsReceived(activeSessionsJson) {
|
|
try {
|
|
const jsonObj = JSON.parse(activeSessionsJson)
|
|
root.activeSessionsReceived(jsonObj, true)
|
|
} catch (e) {
|
|
console.error("Failed to parse activeSessionsJson", e)
|
|
root.activeSessionsReceived({}, false)
|
|
return
|
|
}
|
|
}
|
|
|
|
function onUserAuthenticationResult(topic, id, success, password, pin, payload) {
|
|
if (success) {
|
|
root.userAuthenticated(topic, id, password, pin, payload)
|
|
} else {
|
|
root.userAuthenticationFailed(topic, id)
|
|
}
|
|
}
|
|
}
|
|
} |