diff --git a/android/app/build.gradle b/android/app/build.gradle index 852f5524f..813f1d0e3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -134,7 +134,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "1.51.5" + versionName "1.51.6" missingDimensionStrategy 'react-native-camera', 'general' multiDexEnabled true diff --git a/app/appstores/Stores/Send/SendActionsEnd.ts b/app/appstores/Stores/Send/SendActionsEnd.ts index efaf4befe..c01c9bb89 100644 --- a/app/appstores/Stores/Send/SendActionsEnd.ts +++ b/app/appstores/Stores/Send/SendActionsEnd.ts @@ -1,5 +1,5 @@ /** - * @version 0.41 + * @version 2.0 */ import analytics from '@react-native-firebase/analytics' @@ -175,7 +175,7 @@ export namespace SendActionsEnd { }}) } else if (uiType === 'WALLET_CONNECT') { Log.log('SendActionsEnd.endRedirect walletConnect will get ' + tx.transactionHash) - await walletConnectActions.approveRequestWalletConnect(walletConnectPayload, tx.transactionHash) + await walletConnectActions.approveRequest(walletConnectPayload, tx.transactionHash) NavStore.goNext('AccountTransactionScreen', { txData: { transactionHash: tx.transactionHash, @@ -203,7 +203,7 @@ export namespace SendActionsEnd { const { bseOrderId } = bse const data = { extraData, ...params, orderHash: bseOrderId, status: 'CLOSE' } if (uiType === 'WALLET_CONNECT') { - await walletConnectActions.rejectRequestWalletConnect(walletConnectPayload) + await walletConnectActions.rejectRequest(walletConnectPayload) } if (typeof bseOrderId === 'undefined' || !bseOrderId) return return ApiV3.setExchangeStatus(data) diff --git a/app/appstores/Stores/WalletConnect/WalletConnectService.js b/app/appstores/Stores/WalletConnect/WalletConnectService.js index 018aca333..12f6ea996 100644 --- a/app/appstores/Stores/WalletConnect/WalletConnectService.js +++ b/app/appstores/Stores/WalletConnect/WalletConnectService.js @@ -1,255 +1,485 @@ /** - * @version 1.0 + * @version 2.0 */ -import BlocksoftCryptoLog from '@crypto/common/BlocksoftCryptoLog' import Log from '@app/services/Log/Log' import { signTypedData } from '@metamask/eth-sig-util' -import BlocksoftUtils from '@crypto/common/BlocksoftUtils' import BlocksoftPrivateKeysUtils from '@crypto/common/BlocksoftPrivateKeysUtils' import walletConnectActions from '@app/appstores/Stores/WalletConnect/WalletConnectStoreActions' -import { handleSendSignModal, handleSendSignTypedModal, handleSendTransactionRedirect, handleSessionRequestModal } from '@app/appstores/Stores/WalletConnect/helpers' +import { + handleSendSignModal, + handleSendSignTypedModal, + handleSendTransactionRedirect, + handleSessionProposalModal, handleSignTransactionModal +} from '@app/appstores/Stores/WalletConnect/helpers' import { Web3Injected } from '@crypto/services/Web3Injected' -import trusteeAsyncStorage from '@appV2/services/trusteeAsyncStorage/trusteeAsyncStorage' +import { Core } from '@walletconnect/core' +import { Web3Wallet } from '@walletconnect/web3wallet' +import { getSdkError } from '@walletconnect/utils' -const walletConnectCore = require('@walletconnect/core') -const walletConnectISO = require('@walletconnect/iso-crypto') +import WalletConnectServiceWrapper from '@app/appstores/Stores/WalletConnect/WalletConnectServiceWrapper' +import WalletConnectServiceWrapperWeb3 from '@app/appstores/Stores/WalletConnect/WalletConnectServiceWrapperWeb3' -class WalletConnect extends walletConnectCore.default { - // @ts-ignore - constructor(connectorOpts, pushServerOpts) { - super({ - cryptoLib: walletConnectISO, - connectorOpts, - pushServerOpts - }) +import { showModal } from '@app/appstores/Stores/Modal/ModalActions' +import { strings } from '@app/services/i18n' +import config from '@app/config/config' +import store from '@app/store' + +let core = false +let web3wallet = false + +const WC_PROJECT_ID = 'daa39ed4fa0978cc19a9c9c0a2a7015c' // https://cloud.walletconnect.com/app/project + +const _getPrivateData = async (from) => { + const accountList = store.getState().accountStore.accountList + if (!accountList) { + return false + } + let account = false + for (const walletHash in accountList) { + for (const currencyCode in accountList[walletHash]) { + if (typeof accountList[walletHash][currencyCode].address !== 'undefined' + && accountList[walletHash][currencyCode].address.toLowerCase() === from.toLowerCase()) { + account = accountList[walletHash][currencyCode] + } + } + } + if (!account) { + return false + } + + const discoverFor = { + addressToCheck: account.address, + derivationPath: account.derivationPath, + walletHash: account.walletHash, + currencyCode: account.currencyCode + } + const privateData = await BlocksoftPrivateKeysUtils.getPrivateKey(discoverFor, 'WalletConnectService') + return privateData +} +const _getAccounts = (payload) => { + const { walletHash } = store.getState().mainStore.selectedWallet + const { params } = payload + const { requiredNamespaces } = params + + const accountList = store.getState().accountStore.accountList + if (!accountList || typeof accountList[walletHash] === 'undefined') { + return false + } + const currentETHAddress = accountList[walletHash]['ETH'] + const namespaces = {} + for (const key in requiredNamespaces) { + const accounts = [] + for (const chain of requiredNamespaces[key].chains) { + if (chain === 'tron:0x2b6653dc' && typeof accountList[walletHash]['TRX'] !== 'undefined') { + accounts.push(`${chain}:${accountList[walletHash]['TRX'].address}`) + } else if (chain === 'tron:0x2b6653dc' && typeof accountList[walletHash]['TRX_USDT'] !== 'undefined') { + accounts.push(`${chain}:${accountList[walletHash]['TRX_USDT'].address}`) + } else if (chain === 'solana' && typeof accountList[walletHash]['SOL'] !== 'undefined') { + accounts.push(`${chain}:${accountList[walletHash]['SOL'].address}`) + } else if (chain === 'solana' && typeof accountList[walletHash]['SOL_USDT'] !== 'undefined') { + accounts.push(`${chain}:${accountList[walletHash]['SOL_USDT'].address}`) + } else { + accounts.push(`${chain}:${currentETHAddress.address}`) + } + } + namespaces[key] = { + accounts, + methods: requiredNamespaces[key].methods, + events: requiredNamespaces[key].events + } + } + return { + namespaces } } const walletConnectService = { - createAndConnect: (fullLink, session, dappData) => { - const walletConnector = new WalletConnect( - { - uri: fullLink, - clientMeta: { - description: 'Trustee Wallet for Wallet Connect', - url: 'https://trustee.deals', - icons: ['https://walletconnect.org/walletconnect-logo.png'], - name: 'Trustee Wallet' - }, - session - } - ) - walletConnector.on('session_request', (error, payload) => { - Log.log('WalletConnectService.on session_request payload', payload, error) - if (error) { - throw error - } - if (!walletConnector.connected) { - walletConnector.createSession() - } + _init: async () => { + core = new Core({ + // logger: 'debug', + projectId: WC_PROJECT_ID, + relayUrl: 'wss://relay.walletconnect.com' + }) + core = WalletConnectServiceWrapper(core) - if (!payload) { - Log.log('WalletConnectService.on session_request no payload') - return + web3wallet = await Web3Wallet.init({ + core, + metadata: { + description: 'Trustee Wallet', + url: 'https://trustee.deals', + icons: ['https://trusteeglobal.com/wp-content/uploads/2023/03/icon_wallet.png'], + name: 'Trustee Wallet' } - if (typeof payload.method === 'undefined' || payload.method !== 'session_request') { - Log.log('WalletConnectService.on session_request no payload method') - return + }) + + web3wallet = await WalletConnectServiceWrapperWeb3(web3wallet) + + web3wallet.on('session_proposal', async (payload) => { + try { + if (!payload) { + Log.log('WalletConnectService.on v2 session_proposal no payload') + return + } + Log.log('WalletConnectService.on v2 session_proposal', JSON.stringify(payload)) + handleSessionProposalModal(web3wallet, payload) + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.on v2 session_proposal error ' + e.message) + } + Log.log('WalletConnectService.on v2 session_proposal error ' + e.message) } - if (typeof payload.params === 'undefined' || typeof payload.params[0] === 'undefined') { - Log.log('WalletConnectService.on session_request no payload params') - return + }) + + web3wallet.on('session_request', (payload) => { + try { + Log.log('WalletConnectService.on v2 session_request', JSON.stringify(payload)) + let { request, chainId } = payload.params + const { method, params } = request + + if (typeof chainId !== 'undefined' && chainId && chainId.indexOf(':') !== -1) { + const tmp = chainId.split(':') + if (typeof tmp[1] !== 'undefined') { + chainId = tmp[1] * 1 + } + } + + if (method === 'personal_sign') { + handleSendSignModal(web3wallet, chainId, params[1], params[0], payload) + } else if (method.indexOf('eth_') === -1) { + if (config.debug.appErrors) { + console.log('WalletConnectService.on v2 session_request todo method ' + method, JSON.stringify(payload)) + } + Log.log('WalletConnectService.on v2 session_request todo method ' + method, JSON.stringify(payload)) + showModal({ + type: 'INFO_MODAL', + icon: null, + title: strings('modal.exchange.sorry'), + description: `Method ${method} is not supported` + }) + walletConnectService.rejectRequest(web3wallet, payload) + } else { + const WEB3 = Web3Injected(chainId) + if (method === 'eth_sendTransaction') { + handleSendTransactionRedirect(web3wallet, params[0], WEB3.MAIN_CURRENCY_CODE, payload) + } else if (method === 'eth_signTransaction') { + handleSignTransactionModal(web3wallet, chainId, params[0], WEB3.MAIN_CURRENCY_CODE, payload) + } else if (method === 'eth_sign') { + handleSendSignModal(web3wallet, chainId, params[0], params[1], payload) + } else if (method === 'eth_signTypedData') { + handleSendSignTypedModal(web3wallet, chainId, params[0], JSON.parse(params[1]), payload) + } else { + if (config.debug.appErrors) { + console.log('WalletConnectService.on v2 session_request no method ' + method, JSON.stringify(payload)) + } + Log.log('WalletConnectService.on v2 session_request no method ' + method, JSON.stringify(payload)) + } + } + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.on v2 session_request error ' + e.message) + } + Log.log('WalletConnectService.on v2 session_request error ' + e.message) } - Log.log('WalletConnectService.on session_request finish', payload.params[0]) + }) - handleSessionRequestModal(walletConnector, payload.params[0], dappData) + web3wallet.on('session_delete', (payload) => { + try { + Log.log('WalletConnectService.on v2 session_delete', JSON.stringify(payload)) + walletConnectActions.resetWalletConnect() + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.on v2 session_delete error ' + e.message) + } + Log.log('WalletConnectService.on v2 session_delete error ' + e.message) + } }) - walletConnector.on('session_update', (error, payload) => { - Log.log('WalletConnectService.on session_update payload', payload) - if (error) { - throw error + web3wallet.on('auth_request', async (payload) => { + if (config.debug.appErrors) { + console.log('WalletConnectService.on v2 auth_request', JSON.stringify(payload)) } - walletConnectActions.setIsConnectedWalletConnect({ - isConnected: walletConnector.session.connected, - peerId: walletConnector.peerId, - peerMeta: walletConnector.peerMeta + Log.log('WalletConnectService.on v2 auth_request', JSON.stringify(payload)) + showModal({ + type: 'INFO_MODAL', + icon: null, + title: strings('modal.exchange.sorry'), + description: `Method auth_request is not supported` }) }) - walletConnector.on('call_request', (error, payload) => { + return web3wallet + }, + + createAndConnect: async (fullLink, activatePairing) => { + try { + if (web3wallet === false) { + await walletConnectService._init() + } + Log.log('WalletConnectService.on v2 init fullLink ' + fullLink + ' ' + (activatePairing ? 'activePairing' : 'no pairing')) + const params = activatePairing ? { uri: fullLink, activatePairing } : { uri: fullLink } try { - Log.log('WalletConnectService.on call_request payload', payload) - if (error) { - throw new Error('Strange ' + error.message) - } - if (payload.method === 'wallet_addEthereumChain' || payload.method === 'wallet_switchEthereumChain') { - const chainId = 1 * BlocksoftUtils.hexToDecimalWalletConnect(payload.params[0].chainId) - Log.log('autoChangeChain ' + payload.params[0].chainId + ' => ' + chainId) - walletConnectActions.getAndSetWalletConnectAccountNetwork(walletConnector, chainId, 'call_request') - - } else if (payload.method === 'eth_signTypedData') { - handleSendSignTypedModal(walletConnector, JSON.parse(payload.params[1]), payload) - } else if (payload.method === 'personal_sign') { - const message = payload.params[0] - handleSendSignModal(walletConnector, message, payload) - } else if (payload.method === 'eth_sendTransaction') { - handleSendTransactionRedirect(walletConnector, payload.params[0], payload) + await web3wallet.core.pairing.pair(params) + } catch (e) { + if (e.message.indexOf('Pairing already exists') !== -1 || e.message.indexOf('Keychain already exists') !== -1) { + // do nothing + Log.log('WalletConnectService.on v2 web3wallet.core.pairing.pair error 1 ' + e.message) + } else if (e.message.indexOf('Request validation') !== -1) { + // do nothing + Log.log('WalletConnectService.on v2 web3wallet.core.pairing.pair error 2 ' + e.message) } else { - Log.err('WalletConnectService.on call_request unknown method: ' + payload.method) - throw new Error('Please call developers to add support of method: ' + payload.method) + if (config.debug.appErrors) { + console.log('WalletConnectService.on ' + e.message + ' in v2 web3wallet.core.pairing.pair') + } + throw new Error(e.message + ' in v2 web3wallet.core.pairing.pair') } - } catch (e) { - Log.err('WalletConnectService.on call_request error ' + e.message) } - }) - walletConnector.on('disconnect', (error, payload) => { - Log.log('WalletConnectService.on disconnect payload', payload) - if (error) { - throw error + return web3wallet + } catch (e1) { + if (config.debug.appErrors) { + console.log('WalletConnectService createAndConnect v2 error ' + e1.message) } - if (payload.event === 'disconnect') { - walletConnectActions.resetWalletConnect() + throw new Error(e1) + } + }, + + getConnections: async (walletConnector) => { + const connections = [] + try { + const activeSessions = await walletConnector.getActiveSessions() + for (const key in activeSessions) { + const res = { + key, + topic : activeSessions[key].topic, + peer: activeSessions[key].peer.metadata + } + connections.push(res) + } + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.getConnections v2 error ' + e.message) + } + Log.log('WalletConnectService.getConnections v2 error ' + e.message) + } + return connections + }, + + killConnections: async (walletConnector) => { + const connections = [] + try { + const activeSessions = await walletConnector.getActiveSessions() + for (const key in activeSessions) { + const res = { + key, + topic : activeSessions[key].topic, + peer: activeSessions[key].peer.metadata + } + try { + await walletConnector.disconnectSession({ + topic: activeSessions[key].topic, + reason: getSdkError("USER_DISCONNECTED"), + }) + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.killConnections v2 error 2 ' + e.message, res) + } + Log.log('WalletConnectService.killConnections v2 error 2 ' + e.message, res) + connections.push(res) + } + } + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.killConnections v2 error ' + e.message) + } + Log.log('WalletConnectService.killConnections v2 error ' + e.message) + } + return connections + }, + + approveRequest: async (walletConnector, payload, transactionHash) => { + try { + Log.log('WalletConnectService.approveRequest v2 transactionHash ' + JSON.stringify(transactionHash), payload) + const res = { + topic: payload.topic, + response: { + id: payload.id, + jsonrpc: '2.0', + result: transactionHash + } + } + if (walletConnector) { + await walletConnector.respondSessionRequest(res) } else { - Log.log('WalletConnectService.on disconnect error unknown event') + await web3wallet.respondSessionRequest(res) } - }) - return walletConnector + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.approveRequest v2 error ' + e.message) + } + Log.log('WalletConnectService.approveRequest v2 error ' + e.message) + } }, - approveRequest: async (walletConnector, walletConnectPayload, transactionHash) => { + // https://docs.walletconnect.com/2.0/advanced/rpc-reference/ethereum-rpc#eth_signtransaction + approveSignTransaction: async (walletConnector, chainId, from, transaction, accountCurrencyCode, payload) => { try { - await walletConnector.approveRequest({ - id: walletConnectPayload.id, - result: transactionHash - }) + Log.log('WalletConnectService.approveSignTransaction v2 chainId ' + chainId + ' from ' + from + ' transaction ' + JSON.stringify(transaction), payload) + + const privateData = await _getPrivateData(from) + if (!privateData) { + return false + } + const WEB3 = Web3Injected(chainId) + const signData = await WEB3.eth.accounts.signTransaction(transaction, privateData.privateKey) + Log.log('WalletConnectService.approveSignTransaction v2 chainId ' + chainId + ' from ' + from + ' signData', signData) + const res = { + topic: payload.topic, + response: { + id: payload.id, + jsonrpc: '2.0', + result: signData.rawTransaction + } + } + await walletConnector.respondSessionRequest(res) } catch (e) { - Log.err('WalletConnectService.approveRequest error ' + e.message) + if (config.debug.appErrors) { + console.log('WalletConnectService.approveSignTransaction v2 error ' + e.message) + } + Log.log('WalletConnectService.approveSignTransaction v2 error ' + e.message) } }, - approveSign: async (walletConnector, message, payload) => { + approveSign: async (walletConnector, chainId, from, message, payload) => { try { - Log.log('WalletConnectService.approveSign', message, payload) - const { chainId } = payload - const { account } = await walletConnectActions.getAndSetWalletConnectAccount(walletConnector, chainId) - const discoverFor = { - addressToCheck: account.address, - derivationPath: account.derivationPath, - walletHash: account.walletHash, - currencyCode: account.currencyCode - } - const privateData = await BlocksoftPrivateKeysUtils.getPrivateKey(discoverFor, 'WalletConnectService') + Log.log('WalletConnectService.approveSign v2 chainId ' + chainId + ' from ' + from + ' message ' + message, payload) + + const privateData = await _getPrivateData(from) + if (!privateData) { + return false + } const WEB3 = Web3Injected(chainId) - const signData = await WEB3.eth.accounts.sign(payload.params[0], privateData.privateKey) + const signData = await WEB3.eth.accounts.sign(message, privateData.privateKey) - await walletConnector.approveRequest({ - id: payload.id, - result: signData.signature - }) + const res = { + topic: payload.topic, + response: { + id: payload.id, + jsonrpc: '2.0', + result: signData.signature + } + } + await walletConnector.respondSessionRequest(res) } catch (e) { - Log.err('WalletConnectService.approveSign error ' + e.message) + if (config.debug.appErrors) { + console.log('WalletConnectService.approveSign v2 error ' + e.message) + } + Log.log('WalletConnectService.approveSign v2 error ' + e.message) } }, - approveSignTyped: async (walletConnector, data, payload) => { + approveSignTyped: async (walletConnector, chainId, from, data, payload) => { try { - Log.log('WalletConnectService.approveSignTyped2 ' + JSON.stringify(data), payload) - const { chainId } = payload - const { account } = await walletConnectActions.getAndSetWalletConnectAccount(walletConnector, chainId) - const discoverFor = { - addressToCheck: account.address, - derivationPath: account.derivationPath, - walletHash: account.walletHash, - currencyCode: account.currencyCode - } - const privateData = await BlocksoftPrivateKeysUtils.getPrivateKey(discoverFor, 'WalletConnectService') + Log.log('WalletConnectService.approveSignTyped2 v2 chainId' + chainId + ' from ' + from + ' data ' + JSON.stringify(data), payload) + + const privateData = await _getPrivateData(from) + if (!privateData) { + return false + } const privateKey = Buffer.from(privateData.privateKey.slice(2), 'hex') + if (!privateKey) { + return false + } const signData = signTypedData({ privateKey, data, version: 'V4' }) - await walletConnector.approveRequest({ - id: payload.id, - result: signData - }) + const res = { + topic: payload.topic, + response: { + id: payload.id, + jsonrpc: '2.0', + result: signData + } + } + await walletConnector.respondSessionRequest(res) } catch (e) { - Log.err('WalletConnectService.approveSignTyped2 error ' + e.message) + if (config.debug.appErrors) { + console.log('WalletConnectService.approveSignTyped2 v2 error ' + e.message) + } + Log.log.log('WalletConnectService.approveSignTyped2 v2 error ' + e.message) } }, rejectRequest: async (walletConnector, payload) => { - Log.log('WalletConnectService.rejectRequest', payload) - walletConnector.rejectRequest({ - id: payload.id, - error: { - message: 'You have rejected request in Trustee Wallet' + try { + Log.log('WalletConnectService.rejectSession v2', payload) + const { id } = payload + if (id) { + const res = { + topic: payload.topic, + response: { + id: payload.id, + jsonrpc: '2.0', + error: getSdkError('USER_REJECTED_METHODS').message + } + } + if (walletConnector) { + await walletConnector.respondSessionRequest(res) + } else { + await web3wallet.respondSessionRequest(res) + } } - }) + } catch (e) { + if (config.debug.appErrors) { + console.log('WalletConnectService.rejectRequest v211 error ' + e.message) + } + Log.log('WalletConnectService.rejectRequest v2 error ' + e.message) + } }, - killSession: async (walletConnector) => { - Log.log('WalletConnectService.killSession', walletConnector) + rejectSession: async (walletConnector, payload) => { try { - if (walletConnector.killSession !== 'undefined') { - await walletConnector.killSession({ - message: 'You have rejected session in TrusteeWallet' + Log.log('WalletConnectService.rejectSession v2', payload) + const { id } = payload + if (id) { + await walletConnector.rejectSession({ + id, + reason: getSdkError('USER_REJECTED_METHODS') }) } } catch (e) { - if (e.message.indexOf('Missing or invalid topic field') !== -1) { - walletConnectActions.resetWalletConnect() + if (config.debug.appErrors) { + console.log('WalletConnectService.rejectSession v2 error ' + e.message) } - Log.log('WalletConnectService.killSession error ' + e.message) + Log.log('WalletConnectService.rejectSession v2 error ' + e.message) } }, - rejectSession: async (walletConnector) => { - Log.log('WalletConnectService.rejectSession') - walletConnector.rejectSession({ - message: 'OPTIONAL_ERROR_MESSAGE' - }) - }, - - approveSession: async (walletConnector, payload, dappData = false) => { + approveSession: async (walletConnector, payload) => { try { - Log.log('WalletConnectService.approveSession payload', payload) - BlocksoftCryptoLog.log('WalletConnectService.approveSession payload', payload) - const { chainId } = payload - const { data } = await walletConnectActions.getAndSetWalletConnectAccount(walletConnector, chainId) + const { id, params } = payload + const { requiredNamespaces, relays } = params + Log.log('WalletConnectService.approveSession v2 payload.params.requiredNamespaces', requiredNamespaces) + const { namespaces } = _getAccounts(payload) try { - Log.log('WalletConnectService.approveSession data ' + JSON.stringify(data)) - await walletConnector.approveSession(data) + Log.log('WalletConnectService.approveSession v2 namespaces ' + JSON.stringify(namespaces)) + await walletConnector.approveSession({ + id, + relayProtocol: relays[0].protocol, + namespaces + }) } catch (e1) { if (e1.message.indexOf('Session currently connected') === -1) { throw e1 } } - await walletConnector.updateSession(data) - trusteeAsyncStorage.setWalletConnectSession({session : walletConnector.session, dappData}) - - Log.log('WalletConnectService.approveSession finish', data) - BlocksoftCryptoLog.log('WalletConnectService.approveSession finish', data) - return data + return namespaces } catch (e) { - Log.err('WalletConnectService.approveSession error ' + e.message) - } - }, - - updateSession: async (walletConnector, payload) => { - Log.log('WalletConnectService.updateSession', payload) - BlocksoftCryptoLog.log('WalletConnectService.updateSession', payload) - const { chainId } = payload - const { data } = await walletConnectActions.getAndSetWalletConnectAccount(walletConnector, chainId) - try { - await walletConnector.updateSession(data) - Log.log('WalletConnectService.updateSession finish', data) - BlocksoftCryptoLog.log('WalletConnectService.updateSession finish', data) - return data - } catch (e) { - Log.err('WalletConnectService.updateSession error ' + e.message) + if (config.debug.appErrors) { + console.log('WalletConnectService.approveSession v2 error ' + e.message) + } + Log.log('WalletConnectService.approveSession v2 error ' + e.message) } } } diff --git a/app/appstores/Stores/WalletConnect/WalletConnectServiceWrapper.js b/app/appstores/Stores/WalletConnect/WalletConnectServiceWrapper.js new file mode 100644 index 000000000..e665f2b3a --- /dev/null +++ b/app/appstores/Stores/WalletConnect/WalletConnectServiceWrapper.js @@ -0,0 +1,726 @@ +/** + * @version 1.0 + */ +import Log from '@app/services/Log/Log' +import trusteeAsyncStorage from '@appV2/services/trusteeAsyncStorage/trusteeAsyncStorage' +import * as BlocksoftRandom from 'react-native-blocksoft-random' +import { fromString } from 'uint8arrays/from-string' + +import * as relayAuth from '@walletconnect/relay-auth' +import { ONE_DAY } from '@walletconnect/time' +import { + getRelayProtocolApi, + getRelayProtocolName, + getSdkError, + hashMessage, + isExpired, + isValidArray, + deriveSymKey, + generateKeyPair as generateKeyPairUtil +} from '@walletconnect/utils' + +const EXPIRER_EVENTS = { + created: 'expirer_created', + deleted: 'expirer_deleted', + expired: 'expirer_expired', + sync: 'expirer_sync' +} + +const RELAYER_EVENTS = { + message: 'relayer_message', + message_ack: 'relayer_message_ack', + connect: 'relayer_connect', + disconnect: 'relayer_disconnect', + error: 'relayer_error', + connection_stalled: 'relayer_connection_stalled', + transport_closed: 'relayer_transport_closed', + publish: 'relayer_publish' +} + +const SUBSCRIBER_EVENTS = { + created: 'subscription_created', + deleted: 'subscription_deleted', + expired: 'subscription_expired', + disabled: 'subscription_disabled', + sync: 'subscription_sync', + resubscribed: 'subscription_resubscribed' +} + +export default (core) => { + core.crypto.keychain.set = async (tag, key) => { + try { + core.crypto.keychain.isInitialized() + core.crypto.keychain.keychain[tag] = key + await core.crypto.keychain.persist() + } catch (e) { + Log.log(`core.crypto.keychain.set ` + e.message) + } + } + core.crypto.keychain.get = (tag) => { + if (typeof core.crypto.keychain.keychain[tag] === 'undefined') { + return false + } + return core.crypto.keychain.keychain[tag] + } + core.crypto.keychain.has = (tag) => { + if (typeof core.crypto.keychain.keychain[tag] === 'undefined') { + return false + } + return true + } + core.crypto.keychain.del = async (tag) => { + if (typeof core.crypto.keychain.keychain[tag] === 'undefined') { + return false + } + delete core.crypto.keychain.keychain[tag] + await core.crypto.keychain.persist() + } + core.crypto.keychain.setKeyChain = async (keychain) => { + await trusteeAsyncStorage.setWalletConnectKC(keychain) + } + core.crypto.keychain.getKeyChain = async () => { + return trusteeAsyncStorage.getWalletConnectKC() + } + core.expirer.has = (key) => { + try { + const target = core.formatTarget(key) + const expiration = core.expirer.getExpiration(target) + return typeof expiration !== 'undefined' + } catch (e) { + // ignore + return false + } + } + + core.expirer.set = (key, expiry) => { + try { + core.expirer.isInitialized() + const target = core.expirer.formatTarget(key) + const expiration = { target, expiry } + core.expirer.expirations.set(target, expiration) + core.expirer.checkExpiry(target, expiration) + core.expirer.events.emit(EXPIRER_EVENTS.created, { + target, + expiration + }) + } catch (e) { + Log.log('core.expirer.set error ' + e.message) + } + } + + core.expirer.get = (key) => { + try { + core.expirer.isInitialized() + const target = core.expirer.formatTarget(key) + return core.expirer.getExpiration(target) + } catch (e) { + Log.log('core.expirer.get error ' + e.message) + } + } + + core.expirer.del = (key) => { + try { + core.expirer.isInitialized() + const exists = core.expirer.has(key) + if (exists) { + const target = core.expirer.formatTarget(key) + const expiration = core.expirer.getExpiration(target) + core.expirer.expirations.delete(target) + core.expirer.events.emit(EXPIRER_EVENTS.deleted, { + target, + expiration + }) + } + } catch (e) { + Log.log('core.expirer.del error ' + e.message) + } + } + + + core.crypto.generateKeyPair = () => { + try { + core.crypto.isInitialized() + const keyPair = generateKeyPairUtil() + return core.crypto.setPrivateKey(keyPair.publicKey, keyPair.privateKey) + } catch (e) { + Log.log('core.crypto.generateKeyPair error ' + e.message) + } + } + core.crypto.generateSharedKey = ( + selfPublicKey, + peerPublicKey, + overrideTopic + ) => { + try { + core.crypto.isInitialized() + const selfPrivateKey = core.crypto.getPrivateKey(selfPublicKey) + const symKey = deriveSymKey(selfPrivateKey, peerPublicKey) + return core.crypto.setSymKey(symKey, overrideTopic) + } catch (e) { + Log.log('core.crypto.generateSharedKey error ' + e.message) + } + } + + + core.crypto.getClientSeed = async () => { + let seed = '' + try { + seed = await core.crypto.keychain.get('client_ed25519_seed') + } catch { + } + if (!seed) { + seed = await BlocksoftRandom.getRandomBytes(32) + await core.crypto.keychain.set('client_ed25519_seed', seed) + } + let random + try { + random = fromString(seed, 'base64') + } catch (e) { + seed = await BlocksoftRandom.getRandomBytes(32) + await core.crypto.keychain.set('client_ed25519_seed', seed) + } + return random + } + core.crypto.signJWT = async (aud) => { + core.crypto.isInitialized() + let seed + try { + seed = await core.crypto.getClientSeed() + } catch (e) { + throw new Error(e.message + ' in core.crypto.getClientSeed') + } + const keyPair = relayAuth.generateKeyPair(seed) + const sub = await BlocksoftRandom.getRandomBytes(32) + const ttl = ONE_DAY + const jwt = await relayAuth.signJWT(sub, aud, ttl, keyPair) + return jwt + } + + core.relayer.subscriber.subscribe = async (topic, opts) => { + await core.relayer.subscriber.restartToComplete() + core.relayer.subscriber.isInitialized() + core.relayer.subscriber.logger.debug(`Subscribing Topic`) + core.relayer.subscriber.logger.trace({ type: 'method', method: 'subscribe', params: { topic, opts } }) + let relay, params, id + try { + relay = getRelayProtocolName(opts) + params = { topic, relay } + core.relayer.subscriber.pending.set(topic, params) + } catch (e) { + core.relayer.subscriber.logger.debug(`Failed to Subscribe Topic`) + Log.log('core.relayer.subscriber.subscribe error 1 ' + e.message) + return false + } + if (typeof relay === 'undefined' || typeof relay.protocol === 'undefined') { + relay = { 'protocol': 'irn' } + } + try { + id = await core.relayer.subscriber.rpcSubscribe(topic, relay) + } catch (e) { + core.relayer.subscriber.logger.debug(`Failed to Subscribe Topic`) + Log.log('core.relayer.subscriber.subscribe error 2 ' + e.message + ' relay ' + relay) + return false + } + try { + core.relayer.subscriber.onSubscribe(id, params) + core.relayer.subscriber.logger.debug(`Successfully Subscribed Topic`) + core.relayer.subscriber.logger.trace({ type: 'method', method: 'subscribe', params: { topic, opts } }) + return id + } catch (e) { + core.relayer.subscriber.logger.debug(`Failed to Subscribe Topic`) + Log.log('core.relayer.subscriber.subscribe error 3 ' + e.message) + } + } + + core.relayer.subscriber.unsubscribe = async (topic, opts) => { + try { + await core.relayer.subscriber.restartToComplete() + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribe error 1 ' + e.message) + } + try { + core.relayer.subscriber.isInitialized() + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribe error 2 ' + e.message) + } + if (typeof opts?.id !== 'undefined') { + try { + await core.relayer.subscriber.unsubscribeById(topic, opts.id, opts) + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribe error 3.1 ' + e.message) + } + } else { + try { + await core.relayer.subscriber.unsubscribeByTopic(topic, opts) + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribe error 3.2 ' + e.message) + } + } + } + + core.relayer.subscriber.unsubscribeByTopic = async (topic, opts) => { + let ids = false + try { + ids = core.relayer.subscriber.topicMap.get(topic) + } catch (e) { + Log.log('core.relayer.subscriber.topicMap.get error ' + e.message) + } + if (ids) { + for (const index in ids) { + try { + await core.relayer.subscriber.unsubscribeById(topic, ids[index], opts) + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribeById error ' + e.message + ' ' + ids[index]) + } + } + } + } + + core.relayer.subscriber.unsubscribeById = async (topic, id, opts) => { + core.relayer.subscriber.logger.debug(`Unsubscribing Topic`) + core.relayer.subscriber.logger.trace({ type: 'method', method: 'unsubscribe', params: { topic, id, opts } }) + let relay + try { + relay = getRelayProtocolName(opts) + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribeById error 3.1 ' + e.message) + return false + } + try { + await core.relayer.subscriber.rpcUnsubscribe(topic, id, relay) + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribeById error 3.2 ' + e.message) + return false + } + try { + const reason = getSdkError('USER_DISCONNECTED', `${core.relayer.subscriber.name}, ${topic}`) + await core.relayer.subscriber.onUnsubscribe(topic, id, reason) + } catch (e) { + Log.log('core.relayer.subscriber.unsubscribeById error 3.3 ' + e.message) + return false + } + try { + core.relayer.subscriber.logger.debug(`Successfully Unsubscribed Topic`) + core.relayer.subscriber.logger.trace({ type: 'method', method: 'unsubscribe', params: { topic, id, opts } }) + } catch (e) { + core.relayer.subscriber.logger.debug(`Failed to Unsubscribe Topic`) + Log.log('core.relayer.subscriber.unsubscribeById error 3.4 ' + e.message) + } + } + + core.relayer.subscriber.onSubscribe = (id, params) => { + try { + core.relayer.subscriber.setSubscription(id, { ...params, id }) + } catch (e) { + Log.log('core.relayer.subscriber.onSubscribe error 1 ' + e.message) + } + try { + core.relayer.subscriber.pending.delete(params.topic) + } catch (e) { + Log.log('core.relayer.subscriber.onSubscribe error 2 ' + e.message) + } + } + + + core.relayer.subscriber.onUnsubscribe = async (topic, id, reason) => { + try { + core.relayer.subscriber.events.removeAllListeners(id) + } catch (e) { + Log.log('core.relayer.subscriber.onUnsubscribe error 1 ' + e.message) + } + let t = false + try { + t = core.relayer.subscriber.hasSubscription(id, topic) + } catch (e) { + Log.log('core.relayer.subscriber.onUnsubscribe error 2 ' + e.message) + } + try { + if (t) { + core.relayer.subscriber.deleteSubscription(id, reason) + } + } catch (e) { + Log.log('core.relayer.subscriber.onUnsubscribe error 3 ' + e.message) + } + try { + await core.relayer.subscriber.relayer.messages.del(topic) + } catch (e) { + Log.log('core.relayer.subscriber.onUnsubscribe error 4 ' + e.message) + } + } + + + core.relayer.subscriber.relayer.messages.del = async (topic) => { + try { + core.relayer.subscriber.relayer.messages.isInitialized() + } catch (e) { + Log.log('core.relayer.subscriber.relayer.messages.del error 1 ' + e.message) + } + try { + core.relayer.subscriber.relayer.messages.messages.delete(topic) + } catch (e) { + Log.log('core.relayer.subscriber.relayer.messages.del error 2 ' + e.message) + } + try { + await core.relayer.subscriber.relayer.messages.persist() + } catch (e) { + Log.log('core.relayer.subscriber.relayer.messages.del error 3 ' + e.message) + } + } + + core.relayer.subscriber.deleteSubscription = (id, reason) => { + let subscription + try { + subscription = core.relayer.subscriber.getSubscription(id) + } catch (e) { + Log.log('core.relayer.subscriber.deleteSubscription error 1 ' + e.message) + } + try { + core.relayer.subscriber.subscriptions.delete(id) + } catch (e) { + Log.log('core.relayer.subscriber.deleteSubscription error 2 ' + e.message) + } + if (subscription) { + try { + core.relayer.subscriber.topicMap.delete(subscription.topic, id) + } catch (e) { + Log.log('core.relayer.subscriber.deleteSubscription error 3 ' + e.message) + } + try { + core.relayer.subscriber.events.emit(SUBSCRIBER_EVENTS.deleted, { + ...subscription, + reason + }) + } catch (e) { + Log.log('core.relayer.subscriber.deleteSubscription error 4 ' + e.message) + } + } + } + + core.relayer.subscriber.restart = async () => { + core.relayer.subscriber.restartInProgress = true + try { + await core.relayer.subscriber.restore() + } catch (e) { + Log.log('core.relayer.subscriber.restore error ' + e.message) + } + try { + await core.relayer.subscriber.reset() + } catch (e) { + Log.log('core.relayer.subscriber.reset error ' + e.message) + } + core.relayer.subscriber.restartInProgress = false + } + core.relayer.subscriber.reset = async () => { + if (core.relayer.subscriber.cached.length) { + const batches = Math.ceil(core.relayer.subscriber.cached.length / core.relayer.subscriber.batchSubscribeTopicsLimit) + for (let i = 0; i < batches; i++) { + const batch = core.relayer.subscriber.cached.splice(0, core.relayer.subscriber.batchSubscribeTopicsLimit) + try { + await core.relayer.subscriber.batchSubscribe(batch) + } catch (e) { + Log.log('core.relayer.subscriber.batchSubscribe error ' + e.message) + } + + } + } + core.relayer.subscriber.events.emit(SUBSCRIBER_EVENTS.resubscribed) + } + core.relayer.subscriber.batchSubscribe = async (subscriptions) => { + if (!subscriptions.length) return + let result + try { + result = await core.relayer.subscriber.rpcBatchSubscribe(subscriptions) + } catch (e) { + Log.log('core.relayer.subscriber.rpcBatchSubscribe error ' + e.message) + } + try { + if (!isValidArray(result)) return + } catch (e) { + Log.log('core.relayer.subscriber.isValidArray error ' + e.message) + } + try { + core.relayer.subscriber.onBatchSubscribe(result.map((id, i) => ({ ...subscriptions[i], id }))) + } catch (e) { + Log.log('core.relayer.subscriber.onBatchSubscribe error ' + e.message) + } + } + + core.relayer.subscriber.rpcSubscribe = async (topic, relay) => { + const api = getRelayProtocolApi(relay.protocol) + const request = { + method: api.subscribe, + params: { + topic + } + } + core.relayer.subscriber.logger.debug(`Outgoing Relay Payload`) + core.relayer.subscriber.logger.trace({ type: 'payload', direction: 'outgoing', request }) + + let request2 + try { + request2 = core.relayer.subscriber.relayer.request(request) + } catch (err) { + Log.log('core.relayer.subscriber.rpcSubscribe error 4.1 ' + err.message) + } + + let subscribe + try { + // fix is here! + // eslint-disable-next-line no-async-promise-executor + subscribe = new Promise(async (resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('expired by timeout')), 30000) + try { + const result = await request2 + resolve(result) + } catch (error) { + reject(error) + } + clearTimeout(timeout) + }) + } catch (err) { + Log.log('core.relayer.subscriber.rpcSubscribe error 4.2 ' + err.message) + core.relayer.subscriber.logger.debug(`Outgoing Relay Subscribe Payload stalled`) + core.relayer.subscriber.relayer.events.emit(RELAYER_EVENTS.connection_stalled) + } + try { + const res = await subscribe + return res + } catch (err) { + // and here also is the fix + Log.log('core.relayer.subscriber.rpcSubscribe error 4.3 ' + err.message + ' topic ' + topic) + core.relayer.subscriber.logger.debug(`Outgoing Relay Subscribe Payload stalled`) + core.relayer.subscriber.relayer.events.emit(RELAYER_EVENTS.connection_stalled) + } + + try { + const hash = hashMessage(topic + core.relayer.subscriber.clientId) + return hash + } catch (e) { + Log.log('core.relayer.subscriber.rpcSubscribe error 4.4 ' + e.message) + } + } + + core.relayer.subscriber.rpcBatchSubscribe = async (subscriptions) => { + if (!subscriptions.length) return + + let relay, api, request + try { + relay = subscriptions[0].relay + } catch (e) { + Log.log('core.relayer.subscriber.rpcBatchSubscribe error 1 ' + e.message) + return false + } + try { + api = getRelayProtocolApi(relay.protocol) + } catch (e) { + Log.log('core.relayer.subscriber.rpcBatchSubscribe error 2 ' + e.message) + return false + } + try { + request = { + method: api.batchSubscribe, + params: { + topics: subscriptions.map((s) => s.topic) + } + } + } catch (e) { + Log.log('core.relayer.subscriber.rpcBatchSubscribe error 3 ' + e.message) + return false + } + core.relayer.subscriber.logger.debug(`Outgoing Relay Payload`) + core.relayer.subscriber.logger.trace({ type: 'payload', direction: 'outgoing', request }) + + let request2 + try { + request2 = core.relayer.subscriber.relayer.request(request) + } catch (err) { + Log.log('core.relayer.subscriber.rpcBatchSubscribe error 4.1 ' + err.message) + core.relayer.subscriber.logger.debug(`Outgoing Relay Payload stalled`) + core.relayer.subscriber.relayer.events.emit(RELAYER_EVENTS.connection_stalled) + } + let subscribe + try { + // fix is here! + // eslint-disable-next-line no-async-promise-executor + subscribe = new Promise(async (resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('expired by timeout')), 30000) + try { + const result = await request2 + resolve(result) + } catch (error) { + reject(error) + } + clearTimeout(timeout) + }) + } catch (err) { + Log.log('core.relayer.subscriber.rpcBatchSubscribe error 4.2 ' + err.message) + core.relayer.subscriber.logger.debug(`Outgoing Relay Payload stalled`) + core.relayer.subscriber.relayer.events.emit(RELAYER_EVENTS.connection_stalled) + } + try { + const res = await subscribe + return res + } catch (err) { + // and here also is the fix + Log.log('core.relayer.subscriber.rpcBatchSubscribe error 4.3 ' + err.message) + core.relayer.subscriber.logger.debug(`Outgoing Relay Payload stalled`) + core.relayer.subscriber.relayer.events.emit(RELAYER_EVENTS.connection_stalled) + } + } + core.relayer.subscriber.init = async () => { + if (!core.relayer.subscriber.initialized) { + core.relayer.subscriber.logger.trace(`Initialized`) + try { + await core.relayer.subscriber.restart() + } catch (e) { + Log.log('core.relayer.subscriber.restart error ' + e.message) + } + try { + core.relayer.subscriber.registerEventListeners() + } catch (e) { + Log.log('core.relayer.subscriber.registerEventListeners error ' + e.message) + } + try { + core.relayer.subscriber.onEnable() + } catch (e) { + Log.log('core.relayer.subscriber.onEnable error ' + e.message) + } + try { + core.relayer.subscriber.clientId = await core.crypto.getClientId() + } catch (e) { + Log.log('core.relayer.subscriber.clientId error ' + e.message) + } + } + } + core.relayer.init = async () => { + try { + await core.relayer.createProvider() + } catch (e) { + Log.log('core.relayer.init error 1 ' + e.message) + } + try { + await core.relayer.messages.init() + } catch (e) { + Log.log('core.relayer.init error 2.1 ' + e.message) + } + try { + await core.relayer.transportOpen() + } catch (e) { + Log.log('core.relayer.init error 2.2 ' + e.message) + } + try { + await core.relayer.subscriber.init() + } catch (e) { + Log.log('core.relayer.init error 2.3 ' + e.message) + } + try { + core.relayer.registerEventListeners() + core.relayer.initialized = true + } catch (e) { + Log.log('core.relayer.init error 3 ' + e.message) + } + try { + setTimeout(async () => { + try { + if (core.relayer.subscriber.topics.length === 0) { + core.relayer.logger.info(`No topics subscribted to after init, closing transport`) + await core.relayer.transportClose() + core.relayer.transportExplicitlyClosed = false + } + } catch (e) { + Log.log('core.relayer.init error 4.1 ' + e.message) + } + }, 10000) + } catch (e) { + Log.log('core.relayer.init error 4 ' + e.message) + } + } + + core.relayer.unsubscribe = async (topic, opts) => { + try { + core.relayer.isInitialized() + } catch (e) { + Log.log('core.relayer.unsubscribe error 1 ' + e.message) + return false + } + try { + await core.relayer.subscriber.unsubscribe(topic, opts) + } catch (e) { + Log.log('core.relayer.unsubscribe error 2 ' + e.message) + return false + } + } + + + core.pairing.deletePairing = async (topic, expirerHasDeleted) => { + try { + await core.relayer.unsubscribe(topic, {}) + } catch (e) { + Log.log('core.pairing.deletePairing error 1 ' + e.message) + return false + } + try { + await core.pairing.pairings.delete(topic, getSdkError('USER_DISCONNECTED')) + } catch (e) { + Log.log('core.pairing.deletePairing error 2 ' + e.message) + return false + } + try { + await core.pairing.core.crypto.deleteSymKey(topic) + } catch (e) { + Log.log('core.pairing.deletePairing error 3 ' + e.message) + return false + } + try { + await expirerHasDeleted ? Promise.resolve() : core.pairing.core.expirer.del(topic) + } catch (e) { + Log.log('core.pairing.deletePairing error 4 ' + e.message) + return false + } + } + + core.pairing.cleanup = async () => { + let expiredPairings = false + try { + expiredPairings = core.pairing.pairings.getAll().filter((pairing) => isExpired(pairing.expiry)) + } catch (e) { + Log.log('core.pairing.cleanup error 1 ' + e.message) + return false + } + try { + await Promise.all(expiredPairings.map((pairing) => core.pairing.deletePairing(pairing.topic))) + } catch (e) { + Log.log('core.pairing.cleanup error 2 ' + e.message) + } + } + + + core.pairing.init = async () => { + if (!core.pairing.initialized) { + try { + await core.pairing.pairings.init() + } catch (e) { + Log.log('core.pairing.init error 1 ' + e.message) + } + try { + await core.pairing.cleanup() + } catch (e) { + Log.log('core.pairing.init error 2 ' + e.message) + } + try { + core.pairing.registerRelayerEvents() + } catch (e) { + Log.log('core.pairing.init error 3 ' + e.message) + } + try { + core.pairing.registerExpirerEvents() + } catch (e) { + Log.log('core.pairing.init error 4 ' + e.message) + } + core.pairing.initialized = true + core.pairing.logger.trace(`Initialized`) + } + } + + return core +} \ No newline at end of file diff --git a/app/appstores/Stores/WalletConnect/WalletConnectServiceWrapperWeb3.js b/app/appstores/Stores/WalletConnect/WalletConnectServiceWrapperWeb3.js new file mode 100644 index 000000000..4b1b5ff47 --- /dev/null +++ b/app/appstores/Stores/WalletConnect/WalletConnectServiceWrapperWeb3.js @@ -0,0 +1,199 @@ +/** + * @version 1.0 + */ +import Log from '@app/services/Log/Log' +import { getRequiredNamespacesFromNamespaces, getSdkError, isValidObject } from '@walletconnect/utils' + + +import { getBigIntRpcId } from '@walletconnect/jsonrpc-utils' + +const RELAYER_EVENTS = { + message: 'relayer_message', + message_ack: 'relayer_message_ack', + connect: 'relayer_connect', + disconnect: 'relayer_disconnect', + error: 'relayer_error', + connection_stalled: 'relayer_connection_stalled', + transport_closed: 'relayer_transport_closed', + publish: 'relayer_publish' +} + +export default (web3wallet) => { + + web3wallet.engine.signClient.engine.disconnect = async (params) => { + try { + web3wallet.engine.signClient.engine.isInitialized() + await web3wallet.engine.signClient.engine.isValidDisconnect(params) + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 1 ` + e.message) + } + const { topic } = params + + let has = false + try { + has = web3wallet.engine.signClient.engine.client.session.keys.includes(topic) + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 2 ` + e.message) + } + if (has) { + let id = 0 + try { + id = getBigIntRpcId().toString() + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 3.1 ` + e.message) + } + + /* + let resolvePromise + const onDisconnectAck = (ack) => { + if (ack?.id.toString() === id) { + web3wallet.engine.signClient.engine.client.core.relayer.events.removeListener( + RELAYER_EVENTS.message_ack, + onDisconnectAck + ) + resolvePromise() + } + } + + try { + // await a relay ACK on the disconnect req before deleting the session, keychain etc. + await new Promise((resolve) => { + resolvePromise = resolve + web3wallet.engine.signClient.engine.client.core.relayer.on(RELAYER_EVENTS.message_ack, onDisconnectAck) + }) + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 3.2 ` + e.message) + } + */ + + try { + await web3wallet.engine.signClient.engine.sendRequest( + topic, + 'wc_sessionDelete', + getSdkError('USER_DISCONNECTED'), + undefined, + id + ) + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 3.3 ` + e.message) + } + + try { + await web3wallet.engine.signClient.engine.deleteSession(topic) + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 3.4 ` + e.message) + } + } else { + try { + await web3wallet.engine.signClient.engine.client.core.pairing.disconnect({ topic }) + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.disconnect error 4 ` + e.message) + } + } + } + + web3wallet.engine.signClient.engine.approve = async (params) => { + try { + web3wallet.engine.signClient.engine.isInitialized() + await web3wallet.engine.signClient.engine.isValidApprove(params) + const { id, relayProtocol, namespaces, sessionProperties } = params + const proposal = web3wallet.engine.signClient.engine.client.proposal.get(id) + let { pairingTopic, proposer, requiredNamespaces, optionalNamespaces } = proposal + pairingTopic = pairingTopic || '' + if (!isValidObject(requiredNamespaces)) { + requiredNamespaces = getRequiredNamespacesFromNamespaces(namespaces, 'approve()') + } + + const selfPublicKey = await web3wallet.engine.signClient.engine.client.core.crypto.generateKeyPair() + const peerPublicKey = proposer.publicKey + const sessionTopic = await web3wallet.engine.signClient.engine.client.core.crypto.generateSharedKey( + selfPublicKey, + peerPublicKey + ) + + if (pairingTopic && id) { + await web3wallet.engine.signClient.engine.client.core.pairing.updateMetadata({ + topic: pairingTopic, + metadata: proposer.metadata + }) + await web3wallet.engine.signClient.engine.sendResult(id, pairingTopic, { + relay: { + protocol: relayProtocol ?? 'irn' + }, + responderPublicKey: selfPublicKey + }) + await web3wallet.engine.signClient.engine.client.proposal.delete(id, getSdkError('USER_DISCONNECTED')) + await web3wallet.engine.signClient.engine.client.core.pairing.activate({ topic: pairingTopic }) + } + + // actually THATS THE FIX! + const SESSION_EXPIRY = new Date().getTime() + 604800000 + const sessionSettle = { + relay: { protocol: relayProtocol ?? 'irn' }, + namespaces, + requiredNamespaces, + optionalNamespaces, + pairingTopic, + controller: { + publicKey: selfPublicKey, + metadata: web3wallet.engine.signClient.engine.client.metadata + }, + expiry: SESSION_EXPIRY, + ...(sessionProperties && { sessionProperties }) + } + await web3wallet.engine.signClient.engine.client.core.relayer.subscribe(sessionTopic) + await web3wallet.engine.signClient.engine.sendRequest(sessionTopic, 'wc_sessionSettle', sessionSettle) + const session = { + ...sessionSettle, + topic: sessionTopic, + pairingTopic, + acknowledged: false, + self: sessionSettle.controller, + peer: { + publicKey: proposer.publicKey, + metadata: proposer.metadata + }, + controller: selfPublicKey + } + await web3wallet.engine.signClient.engine.client.session.set(sessionTopic, session) + await web3wallet.engine.signClient.engine.setExpiry(sessionTopic, SESSION_EXPIRY) + return { + topic: sessionTopic, + acknowledged: () => + new Promise((resolve) => + setTimeout(() => resolve(web3wallet.engine.signClient.engine.client.session.get(sessionTopic)), 500) + ) // artificial delay to allow for the session to be processed by the peer + } + } catch (e) { + Log.log(`web3wallet.engine.signClient.engine.approve error ` + e.message) + } + } + + web3wallet.engine.approveSession = async (sessionProposal) => { + let tmp, res + try { + tmp = await web3wallet.engine.signClient.approve({ + id: sessionProposal.id, + namespaces: sessionProposal.namespaces + }) + } catch (e) { + Log.log(`web3wallet.engine.approveSession error 1 ` + e.message) + throw new Error(e.message) + } + try { + await tmp.acknowledged() + } catch (e) { + Log.log(`web3wallet.engine.approveSession error 2 ` + e.message) + throw new Error(e.message) + } + try { + res = web3wallet.engine.signClient.session.get(tmp.topic) + } catch (e) { + Log.log(`web3wallet.engine.approveSession error 3 ` + e.message) + throw new Error(e.message) + } + return res + } + + return web3wallet +} \ No newline at end of file diff --git a/app/appstores/Stores/WalletConnect/WalletConnectStore.js b/app/appstores/Stores/WalletConnect/WalletConnectStore.js index 581b337a8..63d496ef5 100644 --- a/app/appstores/Stores/WalletConnect/WalletConnectStore.js +++ b/app/appstores/Stores/WalletConnect/WalletConnectStore.js @@ -1,51 +1,32 @@ /** - * @version 1.0 + * @version 2.0 */ const INITIAL_STATE = { isConnected: false, linkSource: false, - walletConnectLink: false, walletConnectLinkError: false, walletConnector: false, - - - peerId: false, - peerMeta: false, - - accountAddress: false, - accountChainId : 1, - accountCurrencyCode: false, - accountWalletName: false - + walletConnections: [] } const walletConnectStoreReducer = (state = INITIAL_STATE, action) => { switch (action.type) { - case 'SET_WALLET_CONNECT_IS_CONNECTED': - return { - ...state, - isConnected: action.isConnected, - peerId: action.peerId, - peerMeta: action.peerMeta - } case 'SET_WALLET_CONNECT': return { ...state, isConnected: action.isConnected, linkSource: action.linkSource, - walletConnectLink: action.walletConnectLink, walletConnectLinkError: action.walletConnectLinkError, - walletConnector: action.walletConnector + walletConnector: action.walletConnector, + walletConnections: action.walletConnections } - case 'SET_WALLET_CONNECT_ACCOUNT': + case 'SET_WALLET_CONNECTIONS': return { ...state, - accountAddress: action.accountAddress, - accountChainId: action.accountChainId, - accountCurrencyCode: action.accountCurrencyCode, - accountWalletName: action.accountWalletName + isConnected: action.isConnected, + walletConnections: action.walletConnections } default: return state diff --git a/app/appstores/Stores/WalletConnect/WalletConnectStoreActions.js b/app/appstores/Stores/WalletConnect/WalletConnectStoreActions.js index 8e7af0afb..d0834d987 100644 --- a/app/appstores/Stores/WalletConnect/WalletConnectStoreActions.js +++ b/app/appstores/Stores/WalletConnect/WalletConnectStoreActions.js @@ -5,30 +5,15 @@ import store from '@app/store' import Log from '@app/services/Log/Log' -import { Web3Injected } from '@crypto/services/Web3Injected' import walletConnectService from '@app/appstores/Stores/WalletConnect/WalletConnectService' import trusteeAsyncStorage from '@appV2/services/trusteeAsyncStorage/trusteeAsyncStorage' +import config from '@app/config/config' import { setWalletDapp } from '@app/appstores/Stores/WalletDapp/WalletDappStoreActions' const { dispatch } = store const walletConnectActions = { - setIsConnectedWalletConnect: ({ isConnected, peerId, peerMeta }) => { - const oldData = store.getState().walletConnectStore.isConnected - const oldPeerId = store.getState().walletConnectStore.peerId - const oldPeerMeta = store.getState().walletConnectStore.peerMeta - if (oldData === isConnected && (!peerId || peerId === oldPeerId) && (!peerMeta || peerMeta === oldPeerMeta)) { - return false - } - return dispatch({ - type: 'SET_WALLET_CONNECT_IS_CONNECTED', - isConnected, - peerId: peerId || oldPeerId, - peerMeta: peerMeta || oldPeerMeta - }) - }, - resetWalletConnect: () => { trusteeAsyncStorage.setWalletConnectLink('') return dispatch({ @@ -36,53 +21,63 @@ const walletConnectActions = { walletConnectLink: false, walletConnectLinkError: false, walletConnector: false, + walletConnections: [], isConnected: false, linkSource: false, }) }, - initWalletConnect: () => { + initWalletConnect: async () => { const walletConnectLink = trusteeAsyncStorage.getWalletConnectLink() - if (!walletConnectLink) return false - Log.log('WalletConnect.initWalletConnect link ' + walletConnectLink) - const { session, dappData } = trusteeAsyncStorage.getWalletConnectSession() - walletConnectActions.connectAndSetWalletConnectLink(walletConnectLink, dappData ? 'DAPP_SAVED' : 'SAVED', session) - - const walletConnector = store.getState().walletConnectStore.walletConnector - walletConnectActions.setIsConnectedWalletConnect({ - isConnected : walletConnector.connected, - peerId : walletConnector?.peerId, - peerMeta: walletConnector?.peerMeta - }) - setWalletDapp(dappData) - walletConnectActions.getAndSetWalletConnectAccount(walletConnector, walletConnector.chainId) + const dappData = trusteeAsyncStorage.getWalletConnectDapp() + if (!walletConnectLink) { + Log.log('WalletConnect.initWalletConnect link NONE') + } else if (dappData) { + Log.log('WalletConnect.initWalletConnect link ' + walletConnectLink + ' dapp ' + JSON.stringify(dappData)) + await walletConnectActions.connectAndSetWalletConnectLink(walletConnectLink, 'SAVED', true, dappData) + } else { + Log.log('WalletConnect.initWalletConnect link ' + walletConnectLink) + await walletConnectActions.connectAndSetWalletConnectLink(walletConnectLink, 'SAVED', true) + } + return false }, - connectAndSetWalletConnectLink: (walletConnectLink, linkSource, session, dappData) => { - const oldData = store.getState().walletConnectStore.walletConnectLink - if (oldData === walletConnectLink || !walletConnectLink) { - return false + connectAndSetWalletConnectLink: async (walletConnectLink, linkSource, activatePairing = false, dappData = false) => { + if (dappData && store.getState().walletDappStore.dapp !== dappData) { + trusteeAsyncStorage.setWalletConnectDapp(dappData) + setWalletDapp(dappData) + } else { + const oldData = store.getState().walletConnectStore.walletConnectLink + if (oldData === walletConnectLink || !walletConnectLink) { + return false + } } try { - const walletConnector = walletConnectService.createAndConnect(walletConnectLink, session, dappData) + const walletConnector = await walletConnectService.createAndConnect(walletConnectLink, activatePairing) trusteeAsyncStorage.setWalletConnectLink(walletConnectLink) dispatch({ type: 'SET_WALLET_CONNECT', walletConnectLink: walletConnectLink, walletConnectLinkError: false, walletConnector, - isConnected: walletConnector && walletConnector?.connected || false, + walletConnections: store.getState().walletConnectStore.walletConnections, + isConnected: true, linkSource, }) + walletConnectActions.getAndSetWalletConnections(walletConnector) return true } catch (e) { - Log.log('WalletConnect.connectAndSetWalletConnectLink error ' + e.message + ' ' + walletConnectLink + ' session ' + JSON.stringify(session)) + if (config.debug.appErrors) { + console.log('WalletConnect.connectAndSetWalletConnectLink error ' + e.message + ' ' + walletConnectLink) + } + Log.log('WalletConnect.connectAndSetWalletConnectLink error ' + e.message + ' ' + walletConnectLink) dispatch({ type: 'SET_WALLET_CONNECT', walletConnectLink: walletConnectLink, walletConnectLinkError: e.message + ' link ' + walletConnectLink, walletConnector: false, + walletConnections: [], isConnected: false, linkSource: false, }) @@ -90,101 +85,62 @@ const walletConnectActions = { } }, - rejectRequestWalletConnect : async (payload) => { - const walletConnector = store.getState().walletConnectStore.walletConnector - if (!walletConnector) { - return false - } - await walletConnectService.rejectRequest(walletConnector, payload) - }, - - approveRequestWalletConnect: async (payload, txHash) => { - const walletConnector = store.getState().walletConnectStore.walletConnector - if (!walletConnector) { - return false + getAndSetWalletConnections: async (walletConnector) => { + try { + const connections = await walletConnectService.getConnections(walletConnector) + dispatch({ + type: 'SET_WALLET_CONNECTIONS', + walletConnections: connections, + isConnected: connections.length > 0 ? true : false + }) + } catch (e) { + console.log('WalletConnect.getAndSetWalletConnections error ' + e.message) } - await walletConnectService.approveRequest(walletConnector, payload, txHash) }, - - disconnectAndSetWalletConnectLink: async () => { - const walletConnector = store.getState().walletConnectStore.walletConnector - if (!walletConnector) { - return false + approveRequest: async (payload, transactionHash) => { + try { + const walletConnector = store.getState().walletConnectStore.walletConnector + await walletConnectService.approveRequest(walletConnector, payload, transactionHash) + } catch (e) { + console.log('WalletConnect.approveRequest error ' + e.message) } - await walletConnectService.killSession(walletConnector) }, - getAndSetWalletConnectAccountNetwork: async (_walletConnector = false, chainId = 0, source = '_') => { - let walletConnector = _walletConnector - if (!walletConnector) { - walletConnector = store.getState().walletConnectStore.walletConnector - } - if (!walletConnector) { - return false - } - - Log.log('WalletConnect.getAndSetWalletConnectAccountNetwork chainId ' + chainId + ' source ' + source) + rejectRequest: async (payload) => { try { - await walletConnectService.updateSession(walletConnector, { chainId }) + const walletConnector = store.getState().walletConnectStore.walletConnector + await walletConnectService.rejectRequest(walletConnector, payload) } catch (e) { - Log.log('WalletConnect.getAndSetWalletConnectAccountNetwork chainId ' + chainId + ' updateSession error ' + e.message) + console.log('WalletConnect.rejectRequest error ' + e.message) } }, - getAndSetWalletConnectAccount: (walletConnector, chainId = 0) => { - const { walletHash, walletName } = store.getState().mainStore.selectedWallet - const { peerMeta } = walletConnector - if (typeof chainId === 'undefined' || !chainId) { - chainId = walletConnector.chainId * 1 || 1 - } - const accountList = store.getState().accountStore.accountList - if (!accountList || typeof accountList[walletHash] === 'undefined') { - return false - } - - const WEB3 = Web3Injected(chainId) - const MAIN_CURRENCY_CODE = WEB3.MAIN_CURRENCY_CODE - const MAIN_CHAIN_ID = WEB3.MAIN_CHAIN_ID - if (chainId !== 1 && chainId !== 'ETH' && MAIN_CURRENCY_CODE === 'ETH') { - throw new Error('Network ' + chainId + ' not supported') - } - - Log.log('WalletConnect.getAndSetWalletConnectAccount chainId ' + chainId + ' code ' + MAIN_CURRENCY_CODE + ' id ' + MAIN_CHAIN_ID + ' ' + WEB3.LINK) - if (typeof accountList[walletHash][MAIN_CURRENCY_CODE] === 'undefined' && typeof accountList[walletHash]['ETH'] === 'undefined') { - throw new Error('TURN ON ' + MAIN_CURRENCY_CODE) - } - - const _setWalletConnectAccount = (accountAddress, accountChainId, accountCurrencyCode, accountWalletName) => { - const oldData = store.getState().walletConnectStore.accountAddress - const oldCurrencyCode = store.getState().walletConnectStore.accountCurrencyCode - if (oldData === accountAddress && oldCurrencyCode === accountCurrencyCode) { - return false + disconnectAndSetWalletConnectLink: async () => { + try { + const walletConnector = store.getState().walletConnectStore.walletConnector + const connections = await walletConnectService.killConnections(walletConnector) + if (connections && connections.length > 0) { + dispatch({ + type: 'SET_WALLET_CONNECTIONS', + walletConnections: connections, + isConnected: true + }) + } else { + trusteeAsyncStorage.setWalletConnectLink('') + trusteeAsyncStorage.setWalletConnectDapp('') + dispatch({ + type: 'SET_WALLET_CONNECT', + walletConnectLink: false, + walletConnectLinkError: false, + walletConnector: false, + walletConnections: [], + isConnected: false, + linkSource: false, + }) } - return dispatch({ - type: 'SET_WALLET_CONNECT_ACCOUNT', - accountAddress, - accountChainId, - accountCurrencyCode, - accountWalletName - }) - } - - const account = accountList[walletHash][MAIN_CURRENCY_CODE] || accountList[walletHash]['ETH'] - let res = [] - if (peerMeta && typeof peerMeta !== 'undefined' && typeof peerMeta.description !== 'undefined' && peerMeta.description === 'TrusteeConnect4Tron') { - res = [accountList[walletHash]['TRX'].address, account.address] - _setWalletConnectAccount(res[0], 'TRX', 'TRX', walletName) - } else { - res = [account.address] - _setWalletConnectAccount(res[0], MAIN_CHAIN_ID, MAIN_CURRENCY_CODE, walletName) - } - return { - data: { - accounts: res, - chainId: MAIN_CHAIN_ID && MAIN_CHAIN_ID > 0 ? MAIN_CHAIN_ID : 1 - }, - account, + } catch (e) { + console.log('WalletConnect.disconnectAndSetWalletConnectLink error ' + e.message) } } } diff --git a/app/appstores/Stores/WalletConnect/helpers.js b/app/appstores/Stores/WalletConnect/helpers.js index 3265e1404..c5c07edcd 100644 --- a/app/appstores/Stores/WalletConnect/helpers.js +++ b/app/appstores/Stores/WalletConnect/helpers.js @@ -1,5 +1,5 @@ /** - * @version 1.0 + * @version 2.0 */ import store from '@app/store' @@ -11,17 +11,17 @@ import NavStore from '@app/components/navigation/NavStore' import TransactionFilterTypeDict from '@appV2/dicts/transactionFilterTypeDict' -import walletConnectService from '@app/appstores/Stores/WalletConnect/WalletConnectService' import { NETWORKS_SETTINGS } from '@app/appstores/Stores/WalletConnect/settings' +import walletConnectService from '@app/appstores/Stores/WalletConnect/WalletConnectService' +import walletConnectActions from '@app/appstores/Stores/WalletConnect/WalletConnectStoreActions' import { SendActionsStart } from '@app/appstores/Stores/Send/SendActionsStart' - -export function handleSessionRequestModal(walletConnector, data, dappData) { +export function handleSessionProposalModal(walletConnector, data) { let title = '?' try { - title = data.peerMeta.name + ' ' + data.peerMeta.url + title = data.params?.proposer?.metadata?.name + ' ' + data.params?.proposer?.metadata?.url } catch (e) { - Log.err('WalletConnectService.handleSessionRequest title error ' + e.message) + Log.err('WalletConnectService.handleSessionProposal v2 title error ' + e.message) } showModal({ type: 'YES_NO_MODAL', @@ -30,23 +30,23 @@ export function handleSessionRequestModal(walletConnector, data, dappData) { description: strings('settings.walletConnect.sessionText') + title, reverse: true, noCallback: async () => { - await walletConnectService.rejectSession(walletConnector) + await walletConnectService.rejectSession(walletConnector, data) const { initSource } = store.getState().walletConnectStore if (initSource === 'QR') { - Log.log('WalletConnectService.handleSessionRequest NO initSource=' + initSource + ' navStore.goBack started') + Log.log('WalletConnectService.handleSessionProposal v2 NO initSource=' + initSource + ' navStore.goBack started') NavStore.goBack() } else { - Log.log('WalletConnectService.handleSessionRequest NO initSource=' + initSource + ' navStore.goBack skipped') + Log.log('WalletConnectService.handleSessionProposal v2 NO initSource=' + initSource + ' navStore.goBack skipped') } } }, async () => { - await walletConnectService.approveSession(walletConnector, data, dappData) + await walletConnectService.approveSession(walletConnector, data) + walletConnectActions.getAndSetWalletConnections(walletConnector) }) } -export async function handleSendTransactionRedirect(walletConnector, data, payload) { - const { accountCurrencyCode } = store.getState().walletConnectStore +export async function handleSendTransactionRedirect(walletConnector, data, accountCurrencyCode, payload) { const { cryptoCurrencies } = store.getState().currencyStore let found = false for (const cryptoCurrency of cryptoCurrencies) { @@ -75,36 +75,54 @@ export async function handleSendTransactionRedirect(walletConnector, data, paylo await SendActionsStart.startFromWalletConnect({ currencyCode: accountCurrencyCode, walletConnectData: data, - walletConnectPayload : payload, + walletConnectPayload: payload, transactionFilterType : TransactionFilterTypeDict.WALLET_CONNECT }) } +export function handleSignTransactionModal(walletConnector, chainId, data, accountCurrencyCode, payload) { + + const dataCopy = {...data} + if (typeof dataCopy.from !== 'undefined') { + delete dataCopy.from + } + showModal({ + type: 'YES_NO_MODAL', + icon: 'WARNING', + title: strings('settings.walletConnect.sign') + ' ' + data.from + ' ' + accountCurrencyCode, + description: strings('settings.walletConnect.signTransaction') + ' ' + JSON.stringify(dataCopy), + noCallback: async () => { + walletConnectService.rejectRequest(walletConnector, payload) + } + }, async () => { + await walletConnectService.approveSignTransaction(walletConnector, chainId, data.from, data, accountCurrencyCode, payload) + }) +} -export function handleSendSignModal(walletConnector, message, payload) { +export function handleSendSignModal(walletConnector, chainId, from, message, payload) { showModal({ type: 'YES_NO_MODAL', icon: 'WARNING', - title: strings('settings.walletConnect.sign'), - description: strings('settings.walletConnect.signText') + message, + title: strings('settings.walletConnect.sign') + ' ' + from, + description: strings('settings.walletConnect.signText') + ' ' + message, noCallback: async () => { - await walletConnectService.rejectRequest(walletConnector, payload) + walletConnectService.rejectRequest(walletConnector, payload) } }, async () => { - await walletConnectService.approveSign(walletConnector, message, payload) + await walletConnectService.approveSign(walletConnector, chainId, from, message, payload) }) } -export function handleSendSignTypedModal(walletConnector, data, payload) { +export function handleSendSignTypedModal(walletConnector, chainId, from, data, payload) { showModal({ type: 'YES_NO_MODAL', icon: 'WARNING', - title: strings('settings.walletConnect.signTyped'), - description: strings('settings.walletConnect.signTypedText') + JSON.stringify(data).substr(0, 200), + title: strings('settings.walletConnect.signTyped') + ' ' + from, + description: strings('settings.walletConnect.signTypedText') + ' ' + JSON.stringify(data).substr(0, 200), noCallback: async () => { - await walletConnectService.rejectRequest(walletConnector, payload) + walletConnectService.rejectRequest(walletConnector, payload) } }, async () => { - await walletConnectService.approveSignTyped(walletConnector, data, payload) + await walletConnectService.approveSignTyped(walletConnector, chainId, from, data, payload) }) } \ No newline at end of file diff --git a/app/appstores/Stores/WalletConnect/selectors.js b/app/appstores/Stores/WalletConnect/selectors.js index b6d5afb7c..f41dea1a8 100644 --- a/app/appstores/Stores/WalletConnect/selectors.js +++ b/app/appstores/Stores/WalletConnect/selectors.js @@ -16,11 +16,7 @@ export const getWalletConnectData = createSelector( linkSource: data.linkSource, walletConnectLink: data.walletConnectLink, walletConnectLinkError: data.walletConnectLinkError, - accountCurrencyCode: data.accountCurrencyCode, - accountAddress: data.accountAddress, - accountWalletName: data.accountWalletName, - peerId: data.peerId, - peerMeta: data.peerMeta + walletConnections: data.walletConnections } }) ) diff --git a/app/config/config.js b/app/config/config.js index c8ae1a5f5..a4b6e6fd0 100644 --- a/app/config/config.js +++ b/app/config/config.js @@ -55,7 +55,7 @@ const config = { appDaemonLogs: false, // set false to see cron jobs logs in files only cryptoLogs: false, // set false to see crypto logs in files only cryptoErrors: false, // set false to get crypto errors in tg only - appErrors: false, // set false to get errors in tg only + appErrors: true, // set false to get errors in tg only fioErrors: false, // appDBLogs: false, // set false to get db query in files only firebaseLogs: true, // set false not to collect data to firebase live db diff --git a/app/modules/Account/AccountStaking/AccountStakingTRX.js b/app/modules/Account/AccountStaking/AccountStakingTRX.js index ad3b2daca..8ff09f200 100644 --- a/app/modules/Account/AccountStaking/AccountStakingTRX.js +++ b/app/modules/Account/AccountStaking/AccountStakingTRX.js @@ -38,6 +38,7 @@ import InputAndButtonsPartBalanceButton from '@app/modules/Send/elements/InputAn import InfoProgressBar from './elements/InfoProgressBar' import StakeView from './trx/StakeView' import { handleTrxScan, handleFreezeV2Trx, handleUnFreezeV1Trx, handlePartBalance, handleGetRewardTrx, handleVoteTrx } from './helper' +import Log from '@app/services/Log/Log' const CACHE_ASKED = {} const CACHE_ASK_TIME = 6000 @@ -155,7 +156,10 @@ class AccountStakingTRX extends React.PureComponent { _wrapError = (e) => { let msg = e.toString() - if (msg.indexOf('less than 24 hours') !== -1) { + Log.log('AccountStakingTrx._wrapError ' + msg) + if (msg.indexOf('SERVER_RESPONSE_') !== -1) { + msg = strings('send.errors.' + e.message) + } else if (msg.indexOf('less than 24 hours') !== -1) { msg = strings('settings.walletList.waitToClaimTRX') } else if (msg.indexOf('not time to unfreeze') !== -1) { msg = strings('settings.walletList.waitToUnfreezeTRX', { TRX_STAKE_DAYS: BlocksoftExternalSettings.getStatic('TRX_STAKE_DAYS') }) diff --git a/app/modules/Account/AccountStaking/helper.js b/app/modules/Account/AccountStaking/helper.js index 2aa09c39e..4638139f5 100644 --- a/app/modules/Account/AccountStaking/helper.js +++ b/app/modules/Account/AccountStaking/helper.js @@ -404,7 +404,10 @@ async function _sendTxTrx(shortLink, params, langMsg, uiParams) { const _wrapError = (e) => { let msg = e.toString() - if (msg.indexOf('less than 24 hours') !== -1) { + Log.log('AccountStaking.helper._wrapError ' + msg) + if (msg.indexOf('SERVER_RESPONSE_') !== -1) { + msg = strings('send.errors.' + e.message) + } else if (msg.indexOf('less than 24 hours') !== -1) { msg = strings('settings.walletList.waitToClaimTRX') } else if (msg.indexOf('not time to unfreeze') !== -1 || msg.indexOf('no unFreeze balance to withdraw') !== -1) { msg = strings('settings.walletList.waitToUnfreezeTRX', {'TRX_STAKE_DAYS' : BlocksoftExternalSettings.getStatic('TRX_STAKE_DAYS')}) diff --git a/app/modules/QRCodeScanner/helpers.js b/app/modules/QRCodeScanner/helpers.js index ae7bee663..096b4a866 100644 --- a/app/modules/QRCodeScanner/helpers.js +++ b/app/modules/QRCodeScanner/helpers.js @@ -91,8 +91,8 @@ export const finishProcess = async (param, qrCodeScannerConfig) => { }, 500) } else { NavStore.goBack() - setTimeout(() => { - walletConnectActions.connectAndSetWalletConnectLink(res.data.walletConnect.fullLink, 'QR') + setTimeout(async () => { + await walletConnectActions.connectAndSetWalletConnectLink(res.data.walletConnect.fullLink, 'QR') NavStore.goNext('WalletConnectScreen') }, 100) } diff --git a/app/modules/Send/ReceiptScreen.js b/app/modules/Send/ReceiptScreen.js index f0b50eef0..3e63a3c83 100644 --- a/app/modules/Send/ReceiptScreen.js +++ b/app/modules/Send/ReceiptScreen.js @@ -38,8 +38,8 @@ import { showModal } from '@app/appstores/Stores/Modal/ModalActions' import ScreenWrapper from '@app/components/elements/ScreenWrapper' import TransactionItem from '@app/modules/Account/AccountTransaction/elements/TransactionItem' -import walletConnectActions from '@app/appstores/Stores/WalletConnect/WalletConnectStoreActions' import BlocksoftCryptoLog from '@crypto/common/BlocksoftCryptoLog' +import walletConnectActions from '@app/appstores/Stores/WalletConnect/WalletConnectStoreActions' let CACHE_IS_COUNTING = false let CACHE_IS_SENDING_CLICKED = 0 @@ -270,7 +270,7 @@ class ReceiptScreen extends PureComponent { } else { if (uiType === 'WALLET_CONNECT') { try { - await walletConnectActions.rejectRequestWalletConnect(walletConnectPayload) + await walletConnectActions.rejectRequest(walletConnectPayload) } catch (e) { Log.log('ReceiptScreen.closeAction WALLET_CONNECT error ' + e) } @@ -287,7 +287,7 @@ class ReceiptScreen extends PureComponent { const { uiType, walletConnectPayload } = this.props.sendScreenStore.ui if (uiType === 'WALLET_CONNECT') { try { - await walletConnectActions.rejectRequestWalletConnect(walletConnectPayload) + await walletConnectActions.rejectRequest(walletConnectPayload) } catch (e) { Log.log('ReceiptScreen.backAction WALLET_CONNECT error ' + e.message) } diff --git a/app/modules/WalletConnect/WalletConnectScreen.js b/app/modules/WalletConnect/WalletConnectScreen.js index e6b0890e2..5c0c7db51 100644 --- a/app/modules/WalletConnect/WalletConnectScreen.js +++ b/app/modules/WalletConnect/WalletConnectScreen.js @@ -1,5 +1,5 @@ /** - * @version 0.43 + * @version 2.0 * @author Vadym */ import React, { PureComponent } from 'react' @@ -12,8 +12,6 @@ import ListItem from '@app/components/elements/new/list/ListItem/Setting' import NavStore from '@app/components/navigation/NavStore' import MarketingAnalytics from '@app/services/Marketing/MarketingAnalytics' -import BlocksoftPrettyStrings from '@crypto/common/BlocksoftPrettyStrings' - import { strings } from '@app/services/i18n' import ScreenWrapper from '@app/components/elements/ScreenWrapper' @@ -33,11 +31,8 @@ import Message from '@app/components/elements/new/Message' import CustomIcon from '@app/components/elements/CustomIcon' import GradientView from '@app/components/elements/GradientView' -import TransactionItem from '@app/modules/Account/AccountTransaction/elements/TransactionItem' import WalletDappFastLinksScreen from '@app/modules/WalletDapp/WalletDappFastLinksScreen' -import colorDict from '@app/services/UIDict/UIDictData' - import { NETWORKS_SETTINGS } from '@app/appstores/Stores/WalletConnect/settings' import { getSelectedAccountData } from '@app/appstores/Stores/Main/selectors' import { getWalletDappData } from '@app/appstores/Stores/WalletDapp/selectors' @@ -47,19 +42,6 @@ import Toast from 'react-native-root-toast' import Log from '@app/services/Log/Log' -const getIcon = (block, isLight) => { - let _block = block - if (block === 'MATIC') { - _block = 'ETH_MATIC' - } else if (block === 'ONE') { - _block = 'ETH_ONE' - } - - return ( - - ) -} - class WalletConnectScreen extends PureComponent { @@ -86,8 +68,8 @@ class WalletConnectScreen extends PureComponent { }) } - handleConnect = () => { - if (walletConnectActions.connectAndSetWalletConnectLink(this.state.inputFullLink, 'WalletConnectScreen')) { + handleConnect = async () => { + if (await walletConnectActions.connectAndSetWalletConnectLink(this.state.inputFullLink, 'WalletConnectScreen')) { // connected so we can clear input this.linkInput.handleInput('', false) this.setState({ @@ -123,10 +105,6 @@ class WalletConnectScreen extends PureComponent { NavStore.reset('HomeScreen') } - handleChangeNetwork = () => { - NavStore.goNext('WalletConnectChangeNetworkScreen') - } - handleLastDapp = () => { NavStore.goNext('WalletDappWebViewScreen') } @@ -162,20 +140,11 @@ class WalletConnectScreen extends PureComponent { const { GRID_SIZE, colors, - isLight } = this.context const { dappCode, dappName } = this.props.walletDappData - const { walletConnectLink, walletConnectLinkError, accountCurrencyCode, accountAddress, accountWalletName, peerId, peerMeta, isConnected } = this.props.walletConnectData - - const condition = peerId && typeof peerMeta !== 'undefined' && isConnected - - const titleCondition = condition ? typeof peerMeta.name !== 'undefined' ? peerMeta.name : '' : strings('settings.walletConnect.unconnectedTitle') - - const textCondition = condition ? typeof peerMeta.url !== 'undefined' ? peerMeta.url : '' : strings('settings.walletConnect.unconnectedText') - - const imageUri = peerMeta?.icons?.length ? peerMeta?.icons?.find(item => item.indexOf('.png') !== -1) : '' + const { walletConnectLink, walletConnectLinkError, walletConnections, isConnected } = this.props.walletConnectData return ( <> @@ -187,35 +156,26 @@ class WalletConnectScreen extends PureComponent { - <> - - {peerId && peerMeta && isConnected ? - : - } - {peerId && peerMeta && isConnected && - - {getIcon(accountCurrencyCode, isLight)} - - } - - - - {titleCondition} - {textCondition} + { + walletConnections.map((item, index) => ( + <> + + {item.peer && item.peer.icons && typeof item.peer.icons[0] !== 'undefined' && item.peer.icons[0] ? + : + } - - {peerId && peerMeta !== 'undefined' && isConnected && - - + + + {item.peer.name || strings('settings.walletConnect.unconnectedText')} + {item.peer.url || strings('settings.walletConnect.unconnectedText')} + - } - + + )) + } + {!isConnected && @@ -252,18 +212,7 @@ class WalletConnectScreen extends PureComponent { } - {accountCurrencyCode && isConnected && - - - - } + {dappCode && isConnected && diff --git a/app/modules/WalletDapp/WalletDappWebViewScreen.js b/app/modules/WalletDapp/WalletDappWebViewScreen.js index 620164b0c..d6a480d14 100644 --- a/app/modules/WalletDapp/WalletDappWebViewScreen.js +++ b/app/modules/WalletDapp/WalletDappWebViewScreen.js @@ -110,34 +110,45 @@ class WalletDappWebViewScreen extends PureComponent { // general handler (could be not only wallet connect) handleWebViewNavigationTestLink = (req) => { Log.log('WalletDapp.WebViewScreen handle link ' + req.url) - let url = req.url - let parsedUrl = UrlParse(url) - if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') { - let position = req.url.indexOf('/wc?uri=wc%3A') - if (position !== -1) { - position = position + 8 - const tmp = req.url.substr(position, req.url.length) - Log.log('WalletDapp.WebViewScreen handle link update tmp ' + tmp) - url = decodeURIComponent(tmp) - Log.log('WalletDapp.WebViewScreen handle link update url ' + url) - parsedUrl = UrlParse(url) + let parsedUrl = false + let url = false + try { + url = req.url + parsedUrl = UrlParse(url) + if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') { + let position = req.url.indexOf('/wc?uri=wc%3A') + if (position !== -1) { + position = position + 8 + const tmp = req.url.substr(position, req.url.length) + Log.log('WalletDapp.WebViewScreen handle link update tmp ' + tmp) + url = decodeURIComponent(tmp) + Log.log('WalletDapp.WebViewScreen handle link update url ' + url) + parsedUrl = UrlParse(url) + } } - } - if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') { - return true + if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') { + console.log('GO ' + JSON.stringify(parsedUrl)) + return true + } + } catch (err) { + if (config.debug.appErrors) { + console.log(`WalletDapp.WebViewScreen handle parse error `, err.message) + } + Log.log(`WalletDapp.WebViewScreen handle parse error `, err.message) + return false } try { if (parsedUrl.protocol === 'wc:') { - if (url.indexOf('?bridge=') !== -1) { - walletConnectActions.connectAndSetWalletConnectLink(url, 'DAPP', false, this.props.walletDappData) - } else { - // ? - } - return false + walletConnectActions.connectAndSetWalletConnectLink(url, 'DAPP', true, this.props.walletDappData) } } catch (err) { - return true + if (config.debug.appErrors) { + console.log(`WalletDapp.WebViewScreen handle dapp error `, err.message) + } + Log.log(`WalletDapp.WebViewScreen handle dapp error `, err.message) } + // this.webref.stopLoading() + return false } render() { diff --git a/appV2/services/trusteeAsyncStorage/trusteeAsyncStorage.js b/appV2/services/trusteeAsyncStorage/trusteeAsyncStorage.js index 5857236d5..53c539c43 100644 --- a/appV2/services/trusteeAsyncStorage/trusteeAsyncStorage.js +++ b/appV2/services/trusteeAsyncStorage/trusteeAsyncStorage.js @@ -240,8 +240,8 @@ class TrusteeAsyncStorage { return this._set('wcLink', value) } - getWalletConnectSession = () => { - const tmp = this._getStatic('wcSession') + getWalletConnectDapp = () => { + const tmp = this._getStatic('wcDapp') if (!tmp) return false try { return JSON.parse(tmp) @@ -250,8 +250,8 @@ class TrusteeAsyncStorage { } } - setWalletConnectSession = (value) => { - return this._set('wcSession', JSON.stringify(value)) + setWalletConnectDapp = (value) => { + return this._set('wcDapp', value ? JSON.stringify(value) : '') } setUseFirebaseForBSE = (value) => { @@ -262,6 +262,20 @@ class TrusteeAsyncStorage { return this._getStatic('useFirebaseForBSE') } + getWalletConnectKC = (value) => { + const tmp = this._getStatic('wcKC11') + if (!tmp) return {} + try { + return JSON.parse(tmp) + } catch (e) { + return false + } + } + + setWalletConnectKC = (value) => { + return this._set('wcKC11', JSON.stringify(value)) + } + } const trusteeAsyncStorage = new TrusteeAsyncStorage() diff --git a/assets/fast-text-encoding.min.js b/assets/fast-text-encoding.min.js new file mode 100644 index 000000000..240043393 --- /dev/null +++ b/assets/fast-text-encoding.min.js @@ -0,0 +1,3 @@ +(function(scope) {'use strict'; +function B(r,e){var f;return r instanceof Buffer?f=r:f=Buffer.from(r.buffer,r.byteOffset,r.byteLength),f.toString(e)}var w=function(r){return Buffer.from(r)};function h(r){for(var e=0,f=Math.min(256*256,r.length+1),n=new Uint16Array(f),i=[],o=0;;){var t=e=f-1){var s=n.subarray(0,o),m=s;if(i.push(String.fromCharCode.apply(null,m)),!t)return i.join("");r=r.subarray(e),e=0,o=0}var a=r[e++];if((a&128)===0)n[o++]=a;else if((a&224)===192){var d=r[e++]&63;n[o++]=(a&31)<<6|d}else if((a&240)===224){var d=r[e++]&63,l=r[e++]&63;n[o++]=(a&31)<<12|d<<6|l}else if((a&248)===240){var d=r[e++]&63,l=r[e++]&63,R=r[e++]&63,c=(a&7)<<18|d<<12|l<<6|R;c>65535&&(c-=65536,n[o++]=c>>>10&1023|55296,c=56320|c&1023),n[o++]=c}}}function F(r){for(var e=0,f=r.length,n=0,i=Math.max(32,f+(f>>>1)+7),o=new Uint8Array(i>>>3<<3);e=55296&&t<=56319){if(e=55296&&t<=56319)continue}if(n+4>o.length){i+=8,i*=1+e/r.length*2,i=i>>>3<<3;var m=new Uint8Array(i);m.set(o),o=m}if((t&4294967168)===0){o[n++]=t;continue}else if((t&4294965248)===0)o[n++]=t>>>6&31|192;else if((t&4294901760)===0)o[n++]=t>>>12&15|224,o[n++]=t>>>6&63|128;else if((t&4292870144)===0)o[n++]=t>>>18&7|240,o[n++]=t>>>12&63|128,o[n++]=t>>>6&63|128;else continue;o[n++]=t&63|128}return o.slice?o.slice(0,n):o.subarray(0,n)}var u="Failed to ",p=function(r,e,f){if(r)throw new Error("".concat(u).concat(e,": the '").concat(f,"' option is unsupported."))};var x=typeof Buffer=="function"&&Buffer.from;var A=x?w:F;function v(){this.encoding="utf-8"}v.prototype.encode=function(r,e){return p(e&&e.stream,"encode","stream"),A(r)};function U(r){var e;try{var f=new Blob([r],{type:"text/plain;charset=UTF-8"});e=URL.createObjectURL(f);var n=new XMLHttpRequest;return n.open("GET",e,!1),n.send(),n.responseText}finally{e&&URL.revokeObjectURL(e)}}var O=!x&&typeof Blob=="function"&&typeof URL=="function"&&typeof URL.createObjectURL=="function",S=["utf-8","utf8","unicode-1-1-utf-8"],T=h;x?T=B:O&&(T=function(r){try{return U(r)}catch(e){return h(r)}});var y="construct 'TextDecoder'",E="".concat(u," ").concat(y,": the ");function g(r,e){r=r||"utf-8";var f;if(x?f=Buffer.isEncoding(r):f=S.indexOf(r.toLowerCase())!==-1,!f)throw new RangeError("".concat(E," encoding label provided ('").concat(r,"') is invalid."));this.encoding=r,this.fatal=!1,this.ignoreBOM=!1}g.prototype.decode=function(r,e){p(e&&e.stream,"decode","stream");var f;return r instanceof Uint8Array?f=r:r.buffer instanceof ArrayBuffer?f=new Uint8Array(r.buffer):f=new Uint8Array(r),T(f,this.encoding)};scope.TextEncoder=scope.TextEncoder||v;scope.TextDecoder=scope.TextDecoder||g; +}(typeof window !== 'undefined' ? window : (typeof global !== 'undefined' ? global : this))); diff --git a/crypto/blockchains/eth/EthTransferProcessor.ts b/crypto/blockchains/eth/EthTransferProcessor.ts index 0e39a41bb..784231ab7 100644 --- a/crypto/blockchains/eth/EthTransferProcessor.ts +++ b/crypto/blockchains/eth/EthTransferProcessor.ts @@ -46,6 +46,12 @@ const _getGasLimit = async ({ additionalData, data, currencyCode, realAddressTo, return gasLimit } + if (typeof data.walletConnectData !== 'undefined' && typeof data.walletConnectData.gasLimit !== 'undefined' && data.walletConnectData.gasLimit && data.walletConnectData.gasLimit !== '0x0') { + gasLimit = BlocksoftUtils.hexToDecimalWalletConnect(data.walletConnectData.gasLimit) + BlocksoftCryptoLog.log(currencyCode + ' EthTransferProcessor.getFeeRate walletConnectData v2 ' + gasLimit) + return gasLimit + } + if (typeof data.walletConnectData !== 'undefined') { let value = '0x' try { diff --git a/crypto/blockchains/trx/basic/TrxTransactionsProvider.js b/crypto/blockchains/trx/basic/TrxTransactionsProvider.js index 5e1884880..efa8e4f0d 100644 --- a/crypto/blockchains/trx/basic/TrxTransactionsProvider.js +++ b/crypto/blockchains/trx/basic/TrxTransactionsProvider.js @@ -165,6 +165,11 @@ export default class TrxTransactionsProvider { addressFrom = transaction.ownerAddress transactionDirection = 'unfreeze' transactionFilterType = TransactionFilterTypeDict.STAKE + } else if (typeof transaction.contractType !== 'undefined' && transaction.contractType === 56) { + addressAmount = transaction.amount + addressFrom = transaction.ownerAddress + transactionDirection = 'withdraw_unfrozen' + transactionFilterType = TransactionFilterTypeDict.STAKE } else if (typeof transaction.contractType !== 'undefined' && transaction.contractType === 4) { // no vote tx return false @@ -204,7 +209,10 @@ export default class TrxTransactionsProvider { transactionFilterType, inputValue: transaction.data } - if (!res.addressTo && (!res.addressFrom || res.addressFrom.toLowerCase() === address.toLowerCase())) { + if (!res.addressTo + && (!res.addressFrom || res.addressFrom.toLowerCase() === address.toLowerCase()) + && transactionFilterType !== TransactionFilterTypeDict.STAKE + ) { return false } diff --git a/crypto/blockchains/xmr/XmrTransferProcessor.ts b/crypto/blockchains/xmr/XmrTransferProcessor.ts index a1156046e..d76778cbd 100644 --- a/crypto/blockchains/xmr/XmrTransferProcessor.ts +++ b/crypto/blockchains/xmr/XmrTransferProcessor.ts @@ -104,7 +104,7 @@ export default class XmrTransferProcessor implements BlocksoftBlockchainTypes.Tr }) } }) - + if (typeof fee !== 'undefined' && fee && typeof fee.used_fee) { const tmp = { langMsg: 'xmr_speed_' + i, @@ -129,7 +129,11 @@ export default class XmrTransferProcessor implements BlocksoftBlockchainTypes.Tr }, amountForTx: '?' } - if (typeof fee.using_amount !== 'undefined') { + if (typeof fee.total_sent !== 'undefined' && fee.total_sent) { + tmp.amountForTx = fee.total_sent - fee.used_fee + logTmp.amountForTx = tmp.amountForTx + logTmp.xmr_total_sent = fee.total_sent + } else if (typeof fee.using_amount !== 'undefined') { tmp.amountForTx = fee.using_amount logTmp.amountForTx = fee.using_amount } else { diff --git a/docker/Dockerfile.androidprebuild b/docker/Dockerfile.androidprebuild index a5f3fce02..13c3cbec1 100644 --- a/docker/Dockerfile.androidprebuild +++ b/docker/Dockerfile.androidprebuild @@ -22,8 +22,8 @@ RUN apt-get -y update && \ # curl -sL -o bundletool.jar https://github.com/google/bundletool/releases/download/1.14.1/bundletool-all-1.14.1.jar && \ curl -sL -o bundletool.jar https://github.com/google/bundletool/releases/download/1.8.0/bundletool-all-1.8.0.jar && \ chmod 644 bundletool.jar && \ -# curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - && \ - curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - && \ + curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - && \ +# curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - && \ apt-get -y install nodejs && \ npm install --global yarn && \ apt-get -y autoremove && \ diff --git a/index.js b/index.js index bd043b165..8d37d2b0c 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ * @format * @lint-ignore-every XPLATJSCOPYRIGHT1 */ +import './polyfills' import 'react-native-gesture-handler' import { AppRegistry } from 'react-native' diff --git a/ios/trusteewallet-tvOS/Info.plist b/ios/trusteewallet-tvOS/Info.plist index f5ef3a816..b4e503920 100644 --- a/ios/trusteewallet-tvOS/Info.plist +++ b/ios/trusteewallet-tvOS/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.51.5 + 1.51.6 CFBundleSignature ???? CFBundleVersion diff --git a/ios/trusteewallet-tvOSTests/Info.plist b/ios/trusteewallet-tvOSTests/Info.plist index 4a2279b3e..b47df7cd1 100644 --- a/ios/trusteewallet-tvOSTests/Info.plist +++ b/ios/trusteewallet-tvOSTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.51.5 + 1.51.6 CFBundleSignature ???? CFBundleVersion diff --git a/ios/trusteewallet/Info.plist b/ios/trusteewallet/Info.plist index db71eab45..da8ede9a6 100644 --- a/ios/trusteewallet/Info.plist +++ b/ios/trusteewallet/Info.plist @@ -31,7 +31,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.51.5 + 1.51.6 CFBundleSignature ???? CFBundleURLTypes diff --git a/ios/trusteewalletTests/Info.plist b/ios/trusteewalletTests/Info.plist index f0a3b832a..1dfca6911 100644 --- a/ios/trusteewalletTests/Info.plist +++ b/ios/trusteewalletTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.51.5 + 1.51.6 CFBundleSignature ???? CFBundleVersion diff --git a/locales/en.json b/locales/en.json index 5de038cf8..90f2a779a 100644 --- a/locales/en.json +++ b/locales/en.json @@ -80,6 +80,7 @@ "transaction": "Transaction request", "transactionText": "Are you sure you want to allow %{subtitle} to use your %{txPrice} for transactions?", "sign": "WalletConnect Sign Request", + "signTransaction": "Do you want to sign transaction ", "signText": "Do you want to sign message ", "signTyped": "WalletConnect Sign Typed Request", "signTypedText": "Do you want to sign message ", @@ -503,6 +504,7 @@ "income": "Income", "freeze" : "Freeze", "unfreeze" : "UnFreeze", + "withdraw_unfrozen": "Withdraw UnFrozen", "claim" : "Claim", "stake" : "Stake", "vote": "Vote", @@ -598,7 +600,7 @@ "share": "Share", "booster": "Booster", "remove": "Remove", - "removeRbf": "Returning a tx", + "removeRbf": "Reverse", "check": "Check", "support": "Support", "details": "Details", @@ -883,7 +885,7 @@ "SERVER_RESPONSE_NOTHING_LEFT_FOR_FEE": "Insufficient balance to pay the network fee - please use an option \"Send All\" ", "SERVER_RESPONSE_NOTHING_LEFT_FOR_DELEGATED_FEE": "Insufficient balance to pay the delegated transaction - please use ERC20 standard transaction", "SERVER_RESPONSE_NO_RESPONSE": "The transaction has not received a network confirmation - please wait for the other transactions to be mined", - "SERVER_RESPONSE_NO_RESPONSE_XMR": "Please, wait until the previous transactions have reached the required number of network confirmations (at least 15) and retry the current one", + "SERVER_RESPONSE_NO_RESPONSE_XMR": "Under the terms of the Monero protocol, each incoming transaction must collect at least 50 network confirmations (~1.5 hours) before being sent. Please wait until the last incoming transaction reaches 50 network confirmations and retry sending.", "SERVER_RESPONSE_NO_RESPONSE_OR_MORE_FEE": "The transaction has not received a network confirmation - please wait for the other transactions to be mined or place higher fee", "SERVER_RESPONSE_NOT_ENOUGH_CONFIRMED_FEE": "Insufficient balance of native currency %{symbol} to pay the network fee - please wait for the other transactions to be mined", "SERVER_RESPONSE_NOT_ENOUGH_AMOUNT_AS_FEE": "Transaction fee is too small", @@ -913,7 +915,7 @@ "SERVER_RESPONSE_BAD_SEND_NODE" : "No access to sending server or internet error - please try again", "SERVER_RESPONSE_DOUBLE_SPEND" : "Please, regenerate transaction as outputs are changed or wait for the other transactions to be mined", "SERVER_RESPONSE_NO_TX_TO_SPEEDUP" : "Transaction for speedup not found", - "SERVER_RESPONSE_BANDWITH_ERROR_TRX" : "Insufficient TRX balance for fee / bandwidth limit is over", + "SERVER_RESPONSE_BANDWITH_ERROR_TRX" : "The Bandwidth (BW) of your address is not enough to complete a tx. Wait a day to replenish the BW or receive 1-2 TRX to the wallet address to compensate the BW.", "SERVER_RESPONSE_ENERGY_ERROR_VET" : "Insufficient VeChain Thor Token (VTHO) balance for fee", "SERVER_RESPONSE_PLEASE_CHECK_SYSTEM_TIME": "Please check your phone system time - it need to be synchronized for correct transaction creation", "SERVER_RESPONSE_NOT_ENOUGH_BALANCE_SOL" : "Insufficient balance to make the transaction", diff --git a/locales/fr.json b/locales/fr.json index 00d666945..1f9b19e97 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -80,6 +80,7 @@ "transaction": "Demande de transaction", "transactionText": "Êtes-vous sûr de vouloir autoriser %{subtitle} à utiliser votre %{txPrice} pour les transactions?", "sign": "Demande de signature de WalletConnect", + "signTransaction": "Do you want to sign transaction ", "signText": "Voulez-vous signer le message", "signTyped": "Demande de type de signe WalletConnect", "signTypedText": "Voulez-vous signer le message", @@ -502,6 +503,7 @@ "income": "Revenu", "freeze": "Geler", "unfreeze": "Dégeler", + "withdraw": "Withdraw UnFrozen", "claim": "Réclamer", "stake": "Stake", "vote": "Vote", @@ -882,7 +884,7 @@ "SERVER_RESPONSE_NOTHING_LEFT_FOR_FEE": "Solde insuffisant pour payer les frais de réseau - veuillez utiliser une option \"Envoyer tout\" ", "SERVER_RESPONSE_NOTHING_LEFT_FOR_DELEGATED_FEE": "Solde insuffisant pour payer la transaction déléguée - veuillez utiliser la transaction standard ERC20", "SERVER_RESPONSE_NO_RESPONSE": "La transaction n'a pas reçu de confirmation du réseau - veuillez attendre que les autres transactions soient minées", - "SERVER_RESPONSE_NO_RESPONSE_XMR": "Veuillez attendre que les transactions précédentes aient atteint le nombre requis de confirmations de réseau (au moins 15) et réessayez avec la transaction en cours", + "SERVER_RESPONSE_NO_RESPONSE_XMR": "Selon les termes du protocole Monero, chaque transaction entrante doit collecter au moins 50 confirmations réseau (~1,5 heures) avant d'être envoyée. Veuillez attendre que la dernière transaction entrante atteigne 50 confirmations de réseau et réessayez d'envoyer.", "SERVER_RESPONSE_NO_RESPONSE_OR_MORE_FEE": "La transaction n'a pas reçu de confirmation de réseau - veuillez attendre que les autres transactions soient minées ou placez des frais plus élevés", "SERVER_RESPONSE_NOT_ENOUGH_CONFIRMED_FEE": "Solde insuffisant de la devise native %{symbol} pour payer les frais de réseau - veuillez attendre que les autres transactions soient minées", "SERVER_RESPONSE_NOT_ENOUGH_AMOUNT_AS_FEE": "Les frais de transaction sont trop faibles", diff --git a/locales/ka.json b/locales/ka.json index 5e3710f28..65d29d04a 100644 --- a/locales/ka.json +++ b/locales/ka.json @@ -80,6 +80,7 @@ "transaction": "Transaction request", "transactionText": "Are you sure you want to allow %{subtitle} to use your %{txPrice} for transactions?", "sign": "WalletConnect Sign Request", + "signTransaction": "Do you want to sign transaction ", "signText": "Do you want to sign message ", "signTyped": "WalletConnect Sign Typed Request", "signTypedText": "Do you want to sign message ", @@ -502,6 +503,7 @@ "self": "სელფი", "freeze": "გაყინვა", "unfreeze" : "UnFreeze", + "withdraw_unfrozen": "Withdraw UnFrozen", "stake" : "Stake", "vote": "Vote", "wallet_connect" : "WalletConnect", @@ -875,7 +877,7 @@ "SERVER_RESPONSE_NOTHING_LEFT_FOR_FEE": "ბალანსზე არ არის საკმარისი თანხა ქსელის საკომისიოს დასაფარად - გთხოვთ, გამოიყენეთ ფუნქცია \"ყველას გაგზავნა\" ", "SERVER_RESPONSE_NOTHING_LEFT_FOR_DELEGATED_FEE": "ბალანსზე არაა საკმარისი თანხა დელეგირებული ტრანზაქციის განსახორციელებლად - გთხოვთ, გამოიყენეთ ჩვეულებრივი გადარიცხვა ERC20", "SERVER_RESPONSE_NO_RESPONSE": "ქსელი არ იღებს ტრანზაქციას - გთხოვთ, დაელოდოთ, სანამ სხვა ტრანზაქციები დადასტურდება", - "SERVER_RESPONSE_NO_RESPONSE_XMR": "გთხოვთ, დაელოდოთ სანამ წინა ტრანზაქციებმა მიაღწევს ქსელის დადასტურებების საჭირო რაოდენობას (მინიმუმ 15) და ხელახლა სცადეთ მიმდინარე", + "SERVER_RESPONSE_NO_RESPONSE_XMR": "Monero პროტოკოლის პირობების მიხედვით, ყოველი შემომავალი ტრანზაქცია გაგზავნამდე უნდა შეაგროვოს მინიმუმ 50 ქსელის დადასტურება (~1.5 საათი). გთხოვთ, დაელოდოთ, სანამ ბოლო შემომავალი ტრანზაქცია მიაღწევს 50 ქსელის დადასტურებას და ხელახლა სცადეთ გაგზავნა.", "SERVER_RESPONSE_NO_RESPONSE_OR_MORE_FEE": "ქსელი არ იღებს ტრანზაქციას - გთხოვთ, დაელოდოთ, სანამ სხვა ტრანზაქციები დადასტურდება, ან გამოიყენეთ მაღალი საკომისიო ", "SERVER_RESPONSE_NOT_ENOUGH_CONFIRMED_FEE": "ადგილობრივი მონეტები %{symbol} არასაკმარისია საკომისიოს გადასახდელად - გთხოვთ, დაელოდოთ, სანამ სხვა ტრანზაქციები დადასტურდება", "SERVER_RESPONSE_NOT_ENOUGH_AMOUNT_AS_FEE": "ძალიან მცირეა საკომისიო ტრანზაქციისთვის", diff --git a/locales/ru.json b/locales/ru.json index fb406a5fc..f48b81894 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -80,6 +80,7 @@ "transaction": "Запрос транзакции WalletConnect", "transactionText": "Вы хотите %{subtitle} (max tx cost: %{txPrice} ETH)", "sign": "Запрос подписи для WalletConnect", + "signTransaction": "Вы хотите подписать транзакцию", "signText": "Вы хотите подписать сообщение", "signTyped": "Типизированный запрос подписи для подключения к кошельку", "signTypedText": "Вы хотите подписать сообщение", @@ -503,8 +504,9 @@ "outcome": "Исходящая", "income": "Входящая", "self" : "Себе", - "freeze" : "Заморозить", - "unfreeze" : "Разморозить", + "freeze" : "Заморожено", + "unfreeze" : "Разморожено", + "withdraw_unfrozen": "Вывод размороженого", "claim" : "Награда", "swap_income" : "Contract Входящая", "swap_outcome" : "Contract Исходящая", @@ -884,7 +886,7 @@ "SERVER_RESPONSE_NOTHING_LEFT_FOR_FEE" : "Недостаточно средств на балансе для оплаты комиссии сети - пожалуйста, используйте опцию \"Отправить Все\" ", "SERVER_RESPONSE_NOTHING_LEFT_FOR_DELEGATED_FEE" : "Недостаточно средств на балансе для оплаты делегированной транзакции - пожалуйста, используйте обычную отправку ERC20", "SERVER_RESPONSE_NO_RESPONSE": "Сеть не принимает транзакцию - пожалуйста, подождите пока другие транзакции будут подтверждены", - "SERVER_RESPONSE_NO_RESPONSE_XMR": "Пожалуйста, подождите пока предыдущие транзакции наберут необходимое количество подтверждений сети (не менее 15) и повторите отправку текущей", + "SERVER_RESPONSE_NO_RESPONSE_XMR": "По условиям протокола Monero, каждая входящая транзакция перед отправкой должна набрать не менее 50 подтверждений сети (~1.5 часа). Пожалуйста, подождите пока последняя входящая транзакция наберет 50 подтверждений сети и повторите отправку.", "SERVER_RESPONSE_NO_RESPONSE_OR_MORE_FEE": "Сеть не принимает транзакцию - пожалуйста, подождите пока другие транзакции будут подтверждены или используйте большую комиссию", "SERVER_RESPONSE_NOT_ENOUGH_CONFIRMED_FEE": "Недостаточно средств нативной монеты %{symbol} для оплаты комиссии - пожалуйста, подождите пока другие транзакции будут подтверждены", "SERVER_RESPONSE_NOT_ENOUGH_AMOUNT_AS_FEE": "Слишком маленькая комиссия за транзакцию", @@ -914,7 +916,7 @@ "SERVER_RESPONSE_BAD_SEND_NODE" : "Нет доступа к серверу отправки или ошибка соединения - пожалуйста, попробуйте еще раз", "SERVER_RESPONSE_DOUBLE_SPEND" : "Пожалуйста, пересоздайте транзакцию, так как текущая использует уже устаревшие входы или подождите пока другие транзакции будут подтверждены", "SERVER_RESPONSE_NO_TX_TO_SPEEDUP" : "Транзакция для ускорения не найдена", - "SERVER_RESPONSE_BANDWITH_ERROR_TRX" : "Недостаточно средств TRX для транзакций / лимит бесплатных исчерпан", + "SERVER_RESPONSE_BANDWITH_ERROR_TRX" : "Пропускной способности (ПС) вашего адреса недостаточно для совершения транзакции. Подождите сутки для восполнения ПС либо переведите на адрес кошелька 1-2 TRX для компенсации ПС.", "SERVER_RESPONSE_ENERGY_ERROR_VET" : "Недостаточно средств VeChain Thor Token (VTHO) для оплаты сетевой комиссии", "SERVER_RESPONSE_PLEASE_CHECK_SYSTEM_TIME": "Пожалуйста, проверьте системное время устройства - необходимо синхронизировать время для создания транзакции", "SERVER_RESPONSE_NOT_ENOUGH_BALANCE_SOL" : "Недостаточно средств для отправки", diff --git a/locales/uk.json b/locales/uk.json index 9b6e6ec10..ce506095a 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -76,6 +76,7 @@ "transaction": "Запит на транзакцію WalletConnect", "transactionText": "Ви хочете %{subtitle} (max tx cost: %{txPrice} ETH)", "sign": "Запит на підпис підключення WalletConnect", + "signTransaction": "Ви хочете підписати транзакцію ", "signText": "Ви хочете підписати повідомлення ", "signTyped": "Запит із підписом WalletConnect", "signTypedText": "Ви хочете підписати повідомлення ", @@ -504,6 +505,7 @@ "self" : "Собі", "freeze" : "Заморожено", "unfreeze" : "Розморожено", + "withdraw_unfrozen": "Вивід розмороженого", "stake" : "Стейк", "vote": "Голосування", "wallet_connect" : "WalletConnect", @@ -883,7 +885,7 @@ "SERVER_RESPONSE_NOTHING_LEFT_FOR_FEE" : "Недостатньо коштів на балансі для сплати комісії мережі - будь ласка, використовуйте опцію \"Відправити Все \" ", "SERVER_RESPONSE_NOTHING_LEFT_FOR_DELEGATED_FEE" : "Недостатньо коштів на балансі для сплати делегованої транзакції - будь ласка, використовуйте звичайну відправку ERC20", "SERVER_RESPONSE_NO_RESPONSE" : "Мережа не приймає транзакцію - будь ласка, зачекайте доки замайняться інші транзакції", - "SERVER_RESPONSE_NO_RESPONSE_XMR": "Зачекайте, поки попередні транзакції наберуть необхідну кількість підтверджень мережі (не менше 15) та повторіть відправку поточної", + "SERVER_RESPONSE_NO_RESPONSE_XMR": "За умовами протоколу Monero, кожна транзакція, що входить перед відправкою, повинна набрати не менше 50 підтверджень мережі (~1.5 години). Зачекайте, поки остання вхідна транзакція набере 50 підтверджень мережі і повторіть відправку.\neng", "SERVER_RESPONSE_NO_RESPONSE_OR_MORE_FEE": "Мережа не приймає транзакцію - будь ласка, зачекайте доки замайняться інші транзакції або використовуйте більшу комісію", "SERVER_RESPONSE_NOT_ENOUGH_CONFIRMED_FEE": "Недостатньо коштів нативної монети %{symbol} для сплати комісії - будь ласка, зачекайте доки інші транзакції замайняться", "SERVER_RESPONSE_NOT_ENOUGH_AMOUNT_AS_FEE": "Занадто мала комісія за транзакцію", @@ -913,7 +915,7 @@ "SERVER_RESPONSE_BAD_SEND_NODE" : "Немає доступу до сервера відправки або помилка доступу до інтернету - будь ласка, спробуйте ще раз ", "SERVER_RESPONSE_DOUBLE_SPEND" : "Будь ласка, створіть повторно транзакцію, оскільки ця використовує вже застарілі входи або зачекайте доки інші транзакції замайняться", "SERVER_RESPONSE_NO_TX_TO_SPEEDUP" : "Транзакцію для прискорення не знайдено", - "SERVER_RESPONSE_BANDWITH_ERROR_TRX" : "Недостатньо коштів TRX для відправки / ліміт безкоштовних вичерпано", + "SERVER_RESPONSE_BANDWITH_ERROR_TRX" : "Пропускної спроможності (ПС) вашої адреси недостатньо для транзакції. Зачекайте на добу для заповнення ПС або переведіть на адресу гаманця 1-2 TRX для компенсації ПС.", "SERVER_RESPONSE_ENERGY_ERROR_VET" : "Недостатньо коштів VeChain Thor Token (VTHO) для відправки", "SERVER_RESPONSE_PLEASE_CHECK_SYSTEM_TIME": "Будь ласка, перевірте системний годинник пристрою - потрібно сінхронізувати час для створення транзакції", "SERVER_RESPONSE_NOT_ENOUGH_BALANCE_SOL" : "Недостатньо коштів для відправки", diff --git a/package.json b/package.json index 93cd6a0b2..7cd77a707 100644 --- a/package.json +++ b/package.json @@ -48,10 +48,7 @@ "@solana/web3.js": "git+https://git@github.com/trustee-wallet/solana-web3.js.git", "@tradle/react-native-http": "^2.0.1", "@unstoppabledomains/resolution": "^3.0.0", - "@walletconnect/client": "1.3.6", - "@walletconnect/core": "1.3.6", - "@walletconnect/iso-crypto": "git+https://git@github.com/trustee-wallet/walletconnect-iso-crypto.git", - "@walletconnect/utils": "1.3.6", + "@walletconnect/web3wallet": "^1.8.6", "@waves/ts-lib-crypto": "1.4.4-beta.1", "@waves/waves-transactions": "git+https://git@github.com/trustee-wallet/waves-transactions.git", "assert": "^1.5.0", @@ -59,6 +56,7 @@ "aws-sdk": "^2.941.0", "axios": "^0.19.0", "babel-plugin-module-resolver": "^4.1.0", + "big-integer": "^1.6.51", "bip32": "^2.0.4", "bip39": "^3.0.2", "bitcoinjs-lib": "git+https://git@github.com/trustee-wallet/bitcoinjs-lib", @@ -79,6 +77,7 @@ "ethjs-query": "^0.3.8", "events": "^1.1.1", "fast-luhn": "^1.0.4", + "fast-text-encoding": "^1.0.6", "https-browserify": "0.0.1", "i18n-js": "^3.5.1", "inherits": "^2.0.1", diff --git a/polyfills.js b/polyfills.js new file mode 100644 index 000000000..ee7901d91 --- /dev/null +++ b/polyfills.js @@ -0,0 +1,27 @@ +// import '@walletconnect/react-native-compat' => + +// Polyfill TextEncode / TextDecode +// import 'fast-text-encoding' +import '@assets/fast-text-encoding.min' + +// Polyfill crypto.getRandomvalues +// import 'react-native-get-random-values' + +// Polyfill Buffer +if (typeof Buffer === 'undefined') { + global.Buffer = require('buffer').Buffer +} + +if (typeof global?.Linking === 'undefined') { + try { + global.Linking = require('react-native').Linking + } catch (e) { + // eslint-disable-next-line no-console + console.error('react-native-compat: react-native.Linking is not available') + } +} +// end import '@walletconnect/react-native-compat' + +if (typeof BigInt === 'undefined') { + global.BigInt = require('big-integer'); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 46ce66367..5dbe17d78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1233,20 +1233,6 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@json-rpc-tools/types@^1.6.1": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e" - integrity sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ== - dependencies: - keyvaluestorage-interface "^1.0.0" - -"@json-rpc-tools/utils@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@json-rpc-tools/utils/-/utils-1.6.1.tgz#26e37d0fc4522721158d0f6057e136daa8813263" - integrity sha512-cNwP4QapAls+xATU8zLLqPYa9qCbgwEyWEK7vE1oH91b3LfbUYwHtiWZ1+rv0X/mh/9cWNTo2Oi2Sah/QX0WwA== - dependencies: - "@json-rpc-tools/types" "^1.6.1" - "@metamask/eth-sig-util@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" @@ -1295,30 +1281,6 @@ resolved "https://registry.yarnpkg.com/@mymonero/mymonero-sendfunds-utils/-/mymonero-sendfunds-utils-2.1.19.tgz#01ca5f23fc4656bb5e33c9665b0165da7c77199d" integrity sha512-JjZdWAl7tGTY5vEhBZy/efA0hh6YkqgJzCR5umF7K/5WhYFHJjPraPtkMcr776BswqxMI0BLhK383FOuqLS9ZA== -"@pedrouid/environment@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec" - integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug== - -"@pedrouid/iso-crypto@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pedrouid/iso-crypto/-/iso-crypto-1.1.0.tgz#3fb4050ea99f2f8ee41ba8661193c0989c815c95" - integrity sha512-twi+tW67XT0BSOv4rsegnGo4TQMhfFswS/GY3KhrjFiNw3z9x+cMkfO+itNe1JZghQxsxHuhifvfsnG814g1hQ== - dependencies: - "@pedrouid/iso-random" "^1.1.0" - aes-js "^3.1.2" - enc-utils "^3.0.0" - hash.js "^1.1.7" - -"@pedrouid/iso-random@^1.1.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@pedrouid/iso-random/-/iso-random-1.2.1.tgz#55178d9a2e7897b0f630dd1b4be76bc8460242d7" - integrity sha512-C35NqYMmLsg61WDiEup4OwjRhgfZIcK4BL+Qg49xowHUJ+f7/LFZCO+TGuQqoXFAj1beKIOpUN33f0fqV7zneQ== - dependencies: - "@pedrouid/environment" "^1.0.1" - enc-utils "^3.0.0" - randombytes "^2.1.0" - "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -1775,6 +1737,140 @@ superstruct "^0.14.2" tweetnacl "^1.0.0" +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@1.0.2", "@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1", "@stablelib/sha256@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" @@ -2266,169 +2362,233 @@ uuid "2.0.1" xmlhttprequest "1.8.0" -"@walletconnect/browser-utils@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz#33c10e777aa6be86c713095b5206d63d32df0951" - integrity sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A== - dependencies: - "@walletconnect/safe-json" "1.0.0" - "@walletconnect/types" "^1.8.0" - "@walletconnect/window-getters" "1.0.0" - "@walletconnect/window-metadata" "1.0.0" - detect-browser "5.2.0" - -"@walletconnect/client@1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.3.6.tgz#537b7af6bf87a906fcf171fd5bc4e56a2a3d1908" - integrity sha512-HmzUpF/cPqPf8huaVg45SXk2hKQ6yxisy/qJ+51SoRGmtZDokJGxpq6+RFOnE8jFtUhTZRaK9UZ/jvsJAxIhEw== - dependencies: - "@walletconnect/core" "^1.3.6" - "@walletconnect/iso-crypto" "^1.3.6" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" - -"@walletconnect/core@1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.3.6.tgz#1690081bc4666b6644ed6a1bed128509a5259e50" - integrity sha512-1HHP2xZI6b88WQgszs3gP5xkkCwwlWgDJz+J6ADGzVXhQP21p1mZhKezUtx27rOtQimMIrPDfgPyAHwQBZkkSw== - dependencies: - "@walletconnect/socket-transport" "^1.3.6" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" - -"@walletconnect/core@^1.3.6": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e" - integrity sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw== +"@walletconnect/auth-client@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/auth-client/-/auth-client-2.1.0.tgz#47b794cf807d6211fe3a87531f7fca7c6838fd3c" + integrity sha512-k6zZLEdlBpYIvbOL5tBWd+3DUJ2R4VFDyHpdp4TuRzC//njRkIzRSksEnsr8gN8P+IKuoJTLPsDy2sWR4qVTNQ== dependencies: - "@walletconnect/socket-transport" "^1.8.0" - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" - -"@walletconnect/crypto@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" - integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + "@ethersproject/hash" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@stablelib/random" "1.0.2" + "@stablelib/sha256" "^1.0.1" + "@walletconnect/core" "^2.7.2" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "^1.2.0" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/utils" "^2.7.2" + events "^3.3.0" + isomorphic-unfetch "^3.1.0" + +"@walletconnect/core@2.9.0", "@walletconnect/core@^2.7.2": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.9.0.tgz#7837a5d015a22b48d35b987bcde2aa9ccdf300d8" + integrity sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.12" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.9.0" + "@walletconnect/utils" "2.9.0" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" - "@walletconnect/randombytes" "^1.0.2" - aes-js "^3.1.2" - hash.js "^1.1.7" + tslib "1.14.1" -"@walletconnect/encoding@^1.0.1": +"@walletconnect/events@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" - integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== + resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== dependencies: - is-typedarray "1.0.0" - typedarray-to-buffer "3.1.5" - -"@walletconnect/environment@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" - integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" -"@walletconnect/iso-crypto@^1.3.6": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451" - integrity sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ== +"@walletconnect/heartbeat@1.2.1", "@walletconnect/heartbeat@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" + integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== dependencies: - "@walletconnect/crypto" "^1.0.2" - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" -"@walletconnect/iso-crypto@git+https://git@github.com/trustee-wallet/walletconnect-iso-crypto.git": - version "1.3.6" - resolved "git+https://git@github.com/trustee-wallet/walletconnect-iso-crypto.git#b8b4861a5bd4537d23a42b200daf0b1ba96e2c4f" +"@walletconnect/jsonrpc-provider@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" + integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== dependencies: - "@pedrouid/iso-crypto" "^1.0.0" - "@walletconnect/types" "^1.3.6" - "@walletconnect/utils" "^1.3.6" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + tslib "1.14.1" -"@walletconnect/jsonrpc-types@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.1.tgz#a96b4bb2bcc8838a70e06f15c1b5ab11c47d8e95" - integrity sha512-+6coTtOuChCqM+AoYyi4Q83p9l/laI6NvuM2/AHaZFuf0gT0NjW7IX2+86qGyizn7Ptq4AYZmfxurAxTnhefuw== +"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" + integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== dependencies: keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.3.tgz#5bd49865eef0eae48e8b45a06731dc18691cf8c7" - integrity sha512-3yb49bPk16MNLk6uIIHPSHQCpD6UAo1OMOx1rM8cW/MPEAYAzrSW5hkhG7NEUwX9SokRIgnZK3QuQkiyNzBMhQ== +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" + integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== + dependencies: + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.3" + tslib "1.14.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.12.tgz#2192314884fabdda6d0a9d22e157e5b352025ed8" + integrity sha512-HAcadga3Qjt1Cqy+qXEW6zjaCs8uJGdGQrqltzl3OjiK4epGZRdvSzTe63P+t/3z+D2wG+ffEPn0GVcDozmN1w== dependencies: - "@walletconnect/environment" "^1.0.0" - "@walletconnect/jsonrpc-types" "^1.0.1" + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + tslib "1.14.1" + ws "^7.5.1" -"@walletconnect/randombytes@^1.0.2": +"@walletconnect/keyvaluestorage@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" - integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" + integrity sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ== dependencies: - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/environment" "^1.0.0" - randombytes "^2.1.0" + safe-json-utils "^1.1.1" + tslib "1.14.1" -"@walletconnect/safe-json@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" - integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== +"@walletconnect/logger@2.0.1", "@walletconnect/logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" + integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== + dependencies: + pino "7.11.0" + tslib "1.14.1" -"@walletconnect/socket-transport@^1.3.6", "@walletconnect/socket-transport@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz#9a1128a249628a0be11a0979b522fe82b44afa1b" - integrity sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ== +"@walletconnect/relay-api@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" + integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== dependencies: - "@walletconnect/types" "^1.8.0" - "@walletconnect/utils" "^1.8.0" - ws "7.5.3" + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" -"@walletconnect/types@^1.3.6", "@walletconnect/types@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195" - integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg== +"@walletconnect/relay-auth@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + uint8arrays "^3.0.0" -"@walletconnect/utils@1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.3.6.tgz#e55cb5510eb41b4ae6be8e88c1de42abf309bdd3" - integrity sha512-nzTO5A3Ltjrsu6u8SR/KqdHTH03848KIj5MQlOCUjwxW1fXOvuri8+kwFKqlMn0bk1Qvlt6rrOptbt14PW8kSA== +"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== dependencies: - "@json-rpc-tools/utils" "1.6.1" - "@walletconnect/types" "^1.3.6" - bn.js "4.11.8" - detect-browser "5.1.0" - enc-utils "3.0.0" - js-sha3 "0.8.0" - query-string "6.13.5" - safe-json-utils "1.0.0" - window-getters "1.0.0" - window-metadata "1.0.0" + tslib "1.14.1" -"@walletconnect/utils@^1.3.6", "@walletconnect/utils@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060" - integrity sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA== +"@walletconnect/sign-client@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.9.0.tgz#fd3b0acb68bc8d56350f01ed70f8c6326e6e89fa" + integrity sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA== + dependencies: + "@walletconnect/core" "2.9.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.9.0" + "@walletconnect/utils" "2.9.0" + events "^3.3.0" + +"@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== dependencies: - "@walletconnect/browser-utils" "^1.8.0" - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/jsonrpc-utils" "^1.0.3" - "@walletconnect/types" "^1.8.0" - bn.js "4.11.8" - js-sha3 "0.8.0" - query-string "6.13.5" + tslib "1.14.1" -"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" - integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== +"@walletconnect/types@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.9.0.tgz#6e5dfdc7212c1ec4ab49a1ec409c743e16093f72" + integrity sha512-ORopsMfSRvUYqtjKKd6scfg8o4/aGebipLxx92AuuUgMTERSU6cGmIrK6rdLu7W6FBJkmngPLEGc9mRqAb9Lug== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" -"@walletconnect/window-metadata@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" - integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== +"@walletconnect/utils@2.9.0", "@walletconnect/utils@^2.7.2": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.9.0.tgz#c73925edb9fefe79021bcf028e957028f986b728" + integrity sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.9.0" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/web3wallet@^1.8.6": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@walletconnect/web3wallet/-/web3wallet-1.8.6.tgz#445f547111dafb1b673d71f6fef849580a14439b" + integrity sha512-HxE3Jtaxs5cKhZNULEwApeMnsQsh9SEyw4FO+lafoe9KKdc2neQlY/CnPz/S4i345/Dg+bz6BcUNXouimgz3EQ== + dependencies: + "@walletconnect/auth-client" "2.1.0" + "@walletconnect/core" "2.9.0" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.0.1" + "@walletconnect/sign-client" "2.9.0" + "@walletconnect/types" "2.9.0" + "@walletconnect/utils" "2.9.0" + +"@walletconnect/window-getters@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== dependencies: - "@walletconnect/window-getters" "^1.0.0" + tslib "1.14.1" + +"@walletconnect/window-metadata@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== + dependencies: + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" "@waves/bignumber@^1.1.1": version "1.1.1" @@ -2624,7 +2784,7 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== -aes-js@3.1.2, aes-js@^3.1.2: +aes-js@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== @@ -2967,6 +3127,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -3236,7 +3401,7 @@ bech32@^1.1.2: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -big-integer@1.6.x: +big-integer@1.6.x, big-integer@^1.6.51: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== @@ -4586,6 +4751,11 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== +decode-uri-component@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + decompress-response@^3.2.0, decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -4718,15 +4888,10 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-browser@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.1.0.tgz#0c51c66b747ad8f98a6832bf3026a5a23a7850ff" - integrity sha512-WKa9p+/MNwmTiS+V2AS6eGxic+807qvnV3hC+4z2GTY+F42h1n8AynVTMMc4EJBC32qMs6yjOTpeDEQQt/AVqQ== - -detect-browser@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" - integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== +detect-browser@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== detect-newline@^2.1.0: version "2.1.0" @@ -4852,6 +5017,16 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== +duplexify@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -4973,14 +5148,6 @@ enc-utils@2.1.0: is-typedarray "1.0.0" typedarray-to-buffer "3.1.5" -enc-utils@3.0.0, enc-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/enc-utils/-/enc-utils-3.0.0.tgz#65935d2d6a867fa0ae995f05f3a2f055ce764dcf" - integrity sha512-e57t/Z2HzWOLwOp7DZcV0VMEY8t7ptWwsxyp6kM2b2zrk6JqIpXxzkruHAMiBsy5wg9jp/183GdiRXCvBtzsYg== - dependencies: - is-typedarray "1.0.0" - typedarray-to-buffer "3.1.5" - encode-utf8@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" @@ -4998,7 +5165,7 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5715,7 +5882,7 @@ events@1.1.1, events@^1.0.2, events@^1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== -events@^3.0.0: +events@^3.0.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -5967,6 +6134,16 @@ fast-luhn@^1.0.4: resolved "https://registry.yarnpkg.com/fast-luhn/-/fast-luhn-1.1.1.tgz#c99bc1ce057aee16e68f5552c2d65800eda580be" integrity sha512-omf2rT+fZMiaBXpyvOvBEYaoi/s+gdE/hrBGcKEraQIpD7AVTN+ZOaJgabPBJHRWzonjVABelF7KvI+7cij+mg== +fast-redact@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.2.0.tgz#b1e2d39bc731376d28bde844454fa23e26919987" + integrity sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw== + +fast-text-encoding@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" + integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -7356,6 +7533,14 @@ isomorphic-fetch@^2.1.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +isomorphic-unfetch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" @@ -8330,7 +8515,7 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== -lodash.isequal@^4.5.0: +lodash.isequal@4.5.0, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== @@ -9352,6 +9537,11 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -9716,6 +9906,11 @@ octal@^1.0.0: resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" integrity sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ== +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -10145,6 +10340,36 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + pirates@^4.0.1, pirates@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -10250,6 +10475,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + process@^0.11.10, process@^0.11.9, process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -10441,12 +10671,13 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -query-string@6.13.5: - version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" - integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== +query-string@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: - decode-uri-component "^0.2.0" + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" @@ -10489,6 +10720,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + randombytes@2.1.0, randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -11315,6 +11551,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -11334,6 +11579,11 @@ readable-stream@~1.0.26, readable-stream@~1.0.26-4: isarray "0.0.1" string_decoder "~0.10.x" +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" @@ -11792,10 +12042,10 @@ safe-event-emitter@^1.0.1: dependencies: events "^3.0.0" -safe-json-utils@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.0.0.tgz#8b1d68b13cff2ac6a5b68e6c9651cf7f8bb56d9b" - integrity sha512-n0hJm6BgX8wk3G+AS8MOQnfcA8dfE6ZMUfwkHUNx69YxPlU3HDaZTHXWto35Z+C4mOjK1odlT95WutkGC+0Idw== +safe-json-utils@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" + integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== safe-regex@^1.1.0: version "1.1.0" @@ -11804,6 +12054,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -12206,6 +12461,13 @@ sodium-native@^2.3.0: nan "^2.14.0" node-gyp-build "^4.1.0" +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -12288,6 +12550,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -12453,6 +12720,11 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -12789,6 +13061,13 @@ thor-devkit@^1.3.1: ws "^6.0.0" xhr2 "0.1.4" +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + throat@^4.0.0, throat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -12956,7 +13235,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -13080,6 +13359,13 @@ uglify-es@^3.1.9: commander "~2.13.0" source-map "~0.6.1" +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" @@ -13105,6 +13391,11 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -13829,23 +14120,6 @@ wif@^2.0.1, wif@^2.0.6: dependencies: bs58check "<3.0.0" -window-getters@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/window-getters/-/window-getters-1.0.0.tgz#b5b264538c4c79cead027f9997850222bf6d0852" - integrity sha512-xyvEFq3x+7dCA7NFhqOmTMk0fPmmAzCUYL2svkw2LGBaXXQLRP0lFnfXHzysri9WZNMkzp/FD1u0w2Qc7Co+JA== - -window-getters@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/window-getters/-/window-getters-1.0.1.tgz#a564c258413b4808789633d8bfb7ed741d798aa0" - integrity sha512-cojBfDeV58XEurDgj+rre15c7dvu27bWCPlOIpwQgreOsw6qQk0UGDR1hi7ZHKw5+L0AENUNNWGG2h4yr2Y3hQ== - -window-metadata@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/window-metadata/-/window-metadata-1.0.0.tgz#fece0446db2f50be0612a211f25fc693917e823b" - integrity sha512-eYoXsZ9X4J+6xZgbHhNAatSR5bCtT409q8B+2Ol9ySx7qsdtgVZcNfox4qszFmKlGsFtT2b1Tcmcy69bRMObcg== - dependencies: - window-getters "^1.0.0" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -13921,11 +14195,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - ws@^1.1.0, ws@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" @@ -13957,7 +14226,7 @@ ws@^6.0.0: dependencies: async-limiter "~1.0.0" -ws@^7.2.0, ws@^7.4.5: +ws@^7.2.0, ws@^7.4.5, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -14274,4 +14543,4 @@ yauzl@^2.10.0: integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" \ No newline at end of file + fd-slicer "~1.1.0"