mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-06 03:33:32 +00:00
112a6f3003
* chore(dapps) remove the POC wallet connect Updates: #15598 * fix(dapps) Wallet Connect internet connection reestablishing issue Add a new NetworkChecker QObject to StatusQ to be used in checking internet connection status. This is used by the WebEngineLoader to only allow loading of web pages when there is an active internet to cover for a corner case on MacOS where the internet connection is not reestablished if the WebEngineView was loaded without an active internet connection. Closes: #15598, #15806 * chore(dapps) disable eth_signTransaction for Wallet Connect Closes: #15661
123 lines
4.0 KiB
JavaScript
123 lines
4.0 KiB
JavaScript
.import StatusQ.Core.Utils 0.1 as SQUtils
|
|
|
|
function chainIdFromEip155(chain) {
|
|
return parseInt(chain.split(':').pop().trim(), 10)
|
|
}
|
|
|
|
function isHex(str) {
|
|
return str.startsWith('0x') && str.length % 2 === 0 && /^[0-9a-fA-F]*$/.test(str.slice(2))
|
|
}
|
|
|
|
function hexToString(hex) {
|
|
if (hex.startsWith("0x")) {
|
|
hex = hex.substring(2);
|
|
}
|
|
|
|
var str = '';
|
|
for (var i = 0; i < hex.length; i += 2) {
|
|
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
|
|
}
|
|
return str;
|
|
}
|
|
|
|
function strToHex(str) {
|
|
var hex = '';
|
|
for (var i = 0; i < str.length; i++) {
|
|
var byte = str.charCodeAt(i).toString(16);
|
|
hex += (byte.length < 2 ? '0' : '') + byte;
|
|
}
|
|
return '0x' + hex;
|
|
}
|
|
|
|
function extractChainsAndAccountsFromApprovedNamespaces(approvedNamespaces) {
|
|
const eip155Data = approvedNamespaces.eip155;
|
|
const chains = eip155Data.chains.map(chainIdFromEip155);
|
|
const accountSet = new Set(
|
|
eip155Data.accounts.map(account => account.split(':').pop().trim())
|
|
);
|
|
const uniqueAccounts = Array.from(accountSet);
|
|
return { chains, accounts: uniqueAccounts };
|
|
}
|
|
|
|
function buildSupportedNamespacesFromModels(chainsModel, accountsModel, methods) {
|
|
var chainIds = []
|
|
var addresses = []
|
|
for (let i = 0; i < chainsModel.count; i++) {
|
|
let entry = SQUtils.ModelUtils.get(chainsModel, i)
|
|
chainIds.push(parseInt(entry.chainId))
|
|
}
|
|
for (let i = 0; i < accountsModel.count; i++) {
|
|
let entry = SQUtils.ModelUtils.get(accountsModel, i)
|
|
addresses.push(entry.address)
|
|
}
|
|
return buildSupportedNamespaces(chainIds, addresses, methods)
|
|
}
|
|
|
|
function buildSupportedNamespaces(chainIds, addresses, methods) {
|
|
let eipChainIds = []
|
|
let eipAddresses = []
|
|
for (let i = 0; i < chainIds.length; i++) {
|
|
let chainId = chainIds[i]
|
|
eipChainIds.push(`"eip155:${chainId}"`)
|
|
for (let i = 0; i < addresses.length; i++) {
|
|
eipAddresses.push(`"eip155:${chainId}:${addresses[i]}"`)
|
|
}
|
|
}
|
|
let methodsStr = methods.map(method => `"${method}"`).join(',')
|
|
return `{
|
|
"eip155":{
|
|
"chains": [${eipChainIds.join(',')}],
|
|
"methods": [${methodsStr}],
|
|
"events": ["accountsChanged", "chainChanged"],
|
|
"accounts": [${eipAddresses.join(',')}]
|
|
}
|
|
}`
|
|
}
|
|
|
|
function validURI(uri) {
|
|
const regex = /^wc:[0-9a-fA-F-]*@([1-9][0-9]*)(\?([a-zA-Z-]+=[^&]+)(&[a-zA-Z-]+=[^&]+)*)?$/
|
|
return regex.test(uri)
|
|
}
|
|
|
|
function extractInfoFromPairUri(uri) {
|
|
let topic = ""
|
|
let expiry = NaN
|
|
// Extract topic and expiry from wc:99fdcac5cc081ac8c1181b4c38c5dc49fb5eb212706d5c94c445be549765e7f0@2?expiryTimestamp=1720090818&relay-protocol=irn&symKey=c6b67d94174bd42d16ff288220ce9b8966e5b56a2d3570a30d5b0a760f1953f0
|
|
const regex = /wc:([0-9a-fA-F]*)/
|
|
const match = uri.match(regex)
|
|
if (match) {
|
|
topic = match[1]
|
|
}
|
|
|
|
let parts = uri.split('?')
|
|
if (parts.length > 1) {
|
|
const params = parts[1].split('&')
|
|
for (let i = 0; i < params.length; i++) {
|
|
const keyVal = params[i].split('=')
|
|
if (keyVal[0] === 'expiryTimestamp') {
|
|
expiry = parseInt(keyVal[1])
|
|
}
|
|
}
|
|
}
|
|
return { topic, expiry }
|
|
}
|
|
|
|
function filterActiveSessionsForKnownAccounts(sessions, accountsModel) {
|
|
let knownSessions = ({})
|
|
Object.keys(sessions).forEach((topic) => {
|
|
const session = sessions[topic]
|
|
const eip155Addresses = session.namespaces.eip155.accounts
|
|
const accountSet = new Set(
|
|
eip155Addresses.map(eip155Address => eip155Address.split(':').pop().trim())
|
|
);
|
|
const uniqueAddresses = Array.from(accountSet);
|
|
const firstAccount = SQUtils.ModelUtils.getFirstModelEntryIf(accountsModel, (account) => {
|
|
return uniqueAddresses.includes(account.address)
|
|
})
|
|
if (!firstAccount) {
|
|
return
|
|
}
|
|
knownSessions[topic] = session
|
|
})
|
|
return knownSessions
|
|
} |