-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathbackground.js.map
1 lines (1 loc) · 21.3 KB
/
background.js.map
1
{"version":3,"file":"background.js","mappings":";;;;;;;;;;;;;;;;AAAmC;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,YAAY,iCAAiC;AAC7C,YAAY;AACZ;AACA;AACA;AACA,iBAAiB,0CAAI;AACrB,IAAI,0CAAI;AACR;;;;;;;;;;;;;;;;;;;;;ACvBsC;AACW;AACb;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gDAAI;AACtB;AACA;AACA;AACA,kBAAkB,yCAAyC;AAC3D,yCAAyC,OAAO;AAChD;AACA,UAAU;AACV,0BAA0B,wCAAwC;AAClE;AACA;AACA;AACA,uBAAuB,2DAAkB;AACzC,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,0BAA0B,6CAA6C;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,0BAA0B,6CAA6C;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,0BAA0B,8CAA8C;AACxE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,0BAA0B,oCAAoC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,wCAAM;AAC7B,UAAU;AACV,0BAA0B,2CAA2C;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,0BAA0B,0CAA0C;AACpE;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;;;;;AC9HA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;;;;;ACAA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;;;ACNwB;AACJ;AACE;AACQ;AAC9B;AACsC;AACtC;AACkF;AAClF;AAC+D;AACV;AACrD;AACA;AACA;AACA;AACA;AACA,mBAAmB,mDAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gDAAS;AACxB,KAAK;AACL;AACA,GAAG;AACH;AACA,qBAAqB,8CAAO;AAC5B;AACA;AACA,MAAM,IAAsC;AAC5C;AACA,IAAI,KAAK,EAEN;AACH;AACA,iBAAiB,wDAAc;AAC/B;AACA;AACA,GAAG;AACH;AACA,EAAE,4EAAmB;AACrB;AACA;AACA;AACA;AACA,aAAa;AACb,GAAG;AACH;AACA,aAAa,0CAAI,CAAC,gDAAS;AAC3B,sBAAsB,0CAAI;AAC1B;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,QAAQ,yCAAG;AACX,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,6CAAO;AACT,YAAY,MAAM;AAClB;AACA;AACA;AACA;AACA,kCAAkC;AAClC,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gDAAI;AACzB,MAAM;AACN,oBAAoB,uCAAuC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,0CAA0C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4BAA4B;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,OAAO;AAC3B;AACA;AACA,2CAA2C,QAAQ;AACnD;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE,6CAAO;AACT;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE,6CAAO;AACT,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE,6CAAO;AACT,YAAY,mBAAmB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,qBAAqB,UAAU;AAC/B,gBAAgB,KAAK;AACrB,eAAe,KAAK;AACpB,oBAAoB,UAAU;AAC9B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,eAAe,KAAK;AACpB,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA,mCAAmC,eAAe;AAClD,MAAM;AACN,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE,6CAAO;AACT,YAAY,6CAA6C;AACzD;AACA;AACA;AACA,uBAAuB,kEAAgB;AACvC,MAAM;AACN,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,6CAAO;AACT;AACA,4BAA4B,gDAAO;AACnC;AACA;AACA;AACA,uCAAuC,gDAAO;AAC9C;AACA,OAAO;AACP;AACA;AACA,QAAQ,2CAAK;AACb,QAAQ;AACR,kEAAkE,OAAO;AACzE;AACA,MAAM;AACN,2CAA2C,YAAY;AACvD;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,yCAAG;AACH;AACA,kBAAkB,kDAAW;AAC7B;AACA;AACA,qBAAqB,yCAAG;AACxB;AACA;AACA,IAAI,yCAAG;AACP;AACA;AACA,EAAE,yCAAG;AACL;AACA,GAAG;AACH,EAAE;AACF,EAAE,yCAAG;AACL;AACA,GAAG;AACH;AACA,EAAE,yCAAG;AACL;AACA,MAAM,yCAAG;AACT;AACA,GAAG;AACH;AACA,EAAE,yCAAG;AACL;AACA;AACA;AACA,GAAG;AACH","sources":["webpack://bitshares_astro_ui/./src/lib/applicationMenu.js","webpack://bitshares_astro_ui/./src/lib/deeplink.js","webpack://bitshares_astro_ui/external commonjs \"bitsharesjs\"","webpack://bitshares_astro_ui/external commonjs \"bitsharesjs-ws\"","webpack://bitshares_astro_ui/external commonjs \"electron\"","webpack://bitshares_astro_ui/external commonjs \"express\"","webpack://bitshares_astro_ui/external commonjs \"uuid\"","webpack://bitshares_astro_ui/external node-commonjs \"os\"","webpack://bitshares_astro_ui/external node-commonjs \"path\"","webpack://bitshares_astro_ui/external node-commonjs \"url\"","webpack://bitshares_astro_ui/webpack/bootstrap","webpack://bitshares_astro_ui/webpack/runtime/compat get default export","webpack://bitshares_astro_ui/webpack/runtime/define property getters","webpack://bitshares_astro_ui/webpack/runtime/hasOwnProperty shorthand","webpack://bitshares_astro_ui/webpack/runtime/make namespace object","webpack://bitshares_astro_ui/./src/background.js"],"sourcesContent":["import {app, Menu} from 'electron';\r\n\r\n/**\r\n * For configuring the electron window menu\r\n */\r\nexport function initApplicationMenu(mainWindow) {\r\n const template = [\r\n {\r\n label: 'View',\r\n submenu: [\r\n {\r\n label: 'Send to tray',\r\n click() {\r\n mainWindow.minimize();\r\n }\r\n },\r\n { label: 'Reload', role: 'reload' },\r\n { label: 'Dev tools', role: 'toggleDevTools' }\r\n ]\r\n }\r\n ];\r\n const menu = Menu.buildFromTemplate(template);\r\n Menu.setApplicationMenu(menu);\r\n}\r\n","import { Apis } from \"bitsharesjs-ws\";\r\nimport { TransactionBuilder } from \"bitsharesjs\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nconst chains = {\r\n bitshares: {\r\n nodeList: [\r\n {\r\n url: \"wss://node.xbts.io/ws\",\r\n },\r\n {\r\n url: \"wss://api.bts.mobi/ws\",\r\n },\r\n {\r\n url: \"wss://api.bitshares.bhuz.info/ws\",\r\n },\r\n {\r\n url: \"wss://btsws.roelandp.nl/ws\",\r\n },\r\n ],\r\n },\r\n bitshares_testnet: {\r\n nodeList: [\r\n {\r\n url: \"wss://testnet.dex.trading/\",\r\n },\r\n {\r\n url: \"wss://testnet.xbts.io/ws\",\r\n },\r\n {\r\n url: \"wss://api-testnet.61bts.com/ws\",\r\n },\r\n ],\r\n },\r\n};\r\n\r\nasync function generateDeepLink(chain, nodeURL, opTypes, operations) {\r\n return new Promise(async (resolve, reject) => {\r\n const _node = nodeURL && nodeURL.length\r\n ? nodeURL\r\n : chains[chain].nodeList[0].url;\r\n\r\n try {\r\n await Apis.instance(\r\n _node,\r\n true,\r\n 4000,\r\n { enableCrypto: false, enableOrders: true },\r\n (error) => console.log({ error })\r\n ).init_promise;\r\n } catch (error) {\r\n console.log({ error, location: \"api instance failed\" });\r\n return reject(error);\r\n }\r\n\r\n const tr = new TransactionBuilder();\r\n for (let i = 0; i < operations.length; i++) {\r\n tr.add_type_operation(opTypes[i], operations[i]);\r\n }\r\n\r\n try {\r\n await tr.update_head_block();\r\n } catch (error) {\r\n console.log({ error, location: \"update head block failed\" });\r\n reject(error);\r\n return;\r\n }\r\n\r\n try {\r\n await tr.set_required_fees();\r\n } catch (error) {\r\n console.log({ error, location: \"set required fees failed\" });\r\n reject(error);\r\n return;\r\n }\r\n\r\n try {\r\n tr.set_expire_seconds(7200);\r\n } catch (error) {\r\n console.log({ error, location: \"set expire seconds failed\" });\r\n reject(error);\r\n return;\r\n }\r\n\r\n try {\r\n tr.finalize();\r\n } catch (error) {\r\n console.log({ error, location: \"finalize failed\" });\r\n reject(error);\r\n return;\r\n }\r\n\r\n let id;\r\n try {\r\n id = await uuidv4();\r\n } catch (error) {\r\n console.log({ error, location: \"uuid generation failed\" });\r\n reject(error);\r\n return;\r\n }\r\n\r\n const request = {\r\n type: \"api\",\r\n id: id,\r\n payload: {\r\n method: \"injectedCall\",\r\n params: [\"signAndBroadcast\", JSON.stringify(tr.toObject()), []],\r\n appName: \"Bitshares Astro UI\",\r\n chain: chain === \"bitshares\" ? \"BTS\" : \"BTS_TEST\",\r\n browser: \"web browser\",\r\n origin: \"localhost\",\r\n },\r\n };\r\n\r\n let encodedPayload;\r\n try {\r\n encodedPayload = encodeURIComponent(JSON.stringify(request));\r\n } catch (error) {\r\n console.log({ error, location: \"encode payload failed\" });\r\n reject(error);\r\n return;\r\n }\r\n\r\n resolve(encodedPayload);\r\n });\r\n}\r\n\r\nexport { generateDeepLink };","module.exports = require(\"bitsharesjs\");","module.exports = require(\"bitsharesjs-ws\");","module.exports = require(\"electron\");","module.exports = require(\"express\");","module.exports = require(\"uuid\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"url\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import path from \"path\";\r\nimport os from \"os\";\r\nimport url from \"url\";\r\nimport express from \"express\";\r\n\r\nimport { Apis } from \"bitsharesjs-ws\";\r\n\r\nimport { app, BrowserWindow, Menu, Tray, ipcMain, screen, shell } from \"electron\";\r\n\r\nimport { initApplicationMenu } from \"./lib/applicationMenu.js\";\r\nimport { generateDeepLink } from \"./lib/deeplink.js\";\r\n\r\nlet mainWindow = null;\r\nlet tray = null;\r\n\r\nconst createWindow = async () => {\r\n mainWindow = new BrowserWindow({\r\n minWidth: 480,\r\n minHeight: 695,\r\n maximizable: true,\r\n useContentSize: true,\r\n autoHideMenuBar: true,\r\n webPreferences: {\r\n nodeIntegration: false,\r\n contextIsolation: true,\r\n sandbox: true,\r\n preload: path.join(__dirname, \"preload.js\"),\r\n },\r\n icon: __dirname + \"/img/taskbar.png\",\r\n });\r\n\r\n const expressApp = express();\r\n\r\n let astroDistPath;\r\n if (process.env.NODE_ENV === \"development\") {\r\n astroDistPath = \"astroDist\";\r\n } else {\r\n astroDistPath = path.join(process.resourcesPath, \"astroDist\");\r\n }\r\n\r\n expressApp.use(express.static(astroDistPath));\r\n expressApp.listen(8080, () => {\r\n console.log(\"Express server listening on port 8080\");\r\n });\r\n\r\n initApplicationMenu(mainWindow);\r\n\r\n mainWindow.loadURL(\"http://localhost:8080/index.html\");\r\n\r\n mainWindow.webContents.setWindowOpenHandler(() => {\r\n return { action: \"deny\" };\r\n });\r\n\r\n tray = new Tray(path.join(__dirname, \"img\", \"tray.png\"));\r\n const contextMenu = Menu.buildFromTemplate([\r\n {\r\n label: \"Show App\",\r\n click: function () {\r\n mainWindow?.show();\r\n },\r\n },\r\n {\r\n label: \"Quit\",\r\n click: function () {\r\n tray = null;\r\n app.quit();\r\n },\r\n },\r\n ]);\r\n\r\n tray.setToolTip(\"Bitshares Astro UI\");\r\n\r\n tray.on(\"right-click\", (event, bounds) => {\r\n tray?.popUpContextMenu(contextMenu);\r\n });\r\n\r\n let continueFetching = false;\r\n let latestBlockNumber = 0;\r\n let isFetching = false;\r\n let apisInstance = null;\r\n let fetchTimeout = null;\r\n\r\n const fetchBlocks = async () => {\r\n isFetching = true;\r\n while (continueFetching) {\r\n let currentBlock;\r\n try {\r\n currentBlock = await apisInstance.db_api().exec(\"get_block\", [latestBlockNumber]);\r\n } catch (error) {\r\n console.log({ error });\r\n continueFetching = false;\r\n isFetching = false;\r\n break;\r\n }\r\n mainWindow.webContents.send(\"blockResponse\", {\r\n ...currentBlock,\r\n block: latestBlockNumber,\r\n });\r\n latestBlockNumber += 1;\r\n\r\n await new Promise((resolve) => {\r\n fetchTimeout = setTimeout(resolve, 4200);\r\n });\r\n }\r\n\r\n if (!continueFetching) {\r\n apisInstance.close();\r\n apisInstance = null;\r\n }\r\n isFetching = false;\r\n };\r\n\r\n ipcMain.on(\"requestBlocks\", async (event, arg) => {\r\n const { url } = arg;\r\n\r\n // Stop any ongoing fetching process\r\n if (isFetching) {\r\n continueFetching = false;\r\n clearTimeout(fetchTimeout); // Clear the timeout to stop the current fetching process immediately\r\n await new Promise((resolve) => setTimeout(resolve, 100)); // Short wait to ensure the current fetching process stops\r\n }\r\n\r\n // Reset state variables\r\n continueFetching = true;\r\n isFetching = false;\r\n\r\n // Create a new Apis instance\r\n try {\r\n apisInstance = Apis.instance(url, true);\r\n } catch (error) {\r\n console.log({ error, location: \"Apis.instance\", url });\r\n continueFetching = false;\r\n isFetching = false;\r\n return;\r\n }\r\n\r\n try {\r\n await apisInstance.init_promise;\r\n console.log(\"connected to:\", apisInstance.chain_id);\r\n } catch (err) {\r\n console.log({ err });\r\n continueFetching = false;\r\n isFetching = false;\r\n if (apisInstance) {\r\n apisInstance.close();\r\n apisInstance = null;\r\n }\r\n return;\r\n }\r\n\r\n let globalProperties;\r\n try {\r\n globalProperties = await apisInstance.db_api().exec(\"get_dynamic_global_properties\", []);\r\n } catch (error) {\r\n console.log({ error, location: \"globalProperties\", url });\r\n continueFetching = false;\r\n isFetching = false;\r\n return;\r\n }\r\n\r\n latestBlockNumber = globalProperties.head_block_number;\r\n\r\n const blockPromises = [];\r\n for (let i = latestBlockNumber - 1; i > latestBlockNumber - 31; i--) {\r\n blockPromises.push(apisInstance.db_api().exec(\"get_block\", [i]));\r\n }\r\n\r\n let lastFewBlocks = [];\r\n try {\r\n lastFewBlocks = await Promise.all(blockPromises);\r\n } catch (error) {\r\n console.log({ error });\r\n }\r\n\r\n for (let i = lastFewBlocks.length - 1; i >= 0; i--) {\r\n mainWindow.webContents.send(\"blockResponse\", {\r\n ...lastFewBlocks[i],\r\n block: latestBlockNumber - 1 - i,\r\n });\r\n }\r\n\r\n // Start fetching blocks continuously\r\n fetchBlocks();\r\n });\r\n\r\n // Handle the user navigating away from the page\r\n ipcMain.on(\"stopBlocks\", () => {\r\n continueFetching = false;\r\n clearTimeout(fetchTimeout); // Clear the timeout to stop the current fetching process immediately\r\n if (apisInstance) {\r\n apisInstance.close();\r\n apisInstance = null;\r\n }\r\n isFetching = false;\r\n });\r\n\r\n ipcMain.handle(\"fetchTopMarkets\", async (event, arg) => {\r\n const { chain } = arg;\r\n\r\n let retrievedData;\r\n try {\r\n retrievedData = await fetch(\r\n chain === \"bitshares\"\r\n ? `https://api.bitshares.ws/openexplorer/top_markets?top_n=100`\r\n : `https://api.testnet.bitshares.ws/openexplorer/top_markets?top_n=50`\r\n );\r\n } catch (error) {\r\n console.log({ error });\r\n }\r\n\r\n if (!retrievedData || !retrievedData.ok) {\r\n console.log(\"Failed to fetch top markets\");\r\n return;\r\n }\r\n\r\n const topMarkets = await retrievedData.json();\r\n return topMarkets ?? null;\r\n });\r\n\r\n ipcMain.handle(\"fetchAccountHistory\", async (event, arg) => {\r\n const { chain, accountID } = arg;\r\n\r\n const from = arg.from ?? 0;\r\n const size = arg.size ?? 100;\r\n const from_date = arg.from_date ?? \"2015-10-10\";\r\n const to_date = arg.to_date ?? \"now\";\r\n const sort_by = arg.sort_by ?? \"-operation_id_num\";\r\n const type = arg.type ?? \"data\";\r\n const agg_field = arg.agg_field ?? \"operation_type\";\r\n\r\n const url =\r\n `https://${\r\n chain === \"bitshares\" ? \"api\" : \"api.testnet\"\r\n }.bitshares.ws/openexplorer/es/account_history` +\r\n `?account_id=${accountID}` +\r\n `&from_=${from}` +\r\n `&size=${size}` +\r\n `&from_date=${from_date}` +\r\n `&to_date=${to_date}` +\r\n `&sort_by=${sort_by}` +\r\n `&type=${type}` +\r\n `&agg_field=${agg_field}`;\r\n\r\n let history;\r\n try {\r\n history = await fetch(url, { method: \"GET\" });\r\n } catch (error) {\r\n console.log({ error });\r\n return null;\r\n }\r\n\r\n if (!history || !history.ok) {\r\n console.log(\"Couldn't fetch account history.\");\r\n return null;\r\n }\r\n\r\n const accountHistory = await history.json();\r\n return accountHistory ?? null;\r\n });\r\n\r\n ipcMain.handle(\"generateDeepLink\", async (event, arg) => {\r\n const { usrChain, nodeURL, operationNames, trxJSON } = arg;\r\n\r\n let deeplink;\r\n try {\r\n deeplink = await generateDeepLink(usrChain, nodeURL, operationNames, trxJSON);\r\n } catch (error) {\r\n console.log({ error });\r\n }\r\n\r\n return deeplink ?? null;\r\n });\r\n\r\n const safeDomains = [\r\n \"https://blocksights.info/\",\r\n \"https://bts.exchange/\",\r\n \"https://ex.xbts.io/\",\r\n \"https://kibana.bts.mobi/\",\r\n \"https://www.bitsharescan.info/\",\r\n \"https://github.com/bitshares/beet\",\r\n ];\r\n ipcMain.on(\"openURL\", (event, arg) => {\r\n try {\r\n const parsedUrl = new url.URL(arg);\r\n const domain = parsedUrl.hostname;\r\n\r\n const isSafeDomain = safeDomains.some((safeDomain) => {\r\n const safeDomainHostname = new url.URL(safeDomain).hostname;\r\n return safeDomainHostname === domain;\r\n });\r\n\r\n if (isSafeDomain) {\r\n shell.openExternal(arg);\r\n } else {\r\n console.error(`Rejected opening URL with unsafe domain: ${domain}`);\r\n }\r\n } catch (err) {\r\n console.error(`Failed to open URL: ${err.message}`);\r\n }\r\n });\r\n\r\n tray.on(\"click\", () => {\r\n mainWindow?.setAlwaysOnTop(true);\r\n mainWindow?.show();\r\n mainWindow?.focus();\r\n mainWindow?.setAlwaysOnTop(false);\r\n });\r\n\r\n tray.on(\"balloon-click\", () => {\r\n mainWindow?.setAlwaysOnTop(true);\r\n mainWindow?.show();\r\n mainWindow?.focus();\r\n mainWindow?.setAlwaysOnTop(false);\r\n });\r\n};\r\n\r\napp.disableHardwareAcceleration();\r\n\r\nconst currentOS = os.platform();\r\nif (currentOS === \"win32\" || currentOS === \"linux\") {\r\n // windows + linux setup phase\r\n const gotTheLock = app.requestSingleInstanceLock();\r\n\r\n if (!gotTheLock) {\r\n app.quit();\r\n }\r\n\r\n app.whenReady().then(() => {\r\n createWindow();\r\n });\r\n} else {\r\n app.whenReady().then(() => {\r\n createWindow();\r\n });\r\n\r\n app.on(\"window-all-closed\", () => {\r\n if (process.platform !== \"darwin\") {\r\n app.quit();\r\n }\r\n });\r\n\r\n app.on(\"activate\", () => {\r\n if (mainWindow === null) {\r\n createWindow();\r\n }\r\n });\r\n}\r\n"],"names":[],"sourceRoot":""}