diff --git a/package.json b/package.json index 2e91bfcc9..f2543dc21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paliwallet", - "version": "3.2.2", + "version": "3.2.3", "description": "A Non-Custodial Crypto Wallet", "private": true, "repository": { @@ -52,7 +52,7 @@ "@headlessui/react": "^1.6.0", "@heroicons/react": "^1.0.5", "@pollum-io/sysweb3-core": "^1.0.27", - "@pollum-io/sysweb3-keyring": "^1.0.486", + "@pollum-io/sysweb3-keyring": "^1.0.487", "@pollum-io/sysweb3-network": "^1.0.95", "@pollum-io/sysweb3-utils": "^1.1.235", "@reduxjs/toolkit": "^1.4.0", diff --git a/source/config/consts.js b/source/config/consts.js index 44880856a..368b40575 100644 --- a/source/config/consts.js +++ b/source/config/consts.js @@ -74,7 +74,7 @@ const MV2_OPTIONS = { const MV3_OPTIONS = { manifest_version: 3, name: 'Pali Wallet', - version: '3.2.2', + version: '3.2.3', icons: { 16: 'assets/icons/favicon-16.png', 32: 'assets/icons/favicon-32.png', diff --git a/source/scripts/Background/controllers/DAppController.ts b/source/scripts/Background/controllers/DAppController.ts index 910cae5b2..c8cd578ce 100644 --- a/source/scripts/Background/controllers/DAppController.ts +++ b/source/scripts/Background/controllers/DAppController.ts @@ -14,7 +14,6 @@ interface IDappsSession { [host: string]: { activeAddress: string | null; hasWindow: boolean; - port: chrome.runtime.Port; }; } @@ -31,29 +30,46 @@ const DAppController = (): IDAppController => { return !!dapps?.[host]; }; - const setup = (port: chrome.runtime.Port) => { + const setup = (sender: chrome.runtime.MessageSender) => { const { isBitcoinBased } = store.getState().vault; - const { host } = new URL(port.sender.url); + const { host } = new URL(sender.url); const activeAccount = isBitcoinBased ? getAccount(host)?.xpub : getAccount(host)?.address; _dapps[host] = { activeAddress: activeAccount ? activeAccount : null, hasWindow: false, - port, }; - port.onMessage.addListener(onMessage); + chrome.runtime.onMessage.addListener(onMessage); // port.onDisconnect.addListener(onDisconnect); //TODO: make contentScript unavailable to Dapp on disconnection of port }; const connect = (dapp: IDApp, isDappConnected = false) => { !isDappConnected && store.dispatch(addDApp(dapp)); const { accounts, isBitcoinBased } = store.getState().vault; - _dapps[dapp.host] = { activeAddress: '', hasWindow: false, port: null }; + _dapps[dapp.host] = { activeAddress: '', hasWindow: false }; _dapps[dapp.host].activeAddress = isBitcoinBased ? accounts[dapp.accountType][dapp.accountId].xpub : accounts[dapp.accountType][dapp.accountId].address; + + isBitcoinBased + ? _dispatchPaliEvent( + dapp.host, + { + method: PaliSyscoinEvents.xpubChanged, + params: accounts[dapp.accountType][dapp.accountId].xpub, + }, + PaliSyscoinEvents.xpubChanged + ) + : _dispatchPaliEvent( + dapp.host, + { + method: PaliEvents.accountsChanged, + params: [_dapps[dapp.host].activeAddress], + }, + PaliEvents.accountsChanged + ); }; const requestPermissions = ( @@ -221,8 +237,22 @@ const DAppController = (): IDAppController => { data?: { method: string; params: any }, id = 'notification' ) => { - if (_dapps[host] && _dapps[host].port) { - _dapps[host].port.postMessage({ id, data }); + const tabs = await chrome.tabs.query({ url: `*://${host}/*` }); + + if (tabs.length) { + tabs.forEach((tab) => { + chrome.scripting.executeScript({ + target: { tabId: tab.id }, + world: 'MAIN', + func: (eventData) => { + const event = new CustomEvent('paliNotification', { + detail: JSON.stringify(eventData), + }); + window.dispatchEvent(event); + }, + args: [{ id, data }], + }); + }); } }; diff --git a/source/scripts/Background/controllers/message-handler/index.ts b/source/scripts/Background/controllers/message-handler/index.ts index 372f57ac8..a1e41fbf9 100644 --- a/source/scripts/Background/controllers/message-handler/index.ts +++ b/source/scripts/Background/controllers/message-handler/index.ts @@ -13,7 +13,7 @@ import { Message } from './types'; * - Enable/disable requests * - Requests for Sys and Eth providers methods */ -const _messageHandler = async (host: string, message: Message) => { +const _messageHandler = (host: string, message: Message) => { if (chrome.runtime.lastError) { throw new Error('Runtime last error'); } @@ -41,16 +41,22 @@ const _messageHandler = async (host: string, message: Message) => { * Receives and reply messages */ export const onMessage = async ( - message: Message, - port: chrome.runtime.Port + message: any, + sender: chrome.runtime.MessageSender ) => { - const { host } = new URL(port.sender.url); + const { host } = new URL(sender.url); + try { const response = await _messageHandler(host, message); if (response === undefined) return; - port.postMessage({ id: message.id, data: response }); + await chrome.tabs.sendMessage(sender.tab.id, { + id: message.id, + data: response, + }); } catch (error: any) { - console.error(error); - port.postMessage({ id: message.id, data: { error: error } }); //This was altered for better ethereum compatibility TODO: check on syscoin contentScript side + await chrome.tabs.sendMessage(sender.tab.id, { + id: message.id, + data: { error: error }, + }); //This was altered for better ethereum compatibility TODO: check on syscoin contentScript side } }; diff --git a/source/scripts/Background/controllers/message-handler/popup-promise.ts b/source/scripts/Background/controllers/message-handler/popup-promise.ts index cafc3d89b..2ad448782 100644 --- a/source/scripts/Background/controllers/message-handler/popup-promise.ts +++ b/source/scripts/Background/controllers/message-handler/popup-promise.ts @@ -1,8 +1,102 @@ import { ethErrors } from 'helpers/errors'; +import { + ICustomEvent, + IDAppController, + PaliRoutes, +} from '../../../../types/index'; // need to use this relative import [avoid terminal error] import { getController } from 'scripts/Background'; import cleanErrorStack from 'utils/cleanErrorStack'; +const TX_ROUTES = [ + PaliRoutes.SendEthTX, + PaliRoutes.SendApprove, + PaliRoutes.SendNTokenTX, +] as const; + +const CHAIN_ROUTES = [ + PaliRoutes.SwitchEthChain, + PaliRoutes.AddEthChain, + PaliRoutes.SwitchUtxo, +] as const; + +const REJECTION_ROUTES = new Set([ + PaliRoutes.SendEthTX, + PaliRoutes.SendApprove, + PaliRoutes.EthSign, + PaliRoutes.EncryptKey, + PaliRoutes.SwitchEthChain, + PaliRoutes.AddEthChain, + PaliRoutes.ChangeAccount, + PaliRoutes.SwitchUtxo, + PaliRoutes.WatchAsset, + PaliRoutes.SwitchNetwork, +]); + +const handleResponseEvent = async ( + event: ICustomEvent, + eventName: string, + host: string, + route: PaliRoutes, + dapp: Readonly, + resolve: (value: unknown) => void +): Promise => { + const expectedEventName = `${eventName}.${host}`; + + if (event.data.eventName !== expectedEventName) { + return; + } + + if (CHAIN_ROUTES.includes(route as (typeof CHAIN_ROUTES)[number])) { + dapp.setHasWindow(host, false); + resolve(null); + return; + } + + if (!event.data.detail) { + return; + } + + try { + const parsedDetail = JSON.parse(event.data.detail); + + if (TX_ROUTES.includes(route as (typeof TX_ROUTES)[number])) { + resolve(parsedDetail.hash); + return; + } + + resolve(parsedDetail); + } catch (error) { + console.error('Error parsing event detail:', error); + throw new Error('Failed to parse event detail'); + } +}; + +const handleCloseWindow = ( + popup: any, + route: PaliRoutes, + host: string, + dapp: Readonly, + resolve: (value: unknown) => void +): void => { + const handleWindowRemoval = (windowId: number): void => { + if (windowId !== popup.id) { + return; + } + + dapp.setHasWindow(host, false); + + if (REJECTION_ROUTES.has(route)) { + resolve(cleanErrorStack(ethErrors.provider.userRejectedRequest())); + return; + } + + resolve({ success: false }); + }; + + chrome.windows.onRemoved.addListener(handleWindowRemoval); +}; + /** * Opens a popup and adds events listener to resolve a promise. * @@ -26,15 +120,7 @@ export const popupPromise = async ({ route: string; }) => { const { dapp, createPopup } = getController(); - // if ( - // eventName !== 'connect' && - // eventName !== 'wallet_switchEthereumChain' && - // eventName !== 'wallet_addEthereumChain' && - // eventName !== 'change_UTXOEVM' && - // eventName !== 'switchNetwork' && - // !dapp.isConnected(host) - // ) - // return; + if (dapp.hasWindow(host)) throw cleanErrorStack( ethErrors.provider.unauthorized('Dapp already has a open window') @@ -49,49 +135,16 @@ export const popupPromise = async ({ throw error; } return new Promise((resolve) => { - self.addEventListener('message', (event) => { - if (event.data.eventName === `${eventName}.${host}`) { - if (event.data.detail !== undefined && event.data.detail !== null) { - if ( - route === 'tx/send/ethTx' || - route === 'tx/send/approve' || - route === 'tx/send/nTokenTx' - ) { - resolve(JSON.parse(event.data.detail).hash); - } - resolve(JSON.parse(event.data.detail)); - } - if ( - route === 'switch-EthChain' || - route === 'add-EthChain' || - route === 'switch-UtxoEvm' - ) { - resolve(null); - dapp.setHasWindow(host, false); - return null; - } - } - }); - - chrome.windows.onRemoved.addListener((id) => { - if (id === popup.id) { - if ( - route === 'tx/send/ethTx' || - route === 'tx/send/approve' || - route === 'tx/ethSign' || - route === 'tx/encryptKey' || - route === 'switch-EthChain' || - route === 'add-EthChain' || - route === 'change-account' || - route === 'switch-UtxoEvm' || - route === 'watch-asset' || - route === 'switch-network' - ) { - resolve(cleanErrorStack(ethErrors.provider.userRejectedRequest())); - } - dapp.setHasWindow(host, false); - resolve({ success: false }); - } + self.addEventListener('message', (swEvent) => { + handleResponseEvent( + swEvent, + eventName, + host, + route as PaliRoutes, + dapp, + resolve + ); + handleCloseWindow(popup, route as PaliRoutes, host, dapp, resolve); }); }); }; diff --git a/source/scripts/Background/controllers/message-handler/requests.ts b/source/scripts/Background/controllers/message-handler/requests.ts index ee650c1e0..d02ca6508 100644 --- a/source/scripts/Background/controllers/message-handler/requests.ts +++ b/source/scripts/Background/controllers/message-handler/requests.ts @@ -13,6 +13,7 @@ import { areStringsPresent } from 'utils/format'; import { getNetworkChain, networkChain } from 'utils/network'; import { popupPromise } from './popup-promise'; + /** * Handles methods request. * diff --git a/source/scripts/Background/index.ts b/source/scripts/Background/index.ts index e01eb28fa..3c5c61f52 100755 --- a/source/scripts/Background/index.ts +++ b/source/scripts/Background/index.ts @@ -23,10 +23,9 @@ declare global { controller: Readonly; } } -let paliPort: chrome.runtime.Port; -let paliPopupPort: chrome.runtime.Port; -let dappMethods = {} as any; + let walletMethods = {} as any; +let dappMethods = {} as any; let MasterControllerInstance = {} as IMasterController; @@ -48,9 +47,6 @@ let MasterControllerInstance = {} as IMasterController; setInterval(utils.setFiat, 3 * 60 * 1000); - if (paliPort) { - dapp.setup(paliPort); - } utils.setFiat(); }); @@ -190,61 +186,70 @@ chrome.runtime.onMessage.addListener((message: any, _, sendResponse) => { return isEventValid; }); -chrome.runtime.onMessage.addListener(({ type, target, data }) => { - switch (type) { - case 'ping': - if (target === 'background') - paliPopupPort?.postMessage({ action: 'pong' }); - break; - case 'reset_autolock': - if (target === 'background') restartLockTimeout(); - break; - case 'lock_wallet': - handleLogout(); - break; - case 'changeNetwork': - if (walletMethods?.setActiveNetwork && data) { - walletMethods?.setActiveNetwork( - data?.network, - data?.isBitcoinBased ? 'syscoin' : 'ethereum' - ); - } - break; - case 'verifyPaliRequests': - if (target === 'background' && process.env.NODE_ENV === 'development') - verifyAllPaliRequests(); - break; - case 'resetPaliRequestsCount': - if (target === 'background' && process.env.NODE_ENV === 'development') - requestCount = 0; - break; - case 'removeVerifyPaliRequestListener': - if (target === 'background' && process.env.NODE_ENV === 'development') - chrome.webRequest.onCompleted.removeListener(requestCallback); - break; +chrome.runtime.onMessage.addListener( + ({ type, target, data, action }, sender, sendResponse) => { + const { isPolling, hasEthProperty } = store.getState().vault; + switch (type) { + case 'pw-msg-background': + if (action === 'isInjected') { + dappMethods.setup(sender); + sendResponse({ isInjected: hasEthProperty }); + } + break; + case 'reset_autolock': + if (target === 'background') restartLockTimeout(); + break; + case 'lock_wallet': + handleLogout(); + break; + case 'changeNetwork': + if (walletMethods?.setActiveNetwork && data) { + walletMethods?.setActiveNetwork( + data?.network, + data?.isBitcoinBased ? 'syscoin' : 'ethereum' + ); + } + break; + case 'verifyPaliRequests': + if (target === 'background' && process.env.NODE_ENV === 'development') + verifyAllPaliRequests(); + break; + case 'resetPaliRequestsCount': + if (target === 'background' && process.env.NODE_ENV === 'development') + requestCount = 0; + break; + case 'removeVerifyPaliRequestListener': + if (target === 'background' && process.env.NODE_ENV === 'development') + chrome.webRequest.onCompleted.removeListener(requestCallback); + break; + case 'startPolling': + if (!isPolling) { + store.dispatch(setIsPolling(true)); + startPolling(); + sendResponse({ stateIntervalId }); + } + break; + case 'stopPolling': + clearInterval(stateIntervalId); + store.dispatch(setIsPolling(false)); + break; + case 'startPendingTransactionsPolling': + store.dispatch(setIsPolling(true)); + startPendingTransactionsPolling(); + break; + case 'stopPendingTransactionsPolling': + clearInterval(pendingTransactionsPollingIntervalId); + store.dispatch(setIsPolling(false)); + break; + } } -}); +); chrome.runtime.onConnect.addListener(async (port) => { if (port.name === 'pali') { handleIsOpen(true); - paliPopupPort = port; } - if (port.name === 'pali-inject') { - port.onMessage.addListener((message) => { - if (message.action === 'isInjected') { - const { hasEthProperty } = store.getState().vault; - port.postMessage({ isInjected: hasEthProperty }); - } - }); - - if (dappMethods !== undefined) { - dappMethods.setup(port); - } - paliPort = port; - return; - } const { changingConnectedAccount, timer, isTimerEnabled } = store.getState().vault; @@ -322,7 +327,6 @@ async function checkForUpdates() { let stateIntervalId; let pendingTransactionsPollingIntervalId; -let isListenerRegistered = false; let currentState = store.getState(); let currentIsBitcoinBased = currentState.vault.isBitcoinBased; @@ -336,47 +340,6 @@ function startPolling() { stateIntervalId = setInterval(checkForUpdates, getPollingInterval()); } -function unregisterListener() { - chrome.runtime.onConnect.removeListener(handleConnect); - isListenerRegistered = false; -} - -function handleConnect(port) { - const { isPolling } = store.getState().vault; - - if (port.name === 'polling') { - port.onMessage.addListener((message) => { - if (message.action === 'startPolling' && !isPolling) { - store.dispatch(setIsPolling(true)); - startPolling(); - port.postMessage({ stateIntervalId }); - } else if (message.action === 'stopPolling') { - clearInterval(stateIntervalId); - store.dispatch(setIsPolling(false)); - } - }); - } else if (port.name === 'pendingTransactionsPolling') { - port.onMessage.addListener((message) => { - if (message.action === 'startPendingTransactionsPolling') { - store.dispatch(setIsPolling(true)); - startPendingTransactionsPolling(); - } else if (message.action === 'stopPendingTransactionsPolling') { - clearInterval(pendingTransactionsPollingIntervalId); - store.dispatch(setIsPolling(false)); - } - }); - } -} - -function registerListener() { - if (isListenerRegistered) { - return; - } - - chrome.runtime.onConnect.addListener(handleConnect); - isListenerRegistered = true; -} - function observeStateChanges() { // send initial state to popup chrome.runtime @@ -394,8 +357,6 @@ function observeStateChanges() { if (nextState.vault.isPolling) { startPolling(); } - unregisterListener(); - registerListener(); } if (JSON.stringify(currentState) !== JSON.stringify(nextState)) { @@ -463,16 +424,13 @@ async function checkForPendingTransactionsUpdate() { } } -observeStateChanges(); -registerListener(); - -const port = chrome.runtime.connect(undefined, { name: 'polling' }); -port.postMessage({ action: 'startPolling' }); +const handleStartPolling = () => { + chrome.runtime.sendMessage({ type: 'startPolling' }); +}; -const secondPort = chrome.runtime.connect(undefined, { - name: 'pendingTransactionsPolling', -}); -secondPort.postMessage({ action: 'startPendingTransactionsPolling' }); +const handlePendingTransactionsPolling = () => { + chrome.runtime.sendMessage({ type: 'startPendingTransactionsPolling' }); +}; export const verifyPaliRequests = () => { chrome.runtime.sendMessage({ @@ -547,3 +505,7 @@ const isPollingRunNotValid = () => { isNetworkChanging ); }; + +observeStateChanges(); +handleStartPolling(); +handlePendingTransactionsPolling(); diff --git a/source/scripts/ContentScript/index.ts b/source/scripts/ContentScript/index.ts index 68ff3ee24..ab18ae2fc 100755 --- a/source/scripts/ContentScript/index.ts +++ b/source/scripts/ContentScript/index.ts @@ -4,27 +4,49 @@ import { PaliEvents, PaliSyscoinEvents, } from 'scripts/Background/controllers/message-handler/types'; + const emitter = new EventEmitter(); -// Connect to pali -const backgroundPort = chrome.runtime.connect(undefined, { - name: 'pali-inject', -}); +const sendToBackground = ( + message: any, + handleResponse?: (response: any) => void +) => { + chrome.runtime.sendMessage(message, handleResponse); +}; + +const handleEthInjection = (message: any) => { + const isInjected = message?.isInjected; + + if (typeof isInjected !== 'undefined') { + if (isInjected) { + injectScriptFile('js/inpage.bundle.js', 'inpage'); + } else { + injectScriptFile('js/handleWindowProperties.bundle.js', 'removeProperty'); + } + return; + } +}; -backgroundPort.postMessage({ action: 'isInjected' }); +sendToBackground( + { action: 'isInjected', type: 'pw-msg-background' }, + handleEthInjection +); // Add listener for pali events -const checkForPaliRegisterEvent = (type, id) => { +const checkForPaliRegisterEvent = (id: any) => { emitter.once(id, (result) => { if (typeof id === 'string') { - if (String(id).includes('isUnlocked')) + if (String(id).includes('isUnlocked')) { window.dispatchEvent(new CustomEvent(id, { detail: result })); + } } - if (result) + if (result) { window.dispatchEvent( new CustomEvent(id, { detail: JSON.stringify(result) }) ); - else window.dispatchEvent(new CustomEvent(id, { detail: null })); + } else { + window.dispatchEvent(new CustomEvent(id, { detail: null })); + } }); }; @@ -43,9 +65,9 @@ const start = () => { if (!id || !type) return; // listen for the response - checkForPaliRegisterEvent(type, id); + checkForPaliRegisterEvent(id); - backgroundPort.postMessage({ + sendToBackground({ id, type, data, @@ -73,31 +95,14 @@ const startEventEmitter = () => { } }; -// Every message from pali emits an event -backgroundPort.onMessage.addListener(({ id, data }) => { - // verify if data params contains type property for remove or not window.ethereum object - switch (data?.params?.type) { - case 'pali_removeProperty': - injectScriptFile('js/handleWindowProperties.bundle.js', 'removeProperty'); - break; - case 'pali_addProperty': - injectScriptFile('js/inpage.bundle.js', 'inpage'); - break; - default: - break; - } - emitter.emit(id, data); -}); - const doctypeCheck = () => { const { doctype } = window.document; - if (doctype) { return doctype.name === 'html'; } - return true; }; + const suffixCheck = () => { const prohibitedTypes = [/\.xml$/u, /\.pdf$/u]; const currentUrl = window.location.pathname; @@ -107,39 +112,32 @@ const suffixCheck = () => { return false; } } - return true; }; const documentElementCheck = () => { const documentElement = document.documentElement.nodeName; - if (documentElement) { return documentElement.toLowerCase() === 'html'; } - return true; }; const blockedDomainCheck = () => { const blockedDomains = ['dropbox.com', 'app.clickup.com']; - const currentUrl = window.location.href; let currentRegex; for (let i = 0; i < blockedDomains.length; i++) { const blockedDomain = blockedDomains[i].replace('.', '\\.'); - currentRegex = new RegExp( `(?:https?:\\/\\/)(?:(?!${blockedDomain}).)*$`, 'u' ); - if (!currentRegex.test(currentUrl)) { return true; } } - return false; }; @@ -176,26 +174,34 @@ export const injectScriptFile = (file: string, id: string) => { console.error('Pali Wallet: Provider injection failed.', error); } }; -const startEthInjection = () => { - backgroundPort.onMessage.addListener((message) => { - const hasEthProp = message.isInjected; - switch (hasEthProp) { - case true: - injectScriptFile('js/inpage.bundle.js', 'inpage'); - break; - case false: + +// listen for messages from background +chrome.runtime.onMessage.addListener((message) => { + const { id, data } = message; + + if (data?.params?.type) { + switch (data.params.type) { + case 'pali_removeProperty': injectScriptFile( 'js/handleWindowProperties.bundle.js', 'removeProperty' ); break; + case 'pali_addProperty': + injectScriptFile('js/inpage.bundle.js', 'inpage'); + break; } - }); -}; + } + + if (id) { + emitter.emit(id, data); + } +}); + +// Initial setup if (shouldInjectProvider()) { // inject window.pali property in browser injectScriptFile('js/pali.bundle.js', 'pali'); - startEthInjection(); } start(); diff --git a/source/scripts/ContentScript/inject/pali.ts b/source/scripts/ContentScript/inject/pali.ts index 9cbb33dac..e512a3776 100644 --- a/source/scripts/ContentScript/inject/pali.ts +++ b/source/scripts/ContentScript/inject/pali.ts @@ -4,7 +4,7 @@ import { PaliInpageProviderSys } from './paliProviderSyscoin'; declare global { // eslint-disable-next-line @typescript-eslint/naming-convention interface Window { - pali: Readonly; + pali: Readonly; } } diff --git a/source/scripts/ContentScript/inject/paliProviderEthereum.ts b/source/scripts/ContentScript/inject/paliProviderEthereum.ts index f07d80aca..4d3bafd5b 100644 --- a/source/scripts/ContentScript/inject/paliProviderEthereum.ts +++ b/source/scripts/ContentScript/inject/paliProviderEthereum.ts @@ -53,6 +53,7 @@ export class PaliInpageProviderEth extends BaseProvider { }; protected _state: EthereumProviderState; public readonly isMetaMask: boolean = true; + constructor(maxEventListeners = 100, wallet = 'pali-v2') { super('ethereum', maxEventListeners, wallet); this._metamask = this._getExperimentalApi(); @@ -84,10 +85,16 @@ export class PaliInpageProviderEth extends BaseProvider { error ) ); + + this.initMessageListener(); + } + + public initMessageListener() { window.addEventListener( - 'notification', + 'paliNotification', (event: any) => { const { method, params } = JSON.parse(event.detail); + switch (method) { case 'pali_accountsChanged': this._handleAccountsChanged(params); @@ -219,6 +226,7 @@ export class PaliInpageProviderEth extends BaseProvider { } return super._rpcRequest(payload, cb); } + /** * Internal backwards compatibility method, used in send. * diff --git a/source/scripts/ContentScript/inject/paliProviderSyscoin.ts b/source/scripts/ContentScript/inject/paliProviderSyscoin.ts index b0813b904..651daf1a5 100644 --- a/source/scripts/ContentScript/inject/paliProviderSyscoin.ts +++ b/source/scripts/ContentScript/inject/paliProviderSyscoin.ts @@ -51,6 +51,7 @@ export class PaliInpageProviderSys extends BaseProvider { const initialState = state as Parameters< PaliInpageProviderSys['_initializeState'] >[0]; + this._initializeState(initialState); }) .catch((error) => @@ -59,11 +60,19 @@ export class PaliInpageProviderSys extends BaseProvider { error ) ); + + this.initMessageListener(); + } + + public initMessageListener() { window.addEventListener( - 'notification', + 'paliNotification', (event: any) => { - const { method, params } = JSON.parse(event.detail); + const { data } = JSON.parse(event.detail); + + const { method, params } = data; this.emit('walletUpdate'); + switch (method) { case 'pali_xpubChanged': this._handleConnectedXpub(params); @@ -99,9 +108,7 @@ export class PaliInpageProviderSys extends BaseProvider { ); } }, - { - passive: true, - } + { passive: true } ); } diff --git a/source/scripts/Provider/EthProvider.ts b/source/scripts/Provider/EthProvider.ts index 0bb6bcaff..96fd518ff 100644 --- a/source/scripts/Provider/EthProvider.ts +++ b/source/scripts/Provider/EthProvider.ts @@ -207,12 +207,6 @@ export const EthProvider = (host: string, network?: INetwork) => { method, params ); - console.log({ - method, - params, - ethWeb3Provider: ethereumTransaction.web3Provider, - requestResult, - }); return requestResult; } catch (error) { console.log({ requestError: error, method, params }); diff --git a/source/types/controllers.ts b/source/types/controllers.ts index be0e1c18a..1a1fd54ab 100644 --- a/source/types/controllers.ts +++ b/source/types/controllers.ts @@ -334,5 +334,28 @@ export interface IDAppController { /** * Setup communication */ - setup: (port: chrome.runtime.Port) => void; + setup: (sender: chrome.runtime.MessageSender) => void; +} + +export enum PaliRoutes { + AddEthChain = 'add-EthChain', + ChangeAccount = 'change-account', + EncryptKey = 'tx/encryptKey', + EthSign = 'tx/ethSign', + SendApprove = 'tx/send/approve', + SendEthTX = 'tx/send/ethTx', + SendNTokenTX = 'tx/send/nTokenTx', + SwitchEthChain = 'switch-EthChain', + SwitchNetwork = 'switch-network', + SwitchUtxo = 'switch-UtxoEvm', + WatchAsset = 'watch-asset', +} + +export interface IEventData { + detail?: string; + eventName: string; +} + +export interface ICustomEvent { + data: IEventData; } diff --git a/source/types/index.ts b/source/types/index.ts new file mode 100644 index 000000000..afe295db8 --- /dev/null +++ b/source/types/index.ts @@ -0,0 +1,4 @@ +export * from './controllers'; +export * from './transactions'; +export * from './faucet'; +export * from './tokens'; diff --git a/yarn.lock b/yarn.lock index 1c99a199f..aca32d21f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2379,10 +2379,10 @@ resolved "https://registry.yarnpkg.com/@pollum-io/sysweb3-core/-/sysweb3-core-1.0.27.tgz#2ecbf38c3b5f6821ec2bcc95472eed0a2f11cd10" integrity sha512-HHW2ozdXCac2Xo0oUQgRk/sczBIGQCBvsqYBIwondipA3Rx4/jGC6Y9U/M4wpTi5wQ+ZD18DyEbKAVMXElGcbQ== -"@pollum-io/sysweb3-keyring@^1.0.486": - version "1.0.486" - resolved "https://registry.yarnpkg.com/@pollum-io/sysweb3-keyring/-/sysweb3-keyring-1.0.486.tgz#199b75b917a3cecf5e536c49999646898bec3ba1" - integrity sha512-vZpZ7PllQT2KAbL1I75mJH8rZlCjMJi5jA/1/Gi3urSIP/JLCqhx4jQ7iVK/rkuNU0ceCT0ZT/JAmVFBHzavgQ== +"@pollum-io/sysweb3-keyring@^1.0.487": + version "1.0.487" + resolved "https://registry.yarnpkg.com/@pollum-io/sysweb3-keyring/-/sysweb3-keyring-1.0.487.tgz#832ec8809ede161db883930ee9c54eb9aace392f" + integrity sha512-oBrRnJPWYwv0IcRRLheYk1+rvNIl8lCKkoW2Z+Nw7UadFOPwXsSsrzbByjc7rHKkVKM39a+iD63mZt1f/pSUQg== dependencies: "@bitcoinerlab/descriptors" "^2.0.1" "@bitcoinerlab/secp256k1" "^1.0.5" @@ -13422,16 +13422,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13509,7 +13500,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -13523,13 +13514,6 @@ strip-ansi@^3.0.0: dependencies: ansi-regex "^2.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -15046,7 +15030,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -15064,15 +15048,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"