From 5066166d2166c2cc776741c500eab9883a2090ad Mon Sep 17 00:00:00 2001 From: rappix Date: Tue, 6 Jun 2023 16:34:51 +0200 Subject: [PATCH 01/96] ios app init --- package.json | 2 + packages/browser-wallet-base/public/app.html | 0 packages/browser-wallet-base/webpack.ios.cjs | 10 ++++ .../browser-wallet-base/webpack.shared.cjs | 57 ++++++++++++------- packages/browser-wallet-ui/src/styles/ios.css | 2 +- 5 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 packages/browser-wallet-base/public/app.html create mode 100644 packages/browser-wallet-base/webpack.ios.cjs diff --git a/package.json b/package.json index 5e081d2..f1fda8b 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,11 @@ "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production", "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production", "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production", + "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production", "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development --watch ", "dev:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development --watch", "dev:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development --watch", + "dev:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development --watch", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { diff --git a/packages/browser-wallet-base/public/app.html b/packages/browser-wallet-base/public/app.html new file mode 100644 index 0000000..e69de29 diff --git a/packages/browser-wallet-base/webpack.ios.cjs b/packages/browser-wallet-base/webpack.ios.cjs new file mode 100644 index 0000000..2706b4f --- /dev/null +++ b/packages/browser-wallet-base/webpack.ios.cjs @@ -0,0 +1,10 @@ +// Copyright 2019-2022 @polkadot/extension authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +const createConfig = require('./webpack.shared.cjs'); + +module.exports = [ + createConfig({ + app: './src/app.js' + }, [], true, 'ios') +]; \ No newline at end of file diff --git a/packages/browser-wallet-base/webpack.shared.cjs b/packages/browser-wallet-base/webpack.shared.cjs index 0cfacf6..c1e4a13 100644 --- a/packages/browser-wallet-base/webpack.shared.cjs +++ b/packages/browser-wallet-base/webpack.shared.cjs @@ -33,14 +33,14 @@ module.exports = ( entry, alias = {}, useSplitChunk = false, - browser = "chrome" + platform = "chrome" ) => { - if (!["chrome", "firefox", "safari"].includes(browser)) { - browser = "chrome"; + if (!["chrome", "firefox", "safari", "ios"].includes(platform)) { + platform = "chrome"; } - const manifest = require(`./manifest-${browser}.json`); - let output_dir = path.join(__dirname, `../../build/${browser}`); + const manifest = platform !== 'ios' ? require(`./manifest-${platform}.json`) : null + let output_dir = path.join(__dirname, `../../build/${platform}`); let plugins = [ new webpack.ProvidePlugin({ @@ -77,28 +77,40 @@ module.exports = ( to: 'components' }] }), - new ManifestPlugin({ + new MiniCssExtractPlugin() + ] + + if (useSplitChunk) { + if(platform === 'ios') { + plugins.push( + new HtmlWebpackPlugin({ + filename: "index.html", + template: "public/app.html", + chunks: ["app"], + }) + ); + } else { + plugins.push( + new HtmlWebpackPlugin({ + filename: "index.html", + template: "public/index.html", + chunks: ["extension"], + }) + ); + } + } + if(platform !== 'ios') { + plugins.push(new ManifestPlugin({ config: { base: manifest, extend: { version: pkgJson.version.split('-')[0] // remove possible -beta.xx } } - }), - new MiniCssExtractPlugin() - ] - - if (useSplitChunk) { - plugins.push( - new HtmlWebpackPlugin({ - filename: "index.html", - template: "public/index.html", - chunks: ["extension"], - }) - ); - } + })) + } - if(browser === 'safari') { + if(platform === 'safari') { // copy necessary files plugins.push(new CopyPlugin({ patterns: [{ @@ -116,7 +128,10 @@ module.exports = ( })) // change output directory - output_dir = path.join(__dirname, `../../build/${browser}/Shared (Extension)`) + output_dir = path.join(__dirname, `../../build/safari/Shared (Extension)`) + } else if(platform === 'ios') { + // change output directory + output_dir = path.join(__dirname, `../../build/safari/Shared (App)/Resources`) } else { plugins.push(new CopyPlugin({ patterns: [{ diff --git a/packages/browser-wallet-ui/src/styles/ios.css b/packages/browser-wallet-ui/src/styles/ios.css index 0d73deb..85012a8 100644 --- a/packages/browser-wallet-ui/src/styles/ios.css +++ b/packages/browser-wallet-ui/src/styles/ios.css @@ -2,7 +2,7 @@ body.macos { position: fixed; } body.ios { - position: fixed; + height: 110%; top: 0; left: 0; -webkit-overflow-scrolling: touch; From 9d795eb50ac11e9d62c00b260436b952ebb6cd95 Mon Sep 17 00:00:00 2001 From: rappix Date: Tue, 6 Jun 2023 16:52:43 +0200 Subject: [PATCH 02/96] ios app --- packages/browser-wallet-base/src/app.js | 66 +++++++++++++++++++ packages/browser-wallet-base/src/extension.js | 4 ++ 2 files changed, 70 insertions(+) create mode 100644 packages/browser-wallet-base/src/app.js diff --git a/packages/browser-wallet-base/src/app.js b/packages/browser-wallet-base/src/app.js new file mode 100644 index 0000000..c397d86 --- /dev/null +++ b/packages/browser-wallet-base/src/app.js @@ -0,0 +1,66 @@ +import { databaseService } from '@bitgreen/browser-wallet-core' +import userInterface from '@bitgreen/browser-wallet-ui' + +const db = new databaseService() +const ui = new userInterface() + +const extension = async() => { + await ui.initUi() + + const params = new URLSearchParams(window.location.search) + + const command = params.has('command') ? params.get('command') : null + + if(command === 'new_wallet') { + return await ui.goToScreen('walletCreateScreen') + } + + // Break if there is no wallet created/imported, and return to welcome screen. + if(!await db.stores.wallets.exists()) { + if(await db.stores.settings.asyncGet('skip_intro')) { + return await ui.goToScreen('walletScreen') + } else { + return await ui.goToScreen('welcomeScreen') + } + } + + if(command === 'sign_in' && params.get('origin')) { + return await ui.goToScreen('signInScreen', { + message_id: params.get('id'), + tab_id: params.get('tab_id'), + domain: params.get('origin'), + title: params.get('title') + }) + } + + if(command === 'send') { + return await ui.goToScreen('assetSendScreen', { + message_id: params.get('id'), + tab_id: params.get('tab_id'), + kill_popup: params.get('kill_popup'), + amount: params.get('amount'), + recipient: params.get('recipient') + }) + } + + if(command === 'extrinsic') { + return await ui.goToScreen('extrinsicSendScreen', { + message_id: params.get('id'), + tab_id: params.get('tab_id'), + kill_popup: params.get('kill_popup'), + domain: params.get('domain'), + title: params.get('title'), + pallet: params.get('pallet'), + call: params.get('call'), + call_parameters: params.get('call_parameters') + }) + } + + return await ui.goToScreen('dashboardScreen', { + extend_delay: true + }) +} + +document.addEventListener('deviceready', async function () { + await extension() +}) \ No newline at end of file diff --git a/packages/browser-wallet-base/src/extension.js b/packages/browser-wallet-base/src/extension.js index 7c4dd71..eb84a58 100644 --- a/packages/browser-wallet-base/src/extension.js +++ b/packages/browser-wallet-base/src/extension.js @@ -65,4 +65,8 @@ const extension = async() => { extension().then() // document.addEventListener('DOMContentLoaded', async function () { // await extension() +// }) + +// document.addEventListener('deviceready', async function () { +// await extension() // }) \ No newline at end of file From 111e87d441beb7e8095cd73c57270cca5df577be Mon Sep 17 00:00:00 2001 From: rappix Date: Sun, 30 Jul 2023 17:01:43 +0200 Subject: [PATCH 03/96] update xcode project files --- .../BitgreenWallet.xcodeproj/project.pbxproj | 411 +++++++++++++----- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../UserInterfaceState.xcuserstate | Bin .../UserInterfaceState.xcuserstate | Bin 0 -> 168731 bytes .../UserInterfaceState.xcuserstate | Bin .../WorkspaceSettings.xcsettings | 0 .../xcschemes/BitgreenWallet (macOS).xcscheme | 2 +- .../xcschemes/xcschememanagement.plist | 0 .../xcschemes/xcschememanagement.plist | 7 +- .../xcschemes/xcschememanagement.plist | 0 .../contents.xcworkspacedata | 10 + .../browser-wallet-base/src/apple/Podfile | 25 ++ .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/100.png | Bin .../AppIcon.appiconset/1024.png | Bin .../AppIcon.appiconset/114.png | Bin .../AppIcon.appiconset/120.png | Bin .../AppIcon.appiconset/128.png | Bin .../AppIcon.appiconset/144.png | Bin .../AppIcon.appiconset/152.png | Bin .../Assets.xcassets/AppIcon.appiconset/16.png | Bin .../AppIcon.appiconset/167.png | Bin .../AppIcon.appiconset/172.png | Bin .../AppIcon.appiconset/180.png | Bin .../AppIcon.appiconset/196.png | Bin .../Assets.xcassets/AppIcon.appiconset/20.png | Bin .../AppIcon.appiconset/216.png | Bin .../AppIcon.appiconset/256.png | Bin .../Assets.xcassets/AppIcon.appiconset/29.png | Bin .../Assets.xcassets/AppIcon.appiconset/32.png | Bin .../Assets.xcassets/AppIcon.appiconset/40.png | Bin .../Assets.xcassets/AppIcon.appiconset/48.png | Bin .../Assets.xcassets/AppIcon.appiconset/50.png | Bin .../AppIcon.appiconset/512.png | Bin .../Assets.xcassets/AppIcon.appiconset/55.png | Bin .../Assets.xcassets/AppIcon.appiconset/57.png | Bin .../Assets.xcassets/AppIcon.appiconset/58.png | Bin .../Assets.xcassets/AppIcon.appiconset/60.png | Bin .../Assets.xcassets/AppIcon.appiconset/64.png | Bin .../Assets.xcassets/AppIcon.appiconset/66.png | Bin .../Assets.xcassets/AppIcon.appiconset/72.png | Bin .../Assets.xcassets/AppIcon.appiconset/76.png | Bin .../Assets.xcassets/AppIcon.appiconset/80.png | Bin .../Assets.xcassets/AppIcon.appiconset/87.png | Bin .../Assets.xcassets/AppIcon.appiconset/88.png | Bin .../Assets.xcassets/AppIcon.appiconset/92.png | Bin .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../LargeIcon.imageset/1024.png | Bin .../LargeIcon.imageset/Contents.json | 0 .../SafariWebExtensionHandler.swift | 0 .../src/apple/iOS (App)/AppDelegate.swift | 49 +++ .../Base.lproj/LaunchScreen.storyboard | 32 ++ .../iOS (App)/Base.lproj/Main.storyboard | 19 + .../src/apple/iOS (App)/Info.plist | 8 + .../src/apple/iOS (App)/capacitor.config.json | 16 + .../src/apple/iOS (App)/config.xml | 6 + .../src/apple/iOS (App)/public/cordova.js | 0 .../apple/iOS (App)/public/cordova_plugins.js | 0 .../iOS (Extension)/Info.plist | 0 .../macOS (App)/AppDelegate.swift | 0 .../macOS (App)/Base.lproj/Main.storyboard | 0 .../macOS (App)/BitgreenWallet.entitlements | 0 .../{safari => apple}/macOS (App)/Info.plist | 0 .../macOS (App)}/Resources/icon.png | Bin .../macOS (App)}/Resources/main.html | 0 .../macOS (App)}/Resources/script.js | 0 .../macOS (App)}/Resources/style.css | 0 .../macOS (App)}/ViewController.swift | 0 .../BitgreenWallet.entitlements | 0 .../macOS (Extension)/Info.plist | 0 .../UserInterfaceState.xcuserstate | Bin 41520 -> 0 bytes .../src/safari/iOS (App)/AppDelegate.swift | 24 - .../Base.lproj/LaunchScreen.storyboard | 36 -- .../iOS (App)/Base.lproj/Main.storyboard | 38 -- .../src/safari/iOS (App)/Info.plist | 27 -- .../src/safari/iOS (App)/SceneDelegate.swift | 18 - 79 files changed, 474 insertions(+), 254 deletions(-) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.pbxproj (69%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate (100%) create mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate (100%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings (100%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme (98%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/xcuserdata/Mike.xcuserdatad/xcschemes/xcschememanagement.plist (100%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/xcuserdata/rappix.xcuserdatad/xcschemes/xcschememanagement.plist (81%) rename packages/browser-wallet-base/src/{safari => apple}/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist (100%) create mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata create mode 100644 packages/browser-wallet-base/src/apple/Podfile rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/1024.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/120.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/128.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/144.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/152.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/16.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/172.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/196.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/216.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/256.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/32.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/48.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/50.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/55.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/57.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/58.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/60.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/64.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/66.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/72.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/76.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/80.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/88.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/92.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/Contents.json (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json (100%) rename packages/browser-wallet-base/src/{safari => apple}/Shared (Extension)/SafariWebExtensionHandler.swift (100%) create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/AppDelegate.swift create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/Info.plist create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/config.xml create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/public/cordova.js create mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/public/cordova_plugins.js rename packages/browser-wallet-base/src/{safari => apple}/iOS (Extension)/Info.plist (100%) rename packages/browser-wallet-base/src/{safari => apple}/macOS (App)/AppDelegate.swift (100%) rename packages/browser-wallet-base/src/{safari => apple}/macOS (App)/Base.lproj/Main.storyboard (100%) rename packages/browser-wallet-base/src/{safari => apple}/macOS (App)/BitgreenWallet.entitlements (100%) rename packages/browser-wallet-base/src/{safari => apple}/macOS (App)/Info.plist (100%) rename packages/browser-wallet-base/src/{safari/Shared (App) => apple/macOS (App)}/Resources/icon.png (100%) rename packages/browser-wallet-base/src/{safari/Shared (App) => apple/macOS (App)}/Resources/main.html (100%) rename packages/browser-wallet-base/src/{safari/Shared (App) => apple/macOS (App)}/Resources/script.js (100%) rename packages/browser-wallet-base/src/{safari/Shared (App) => apple/macOS (App)}/Resources/style.css (100%) rename packages/browser-wallet-base/src/{safari/Shared (App) => apple/macOS (App)}/ViewController.swift (100%) rename packages/browser-wallet-base/src/{safari => apple}/macOS (Extension)/BitgreenWallet.entitlements (100%) rename packages/browser-wallet-base/src/{safari => apple}/macOS (Extension)/Info.plist (100%) delete mode 100644 packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 packages/browser-wallet-base/src/safari/iOS (App)/AppDelegate.swift delete mode 100644 packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/Main.storyboard delete mode 100644 packages/browser-wallet-base/src/safari/iOS (App)/Info.plist delete mode 100644 packages/browser-wallet-base/src/safari/iOS (App)/SceneDelegate.swift diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.pbxproj b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj similarity index 69% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.pbxproj rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj index b98d9e5..58754d7 100644 --- a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.pbxproj +++ b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj @@ -7,17 +7,24 @@ objects = { /* Begin PBXBuildFile section */ - 0432DBDF29F21C590011FCE0 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBDE29F21C590011FCE0 /* icon.png */; }; - 0432DBE229F21C6A0011FCE0 /* main.html in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBE129F21C6A0011FCE0 /* main.html */; }; - 0432DBE329F21C6A0011FCE0 /* main.html in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBE129F21C6A0011FCE0 /* main.html */; }; - 0432DBE529F21C720011FCE0 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBE429F21C720011FCE0 /* style.css */; }; - 0432DBE829F21D230011FCE0 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBE429F21C720011FCE0 /* style.css */; }; - 0432DBE929F21D230011FCE0 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBDE29F21C590011FCE0 /* icon.png */; }; - 0432DBEA29F21D230011FCE0 /* script.js in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843A2872B34D0037E6C9 /* script.js */; }; + 041114892A17305F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8E8684622872B3500037E6C9 /* BitgreenWallet Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 041114932A17C28F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 0411149E2A17D0B50083C227 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 0411149D2A17D0B50083C227 /* config.xml */; }; + 041114BF2A17D29F0083C227 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041114BE2A17D29F0083C227 /* ViewController.swift */; }; + 041114C42A17D2E10083C227 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041114BA2A17D1DB0083C227 /* AppDelegate.swift */; }; + 041115072A17F6D60083C227 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 041114B22A17D1AD0083C227 /* icon.png */; }; + 041115082A17F6D60083C227 /* main.html in Resources */ = {isa = PBXBuildFile; fileRef = 041114B32A17D1AD0083C227 /* main.html */; }; + 041115092A17F6D60083C227 /* script.js in Resources */ = {isa = PBXBuildFile; fileRef = 041114B12A17D1AD0083C227 /* script.js */; }; + 0411150A2A17F6D60083C227 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 041114B42A17D1AD0083C227 /* style.css */; }; 0432DBEC29F21DFE0011FCE0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E8684592872B3500037E6C9 /* Main.storyboard */; }; 0432DBEF29F21EB40011FCE0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843C2872B3500037E6C9 /* Assets.xcassets */; }; - 0432DBF229F220900011FCE0 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBDE29F21C590011FCE0 /* icon.png */; }; - 0432DBF329F220BB0011FCE0 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0432DBDE29F21C590011FCE0 /* icon.png */; }; + 047C28702A7169B600F81F5E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047C286C2A7169B600F81F5E /* LaunchScreen.storyboard */; }; + 047C28712A7169B600F81F5E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047C286E2A7169B600F81F5E /* Main.storyboard */; }; + 047C28732A7169C400F81F5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047C28722A7169C400F81F5E /* AppDelegate.swift */; }; + 047C28752A7169CE00F81F5E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 047C28742A7169CE00F81F5E /* capacitor.config.json */; }; + 047C28782A716A4800F81F5E /* public in Resources */ = {isa = PBXBuildFile; fileRef = 047C28772A716A4800F81F5E /* public */; }; + 047C28DA2A71D99E00F81F5E /* CapacitorKeyboard in Frameworks */ = {isa = PBXBuildFile; fileRef = 047C28D92A71D99E00F81F5E /* CapacitorKeyboard */; }; + 047C28FF2A75C26E00F81F5E /* CapacitorApp in Frameworks */ = {isa = PBXBuildFile; fileRef = 047C28FE2A75C26E00F81F5E /* CapacitorApp */; }; 047D48EE2A040A1B00C416FC /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 047D48E92A040A1B00C416FC /* icons */; }; 047D48EF2A040A1B00C416FC /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 047D48E92A040A1B00C416FC /* icons */; }; 047D48F02A040A1B00C416FC /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EA2A040A1B00C416FC /* default.css */; }; @@ -30,6 +37,7 @@ 047D48F72A040A1B00C416FC /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48ED2A040A1B00C416FC /* main.js */; }; 04B0525B29F9EC730049B197 /* inject.js in Resources */ = {isa = PBXBuildFile; fileRef = 04B0525629F9EC730049B197 /* inject.js */; }; 04B0525C29F9EC730049B197 /* inject.js in Resources */ = {isa = PBXBuildFile; fileRef = 04B0525629F9EC730049B197 /* inject.js */; }; + 04C9ADAE2A14451600EFF193 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843C2872B3500037E6C9 /* Assets.xcassets */; }; 271FBF1129B8DB52001D0940 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0329B8DB52001D0940 /* manifest.json */; }; 271FBF1229B8DB52001D0940 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0329B8DB52001D0940 /* manifest.json */; }; 271FBF1529B8DB52001D0940 /* components in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0429B8DB52001D0940 /* components */; }; @@ -46,31 +54,54 @@ 271FBF3A29B8DB52001D0940 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0D29B8DB52001D0940 /* assets */; }; 271FBF3D29B8DB52001D0940 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0E29B8DB52001D0940 /* index.html */; }; 271FBF3E29B8DB52001D0940 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0E29B8DB52001D0940 /* index.html */; }; - 8E77E44928754AA80020A55D /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 8E77E44628754AA80020A55D /* icons */; }; - 8E77E44A28754AA80020A55D /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 8E77E44628754AA80020A55D /* icons */; }; - 8E8684472872B3500037E6C9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8684462872B3500037E6C9 /* AppDelegate.swift */; }; - 8E8684492872B3500037E6C9 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8684482872B3500037E6C9 /* SceneDelegate.swift */; }; - 8E86844C2872B3500037E6C9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E86844A2872B3500037E6C9 /* LaunchScreen.storyboard */; }; - 8E86844F2872B3500037E6C9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E86844D2872B3500037E6C9 /* Main.storyboard */; }; - 8E8684582872B3500037E6C9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8684572872B3500037E6C9 /* AppDelegate.swift */; }; - 8E8684632872B3500037E6C9 /* BitgreenWallet Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8E8684622872B3500037E6C9 /* BitgreenWallet Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 8E86846D2872B3500037E6C9 /* BitgreenWallet Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 8E8684792872B3500037E6C9 /* script.js in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843A2872B34D0037E6C9 /* script.js */; }; - 8E86847B2872B3500037E6C9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E86843B2872B34D0037E6C9 /* ViewController.swift */; }; - 8E86847C2872B3500037E6C9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E86843B2872B34D0037E6C9 /* ViewController.swift */; }; - 8E86847D2872B3500037E6C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843C2872B3500037E6C9 /* Assets.xcassets */; }; + 27751DC978D5825FA52507C7 /* Pods_BitgreenWallet__iOS_.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B976C688D8DD970F490FF3F6 /* Pods_BitgreenWallet__iOS_.framework */; }; 8E86847F2872B3500037E6C9 /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */; }; 8E8684802872B3500037E6C9 /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 8E8684642872B3500037E6C9 /* PBXContainerItemProxy */ = { + 0411148A2A17305F0083C227 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 8E8684302872B34D0037E6C9 /* Project object */; proxyType = 1; remoteGlobalIDString = 8E8684612872B3500037E6C9; remoteInfo = "BitgreenWallet Extension (iOS)"; }; + 047C28AE2A716CD500F81F5E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 44D6062E8C618EC2B8F1D7229E8AD501; + remoteInfo = Capacitor; + }; + 047C28B02A716CD500F81F5E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1ABFDA3391AEBA42EFB0FEBF824A6E34; + remoteInfo = CapacitorCordova; + }; + 047C28BA2A7173A400F81F5E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B7F9F70473009360419B24AC94D17877; + remoteInfo = "Pods-BitgreenWallet (iOS)"; + }; + 047C28D82A71D99E00F81F5E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 43F80CDA05D5624A6B812123E023B138; + remoteInfo = CapacitorKeyboard; + }; + 047C28FD2A75C26E00F81F5E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CDFF4A7EE78A2AC8170A2DC20868DF1F; + remoteInfo = CapacitorApp; + }; 8E86846E2872B3500037E6C9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 8E8684302872B34D0037E6C9 /* Project object */; @@ -81,40 +112,51 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 8E8684862872B3500037E6C9 /* Embed App Extensions */ = { + 0411148C2A1730600083C227 /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - 8E8684632872B3500037E6C9 /* BitgreenWallet Extension.appex in Embed App Extensions */, + 041114892A17305F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - 8E86848D2872B3500037E6C9 /* Embed App Extensions */ = { + 8E86848D2872B3500037E6C9 /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - 8E86846D2872B3500037E6C9 /* BitgreenWallet Extension.appex in Embed App Extensions */, + 041114932A17C28F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0432DBDE29F21C590011FCE0 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; - 0432DBE129F21C6A0011FCE0 /* main.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = main.html; sourceTree = ""; }; - 0432DBE429F21C720011FCE0 /* style.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = style.css; sourceTree = ""; }; + 0411149D2A17D0B50083C227 /* config.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; + 041114B12A17D1AD0083C227 /* script.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = script.js; path = Resources/script.js; sourceTree = ""; }; + 041114B22A17D1AD0083C227 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icon.png; sourceTree = ""; }; + 041114B32A17D1AD0083C227 /* main.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = main.html; path = Resources/main.html; sourceTree = ""; }; + 041114B42A17D1AD0083C227 /* style.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = style.css; path = Resources/style.css; sourceTree = ""; }; + 041114BA2A17D1DB0083C227 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 041114BE2A17D29F0083C227 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 047C286D2A7169B600F81F5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 047C286F2A7169B600F81F5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 047C28722A7169C400F81F5E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 047C28742A7169CE00F81F5E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; + 047C28772A716A4800F81F5E /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + 047C28A82A716CD500F81F5E /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = ""; }; 047D48E92A040A1B00C416FC /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = ""; }; 047D48EA2A040A1B00C416FC /* default.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = default.css; sourceTree = ""; }; 047D48EB2A040A1B00C416FC /* default.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = default.js; sourceTree = ""; }; 047D48EC2A040A1B00C416FC /* main.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = main.css; sourceTree = ""; }; 047D48ED2A040A1B00C416FC /* main.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = main.js; sourceTree = ""; }; 04B0525629F9EC730049B197 /* inject.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = inject.js; sourceTree = ""; }; + 04C9AD792A13080B00EFF193 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 271FBF0329B8DB52001D0940 /* manifest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = manifest.json; sourceTree = ""; }; 271FBF0429B8DB52001D0940 /* components */ = {isa = PBXFileReference; lastKnownFileType = folder; path = components; sourceTree = ""; }; 271FBF0829B8DB52001D0940 /* page.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = page.js; sourceTree = ""; }; @@ -123,19 +165,12 @@ 271FBF0C29B8DB52001D0940 /* extension.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = extension.js; sourceTree = ""; }; 271FBF0D29B8DB52001D0940 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; 271FBF0E29B8DB52001D0940 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; + 621754D54963E544190F54C9 /* Pods-BitgreenWallet (iOS).release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BitgreenWallet (iOS).release.xcconfig"; path = "Target Support Files/Pods-BitgreenWallet (iOS)/Pods-BitgreenWallet (iOS).release.xcconfig"; sourceTree = ""; }; 8E77E44628754AA80020A55D /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = ""; }; - 8E86843A2872B34D0037E6C9 /* script.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = script.js; sourceTree = ""; }; - 8E86843B2872B34D0037E6C9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 8E86843C2872B3500037E6C9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariWebExtensionHandler.swift; sourceTree = ""; }; 8E8684432872B3500037E6C9 /* BitgreenWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BitgreenWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E8684462872B3500037E6C9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 8E8684482872B3500037E6C9 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 8E86844B2872B3500037E6C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 8E86844E2872B3500037E6C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 8E8684502872B3500037E6C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8E8684552872B3500037E6C9 /* BitgreenWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BitgreenWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E8684572872B3500037E6C9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8E86845A2872B3500037E6C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 8E86845C2872B3500037E6C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8E86845D2872B3500037E6C9 /* BitgreenWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BitgreenWallet.entitlements; sourceTree = ""; }; @@ -144,6 +179,8 @@ 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BitgreenWallet Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 8E8684712872B3500037E6C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8E8684722872B3500037E6C9 /* BitgreenWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BitgreenWallet.entitlements; sourceTree = ""; }; + B976C688D8DD970F490FF3F6 /* Pods_BitgreenWallet__iOS_.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BitgreenWallet__iOS_.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FACF023E3802523EACD15DE1 /* Pods-BitgreenWallet (iOS).debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BitgreenWallet (iOS).debug.xcconfig"; path = "Target Support Files/Pods-BitgreenWallet (iOS)/Pods-BitgreenWallet (iOS).debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -151,6 +188,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 047C28FF2A75C26E00F81F5E /* CapacitorApp in Frameworks */, + 047C28DA2A71D99E00F81F5E /* CapacitorKeyboard in Frameworks */, + 27751DC978D5825FA52507C7 /* Pods_BitgreenWallet__iOS_.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -178,9 +218,50 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 041114B02A17D19D0083C227 /* Resources */ = { + isa = PBXGroup; + children = ( + 041114B22A17D1AD0083C227 /* icon.png */, + 041114B32A17D1AD0083C227 /* main.html */, + 041114B12A17D1AD0083C227 /* script.js */, + 041114B42A17D1AD0083C227 /* style.css */, + ); + name = Resources; + sourceTree = ""; + }; + 047C28A92A716CD500F81F5E /* Products */ = { + isa = PBXGroup; + children = ( + 047C28AF2A716CD500F81F5E /* Capacitor */, + 047C28FE2A75C26E00F81F5E /* CapacitorApp */, + 047C28B12A716CD500F81F5E /* CapacitorCordova */, + 047C28D92A71D99E00F81F5E /* CapacitorKeyboard */, + 047C28BB2A7173A400F81F5E /* Pods-BitgreenWallet (iOS) */, + ); + name = Products; + sourceTree = ""; + }; + 04C9ADD02A1507DE00EFF193 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B976C688D8DD970F490FF3F6 /* Pods_BitgreenWallet__iOS_.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 463C928A7F2C66B33B4978B9 /* Pods */ = { + isa = PBXGroup; + children = ( + FACF023E3802523EACD15DE1 /* Pods-BitgreenWallet (iOS).debug.xcconfig */, + 621754D54963E544190F54C9 /* Pods-BitgreenWallet (iOS).release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 8E86842F2872B34D0037E6C9 = { isa = PBXGroup; children = ( + 047C28A82A716CD500F81F5E /* Pods.xcodeproj */, 8E8684342872B34D0037E6C9 /* Shared (App) */, 8E86843D2872B3500037E6C9 /* Shared (Extension) */, 8E8684452872B3500037E6C9 /* iOS (App) */, @@ -188,30 +269,19 @@ 8E8684662872B3500037E6C9 /* iOS (Extension) */, 8E8684702872B3500037E6C9 /* macOS (Extension) */, 8E8684442872B3500037E6C9 /* Products */, + 04C9ADD02A1507DE00EFF193 /* Frameworks */, + 463C928A7F2C66B33B4978B9 /* Pods */, ); sourceTree = ""; }; 8E8684342872B34D0037E6C9 /* Shared (App) */ = { isa = PBXGroup; children = ( - 8E86843B2872B34D0037E6C9 /* ViewController.swift */, 8E86843C2872B3500037E6C9 /* Assets.xcassets */, - 8E8684352872B34D0037E6C9 /* Resources */, ); path = "Shared (App)"; sourceTree = ""; }; - 8E8684352872B34D0037E6C9 /* Resources */ = { - isa = PBXGroup; - children = ( - 0432DBE429F21C720011FCE0 /* style.css */, - 0432DBE129F21C6A0011FCE0 /* main.html */, - 0432DBDE29F21C590011FCE0 /* icon.png */, - 8E86843A2872B34D0037E6C9 /* script.js */, - ); - path = Resources; - sourceTree = ""; - }; 8E86843D2872B3500037E6C9 /* Shared (Extension) */ = { isa = PBXGroup; children = ( @@ -235,11 +305,13 @@ 8E8684452872B3500037E6C9 /* iOS (App) */ = { isa = PBXGroup; children = ( - 8E8684462872B3500037E6C9 /* AppDelegate.swift */, - 8E8684482872B3500037E6C9 /* SceneDelegate.swift */, - 8E86844A2872B3500037E6C9 /* LaunchScreen.storyboard */, - 8E86844D2872B3500037E6C9 /* Main.storyboard */, - 8E8684502872B3500037E6C9 /* Info.plist */, + 047C28772A716A4800F81F5E /* public */, + 047C28742A7169CE00F81F5E /* capacitor.config.json */, + 047C28722A7169C400F81F5E /* AppDelegate.swift */, + 047C286C2A7169B600F81F5E /* LaunchScreen.storyboard */, + 047C286E2A7169B600F81F5E /* Main.storyboard */, + 0411149D2A17D0B50083C227 /* config.xml */, + 04C9AD792A13080B00EFF193 /* Info.plist */, ); path = "iOS (App)"; sourceTree = ""; @@ -247,7 +319,9 @@ 8E8684562872B3500037E6C9 /* macOS (App) */ = { isa = PBXGroup; children = ( - 8E8684572872B3500037E6C9 /* AppDelegate.swift */, + 041114B02A17D19D0083C227 /* Resources */, + 041114BE2A17D29F0083C227 /* ViewController.swift */, + 041114BA2A17D1DB0083C227 /* AppDelegate.swift */, 8E8684592872B3500037E6C9 /* Main.storyboard */, 8E86845C2872B3500037E6C9 /* Info.plist */, 8E86845D2872B3500037E6C9 /* BitgreenWallet.entitlements */, @@ -302,15 +376,17 @@ isa = PBXNativeTarget; buildConfigurationList = 8E8684872872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet (iOS)" */; buildPhases = ( + 041114BD2A17D23B0083C227 /* [CP] Check Pods Manifest.lock */, 8E86843F2872B3500037E6C9 /* Sources */, 8E8684402872B3500037E6C9 /* Frameworks */, 8E8684412872B3500037E6C9 /* Resources */, - 8E8684862872B3500037E6C9 /* Embed App Extensions */, + 0411148C2A1730600083C227 /* Embed Foundation Extensions */, + 047C28922A716C3000F81F5E /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( - 8E8684652872B3500037E6C9 /* PBXTargetDependency */, + 0411148B2A17305F0083C227 /* PBXTargetDependency */, ); name = "BitgreenWallet (iOS)"; productName = "BitgreenWallet (iOS)"; @@ -324,7 +400,7 @@ 8E8684512872B3500037E6C9 /* Sources */, 8E8684522872B3500037E6C9 /* Frameworks */, 8E8684532872B3500037E6C9 /* Resources */, - 8E86848D2872B3500037E6C9 /* Embed App Extensions */, + 8E86848D2872B3500037E6C9 /* Embed Foundation Extensions */, ); buildRules = ( ); @@ -378,14 +454,16 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1340; - LastUpgradeCheck = 1340; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; TargetAttributes = { 8E8684422872B3500037E6C9 = { CreatedOnToolsVersion = 13.4.1; + LastSwiftMigration = 1430; }; 8E8684542872B3500037E6C9 = { CreatedOnToolsVersion = 13.4.1; + LastSwiftMigration = 1430; }; 8E8684612872B3500037E6C9 = { CreatedOnToolsVersion = 13.4.1; @@ -406,6 +484,12 @@ mainGroup = 8E86842F2872B34D0037E6C9; productRefGroup = 8E8684442872B3500037E6C9 /* Products */; projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 047C28A92A716CD500F81F5E /* Products */; + ProjectRef = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; + }, + ); projectRoot = ""; targets = ( 8E8684422872B3500037E6C9 /* BitgreenWallet (iOS) */, @@ -416,18 +500,59 @@ }; /* End PBXProject section */ +/* Begin PBXReferenceProxy section */ + 047C28AF2A716CD500F81F5E /* Capacitor */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + name = Capacitor; + path = Capacitor.framework; + remoteRef = 047C28AE2A716CD500F81F5E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 047C28B12A716CD500F81F5E /* CapacitorCordova */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + name = CapacitorCordova; + path = Cordova.framework; + remoteRef = 047C28B02A716CD500F81F5E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 047C28BB2A7173A400F81F5E /* Pods-BitgreenWallet (iOS) */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Pods_BitgreenWallet__iOS_.framework; + remoteRef = 047C28BA2A7173A400F81F5E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 047C28D92A71D99E00F81F5E /* CapacitorKeyboard */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + name = CapacitorKeyboard; + path = CapacitorKeyboard.framework; + remoteRef = 047C28D82A71D99E00F81F5E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 047C28FE2A75C26E00F81F5E /* CapacitorApp */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + name = CapacitorApp; + path = CapacitorApp.framework; + remoteRef = 047C28FD2A75C26E00F81F5E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + /* Begin PBXResourcesBuildPhase section */ 8E8684412872B3500037E6C9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0432DBE229F21C6A0011FCE0 /* main.html in Resources */, - 8E86844C2872B3500037E6C9 /* LaunchScreen.storyboard in Resources */, - 8E8684792872B3500037E6C9 /* script.js in Resources */, - 0432DBDF29F21C590011FCE0 /* icon.png in Resources */, - 8E86847D2872B3500037E6C9 /* Assets.xcassets in Resources */, - 8E86844F2872B3500037E6C9 /* Main.storyboard in Resources */, - 0432DBE529F21C720011FCE0 /* style.css in Resources */, + 047C28712A7169B600F81F5E /* Main.storyboard in Resources */, + 047C28702A7169B600F81F5E /* LaunchScreen.storyboard in Resources */, + 047C28752A7169CE00F81F5E /* capacitor.config.json in Resources */, + 04C9ADAE2A14451600EFF193 /* Assets.xcassets in Resources */, + 0411149E2A17D0B50083C227 /* config.xml in Resources */, + 047C28782A716A4800F81F5E /* public in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -435,12 +560,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 041115072A17F6D60083C227 /* icon.png in Resources */, + 041115082A17F6D60083C227 /* main.html in Resources */, + 041115092A17F6D60083C227 /* script.js in Resources */, + 0411150A2A17F6D60083C227 /* style.css in Resources */, 0432DBEF29F21EB40011FCE0 /* Assets.xcassets in Resources */, 0432DBEC29F21DFE0011FCE0 /* Main.storyboard in Resources */, - 0432DBE829F21D230011FCE0 /* style.css in Resources */, - 0432DBE929F21D230011FCE0 /* icon.png in Resources */, - 0432DBEA29F21D230011FCE0 /* script.js in Resources */, - 0432DBE329F21C6A0011FCE0 /* main.html in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -450,7 +575,6 @@ files = ( 047D48F62A040A1B00C416FC /* main.js in Resources */, 047D48F42A040A1B00C416FC /* main.css in Resources */, - 0432DBF229F220900011FCE0 /* icon.png in Resources */, 047D48EE2A040A1B00C416FC /* icons in Resources */, 04B0525B29F9EC730049B197 /* inject.js in Resources */, 271FBF3D29B8DB52001D0940 /* index.html in Resources */, @@ -459,7 +583,6 @@ 271FBF2D29B8DB52001D0940 /* content.js in Resources */, 271FBF1129B8DB52001D0940 /* manifest.json in Resources */, 271FBF2929B8DB52001D0940 /* background.js in Resources */, - 8E77E44928754AA80020A55D /* icons in Resources */, 271FBF3929B8DB52001D0940 /* assets in Resources */, 271FBF3529B8DB52001D0940 /* extension.js in Resources */, 271FBF1529B8DB52001D0940 /* components in Resources */, @@ -473,7 +596,6 @@ files = ( 047D48F72A040A1B00C416FC /* main.js in Resources */, 047D48F52A040A1B00C416FC /* main.css in Resources */, - 0432DBF329F220BB0011FCE0 /* icon.png in Resources */, 047D48EF2A040A1B00C416FC /* icons in Resources */, 04B0525C29F9EC730049B197 /* inject.js in Resources */, 271FBF3E29B8DB52001D0940 /* index.html in Resources */, @@ -482,7 +604,6 @@ 271FBF2E29B8DB52001D0940 /* content.js in Resources */, 271FBF1229B8DB52001D0940 /* manifest.json in Resources */, 271FBF2A29B8DB52001D0940 /* background.js in Resources */, - 8E77E44A28754AA80020A55D /* icons in Resources */, 271FBF3A29B8DB52001D0940 /* assets in Resources */, 271FBF3629B8DB52001D0940 /* extension.js in Resources */, 271FBF1629B8DB52001D0940 /* components in Resources */, @@ -493,6 +614,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 041114BD2A17D23B0083C227 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 12; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-BitgreenWallet (iOS)-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 047C28922A716C3000F81F5E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BitgreenWallet (iOS)/Pods-BitgreenWallet (iOS)-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 8EF31D9C28745F0A0069BECA /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -517,9 +675,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8E86847B2872B3500037E6C9 /* ViewController.swift in Sources */, - 8E8684472872B3500037E6C9 /* AppDelegate.swift in Sources */, - 8E8684492872B3500037E6C9 /* SceneDelegate.swift in Sources */, + 047C28732A7169C400F81F5E /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -527,8 +683,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8E86847C2872B3500037E6C9 /* ViewController.swift in Sources */, - 8E8684582872B3500037E6C9 /* AppDelegate.swift in Sources */, + 041114BF2A17D29F0083C227 /* ViewController.swift in Sources */, + 041114C42A17D2E10083C227 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -551,10 +707,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 8E8684652872B3500037E6C9 /* PBXTargetDependency */ = { + 0411148B2A17305F0083C227 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8E8684612872B3500037E6C9 /* BitgreenWallet Extension (iOS) */; - targetProxy = 8E8684642872B3500037E6C9 /* PBXContainerItemProxy */; + targetProxy = 0411148A2A17305F0083C227 /* PBXContainerItemProxy */; }; 8E86846F2872B3500037E6C9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -564,18 +720,18 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 8E86844A2872B3500037E6C9 /* LaunchScreen.storyboard */ = { + 047C286C2A7169B600F81F5E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 8E86844B2872B3500037E6C9 /* Base */, + 047C286D2A7169B600F81F5E /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; - 8E86844D2872B3500037E6C9 /* Main.storyboard */ = { + 047C286E2A7169B600F81F5E /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 8E86844E2872B3500037E6C9 /* Base */, + 047C286F2A7169B600F81F5E /* Base */, ); name = Main.storyboard; sourceTree = ""; @@ -627,7 +783,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -641,9 +797,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = NO; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; @@ -685,7 +840,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -693,9 +848,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; + SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; @@ -766,60 +920,89 @@ }; 8E8684882872B3500037E6C9 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = FACF023E3802523EACD15DE1 /* Pods-BitgreenWallet (iOS).debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 554R43WPXX; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iOS (App)/Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "iOS (App)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = BitgreenWallet; + INFOPLIST_KEY_CFBundleDisplayName = "Bitgreen Wallet"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + INFOPLIST_KEY_UIRequiredDeviceCapabilities = armv7; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; + ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-framework", SafariServices, "-framework", WebKit, + "-ObjC", ); PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; PRODUCT_NAME = BitgreenWallet; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + WK_WEB_VIEW_ONLY = 1; }; name = Debug; }; 8E8684892872B3500037E6C9 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 621754D54963E544190F54C9 /* Pods-BitgreenWallet (iOS).release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 554R43WPXX; + ENABLE_NS_ASSERTIONS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iOS (App)/Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "WK_WEB_VIEW_ONLY=$(WK_WEB_VIEW_ONLY)", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "iOS (App)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = BitgreenWallet; + INFOPLIST_KEY_CFBundleDisplayName = "Bitgreen Wallet"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + INFOPLIST_KEY_UIRequiredDeviceCapabilities = armv7; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -830,14 +1013,17 @@ SafariServices, "-framework", WebKit, + "-ObjC", ); PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; PRODUCT_NAME = BitgreenWallet; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; + WK_WEB_VIEW_ONLY = 1; }; name = Release; }; @@ -849,6 +1035,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 554R43WPXX; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -860,7 +1047,7 @@ "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; OTHER_LDFLAGS = ( "-framework", @@ -886,6 +1073,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 554R43WPXX; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -897,7 +1085,7 @@ "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; OTHER_LDFLAGS = ( "-framework", @@ -926,6 +1114,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 554R43WPXX; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -947,8 +1136,10 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; PRODUCT_NAME = BitgreenWallet; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Debug; @@ -964,6 +1155,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 554R43WPXX; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -985,6 +1177,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; PRODUCT_NAME = BitgreenWallet; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..dc1c7216978294b61d4f7eca529f29b67f88484d GIT binary patch literal 168731 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

_WJ)|O7{G9>dC^nP1cQrE1b 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme similarity index 98% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme index 736aba3..8079f68 100644 --- a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme +++ b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme @@ -1,6 +1,6 @@ BitgreenWallet (iOS).xcscheme_^#shared#^_ orderHint - 1 + 6 BitgreenWallet (macOS).xcscheme_^#shared#^_ orderHint 0 + CordovaLib.xcscheme_^#shared#^_ + + orderHint + 1 + diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 100% rename from packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist rename to packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d9debb7 --- /dev/null +++ b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/browser-wallet-base/src/apple/Podfile b/packages/browser-wallet-base/src/apple/Podfile new file mode 100644 index 0000000..fb58cde --- /dev/null +++ b/packages/browser-wallet-base/src/apple/Podfile @@ -0,0 +1,25 @@ +require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' + +platform :ios, '13.0' +use_frameworks! + +# workaround to avoid Xcode caching of Pods that requires +# Product -> Clean Build Folder after new Cordova plugins installed +# Requires CocoaPods 1.6 or newer +install! 'cocoapods', :disable_input_output_paths => true + +def capacitor_pods + pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' + pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' +end + +target 'BitgreenWallet (iOS)' do + capacitor_pods + # Add your Pods here +end + +post_install do |installer| + assertDeploymentTarget(installer) +end diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/1024.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/1024.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/1024.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/1024.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/120.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/120.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/120.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/120.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/128.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/128.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/128.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/128.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/144.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/144.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/144.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/144.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/152.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/152.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/152.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/152.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/16.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/16.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/16.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/16.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/172.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/172.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/172.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/172.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/196.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/196.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/196.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/196.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/216.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/216.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/216.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/216.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/256.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/256.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/256.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/256.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/32.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/32.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/32.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/32.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/48.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/48.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/48.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/48.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/50.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/50.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/50.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/50.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/55.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/55.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/55.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/55.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/57.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/57.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/57.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/57.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/58.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/58.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/58.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/58.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/60.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/60.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/60.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/60.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/64.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/64.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/64.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/64.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/66.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/66.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/66.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/66.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/72.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/72.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/72.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/72.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/76.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/76.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/76.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/76.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/80.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/80.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/80.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/80.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/88.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/88.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/88.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/88.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/92.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/92.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/92.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/92.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/Contents.json similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/Contents.json rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/Contents.json diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json rename to packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json diff --git a/packages/browser-wallet-base/src/safari/Shared (Extension)/SafariWebExtensionHandler.swift b/packages/browser-wallet-base/src/apple/Shared (Extension)/SafariWebExtensionHandler.swift similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (Extension)/SafariWebExtensionHandler.swift rename to packages/browser-wallet-base/src/apple/Shared (Extension)/SafariWebExtensionHandler.swift diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/AppDelegate.swift b/packages/browser-wallet-base/src/apple/iOS (App)/AppDelegate.swift new file mode 100644 index 0000000..c3cd83b --- /dev/null +++ b/packages/browser-wallet-base/src/apple/iOS (App)/AppDelegate.swift @@ -0,0 +1,49 @@ +import UIKit +import Capacitor + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // Called when the app was launched with a url. Feel free to add additional processing here, + // but if you want the App API to support tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } + + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + // Called when the app was launched with an activity, including Universal Links. + // Feel free to add additional processing here, but if you want the App API to support + // tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } + +} diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard b/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e7ae5d7 --- /dev/null +++ b/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard b/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b44df7b --- /dev/null +++ b/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/Info.plist b/packages/browser-wallet-base/src/apple/iOS (App)/Info.plist new file mode 100644 index 0000000..364d0f3 --- /dev/null +++ b/packages/browser-wallet-base/src/apple/iOS (App)/Info.plist @@ -0,0 +1,8 @@ + + + + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json b/packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json new file mode 100644 index 0000000..67b3726 --- /dev/null +++ b/packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json @@ -0,0 +1,16 @@ +{ + "appId": "com.bitgreen.browser-wallet1", + "appName": "Bitgreen Wallet", + "server": { + "androidScheme": "https" + }, + "ios": { + "scrollEnabled": false, + "contentInset": "never" + }, + "plugins": { + "Keyboard": { + "resize": "none" + } + } +} diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/config.xml b/packages/browser-wallet-base/src/apple/iOS (App)/config.xml new file mode 100644 index 0000000..1b1b0e0 --- /dev/null +++ b/packages/browser-wallet-base/src/apple/iOS (App)/config.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova.js b/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova_plugins.js b/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova_plugins.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/browser-wallet-base/src/safari/iOS (Extension)/Info.plist b/packages/browser-wallet-base/src/apple/iOS (Extension)/Info.plist similarity index 100% rename from packages/browser-wallet-base/src/safari/iOS (Extension)/Info.plist rename to packages/browser-wallet-base/src/apple/iOS (Extension)/Info.plist diff --git a/packages/browser-wallet-base/src/safari/macOS (App)/AppDelegate.swift b/packages/browser-wallet-base/src/apple/macOS (App)/AppDelegate.swift similarity index 100% rename from packages/browser-wallet-base/src/safari/macOS (App)/AppDelegate.swift rename to packages/browser-wallet-base/src/apple/macOS (App)/AppDelegate.swift diff --git a/packages/browser-wallet-base/src/safari/macOS (App)/Base.lproj/Main.storyboard b/packages/browser-wallet-base/src/apple/macOS (App)/Base.lproj/Main.storyboard similarity index 100% rename from packages/browser-wallet-base/src/safari/macOS (App)/Base.lproj/Main.storyboard rename to packages/browser-wallet-base/src/apple/macOS (App)/Base.lproj/Main.storyboard diff --git a/packages/browser-wallet-base/src/safari/macOS (App)/BitgreenWallet.entitlements b/packages/browser-wallet-base/src/apple/macOS (App)/BitgreenWallet.entitlements similarity index 100% rename from packages/browser-wallet-base/src/safari/macOS (App)/BitgreenWallet.entitlements rename to packages/browser-wallet-base/src/apple/macOS (App)/BitgreenWallet.entitlements diff --git a/packages/browser-wallet-base/src/safari/macOS (App)/Info.plist b/packages/browser-wallet-base/src/apple/macOS (App)/Info.plist similarity index 100% rename from packages/browser-wallet-base/src/safari/macOS (App)/Info.plist rename to packages/browser-wallet-base/src/apple/macOS (App)/Info.plist diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Resources/icon.png b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/icon.png similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Resources/icon.png rename to packages/browser-wallet-base/src/apple/macOS (App)/Resources/icon.png diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Resources/main.html b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/main.html similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Resources/main.html rename to packages/browser-wallet-base/src/apple/macOS (App)/Resources/main.html diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Resources/script.js b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/script.js similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Resources/script.js rename to packages/browser-wallet-base/src/apple/macOS (App)/Resources/script.js diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/Resources/style.css b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/style.css similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/Resources/style.css rename to packages/browser-wallet-base/src/apple/macOS (App)/Resources/style.css diff --git a/packages/browser-wallet-base/src/safari/Shared (App)/ViewController.swift b/packages/browser-wallet-base/src/apple/macOS (App)/ViewController.swift similarity index 100% rename from packages/browser-wallet-base/src/safari/Shared (App)/ViewController.swift rename to packages/browser-wallet-base/src/apple/macOS (App)/ViewController.swift diff --git a/packages/browser-wallet-base/src/safari/macOS (Extension)/BitgreenWallet.entitlements b/packages/browser-wallet-base/src/apple/macOS (Extension)/BitgreenWallet.entitlements similarity index 100% rename from packages/browser-wallet-base/src/safari/macOS (Extension)/BitgreenWallet.entitlements rename to packages/browser-wallet-base/src/apple/macOS (Extension)/BitgreenWallet.entitlements diff --git a/packages/browser-wallet-base/src/safari/macOS (Extension)/Info.plist b/packages/browser-wallet-base/src/apple/macOS (Extension)/Info.plist similarity index 100% rename from packages/browser-wallet-base/src/safari/macOS (Extension)/Info.plist rename to packages/browser-wallet-base/src/apple/macOS (Extension)/Info.plist diff --git a/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/safari/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 8343ce3a7103e1fd213b7814709b525a37961fe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41520 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 g9J^MUQJPaav~+lB?!PoAF7Dq>-289 Bool { - // Override point for customization after application launch. - return true - } - - func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) - } - -} diff --git a/packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/LaunchScreen.storyboard b/packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 620a70c..0000000 --- a/packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/Main.storyboard b/packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/Main.storyboard deleted file mode 100644 index 618dfce..0000000 --- a/packages/browser-wallet-base/src/safari/iOS (App)/Base.lproj/Main.storyboard +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/safari/iOS (App)/Info.plist b/packages/browser-wallet-base/src/safari/iOS (App)/Info.plist deleted file mode 100644 index 066c461..0000000 --- a/packages/browser-wallet-base/src/safari/iOS (App)/Info.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SFSafariWebExtensionConverterVersion - 13.4.1 - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main - - - - - - diff --git a/packages/browser-wallet-base/src/safari/iOS (App)/SceneDelegate.swift b/packages/browser-wallet-base/src/safari/iOS (App)/SceneDelegate.swift deleted file mode 100644 index 6db82ef..0000000 --- a/packages/browser-wallet-base/src/safari/iOS (App)/SceneDelegate.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// SceneDelegate.swift -// iOS (App) -// -// Created by Samuele Landi on 04/07/2022. -// - -import UIKit - -class SceneDelegate: UIResponder, UIWindowSceneDelegate { - - var window: UIWindow? - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - guard let _ = (scene as? UIWindowScene) else { return } - } - -} From 58dd0b7ff1416bfa2090de48d707537ef31b6132 Mon Sep 17 00:00:00 2001 From: rappix Date: Sun, 30 Jul 2023 17:03:15 +0200 Subject: [PATCH 04/96] ios app --- packages/browser-wallet-base/public/app.html | 14 +++ packages/browser-wallet-base/src/app.js | 92 +++++++++--------- .../src/background/index.js | 35 ++++++- packages/browser-wallet-core/src/index.js | 2 +- .../browser-wallet-core/src/stores/base.js | 95 +++++++++++++++---- .../browser-wallet-core/src/stores/session.js | 90 ++++++++++++++---- 6 files changed, 239 insertions(+), 89 deletions(-) diff --git a/packages/browser-wallet-base/public/app.html b/packages/browser-wallet-base/public/app.html index e69de29..60965d7 100644 --- a/packages/browser-wallet-base/public/app.html +++ b/packages/browser-wallet-base/public/app.html @@ -0,0 +1,14 @@ + + + + + + + + + Bitgreen Wallet + + + + + \ No newline at end of file diff --git a/packages/browser-wallet-base/src/app.js b/packages/browser-wallet-base/src/app.js index c397d86..602b7f1 100644 --- a/packages/browser-wallet-base/src/app.js +++ b/packages/browser-wallet-base/src/app.js @@ -1,20 +1,15 @@ -import { databaseService } from '@bitgreen/browser-wallet-core' +import { databaseService, appMessageHandler } from '@bitgreen/browser-wallet-core' import userInterface from '@bitgreen/browser-wallet-ui' +import { Keyboard } from '@capacitor/keyboard'; +import { App } from '@capacitor/app'; + const db = new databaseService() const ui = new userInterface() -const extension = async() => { +async function extension() { await ui.initUi() - const params = new URLSearchParams(window.location.search) - - const command = params.has('command') ? params.get('command') : null - - if(command === 'new_wallet') { - return await ui.goToScreen('walletCreateScreen') - } - // Break if there is no wallet created/imported, and return to welcome screen. if(!await db.stores.wallets.exists()) { if(await db.stores.settings.asyncGet('skip_intro')) { @@ -24,43 +19,52 @@ const extension = async() => { } } - if(command === 'sign_in' && params.get('origin')) { - return await ui.goToScreen('signInScreen', { - message_id: params.get('id'), - tab_id: params.get('tab_id'), - domain: params.get('origin'), - title: params.get('title') - }) - } - - if(command === 'send') { - return await ui.goToScreen('assetSendScreen', { - message_id: params.get('id'), - tab_id: params.get('tab_id'), - kill_popup: params.get('kill_popup'), - amount: params.get('amount'), - recipient: params.get('recipient') - }) - } - - if(command === 'extrinsic') { - return await ui.goToScreen('extrinsicSendScreen', { - message_id: params.get('id'), - tab_id: params.get('tab_id'), - kill_popup: params.get('kill_popup'), - domain: params.get('domain'), - title: params.get('title'), - pallet: params.get('pallet'), - call: params.get('call'), - call_parameters: params.get('call_parameters') - }) - } - return await ui.goToScreen('dashboardScreen', { extend_delay: true }) } -document.addEventListener('deviceready', async function () { +document.addEventListener('deviceready', async() => { await extension() -}) \ No newline at end of file + + App.addListener('appStateChange', async({ isActive }) => { + if(isActive) { + ui.hideInit(true) + } else { + ui.showInit(true) + + await Keyboard.hide() + + // reset body + document.body.style.height = ''; + document.body.classList.remove('keyboard-opened') + } + }); + + Keyboard.addListener('keyboardWillShow', info => { + const bodyHeight = window.innerHeight - info.keyboardHeight + + // update body height and add class + document.body.style.height = bodyHeight + 'px'; + document.body.classList.add('keyboard-opened') + + ui.disableFooter() + }); + + Keyboard.addListener('keyboardWillHide', info => { + // reset body + document.body.style.height = ''; + document.body.classList.remove('keyboard-opened') + + ui.enableFooter() + }); +}, false) + +// request message +window.addEventListener('message', async(event) => { + const data = event.data; + + if(data.source !== 'ui') return false + + return appMessageHandler(data) +}); \ No newline at end of file diff --git a/packages/browser-wallet-core/src/background/index.js b/packages/browser-wallet-core/src/background/index.js index 433df7f..a9eb173 100644 --- a/packages/browser-wallet-core/src/background/index.js +++ b/packages/browser-wallet-core/src/background/index.js @@ -1,14 +1,42 @@ import Extension from './extension.js' import Tabs from './tabs.js' -import {isFirefox, isIOs, isIPad, isMacOs, isSafari} from "@bitgreen/browser-wallet-utils"; - -const current_browser = (isFirefox() || isSafari()) ? browser : chrome +import { + customReviver, + getCurrentBrowser, + isFirefox, + isIOs, + isIPad, + isMacOs, + isSafari +} from "@bitgreen/browser-wallet-utils"; + +const current_browser = getCurrentBrowser() const extension = new Extension() const tabs = new Tabs() let opened_tabs = [] +const appMessageHandler = (data) => { + let promise = extension.handle(data); + + if(!promise) { + return false + } + + promise.then((response) => { + // return response to frontend + window.postMessage({ + source: 'bg', + id: data.id, + response: JSON.stringify(response) + }); + }).catch((error) => { + console.error(error); + window.postMessage({ error: error.message, errorCode: error.code, errorData: error.data, id: data.id }); + }); +} + const backgroundMessageHandler = (data, port) => { const isExtension = port.name === 'PORT_EXTENSION' const isContent = port.name === 'PORT_CONTENT' @@ -161,6 +189,7 @@ if(isSafari()) { } export { + appMessageHandler, backgroundMessageHandler, showPopup, getCurrentTabId, diff --git a/packages/browser-wallet-core/src/index.js b/packages/browser-wallet-core/src/index.js index f12e897..51aa095 100644 --- a/packages/browser-wallet-core/src/index.js +++ b/packages/browser-wallet-core/src/index.js @@ -1,6 +1,6 @@ export { AccountStore, SettingsStore, WalletStore, NetworkStore, TransactionStore, AssetStore, TokenStore, CacheStore } from './stores/index.js'; -export { backgroundMessageHandler, findTab } from './background/index.js' +export { appMessageHandler, backgroundMessageHandler, findTab } from './background/index.js' export { polkadotApi } from './polkadotApi.js' diff --git a/packages/browser-wallet-core/src/stores/base.js b/packages/browser-wallet-core/src/stores/base.js index cf5077a..565b080 100644 --- a/packages/browser-wallet-core/src/stores/base.js +++ b/packages/browser-wallet-core/src/stores/base.js @@ -1,6 +1,14 @@ -import {isFirefox, isIOs, isSafari} from "@bitgreen/browser-wallet-utils"; - -const current_browser = (isFirefox() || isSafari()) ? browser : chrome +import { + customReviver, + getCurrentBrowser, + isFirefox, + isIOs, + isSafari, + isStandaloneApp +} from "@bitgreen/browser-wallet-utils"; +import BigNumber from "bignumber.js"; + +const current_browser = getCurrentBrowser() class BaseStore { #prefix = ''; @@ -12,11 +20,23 @@ class BaseStore { get(_key, update) { const key = `${this.#prefix}${_key.toLowerCase()}`; - current_browser.storage.local.get([key], (result) => { - lastError('get'); + if(isStandaloneApp()) { + let value - update(result[key]); - }); + try { + value = JSON.parse(localStorage.getItem(key), customReviver) + } catch (e) { + value = localStorage.getItem(key) + } + + update(value) + } else { + current_browser.storage.local.get([key], (result) => { + lastError('get'); + + update(result[key]); + }); + } } async asyncGet(_key) { @@ -28,21 +48,33 @@ class BaseStore { remove(_key, update) { const key = `${this.#prefix}${_key.toLowerCase()}`; - current_browser.storage.local.remove(key, () => { - lastError('remove'); + if(isStandaloneApp()) { + localStorage.removeItem(key); - update && update(); - }); + update && update() + } else { + current_browser.storage.local.remove(key, () => { + lastError('remove'); + + update && update(); + }); + } } set(_key, value, update) { const key = `${this.#prefix}${_key.toLowerCase()}`; - current_browser.storage.local.set({ [key]: value }, () => { - lastError('set'); + if(isStandaloneApp()) { + localStorage.setItem(key, JSON.stringify(value)); update && update(); - }); + } else { + current_browser.storage.local.set({ [key]: value }, () => { + lastError('set'); + + update && update(); + }); + } } async asyncSet(_key, value) { @@ -70,14 +102,18 @@ class BaseStore { } allMap(update) { - current_browser.storage.local.get(null, (result) => { - lastError('all'); - - const entries = Object.entries(result); + if(isStandaloneApp()) { const map = {}; - for(let i = 0; i < entries.length; i++) { - const [key, value] = entries[i]; + for(let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + let value + + try { + value = JSON.parse(localStorage.getItem(key), customReviver) + } catch (e) { + value = localStorage.getItem(key) + } if(key.startsWith(this.#prefix)) { map[key.replace(this.#prefix, '')] = value; @@ -85,7 +121,24 @@ class BaseStore { } update(map); - }); + } else { + current_browser.storage.local.get(null, (result) => { + lastError('all'); + + const entries = Object.entries(result); + const map = {}; + + for(let i = 0; i < entries.length; i++) { + const [key, value] = entries[i]; + + if(key.startsWith(this.#prefix)) { + map[key.replace(this.#prefix, '')] = value; + } + } + + update(map); + }); + } } async asyncAllMap() { diff --git a/packages/browser-wallet-core/src/stores/session.js b/packages/browser-wallet-core/src/stores/session.js index 4496d6f..d969728 100644 --- a/packages/browser-wallet-core/src/stores/session.js +++ b/packages/browser-wallet-core/src/stores/session.js @@ -1,7 +1,14 @@ import BaseStore from "./base.js"; -import {isFirefox, isIOs, isSafari} from "@bitgreen/browser-wallet-utils"; +import { + customReviver, + getCurrentBrowser, + isFirefox, + isIOs, + isSafari, + isStandaloneApp +} from "@bitgreen/browser-wallet-utils"; -const current_browser = (isFirefox() || isSafari()) ? browser : chrome +const current_browser = getCurrentBrowser() class SessionStore extends BaseStore { constructor() { @@ -11,48 +18,91 @@ class SessionStore extends BaseStore { get(_key, update) { const key = `${_key}`; - current_browser.storage.session.get([key], (result) => { - lastError('get'); + if(isStandaloneApp()) { + let value - update(result[key]); - }); + try { + value = JSON.parse(sessionStorage.getItem(key), customReviver) + } catch (e) { + value = sessionStorage.getItem(key) + } + + update(value) + } else { + current_browser.storage.session.get([key], (result) => { + lastError('get'); + + update(result[key]); + }); + } } remove(_key, update) { const key = `${_key}`; - current_browser.storage.session.remove(key, () => { - lastError('remove'); + if(isStandaloneApp()) { + sessionStorage.removeItem(key); - update && update(); - }); + update && update() + } else { + current_browser.storage.session.remove(key, () => { + lastError('remove'); + + update && update(); + }); + } } set(_key, value, update) { const key = `${_key}`; - current_browser.storage.session.set({ [key]: value }, () => { - lastError('set'); + if(isStandaloneApp()) { + sessionStorage.setItem(key, JSON.stringify(value)); update && update(); - }); + } else { + current_browser.storage.session.set({ [key]: value }, () => { + lastError('set'); + + update && update(); + }); + } } allMap(update) { - current_browser.storage.session.get(null, (result) => { - lastError('all'); - - const entries = Object.entries(result); + if(isStandaloneApp()) { const map = {}; - for(let i = 0; i < entries.length; i++) { - const [key, value] = entries[i]; + for(let i = 0; i < sessionStorage.length; i++) { + const key = sessionStorage.key(i); + let value + + try { + value = JSON.parse(localStorage.getItem(key), customReviver) + } catch (e) { + value = localStorage.getItem(key) + } map[key] = value; } update(map); - }); + } else { + current_browser.storage.session.get(null, (result) => { + lastError('all'); + + const entries = Object.entries(result); + const map = {}; + + for(let i = 0; i < entries.length; i++) { + const [key, value] = entries[i]; + + map[key] = value; + } + + update(map); + }); + } } } From 6a6a59b990fed08d482065a46f2f933783f22a6f Mon Sep 17 00:00:00 2001 From: rappix Date: Sun, 30 Jul 2023 17:05:53 +0200 Subject: [PATCH 05/96] ios app build scripts --- buildDistribution.sh | 4 +- package-lock.json | 1532 ++++++++++++++++- package.json | 12 +- .../browser-wallet-base/webpack.shared.cjs | 22 +- 4 files changed, 1519 insertions(+), 51 deletions(-) diff --git a/buildDistribution.sh b/buildDistribution.sh index f0deb67..42a0852 100644 --- a/buildDistribution.sh +++ b/buildDistribution.sh @@ -7,7 +7,7 @@ cd build/chrome/ zip -r ../../dist/chrome.zip . cd ../firefox/ zip -r ../../dist/firefox.zip . -cd ../safari/ -zip -r ../../dist/safari.zip . +cd ../apple/ +zip -r ../../dist/apple.zip . ## TODO Create a zip file of relevant source. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 98039d7..71ada8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,30 @@ { "name": "bitgreen-browser-wallet", - "version": "1.0.1", + "version": "1.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bitgreen-browser-wallet", - "version": "1.0.1", + "version": "1.2.0", "license": "GPL-3.0-or-later", "workspaces": [ "packages/*" ], "dependencies": { "@bitgreen/browser-wallet-base": "^1.0.0", + "@capacitor/app": "^5.0.6", + "@capacitor/core": "^5.2.2", + "@capacitor/ios": "^5.2.2", + "@capacitor/keyboard": "^5.0.6", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", "@polkadot/util": "^10.1.11", "@polkadot/util-crypto": "^10.1.11" + }, + "devDependencies": { + "@capacitor/cli": "^5.2.2" } }, "node_modules/@babel/runtime": { @@ -47,6 +54,79 @@ "resolved": "packages/browser-wallet-utils", "link": true }, + "node_modules/@capacitor/app": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.6.tgz", + "integrity": "sha512-6ZXVdnNmaYILasC/RjQw+yfTmq2ZO7Q3v5lFcDVfq3PFGnybyYQh+RstBrYri+376OmXOXxBD7E6UxBhrMzXGA==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.2.2.tgz", + "integrity": "sha512-h/cefX3sefLcmd4VI2h+fNIYKWH1QCUACWAH8bkdJ+aEL+x2xYbGlqeW6Belb3E2Uvu9OA+cz7YVDnNRcjyQyw==", + "dev": true, + "dependencies": { + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-subprocess": "^2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", + "env-paths": "^2.2.0", + "kleur": "^4.1.4", + "native-run": "^1.7.2", + "open": "^8.4.0", + "plist": "^3.0.5", + "prompts": "^2.4.2", + "rimraf": "^4.4.1", + "semver": "^7.3.7", + "tar": "^6.1.11", + "tslib": "^2.4.0", + "xml2js": "^0.5.0" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@capacitor/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@capacitor/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.2.2.tgz", + "integrity": "sha512-3jKECZC5+YD2rljMZm1e/K3AYyoxUmLDZCyofTPbRYPBSI0wJh5ZCkX+XIGzNM0o/Wokl3Voa1JB8xsLC0MPxA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/ios": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.2.2.tgz", + "integrity": "sha512-6nNhB+G9tamJFMdvPOIATEPIXlh3GNXMq8eeY3xrFO72bBTmQpXdbDQmMJeBbpVlkEnFoVUXiSxAu6O0E9x9Lw==", + "peerDependencies": { + "@capacitor/core": "^5.2.0" + } + }, + "node_modules/@capacitor/keyboard": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz", + "integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -56,6 +136,159 @@ "node": ">=10.0.0" } }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.6.tgz", + "integrity": "sha512-YLPRwnk5Lw0XQ9pKWG+p2KoR5HjMBigZ6yv+/XtL3TGOnCS1+oAz56ABbAORCjTWhSJQisr8APNFiELAecY6QA==", + "dev": true, + "dependencies": { + "@ionic/utils-terminal": "2.3.4", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", + "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", + "dev": true, + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.4", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", + "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.12.tgz", + "integrity": "sha512-N05Y+dIXBHofKWJTheCMzVqmgY9wFmZcRv/LdNnfXaaA/mxLTyGxQYeig8fvQXTtDafb/siZXcrTkmQ+y6n3Yg==", + "dev": true, + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.11", + "@ionic/utils-stream": "3.1.6", + "@ionic/utils-terminal": "2.3.4", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jest/schemas": { "version": "29.0.0", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", @@ -772,6 +1005,15 @@ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, + "node_modules/@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -822,6 +1064,12 @@ "form-data": "^3.0.0" } }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true + }, "node_modules/@types/websocket": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", @@ -1027,6 +1275,15 @@ } } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -1155,11 +1412,35 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1180,6 +1461,15 @@ } ] }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bignumber.js": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", @@ -1217,6 +1507,27 @@ "@popperjs/core": "^2.11.6" } }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -1351,6 +1662,15 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1463,6 +1783,15 @@ "node": ">=8" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -1968,6 +2297,15 @@ "node": ">=0.10.0" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2113,6 +2451,18 @@ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -2166,6 +2516,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -2364,6 +2723,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -2434,6 +2802,51 @@ "node": ">=12.20.0" } }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2691,6 +3104,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -2712,6 +3134,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2767,6 +3204,18 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2845,6 +3294,18 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2854,6 +3315,15 @@ "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/lilconfig": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", @@ -3035,6 +3505,52 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, + "node_modules/minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mock-socket": { "version": "9.1.5", "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", @@ -3060,6 +3576,31 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/native-run": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.2.tgz", + "integrity": "sha512-2aahC8iXIO8BcvEukVMrYwL5sXurkuIGyQgfSGBto832W6ejV+cB5Ww+2/CRxmyozhbxARJ2OMpEGPV8sTqsrQ==", + "dev": true, + "dependencies": { + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-terminal": "^2.3.3", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^3.0.1", + "plist": "^3.0.6", + "split2": "^4.1.0", + "through2": "^4.0.2", + "tslib": "^2.4.0", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=12.13.0" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -3179,6 +3720,23 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -3285,6 +3843,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3310,6 +3893,12 @@ "node": ">=0.12" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3340,6 +3929,20 @@ "node": ">=8" } }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", @@ -3874,6 +4477,28 @@ "node": ">= 0.6.0" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/propagate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", @@ -4090,6 +4715,66 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -4157,6 +4842,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, "node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -4177,9 +4868,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4251,6 +4942,12 @@ "node": ">=8" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -4263,6 +4960,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/sortablejs": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", @@ -4296,6 +5010,15 @@ "source-map": "^0.6.0" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -4440,6 +5163,32 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", @@ -4561,6 +5310,15 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4578,6 +5336,15 @@ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", @@ -4601,6 +5368,24 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -5006,6 +5791,37 @@ } } }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -5076,9 +5892,19 @@ "node": ">=6" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "packages/browser-wallet-base": { "name": "@bitgreen/browser-wallet-base", - "version": "1.1.10", + "version": "1.2.0", "license": "GPL-3.0-or-later", "dependencies": { "@bitgreen/browser-wallet-core": "^1.0.0", @@ -5112,7 +5938,7 @@ }, "packages/browser-wallet-core": { "name": "@bitgreen/browser-wallet-core", - "version": "1.1.10", + "version": "1.2.0", "license": "GPL-3.0-or-later", "dependencies": { "@bitgreen/browser-wallet-utils": "^1.0.0", @@ -5122,7 +5948,7 @@ }, "packages/browser-wallet-ui": { "name": "@bitgreen/browser-wallet-ui", - "version": "1.1.10", + "version": "1.2.0", "license": "GPL-3.0-or-later", "dependencies": { "@bitgreen/browser-wallet-utils": "^1.0.0", @@ -5137,7 +5963,7 @@ }, "packages/browser-wallet-utils": { "name": "@bitgreen/browser-wallet-utils", - "version": "1.1.10", + "version": "1.2.0", "license": "GPL-3.0-or-later", "dependencies": { "@polkadot/util": "^10.2.1", @@ -5185,40 +6011,226 @@ "webpack-extension-manifest-plugin": "^0.8.0" } }, - "@bitgreen/browser-wallet-core": { - "version": "file:packages/browser-wallet-core", + "@bitgreen/browser-wallet-core": { + "version": "file:packages/browser-wallet-core", + "requires": { + "@bitgreen/browser-wallet-utils": "^1.0.0", + "aes-js": "^3.1.2", + "eventemitter3": "^4.0.7" + } + }, + "@bitgreen/browser-wallet-ui": { + "version": "file:packages/browser-wallet-ui", + "requires": { + "@bitgreen/browser-wallet-utils": "^1.0.0", + "animejs": "^3.2.1", + "bootstrap": "^5.2.2", + "dompurify": "^2.4.1", + "jdenticon": "^3.2.0", + "qrcode": "^1.5.1", + "sortablejs": "^1.15.0", + "toastify-js": "^1.12.0" + } + }, + "@bitgreen/browser-wallet-utils": { + "version": "file:packages/browser-wallet-utils", + "requires": { + "@polkadot/util": "^10.2.1", + "@polkadot/util-crypto": "^10.2.1", + "bignumber.js": "^9.1.1" + } + }, + "@capacitor/app": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.6.tgz", + "integrity": "sha512-6ZXVdnNmaYILasC/RjQw+yfTmq2ZO7Q3v5lFcDVfq3PFGnybyYQh+RstBrYri+376OmXOXxBD7E6UxBhrMzXGA==", + "requires": {} + }, + "@capacitor/cli": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.2.2.tgz", + "integrity": "sha512-h/cefX3sefLcmd4VI2h+fNIYKWH1QCUACWAH8bkdJ+aEL+x2xYbGlqeW6Belb3E2Uvu9OA+cz7YVDnNRcjyQyw==", + "dev": true, + "requires": { + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-subprocess": "^2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", + "env-paths": "^2.2.0", + "kleur": "^4.1.4", + "native-run": "^1.7.2", + "open": "^8.4.0", + "plist": "^3.0.5", + "prompts": "^2.4.2", + "rimraf": "^4.4.1", + "semver": "^7.3.7", + "tar": "^6.1.11", + "tslib": "^2.4.0", + "xml2js": "^0.5.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + } + } + }, + "@capacitor/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.2.2.tgz", + "integrity": "sha512-3jKECZC5+YD2rljMZm1e/K3AYyoxUmLDZCyofTPbRYPBSI0wJh5ZCkX+XIGzNM0o/Wokl3Voa1JB8xsLC0MPxA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@capacitor/ios": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.2.2.tgz", + "integrity": "sha512-6nNhB+G9tamJFMdvPOIATEPIXlh3GNXMq8eeY3xrFO72bBTmQpXdbDQmMJeBbpVlkEnFoVUXiSxAu6O0E9x9Lw==", + "requires": {} + }, + "@capacitor/keyboard": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz", + "integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==", + "requires": {} + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@ionic/cli-framework-output": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.6.tgz", + "integrity": "sha512-YLPRwnk5Lw0XQ9pKWG+p2KoR5HjMBigZ6yv+/XtL3TGOnCS1+oAz56ABbAORCjTWhSJQisr8APNFiELAecY6QA==", + "dev": true, + "requires": { + "@ionic/utils-terminal": "2.3.4", + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, + "requires": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "dev": true, "requires": { - "@bitgreen/browser-wallet-utils": "^1.0.0", - "aes-js": "^3.1.2", - "eventemitter3": "^4.0.7" + "debug": "^4.0.0", + "tslib": "^2.0.1" } }, - "@bitgreen/browser-wallet-ui": { - "version": "file:packages/browser-wallet-ui", + "@ionic/utils-process": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", + "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", + "dev": true, "requires": { - "@bitgreen/browser-wallet-utils": "^1.0.0", - "animejs": "^3.2.1", - "bootstrap": "^5.2.2", - "dompurify": "^2.4.1", - "jdenticon": "^3.2.0", - "qrcode": "^1.5.1", - "sortablejs": "^1.15.0", - "toastify-js": "^1.12.0" + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.4", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + } } }, - "@bitgreen/browser-wallet-utils": { - "version": "file:packages/browser-wallet-utils", + "@ionic/utils-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", + "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", + "dev": true, "requires": { - "@polkadot/util": "^10.2.1", - "@polkadot/util-crypto": "^10.2.1", - "bignumber.js": "^9.1.1" + "debug": "^4.0.0", + "tslib": "^2.0.1" } }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true + "@ionic/utils-subprocess": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.12.tgz", + "integrity": "sha512-N05Y+dIXBHofKWJTheCMzVqmgY9wFmZcRv/LdNnfXaaA/mxLTyGxQYeig8fvQXTtDafb/siZXcrTkmQ+y6n3Yg==", + "dev": true, + "requires": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.11", + "@ionic/utils-stream": "3.1.6", + "@ionic/utils-terminal": "2.3.4", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "dev": true, + "requires": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } }, "@jest/schemas": { "version": "29.0.0", @@ -5769,6 +6781,15 @@ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, + "@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -5819,6 +6840,12 @@ "form-data": "^3.0.0" } }, + "@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true + }, "@types/websocket": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", @@ -6011,6 +7038,12 @@ "dev": true, "requires": {} }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -6109,17 +7142,41 @@ } } }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "bignumber.js": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", @@ -6142,6 +7199,24 @@ "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "requires": {} }, + "bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "requires": { + "big-integer": "1.6.x" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -6243,6 +7318,12 @@ "ieee754": "^1.2.1" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -6331,6 +7412,12 @@ } } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -6686,6 +7773,12 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6809,6 +7902,15 @@ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "requires": { + "sax": "1.1.4" + } + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -6858,6 +7960,12 @@ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -7025,6 +8133,15 @@ "reusify": "^1.0.4" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -7070,6 +8187,44 @@ "fetch-blob": "^3.1.2" } }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7249,6 +8404,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true + }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -7264,6 +8425,12 @@ "has": "^1.0.3" } }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7304,6 +8471,15 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7367,12 +8543,28 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, "lilconfig": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", @@ -7519,6 +8711,39 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, + "minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "mock-socket": { "version": "9.1.5", "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", @@ -7535,6 +8760,25 @@ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, + "native-run": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.2.tgz", + "integrity": "sha512-2aahC8iXIO8BcvEukVMrYwL5sXurkuIGyQgfSGBto832W6ejV+cB5Ww+2/CRxmyozhbxARJ2OMpEGPV8sTqsrQ==", + "dev": true, + "requires": { + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-terminal": "^2.3.3", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^3.0.1", + "plist": "^3.0.6", + "split2": "^4.1.0", + "through2": "^4.0.2", + "tslib": "^2.4.0", + "yauzl": "^2.10.0" + } + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -7614,6 +8858,17 @@ "boolbase": "^1.0.0" } }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -7702,6 +8957,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true + } + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -7721,6 +8994,12 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -7742,6 +9021,17 @@ "find-up": "^4.0.0" } }, + "plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, "pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", @@ -8077,6 +9367,24 @@ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "dependencies": { + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + } + } + }, "propagate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", @@ -8238,6 +9546,44 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "requires": { + "glob": "^9.2.0" + }, + "dependencies": { + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true + } + } + }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -8277,6 +9623,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -8290,9 +9642,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8346,12 +9698,29 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, "sortablejs": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", @@ -8379,6 +9748,12 @@ "source-map": "^0.6.0" } }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true + }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -8488,6 +9863,28 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + } + } + }, "terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", @@ -8570,6 +9967,15 @@ } } }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8584,6 +9990,12 @@ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, "tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", @@ -8607,6 +10019,18 @@ "is-typedarray": "^1.0.0" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -8888,6 +10312,30 @@ "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", "requires": {} }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -8942,6 +10390,16 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } diff --git a/package.json b/package.json index f1fda8b..3c63f69 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,13 @@ "packages/*" ], "scripts": { - "build": "npm run build:chrome && npm run build:firefox && npm run build:safari", + "build": "npm run build:chrome && npm run build:firefox && npm run build:apple", "build:all": "npm run build", "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production", "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production", "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production", - "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production", + "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd build/apple && pod install", + "build:apple": "npm run build:safari && npm run build:ios", "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development --watch ", "dev:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development --watch", "dev:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development --watch", @@ -37,10 +38,17 @@ }, "dependencies": { "@bitgreen/browser-wallet-base": "^1.0.0", + "@capacitor/app": "^5.0.6", + "@capacitor/core": "^5.2.2", + "@capacitor/ios": "^5.2.2", + "@capacitor/keyboard": "^5.0.6", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", "@polkadot/util": "^10.1.11", "@polkadot/util-crypto": "^10.1.11" + }, + "devDependencies": { + "@capacitor/cli": "^5.2.2" } } diff --git a/packages/browser-wallet-base/webpack.shared.cjs b/packages/browser-wallet-base/webpack.shared.cjs index c1e4a13..7a98c39 100644 --- a/packages/browser-wallet-base/webpack.shared.cjs +++ b/packages/browser-wallet-base/webpack.shared.cjs @@ -57,7 +57,8 @@ module.exports = ( 'process.env': { NODE_ENV: JSON.stringify(mode), PKG_NAME: JSON.stringify(pkgJson.name), - PKG_VERSION: JSON.stringify(pkgJson.version) + PKG_VERSION: JSON.stringify(pkgJson.version), + PLATFORM: JSON.stringify(platform) } }), new CopyPlugin({ @@ -80,13 +81,13 @@ module.exports = ( new MiniCssExtractPlugin() ] - if (useSplitChunk) { + if (useSplitChunk) { if(platform === 'ios') { plugins.push( new HtmlWebpackPlugin({ filename: "index.html", template: "public/app.html", - chunks: ["app"], + chunks: ["app"] }) ); } else { @@ -94,11 +95,12 @@ module.exports = ( new HtmlWebpackPlugin({ filename: "index.html", template: "public/index.html", - chunks: ["extension"], + chunks: ["extension"] }) ); } - } + } + if(platform !== 'ios') { plugins.push(new ManifestPlugin({ config: { @@ -114,7 +116,7 @@ module.exports = ( // copy necessary files plugins.push(new CopyPlugin({ patterns: [{ - from: 'src/safari', + from: 'src/apple', to: '../', noErrorOnMissing: true }] @@ -128,10 +130,10 @@ module.exports = ( })) // change output directory - output_dir = path.join(__dirname, `../../build/safari/Shared (Extension)`) + output_dir = path.join(__dirname, `../../build/apple/Shared (Extension)`) } else if(platform === 'ios') { // change output directory - output_dir = path.join(__dirname, `../../build/safari/Shared (App)/Resources`) + output_dir = path.join(__dirname, `../../build/apple/iOS (App)/public`) } else { plugins.push(new CopyPlugin({ patterns: [{ @@ -208,7 +210,7 @@ module.exports = ( result.optimization = { splitChunks: { chunks: "all", - maxSize: 2000000, + maxSize: 6000000, cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, @@ -232,4 +234,4 @@ module.exports = ( result.optimization.minimizer = [new CssMinimizerPlugin()]; return result; -}; +}; \ No newline at end of file From 40aedda357282de88811b46c0ff145649c5b38a4 Mon Sep 17 00:00:00 2001 From: rappix Date: Sun, 30 Jul 2023 21:00:27 +0200 Subject: [PATCH 06/96] ui adjustments for the app --- .../browser-wallet-base/src/background.js | 4 +- packages/browser-wallet-base/src/content.js | 8 +- .../src/components/asset/send.html | 4 +- .../src/components/login.html | 2 +- .../src/components/welcome.html | 2 +- packages/browser-wallet-ui/src/index.js | 114 +++++++---- packages/browser-wallet-ui/src/messaging.js | 76 ++++++-- packages/browser-wallet-ui/src/screens.js | 12 +- .../src/screens/dashboard.js | 1 + .../browser-wallet-ui/src/screens/index.js | 63 ++++-- .../browser-wallet-ui/src/screens/settings.js | 4 +- .../src/screens/stakingCollator.js | 1 + .../browser-wallet-ui/src/screens/welcome.js | 54 +++--- packages/browser-wallet-ui/src/styles/ios.css | 181 ++++++++++++------ .../browser-wallet-ui/src/styles/main.css | 30 ++- packages/browser-wallet-utils/src/index.js | 29 ++- 16 files changed, 399 insertions(+), 186 deletions(-) diff --git a/packages/browser-wallet-base/src/background.js b/packages/browser-wallet-base/src/background.js index 83cb869..cf2d3d4 100644 --- a/packages/browser-wallet-base/src/background.js +++ b/packages/browser-wallet-base/src/background.js @@ -1,10 +1,10 @@ import { backgroundMessageHandler, findTab, polkadotApi, idleTime, reconnectTime } from '@bitgreen/browser-wallet-core' -import { isFirefox, isIOs, isSafari } from "@bitgreen/browser-wallet-utils"; +import {getCurrentBrowser, isFirefox, isIOs, isSafari} from "@bitgreen/browser-wallet-utils"; let waiting_to_stop = false let openCount = 0; -const current_browser = (isFirefox() || isSafari()) ? browser : chrome +const current_browser = getCurrentBrowser() let ports_extension = [] let port_content = null diff --git a/packages/browser-wallet-base/src/content.js b/packages/browser-wallet-base/src/content.js index fa75164..e31bf97 100644 --- a/packages/browser-wallet-base/src/content.js +++ b/packages/browser-wallet-base/src/content.js @@ -1,10 +1,6 @@ -import { extractGlobal, xglobal } from '@polkadot/x-global'; -import {isFirefox, isIOs, isSafari} from "@bitgreen/browser-wallet-utils"; +import {getCurrentBrowser} from "@bitgreen/browser-wallet-utils"; -const chrome = extractGlobal('chrome', xglobal.browser); -const browser = extractGlobal('browser', xglobal.browser); - -const current_browser = (isFirefox() || isSafari()) ? browser : chrome +const current_browser = getCurrentBrowser() let port_content function connectContent() { diff --git a/packages/browser-wallet-ui/src/components/asset/send.html b/packages/browser-wallet-ui/src/components/asset/send.html index e565e75..7cd67eb 100644 --- a/packages/browser-wallet-ui/src/components/asset/send.html +++ b/packages/browser-wallet-ui/src/components/asset/send.html @@ -20,14 +20,14 @@

- +
=
- +
diff --git a/packages/browser-wallet-ui/src/components/login.html b/packages/browser-wallet-ui/src/components/login.html index 424d7ad..d2bdb56 100644 --- a/packages/browser-wallet-ui/src/components/login.html +++ b/packages/browser-wallet-ui/src/components/login.html @@ -17,7 +17,7 @@ fill="white"/>
-
BROWSER WALLET
+
${wallet_title}
-
+
Not KYC Verified
Details
diff --git a/packages/browser-wallet-ui/src/components/dashboard/heading.html b/packages/browser-wallet-ui/src/components/dashboard/heading.html index 7078e48..0be4e81 100644 --- a/packages/browser-wallet-ui/src/components/dashboard/heading.html +++ b/packages/browser-wallet-ui/src/components/dashboard/heading.html @@ -1,4 +1,4 @@ -
+

Portfolio

diff --git a/packages/browser-wallet-ui/src/components/shared/header.html b/packages/browser-wallet-ui/src/components/shared/header.html index 9366eae..33ca87e 100644 --- a/packages/browser-wallet-ui/src/components/shared/header.html +++ b/packages/browser-wallet-ui/src/components/shared/header.html @@ -27,7 +27,7 @@
-
+
diff --git a/packages/browser-wallet-ui/src/index.js b/packages/browser-wallet-ui/src/index.js index 660543e..1c09742 100644 --- a/packages/browser-wallet-ui/src/index.js +++ b/packages/browser-wallet-ui/src/index.js @@ -28,11 +28,10 @@ import {Tooltip} from 'bootstrap' /* import stores */ import { databaseService } from "@bitgreen/browser-wallet-core"; -/* import all css files */ -import './styles/main.css' -import './styles/app.css' -import './styles/icomoon.css' -import 'bootstrap/dist/css/bootstrap.css' +/* import styles */ +import './scss/styles.scss' + +/* import utilitis */ import {formatAddress, isIOs, isStandaloneApp} from "@bitgreen/browser-wallet-utils"; class userInterface { diff --git a/packages/browser-wallet-ui/src/notifications.js b/packages/browser-wallet-ui/src/notifications.js index ebe3caf..8fc46bd 100644 --- a/packages/browser-wallet-ui/src/notifications.js +++ b/packages/browser-wallet-ui/src/notifications.js @@ -1,5 +1,4 @@ import Toastify from 'toastify-js' -import 'toastify-js/src/toastify.css' let notification const showNotification = async(message, type, duration = 2000, offset = 40) => { diff --git a/packages/browser-wallet-ui/src/screens.js b/packages/browser-wallet-ui/src/screens.js index d2c93be..1842d50 100644 --- a/packages/browser-wallet-ui/src/screens.js +++ b/packages/browser-wallet-ui/src/screens.js @@ -44,7 +44,7 @@ const interpolate = (template_data, params) => { } const updateElement = async(element, template_name = 'false', params = {}, append = true) => { - const template_data = template_name !== '' ? await renderTemplate(template_name, params) : '' + const template_data = template_name !== '' ? await renderTemplate(template_name, params) : ''; let el = document.querySelector('#root') // default element if(element === 'body') { @@ -79,7 +79,6 @@ const updateElement = async(element, template_name = 'false', params = {}, appen el.innerHTML = template_data } - return true } diff --git a/packages/browser-wallet-ui/src/scss/_alert.scss b/packages/browser-wallet-ui/src/scss/_alert.scss new file mode 100644 index 0000000..7272a3d --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_alert.scss @@ -0,0 +1,91 @@ +.alert { + padding: 0; + margin-bottom: 8px; + + &.alert-info { + background-color: $colorWhite; + border-color: $colorTealLight; + color: $colorBlueDark; + + .icon { + background-color: $colorTealLight; + } + } + &.alert-danger { + background-color: $colorWhite; + border-color: $colorBurntOrange; + color: $colorBurntOrange; + + .icon { + background-color: $colorBurntOrange; + } + .close-alert { + color: $colorAlertDanger; + + &:hover, + &:focus, + &:active { + color: $colorBurntOrange; + } + } + } + &.alert-warning { + background-color: $colorWhite; + border-color: $colorAlertWarning; + color: $colorAlertWarning; + + .icon { + background-color: $colorAlertWarning; + } + .close-alert { + color: $colorAlertWarning1; + + &:hover, + &:focus, + &:active { + color: $colorAlertWarning; + } + } + } + &.alert-danger-transparent { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.4); + color: $colorWhite; + + .icon { + background-color: rgba(255, 255, 255, 0.4); + color: $colorDanger2; + } + } + &.alert-info-transparent { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.4); + color: $colorWhite; + } + &.alert-dismissible { + padding-right: 8px !important; + } + + .icon { + width: 60px; + color: $colorWhite; + text-align: center; + + .icon-small { + font-size: 20px !important; + } + span { + width: 100%; + font-size: 26px; + } + } + .close-alert { + position: absolute; + top: 0; + right: 0; + padding: 6px; + font-size: 12px; + + transition: all linear 0.2s; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_android.scss b/packages/browser-wallet-ui/src/scss/_android.scss new file mode 100644 index 0000000..cbda05e --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_android.scss @@ -0,0 +1,6 @@ +body.android { + #bordered_content { + padding: 16px 16px 94px; + height: calc(100% - 124px); + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_animation.scss b/packages/browser-wallet-ui/src/scss/_animation.scss new file mode 100644 index 0000000..b57cedc --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_animation.scss @@ -0,0 +1,36 @@ +.animated { + transition: all linear 0.2s; +} + +@keyframes beat-fade { + 0%, to { + color: $colorWhite; + fill: $colorWhite; + transform: scale(1) + } + 50% { + color: $colorLightestGray; + fill: $colorLightestGray; + transform: scale(1.125) + } +} +@keyframes beat-text-fade { + 0%, to { + color: $colorLightGray; + fill: $colorLightGray; + } + 50% { + color: $colorWhite; + fill: $colorWhite; + } +} +@keyframes dash { + to { + stroke-dashoffset: 1000; + } +} + +@keyframes rotation { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_app.scss b/packages/browser-wallet-ui/src/scss/_app.scss new file mode 100644 index 0000000..e978e33 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_app.scss @@ -0,0 +1,147 @@ +body.app { + position: relative; + height: 100vh; + min-height: 400px; + transition: all ease-out 0.33s; + -webkit-overflow-scrolling: touch; + touch-action: pan-y; + + &.keyboard-opened { + #bordered_content { + padding-bottom: 16px; + } + + .footer { + bottom: 8px !important; + } + } + + * { + -webkit-overflow-scrolling: touch; + touch-action: pan-y; + } + + #login_screen { + position: absolute !important; + width: 100vw; + background-color: transparent; + + &:after { + background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); + content: ""; + height: 100%; + position: fixed; + width: 100%; + top: 0; + z-index: 98; + } + } + + #init_screen { + position: fixed; + overflow: hidden; + background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); + + .init-logo { + position: fixed; + bottom: auto; + top: 300px; + } + } + + #full_page, + #heading, + #bordered_content { + position: absolute; + width: 100vw; + } + + #bordered_content { + overflow: auto; + overflow-x: hidden; + + &.no-overflow { + overflow: unset; + } + } + + #main_footer, + .footer { + position: absolute; + width: calc(100vw - 32px); + left: 16px; + } + + .footer { + bottom: 8px; + pointer-events: none; + + &.double-footer { + bottom: 86px; + } + + > div { + pointer-events: all; + } + } + + #accounts_modal { + padding-top: 50px !important; + } + #staking_info { + padding: 0 16px; + bottom: 100px; + + .dots { + top: auto; + bottom: 120px; + } + } + + #root .full-only { + background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); + } + #main_footer.disabled { + pointer-events: none !important; + } +} + +#root { + width: 100%; + height: 100%; + padding: 0; + overflow: hidden; + opacity: 0; + + &.full-only { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: url('../assets/bg.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + + z-index: -1; + } + + &.init { + opacity: 1; + + transition: all ease-in-out 0.4s; + } + + &.freeze * { + pointer-events: none !important; + } +} + +#connection_error { + position: fixed; + top: 20px; + left: 20px; + width: calc(100% - 40px); + z-index: 10000; +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_badges.scss b/packages/browser-wallet-ui/src/scss/_badges.scss new file mode 100644 index 0000000..f0caaf9 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_badges.scss @@ -0,0 +1,32 @@ +.badge { + font-weight: 500; + &.hidden { + display: none !important; + } + &.badge-rounded { + height: 18px; + line-height: 16px; + border-radius: 8px; + padding: 0 8px; + } + &.badge-circle { + width: 20px; + height: 20px; + line-height: 12px; + text-align: center; + border-radius: 10px; + padding: 4px 0; + } + &.badge-primary { + background-color: $colorGreenElectric; + color: $colorTealLight; + } + &.bade-gray { + background-color: $colorWhiteish; + color: $colorBlueDark; + } + &.badge-secondary { + background-color: $colorTealLight; + color: $colorWhite; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_box.scss b/packages/browser-wallet-ui/src/scss/_box.scss new file mode 100644 index 0000000..e867827 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_box.scss @@ -0,0 +1,20 @@ +.box { + border-radius: 8px; + border: 1px solid $colorTealLight; + overflow: hidden; + + &.box-white { + border: 1px solid $colorWhite; + } + .header { + color: $colorWhite; + background-color: $colorTealLight; + padding: 12px; + font-weight: 500; + font-size: 18px; + text-align: center; + } + .content { + padding: 16px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_buttons.scss b/packages/browser-wallet-ui/src/scss/_buttons.scss new file mode 100644 index 0000000..c8ef291 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_buttons.scss @@ -0,0 +1,529 @@ +.btn { + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 24px; + border-radius: 0; + padding: 10px 18px; + box-shadow: none !important; + + &.btn-hidden { + pointer-events: none; + } + &.btn-sm { + padding: 4px 12px; + font-size: 14px; + line-height: 22px; + min-height: 40px; + + .icon { + font-size: 12px; + margin-left: 6px; + min-width: 18px; + + &.icon-left { + margin-left: 0; + margin-right: 6px; + } + &.icon-large { + font-size: 16px; + } + } + } + &.btn-xs { + padding: 4px 6px !important; + font-size: 12px; + line-height: 22px; + min-height: 30px; + } + &.disabled { + background-color: $colorLightGray1 !important; + opacity: 1; + pointer-events: none; + border-color: transparent !important; + color: $colorDark !important; + } + &.btn-rounded { + border-radius: 4px; + } + + * { + pointer-events: none !important; + } + .icon { + font-size: 14px; + margin-left: 8px; + min-width: 20px; + + &.icon-left { + margin-left: 0; + margin-right: 8px; + } + &.icon-large { + font-size: 18px; + } + } +} +.btn-primary { + background-color: $colorGreenElectric; + border-color: $colorGreenElectric; + color: $colorDark; + + &:hover, + &:active { + background-color: $colorGreenElectric1 !important; + border-color: $colorGreenElectric1 !important; + color: $colorDark !important; + } +} +.btn-danger { + background-color: $colorDanger2; + border-color: $colorDanger2; + color: $colorWhite; + + &:hover, + &:active { + background-color: $colorDanger2Active !important; + border-color: $colorDanger2Active !important; + color: $colorWhite !important; +} +} +.btn-outline-danger { + background-color: $colorWhite; + border-color: $colorDanger2; + color: $colorDanger2; + + &:hover, + &:active { + background-color: $colorDanger2Active !important; + border-color: $colorDanger2Active !important; + color: $colorWhite !important; + } + &.disabled { + background-color: $colorWhite !important; + border-color: $colorLightGray1 !important; + } +} +.btn-dark { + background-color: $colorTealLight; + border-color: $colorTealLight; + color: $colorWhite; + + &:hover, + &:active { + background-color: $colorTealDarker !important; + border-color: $colorTealDarker !important; + color: $colorWhite !important; + } +} +.btn-secondary-outline { + background-color: $colorLightestGray; + border-color: $colorTealLight; + color: $colorTealLight; + + &:hover, + &:active { + background-color: $colorLightGray1 !important; + border-color: $colorTealLight !important; + color: $colorTealLight !important; + } +} +.btn-secondary { + background-color: $colorTealLight; + border-color: $colorTealLight; + color: $colorWhite; + + &:hover, + &:active { + background-color: $colorTealDarker !important; + border-color: $colorTealDarker !important; + color: $colorWhite !important; + } +} +.btn-text { + background-color: transparent; + border: none !important; + color: $colorGrayDark; + + &:hover, + &:active { + color: $colorBlack; + } + + &.btn-danger-text { + background-color: transparent; + color: $colorDanger2; + + &:hover, + &:active { + color: $colorDanger2Active; + } + } + &.btn-bordered { + border: 1px solid $colorLightGray1 !important; + + &:hover, + &:active { + border: 1px solid $colorGrayLight !important; + } + } +} +.btn-white { + border: 2px solid $colorWhite !important; + color: $colorWhite; + + &:hover, + &:active { + color: $colorLightGray1 !important; + border-color: $colorLightGray1 !important; + } +} +.btn-error { + color: $colorDanger2; + + &:hover, + &:active { + color: $colorErrorActive !important; + } +} +.button-item { + width: 100%; + min-height: 85px; + background-color: $colorWhite; + margin-bottom: 15px; + + box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); + border-radius: 4px; + cursor: pointer; + transition: all linear 0.3s; + user-select: none; + + &.bordered { + border: 1px solid rgba(17, 20, 30, 0.03); + } + &.disabled { + cursor: auto !important; + } + &.click-only * { + pointer-events: none !important; + } + &:hover { + box-shadow: 0 3px 4px rgb(17 20 30 / 18%), 0 2px 3px rgb(17 20 30 / 8%); + transition: box-shadow linear 0.1s; + } + &.display-only { + cursor: default; + + &:hover { + box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); + transition: none !important; + } + } + &.button-gray { + background-color: $colorLightestGray; + } + &.settings-item { + cursor: auto; + box-shadow: none !important; + min-height: 45px; + height: auto; + margin-bottom: 8px; + + &.click:hover .icon { + transform: translateX(0px); + } + + .icon { + transition: all linear 0.1s; + transform: translateX(-4px); + width: 15px; + font-size: 12px; + } + + select { + width: 120px; + outline: none !important; + border-radius: 0 !important; + border: 1px solid $colorWhiteish1 !important; + box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05) !important; + } + } + &.tab-item { + padding: 4px 0; + border-radius: 8px; + opacity: 0; + height: 114px; + margin-bottom: 12px; + border: 2px solid transparent; + transition: border-color linear 0.1s; + + &:hover { + box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); + border-color: $colorTealLight; + } + &.disabled { + .title { + color: $colorGray; + } + .pill { + color: $colorWhite; + background-color: $colorGray; + } + } + + .icon { + display: block; + width: 100%; + height: 52px; + line-height: 42px; + font-size: 36px; + text-align: center; + } + .title { + width: 100%; + height: 26px; + text-align: center; + font-size: 12px; + font-weight: 500; + color: $colorTealLight; + } + .pill { + width: calc(100% - 12px); + margin-left: 6px; + margin-right: 6px; + height: 22px; + text-align: center; + font-size: 12px; + font-weight: 500; + color: $colorTealLight; + background-color: $colorWhite; + border-radius: 12px; + } + } + &.collator-item { + min-height: 70px; + } + &.transaction-item { + min-height: 65px; + height: 65px; + overflow: hidden; + border: 1px solid rgba(17, 20, 30, 0.03); + transition: all ease-in-out 0.2s; + + &.active { + min-height: 265px; + + .icon.icon-right { + transform: scaleY(-1) translateX(-4px); + } + } + &.click:hover .icon.icon-right { + transform: translateX(0px); + } + &.transaction-item-big { + height: 72px; + + .amount { + font-size: 26px; + + .digits { + font-size: 16px; + } + } + .desc { + font-size: 12px; + } + } + &.transaction-item-disabled { + box-shadow: none; + border-color: transparent; + background-color: $colorLightestGray; + + .amount, + .amount * { + color: $colorBlueGray !important; + } + } + &.small { + &.active { + min-height: 140px; + } + + .transaction-details { + height: 80px; + } + } + + .status { + position: relative; + text-align: center; + min-width: 32px; + height: 32px; + line-height: 30px; + background-color: $colorLightestGray; + color: $colorBlueGrayDark; + font-size: 16px; + font-weight: 500; + border-radius: 16px; + padding-left: 1px; + margin: 0 16px 0 16px; + + transition: all ease-in-out 0.1s; + + &.success { + background-color: $colorGreenElectric2; + color: $colorWhite; + + .icon { + position: absolute; + top: 10px; + left: 0; + font-size: 12px; + width: 100%; + height: 100%; + } + } + &.pending { + font-size: 16px; + background-color: $colorLightGray; + color: $colorWhite; + } + &.error { + background-color: $colorDanger1; + color: $colorWhite; + + .icon { + position: absolute; + top: 10px; + left: 0; + font-size: 12px; + width: 100%; + height: 100%; + } + } + } + + .transaction-info { + width: 90%; + min-height: 65px; + + .token-amount { + width: 100px; + } + .col { + padding: 0 2px; + max-width: 64px; + } + .icon { + padding: 0; + text-align: center; + font-size: 18px; + color: $colorGrayDark; + + &.icon-success { + color: $colorSuccess; + } + &.icon-green { + color: $colorGreenElectric2; + } + &.icon-error { + color: $colorDanger1; + } + &.icon-orange { + color: $colorInfo; + } + } + } + + .transaction-details { + background: $colorLightestGray; + height: 190px; + padding: 16px; + overflow: hidden; + cursor: default; + transition: all 0.3s; + + h4 { + margin: 0; + color: $colorTealLight; + } + .text-small { + word-break: break-all; + } + .element { + margin-bottom: 4px; + + .icon { + color: $colorSuccess; + + &.icon-cog { + font-size: 18px; + } + &icon-code { + font-size: 26px; + } + } + } + } + + .amount { + font-size: 20px; + + .digits { + min-width: 0; + position: relative; + font-size: 16px; + top: -2px; + } + .dollar { + position: relative; + font-size: 16px; + top: 0; + right: 2px; + } + } + + .desc { + color: $colorBlueGray; + text-transform: uppercase; + font-weight: 500; + font-size: 12px; + text-align: center; + } + + .icon.icon-right { + transition: all linear 0.1s; + transform: translateX(-4px); + min-width: 40px; + width: 40px; + font-size: 8px; + text-align: center; + } + + .transaction-info .icon, + .amount, + .amount .digits { + text-align: center; + min-width: 28px; + height: 28px; + line-height: 28px; + margin-bottom: 2px; + color: $colorTealLight; + } + } + + .icon { + width: 60px; + font-size: 18px; + + &.icon-small { + width: 10%; + font-size: 12px !important; + } + } + svg { + width: 56px; + height: 56px; + padding: 0 8px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_cards.scss b/packages/browser-wallet-ui/src/scss/_cards.scss new file mode 100644 index 0000000..fe5668b --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_cards.scss @@ -0,0 +1,20 @@ +.card { + border-radius: 8px; + + &.card-primary { + border-color: $colorTealLight; + + .card-header { + background-color: $colorTealLight; + color: $colorWhite; + } + } + + .card-header { + font-size: 18px; + text-align: center; + font-weight: 500; + padding: 16px; + border-radius: 6px 6px 0 0; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_chart.scss b/packages/browser-wallet-ui/src/scss/_chart.scss new file mode 100644 index 0000000..85f4e30 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_chart.scss @@ -0,0 +1,51 @@ +#chart { + text-align: center; + + .chart-text { + fill: #FFF; + transform: translateY(0.25em); + + &.text-small .chart-amount { + font-size: 0.38em; + + .dollar { + font-size: 0.6em; + } + } + + .chart-amount { + font-size: 0.44em; + line-height: 1; + text-anchor: middle; + transform: translateY(-0.25em); + + .amount { + font-family: 'Neue Haas Unica Pro', sans-serif; + font-weight: 500; + + padding: 0 1px 4px; + } + .decimals { + font-family: 'Neue Haas Unica Pro', sans-serif; + font-weight: 500; + font-size: 0.5em; + + letter-spacing: -0.05em; + } + .dollar { + font-family: 'Neue Haas Unica Pro', sans-serif; + font-weight: 400; + font-size: 0.6em; + + letter-spacing: -0.05em; + } + } + } + .chart-label { + font-size: 0.18em; + font-weight: 500; + text-transform: uppercase; + text-anchor: middle; + transform: translateY(0.7em); + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_dropdown.scss b/packages/browser-wallet-ui/src/scss/_dropdown.scss new file mode 100644 index 0000000..7c7c4b8 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_dropdown.scss @@ -0,0 +1,100 @@ +.custom-dropdown { + position: relative; + padding: 12px 16px; + border: 1px solid $colorLightGray1 !important; + border-radius: 4px; + margin-bottom: 8px; + user-select: none; + height: 66px; + + &.active { + .icon.icon-down-arrow { + transform: scaleY(-1); + } + .dropdown { + max-height: 190px; + height: 190px; + visibility: visible; + opacity: 1; + } + } + &.disabled { + cursor: default !important; + + .icon.icon-down-arrow { + opacity: 0; + } + } + + .icon-wallet-outline { + margin-right: 4px; + } + .icon-down-arrow { + font-size: 8px; + transition: all ease-in-out 0.3s; + } + .asset-icon { + width: 54px; + margin-right: 16px; + text-align: center; + + svg { + width: 100%; + } + } + .name { + color: $colorTealLight; + font-size: 16px; + font-weight: 500; + font-style: normal; + margin-bottom: 8px; + } + .desc { + color: $colorBlueGray; + font-size: 14px; + font-weight: 400; + font-style: normal; + } + .dropdown { + position: absolute; + top: calc(100% - 1px); + left: -1px; + width: calc(100% + 2px); + transition: height linear 0.3s, opacity linear 0.1s 0.1s, visibility linear 0.3s; + background-color: $colorWhite; + height: 0; + z-index: 99; + border: 1px solid $colorLightGray1; + border-radius: 0 0 4px 4px; + padding: 6px 8px; + cursor: auto; + visibility: hidden; + opacity: 0; + + .content { + width: 100%; + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-right: 8px; + } + .custom-dropdown-item { + display: flex; + pointer-events: auto; + cursor: pointer; + padding: 6px 8px; + border-radius: 4px; + transition: all ease-in-out 0.1s; + + &:hover, + &:active, + &:focus { + background-color: $colorLightestGray; + } + + * { + pointer-events: none; + } + } + } +} diff --git a/packages/browser-wallet-ui/src/scss/_fonts.scss b/packages/browser-wallet-ui/src/scss/_fonts.scss new file mode 100644 index 0000000..a475bbd --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_fonts.scss @@ -0,0 +1,28 @@ +@font-face { + font-family: 'Neue Haas Unica Pro'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Light.ttf') format('truetype'); +} +@font-face { + font-family: 'Neue Haas Unica Pro'; + font-style: normal; + font-weight: normal; + font-display: swap; + src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Regular.ttf') format('truetype'); +} +@font-face { + font-family: 'Neue Haas Unica Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Regular.ttf') format('truetype'); +} +@font-face { + font-family: 'Neue Haas Unica Pro'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Medium.ttf') format('truetype'); +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_footer.scss b/packages/browser-wallet-ui/src/scss/_footer.scss new file mode 100644 index 0000000..6142515 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_footer.scss @@ -0,0 +1,102 @@ +#main_footer { + position: fixed; + bottom: 8px; + left: 8px; + width: calc(100% - 16px); + background-color: $colorTealLight; + border-radius: 8px; + padding: 8px; + opacity: 0; + z-index: 99; + pointer-events: none; + + &.visible { + display: block; + opacity: 1; + pointer-events: auto; + } + + .item { + width: 44px; + height: 44px; + border-radius: 4px; + color: $colorWhiteishGreen; + font-size: 18px; + transition: all linear 0.15s; + cursor: pointer; + + &:hover, + &:focus, + &:active, + &.active { + background-color: rgba(192, 255, 0, 0.05); + color: $colorGreenElectric; + transition: color linear 0.3s; + + svg path { + fill: $colorGreenElectric; + } + + rect { + stroke: $colorGreenElectric; + } + } + + &.item-send { // .item-send is stroke, not a path + &:hover, + &:focus, + &:active, + &.active { + svg path { + fill: transparent; + stroke: $colorGreenElectric; + } + } + } + + * { + pointer-events: none; + } + } +} + +.tooltip.tooltip-footer { + &.show { + opacity: 1 !important; + } + + .tooltip-inner { + font-size: 12px; + font-weight: 500; + border-radius: 12px; + text-transform: uppercase; + color: $colorGreenElectric; + padding: 2px 8px; + border: 1px solid $colorGreenElectric; + background-color: $colorTealLight; + } +} +.footer-only { + padding: 16px; +} +.footer { + position: fixed; + left: 8px; + right: 8px; + bottom: 0; + width: calc(100% - 16px); + min-height: 65px; + padding-top: 8px; + padding-bottom: 8px; + z-index: 99; + user-select: none; + + &.equal-footer { + padding-bottom: 0; + display: flex; + align-items: center; + } + &.double-footer { + bottom: 65px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_forms.scss b/packages/browser-wallet-ui/src/scss/_forms.scss new file mode 100644 index 0000000..58fb821 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_forms.scss @@ -0,0 +1,165 @@ +label.label { + font-weight: 500; + font-size: 16px; + margin: 6px 0 10px 0; +} +.form-group { + border: 1px solid $colorLightGray1; + box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05) !important; + border-radius: 4px !important; + + &.custom-border { + border: none; + box-shadow: none !important; + + .form-control, + .show-password { + border-top: 1px solid $colorLightGray1; + border-bottom: 1px solid $colorLightGray1; + } + } + + .input-group { + border-radius: 6px !important; + + .input-group-text { + border-radius: 4px 0 0 4px; + + &.rounded-left { + border-top: 1px solid $colorLightGray1; + border-left: 1px solid $colorLightGray1; + border-bottom: 1px solid $colorLightGray1; + } + } + .form-control { + margin-left: 0 !important; + border-radius: 4px; + padding: 0.375rem 0.5rem; + } + .show-password { + color: $colorBlack; + background-color: $colorWhite; + width: 42px; + text-align: center; + height: 42px; + line-height: 42px; + font-size: 16px; + + .icon { + cursor: pointer; + } + } + } + .input-group-text { + background-color: $colorWhite; + border-radius: 0; + border: 0; + font-size: 12px; + padding: 0; + + &.transparent { + background-color: transparent; + } + &.bigger { + font-size: 16px; + } + + .icon { + width: 48px; + height: 32px; + text-align: center; + line-height: 32px; + } + } + .form-control { + border: 0; + border-radius: 0; + box-shadow: none !important; + padding-left: 0; + background-color: $colorWhite !important; + font-size: 14px; + + &.form-control-sm { + font-size: 12px; + } + } +} + +// not always in a .form-group! +.form-control.custom-control { + position: relative; + text-align: center; + border-radius: 0; + border: none; + background-color: transparent; + border-bottom: 4px solid rgba(255, 255, 255, 0.1); + box-shadow: none !important; + color: $colorWhite; + font-size: 20px; + font-weight: 500; + width: 100%; + padding: 8px 8px 4px; + transition: all linear 0.2s; + + &:disabled { + border-bottom: 4px solid transparent; + } + &::placeholder { + color: rgba(255, 255, 255, 0.7); + transition: all linear 0.2s; + } + &:focus::placeholder { + color: rgba(255, 255, 255, 1); + } + &:focus { + border-bottom-color: rgba(255, 255, 255, 0.4); + } +} +.input-group.disabled { + background-color: $colorLightestGray; + + .form-control, + .input-group-text { + background-color: $colorLightestGray !important; + color: $colorBlueGray; + } +} +.form-switch { + margin: 12px 0; + + .form-check-input { + border-radius: 12px; + width: 44px; + height: 24px; + border: none !important; + margin-top: 0; + margin-right: 12px; + background-color: $colorLightestGray !important; + background-image: url("data:image/svg+xml,") !important; + outline: none !important; + box-shadow: none !important; + filter: none !important; + transition: all linear 0.2s; + + &:checked { + background-color: $colorGreenElectric !important; + } + &.darker { + background-color: $colorLightGray1 !important; + + &:checked { + background-color: $colorGreenElectric1 !important; + } + } + } + .form-check-label { + height: 24px; + line-height: 24px; + user-select: none; + + h4 { + height: 24px; + line-height: 24px; + } + } +} diff --git a/packages/browser-wallet-ui/src/scss/_full-screen.scss b/packages/browser-wallet-ui/src/scss/_full-screen.scss new file mode 100644 index 0000000..117958f --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_full-screen.scss @@ -0,0 +1,81 @@ +/* for full screen */ +@media screen and (min-width: 600px) { + body, + #init_screen, + #login_screen { + background: radial-gradient(circle at center top, $colorTealLight, $colorTealDarkest) !important; + } + body, + #header, + #full_page, + #bordered_content, + #main_footer { + width: 100%; + max-width: 600px; + margin: 0 auto; + } + #full_page .heading h3 { + padding-left: 20px; + text-align: left; + width: 100%; + } + #bordered_content #top_items button { + width: 208px; + } + body #login_screen, + body #init_screen { + background-image: none; + background-color: $colorTealLight; + } + #main_footer { + max-width: 584px; + margin-left: 8px; + left: auto; + } + .modal .modal-dialog { + max-width: 584px; + margin: 0 auto; + } + .footer { + max-width: 584px; + margin: 0 auto 4px; + } + .button-item { + &.tab-item { + height: 160px; + + .icon { + height: 96px; + line-height: 96px; + + svg { + width: 100%; + } + } + } + &.transaction-item { + height: 80px; + min-height: 80px; + + &.transaction-item-big { + height: 104px; + } + + .transaction-info { + min-height: 80px; + } + } + &.settings-item { + min-height: 54px; + } + } + .notification { + width: 100% !important; + max-width: 480px !important; + left: auto; + margin-left: 60px; + } + #transactions .button-item { + height: 80px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_global.scss b/packages/browser-wallet-ui/src/scss/_global.scss new file mode 100644 index 0000000..138f20a --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_global.scss @@ -0,0 +1,180 @@ +:root { + --main-bg-color: $colorTealLight; + --secondary-font :$colorBlueGray; +} +::-webkit-scrollbar { + width: 10px; +} +::-webkit-scrollbar-track { + background: $colorLightestGray; + border-radius: 4px; +} +::-webkit-scrollbar-thumb { + background: $colorWhiteish1; + border-radius: 4px; +} +::-webkit-scrollbar-thumb:hover { + background: $colorGrayLight; +} +* { + font-family: "Neue Haas Unica Pro", sans-serif !important; +} +html { + height:100%; + background: linear-gradient(to bottom, $colorTealLight, $colorTealDark) +} +body { + font-family: 'Neue Haas Unica Pro', sans-serif; + width: 100%; + min-width: 400px; + min-height: 600px; + height: 100%; + color: $colorTealLight; + font-size: 14px; + line-height: 14px; + overflow: hidden; + background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); +} +h1 { + font-weight: 500; + font-size: 24px; + color: $colorDark; +} +h2 { + font-weight: 500; + font-size: 22px; + color: $colorDark; +} +h3 { + font-weight: 500; + font-size: 18px; + color: $colorDark; +} +h4 { + font-weight: 500; + font-size: 16px; + color: $colorDark; +} +h5 { + font-weight: 500; + font-size: 14px; + color: $colorDark; +} +h6 { + font-weight: 400; + font-size: 12px; + color: $colorDark; +} +p { + line-height: 18px; + margin-bottom: 0; +} +.text-white { + color: $colorWhite !important; +} +.text-light-gray { + color: $colorLightGray1; +} +.text-gray { + color: $colorBlueGray; +} +.text-disabled { + color: $colorGray !important; +} +.text-green { + color: $colorGreenElectric !important; +} +.text-dark { + color: $colorDark; +} +.text-danger { + color: $colorDanger1; +} +.text-dark-blue { + color: $colorTealLight !important; +} +.text-small { + font-size: 14px !important; +} +.text-bigger { + font-size: 16px; +} +.text-biggest { + font-size: 20px; +} +.text-very-small { + font-size: 12px; +} +.text-grotesk { + font-weight: 300; + + &.text-bold { + font-weight: 500; + } +} +.text-bold { + font-weight: 500; +} +.text-semibold { + font-weight: 400; +} +.text-left { + text-align: left !important; +} +.text-right { + text-align: right !important; +} +.select-none { + user-select: none; +} +.hidden { + visibility: hidden; + opacity: 0; +} +.transparent-element { + opacity: 0; +} +.click { + cursor: pointer !important; +} +.rounded-left { + border-top-left-radius: 4px !important; + border-bottom-left-radius: 4px !important; +} +.rounded-right { + border-top-right-radius: 4px !important; + border-bottom-right-radius: 4px !important; +} +.border-right-0 { + border-right: none !important; +} +.no-border-radius { + border-radius: 0 !important; +} +.blur-box { + > * { + z-index: 1; + } + + &::after { + position: absolute; + top: 0; + left: 0; + right: 0; + width: 100%; + height: 100%; + content: " "; + backdrop-filter: blur(4px); + background-color: rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 8px; + opacity: 0.8; + transition: all linear 0.1s; + } + + &.blur-box-hover:hover { + &::after { + border: 1px solid rgba(255, 255, 255, 0.3); + } + } +} diff --git a/packages/browser-wallet-ui/src/scss/_header.scss b/packages/browser-wallet-ui/src/scss/_header.scss new file mode 100644 index 0000000..52ff5e5 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_header.scss @@ -0,0 +1,273 @@ +#header { + position: fixed; + width: 100%; + top: 0; + height: 56px; + padding: 8px 8px 8px 16px; + z-index: 999; + opacity: 0; + pointer-events: none; + + &.visible { + opacity: 1; + pointer-events: auto; + } + + #top_logo { + + &.full { + svg:hover { + transform: scale(1); + } + + .full-logo { + position: relative; + display: block !important; + } + } + + svg { + transition: all ease-out 0.3s; + + &:hover { + transform: scale(1.1); + } + } + } + + #top_logo .full-logo, + #top_logo.full .b-logo { + position: absolute; + display: none !important; + } + + #actions { + svg { + margin: 0 8px; + } + + #go_copy { + transition: all ease-out 0.22s; + + &:hover { + transform: scale(1.15); + } + + * { + pointer-events: none !important; + } + } + + #go_settings { + transition: all ease-out 0.22s; + + &:hover { + transform: rotate(45deg) scale(1.1); + } + } + } +} + +#bordered_content { + opacity: 0; + position: fixed; + top: 124px; + left: 0; + right: 0; + + width: 100%; + height: calc(100% - 124px); + + padding: 16px 16px 76px; + + background-color: $colorWhite; + border-radius: 16px 16px 0 0; + + &.smaller { + top: 254px; + height: calc(100% - 254px); + padding-top: 34px !important; + } + &.medium { + top: 165px; + height: calc(100% - 165px); + padding-top: 20px; + } + + #top_items { + position: absolute; + top: -18px; + left: 12px; + right: 0; + width: 100%; + text-align: center; + + button { + width: 144px; + border-radius: 4px; + height: 36px; + line-height: 20px; + padding: 0; + box-shadow: 0 1px 2px rgba(16, 24, 40, 0.1); + font-weight: 500; + font-size: 14px; + text-transform: uppercase; + opacity: 0; + + .icon { + font-size: 14px; + } + } + } +} + +#current_wallet { + position: relative; + width: 100%; + margin-right: 8px; + padding: 6px 0 6px 10px; + z-index: 999; + cursor: pointer; + user-select: none !important; + + &.active { + &:after { + border-radius: 8px 8px 0 0; + } + + .icon.icon-down-arrow { + transform: scaleY(-1); + } + + .dropdown { + opacity: 1; + pointer-events: auto; + transform: translateY(0); + } + } + + &.hidden { + width: 0; + } + + .jdenticon { + position: relative; + margin-right: 8px; + border-radius: 16px; + background-color: rgba(255, 255, 255, 0.22); + + svg { + position: absolute; + } + + .kyc-status { + position: absolute; + bottom: -2px; + right: -8px; + opacity: 0; + + &.verified { + opacity: 1; + + .icon { + color: $colorGreenElectric; + } + } + + .icon { + color: $colorLightestGray; + font-size: 16px; + text-shadow: -1px -1px 0 $colorTealMedium, 1px -1px 0 $colorTealMedium, -1px 1px 0 $colorTealMedium, 1px 1px 0 $colorTealMedium; + } + } + } + + .jdenticon, + .jdenticon svg { + min-width: 32px; + min-height: 32px; + width: 32px; + height: 32px; + } + + .info { + color: $colorWhite; + font-size: 12px; + width: 100%; + + .desc { + display: block; + font-size: 14px; + width: 100%; + margin-top: 2px; + font-weight: 500; + + .icon { + margin: 0 4px 0 0; + color: $colorGreenElectric2; + } + } + } + + .icon { + font-size: 6px; + margin-left: 4px; + margin-right: 4px; + color: $colorGrayLight; + + &.icon-down-arrow { + width: 20px; + margin: 0 8px 0 0; + text-align: center; + transition: all linear 0.2s; + } + } + + .dropdown { + position: absolute; + width: 100%; + max-height: 136px; + top: 44px; + left: 0; + opacity: 0; + pointer-events: none; + overflow: auto; + overflow-x: hidden; + backdrop-filter: blur(8px); + background-color: rgba(44, 44, 44, 0.3); + border: 1px solid rgba(22, 22, 22, 0.3); + border-top: none; + border-radius: 0 0 4px 4px; + transition: all linear 0.2s; + transform: translateY(-30px); + z-index: -1; + + &::-webkit-scrollbar { + width: 12px; + } + &::-webkit-scrollbar-track { + background: transparent; + border-radius: 4px; + } + &::-webkit-scrollbar-thumb { + background: rgba(22, 22, 22, 0.50); + border-radius: 8px; + border: 4px solid transparent; + background-clip: padding-box; + } + &::-webkit-scrollbar-thumb:hover { + background: rgba(22, 22, 22, 0.60); + border: 4px solid transparent; + background-clip: padding-box; + } + + .wallet { + padding: 6px 10px; + margin-right: -16px; + + &:hover { + background: linear-gradient(to right, $colorTransDark 0%, $colorTransDark 70%, transparent 90%, transparent 100%); + } + } + } +} diff --git a/packages/browser-wallet-ui/src/scss/_heading.scss b/packages/browser-wallet-ui/src/scss/_heading.scss new file mode 100644 index 0000000..ac0ec1a --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_heading.scss @@ -0,0 +1,69 @@ +#heading { + position: relative; + display: block; + width: 100%; + height: 124px; + padding: 60px 16px 16px 16px; + user-select: none; + + &.custom-header { + padding: 0; + + .heading { + width: 100%; + height: 60px; + padding: 12px 24px 12px 24px; + background-color: transparent; + color: $colorWhite; + + h3 { + width: 100%; + margin: 0; + text-align: center; + color: $colorWhite; + } + } + .fixed-title { + position: absolute; + left: 0; + bottom: 22px; + } + } + &.bigger { + height: 230px; + } + &.medium { + height: 165px; + } + + #logo { + float: left; + } + + .content { + padding-top: 10px; + } +} + +#go_back { + min-width: 40px; + text-align: center; + font-size: 18px; + transition: all linear 0.2s; + + &:hover { + transform: translateX(-4px); + + .text { + transform: translateX(4px); + } + } + + .text { + display: inline-block; + margin-left: 12px; + font-weight: 500; + transition: all linear 0.2s; + user-select: none; + } +} diff --git a/packages/browser-wallet-ui/src/styles/icomoon.css b/packages/browser-wallet-ui/src/scss/_icomoon.scss similarity index 100% rename from packages/browser-wallet-ui/src/styles/icomoon.css rename to packages/browser-wallet-ui/src/scss/_icomoon.scss diff --git a/packages/browser-wallet-ui/src/scss/_info-messages.scss b/packages/browser-wallet-ui/src/scss/_info-messages.scss new file mode 100644 index 0000000..c43ef37 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_info-messages.scss @@ -0,0 +1,41 @@ +.info-messages { + font-weight: 500; + color: $colorDark; + + &.bigger { + font-size: 16px; + + .message { + padding: 8px 0; + } + .icon { + width: 20px; + margin-right: 12px; + } + } + + .message { + padding: 4px 0; + } + .icon { + display: block; + width: 18px; + text-align: center; + color: $colorGrayLight; + margin-right: 10px; + + &.icon-arrow-right-2 { + font-size: 12px; + color: $colorTealLight !important; + } + &.icon-success { + color: $colorGreenElectric2; + } + &.icon-check { + color: $colorGreenElectric2; + } + &.icon-error { + color: $colorDanger2; + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_init.scss b/packages/browser-wallet-ui/src/scss/_init.scss new file mode 100644 index 0000000..fe5fcdb --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_init.scss @@ -0,0 +1,45 @@ +#init_screen { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: url('../assets/bg.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + opacity: 1; + + z-index: 99999; + + &.fade-out { + opacity: 0; + transition: all ease-in 0.3s; + + .init-logo { + transform: scale(30); + transition: all linear 1.5s; + } + } + &.inactive { + opacity: 0 !important; + pointer-events: none !important; + z-index: -1; + } + &.fade-in { + opacity: 1 !important; + transition: all ease-in 0.3s; + + } + .init-logo { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 124px; + margin: auto; + + width: 102px; + height: 128px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_ios.scss b/packages/browser-wallet-ui/src/scss/_ios.scss new file mode 100644 index 0000000..f9389ed --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_ios.scss @@ -0,0 +1,56 @@ +body.ios { + padding-top: 44px; + + #header { + top: 44px + } + #root .full-only { + background-image: none; + background-color: $colorTealLight; + } + #accounts_modal { + width: 100%; + left: 0; + padding: 8px; + + .modal-header { + border: 1px solid transparent; + } + } + #bordered_content { + padding: 16px 16px 94px; + height: calc(100% - 168px); + top: 168px; + + &.smaller { + height: calc(100% - 300px); + top: 300px; + padding-top: 40px; + } + + &.medium { + height: calc(100% - 200px); + top: 200px; + } + + } + #full_page { + height: calc(100% - 44px); + + .content { + height: calc(100% - 60px); + + &.full-content { + height: 100%; + padding-top: 80px; + } + } + } + #staking_intro .step { + padding-top: 140px + } + #main_footer, + .footer { + bottom: 24px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_kyc.scss b/packages/browser-wallet-ui/src/scss/_kyc.scss new file mode 100644 index 0000000..013186b --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_kyc.scss @@ -0,0 +1,46 @@ +#go_kyc { + position: relative; + padding: 12px 8px; + border-radius: 8px; + transition: all linear 0.2s; + margin: 0 16px; + + &.kyced .icon-shield { + color: $colorGreenElectric; + } + + .icon-shield { + color: $colorLightGray1; + } +} +#kyc_shield { + position: relative; + top: -40px; + width: 150px; + height: 120px; + user-select: none !important; + + .text { + font-size: 22px; + line-height: 1; + text-anchor: middle; + transform: translateY(-0.25em); + + .not-verified { + font-size: 24px; + font-weight: 500; + fill: $colorBlueGray; + } + .verified { + font-size: 16px; + font-weight: 400; + fill: $colorTealLight; + } + .level { + font-size: 10px; + text-transform: uppercase; + font-weight: 500; + fill: $colorTealLight; + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_loader.scss b/packages/browser-wallet-ui/src/scss/_loader.scss new file mode 100644 index 0000000..4230bfd --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_loader.scss @@ -0,0 +1,249 @@ +#loading_content { + position: absolute; + left: 0; + top: 16px; + width: 100%; + height: 100%; + text-align: center; + padding-top: 80px; + background-color: $colorWhite; + transition: all linear 0.4s; + visibility: hidden; + opacity: 0; + border-top-right-radius: 10px; + border-top-left-radius: 10px; + + z-index: 100; + + &.no-border-radius { + border-radius: 0 !important; + } + &.active { + opacity: 1; + visibility: visible; + } + &.circle { + .text { + color: $colorTealLight; + font-size: 22px; + text-transform: capitalize; + } + } + &.done { + #loading_circle { + animation: none; + } + } + &.dark { + background-color: $colorTealLight; + + #loading_circle { + #primary { + stroke: $colorWhite; + } + #secondary { + stroke: transparent; + } + } + &.circle { + .text { + color: $colorWhite; + } + } + .desc { + color: $colorWhite; + } + #checkmark { + path { + fill: $colorWhite; + } + } + } + + .bbb-icon { + font-size: 42px; + animation-name: beat-fade; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.4, 0, .6, 1); + animation-duration: 2s; + + fill: $colorLightestGray; + + path { + stroke: $colorGreenElectric; + stroke-width: 3px; + stroke-linecap: round; + stroke-linejoin: round; + stroke-dasharray: 100; + + animation-name: dash; + animation-iteration-count: infinite; + animation-duration: 20s; + } + } + + #content { + position: relative; + display: block; + width: 100%; + min-height: 200px; + + .init { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + + transition: all ease-in-out 0.4s; + } + .done { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + transition: all ease-in-out 0.4s; + + opacity: 0; + + &.active { + opacity: 1; + } + + .desc { + margin-bottom: 30px; + } + } + } + + .text { + width: 100%; + text-transform: uppercase; + color: $colorBlueGray; + font-weight: 500; + font-size: 10px; + text-align: center; + padding-top: 16px; + } + .desc { + font-weight: 400; + font-size: 14px; + padding: 12px 56px; + color: $colorBlueGray; + } + #loading_circle { + animation: rotation 3.333s linear infinite; + + #primary { + stroke: $colorTealLight; + } + #secondary { + stroke: $colorLightGray1; + } + } + #checkmark, + #failed { + position: absolute; + top: 108px; + left: calc(50% - 22px); + opacity: 0; + + transition: all ease-in-out 0.4s; + + &.show { + opacity: 1; + } + } + #checkmark { + path { + fill: $colorTealLight; + + transition: all ease-in-out 0.4s; + } + } + #failed { + top: 90px; + left: calc(50% - 30px); + + path { + fill: $colorDanger1; + + transition: all ease-in-out 0.4s; + } + } +} + +#bbb_loader { + position: relative; + width: 100%; + height: auto; + top: 0; + background-color: transparent; + text-align: center; + + &.centered { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + text-align: center; + } + &.active { + .bbb-icon { + font-size: 42px; + animation-name: beat-fade; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.4, 0, .6, 1); + + path { + stroke: $colorGreenElectric; + stroke-width: 3px; + stroke-linecap: round; + stroke-linejoin: round; + stroke-dasharray: 100; + + animation-name: dash; + animation-iteration-count: infinite; + animation-duration: 20s; + } + } + .text { + opacity: 1; + } + } + + .bbb-icon { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 124px; + margin: auto; + + width: 102px; + height: 128px; + animation-duration: 2s; + } + .text { + position: absolute; + bottom: 80px; + width: 100%; + color: $colorLightGray; + + text-align: center; + padding-top: 16px; + transition: all ease-in-out 0.4s; + opacity: 0; + + font-size: 12px; + font-weight: 500; + text-transform: uppercase; + + animation-name: beat-text-fade; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.4, 0, .6, 1); + animation-duration: 1s; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_login.scss b/packages/browser-wallet-ui/src/scss/_login.scss new file mode 100644 index 0000000..725d3f2 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_login.scss @@ -0,0 +1,212 @@ +#login_screen { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: url('../assets/bg.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + opacity: 1; + z-index: 9998; + + &.fade-out { + opacity: 0 !important; + transition: all ease-in 0.3s; + } + &.inactive { + display: none !important; + z-index: -1; + } + + #input_form { + transition: all ease-in 0.3s; + visibility: visible; + + &.inactive { + opacity: 0; + visibility: hidden; + pointer-events: none; + } + } + + #status_message { + position: absolute; + text-align: center; + bottom: 0; + left: 0; + width: 100%; + height: 36px; + opacity: 0; + transition: all ease-in-out 0.4s; + color: $colorLightGray; + font-size: 12px; + font-weight: 500; + text-transform: uppercase; + + animation-name: beat-text-fade; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(.4, 0, .6, 1); + animation-duration: 1s; + + &.active { + opacity: 1; + } + } +} + +.bitgreen-svg { + position: fixed; + top: 180px; + left: 0; + right: 0; + margin: auto; + z-index: 99; +} +.separator { + position: fixed; + top: 250px; + left: 0; + right: 0; + margin: auto; + width: 50px; + height: 2px; + background: $colorWhite; + z-index: 99; +} +.separator-line { + margin: 0 auto 8px; + width: 100%; + height: 1px; + background-color: $colorLightGray; +} +.browser-wallet { + position: fixed; + top: 260px; + left: 0; + right: 0; + margin: auto; + color: $colorWhite; + font-size: 16px; + font-weight: 500; + line-height: 24px; + letter-spacing: 0; + text-align: center; + user-select: none !important; + z-index: 99; +} +#get_started { + position: fixed; + top: 380px; + left: 0; + right: 0; + width: 150px; + margin: auto; + box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05); +} + +#app_info { + border: 1px solid $colorBurntOrange; + border-radius: 8px; + height: 90px; + margin-bottom: 8px; + + &.known { + border: 1px solid $colorTealLight; + + .left { + background-color: $colorTealLight; + } + + .icon-known { + display: block; + opacity: 1; + visibility: visible; + } + + .icon-unknown { + display: none; + opacity: 0; + visibility: hidden; + } + + .message.known { + display: block; + opacity: 1; + visibility: visible; + } + + .message.unknown { + display: none; + opacity: 0; + visibility: hidden; + } + + .right { + color: $colorTealLight !important; + } + + h3 { + font-size: 16px; + color: $colorTealLight !important; + } + } + + .left { + width: 80px; + height: 90px; + background-color: $colorBurntOrange; + padding: 16px 4px 16px 4px; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; + user-select: none; + } + + .icon { + display: none; + width: 100%; + text-align: center; + color: $colorWhite; + font-size: 26px; + padding: 0 25px; + opacity: 0; + visibility: hidden; + } + + .icon-unknown { + display: block; + opacity: 1; + visibility: visible; + } + + .message { + display: none; + text-transform: uppercase; + color: $colorWhite; + font-weight: 500; + font-size: 12px; + line-height: 16px; + text-align: center; + padding: 6px 6px 10px 6px; + opacity: 0; + visibility: hidden; + + &.unknown { + display: block; + opacity: 1; + visibility: visible; + } + } + + .right { + height: 100%; + color: $colorBurntOrange !important; + padding: 8px 12px; + } + + h3 { + font-size: 16px; + color: $colorBurntOrange !important; + } +} diff --git a/packages/browser-wallet-ui/src/scss/_macos.scss b/packages/browser-wallet-ui/src/scss/_macos.scss new file mode 100644 index 0000000..dc59773 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_macos.scss @@ -0,0 +1,3 @@ +body.macos { + position: fixed; +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_modals.scss b/packages/browser-wallet-ui/src/scss/_modals.scss new file mode 100644 index 0000000..e02a4da --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_modals.scss @@ -0,0 +1,128 @@ +.modal { + display: block; + opacity: 0; + pointer-events: none; + z-index: -1; + transition: all linear 0.2s; + height: auto; + box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); + + &:after { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 1200px; + background-color: rgba(17, 20, 30, 0.66); + content: " "; + z-index: -1; + transition: all linear 0.2s; + } + &.show { + height: 100%; + opacity: 1; + pointer-events: auto; + z-index: 9998; + + .modal-dialog { + transform: translateY(0); + } + } + + .modal-dialog { + transform: translateY(-60px); + transition: all linear 0.2s; + margin: 0; + } + .modal-content { + border: none !important; + } + .modal-header { + position: relative; + background-color: $colorTealLight; + border-radius: 0 !important; + border-bottom: 0 !important; + + &.equal-padding { + padding: 6px 12px; + } + &.modal-header-danger { + background-color: $colorDanger; + } + &.modal-header-primary { + background-color: $colorTealLight; + } + } + .modal-body { + margin-top: -2px; + + &.small-padding { + padding: 6px 10px; + } + &.modal-body-primary { + background-color: $colorTealLight; + } + } + .modal-footer { + box-shadow: 0 12px 16px -4px rgba(17, 20, 30, 0.1), 0 4px 6px -2px rgba(17, 20, 30, 0.05); + border-radius: 0 0 8px 8px; + border: none !important; + } +} + +#accounts_modal { + width: calc(100% - 16px); + top: 0; + left: 8px; + padding-top: 8px; + user-select: none; + + .modal-content { + border-radius: 10px !important; + } + .modal-header { + border-top-left-radius: 8px !important; + border-top-right-radius: 8px !important; + } + .current-wallet { + .address { + font-size: 14px; + + .icon { + font-size: 16px; + } + } + } + .modal-body { + padding-right: 8px; + + .button-item { + min-height: 60px; + + .icon { + font-size: 14px; + width: 40px; + } + } + } + #wallet_list { + max-height: 290px; + } + #hide_accounts_modal { + position: absolute; + right: 8px; + top: 8px; + font-size: 14px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + padding: 0; + color: $colorWhite !important; + transition: all linear 0.1s; + + &:hover { + font-size: 16px; + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_notifications.scss b/packages/browser-wallet-ui/src/scss/_notifications.scss new file mode 100644 index 0000000..0d026ab --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_notifications.scss @@ -0,0 +1,26 @@ +.notification { + background: $colorWhite !important; + border: 1px solid $colorLightestGray !important; + box-shadow: 0 3px 4px rgb(17 20 30 / 0.18), 0 2px 3px rgb(17 20 30 / 0.08) !important; + border-radius: 8px !important; + max-width: 100% !important; + width: calc(100% - 28px) !important; + color: $colorTealLight !important; + padding: 24px 12px !important; + font-size: 16px !important; + user-select: none !important; + + &.notification-info .icon { + color: $colorTealLighter; + } + &.notification-success .icon { + color: $colorGreenElectric2; + } + &.notification-error .icon { + color: $colorDanger2; + } + + .icon { + font-size: 26px; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_page.scss b/packages/browser-wallet-ui/src/scss/_page.scss new file mode 100644 index 0000000..357692d --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_page.scss @@ -0,0 +1,78 @@ +#full_page { + position: fixed; + width: 100%; + height: 100%; + + .heading { + width: 100%; + height: 60px; + padding: 12px 64px 12px 24px; + color: $colorWhite; + user-select: none; + + &.equal-padding { + padding: 12px 24px; + } + + .icon { + width: 40px; + text-align: center; + font-size: 18px; + } + + h3 { + width: 270px; + margin: 0; + text-align: center; + color: $colorWhite; + } + } + + .content { + position: relative; + width: 100%; + height: calc(100% - 60px); + padding: 16px; + background-color: $colorWhite; + overflow: auto; + overflow-x: hidden; + + &.full-content { + height: 100%; + + &.secondary-bg { + background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); + padding-top: 60px; + } + } + + .icon-huge { + font-size: 53px; + } + } +} + +#full_page #success_icon { + margin-top: 90px; + margin-bottom: 40px; +} +#full_page #message_text { + margin-bottom: 100px; +} +#full_page #password_input { + &:after { + position: absolute; + top: -80px; + left: 0; + width: 100%; + height: 220px; + content: " "; + background: linear-gradient(to bottom, transparent 0%, transparent 10%, $colorWhite 50%, $colorWhite 100%); + z-index: 99; + } + + .w-100 { + position: relative; + z-index: 999; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_portfolio.scss b/packages/browser-wallet-ui/src/scss/_portfolio.scss new file mode 100644 index 0000000..1bf0538 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_portfolio.scss @@ -0,0 +1,44 @@ +#portfolio { + position: relative; + width: 100%; + height: 164px; + color: $colorWhite; + padding: 8px; + opacity: 0; + + &:after { + background-color: rgba(255, 255, 255, 0.1); + } + + .info { + padding-left: 12px; + + h1, + p { + opacity: 0; + } + + .icon { + display: inline-block; + margin-right: 8px; + } + } + + #bbb_token_info { + color: $colorGreenElectric; + font-weight: 500; + font-size: 20px; + + .dollar { + font-weight: 400; + font-size: 14px; + margin-left: 8px; + } + .decimals { + position: relative; + top: -4px; + font-weight: 400; + font-size: 16px; + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_qrcode.scss b/packages/browser-wallet-ui/src/scss/_qrcode.scss new file mode 100644 index 0000000..7ed7966 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_qrcode.scss @@ -0,0 +1,31 @@ +#qrcode { + position: relative; + padding: 16px; + border: 3px solid $colorGreenElectric; + margin: 16px 16px 32px; + + &:after { + position: absolute; + content: " "; + top: -5px; + left: 32px; + width: calc(100% - 64px); + height: calc(100% + 10px); + background-color: $colorWhite; + } + &:before { + position: absolute; + content: " "; + top: 32px; + left: -5px; + width: calc(100% + 10px); + height: calc(100% - 64px); + background-color: $colorWhite; + z-index: 999; + } + + * { + position: relative; + z-index: 999; + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_quantity.scss b/packages/browser-wallet-ui/src/scss/_quantity.scss new file mode 100644 index 0000000..0ced700 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_quantity.scss @@ -0,0 +1,64 @@ +#choose_quantity { + margin-bottom: 8px; + + .col-4 { + padding: 0 16px 0 0; + } + .form-control { + border: none; + border-bottom: 3px solid $colorLightGray1; + box-shadow: none !important; + color: $colorTealLight; + font-size: 22px; + font-weight: 500; + text-align: center; + width: 100%; + padding: 6px 6px 0; + transition: all linear 0.2s; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + } + &:focus { + border-bottom-color: $colorTealLight; + } + &.error { + border-bottom-color: $colorDanger2; + color: $colorDanger2; + } + } + + .equals { + padding: 0 8px 16px 8px; + font-size: 32px; + font-weight: 500; + color: $colorLightGray1; + } + .label { + color: $colorBlueGray; + font-weight: 500; + font-size: 14px; + } + input[type=range] { + width: 100%; + margin-top: 8px; + height: 8px; + border-radius: 4px; + background: linear-gradient(to right, $colorGreenElectric 0%, $colorGreenElectric 0%, $colorLightestGray 0%, $colorLightestGray 100%); + appearance: none; + -webkit-appearance: none; + + &::-webkit-slider-thumb { + height: 24px; + width: 24px; + background: $colorWhite; + -webkit-appearance: none; + box-shadow: 0 4px 8px -2px rgba(17, 20, 30, 0.1), 0 2px 4px -2px rgba(17, 20, 30, 0.06); + border-radius: 12px; + } + } +} +#max_amount:hover { + color: $colorTealLight; +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_send.scss b/packages/browser-wallet-ui/src/scss/_send.scss new file mode 100644 index 0000000..3972d5e --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_send.scss @@ -0,0 +1,139 @@ +#send_info { + height: 30px; + color: $colorBlueGray; + + .info, + .error { + display: none; + } + .info { + .text { + font-weight: 500; + } + .separator-line { + margin: 8px auto; + } + } + .error { + color: $colorDanger2; + font-weight: 400; + } +} +#recipient { + overflow: hidden; + + &.form-control { + width: 320px; + border: none !important; + box-shadow: none !important; + outline: none !important; + padding: 0; + border-radius: 4px; + } +} +#review_transaction { + padding: 16px; + margin-bottom: 32px; + color: $colorDark; + user-select: none; + + .token { + padding-left: 32px; + } + .estimated_fees { + padding-right: 32px; + } +} +#amounts, +#apy_info, +#review_transaction { + .title { + margin-top: 6px; + font-family: 'Neue Haas Unica Pro', sans-serif; + font-weight: 500; + color: $colorBlueGray; + font-size: 14px; + } + .amount { + font-family: 'Neue Haas Unica Pro', sans-serif; + font-weight: 500; + font-size: 26px; + + padding: 0 1px 4px; + } + .decimals { + font-family: 'Neue Haas Unica Pro', sans-serif; + font-size: 16px; + + position: relative; + top: -6px; + font-weight: 400; + + letter-spacing: -0.05em; + } + .dollar { + font-family: 'Neue Haas Unica Pro', sans-serif; + font-weight: 500; + font-size: 18px; + letter-spacing: -0.05em; + } +} +#transaction_info { + .wallet { + height: 40px; + margin-bottom: 30px; + + .right { + padding-left: 8px; + + .address { + font-size: 12px; + } + } + } + .dot { + display: block; + position: relative; + width: 16px; + height: 16px; + background-color: $colorWhite; + border-radius: 8px; + border: 1px solid $colorGrayLight; + text-align: center; + margin-top: -18px; + + &:after { + position: absolute; + top: 3px; + left: 3px; + width: 8px; + height: 8px; + content: " "; + background-color: $colorGrayLight; + border-radius: 4px; + } + + &.dot-green { + border: 1px solid $colorGreenElectric2; + + &:after { + background-color: $colorGreenElectric2; + } + + .dot-line { + background-color: $colorGreenElectric2; + } + } + + .dot-line { + position: absolute; + bottom: 15px; + left: 6px; + width: 2px; + height: 55px; + content: " "; + background-color: $colorGrayLight; + border-radius: 4px; + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_staking.scss b/packages/browser-wallet-ui/src/scss/_staking.scss new file mode 100644 index 0000000..594f022 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_staking.scss @@ -0,0 +1,226 @@ +#apy_info { + width: 112px; + height: 112px; + margin: 0 auto; + border: 1px solid $colorWhite; + border-radius: 56px; + padding-top: 24px; + + .text { + font-weight: 500; + margin-top: -6px; + } +} +#staking_intro { + .step { + pointer-events: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding-top: 60px; + + &.step-active { + pointer-events: auto; + } + + .image { + opacity: 0; + height: 260px; + text-align: center; + + svg { + width: 90%; + height: 100%; + } + } + + .info { + .step-number { + opacity: 0; + display: block; + width: 24px; + height: 24px; + line-height: 22px; + border-radius: 12px; + border: 1px solid $colorWhite; + margin: 8px auto 12px; + } + h3 { + opacity: 0; + } + p { + opacity: 0; + padding: 0 16px; + height: 86px; + } + .btn { + opacity: 0; + } + } + } + .dots { + opacity: 0; + position: fixed; + top: 540px; + left: 0; + width: 100%; + text-align: center; + + .dot { + position: relative; + display: inline-block; + margin-left: 30px; + margin-right: 30px; + background-color: $colorWhite; + width: 8px; + height: 8px; + border-radius: 4px; + z-index: 99; + transition: all ease-in-out 0.4s; + + &:after { + position: absolute; + top: -4px; + left: -4px; + width: 16px; + height: 16px; + border-radius: 8px; + border: 1px solid $colorWhite; + content: ""; + transition: all ease-in-out 0.4s; + } + + &.dot-active { + background-color: $colorGreenElectric; + + &:after { + border-color: $colorGreenElectric; + } + + .dot-line { + background-position: left; + } + } + + .dot-line { + position: absolute; + top: 3px; + left: -60px; + width: 56px; + height: 1px; + background: linear-gradient(to left, $colorWhite 50%, $colorGreenElectric 50%) right; + + transition: all ease-in-out 0.4s; + background-size: 200% 100%; + z-index: 1; + } + } + } +} +#staking_collators { + position: relative; + height: 100%; + + .btn { + transition: all linear 0.2s; + border-bottom: 2px solid $colorWhite !important; + + &:hover .badge, + &:active .badge, + &:focus .badge, + &.active .badge { + background-color: $colorTealLight; + color: $colorWhite; + } + &.active { + border-bottom: 2px solid $colorTealLight !important; + } + + .badge { + margin-left: 4px; + transition: all linear 0.1s; + } + } + .slide { + position: absolute; + top: 40px; + opacity: 0; + width: 100%; + height: calc(100% - 100px); + pointer-events: none; + + &.active { + pointer-events: auto; + } + } + .staking-info { + background-color: $colorTealLight; + color: $colorWhite; + padding: 8px; + width: 100%; + border-radius: 8px; + height: 70px; + margin-top: 8px; + } + .list-header { + padding: 8px 0; + font-size: 10px; + font-weight: 500; + color: $colorBlueGray; + } + .collator-list { + height: calc(100% - 106px); + overflow: hidden; + overflow-y: scroll; + padding-right: 8px; + padding-bottom: 8px; + + .button-item { + position: relative; + + .jdenticon { + text-align: center; + width: 70px; + } + .collator-name { + position: absolute; + top: 12px; + left: 70px; + } + } + } +} +#amounts .collator-image { + position: absolute; + top: -41px; + left: calc(50% - 41px); + width: 80px; + height: 80px; + text-align: center; + padding-top: 10px; + background-color: $colorWhite; + border-radius: 40px; + border: 2px solid $colorTealLight; +} +#staking_info { + position: fixed; + bottom: 80px; + left: 0; + width: 100%; + padding: 0 22px; +} +#asset_info .selected .asset-icon { + &.animate-in svg { + transform: rotateY(0deg); + } + &.animate-out svg { + transform: rotateY(90deg); + } + + svg { + transition: all ease-out 0.3s; + transform: rotateY(-90deg); + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_transactions.scss b/packages/browser-wallet-ui/src/scss/_transactions.scss new file mode 100644 index 0000000..207699c --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_transactions.scss @@ -0,0 +1,36 @@ +#transactions { + min-height: 300px; + height: calc(100% - 5px); + overflow: hidden; + overflow-y: scroll; + padding-right: 8px; + padding-bottom: 8px; + scroll-behavior: smooth; + + &.smaller { + height: 320px; + } + + .button-item { + height: 65px; + padding: 0 8px; + opacity: 0; + margin-bottom: 10px; + } + .transaction-info { + width: 90%; + text-align: center; + text-transform: uppercase; + } +} +.transactions-end { + position: absolute; + margin-top: -45px; + left: 0; + width: calc(100% - 30px); + height: 45px; + background: linear-gradient(to bottom, transparent 0%, transparent 10%, $colorWhite 80%, $colorWhite 100%); + pointer-events: none; + + z-index: 55; +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_vars.scss b/packages/browser-wallet-ui/src/scss/_vars.scss new file mode 100644 index 0000000..b61844a --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_vars.scss @@ -0,0 +1,39 @@ +// colors +$colorAlertDanger: #6c1301; +$colorAlertWarning: #dc6803; +$colorAlertWarning1: #b05200; +$colorBadge: #ab1f01; +$colorBlack: #000000; +$colorBlueDark: #24293a; +$colorBlueGray: #667085; +$colorBlueGrayDark: #4f586e; +$colorBurntOrange: #991900; +$colorDark: #181818; +$colorDanger: #661100; +$colorDanger1: #cc2400; +$colorDanger2: #f53400; +$colorDanger2Active: #e12e00; +$colorErrorActive: #d22e03; +$colorGray: #8c92a1; +$colorGrayLight: #b1b4bd; +$colorGrayDark: #383a41; +$colorGreenElectric: #c0ff00; +$colorGreenElectric1: #a9e208; +$colorGreenElectric2: #9ecc00; +$colorInfo: #cc8800; +$colorLightestGray: #f8f8f9; +$colorLightGray: #d9d9d9; +$colorLightGray1: #d5d6da; +$colorSuccess: #039855; +$colorTealDark: #133948; +$colorTealDarker: #19363d; +$colorTealDarkest: #0c232d; +$colorTealMedium: #2a4e57; +$colorTealLight: #224851; +$colorTealLighter: #026aa2; +$colorWhite: #ffffff; +$colorWhiteish: #f2f4f7; +$colorWhiteish1: #e4e7ec; +$colorWhiteishGreen: #e9f2d9; + +$colorTransDark: #16161638; \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_wallet-create.scss b/packages/browser-wallet-ui/src/scss/_wallet-create.scss new file mode 100644 index 0000000..572b490 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_wallet-create.scss @@ -0,0 +1,174 @@ +#full_page { + .content { + .choose-words { + .btn { + &.btn-left { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + &.btn-right { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + } + } + + .help-desc { + user-select: none !important; + padding-left: 16px; + font-weight: 500; + color: $colorBlueGray; + } + + .mnemonics { + width: 100%; + + &.mnemonics-hidden { + user-select: none !important; + } + &.clickable { + .word { + &.selected { + .badge { + transform: scale(0.9) !important; + background-color: $colorWhite !important; + border: 2px dashed $colorLightGray1; + transition: none !important; + } + .index { + display: none; + } + .remove { + display: none; + } + } + &:hover { + cursor: pointer; + + .badge { + border-left-width: 2px; + border-right-width: 2px; + + .remove { + width: 24px; + opacity: 1; + + &:hover { + background-color: $colorBadge; + } + } + } + + > * { + pointer-events: none; + z-index: 99; + } + } + + .badge { + border: 2px solid $colorWhite; + + .remove { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 100%; + line-height: 100%; + font-size: 10px; + color: $colorWhite; + background-color: $colorDanger1; + border-radius: 8px 0 0 8px; + transition: all linear 0.2s; + z-index: 99; + pointer-events: all !important; + overflow: hidden; + opacity: 0; + + &:hover > * { + pointer-events: none; + } + + span { + display: block; + width: 100%; + text-align: center; + } + } + } + } + } + &.bordered { + min-height: 38px; + border: 1px solid $colorLightestGray; + border-radius: 8px; + padding: 4px; + + &.bordered-green { + border-color: $colorGreenElectric; + } + } + &.dragging .word .badge .remove { + transition: none !important; + opacity: 0 !important; + } + &.mnemonics-hidden .word .badge .text { + color: transparent !important; + text-shadow: 0 0 4px $colorGrayLight; + } + + .word { + padding: 2px; + overflow: visible; + + .badge { + position: relative; + display: flex; + border-radius: 8px; + background-color: $colorLightestGray !important; + color: $colorDark !important; + padding: 9px 4px 9px 8px; + z-index: 10; + transition: all 0.3s; + + .icon { + width: 13px; + font-size: 11px; + color: $colorGrayLight; + } + + .index { + font-size: 12px; + width: 14px; + line-height: 14px; + text-align: center; + color: $colorGrayLight; + user-select: none; + } + + .text { + width: 100%; + text-align: center; + font-size: 15px; + text-transform: lowercase; + } + } + } + } + + #mnemonics_info { + font-size: 14px; + font-weight: 500; + padding: 10px 12px; + user-select: none; + + .col-6 { + padding: 0 8px; + } + .icon { + font-size: 22px; + margin: 0 12px; + } + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_wallet-list.scss b/packages/browser-wallet-ui/src/scss/_wallet-list.scss new file mode 100644 index 0000000..500782d --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/_wallet-list.scss @@ -0,0 +1,69 @@ +#wallet_list { + height: 100%; + overflow-y: scroll; + padding-right: 8px; + padding-bottom: 8px; + + &.backup-list { + height: calc(100% - 130px); + } + + .button-item { + min-height: 82px; + } + + .button-item, + .current-wallet { + .kyc-status { + position: relative; + margin-top: 2px; + + &:after { + position: absolute; + font-size: 14px; + font-weight: 500; + bottom: 6px; + right: 6px; + } + + &.verified { + &:after { + bottom: 5px; + color: $colorTealLight; + } + + .icon { + color: $colorGreenElectric; + } + + &.verified-1:after { + content: "1" + } + &.verified-2:after { + content: "2" + } + &.verified-3:after { + content: "3" + } + &.verified-4:after { + content: "4" + } + } + + &.unverified { + display: none; + + &:after { + color: $colorBlueGrayDark; + content: "x" + } + } + + .icon { + color: $colorLightestGray; + font-size: 22px !important; + text-shadow: 0 1px 2px rgba(17, 20, 30, 0.1), 0 1px 1px rgba(17, 20, 30, 0.06); + } + } + } +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/styles.scss b/packages/browser-wallet-ui/src/scss/styles.scss new file mode 100644 index 0000000..13aa255 --- /dev/null +++ b/packages/browser-wallet-ui/src/scss/styles.scss @@ -0,0 +1,42 @@ +@import "fonts"; +@import "vars"; +@import "animation"; + +@import "../../../../node_modules/bootstrap/scss/bootstrap"; +@import "../../../../node_modules/toastify-js/src/toastify.css"; +@import "icomoon"; + +@import "global"; +@import "app"; +@import "init"; +@import "loader"; +@import "header"; +@import "heading"; +@import "page"; +@import "footer"; +@import "login"; +@import "buttons"; +@import "forms"; +@import "dropdown"; +@import "quantity"; +@import "chart"; +@import "qrcode"; +@import "alert"; +@import "box"; +@import "notifications"; +@import "badges"; +@import "cards"; +@import "modals"; +@import "wallet-create"; +@import "wallet-list"; +@import "transactions"; +@import "info-messages"; +@import "kyc"; +@import "portfolio"; +@import "send"; +@import "staking"; + +@import "full-screen"; +@import "android"; +@import "ios"; +@import "macos"; diff --git a/packages/browser-wallet-ui/src/styles/app.css b/packages/browser-wallet-ui/src/styles/app.css deleted file mode 100755 index 24be563..0000000 --- a/packages/browser-wallet-ui/src/styles/app.css +++ /dev/null @@ -1,151 +0,0 @@ -html { - background: linear-gradient(to bottom, #224851, #133948) -} - -body.macos { - position: fixed; -} - -body.app { - position: relative; - height: 100vh; - min-height: 400px; - transition: all ease-out 0.33s; - -webkit-overflow-scrolling: touch; - touch-action: pan-y; -} -body.app * { - -webkit-overflow-scrolling: touch; - touch-action: pan-y; -} -body.app #login_screen { - position: absolute !important; - width: 100vw; - background-color: transparent; -} -body.app #login_screen:after { - background: linear-gradient(to bottom, #224851, #133948); - content: ""; - height: 100%; - position: fixed; - width: 100%; - top: 0; - z-index: 98; -} -body.app #init_screen { - position: fixed; - overflow: hidden; - background: linear-gradient(to bottom, #224851, #133948); -} -body.app #init_screen .init-logo { - position: fixed; - bottom: auto; - top: 300px; -} -body.app #full_page, -body.app #heading, -body.app #bordered_content { - position: absolute; - width: 100vw; -} -body.app #bordered_content { - overflow: auto; - overflow-x: hidden; -} -body.app.keyboard-opened #bordered_content { - padding-bottom: 16px; -} -body.app #bordered_content.no-overflow { - overflow: unset; -} -body.app #main_footer, -body.app .footer { - position: absolute; - width: calc(100vw - 32px); - left: 16px; -} -body.app.keyboard-opened .footer { - bottom: 8px !important; -} -body.app .footer { - bottom: 8px; - pointer-events: none; -} -body.app .footer > div { - pointer-events: all; -} -body.app .footer.double-footer { - bottom: 86px; -} -body.app #accounts_modal { - padding-top: 50px !important; -} -body.app #staking_intro .dots { - top: auto; - bottom: 120px; -} -body.app #staking_info { - padding: 0 16px; - bottom: 100px; -} -body.app #root .full-only { - background: linear-gradient(to bottom, #224851, #133948); -} -body.app #main_footer.disabled { - pointer-events: none !important; -} - -body.ios { - padding-top: 44px; -} -body.ios #header { - top: 44px -} -body.ios #root .full-only { - background-image: none; - background-color: #224851; -} -body.ios #accounts_modal { - width: 100%; - left: 0; - padding: 8px; -} -body.ios #accounts_modal .modal-header { - border: 1px solid transparent; -} -body.ios #bordered_content { - padding: 16px 16px 94px; - height: calc(100% - 168px); - top: 168px; -} -body.ios #bordered_content.smaller { - height: calc(100% - 300px); - top: 300px; - padding-top: 40px; -} -body.ios #bordered_content.medium { - height: calc(100% - 200px); - top: 200px; -} -body.ios #full_page { - height: calc(100% - 44px); -} -body.ios #full_page .content.full-content { - height: 100%; - padding-top: 80px; -} -body.ios #staking_intro .step { - padding-top: 140px -} -body.ios #main_footer, -body.ios .footer { - bottom: 24px; -} -body.ios #full_page .content { - height: calc(100% - 60px); -} - -body.android #bordered_content { - padding: 16px 16px 94px; - height: calc(100% - 124px); -} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/styles/ios.css b/packages/browser-wallet-ui/src/styles/ios.css deleted file mode 100644 index 3fbcb29..0000000 --- a/packages/browser-wallet-ui/src/styles/ios.css +++ /dev/null @@ -1,170 +0,0 @@ -body.macos { - position: fixed; -} -body.ios { - height: 110%; - top: 0; - left: 0; - -webkit-overflow-scrolling: touch; - touch-action: pan-y; - background-color: #224851 !important; -} -body.ios * { - -webkit-overflow-scrolling: touch; - touch-action: pan-y; -} -body.ios #login_screen { - background-image: none; - background-color: #224851; -} -body.ios #login_screen.mini .footer { - bottom: 16px; - left: 16px; - width: calc(100% - 32px); -} -body.ios #init_screen { - background-image: none; - background-color: #224851; - overflow: hidden; -} -body.ios #full_page, -body.ios #heading, -body.ios #bordered_content { - position: absolute; - width: 100vw; -} -body.ios #root .full-only { - background-image: none; - background-color: #224851; -} -/*body.ios #root .bitgreen-svg {*/ -/* position: fixed;*/ -/* top: auto;*/ -/* bottom: 70%;*/ -/*}*/ -/*body.ios #root .separator {*/ -/* position: fixed;*/ -/* top: auto;*/ -/* bottom: calc(70% - 20px);*/ -/*}*/ -/*body.ios #root .browser-wallet {*/ -/* position: fixed;*/ -/* top: auto;*/ -/* bottom: calc(70% - 60px);*/ -/*}*/ -/*body.ios #root #get_started {*/ -/* position: fixed;*/ -/* top: auto;*/ -/* bottom: calc(70% - 200px);*/ -/* }*/ -body.ios #main_footer.disabled { - pointer-events: none !important; -} -body.ios #accounts_modal { - width: 100%; - left: 0; - padding: 8px; -} -body.ios #accounts_modal .modal-header { - border: 1px solid transparent; -} -body.app { - position: relative; - height: 100vh; - min-height: 400px; - padding-top: 44px; - transition: all ease-out 0.33s; -} -body.app #header { - top: 44px -} -body.app #login_screen { - position: absolute !important; - width: 100vw; - background-color: transparent; -} -body.app #login_screen:after { - background: linear-gradient(to bottom, #224851, #133948); - content: ""; - height: 100%; - position: fixed; - width: 100%; - top: 0; - z-index: 98; -} -body.app #init_screen { - position: fixed; - background: linear-gradient(to bottom, #224851, #133948); -} -body.app #init_screen .init-logo { - position: fixed; - bottom: auto; - top: 300px; -} -body.app #bordered_content { - padding: 16px 16px 94px; - height: calc(100% - 168px); - top: 168px; - overflow: scroll; -} -body.app.keyboard-opened #bordered_content { - padding-bottom: 16px; -} -body.app #bordered_content.smaller { - height: calc(100% - 300px); - top: 300px; - padding-top: 40px; -} -body.app #bordered_content.medium { - height: calc(100% - 200px); - top: 200px; -} -body.app #bordered_content.no-overflow { - overflow: unset; -} -body.app #main_footer, -body.app .footer { - position: absolute; - bottom: 24px; - width: calc(100vw - 32px); - left: 16px; -} -body.app.keyboard-opened .footer { - bottom: 8px !important; -} -body.app .footer { - pointer-events: none; -} -body.app .footer > div { - pointer-events: all; -} -body.app .footer.double-footer { - bottom: 86px; -} -body.app #accounts_modal { - padding-top: 50px !important; -} -body.app #full_page { - height: calc(100% - 44px); -} -body.app #full_page .content.full-content { - height: 100%; - padding-top: 80px; -} -body.app #staking_intro .step { - padding-top: 140px -} -body.app #staking_intro .dots { - top: auto; - bottom: 120px; -} -body.app #staking_info { - padding: 0 16px; - bottom: 100px; -} -body.app #full_page .content { - height: calc(100% - 60px); -} -body.app #root .full-only { - background: linear-gradient(to bottom, #224851, #133948); -} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/styles/main.css b/packages/browser-wallet-ui/src/styles/main.css deleted file mode 100644 index b48397d..0000000 --- a/packages/browser-wallet-ui/src/styles/main.css +++ /dev/null @@ -1,3151 +0,0 @@ -@charset "UTF-8"; -@font-face { - font-family: 'Neue Haas Unica Pro'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Light.ttf') format('truetype'); -} -@font-face { - font-family: 'Neue Haas Unica Pro'; - font-style: normal; - font-weight: normal; - font-display: swap; - src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Regular.ttf') format('truetype'); -} -@font-face { - font-family: 'Neue Haas Unica Pro'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Regular.ttf') format('truetype'); -} -@font-face { - font-family: 'Neue Haas Unica Pro'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url('../assets/fonts/neue-haas-unica-pro/NeueHaasUnicaPro-Medium.ttf') format('truetype'); -} - -@keyframes beat-fade { - 0%, to { - color: #FFFFFF; - fill: #FFFFFF; - transform: scale(1) - } - 50% { - color: #F8F8F9; - fill: #F8F8F9; - transform: scale(1.125) - } -} -@keyframes beat-text-fade { - 0%, to { - color: #D9D9D9; - fill: #D9D9D9; - } - 50% { - color: #FFFFFF; - fill: #FFFFFF; - } -} -@keyframes dash { - to { - stroke-dashoffset: 1000; - } -} - -@keyframes rotation { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -* { - font-family: "Neue Haas Unica Pro", sans-serif !important; -} - -html { - height:100%; -} - -:root { - --main-bg-color: #224851; - --secondary-font :#667085; -} -body { - font-family: 'Neue Haas Unica Pro', sans-serif; - width: 100%; - min-width: 400px; - min-height: 600px; - height: 100%; - color: #224851; - font-size: 14px; - line-height: 14px; - overflow: hidden; - background: linear-gradient(to bottom, #224851, #133948); -} -h1 { - font-weight: 500; - font-size: 24px; - color: #181818; -} -h2 { - font-weight: 500; - font-size: 22px; - color: #181818; -} -h3 { - font-weight: 500; - font-size: 18px; - color: #181818; -} -h4 { - font-weight: 500; - font-size: 16px; - color: #181818; -} -h5 { - font-weight: 500; - font-size: 14px; - color: #181818; -} -h6 { - font-weight: 400; - font-size: 12px; - color: #181818; -} -p { - line-height: 18px; - margin-bottom: 0; -} -.text-white { - color: #ffffff !important; -} -.text-light-gray { - color: #d5d6da; -} -.text-gray { - color: #667085; -} -.text-disabled { - color: #8C92A1 !important; -} -.text-green { - color: #C0FF00 !important; -} -.text-dark { - color: #181818; -} -.text-danger { - color: #CC2400; -} -.text-dark-blue { - color: #224851 !important; -} -.text-small { - font-size: 14px !important; -} -.text-bigger { - font-size: 16px; -} -.text-biggest { - font-size: 20px; -} -.text-very-small { - font-size: 12px; -} -.text-grotesk { - font-weight: 300; -} -.text-bold { - font-weight: 500; -} -.text-semibold { - font-weight: 400; -} -.text-grotesk.text-bold { - font-weight: 500; -} -.text-left { - text-align: left !important; -} -.text-right { - text-align: right !important; -} -.select-none { - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -.btn { - font-style: normal; - font-weight: 500; - font-size: 16px; - line-height: 24px; - border-radius: 0; - padding: 10px 18px; - box-shadow: none !important; -} -.btn * { - pointer-events: none !important; -} -.btn.btn-hidden { - pointer-events: none; -} -.btn.btn-sm { - padding: 4px 12px; - font-size: 14px; - line-height: 22px; - min-height: 40px; -} -.btn.btn-xs { - padding: 4px 6px !important; - font-size: 12px; - line-height: 22px; - min-height: 30px; -} -.btn-primary { - background-color: #C0FF00; - border-color: #C0FF00; - color: #181818; -} -.btn-primary:hover, .btn-primary:active { - background-color: #A9E208 !important; - border-color: #A9E208 !important; - color: #181818 !important; -} -.btn-danger { - background-color: #F53400; - border-color: #F53400; - color: #FFFFFF; -} -.btn-danger:hover, .btn-danger:active { - background-color: #e12e00 !important; - border-color: #e12e00 !important; - color: #FFFFFF !important; -} -.btn-outline-danger { - background-color: #FFFFFF; - border-color: #F53400; - color: #F53400; -} -.btn-outline-danger:hover, .btn-outline-danger:active { - background-color: #e12e00 !important; - border-color: #e12e00 !important; - color: #FFFFFF !important; -} -.btn.btn-outline-danger.disabled { - background-color: #FFFFFF !important; - border-color: #D5D6DA !important; -} -.btn-dark { - background-color: #224851; - border-color: #224851; - color: #ffffff; -} -.btn-dark:hover, .btn-dark:active { - background-color: #19363d !important; - border-color: #19363d !important; - color: #ffffff !important; -} -.btn-secondary-outline { - background-color: #F8F8F9; - border-color: #224851; - color: #224851; -} -.btn-secondary-outline:hover, .btn-secondary-outline:active { - background-color: #D5D6DA !important; - border-color: #224851 !important; - color: #224851 !important; -} -.btn-secondary { - background-color: #224851; - border-color: #224851; - color: #ffffff; -} -.btn-secondary:hover, .btn-secondary:active { - background-color: #19363d !important; - border-color: #19363d !important; - color: #ffffff !important; -} -.btn-text { - background-color: transparent; - border: none !important; - color: #383a41; -} -.btn-text:hover, .btn-text:active { - color: #000000; -} -.btn-text.btn-danger-text { - background-color: transparent; - color: #F53400; -} -.btn-text.btn-danger-text:hover, .btn-text.btn-danger-text:active { - color: #e12e00; -} -.btn-text.btn-bordered { - border: 1px solid #D5D6DA !important; -} -.btn-text.btn-bordered:hover, .btn-text.btn-bordered:active { - border: 1px solid #B1B4BD !important; -} -.btn.disabled { - background-color: #D5D6DA !important; - opacity: 1; - pointer-events: none; - border-color: transparent !important; - color: #181818 !important; -} -.btn.btn-rounded { - border-radius: 4px; -} -.btn-white { - border: 2px solid #FFFFFF !important; - color: #FFFFFF; -} -.btn-white:hover, .btn-white:active { - color: #D5D6DA !important; - border-color: #D5D6DA !important; -} -.rounded-left { - border-top-left-radius: 4px !important; - border-bottom-left-radius: 4px !important; -} -.rounded-right { - border-top-right-radius: 4px !important; - border-bottom-right-radius: 4px !important; -} -.btn .icon { - font-size: 14px; - margin-left: 8px; - min-width: 20px; -} -.btn .icon.icon-left { - margin-left: 0; - margin-right: 8px; -} -.btn .icon.icon-large { - font-size: 18px; -} -.btn.btn-sm .icon { - font-size: 12px; - margin-left: 6px; - min-width: 18px; -} -.btn.btn-sm .icon.icon-left { - margin-left: 0; - margin-right: 6px; -} -.btn.btn-sm .icon.icon-large { - font-size: 16px; -} -.btn-error { - color: #F53400; -} -.btn-error:hover, .btn-error:active { - color: #d22e03 !important; -} -.click { - cursor: pointer !important; -} -.alert { - padding: 0; - margin-bottom: 8px; -} -.alert-info { - background-color: #ffffff; - border-color: #224851; - color: #24293A; -} -.alert-danger { - background-color: #ffffff; - border-color: #991900; - color: #991900; -} -.alert-warning { - background-color: #ffffff; - border-color: #DC6803; - color: #DC6803; -} -.alert-danger-transparent { - background-color: transparent; - border-color: rgba(255, 255, 255, 0.4); - color: #FFFFFF; -} -.alert-info-transparent { - background-color: transparent; - border-color: rgba(255, 255, 255, 0.4); - color: #FFFFFF; -} -.alert-dismissible { - padding-right: 8px !important; -} -.alert .icon { - width: 60px; - color: #ffffff; - text-align: center; -} -.alert .icon .icon-small { - font-size: 20px !important; -} -.alert.alert-info .icon { - background-color: #224851; -} -.alert.alert-danger .icon { - background-color: #991900; -} -.alert.alert-warning .icon { - background-color: #DC6803; -} -.alert.alert-danger-transparent .icon { - background-color: rgba(255, 255, 255, 0.4); - color: #F53400; -} -.alert .icon span { - width: 100%; - font-size: 26px; -} -.alert .close-alert { - position: absolute; - top: 0; - right: 0; - padding: 6px; - font-size: 12px; - - transition: all linear 0.2s; -} -.alert.alert-danger .close-alert { - color: #6c1301; -} -.alert.alert-danger .close-alert:hover, -.alert.alert-danger .close-alert:focus, -.alert.alert-danger .close-alert:active { - color: #991900; -} -.alert.alert-warning .close-alert { - color: #b05200; -} -.alert.alert-warning .close-alert:hover, -.alert.alert-warning .close-alert:focus, -.alert.alert-warning .close-alert:active { - color: #DC6803; -} -label.label { - font-weight: 500; - font-size: 16px; - margin: 6px 0 10px 0; -} -.form-group { - border: 1px solid #D5D6DA; - /*border-radius: 0;*/ - box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05) !important; - border-radius: 4px !important; -} -.form-group.custom-border { - border: none; - box-shadow: none !important; -} -.form-group .input-group { - border-radius: 6px !important; -} -.form-group .input-group .input-group-text { - /*border-right: 1px solid #D5D6DA;*/ - border-radius: 4px 0 0 4px; -} -.form-group .input-group .form-control { - margin-left: 0 !important; - border-radius: 4px; - padding: 0.375rem 0.5rem; -} -.form-group.custom-border .input-group-text.rounded-left { - border-top: 1px solid #D5D6DA; - border-left: 1px solid #D5D6DA; - border-bottom: 1px solid #D5D6DA; -} -.form-group.custom-border .form-control, -.form-group.custom-border .show-password { - border-top: 1px solid #D5D6DA; - border-bottom: 1px solid #D5D6DA; -} -.form-group .form-control { - border: 0; - border-radius: 0; - box-shadow: none !important; - padding-left: 0; - background-color: #FFFFFF !important; - font-size: 14px; -} -.form-group .form-control.form-control-sm { - font-size: 12px; -} -.form-control.custom-control { - position: relative; - text-align: center; - border-radius: 0; - border: none; - background-color: transparent; - border-bottom: 4px solid rgba(255, 255, 255, 0.1); - box-shadow: none !important; - color: #FFFFFF; - font-size: 20px; - font-weight: 500; - width: 100%; - padding: 8px 8px 4px; - transition: all linear 0.2s; -} -.form-control.custom-control:disabled { - border-bottom: 4px solid transparent; -} -.form-control.custom-control::placeholder { - color: rgba(255, 255, 255, 0.7); - transition: all linear 0.2s; -} -.form-control.custom-control:focus::placeholder { - color: rgba(255, 255, 255, 1); -} -.form-control.custom-control:focus { - border-bottom-color: rgba(255, 255, 255, 0.4); -} -.form-control.password-control { - position: relative; -} -.input-group.disabled { - background-color: #F8F8F9; -} -.input-group.disabled .form-control, -.input-group.disabled .input-group-text { - background-color: #F8F8F9 !important; - color: #667085; -} - -.form-group .input-group-text { - background-color: #ffffff; - border-radius: 0; - border: 0; - font-size: 12px; - padding: 0; -} -.form-group .input-group-text.transparent { - background-color: transparent; -} -.form-group .input-group-text.bigger { - font-size: 16px; -} -.form-group .input-group-text .icon { - width: 48px; - height: 32px; - text-align: center; - line-height: 32px; -} -.input-group .show-password { - color: #000000; - background-color: #FFFFFF; - width: 42px; - text-align: center; - height: 42px; - line-height: 42px; - font-size: 16px; -} -.input-group .show-password .icon { - cursor: pointer; -} -.form-switch { - margin: 12px 0; -} -.form-switch .form-check-input { - border-radius: 12px; - width: 44px; - height: 24px; - border: none !important; - margin-top: 0; - margin-right: 12px; - background-color: #F8F8F9 !important; - background-image: url("data:image/svg+xml,") !important; - outline: none !important; - box-shadow: none !important; - filter: none !important; - transition: all linear 0.2s; -} -.form-switch .form-check-input:checked { - background-color: #C0FF00 !important; -} -.form-switch .form-check-input.darker { - background-color: #D5D6DA !important; -} -.form-switch .form-check-input.darker:checked { - background-color: #A9E208 !important; -} -.form-switch .form-check-label { - height: 24px; - line-height: 24px; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -.form-switch .form-check-label h4 { - height: 24px; - line-height: 24px; -} -.border-right-0 { - border-right: none !important; -} -.no-border-radius { - border-radius: 0 !important; -} -.badge { - font-weight: 500; -} -.badge.hidden { - display: none !important; -} -.badge.badge-rounded { - height: 18px; - line-height: 16px; - border-radius: 8px; - padding: 0 8px; -} -.badge.badge-circle { - width: 20px; - height: 20px; - line-height: 12px; - text-align: center; - border-radius: 10px; - padding: 4px 0; -} -.badge.badge-primary { - background-color: #C0FF00; - color: #224851; -} -.badge.bade-gray { - background-color: #F2F4F7; - color: #24293A; -} -.badge.badge-secondary { - background-color: #224851; - color: #FFFFFF; -} -.card { - border-radius: 8px; -} -.card .card-header { - font-size: 18px; - text-align: center; - font-weight: 500; - padding: 16px; - border-radius: 6px 6px 0 0; -} -.card.card-primary { - border-color: #224851; -} -.card.card-primary .card-header { - background-color: #224851; - color: #FFFFFF; -} -#header { - position: fixed; - width: 100%; - top: 0; - height: 56px; - padding: 8px 8px 8px 16px; - z-index: 999; - opacity: 0; - pointer-events: none; -} -#header.visible { - opacity: 1; - pointer-events: auto; -} -#header #top_logo svg { - transition: all ease-out 0.3s; -} -#header #top_logo svg:hover { - transform: scale(1.1); -} -#header #top_logo.full svg:hover { - transform: scale(1); -} -#header #top_logo .full-logo, -#header #top_logo.full .b-logo { - position: absolute; - display: none !important; -} -#header #top_logo.full .full-logo { - position: relative; - display: block !important; -} -#header #actions svg { - margin: 0 8px; -} -#header #actions #go_copy { - transition: all ease-out 0.22s; -} -#header #actions #go_copy:hover { - transform: scale(1.15); -} -#header #actions #go_copy * { - pointer-events: none !important; -} -#header #actions #go_settings { - transition: all ease-out 0.22s; -} -#header #actions #go_settings:hover { - transform: rotate(45deg) scale(1.1); -} -#login_screen { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: url('../assets/bg.png'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - opacity: 1; - - z-index: 9998; -} -#login_screen.fade-out { - opacity: 0 !important; - transition: all ease-in 0.3s; -} -#login_screen.inactive { - display: none !important; - z-index: -1; -} -#login_screen #input_form { - transition: all ease-in 0.3s; - visibility: visible; -} -#login_screen #input_form.inactive { - opacity: 0; - visibility: hidden; - pointer-events: none; -} -#login_screen #status_message { - position: absolute; - text-align: center; - bottom: 0; - left: 0; - width: 100%; - height: 36px; - opacity: 0; - transition: all ease-in-out 0.4s; - color: #D9D9D9; - font-size: 12px; - font-weight: 500; - text-transform: uppercase; - - animation-name: beat-text-fade; - animation-iteration-count: infinite; - animation-timing-function: cubic-bezier(.4, 0, .6, 1); - animation-duration: 1s; -} -#login_screen #status_message.active { - opacity: 1; -} -#init_screen { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: url('../assets/bg.png'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - opacity: 1; - - z-index: 99999; -} -#init_screen.fade-out { - opacity: 0; - transition: all ease-in 0.3s; -} -#init_screen.inactive { - opacity: 0 !important; - pointer-events: none !important; - z-index: -1; -} -#init_screen.fade-in { - opacity: 1 !important; - transition: all ease-in 0.3s; -} -#init_screen .init-logo { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 124px; - margin: auto; - - width: 102px; - height: 128px; -} -#init_screen.fade-out .init-logo { - transform: scale(30); - transition: all linear 1.5s; -} -#loading_content { - position: absolute; - left: 0; - top: 16px; - width: 100%; - height: 100%; - text-align: center; - padding-top: 80px; - background-color: #FFFFFF; - transition: all linear 0.4s; - visibility: hidden; - opacity: 0; - border-top-right-radius: 10px; - border-top-left-radius: 10px; - - z-index: 100; -} -#loading_content.no-border-radius { - border-radius: 0 !important; -} -#loading_content.active { - opacity: 1; - visibility: visible; -} -#loading_content .bbb-icon { - font-size: 42px; - animation-name: beat-fade; - animation-iteration-count: infinite; - animation-timing-function: cubic-bezier(.4, 0, .6, 1); - animation-duration: 2s; - - fill: #F8F8F9; -} -#loading_content .bbb-icon path { - stroke: #C0FF00; - stroke-width: 3px; - stroke-linecap: round; - stroke-linejoin: round; - stroke-dasharray: 100; - - animation-name: dash; - animation-iteration-count: infinite; - animation-duration: 20s; -} -#loading_content #content { - position: relative; - display: block; - width: 100%; - min-height: 200px; -} -#loading_content #content .init { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - - transition: all ease-in-out 0.4s; -} -#loading_content #content .done { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - transition: all ease-in-out 0.4s; - - opacity: 0; -} -#loading_content #content .done .desc { - margin-bottom: 30px; -} -#loading_content #content .done.active { - opacity: 1; -} -#loading_content .text { - width: 100%; - text-transform: uppercase; - color: #667085; - font-weight: 500; - font-size: 10px; - text-align: center; - padding-top: 16px; -} -#loading_content.circle .text { - color: #224851; - font-size: 22px; - text-transform: capitalize; -} -#loading_content .desc { - font-weight: 400; - font-size: 14px; - padding: 12px 56px; - color: #667085; -} -#loading_content #loading_circle { - animation: rotation 3.333s linear infinite; -} -#loading_content #loading_circle #primary { - stroke: #224851; -} -#loading_content #loading_circle #secondary { - stroke: #D5D6DA; -} -#loading_content #checkmark, -#loading_content #failed { - position: absolute; - top: 108px; - left: calc(50% - 22px); - opacity: 0; - - transition: all ease-in-out 0.4s; -} -#loading_content #failed { - top: 90px; - left: calc(50% - 30px); -} -#loading_content #checkmark path { - fill: #224851; - - transition: all ease-in-out 0.4s; -} -#loading_content #failed path { - fill: #CC2400; - - transition: all ease-in-out 0.4s; -} -#loading_content.done #loading_circle { - animation: none; -} -#loading_content #checkmark.show, -#loading_content #failed.show { - opacity: 1; -} -#loading_content.dark { - background-color: #224851; -} -#loading_content.dark #loading_circle #primary { - stroke: #FFFFFF; -} -#loading_content.dark #loading_circle #secondary { - stroke: transparent; -} -#loading_content.dark.circle .text { - color: #FFFFFF; -} -#loading_content.dark .desc { - color: #FFFFFF; -} -#loading_content.dark #checkmark path { - fill: #FFFFFF; -} -#bbb_loader { - position: relative; - width: 100%; - height: auto; - top: 0; - background-color: transparent; - text-align: center; -} -#bbb_loader.centered { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - text-align: center; -} -#bbb_loader .bbb-icon { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 124px; - margin: auto; - - width: 102px; - height: 128px; - animation-duration: 2s; -} -#bbb_loader.active .bbb-icon { - font-size: 42px; - animation-name: beat-fade; - animation-iteration-count: infinite; - animation-timing-function: cubic-bezier(.4, 0, .6, 1); -} -#bbb_loader.active .bbb-icon path { - stroke: #C0FF00; - stroke-width: 3px; - stroke-linecap: round; - stroke-linejoin: round; - stroke-dasharray: 100; - - animation-name: dash; - animation-iteration-count: infinite; - animation-duration: 20s; -} -#bbb_loader .text { - position: absolute; - bottom: 80px; - width: 100%; - color: #D9D9D9; - - text-align: center; - padding-top: 16px; - transition: all ease-in-out 0.4s; - opacity: 0; - - font-size: 12px; - font-weight: 500; - text-transform: uppercase; - - animation-name: beat-text-fade; - animation-iteration-count: infinite; - animation-timing-function: cubic-bezier(.4, 0, .6, 1); - animation-duration: 1s; -} -#bbb_loader.active .text { - opacity: 1; -} - -#root { - width: 100%; - height: 100%; - padding: 0; - overflow: hidden; - opacity: 0; -} -#root .full-only { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: url('../assets/bg.png'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - - z-index: -1; -} -#root.freeze * { - pointer-events: none !important; -} -#root.init { - opacity: 1; - - transition: all ease-in-out 0.4s; -} - -.bitgreen-svg { - position: fixed; - top: 180px; - left: 0; - right: 0; - margin: auto; - z-index: 99; -} - -.separator { - position: fixed; - top: 250px; - left: 0; - right: 0; - margin: auto; - width: 50px; - height: 2px; - background: #ffffff; - z-index: 99; -} -.separator-line { - margin: 0 auto 8px; - width: 100%; - height: 1px; - background-color: #D9D9D9; -} - -.browser-wallet { - position: fixed; - top: 260px; - left: 0; - right: 0; - margin: auto; - color: #ffffff; - font-size: 16px; - font-weight: 500; - line-height: 24px; - letter-spacing: 0; - text-align: center; - user-select: none !important; - z-index: 99; -} -.animated { - transition: all linear 0.2s; -} -.hidden { - visibility: hidden; - opacity: 0; -} -.transparent-element { - opacity: 0; -} -#get_started { - position: fixed; - top: 380px; - left: 0; - right: 0; - width: 150px; - margin: auto; - box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05); -} - -#heading { - position: relative; - display: block; - width: 100%; - height: 124px; - padding: 60px 16px 16px 16px; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#heading.custom-header { - padding: 0; -} -#heading.bigger { - height: 230px; -} -#heading.medium { - height: 165px; -} -#heading #logo { - display: inline-block; - float: left; -} -#heading .content { - padding-top: 10px; -} -#heading.custom-header .heading { - width: 100%; - height: 60px; - padding: 12px 24px 12px 24px; - background-color: transparent; - color: #ffffff; -} -#heading.custom-header .fixed-title { - position: absolute; - left: 0; - bottom: 22px; -} -#go_back { - min-width: 40px; - text-align: center; - font-size: 18px; - transition: all linear 0.2s; -} -#go_back:hover { - transform: translateX(-4px); -} -#go_back .text { - display: inline-block; - margin-left: 12px; - font-weight: 500; - transition: all linear 0.2s; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#go_back:hover .text { - transform: translateX(4px); -} -#heading.custom-header .heading h3 { - width: 100%; - margin: 0; - text-align: center; - color: #ffffff; -} -#bordered_content { - opacity: 0; - position: fixed; - top: 124px; - left: 0; - right: 0; - - width: 100%; - height: calc(100% - 124px); - - padding: 16px 16px 76px; - - background-color: #ffffff; - border-radius: 16px 16px 0 0; -} -#bordered_content.smaller { - top: 254px; - height: calc(100% - 254px); - padding-top: 34px; -} -#bordered_content.medium { - top: 165px; - height: calc(100% - 165px); - padding-top: 20px; -} -#wallet_list { - height: 100%; - overflow-y: scroll; - padding-right: 8px; - padding-bottom: 8px; -} -#wallet_list.backup-list { - height: calc(100% - 130px); -} -#wallet_list .button-item { - min-height: 82px; -} -#wallet_list .button-item .kyc-status, -.current-wallet .kyc-status { - position: relative; - margin-top: 2px; - } -#wallet_list .button-item .kyc-status .icon, -.current-wallet .kyc-status .icon { - color: #F8F8F9; - font-size: 22px !important; - text-shadow: 0 1px 2px rgba(17, 20, 30, 0.1), 0 1px 1px rgba(17, 20, 30, 0.06); -} -#wallet_list .button-item .kyc-status.verified .icon, -.current-wallet .kyc-status.verified .icon { - color: #C0FF00; -} -#wallet_list .button-item .kyc-status:after, -.current-wallet .kyc-status:after { - position: absolute; - font-size: 14px; - font-weight: 500; - bottom: 6px; - right: 6px; -} -#wallet_list .button-item .kyc-status.unverified, -.current-wallet .kyc-status.unverified { - display: none; -} -#wallet_list .button-item .kyc-status.verified:after, -.current-wallet .kyc-status.verified:after { - bottom: 5px; - color: #224851; -} -#wallet_list .button-item .kyc-status.verified.verified-1:after, -.current-wallet .kyc-status.verified.verified-1:after { - content: "1" -} -#wallet_list .button-item .kyc-status.verified.verified-2:after, -.current-wallet .kyc-status.verified.verified-2:after { - content: "2" -} -#wallet_list .button-item .kyc-status.verified.verified-3:after, -.current-wallet .kyc-status.verified.verified-3:after { - content: "3" -} -#wallet_list .button-item .kyc-status.verified.verified-4:after, -.current-wallet .kyc-status.verified.verified-4:after { - content: "4" -} -#wallet_list .button-item .kyc-status.unverified:after, -.current-wallet .kyc-status.unverified:after { - color: #4F586E; - content: "x" -} -#bordered_content #top_items { - position: absolute; - top: -18px; - left: 12px; - right: 0; - width: 100%; - text-align: center; -} -#bordered_content #top_items button { - width: 144px; - border-radius: 4px; - height: 36px; - line-height: 20px; - padding: 0; - box-shadow: 0 1px 2px rgba(16, 24, 40, 0.1); - font-weight: 500; - font-size: 14px; - text-transform: uppercase; - opacity: 0; -} -#bordered_content #top_items button .icon { - font-size: 14px; -} -#current_wallet { - position: relative; - width: 100%; - margin-right: 8px; - padding: 6px 0 6px 10px; - z-index: 999; - cursor: pointer; - user-select: none !important; -} -#current_wallet.active:after { - border-radius: 8px 8px 0 0; -} -#current_wallet.hidden { - width: 0; -} -#current_wallet .jdenticon, -#current_wallet .jdenticon svg { - min-width: 32px; - min-height: 32px; - width: 32px; - height: 32px; -} -#current_wallet .jdenticon { - position: relative; - margin-right: 8px; - border-radius: 16px; - background-color: rgba(255, 255, 255, 0.22); -} -#current_wallet .jdenticon svg { - position: absolute; -} -#current_wallet .jdenticon .kyc-status { - position: absolute; - bottom: -2px; - right: -8px; - opacity: 0; -} -#current_wallet .jdenticon .kyc-status.verified { - opacity: 1; -} -#current_wallet .jdenticon .kyc-status .icon { - color: #F8F8F9; - font-size: 16px; - text-shadow: -1px -1px 0 #2a4e57, 1px -1px 0 #2a4e57, -1px 1px 0 #2a4e57, 1px 1px 0 #2a4e57; -} -#current_wallet .jdenticon .kyc-status.verified .icon { - color: #C0FF00; -} -#current_wallet .info { - color: #ffffff; - font-size: 12px; - width: 100%; -} -#current_wallet .info .desc { - display: block; - font-size: 14px; - width: 100%; - margin-top: 2px; - font-weight: 500; -} -#current_wallet .info .desc .icon { - margin: 0 4px 0 0; - color: #9ECC00; -} -#current_wallet .icon { - font-size: 6px; - margin-left: 4px; - margin-right: 4px; - color: #B1B4BD; -} -#current_wallet .icon.icon-down-arrow { - width: 20px; - margin: 0 8px 0 0; - text-align: center; - transition: all linear 0.2s; -} -#current_wallet.active .icon.icon-down-arrow { - transform: scaleY(-1); -} -#current_wallet .dropdown { - position: absolute; - width: 100%; - max-height: 136px; - top: 44px; - left: 0; - opacity: 0; - pointer-events: none; - overflow: auto; - overflow-x: hidden; - backdrop-filter: blur(8px); - background-color: rgba(44, 44, 44, 0.3); - border: 1px solid rgba(22, 22, 22, 0.3); - border-top: none; - border-radius: 0 0 4px 4px; - - transition: all linear 0.2s; - - -webkit-transform: translateY(-30px); - -moz-transform: translateY(-30px); - -ms-transform: translateY(-30px); - -o-transform: translateY(-30px); - transform: translateY(-30px); - - z-index: -1; -} -#current_wallet.active .dropdown { - opacity: 1; - pointer-events: auto; - transform: translateY(0); -} -#current_wallet .dropdown::-webkit-scrollbar { - width: 12px; -} -#current_wallet .dropdown::-webkit-scrollbar-track { - background: transparent; - border-radius: 4px; -} -#current_wallet .dropdown::-webkit-scrollbar-thumb { - background: rgba(22, 22, 22, 0.50); - border-radius: 8px; - border: 4px solid transparent; - background-clip: padding-box; -} -#current_wallet .dropdown::-webkit-scrollbar-thumb:hover { - background: rgba(22, 22, 22, 0.60); - border: 4px solid transparent; - background-clip: padding-box; -} -#current_wallet .dropdown .wallet { - padding: 6px 10px; - margin-right: -16px; -} -#current_wallet .dropdown .wallet:hover { - background: linear-gradient(to right, #16161638 0%, #16161638 70%, transparent 90%, transparent 100%); -} -.button-item { - width: 100%; - min-height: 85px; - background-color: #ffffff; - margin-bottom: 15px; - - box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); - border-radius: 4px; - cursor: pointer; - transition: all linear 0.3s; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - overflow: hidden; -} -.button-item.bordered { - border: 1px solid rgba(17, 20, 30, 0.03); -} -.button-item.disabled { - cursor: auto !important; -} -.button-item.click-only * { - pointer-events: none !important; -} -.button-item:hover { - box-shadow: 0 3px 4px rgb(17 20 30 / 18%), 0 2px 3px rgb(17 20 30 / 8%); - transition: box-shadow linear 0.1s; -} -.button-item.display-only { - cursor: default; -} -.button-item.display-only:hover { - box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); - transition: none !important; -} -.button-item .icon { - width: 60px; - font-size: 18px; -} -.button-item svg { - width: 56px; - height: 56px; - padding: 0 8px; -} -.button-item.button-gray { - background-color: #F8F8F9; -} -.button-item.settings-item { - cursor: auto; - box-shadow: none !important; - min-height: 45px; - height: auto; - margin-bottom: 8px; -} -.button-item.settings-item .icon { - transition: all linear 0.1s; - transform: translateX(-4px); - width: 15px; - font-size: 12px; -} -.button-item.settings-item.click:hover .icon { - transform: translateX(0px); -} -.button-item.settings-item select { - width: 120px; - outline: none !important; - border-radius: 0 !important; - border: 1px solid #E4E7EC !important; - box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05) !important; -} -.button-item.tab-item { - padding: 4px 0; - border-radius: 8px; - opacity: 0; - height: 114px; - margin-bottom: 12px; - border: 2px solid transparent; - transition: border-color linear 0.1s; -} -.button-item.tab-item:hover { - box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); - border-color: #224851; -} -.button-item.tab-item .icon { - display: block; - width: 100%; - height: 52px; - line-height: 42px; - font-size: 36px; - text-align: center; -} -.button-item.tab-item .title { - width: 100%; - height: 26px; - text-align: center; - font-size: 12px; - font-weight: 500; - color: #224851; -} -.button-item.tab-item .pill { - width: calc(100% - 12px); - margin-left: 6px; - margin-right: 6px; - height: 22px; - text-align: center; - font-size: 12px; - font-weight: 500; - color: #224851; - background-color: #FFFFFF; - border-radius: 12px; -} -.button-item.tab-item.disabled .title { - color: #8C92A1; -} -.button-item.tab-item.disabled .pill { - color: #FFFFFF; - background-color: #8C92A1; -} -.button-item.transaction-item { - min-height: 65px; - height: 65px; - overflow: hidden; - - border: 1px solid rgba(17, 20, 30, 0.03); - - transition: all ease-in-out 0.2s; -} -.button-item.transaction-item.active { - min-height: 265px; -} -.button-item.transaction-item .status { - position: relative; - text-align: center; - min-width: 32px; - height: 32px; - line-height: 30px; - background-color: #F8F8F9; - color: #4F586E; - font-size: 16px; - font-weight: 500; - border-radius: 16px; - padding-left: 1px; - margin: 0 16px 0 16px; - - transition: all ease-in-out 0.1s; -} -.button-item.transaction-item .status.success { - background-color: #9ECC00; - color: #ffffff; -} -.button-item.transaction-item .status.pending { - font-size: 16px; - background-color: #D9D9D9; - color: #ffffff; -} -.button-item.transaction-item .status.error { - background-color: #CC2400; - color: #ffffff; -} -.button-item.transaction-item .status.success .icon { - position: absolute; - top: 10px; - left: 0; - font-size: 12px; - width: 100%; - height: 100%; -} -.button-item.transaction-item .status.error .icon { - position: absolute; - top: 10px; - left: 0; - font-size: 12px; - width: 100%; - height: 100%; -} -.button-item.transaction-item .transaction-info { - width: 90%; - min-height: 65px; -} -.button-item.transaction-item .transaction-info .icon, -.button-item.transaction-item .amount, -.button-item.transaction-item .amount .digits { - text-align: center; - min-width: 28px; - height: 28px; - line-height: 28px; - margin-bottom: 2px; - color: #224851; -} -.button-item.transaction-item .amount .digits { - min-width: 0; -} -.button-item.transaction-item.transaction-item-big { - height: 72px; -} -.button-item.transaction-item.transaction-item-big .amount { - font-size: 26px; -} -.button-item.transaction-item.transaction-item-big .amount .digits { - font-size: 16px; -} -.button-item.transaction-item.transaction-item-big .desc { - font-size: 12px; -} -.button-item.transaction-item.transaction-item-disabled { - box-shadow: none; - border-color: transparent; - background-color: #F8F8F9; -} -.button-item.transaction-item.transaction-item-disabled .amount, -.button-item.transaction-item.transaction-item-disabled .amount * { - color: #667085 !important; -} -.button-item.transaction-item .transaction-info .icon { - padding: 0; - text-align: center; - font-size: 18px; - color: #383a41; -} -.button-item.transaction-item .desc { - color: #667085; - text-transform: uppercase; - font-weight: 500; - font-size: 12px; - text-align: center; -} -.button-item.transaction-item .transaction-info .token-amount { - width: 100px; -} -.button-item.transaction-item .transaction-info .col { - padding: 0 2px; - max-width: 64px; -} -.button-item.transaction-item .transaction-info .icon.icon-success { - color: #039855; -} -.button-item.transaction-item .transaction-info .icon.icon-green { - color: #9ecc00; -} -.button-item.transaction-item .transaction-info .icon.icon-error { - color: #CC2400; -} -.button-item.transaction-item .transaction-info .icon.icon-orange { - color: #cc8800; -} -.button-item.transaction-item .amount { - font-size: 20px; -} -.button-item.transaction-item .amount .digits { - position: relative; - font-size: 16px; - top: -2px; -} -.button-item.transaction-item .amount .dollar { - position: relative; - font-size: 16px; - top: 0; - right: 2px; -} -.button-item.transaction-item .icon.icon-right { - transition: all linear 0.1s; - transform: translateX(-4px); - min-width: 40px; - width: 40px; - font-size: 8px; - text-align: center; -} -.button-item.transaction-item.active .icon.icon-right { - transform: scaleY(-1) translateX(-4px); -} -.button-item.transaction-item.click:hover .icon.icon-right { - transform: translateX(0px); -} -.button-item.transaction-item .transaction-details { - background: #F8F8F9; - height: 190px; - padding: 16px; - overflow: hidden; - cursor: default; - transition: all 0.3s; -} -.button-item.transaction-item.small .transaction-details { - height: 80px; -} -.button-item.transaction-item.small.active { - min-height: 140px; -} -.button-item.transaction-item .transaction-details h4 { - margin: 0; - color: #224851; -} -.button-item.transaction-item .transaction-details .text-small { - word-break: break-all; -} -.button-item.transaction-item .transaction-details .element { - margin-bottom: 4px; -} -.button-item.transaction-item .transaction-details .element .icon { - color: #039855; -} -.button-item.transaction-item .transaction-details .element .icon.icon-cog { - font-size: 18px; -} -.button-item.transaction-item .transaction-details .element .icon.icon-code { - font-size: 26px; -} -.button-item.collator-item { - min-height: 70px; -} -#transactions { - min-height: 300px; - height: calc(100% - 5px); - overflow: hidden; - overflow-y: scroll; - padding-right: 8px; - padding-bottom: 8px; - scroll-behavior: smooth; -} -#transactions.smaller { - height: 320px; -} -.transactions-end { - position: absolute; - margin-top: -45px; - left: 0; - width: calc(100% - 30px); - height: 45px; - background: linear-gradient(to bottom, transparent 0%, transparent 10%, #FFFFFF 80%, #FFFFFF 100%); - pointer-events: none; - - z-index: 55; -} -::-webkit-scrollbar { - width: 10px; -} -::-webkit-scrollbar-track { - background: #F8F8F9; - border-radius: 4px; -} -::-webkit-scrollbar-thumb { - background: #E4E7EC; - border-radius: 4px; -} -::-webkit-scrollbar-thumb:hover { - background: #B1B4BD; -} -#transactions .button-item { - height: 65px; - padding: 0 8px; - opacity: 0; - margin-bottom: 10px; -} -#transactions .transaction-info { - width: 90%; - text-align: center; - text-transform: uppercase; -} -#transactions .button-item .icon.icon-small, -.button-item .icon.icon-small { - width: 10%; - font-size: 12px !important; -} -#full_page { - position: fixed; - width: 100%; - height: 100%; -} -#full_page .heading { - width: 100%; - height: 60px; - padding: 12px 64px 12px 24px; - color: #ffffff; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#full_page .heading.equal-padding { - padding: 12px 24px; -} -#full_page .heading .icon { - width: 40px; - text-align: center; - font-size: 18px; -} -#full_page .heading h3 { - width: 270px; - margin: 0; - text-align: center; - color: #ffffff; -} -#full_page .content { - position: relative; - width: 100%; - height: calc(100% - 60px); - padding: 16px; - background-color: #ffffff; - overflow: auto; - overflow-x: hidden; -} -#full_page .content.full-content { - height: 100%; -} -#full_page .content.full-content.secondary-bg { - background: linear-gradient(to bottom, #224851, #133948); - padding-top: 60px; -} -#full_page .content .icon-huge { - font-size: 53px; -} -#full_page .content .choose-words .btn.btn-left { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -#full_page .content .choose-words .btn.btn-right { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -#full_page .content .help-desc { - user-select: none !important; - padding-left: 16px; - font-weight: 500; - color: #667085; -} -#full_page .content .mnemonics { - width: 100%; -} -#full_page .content .mnemonics.mnemonics-hidden { - user-select: none !important; -} -#full_page .content .mnemonics .word { - padding: 2px; - overflow: visible; -} -#full_page .content .mnemonics .word .badge { - position: relative; - display: flex; - border-radius: 8px; - background-color: #F8F8F9 !important; - color: #181818 !important; - padding: 9px 4px 9px 8px; - z-index: 10; - transition: all 0.3s; -} -#full_page .content .mnemonics.clickable .word .badge { - border: 2px solid #ffffff; -} -#full_page .content .mnemonics.clickable .word.selected .badge { - transform: scale(0.9) !important; - background-color: #ffffff !important; - border: 2px dashed #D5D6DA; - transition: none !important; -} -#full_page .content .mnemonics.clickable .word.selected .index { - display: none; -} -#full_page .content .mnemonics.clickable .word.selected .remove { - display: none; -} -#full_page .content .mnemonics.clickable .word:hover { - cursor: pointer; -} -#full_page .content .mnemonics.clickable .word:hover .badge { - /*transform: scale(1.07);*/ - border-left-width: 2px; - border-right-width: 2px; -} -#full_page .content .mnemonics.clickable .word:hover > * { - pointer-events: none; - z-index: 99; -} -#full_page .content .mnemonics.clickable .word .badge .remove { - position: absolute; - top: 0; - left: 0; - width: 0; - height: 100%; - line-height: 100%; - font-size: 10px; - color: #ffffff; - background-color: #cc2400; - border-radius: 8px 0 0 8px; - transition: all linear 0.2s; - z-index: 99; - pointer-events: all !important; - overflow: hidden; - opacity: 0; -} -#full_page .content .mnemonics.clickable .word .badge .remove span { - display: block; - width: 100%; - text-align: center; -} -#full_page .content .mnemonics.clickable .word .badge .remove:hover > * { - pointer-events: none; -} -#full_page .content .mnemonics.clickable .word:hover .badge .remove { - width: 24px; - opacity: 1; -} -#full_page .content .mnemonics.clickable .word .badge .remove:hover { - background-color: #ab1f01; -} -#full_page .content .mnemonics.bordered { - min-height: 38px; - border: 1px solid #F8F8F9; - border-radius: 8px; - padding: 4px; -} -#full_page .content .mnemonics.bordered.bordered-green { - border-color: #C0FF00; -} -#full_page .content .mnemonics.dragging .word .badge .remove { - transition: none !important; - opacity: 0 !important; -} -#full_page .content .mnemonics .word .badge .icon { - width: 13px; - font-size: 11px; - color: #B1B4BD; -} -#full_page .content .mnemonics .word .badge .index { - font-size: 12px; - width: 14px; - line-height: 14px; - text-align: center; - color: #B1B4BD; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#full_page .content .mnemonics .word .badge .text { - width: 100%; - text-align: center; - font-size: 15px; - text-transform: lowercase; -} -#full_page .content .mnemonics.mnemonics-hidden .word .badge .text { - color: transparent !important; - text-shadow: 0 0 4px #B1B4BD; -} -#full_page .content #mnemonics_info { - font-size: 14px; - font-weight: 500; - padding: 10px 12px; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#full_page .content #mnemonics_info .col-6 { - padding: 0 8px; -} -#full_page .content #mnemonics_info .icon { - font-size: 22px; - margin: 0 12px; -} -#full_page #success_icon { - margin-top: 90px; - margin-bottom: 40px; -} -#full_page #message_text { - margin-bottom: 100px; -} -#full_page #password_input:after { - position: absolute; - top: -80px; - left: 0; - width: 100%; - height: 220px; - content: " "; - background: linear-gradient(to bottom, transparent 0%, transparent 10%, #FFFFFF 50%, #FFFFFF 100%); - z-index: 99; -} -#full_page #password_input .w-100 { - position: relative; - z-index: 999; -} -#main_footer { - position: fixed; - bottom: 8px; - left: 8px; - width: calc(100% - 16px); - background-color: #224851; - border-radius: 8px; - padding: 8px; - opacity: 0; - z-index: 99; - pointer-events: none; -} -#main_footer.visible { - display: block; - opacity: 1; - pointer-events: auto; -} -#main_footer .item { - width: 44px; - height: 44px; - border-radius: 4px; - color: #E9F2D9; - font-size: 18px; - transition: all linear 0.15s; - cursor: pointer; -} -#main_footer .item:hover, -#main_footer .item:focus, -#main_footer .item:active { - background-color: rgba(192, 255, 0, 0.05); - color: #C0FF00; - transition: color linear 0.3s; - -} -#main_footer .item:hover svg path, -#main_footer .item:focus svg path, -#main_footer .item:active svg path { - fill: #C0FF00; -} -#main_footer .item.active { - background-color: rgba(192, 255, 0, 0.1); - color: #C0FF00; -} -#main_footer .item.active svg path { - fill: #C0FF00; -} -/* .item-send is stroke, not a path */ -#main_footer .item.item-send:hover svg path, -#main_footer .item.item-send:focus svg path, -#main_footer .item.item-send:active svg path { - fill: transparent; - stroke: #C0FF00; -} -#main_footer .item.item-send.active svg path { - fill: transparent; - stroke: #C0FF00; -} -#main_footer .item:hover rect, -#main_footer .item:focus rect, -#main_footer .item:active rect { - stroke: #C0FF00; -} -#main_footer .item.active rect { - stroke: #C0FF00; -} -#main_footer .item * { - pointer-events: none; -} -.tooltip.tooltip-footer.show { - opacity: 1 !important; -} -.tooltip.tooltip-footer .tooltip-inner { - font-size: 12px; - font-weight: 500; - border-radius: 12px; - text-transform: uppercase; - color: #C0FF00; - padding: 2px 8px; - border: 1px solid #C0FF00; - background-color: #224851; -} -.footer-only { - padding: 16px; -} -.footer { - position: fixed; - left: 8px; - right: 8px; - bottom: 0; - width: calc(100% - 16px); - min-height: 65px; - padding-top: 8px; - padding-bottom: 8px; - z-index: 99; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -.footer.equal-footer { - padding-bottom: 0; - display: flex; - align-items: center; -} -.footer.double-footer { - bottom: 65px; -} - -.info-messages { - font-weight: 500; - color: #181818; -} -.info-messages.bigger { - font-size: 16px; -} -.info-messages .message { - padding: 4px 0; -} -.info-messages.bigger .message { - padding: 8px 0; -} -.info-messages .icon { - display: block; - width: 18px; - text-align: center; - color: #B1B4BD; - margin-right: 10px; -} -.info-messages .icon.icon-arrow-right-2 { - font-size: 12px; - color: #224851 !important; -} -.info-messages.bigger .icon { - width: 20px; - margin-right: 12px; -} -.info-messages .icon.icon-success { - color: #9ECC00; -} -.info-messages .icon.icon-check { - color: #9ECC00; -} -.info-messages .icon.icon-error { - color: #F53400; -} -#portfolio { - position: relative; - width: 100%; - height: 164px; - color: #ffffff; - padding: 8px; - opacity: 0; -} -#portfolio:after, -#current_wallet:after, -#go_kyc:after { - position: absolute; - top: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - content: " "; - backdrop-filter: blur(4px); - background-color: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 8px; - opacity: 0.8; - z-index: -1; - transition: all linear 0.1s; -} -#current_wallet:hover:after, -#go_kyc:hover:after { - border: 1px solid rgba(255, 255, 255, 0.3); -} -#portfolio:after { - background-color: rgba(255, 255, 255, 0.1); -} -#portfolio .info { - padding-left: 12px; -} -#portfolio .info h1, -#portfolio .info p { - opacity: 0; -} -#portfolio .info .icon { - display: inline-block; - margin-right: 8px; -} -#portfolio #bbb_token_info { - color: #C0FF00; - font-weight: 500; - font-size: 20px; -} -#portfolio #bbb_token_info .dollar { - font-weight: 400; - font-size: 14px; - margin-left: 8px; - /*margin-right: 2px;*/ -} -#portfolio #bbb_token_info .decimals { - position: relative; - top: -4px; - font-weight: 400; - font-size: 16px; -} -#chart { - text-align: center; -} -#chart .chart-text { - fill: #FFF; - -moz-transform: translateY(0.25em); - -ms-transform: translateY(0.25em); - -webkit-transform: translateY(0.25em); - transform: translateY(0.25em); -} -#chart .chart-text .chart-amount { - font-size: 0.44em; - line-height: 1; - text-anchor: middle; - -moz-transform: translateY(-0.25em); - -ms-transform: translateY(-0.25em); - -webkit-transform: translateY(-0.25em); - transform: translateY(-0.25em); -} -#chart .chart-text.text-small .chart-amount { - font-size: 0.38em; -} -#chart .chart-text .chart-amount .amount { - font-family: 'Neue Haas Unica Pro', sans-serif; - font-weight: 500; - - padding: 0 1px 4px; -} -#chart .chart-text .chart-amount .decimals { - font-family: 'Neue Haas Unica Pro', sans-serif; - font-weight: 500; - font-size: 0.5em; - - letter-spacing: -0.05em; -} -#chart .chart-text .chart-amount .dollar { - font-family: 'Neue Haas Unica Pro', sans-serif; - font-weight: 400; - font-size: 0.6em; - - letter-spacing: -0.05em; -} -#chart .chart-text.text-small .chart-amount .dollar { - font-size: 0.6em; -} -#chart .chart-label { - font-size: 0.18em; - font-weight: 500; - text-transform: uppercase; - text-anchor: middle; - -moz-transform: translateY(0.7em); - -ms-transform: translateY(0.7em); - -webkit-transform: translateY(0.7em); - transform: translateY(0.7em); -} -#app_info { - border: 1px solid #991900; - border-radius: 8px; - height: 90px; - margin-bottom: 8px; -} -#app_info.known { - border: 1px solid #224851; -} -#app_info .left { - width: 80px; - height: 90px; - background-color: #991900; - padding: 16px 4px 16px 4px; - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#app_info.known .left { - background-color: #224851; -} -#app_info .icon { - display: none; - width: 100%; - text-align: center; - color: #ffffff; - font-size: 26px; - padding: 0 25px; - opacity: 0; - visibility: hidden; -} -#app_info .icon-unknown { - display: block; - opacity: 1; - visibility: visible; -} -#app_info.known .icon-known { - display: block; - opacity: 1; - visibility: visible; -} -#app_info.known .icon-unknown { - display: none; - opacity: 0; - visibility: hidden; -} -#app_info .message { - display: none; - text-transform: uppercase; - color: #ffffff; - font-weight: 500; - font-size: 12px; - line-height: 16px; - text-align: center; - padding: 6px 6px 10px 6px; - opacity: 0; - visibility: hidden; -} -#app_info .message.unknown { - display: block; - opacity: 1; - visibility: visible; -} -#app_info.known .message.known { - display: block; - opacity: 1; - visibility: visible; -} -#app_info.known .message.unknown { - display: none; - opacity: 0; - visibility: hidden; -} -#app_info .right { - height: 100%; - color: #991900 !important; - padding: 8px 12px; -} -#app_info.known .right { - color: #224851 !important; -} -#app_info h3 { - font-size: 16px; - color: #991900 !important; -} -#app_info.known h3 { - font-size: 16px; - color: #224851 !important; -} -.custom-dropdown { - position: relative; - padding: 12px 16px; - border: 1px solid #D5D6DA !important; - border-radius: 4px; - margin-bottom: 8px; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - height: 66px; -} -.custom-dropdown .icon-wallet-outline { - margin-right: 4px; -} -.custom-dropdown .icon-down-arrow { - font-size: 8px; - transition: all ease-in-out 0.3s; -} -.custom-dropdown.active .icon.icon-down-arrow { - transform: scaleY(-1); -} -.custom-dropdown .asset-icon { - width: 54px; - margin-right: 16px; - text-align: center; -} -.custom-dropdown .asset-icon svg { - width: 100%; -} -.custom-dropdown .name { - color: #224851; - font-size: 16px; - font-weight: 500; - font-style: normal; - margin-bottom: 8px; -} -.custom-dropdown .desc { - color: #667085; - font-size: 14px; - font-weight: 400; - font-style: normal; -} -.custom-dropdown .dropdown { - position: absolute; - top: calc(100% - 1px); - left: -1px; - width: calc(100% + 2px); - transition: height linear 0.3s, opacity linear 0.1s 0.1s, visibility linear 0.3s; - background-color: #FFFFFF; - height: 0; - z-index: 99; - border: 1px solid #D5D6DA; - border-radius: 0 0 4px 4px; - padding: 6px 8px; - cursor: auto; - visibility: hidden; - opacity: 0; -} -.custom-dropdown.active .dropdown { - max-height: 190px; - height: 190px; - visibility: visible; - opacity: 1; - /*transition: height ease-in-out 0.3s, opacity ease-in-out 0.3s 0.2s;*/ -} -.custom-dropdown .dropdown .content { - width: 100%; - height: 100%; - overflow: hidden; - overflow-y: scroll; - padding-right: 8px; -} -.custom-dropdown .dropdown .custom-dropdown-item { - display: flex; - pointer-events: auto; - cursor: pointer; - padding: 6px 8px; - border-radius: 4px; - transition: all ease-in-out 0.1s; -} -.custom-dropdown .dropdown .custom-dropdown-item:hover, -.custom-dropdown .dropdown .custom-dropdown-item:active, -.custom-dropdown .dropdown .custom-dropdown-item:focus { - background-color: #F8F8F9; -} -.custom-dropdown .dropdown .custom-dropdown-item * { - pointer-events: none; -} -.custom-dropdown.disabled { - cursor: default !important; -} -.custom-dropdown.disabled .icon.icon-down-arrow { - opacity: 0; -} -#choose_quantity { - margin-bottom: 8px; -} -#choose_quantity .col-4 { - padding: 0 16px 0 0; -} -#choose_quantity .form-control { - border: none; - border-bottom: 3px solid #D5D6DA; - box-shadow: none !important; - color: #224851; - font-size: 22px; - font-weight: 500; - text-align: center; - width: 100%; - padding: 6px 6px 0; - transition: all linear 0.2s; -} -#choose_quantity .form-control::-webkit-outer-spin-button, -#choose_quantity .form-control::-webkit-inner-spin-button { - -webkit-appearance: none; -} -#choose_quantity .form-control:focus { - border-bottom-color: #224851; -} -#choose_quantity .form-control.error { - border-bottom-color: #F53400; - color: #F53400; -} -#choose_quantity .equals { - padding: 0 8px 16px 8px; - font-size: 32px; - font-weight: 500; - color: #D5D6DA; -} -#choose_quantity .label { - color: #667085; - font-weight: 500; - font-size: 14px; -} -#choose_quantity input[type=range] { - width: 100%; - margin-top: 8px; - height: 8px; - border-radius: 4px; - background: linear-gradient(to right, #C0FF00 0%, #C0FF00 0%, #F8F8F9 0%, #F8F8F9 100%); - -webkit-appearance: none; -} -#choose_quantity input[type=range]::-webkit-slider-thumb { - height: 24px; - width: 24px; - background: #FFFFFF; - -webkit-appearance: none; - box-shadow: 0 4px 8px -2px rgba(17, 20, 30, 0.1), 0 2px 4px -2px rgba(17, 20, 30, 0.06); - border-radius: 12px; -} -#max_amount:hover { - color: #224851; -} -#send_info { - height: 30px; - color: #667085; -} -#send_info .info .text { - font-weight: 500; -} -#send_info .info .separator-line { - margin: 8px auto; -} -#send_info .error { - color: #F53400; - font-weight: 400; -} -#send_info .info, -#send_info .error { - display: none; -} -#recipient { - overflow: hidden; -} -#recipient.form-control { - width: 320px; - border: none !important; - box-shadow: none !important; - outline: none !important; - padding: 0; - border-radius: 4px; -} -#review_transaction { - padding: 16px; - margin-bottom: 32px; - color: #181818; - - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#review_transaction .token { - padding-left: 32px; -} -#review_transaction .estimated_fees { - padding-right: 32px; -} -#amounts .title, -#review_transaction .title { - margin-top: 6px; - font-family: 'Neue Haas Unica Pro', sans-serif; - font-weight: 500; - color: #667085; - font-size: 14px; -} -#amounts .amount, -#review_transaction .amount, -#apy_info .amount { - font-family: 'Neue Haas Unica Pro', sans-serif; - font-weight: 500; - font-size: 26px; - - padding: 0 1px 4px; -} -#amounts .decimals, -#review_transaction .decimals, -#apy_info .decimals { - font-family: 'Neue Haas Unica Pro', sans-serif; - font-size: 16px; - - position: relative; - top: -6px; - font-weight: 400; - - letter-spacing: -0.05em; -} -#amounts .dollar, -#review_transaction .dollar { - font-family: 'Neue Haas Unica Pro', sans-serif; - font-weight: 500; - font-size: 18px; - /*padding-top: 2px;*/ - - letter-spacing: -0.05em; -} -#transaction_info .wallet { - height: 40px; - margin-bottom: 30px; -} -#transaction_info .wallet .right { - padding-left: 8px; -} -#transaction_info .wallet .right .address { - font-size: 12px; -} -#transaction_info .dot { - display: block; - position: relative; - width: 16px; - height: 16px; - background-color: #FFFFFF; - border-radius: 8px; - border: 1px solid #B1B4BD; - text-align: center; - margin-top: -18px; -} -#transaction_info .dot:after { - position: absolute; - top: 3px; - left: 3px; - width: 8px; - height: 8px; - content: " "; - background-color: #B1B4BD; - border-radius: 4px; -} -#transaction_info .dot .dot-line { - position: absolute; - bottom: 15px; - left: 6px; - width: 2px; - height: 55px; - content: " "; - background-color: #B1B4BD; - border-radius: 4px; -} -#transaction_info .dot.dot-green { - border: 1px solid #9ECC00; -} -#transaction_info .dot.dot-green:after { - background-color: #9ECC00; -} -#transaction_info .dot.dot-green .dot-line { - background-color: #9ECC00; -} -#qrcode { - position: relative; - padding: 16px; - border: 3px solid #C0FF00; - margin: 16px 16px 32px; -} -#qrcode * { - position: relative; - z-index: 999; -} -#qrcode:after { - position: absolute; - content: " "; - top: -5px; - left: 32px; - width: calc(100% - 64px); - height: calc(100% + 10px); - background-color: #FFFFFF; -} -#qrcode:before { - position: absolute; - content: " "; - top: 32px; - left: -5px; - width: calc(100% + 10px); - height: calc(100% - 64px); - background-color: #FFFFFF; - z-index: 999; -} -.notification { - background: #FFFFFF !important; - border: 1px solid #F8F8F9 !important; - box-shadow: 0 3px 4px rgb(17 20 30 / 0.18), 0 2px 3px rgb(17 20 30 / 0.08) !important; - border-radius: 8px !important; - max-width: 100% !important; - width: calc(100% - 28px) !important; - color: #224851 !important; - padding: 24px 12px !important; - font-size: 16px !important; - user-select: none !important; -} -.notification .icon { - font-size: 26px; -} -.notification.notification-info .icon { - color: #026AA2; -} -.notification.notification-success .icon { - color: #9ECC00; -} -.notification.notification-error .icon { - color: #F53400; -} -.modal { - display: block; - opacity: 0; - pointer-events: none; - z-index: -1; - transition: all linear 0.2s; - height: auto; - /*max-height: 540px;*/ - box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); -} -.modal.show { - height: 100%; - opacity: 1; - pointer-events: auto; - z-index: 9998; -} -.modal:after { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 1200px; - background-color: rgba(17, 20, 30, 0.66); - content: " "; - z-index: -1; - transition: all linear 0.2s; -} -.modal .modal-dialog { - transform: translateY(-60px); - transition: all linear 0.2s; - margin: 0; -} -.modal.show .modal-dialog { - transform: translateY(0); -} -.modal .modal-content { - border: none !important; -} -.modal .modal-header { - position: relative; - background-color: #224851; - border-radius: 0 !important; - border-bottom: 0 !important; -} -.modal .modal-header.equal-padding { - padding: 6px 12px; -} -.modal .modal-header.modal-header-danger { - background-color: #661100; -} -.modal .modal-header.modal-header-primary { - background-color: #224851; -} -.modal .modal-body { - margin-top: -2px; -} -.modal .modal-body.small-padding { - padding: 6px 10px; -} -.modal .modal-body.modal-body-primary { - background-color: #224851; -} -.modal .modal-footer { - box-shadow: 0 12px 16px -4px rgba(17, 20, 30, 0.1), 0 4px 6px -2px rgba(17, 20, 30, 0.05); - border-radius: 0 0 8px 8px; - border: none !important; -} -#accounts_modal { - width: calc(100% - 16px); - top: 0; - left: 8px; - padding-top: 8px; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; -} -#accounts_modal .modal-content { - border-radius: 10px !important; -} -#accounts_modal .modal-header { - border-top-left-radius: 8px !important; - border-top-right-radius: 8px !important; -} -#accounts_modal #hide_accounts_modal { - position: absolute; - right: 8px; - top: 8px; - font-size: 14px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - padding: 0; - color: #FFFFFF !important; - transition: all linear 0.1s; -} -#accounts_modal #hide_accounts_modal:hover { - font-size: 16px; -} -#accounts_modal .current-wallet .address { - font-size: 14px; -} -#accounts_modal .current-wallet .address .icon { - font-size: 16px; -} -#accounts_modal .modal-body { - padding-right: 8px; -} -#accounts_modal .modal-body .button-item { - min-height: 60px; -} -#accounts_modal .modal-body .button-item .icon { - font-size: 14px; - width: 40px; -} -#accounts_modal #wallet_list { - max-height: 290px; -} -#apy_info { - width: 112px; - height: 112px; - margin: 0 auto; - border: 1px solid #FFFFFF; - border-radius: 56px; - padding-top: 24px; -} -#apy_info .text { - font-weight: 500; - margin-top: -6px; -} -#staking_intro .step { - pointer-events: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - padding-top: 60px; -} -#staking_intro .step.step-active { - pointer-events: auto; -} -#staking_intro .step .image { - opacity: 0; - height: 260px; - text-align: center; -} -#staking_intro .step .image svg { - width: 90%; - height: 100%; -} -#staking_intro .step .info .step-number { - opacity: 0; - display: block; - width: 24px; - height: 24px; - line-height: 22px; - border-radius: 12px; - border: 1px solid #FFFFFF; - margin: 8px auto 12px; -} -#staking_intro .step .info h3 { - opacity: 0; -} -#staking_intro .step .info p { - opacity: 0; - padding: 0 16px; - height: 86px; -} -#staking_intro .step .info .btn { - opacity: 0; -} -#staking_intro .dots { - opacity: 0; - position: fixed; - top: 540px; - left: 0; - width: 100%; - text-align: center; -} -#staking_intro .dots .dot { - position: relative; - display: inline-block; - margin-left: 30px; - margin-right: 30px; - background-color: #FFFFFF; - width: 8px; - height: 8px; - border-radius: 4px; - z-index: 99; - transition: all ease-in-out 0.4s; -} -#staking_intro .dots .dot:after { - position: absolute; - top: -4px; - left: -4px; - width: 16px; - height: 16px; - border-radius: 8px; - border: 1px solid #FFFFFF; - content: ""; - transition: all ease-in-out 0.4s; -} -#staking_intro .dots .dot .dot-line { - position: absolute; - top: 3px; - left: -60px; - width: 56px; - height: 1px; - background: linear-gradient(to left, #FFFFFF 50%, #C0FF00 50%) right; - - transition: all ease-in-out 0.4s; - background-size: 200% 100%; - z-index: 1; -} -#staking_intro .dots .dot.dot-active { - background-color: #C0FF00; -} -#staking_intro .dots .dot.dot-active:after { - border-color: #C0FF00; -} -#staking_intro .dots .dot.dot-active .dot-line { - background-position: left; -} -#staking_collators { - position: relative; - height: 100%; -} -#staking_collators .btn { - transition: all linear 0.2s; - - border-bottom: 2px solid #FFFFFF !important; -} -#staking_collators .btn.active { - border-bottom: 2px solid #224851 !important; -} -#staking_collators .btn .badge { - margin-left: 4px; - transition: all linear 0.1s; -} -#staking_collators .btn:hover .badge, -#staking_collators .btn:active .badge, -#staking_collators .btn:focus .badge, -#staking_collators .btn.active .badge { - background-color: #224851; - color: #FFFFFF; -} -#staking_collators .slide { - position: absolute; - top: 40px; - opacity: 0; - width: 100%; - height: calc(100% - 100px); - pointer-events: none; -} -#staking_collators .slide.active { - pointer-events: auto; -} -#staking_collators .staking-info { - background-color: #224851; - color: #FFFFFF; - padding: 8px; - width: 100%; - border-radius: 8px; - height: 70px; - margin-top: 8px; -} -#staking_collators .list-header { - padding: 8px 0; - font-size: 10px; - font-weight: 500; - color: #667085; -} -#staking_collators .collator-list { - height: calc(100% - 106px); - overflow: hidden; - overflow-y: scroll; - padding-right: 8px; - padding-bottom: 8px; -} -#staking_collators .collator-list .button-item { - position: relative; -} -#staking_collators .collator-list .button-item .jdenticon { - text-align: center; - width: 70px; -} -#staking_collators .collator-list .button-item .collator-name { - position: absolute; - top: 12px; - left: 70px; -} -#bordered_content .collator-image { - position: absolute; - top: -41px; - left: calc(50% - 41px); - width: 80px; - height: 80px; - text-align: center; - padding-top: 10px; - background-color: #FFFFFF; - border-radius: 40px; - border: 2px solid #224851; -} -.box { - border-radius: 8px; - border: 1px solid #224851; - overflow: hidden; -} -.box.box-white { - border: 1px solid #FFFFFF; -} -.box .header { - color: #FFFFFF; - background-color: #224851; - padding: 12px; - font-weight: 500; - font-size: 18px; - text-align: center; -} -.box .content { - padding: 16px; -} -#staking_info { - position: fixed; - bottom: 80px; - left: 0; - width: 100%; - padding: 0 22px; -} -#asset_info .selected .asset-icon svg { - transition: all ease-out 0.3s; - transform: rotateY(-90deg); -} -#asset_info .selected .asset-icon.animate-in svg { - transform: rotateY(0deg); -} -#asset_info .selected .asset-icon.animate-out svg { - transform: rotateY(90deg); -} -#go_kyc { - position: relative; - padding: 12px 8px; - border-radius: 8px; - transition: all linear 0.2s; - margin: 0 16px; -} -#go_kyc .icon-shield { - color: #D5D6DA; -} -#go_kyc.kyced .icon-shield { - color: #C0FF00; -} -#kyc_shield { - position: relative; - top: -40px; - width: 150px; - height: 120px; - user-select: none !important; -} -#kyc_shield .text { - font-size: 22px; - line-height: 1; - text-anchor: middle; - -moz-transform: translateY(-0.25em); - -ms-transform: translateY(-0.25em); - -webkit-transform: translateY(-0.25em); - transform: translateY(-0.25em); -} -#kyc_shield .text .not-verified { - font-size: 24px; - font-weight: 500; - fill: #667085; -} -#kyc_shield .text .verified { - font-size: 16px; - font-weight: 400; - fill: #224851; -} -#kyc_shield .text .level { - font-size: 10px; - text-transform: uppercase; - font-weight: 500; - fill: #224851; -} - -#connection_error { - position: fixed; - top: 20px; - left: 20px; - width: calc(100% - 40px); - z-index: 10000; -} - -/* for full screen */ -@media screen and (min-width: 600px) { - body, - #init_screen, - #login_screen { - background: radial-gradient(circle at center top, #224851, #0C232D) !important; - } - body, - #header, - #full_page, - #bordered_content, - #main_footer { - width: 100%; - max-width: 600px; - margin: 0 auto; - } - #full_page .heading h3 { - padding-left: 20px; - text-align: left; - width: 100%; - } - /*#bordered_content {*/ - /* box-shadow: 0 0 0 12px rgba(14, 42, 54, 0.4);*/ - /*}*/ - #bordered_content #top_items button { - width: 208px; - } - body #login_screen, - body #init_screen { - background-image: none; - background-color: #224851; - } - #main_footer { - max-width: 584px; - margin-left: 8px; - left: auto; - } - .modal .modal-dialog { - max-width: 584px; - margin: 0 auto; - } - .footer { - max-width: 584px; - margin: 0 auto 4px; - } - .button-item.tab-item { - height: 160px; - } - .button-item.tab-item .icon { - height: 96px; - line-height: 96px; - } - .button-item.tab-item .icon svg { - width: 100%; - } - .notification { - width: 100% !important; - max-width: 480px !important; - left: auto; - margin-left: 60px; - } - .button-item.transaction-item { - height: 80px; - min-height: 80px; - } - .button-item.transaction-item .transaction-info { - min-height: 80px; - } - .button-item.transaction-item.transaction-item-big { - height: 104px; - } - .button-item.settings-item { - min-height: 54px; - } - #transactions .button-item { - height: 80px; - } -} \ No newline at end of file From d149d6c1548fb03c568e85a5cd7f6f6b3f2adae6 Mon Sep 17 00:00:00 2001 From: rappix Date: Sat, 2 Mar 2024 02:53:22 +0100 Subject: [PATCH 17/96] update packages --- package-lock.json | 69 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39ed6f3..0728f43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5707,13 +5707,14 @@ "dev": true }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -5772,6 +5773,25 @@ "node": ">=8.0.0" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5802,6 +5822,15 @@ "node": ">=4.0" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -14052,12 +14081,13 @@ "dev": true }, "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, @@ -14101,6 +14131,24 @@ "estraverse": "^4.1.1" } }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -14124,6 +14172,15 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", From b8df6a78e53350cd13e3ba6ec3f7be164d875bf9 Mon Sep 17 00:00:00 2001 From: rappix Date: Sat, 2 Mar 2024 02:53:50 +0100 Subject: [PATCH 18/96] remove css files from xcode project --- .../apple/BitgreenWallet.xcodeproj/project.pbxproj | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj index 58754d7..5eca0f7 100644 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj +++ b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj @@ -27,12 +27,8 @@ 047C28FF2A75C26E00F81F5E /* CapacitorApp in Frameworks */ = {isa = PBXBuildFile; fileRef = 047C28FE2A75C26E00F81F5E /* CapacitorApp */; }; 047D48EE2A040A1B00C416FC /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 047D48E92A040A1B00C416FC /* icons */; }; 047D48EF2A040A1B00C416FC /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 047D48E92A040A1B00C416FC /* icons */; }; - 047D48F02A040A1B00C416FC /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EA2A040A1B00C416FC /* default.css */; }; - 047D48F12A040A1B00C416FC /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EA2A040A1B00C416FC /* default.css */; }; 047D48F22A040A1B00C416FC /* default.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EB2A040A1B00C416FC /* default.js */; }; 047D48F32A040A1B00C416FC /* default.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EB2A040A1B00C416FC /* default.js */; }; - 047D48F42A040A1B00C416FC /* main.css in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EC2A040A1B00C416FC /* main.css */; }; - 047D48F52A040A1B00C416FC /* main.css in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EC2A040A1B00C416FC /* main.css */; }; 047D48F62A040A1B00C416FC /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48ED2A040A1B00C416FC /* main.js */; }; 047D48F72A040A1B00C416FC /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48ED2A040A1B00C416FC /* main.js */; }; 04B0525B29F9EC730049B197 /* inject.js in Resources */ = {isa = PBXBuildFile; fileRef = 04B0525629F9EC730049B197 /* inject.js */; }; @@ -151,9 +147,7 @@ 047C28772A716A4800F81F5E /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; 047C28A82A716CD500F81F5E /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = ""; }; 047D48E92A040A1B00C416FC /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = ""; }; - 047D48EA2A040A1B00C416FC /* default.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = default.css; sourceTree = ""; }; 047D48EB2A040A1B00C416FC /* default.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = default.js; sourceTree = ""; }; - 047D48EC2A040A1B00C416FC /* main.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = main.css; sourceTree = ""; }; 047D48ED2A040A1B00C416FC /* main.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = main.js; sourceTree = ""; }; 04B0525629F9EC730049B197 /* inject.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = inject.js; sourceTree = ""; }; 04C9AD792A13080B00EFF193 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -349,10 +343,8 @@ 8E8684912872B3510037E6C9 /* Resources */ = { isa = PBXGroup; children = ( - 047D48EA2A040A1B00C416FC /* default.css */, 047D48EB2A040A1B00C416FC /* default.js */, 047D48E92A040A1B00C416FC /* icons */, - 047D48EC2A040A1B00C416FC /* main.css */, 047D48ED2A040A1B00C416FC /* main.js */, 04B0525629F9EC730049B197 /* inject.js */, 271FBF0D29B8DB52001D0940 /* assets */, @@ -520,6 +512,7 @@ 047C28BB2A7173A400F81F5E /* Pods-BitgreenWallet (iOS) */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; + name = "Pods-BitgreenWallet (iOS)"; path = Pods_BitgreenWallet__iOS_.framework; remoteRef = 047C28BA2A7173A400F81F5E /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; @@ -574,12 +567,10 @@ buildActionMask = 2147483647; files = ( 047D48F62A040A1B00C416FC /* main.js in Resources */, - 047D48F42A040A1B00C416FC /* main.css in Resources */, 047D48EE2A040A1B00C416FC /* icons in Resources */, 04B0525B29F9EC730049B197 /* inject.js in Resources */, 271FBF3D29B8DB52001D0940 /* index.html in Resources */, 271FBF2529B8DB52001D0940 /* page.js in Resources */, - 047D48F02A040A1B00C416FC /* default.css in Resources */, 271FBF2D29B8DB52001D0940 /* content.js in Resources */, 271FBF1129B8DB52001D0940 /* manifest.json in Resources */, 271FBF2929B8DB52001D0940 /* background.js in Resources */, @@ -595,12 +586,10 @@ buildActionMask = 2147483647; files = ( 047D48F72A040A1B00C416FC /* main.js in Resources */, - 047D48F52A040A1B00C416FC /* main.css in Resources */, 047D48EF2A040A1B00C416FC /* icons in Resources */, 04B0525C29F9EC730049B197 /* inject.js in Resources */, 271FBF3E29B8DB52001D0940 /* index.html in Resources */, 271FBF2629B8DB52001D0940 /* page.js in Resources */, - 047D48F12A040A1B00C416FC /* default.css in Resources */, 271FBF2E29B8DB52001D0940 /* content.js in Resources */, 271FBF1229B8DB52001D0940 /* manifest.json in Resources */, 271FBF2A29B8DB52001D0940 /* background.js in Resources */, From e143625a2e27ba418933affea43925140470f66c Mon Sep 17 00:00:00 2001 From: rappix Date: Sat, 2 Mar 2024 03:11:55 +0100 Subject: [PATCH 19/96] fix: update bootstrap --- package-lock.json | 30 ++++++++++++------------- packages/browser-wallet-ui/package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0728f43..fde159c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3850,9 +3850,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "peer": true, "funding": { "type": "opencollective", @@ -4597,9 +4597,9 @@ "dev": true }, "node_modules/bootstrap": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", "funding": [ { "type": "github", @@ -4611,7 +4611,7 @@ } ], "peerDependencies": { - "@popperjs/core": "^2.11.6" + "@popperjs/core": "^2.11.8" } }, "node_modules/bplist-parser": { @@ -9528,7 +9528,7 @@ "dependencies": { "@bitgreen/browser-wallet-utils": "^1.0.0", "animejs": "^3.2.1", - "bootstrap": "^5.2.2", + "bootstrap": "^5.3", "dompurify": "^2.4.1", "jdenticon": "^3.2.0", "qrcode": "^1.5.1", @@ -9917,7 +9917,7 @@ "requires": { "@bitgreen/browser-wallet-utils": "^1.0.0", "animejs": "^3.2.1", - "bootstrap": "^5.2.2", + "bootstrap": "^5.3", "dompurify": "^2.4.1", "jdenticon": "^3.2.0", "qrcode": "^1.5.1", @@ -12623,9 +12623,9 @@ } }, "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "peer": true }, "@scure/base": { @@ -13236,9 +13236,9 @@ "dev": true }, "bootstrap": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", "requires": {} }, "bplist-parser": { diff --git a/packages/browser-wallet-ui/package.json b/packages/browser-wallet-ui/package.json index b958d86..03feb3e 100644 --- a/packages/browser-wallet-ui/package.json +++ b/packages/browser-wallet-ui/package.json @@ -25,7 +25,7 @@ "dependencies": { "@bitgreen/browser-wallet-utils": "^1.0.0", "animejs": "^3.2.1", - "bootstrap": "^5.2.2", + "bootstrap": "^5.3", "dompurify": "^2.4.1", "jdenticon": "^3.2.0", "qrcode": "^1.5.1", From f74a8bfdb345747599bb075174ec9cdce373232f Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 16:58:52 +0100 Subject: [PATCH 20/96] fully integrated capacitorjs --- README.md | 46 +- package-lock.json | 5221 ++++++++++++++++- package.json | 30 +- .../browser-wallet-base/capacitor.config.json | 5 + packages/browser-wallet-base/package.json | 17 + packages/browser-wallet-base/public/app.html | 15 - packages/browser-wallet-base/readme.md | 32 +- .../src/android/.gitignore | 98 - .../src/android/app/.gitignore | 2 - .../src/android/app/build.gradle | 54 - .../src/android/app/capacitor.build.gradle | 19 - .../src/android/app/proguard-rules.pro | 21 - .../myapp/ExampleInstrumentedTest.java | 26 - .../android/app/src/main/AndroidManifest.xml | 41 - .../app/src/main/ic_launcher-playstore.png | Bin 11374 -> 0 bytes .../com/bitgreen/wallet/MainActivity.java | 47 - .../drawable-v24/ic_launcher_foreground.xml | 34 - .../app/src/main/res/drawable/b_logo.png | Bin 1481 -> 0 bytes .../main/res/drawable/gradient_background.xml | 7 - .../res/drawable/ic_launcher_background.xml | 170 - .../app/src/main/res/layout/activity_main.xml | 12 - .../src/main/res/layout/background_layout.xml | 14 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 804 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2652 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 744 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 594 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1804 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1432 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 1006 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3710 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2108 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 1410 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5896 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 2736 -> 0 bytes .../ic_launcher_foreground.webp | Bin 2428 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 8202 -> 0 bytes .../app/src/main/res/values/colors.xml | 4 - .../res/values/ic_launcher_background.xml | 4 - .../app/src/main/res/values/strings.xml | 7 - .../app/src/main/res/values/styles.xml | 26 - .../app/src/main/res/xml/file_paths.xml | 5 - .../src/android/build.gradle | 29 - .../build.gradle | 59 - .../cordova.variables.gradle | 7 - .../src/main/AndroidManifest.xml | 8 - .../src/main/java/.gitkeep | 0 .../src/main/res/.gitkeep | 1 - .../src/android/capacitor.settings.gradle | 9 - .../src/android/gradle.properties | 22 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - .../browser-wallet-base/src/android/gradlew | 244 - .../src/android/gradlew.bat | 92 - .../src/android/settings.gradle | 5 - .../src/android/variables.gradle | 16 - .../Resources => app-resources}/icon.png | Bin .../src/app-resources/splash.png | Bin 0 -> 321618 bytes .../BitgreenWallet.xcodeproj/project.pbxproj | 1227 ---- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../UserInterfaceState.xcuserstate | Bin 33439 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 168731 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 53946 -> 0 bytes .../WorkspaceSettings.xcsettings | 18 - .../xcschemes/BitgreenWallet (macOS).xcscheme | 78 - .../xcschemes/xcschememanagement.plist | 19 - .../xcschemes/xcschememanagement.plist | 24 - .../xcschemes/xcschememanagement.plist | 27 - .../contents.xcworkspacedata | 10 - .../browser-wallet-base/src/apple/Podfile | 25 - .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/100.png | Bin 3092 -> 0 bytes .../AppIcon.appiconset/1024.png | Bin 38003 -> 0 bytes .../AppIcon.appiconset/114.png | Bin 3598 -> 0 bytes .../AppIcon.appiconset/120.png | Bin 3700 -> 0 bytes .../AppIcon.appiconset/128.png | Bin 4183 -> 0 bytes .../AppIcon.appiconset/144.png | Bin 4612 -> 0 bytes .../AppIcon.appiconset/152.png | Bin 4915 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/16.png | Bin 514 -> 0 bytes .../AppIcon.appiconset/167.png | Bin 5560 -> 0 bytes .../AppIcon.appiconset/172.png | Bin 5578 -> 0 bytes .../AppIcon.appiconset/180.png | Bin 5742 -> 0 bytes .../AppIcon.appiconset/196.png | Bin 6487 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/20.png | Bin 649 -> 0 bytes .../AppIcon.appiconset/216.png | Bin 7264 -> 0 bytes .../AppIcon.appiconset/256.png | Bin 9064 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/29.png | Bin 851 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/32.png | Bin 993 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/40.png | Bin 1221 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/48.png | Bin 1440 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/50.png | Bin 1582 -> 0 bytes .../AppIcon.appiconset/512.png | Bin 21504 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/55.png | Bin 1716 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/57.png | Bin 1784 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/58.png | Bin 1825 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/60.png | Bin 1806 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/64.png | Bin 2068 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/66.png | Bin 2016 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/72.png | Bin 2224 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/76.png | Bin 2472 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/80.png | Bin 2548 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/87.png | Bin 2812 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/88.png | Bin 2853 -> 0 bytes .../Assets.xcassets/AppIcon.appiconset/92.png | Bin 2918 -> 0 bytes .../AppIcon.appiconset/Contents.json | 346 -- .../Assets.xcassets/Contents.json | 6 - .../LargeIcon.imageset/1024.png | Bin 11604 -> 0 bytes .../LargeIcon.imageset/Contents.json | 23 - .../SafariWebExtensionHandler.swift | 26 - .../src/apple/iOS (App)/AppDelegate.swift | 49 - .../Base.lproj/LaunchScreen.storyboard | 32 - .../iOS (App)/Base.lproj/Main.storyboard | 19 - .../src/apple/iOS (App)/Info.plist | 8 - .../src/apple/iOS (App)/capacitor.config.json | 16 - .../src/apple/iOS (App)/config.xml | 6 - .../src/apple/iOS (App)/public/cordova.js | 0 .../apple/iOS (App)/public/cordova_plugins.js | 0 .../src/apple/iOS (Extension)/Info.plist | 13 - .../src/apple/macOS (App)/AppDelegate.swift | 21 - .../macOS (App)/Base.lproj/Main.storyboard | 125 - .../macOS (App)/BitgreenWallet.entitlements | 12 - .../src/apple/macOS (App)/Info.plist | 10 - .../src/apple/macOS (App)/Resources/main.html | 19 - .../src/apple/macOS (App)/Resources/script.js | 17 - .../src/apple/macOS (App)/Resources/style.css | 52 - .../apple/macOS (App)/ViewController.swift | 77 - .../BitgreenWallet.entitlements | 10 - .../src/apple/macOS (Extension)/Info.plist | 15 - .../{public => src}/index.html | 9 +- .../browser-wallet-base/src/safari/.DS_Store | Bin 6148 -> 0 bytes .../browser-wallet-base/webpack.android.cjs | 3 - .../browser-wallet-base/webpack.chrome.cjs | 3 - .../browser-wallet-base/webpack.config.cjs | 17 - .../browser-wallet-base/webpack.firefox.cjs | 3 - packages/browser-wallet-base/webpack.ios.cjs | 3 - .../browser-wallet-base/webpack.safari.cjs | 3 - .../browser-wallet-base/webpack.shared.cjs | 161 +- packages/browser-wallet-ui/src/assets/b.png | Bin 1481 -> 0 bytes 142 files changed, 5109 insertions(+), 3922 deletions(-) delete mode 100644 packages/browser-wallet-base/public/app.html delete mode 100755 packages/browser-wallet-base/src/android/.gitignore delete mode 100755 packages/browser-wallet-base/src/android/app/.gitignore delete mode 100755 packages/browser-wallet-base/src/android/app/build.gradle delete mode 100755 packages/browser-wallet-base/src/android/app/capacitor.build.gradle delete mode 100755 packages/browser-wallet-base/src/android/app/proguard-rules.pro delete mode 100755 packages/browser-wallet-base/src/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/AndroidManifest.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/ic_launcher-playstore.png delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/java/com/bitgreen/wallet/MainActivity.java delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/drawable/b_logo.png delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/drawable/gradient_background.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/layout/activity_main.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/layout/background_layout.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/values/colors.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/values/ic_launcher_background.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/values/strings.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/values/styles.xml delete mode 100755 packages/browser-wallet-base/src/android/app/src/main/res/xml/file_paths.xml delete mode 100755 packages/browser-wallet-base/src/android/build.gradle delete mode 100755 packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/build.gradle delete mode 100755 packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/cordova.variables.gradle delete mode 100755 packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml delete mode 100755 packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep delete mode 100755 packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep delete mode 100755 packages/browser-wallet-base/src/android/capacitor.settings.gradle delete mode 100755 packages/browser-wallet-base/src/android/gradle.properties delete mode 100755 packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.jar delete mode 100755 packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/browser-wallet-base/src/android/gradlew delete mode 100755 packages/browser-wallet-base/src/android/gradlew.bat delete mode 100755 packages/browser-wallet-base/src/android/settings.gradle delete mode 100755 packages/browser-wallet-base/src/android/variables.gradle rename packages/browser-wallet-base/src/{apple/macOS (App)/Resources => app-resources}/icon.png (100%) create mode 100644 packages/browser-wallet-base/src/app-resources/splash.png delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/Mike.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/rappix.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/browser-wallet-base/src/apple/Podfile delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/1024.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/120.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/128.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/144.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/152.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/16.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/172.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/196.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/216.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/256.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/32.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/48.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/50.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/55.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/57.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/58.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/60.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/64.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/66.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/72.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/76.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/80.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/88.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/92.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/Contents.json delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png delete mode 100644 packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json delete mode 100644 packages/browser-wallet-base/src/apple/Shared (Extension)/SafariWebExtensionHandler.swift delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/AppDelegate.swift delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/Info.plist delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/config.xml delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/public/cordova.js delete mode 100644 packages/browser-wallet-base/src/apple/iOS (App)/public/cordova_plugins.js delete mode 100644 packages/browser-wallet-base/src/apple/iOS (Extension)/Info.plist delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/AppDelegate.swift delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/Base.lproj/Main.storyboard delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/BitgreenWallet.entitlements delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/Info.plist delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/Resources/main.html delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/Resources/script.js delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/Resources/style.css delete mode 100644 packages/browser-wallet-base/src/apple/macOS (App)/ViewController.swift delete mode 100644 packages/browser-wallet-base/src/apple/macOS (Extension)/BitgreenWallet.entitlements delete mode 100644 packages/browser-wallet-base/src/apple/macOS (Extension)/Info.plist rename packages/browser-wallet-base/{public => src}/index.html (52%) delete mode 100644 packages/browser-wallet-base/src/safari/.DS_Store delete mode 100644 packages/browser-wallet-base/webpack.config.cjs delete mode 100644 packages/browser-wallet-ui/src/assets/b.png diff --git a/README.md b/README.md index 64cc3f5..391a336 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,8 @@ # Bitgreen Browser Wallet -Bitgreen Browser extension with wallet functionalities. +Bitgreen Browser extension and android, iOS hybrid apps with wallet functionalities. -The Bitgreen Browser Wallet is a browser extension that allows users to create wallets, send and receive funds, and make -disbursements to the Bitgreen ecosystem in order to create, sell, purchase and retire Verified Carbon Credits (VCUs). To -incorporate this functionality into your own project, please see the technical description below. If you require any -assistance using these features, or this repo, please contact us at [contact], we are happy to assist. +The Bitgreen Browser Wallet is a browser extension, android and iOS app that allows users to create wallets, send and receive funds, and make disbursements to the Bitgreen ecosystem in order to create, sell, purchase and retire Verified Carbon Credits (VCUs). To incorporate this functionality into your own project, please see the technical description below. If you require any assistance using these features, or this repo, please [contact us](https://bitgreen.org/contact), we are happy to assist. ### Features: @@ -28,6 +25,12 @@ assistance using these features, or this repo, please contact us at [contact], w ___ +## Quickstart +- `npm run setup` installs all npm packages and initializes app platforms +- `npm run dev:{target}` builds development build and runs watchdog for the desired target (chrome, firefox, safari, android, ios) + +___ + ## Browser Compatibility The wallet extension is available for the following browsers: @@ -37,13 +40,22 @@ The wallet extension is available for the following browsers: - Safari (Desktop and Mobile version) - Edge (compatible with Chrome Extension) - Brave (compatible with Chrome Extension) -- Other Browsers based on Chrome Engine +- Other Browsers based on chromium Engine + +___ + +## OS Compatability + +The wallet app is available on the following operating systems: + +- android +- iOS ___ ## Project Structure -- **packages/browser-wallet-base** - Extension base structure. +- **packages/browser-wallet-base** - Extension base structure, including capacitorjs project and webpack configs. - **packages/browser-wallet-core** - Main features mostly used for background tasks, stores, API messaging. - **packages/browser-wallet-ui** - The UI components for the extension. - **packages/browser-wallet-utils** - Helpers and utilities for both UI and background. @@ -53,35 +65,33 @@ ___ ## Developing & Building Install [node.js >18.12](https://nodejs.org). -Install the required dependencies from the root for this repo, by running the following command: +Install the required dependencies and initialize the capacitorjs project from the root for this repo, by running the following command: ```bash -npm install +npm run setup ``` +More detailed information to the build process can be found [here](packages/browser-wallet-base/readme.md) + ### Production Build -You can build all versions of extensions, and output will be located at `/build` directory, where each sub folder -represents each browser extension type: +You can build all production versions of extensions and apps, and output will be located at `/build` directory, where each sub folder represents each browser extension type or app platform: ```bash -npm run build +npm run build:all ``` -You can also specify which version to build. There is 3 possible versions of this extension: `chrome`, `firefox` -and `safari`. +You can also specify which version to build. There is 3 possible versions of this extension/app: `chrome`, `firefox`, `safari`, `android` and `ios`. ```bash -npm run build:chrome +npm run build:{target} ``` ___ ### Development -Also, you can use the `npm run dev:chrome` to start the local development of the extension. Please keep in mind that in -this case, you need to specify browser type. Webpack will be running with `--watch` flag set to true. Output directory -is the same (read above). +Also, you can use the `npm run dev:{target}` to start the local development of the extension/app. Please keep in mind that in this case, you need to specify browser type or app platform. Webpack will be running with `watch` flag set to true and inline-sourcemaps for all JS and SCSS files. Output directory is the same (read above). ___ ## Wallet Docs diff --git a/package-lock.json b/package-lock.json index fde159c..2131f57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,20 +13,12 @@ ], "dependencies": { "@bitgreen/browser-wallet-base": "^1.0.0", - "@capacitor/android": "^5.2.2", - "@capacitor/app": "^5.0.6", - "@capacitor/core": "^5.2.2", - "@capacitor/ios": "^5.2.2", - "@capacitor/keyboard": "^5.0.6", "@polkadot/api": "^10.10.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", "@polkadot/util": "^10.1.11", "@polkadot/util-crypto": "^10.1.11", "escape-string-regexp": "^5.0.0" - }, - "devDependencies": { - "@capacitor/cli": "^5.2.2" } }, "node_modules/@babel/code-frame": { @@ -93,25 +85,152 @@ "link": true }, "node_modules/@capacitor/android": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.2.2.tgz", - "integrity": "sha512-2kx5C2lJ/DSwPWS7fKvextWhg4AK3SQvQnHgp8+WX6SDYgphBNlGUh45N/qBoMeVM7lqjANJFGQDCk0FjimlWQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.0.tgz", + "integrity": "sha512-0bnG1dqfT/nTjzMeHF/a5kF8mqGjHrPLADNqn41seWDfb2ch6AMiKUHsmHpEOWmGIrWOM25qNTrTOytoCSpuXg==", "peerDependencies": { - "@capacitor/core": "^5.2.0" + "@capacitor/core": "^5.7.0" } }, "node_modules/@capacitor/app": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.6.tgz", - "integrity": "sha512-6ZXVdnNmaYILasC/RjQw+yfTmq2ZO7Q3v5lFcDVfq3PFGnybyYQh+RstBrYri+376OmXOXxBD7E6UxBhrMzXGA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.7.tgz", + "integrity": "sha512-oad0jwQu+vgQDukeS9UV56yG10dlxkAGGl26IQpZlTmg3dTI9qSJtvhmlLfkF0nEtoj5IsVQUPE+NLH1oZkgGQ==", "peerDependencies": { "@capacitor/core": "^5.0.0" } }, + "node_modules/@capacitor/assets": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@capacitor/assets/-/assets-3.0.4.tgz", + "integrity": "sha512-9t/u2i9vSEWDfarzDJmQEgi07Tozyw2mKZYTkybb2Zkc8ufqR0S6ZzDBmWbsTtOTVwRr0uU9Rx3c8AVbA1xDtA==", + "dev": true, + "dependencies": { + "@capacitor/cli": "^5.3.0", + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@trapezedev/project": "^7.0.10", + "commander": "8.3.0", + "debug": "4.3.4", + "fs-extra": "10.1.0", + "node-fetch": "2.7.0", + "node-html-parser": "5.4.2", + "sharp": "0.32.6", + "tslib": "2.6.2", + "yargs": "17.7.2" + }, + "bin": { + "capacitor-assets": "bin/capacitor-assets" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@capacitor/assets/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@capacitor/assets/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@capacitor/assets/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@capacitor/assets/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@capacitor/assets/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@capacitor/assets/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@capacitor/assets/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@capacitor/cli": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.2.2.tgz", - "integrity": "sha512-h/cefX3sefLcmd4VI2h+fNIYKWH1QCUACWAH8bkdJ+aEL+x2xYbGlqeW6Belb3E2Uvu9OA+cz7YVDnNRcjyQyw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.7.0.tgz", + "integrity": "sha512-md6217RXFQwSNo9vr1gDgBqR88MJaQVwu3C5W3bpWlmajhec6NUR7yT7QNcBWErhCIJfqOOqXu4ZSSShndF0ug==", "dev": true, "dependencies": { "@ionic/cli-framework-output": "^2.2.5", @@ -122,7 +241,7 @@ "debug": "^4.3.4", "env-paths": "^2.2.0", "kleur": "^4.1.4", - "native-run": "^1.7.2", + "native-run": "^2.0.0", "open": "^8.4.0", "plist": "^3.0.5", "prompts": "^2.4.2", @@ -149,30 +268,60 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/@capacitor/clipboard": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/clipboard/-/clipboard-5.0.7.tgz", + "integrity": "sha512-N9JJruFB1mKNmA/+HPXyhcSugvEmYYfM4BibYB8lPqGc9QUY8WirU1+/5Keo8+lKJ6Sv9FVyHr2Sf8XFpwK7Tw==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, "node_modules/@capacitor/core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.2.2.tgz", - "integrity": "sha512-3jKECZC5+YD2rljMZm1e/K3AYyoxUmLDZCyofTPbRYPBSI0wJh5ZCkX+XIGzNM0o/Wokl3Voa1JB8xsLC0MPxA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.0.tgz", + "integrity": "sha512-wa9Fao+Axa1t2ZERMyQD9r0xyfglQyC4DHQKintzKaIqcRuVe9J31TmfD3IxROYi9LGpY4X8cq4m4bjb0W94Qg==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@capacitor/ios": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.2.2.tgz", - "integrity": "sha512-6nNhB+G9tamJFMdvPOIATEPIXlh3GNXMq8eeY3xrFO72bBTmQpXdbDQmMJeBbpVlkEnFoVUXiSxAu6O0E9x9Lw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.0.tgz", + "integrity": "sha512-zoEdsYQHI1zz2vjKsTpu5bSfxQQ5jrk3Qs6Op9MYcckZZ2QWIs0YpL99p+zODXNpkkyLG73NXEIrOjvyI9jx8A==", "peerDependencies": { - "@capacitor/core": "^5.2.0" + "@capacitor/core": "^5.7.0" } }, "node_modules/@capacitor/keyboard": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz", - "integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.8.tgz", + "integrity": "sha512-XYyBzGlzjgLPqyPVdu5McGLYV6+G2efVR4I3l5cF1B27M6U/oFqv9CQU74WNG08nee28bfccboNpv6eWCLYn1A==", "peerDependencies": { "@capacitor/core": "^5.0.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -182,13 +331,22 @@ "node": ">=10.0.0" } }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@ionic/cli-framework-output": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.6.tgz", - "integrity": "sha512-YLPRwnk5Lw0XQ9pKWG+p2KoR5HjMBigZ6yv+/XtL3TGOnCS1+oAz56ABbAORCjTWhSJQisr8APNFiELAecY6QA==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", "dev": true, "dependencies": { - "@ionic/utils-terminal": "2.3.4", + "@ionic/utils-terminal": "2.3.5", "debug": "^4.0.0", "tslib": "^2.0.1" }, @@ -254,11 +412,42 @@ "node": ">=16.0.0" } }, - "node_modules/@ionic/utils-process/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/@ionic/utils-process/node_modules/@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@ionic/utils-stream": { "version": "3.1.6", @@ -274,9 +463,9 @@ } }, "node_modules/@ionic/utils-subprocess": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.12.tgz", - "integrity": "sha512-N05Y+dIXBHofKWJTheCMzVqmgY9wFmZcRv/LdNnfXaaA/mxLTyGxQYeig8fvQXTtDafb/siZXcrTkmQ+y6n3Yg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.14.tgz", + "integrity": "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==", "dev": true, "dependencies": { "@ionic/utils-array": "2.1.6", @@ -292,7 +481,7 @@ "node": ">=16.0.0" } }, - "node_modules/@ionic/utils-terminal": { + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", @@ -312,11 +501,42 @@ "node": ">=16.0.0" } }, - "node_modules/@ionic/utils-terminal/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/@ionic/utils-subprocess/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": { "version": "7.0.0", @@ -3859,6 +4079,16 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@prettier/plugin-xml": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", + "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "dev": true, + "dependencies": { + "@xml-tools/parser": "^1.0.11", + "prettier": ">=2.4.0" + } + }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -3902,62 +4132,224 @@ "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.46.0.tgz", "integrity": "sha512-rBvWnlrBeFTd5LVG7oX3rOHzR16yqyffOFHKmUiVcblpXI3D89CXOvAljW9tWlA1H/2/FegaZnHPhdObPsvi+w==" }, - "node_modules/@types/archiver": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.4.tgz", - "integrity": "sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==", + "node_modules/@trapezedev/gradle-parse": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", + "integrity": "sha512-k822Is3jGroqOTKF0gAFm80LmhFJWBAyZvNtyuXq6uQUzDDe2fj/gHwixP6VFzlpaWKLP7IuR609Xv8gwJCXyg==", + "dev": true + }, + "node_modules/@trapezedev/project": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@trapezedev/project/-/project-7.0.10.tgz", + "integrity": "sha512-UjwsStjhHq/+D1bWREmFDoyKql+qFIgJX93zQLg7R6CyWZUdtlGP2hU3l7tsVRtjJBVXpVu5mj8tdwJJoABO3A==", "dev": true, "dependencies": { - "@types/readdir-glob": "*" + "@ionic/utils-fs": "^3.1.5", + "@ionic/utils-subprocess": "^2.1.8", + "@prettier/plugin-xml": "^2.2.0", + "@trapezedev/gradle-parse": "7.0.10", + "@xmldom/xmldom": "^0.7.5", + "conventional-changelog": "^3.1.4", + "cross-fetch": "^3.1.5", + "cross-spawn": "^7.0.3", + "diff": "^5.1.0", + "env-paths": "^3.0.0", + "gradle-to-js": "^2.0.0", + "ini": "^2.0.0", + "kleur": "^4.1.5", + "lodash": "^4.17.21", + "mergexml": "^1.2.3", + "npm-watch": "^0.9.0", + "plist": "^3.0.4", + "prettier": "^2.7.1", + "prompts": "^2.4.2", + "replace": "^1.1.0", + "tempy": "^1.0.1", + "tmp": "^0.2.1", + "ts-node": "^10.2.1", + "xcode": "^3.0.1", + "xml-js": "^1.6.11", + "xpath": "^0.0.32", + "yargs": "^17.2.1" } }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", - "dependencies": { - "@types/node": "*" + "node_modules/@trapezedev/project/node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "dev": true, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "node_modules/@trapezedev/project/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "node_modules/@trapezedev/project/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "node_modules/@trapezedev/project/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "node_modules/@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "node_modules/@trapezedev/project/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "@types/node": "*" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "node_modules/@trapezedev/project/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@trapezedev/project/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@trapezedev/project/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/archiver": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.4.tgz", + "integrity": "sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==", + "dev": true, + "dependencies": { + "@types/readdir-glob": "*" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "node_modules/@types/json-schema": { @@ -3966,6 +4358,12 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -3980,6 +4378,12 @@ "form-data": "^4.0.0" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "node_modules/@types/readdir-glob": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", @@ -4185,6 +4589,15 @@ } } }, + "node_modules/@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "dev": true, + "dependencies": { + "chevrotain": "7.1.1" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -4206,6 +4619,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -4227,6 +4646,21 @@ "acorn": "^8" } }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, "node_modules/aes-js": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", @@ -4399,12 +4833,24 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4414,6 +4860,15 @@ "node": ">=8" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -4498,12 +4953,55 @@ "postcss": "^8.1.0" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bare-events": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.1.tgz", + "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.1.tgz", + "integrity": "sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "node_modules/bare-os": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", + "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", + "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4525,9 +5023,9 @@ ] }, "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "engines": { "node": ">=0.6" @@ -4614,6 +5112,15 @@ "@popperjs/core": "^2.11.8" } }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dev": true, + "dependencies": { + "stream-buffers": "2.2.x" + } + }, "node_modules/bplist-parser": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", @@ -4842,6 +5349,23 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001588", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", @@ -4941,6 +5465,15 @@ "node": ">=4" } }, + "node_modules/chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "dev": true, + "dependencies": { + "regexp-to-ast": "0.5.0" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5050,6 +5583,19 @@ "node": ">=6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5066,6 +5612,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", @@ -5092,6 +5648,16 @@ "node": ">= 12" } }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "node_modules/compress-commons": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", @@ -5113,110 +5679,352 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/core-js": { - "version": "3.27.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", - "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", + "node_modules/conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "compare-func": "^2.0.0", + "q": "^1.5.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", "dev": true, - "bin": { - "crc32": "bin/crc32.njs" + "dependencies": { + "q": "^1.5.1" }, "engines": { - "node": ">=0.8" + "node": ">=10" } }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "q": "^1.5.1" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", "dev": true, "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, "dependencies": { - "cipher-base": "^1.0.3", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/core-js": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", + "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", @@ -5224,6 +6032,41 @@ "sha.js": "^2.4.8" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5260,6 +6103,15 @@ "node": "*" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/css-loader": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", @@ -5335,6 +6187,15 @@ "type": "^1.0.1" } }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -5343,6 +6204,15 @@ "node": ">= 12" } }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5367,6 +6237,55 @@ "node": ">=0.10.0" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -5469,6 +6388,24 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -5582,6 +6519,18 @@ "tslib": "^2.0.3" } }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ed2curve": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", @@ -5855,6 +6804,15 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -5874,6 +6832,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -6041,6 +7005,16 @@ "node": ">=12.20.0" } }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -6133,6 +7107,215 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/get-pkg-repo/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/gitconfiglocal/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6165,6 +7348,48 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/gradle-to-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.1.tgz", + "integrity": "sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==", + "dev": true, + "dependencies": { + "lodash.merge": "^4.6.2" + }, + "bin": { + "gradle-to-js": "cli.js" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6230,6 +7455,18 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -6340,6 +7577,12 @@ "node": ">= 4" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "node_modules/immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", @@ -6416,12 +7659,12 @@ "dev": true }, "node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/interpret": { @@ -6516,6 +7759,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -6534,6 +7786,15 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6546,6 +7807,30 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -6625,6 +7910,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -6654,6 +7945,31 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -6720,6 +8036,43 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -6764,12 +8117,24 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -6797,6 +8162,24 @@ "node": ">=10" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -6808,6 +8191,117 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6823,6 +8317,35 @@ "node": ">= 8" } }, + "node_modules/mergexml": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.3.tgz", + "integrity": "sha512-sNc9qswtLUoGmN0MB3dY+MCIJqCGEZZrtYp0Z5Iwsk6ELc/V96SFIuv5Y6O6tYAsFtdpJcPFV0FgOSHSciJLbA==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.7.0", + "formidable": "^1.2.1", + "xpath": "0.0.27" + } + }, + "node_modules/mergexml/node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mergexml/node_modules/xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -6874,6 +8397,27 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6908,13 +8452,36 @@ "concat-map": "0.0.1" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/minipass": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", - "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, "node_modules/minizlib": { @@ -6954,6 +8521,12 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "node_modules/mock-socket": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", @@ -6962,6 +8535,15 @@ "node": ">= 8" } }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6985,29 +8567,35 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "node_modules/native-run": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.2.tgz", - "integrity": "sha512-2aahC8iXIO8BcvEukVMrYwL5sXurkuIGyQgfSGBto832W6ejV+cB5Ww+2/CRxmyozhbxARJ2OMpEGPV8sTqsrQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", + "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", "dev": true, "dependencies": { - "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-terminal": "^2.3.3", + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", "bplist-parser": "^0.3.2", "debug": "^4.3.4", "elementtree": "^0.1.7", - "ini": "^3.0.1", - "plist": "^3.0.6", - "split2": "^4.1.0", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", "through2": "^4.0.2", - "tslib": "^2.4.0", + "tslib": "^2.6.2", "yauzl": "^2.10.0" }, "bin": { "native-run": "bin/native-run" }, "engines": { - "node": ">=12.13.0" + "node": ">=16.0.0" } }, "node_modules/neo-async": { @@ -7044,6 +8632,24 @@ "node": ">= 10.13" } }, + "node_modules/node-abi": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", + "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -7089,12 +8695,119 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -7113,6 +8826,19 @@ "node": ">=0.10.0" } }, + "node_modules/npm-watch": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.9.0.tgz", + "integrity": "sha512-C5Rgh5+jvY33K1EH8Qjr1hfpH9Nhasc90QJ0W+JyKg2ogE0LOCZI4xirC8QmywW7XinyBpynwxlrN6aPfjc3Hw==", + "dev": true, + "dependencies": { + "nodemon": "^2.0.7", + "through2": "^4.0.2" + }, + "bin": { + "npm-watch": "cli.js" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -7329,9 +9055,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -7386,6 +9112,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -7557,6 +9292,65 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -7612,6 +9406,12 @@ "node": ">= 8" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -7632,6 +9432,16 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -7641,6 +9451,16 @@ "node": ">=6" } }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qrcode": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", @@ -7678,6 +9498,21 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7697,6 +9532,169 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7756,11 +9754,30 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -7783,6 +9800,46 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "dependencies": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "bin": { + "replace": "bin/replace.js", + "search": "bin/search.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/replace/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/replace/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8110,10 +10167,33 @@ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "dependencies": { - "kind-of": "^6.0.2" + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" }, "engines": { - "node": ">=8" + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/shebang-command": { @@ -8137,6 +10217,116 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dev": true, + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -8202,6 +10392,50 @@ "source-map": "^0.6.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -8221,6 +10455,15 @@ "readable-stream": "^3.5.0" } }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", @@ -8233,6 +10476,19 @@ "xtend": "^4.0.2" } }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -8266,6 +10522,36 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -8319,9 +10605,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -8335,6 +10621,31 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -8351,15 +10662,46 @@ "node": ">=6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "engines": { "node": ">=8" } }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", @@ -8481,6 +10823,21 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", @@ -8490,6 +10847,15 @@ "readable-stream": "3" } }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8507,6 +10873,24 @@ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -8516,11 +10900,84 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -8531,12 +10988,69 @@ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dependencies": { - "is-typedarray": "^1.0.0" + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/universalify": { @@ -8620,6 +11134,31 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -8641,6 +11180,12 @@ "node": ">= 8" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, "node_modules/webpack": { "version": "5.76.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", @@ -8907,6 +11452,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8933,6 +11488,12 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -8972,6 +11533,37 @@ } } }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-js/node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true + }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", @@ -9003,6 +11595,15 @@ "node": ">=8.0" } }, + "node_modules/xpath": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", + "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9074,6 +11675,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/zip-stream": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", @@ -9117,6 +11727,12 @@ "@bitgreen/browser-wallet-core": "^1.0.0", "@bitgreen/browser-wallet-ui": "^1.0.0", "@bitgreen/browser-wallet-utils": "^1.0.0", + "@capacitor/android": "^5.7.0", + "@capacitor/app": "^5.0.7", + "@capacitor/clipboard": "^5.0.7", + "@capacitor/core": "^5.7.0", + "@capacitor/ios": "^5.7.0", + "@capacitor/keyboard": "^5.0.8", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", @@ -9125,6 +11741,8 @@ "@polkadot/x-global": "^10.1.12" }, "devDependencies": { + "@capacitor/assets": "^3.0.4", + "@capacitor/cli": "^5.7.0", "autoprefixer": "^10.4.17", "buffer": "^6.0.3", "crypto-browserify": "^3.12.0", @@ -9589,6 +12207,14 @@ "@bitgreen/browser-wallet-core": "^1.0.0", "@bitgreen/browser-wallet-ui": "^1.0.0", "@bitgreen/browser-wallet-utils": "^1.0.0", + "@capacitor/android": "^5.7.0", + "@capacitor/app": "^5.0.7", + "@capacitor/assets": "^3.0.4", + "@capacitor/cli": "^5.7.0", + "@capacitor/clipboard": "^5.0.7", + "@capacitor/core": "^5.7.0", + "@capacitor/ios": "^5.7.0", + "@capacitor/keyboard": "^5.0.8", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", @@ -9934,21 +12560,112 @@ } }, "@capacitor/android": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.2.2.tgz", - "integrity": "sha512-2kx5C2lJ/DSwPWS7fKvextWhg4AK3SQvQnHgp8+WX6SDYgphBNlGUh45N/qBoMeVM7lqjANJFGQDCk0FjimlWQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.0.tgz", + "integrity": "sha512-0bnG1dqfT/nTjzMeHF/a5kF8mqGjHrPLADNqn41seWDfb2ch6AMiKUHsmHpEOWmGIrWOM25qNTrTOytoCSpuXg==", "requires": {} }, "@capacitor/app": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.6.tgz", - "integrity": "sha512-6ZXVdnNmaYILasC/RjQw+yfTmq2ZO7Q3v5lFcDVfq3PFGnybyYQh+RstBrYri+376OmXOXxBD7E6UxBhrMzXGA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.7.tgz", + "integrity": "sha512-oad0jwQu+vgQDukeS9UV56yG10dlxkAGGl26IQpZlTmg3dTI9qSJtvhmlLfkF0nEtoj5IsVQUPE+NLH1oZkgGQ==", "requires": {} }, + "@capacitor/assets": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@capacitor/assets/-/assets-3.0.4.tgz", + "integrity": "sha512-9t/u2i9vSEWDfarzDJmQEgi07Tozyw2mKZYTkybb2Zkc8ufqR0S6ZzDBmWbsTtOTVwRr0uU9Rx3c8AVbA1xDtA==", + "dev": true, + "requires": { + "@capacitor/cli": "^5.3.0", + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@trapezedev/project": "^7.0.10", + "commander": "8.3.0", + "debug": "4.3.4", + "fs-extra": "10.1.0", + "node-fetch": "2.7.0", + "node-html-parser": "5.4.2", + "sharp": "0.32.6", + "tslib": "2.6.2", + "yargs": "17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, "@capacitor/cli": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.2.2.tgz", - "integrity": "sha512-h/cefX3sefLcmd4VI2h+fNIYKWH1QCUACWAH8bkdJ+aEL+x2xYbGlqeW6Belb3E2Uvu9OA+cz7YVDnNRcjyQyw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.7.0.tgz", + "integrity": "sha512-md6217RXFQwSNo9vr1gDgBqR88MJaQVwu3C5W3bpWlmajhec6NUR7yT7QNcBWErhCIJfqOOqXu4ZSSShndF0ug==", "dev": true, "requires": { "@ionic/cli-framework-output": "^2.2.5", @@ -9959,7 +12676,7 @@ "debug": "^4.3.4", "env-paths": "^2.2.0", "kleur": "^4.1.4", - "native-run": "^1.7.2", + "native-run": "^2.0.0", "open": "^8.4.0", "plist": "^3.0.5", "prompts": "^2.4.2", @@ -9978,39 +12695,72 @@ } } }, + "@capacitor/clipboard": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/clipboard/-/clipboard-5.0.7.tgz", + "integrity": "sha512-N9JJruFB1mKNmA/+HPXyhcSugvEmYYfM4BibYB8lPqGc9QUY8WirU1+/5Keo8+lKJ6Sv9FVyHr2Sf8XFpwK7Tw==", + "requires": {} + }, "@capacitor/core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.2.2.tgz", - "integrity": "sha512-3jKECZC5+YD2rljMZm1e/K3AYyoxUmLDZCyofTPbRYPBSI0wJh5ZCkX+XIGzNM0o/Wokl3Voa1JB8xsLC0MPxA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.0.tgz", + "integrity": "sha512-wa9Fao+Axa1t2ZERMyQD9r0xyfglQyC4DHQKintzKaIqcRuVe9J31TmfD3IxROYi9LGpY4X8cq4m4bjb0W94Qg==", "requires": { "tslib": "^2.1.0" } }, "@capacitor/ios": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.2.2.tgz", - "integrity": "sha512-6nNhB+G9tamJFMdvPOIATEPIXlh3GNXMq8eeY3xrFO72bBTmQpXdbDQmMJeBbpVlkEnFoVUXiSxAu6O0E9x9Lw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.0.tgz", + "integrity": "sha512-zoEdsYQHI1zz2vjKsTpu5bSfxQQ5jrk3Qs6Op9MYcckZZ2QWIs0YpL99p+zODXNpkkyLG73NXEIrOjvyI9jx8A==", "requires": {} }, "@capacitor/keyboard": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz", - "integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.8.tgz", + "integrity": "sha512-XYyBzGlzjgLPqyPVdu5McGLYV6+G2efVR4I3l5cF1B27M6U/oFqv9CQU74WNG08nee28bfccboNpv6eWCLYn1A==", "requires": {} }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, "@ionic/cli-framework-output": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.6.tgz", - "integrity": "sha512-YLPRwnk5Lw0XQ9pKWG+p2KoR5HjMBigZ6yv+/XtL3TGOnCS1+oAz56ABbAORCjTWhSJQisr8APNFiELAecY6QA==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", "dev": true, "requires": { - "@ionic/utils-terminal": "2.3.4", + "@ionic/utils-terminal": "2.3.5", "debug": "^4.0.0", "tslib": "^2.0.1" } @@ -10061,11 +12811,33 @@ "tslib": "^2.0.1" }, "dependencies": { - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "dev": true, + "requires": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, @@ -10080,9 +12852,9 @@ } }, "@ionic/utils-subprocess": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.12.tgz", - "integrity": "sha512-N05Y+dIXBHofKWJTheCMzVqmgY9wFmZcRv/LdNnfXaaA/mxLTyGxQYeig8fvQXTtDafb/siZXcrTkmQ+y6n3Yg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.14.tgz", + "integrity": "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==", "dev": true, "requires": { "@ionic/utils-array": "2.1.6", @@ -10093,12 +12865,42 @@ "cross-spawn": "^7.0.3", "debug": "^4.0.0", "tslib": "^2.0.1" + }, + "dependencies": { + "@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "dev": true, + "requires": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } } }, "@ionic/utils-terminal": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", - "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", "dev": true, "requires": { "@types/slice-ansi": "^4.0.0", @@ -10112,12 +12914,6 @@ "wrap-ansi": "^7.0.0" }, "dependencies": { - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -12628,6 +15424,16 @@ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "peer": true }, + "@prettier/plugin-xml": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", + "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "dev": true, + "requires": { + "@xml-tools/parser": "^1.0.11", + "prettier": ">=2.4.0" + } + }, "@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -12664,6 +15470,140 @@ "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.46.0.tgz", "integrity": "sha512-rBvWnlrBeFTd5LVG7oX3rOHzR16yqyffOFHKmUiVcblpXI3D89CXOvAljW9tWlA1H/2/FegaZnHPhdObPsvi+w==" }, + "@trapezedev/gradle-parse": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", + "integrity": "sha512-k822Is3jGroqOTKF0gAFm80LmhFJWBAyZvNtyuXq6uQUzDDe2fj/gHwixP6VFzlpaWKLP7IuR609Xv8gwJCXyg==", + "dev": true + }, + "@trapezedev/project": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@trapezedev/project/-/project-7.0.10.tgz", + "integrity": "sha512-UjwsStjhHq/+D1bWREmFDoyKql+qFIgJX93zQLg7R6CyWZUdtlGP2hU3l7tsVRtjJBVXpVu5mj8tdwJJoABO3A==", + "dev": true, + "requires": { + "@ionic/utils-fs": "^3.1.5", + "@ionic/utils-subprocess": "^2.1.8", + "@prettier/plugin-xml": "^2.2.0", + "@trapezedev/gradle-parse": "7.0.10", + "@xmldom/xmldom": "^0.7.5", + "conventional-changelog": "^3.1.4", + "cross-fetch": "^3.1.5", + "cross-spawn": "^7.0.3", + "diff": "^5.1.0", + "env-paths": "^3.0.0", + "gradle-to-js": "^2.0.0", + "ini": "^2.0.0", + "kleur": "^4.1.5", + "lodash": "^4.17.21", + "mergexml": "^1.2.3", + "npm-watch": "^0.9.0", + "plist": "^3.0.4", + "prettier": "^2.7.1", + "prompts": "^2.4.2", + "replace": "^1.1.0", + "tempy": "^1.0.1", + "tmp": "^0.2.1", + "ts-node": "^10.2.1", + "xcode": "^3.0.1", + "xml-js": "^1.6.11", + "xpath": "^0.0.32", + "yargs": "^17.2.1" + }, + "dependencies": { + "@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "@types/archiver": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.4.tgz", @@ -12708,9 +15648,9 @@ "dev": true }, "@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, "requires": { "@types/node": "*" @@ -12728,6 +15668,12 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -12742,6 +15688,12 @@ "form-data": "^4.0.0" } }, + "@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "@types/readdir-glob": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", @@ -12934,6 +15886,15 @@ "dev": true, "requires": {} }, + "@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "dev": true, + "requires": { + "chevrotain": "7.1.1" + } + }, "@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -12952,6 +15913,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -12965,6 +15932,18 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, "aes-js": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", @@ -13103,18 +16082,36 @@ } } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -13172,12 +16169,55 @@ "postcss-value-parser": "^4.2.0" } }, + "b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "bare-events": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.1.tgz", + "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==", + "dev": true, + "optional": true + }, + "bare-fs": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.1.tgz", + "integrity": "sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg==", + "dev": true, + "optional": true, + "requires": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "bare-os": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", + "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", + "dev": true, + "optional": true + }, + "bare-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", + "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "dev": true, + "optional": true, + "requires": { + "bare-os": "^2.1.0" + } + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -13185,9 +16225,9 @@ "dev": true }, "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true }, "bignumber.js": { @@ -13241,6 +16281,15 @@ "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", "requires": {} }, + "bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dev": true, + "requires": { + "stream-buffers": "2.2.x" + } + }, "bplist-parser": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", @@ -13413,6 +16462,17 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, "caniuse-lite": { "version": "1.0.30001588", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", @@ -13485,6 +16545,15 @@ } } }, + "chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "dev": true, + "requires": { + "regexp-to-ast": "0.5.0" + } + }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -13570,6 +16639,16 @@ "shallow-clone": "^3.0.0" } }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -13583,6 +16662,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", @@ -13603,6 +16692,16 @@ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "compress-commons": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", @@ -13621,6 +16720,198 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "requires": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + } + } + }, "core-js": { "version": "3.27.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz", @@ -13706,6 +16997,32 @@ "sha.js": "^2.4.8" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "requires": { + "node-fetch": "^2.6.12" + }, + "dependencies": { + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -13736,6 +17053,12 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "css-loader": { "version": "6.7.3", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", @@ -13786,11 +17109,23 @@ "type": "^1.0.1" } }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, "data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -13804,6 +17139,39 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -13878,6 +17246,18 @@ "minimalistic-assert": "^1.0.0" } }, + "detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true + }, + "diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -13972,6 +17352,15 @@ "tslib": "^2.0.3" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "ed2curve": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", @@ -14202,6 +17591,12 @@ "safe-buffer": "^5.1.1" } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -14223,6 +17618,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -14351,6 +17752,12 @@ "fetch-blob": "^3.1.2" } }, + "formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "dev": true + }, "fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -14419,6 +17826,184 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "requires": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "requires": { + "ini": "^1.3.2" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -14445,6 +18030,34 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "gradle-to-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.1.tgz", + "integrity": "sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==", + "dev": true, + "requires": { + "lodash.merge": "^4.6.2" + } + }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -14498,6 +18111,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -14563,6 +18185,12 @@ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", @@ -14620,9 +18248,9 @@ "dev": true }, "ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true }, "interpret": { @@ -14687,6 +18315,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -14699,6 +18333,12 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -14708,6 +18348,21 @@ "isobject": "^3.0.1" } }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -14769,6 +18424,12 @@ "argparse": "^2.0.1" } }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -14796,6 +18457,22 @@ "universalify": "^2.0.0" } }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -14855,6 +18532,36 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -14893,12 +18600,24 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -14923,6 +18642,18 @@ "yallist": "^4.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -14934,6 +18665,96 @@ "safe-buffer": "^5.1.2" } }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -14946,6 +18767,31 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "mergexml": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.3.tgz", + "integrity": "sha512-sNc9qswtLUoGmN0MB3dY+MCIJqCGEZZrtYp0Z5Iwsk6ELc/V96SFIuv5Y6O6tYAsFtdpJcPFV0FgOSHSciJLbA==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.7.0", + "formidable": "^1.2.1", + "xpath": "0.0.27" + }, + "dependencies": { + "@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "dev": true + }, + "xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", + "dev": true + } + } + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -14987,6 +18833,18 @@ "mime-db": "1.52.0" } }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -15020,10 +18878,27 @@ } } }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, "minipass": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", - "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true }, "minizlib": { @@ -15053,11 +18928,23 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "mock-socket": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==" }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -15069,22 +18956,28 @@ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "native-run": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.2.tgz", - "integrity": "sha512-2aahC8iXIO8BcvEukVMrYwL5sXurkuIGyQgfSGBto832W6ejV+cB5Ww+2/CRxmyozhbxARJ2OMpEGPV8sTqsrQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", + "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", "dev": true, "requires": { - "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-terminal": "^2.3.3", + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", "bplist-parser": "^0.3.2", "debug": "^4.3.4", "elementtree": "^0.1.7", - "ini": "^3.0.1", - "plist": "^3.0.6", - "split2": "^4.1.0", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", "through2": "^4.0.2", - "tslib": "^2.4.0", + "tslib": "^2.6.2", "yauzl": "^2.10.0" } }, @@ -15119,6 +19012,21 @@ "propagate": "^2.0.0" } }, + "node-abi": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", + "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -15139,12 +19047,93 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==" }, + "node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "requires": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, "node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -15157,6 +19146,16 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, + "npm-watch": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.9.0.tgz", + "integrity": "sha512-C5Rgh5+jvY33K1EH8Qjr1hfpH9Nhasc90QJ0W+JyKg2ogE0LOCZI4xirC8QmywW7XinyBpynwxlrN6aPfjc3Hw==", + "dev": true, + "requires": { + "nodemon": "^2.0.7", + "through2": "^4.0.2" + } + }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -15322,9 +19321,9 @@ }, "dependencies": { "lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true } } @@ -15366,6 +19365,12 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -15465,6 +19470,52 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + } + } + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -15510,6 +19561,12 @@ "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==" }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -15532,12 +19589,28 @@ } } }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, "qrcode": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", @@ -15555,6 +19628,18 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -15564,14 +19649,147 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } } }, "readable-stream": { @@ -15623,11 +19841,27 @@ "resolve": "^1.9.0" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -15647,6 +19881,38 @@ "strip-ansi": "^6.0.1" } }, + "replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15852,6 +20118,22 @@ "kind-of": "^6.0.2" } }, + "sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "dev": true, + "requires": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15867,6 +20149,85 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dev": true, + "requires": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + }, + "dependencies": { + "bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dev": true, + "requires": { + "big-integer": "1.6.x" + } + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -15920,6 +20281,47 @@ "source-map": "^0.6.0" } }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, "split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -15936,6 +20338,12 @@ "readable-stream": "^3.5.0" } }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true + }, "stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", @@ -15948,6 +20356,17 @@ "xtend": "^4.0.2" } }, + "streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dev": true, + "requires": { + "bare-events": "^2.2.0", + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -15975,6 +20394,27 @@ "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, "style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -16004,9 +20444,9 @@ "dev": true }, "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -16015,13 +20455,30 @@ "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dev": true, + "requires": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" }, "dependencies": { - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true + "tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "requires": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } } } }, @@ -16038,6 +20495,33 @@ "readable-stream": "^3.1.1" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + } + } + }, "terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", @@ -16120,6 +20604,18 @@ } } }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", @@ -16129,6 +20625,12 @@ "readable-stream": "3" } }, + "tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -16143,17 +20645,76 @@ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, "tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -16164,6 +20725,12 @@ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -16172,6 +20739,35 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "peer": true + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -16223,6 +20819,28 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -16238,6 +20856,12 @@ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, "webpack": { "version": "5.76.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", @@ -16429,6 +21053,16 @@ } } }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -16449,6 +21083,12 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -16471,6 +21111,33 @@ "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "requires": {} }, + "xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "requires": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + } + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "requires": { + "sax": "^1.2.4" + }, + "dependencies": { + "sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true + } + } + }, "xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", @@ -16495,6 +21162,12 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true }, + "xpath": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", + "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -16554,6 +21227,12 @@ "fd-slicer": "~1.1.0" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "zip-stream": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", diff --git a/package.json b/package.json index 0dba1a8..e9d8249 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bitgreen-browser-wallet", "author": "Bitgreen", - "description": "Bitgreen browser extension with wallet functionalities.", + "description": "Bitgreen browser extension and hybrid app with wallet functionalities.", "version": "1.3.0", "homepage": "https://github.com/bitgreen/browser-wallet#readme", "license": "GPL-3.0-or-later", @@ -23,37 +23,27 @@ "packages/*" ], "scripts": { - "build": "npm run build:chrome && npm run build:firefox && npm run build:apple && npm run build:android", - "build:all": "npm run build", + "setup": "npm install && cd ./packages/browser-wallet-base && npm run setup", + "build:all": "npm run build:chrome && npm run build:firefox && npm run build:safari && npm run build:app", "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production", "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production", "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production", - "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd build/apple && pod install", - "build:apple": "npm run build:safari && npm run build:ios", - "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production", - "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development --watch ", - "dev:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development --watch", - "dev:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development --watch", - "dev:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development --watch", - "dev:apple": "npm run build:safari && npm run build:ios --mode development --watch", - "dev:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development --watch", + "build:android": "npm run build:app && cd ./packages/browser-wallet-base && npm run build:android", + "build:ios": "npm run build:app && cd ./packages/browser-wallet-base && npm run build:ios", + "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development", + "dev:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", + "dev:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", + "dev:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development", + "dev:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "@bitgreen/browser-wallet-base": "^1.0.0", - "@capacitor/android": "^5.2.2", - "@capacitor/app": "^5.0.6", - "@capacitor/core": "^5.2.2", - "@capacitor/ios": "^5.2.2", - "@capacitor/keyboard": "^5.0.6", "@polkadot/api": "^10.10.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", "@polkadot/util": "^10.1.11", "@polkadot/util-crypto": "^10.1.11", "escape-string-regexp": "^5.0.0" - }, - "devDependencies": { - "@capacitor/cli": "^5.2.2" } } diff --git a/packages/browser-wallet-base/capacitor.config.json b/packages/browser-wallet-base/capacitor.config.json index 9259852..224aef0 100755 --- a/packages/browser-wallet-base/capacitor.config.json +++ b/packages/browser-wallet-base/capacitor.config.json @@ -1,10 +1,15 @@ { "appId": "com.bitgreen.wallet", "appName": "Bitgreen Wallet", + "webDir": "../../build/app", "server": { "androidScheme": "https" }, + "android": { + "path": "../../build/android" + }, "ios": { + "path": "../../build/ios", "scrollEnabled": false, "contentInset": "never" }, diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 9315e5d..5d4fe66 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -26,6 +26,12 @@ "@bitgreen/browser-wallet-core": "^1.0.0", "@bitgreen/browser-wallet-ui": "^1.0.0", "@bitgreen/browser-wallet-utils": "^1.0.0", + "@capacitor/android": "^5.7.0", + "@capacitor/app": "^5.0.7", + "@capacitor/clipboard": "^5.0.7", + "@capacitor/core": "^5.7.0", + "@capacitor/ios": "^5.7.0", + "@capacitor/keyboard": "^5.0.8", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", @@ -34,6 +40,8 @@ "@polkadot/x-global": "^10.1.12" }, "devDependencies": { + "@capacitor/assets": "^3.0.4", + "@capacitor/cli": "^5.7.0", "autoprefixer": "^10.4.17", "buffer": "^6.0.3", "crypto-browserify": "^3.12.0", @@ -53,5 +61,14 @@ "webpack": "^5.76.0", "webpack-cli": "^4.10.0", "webpack-extension-manifest-plugin": "^0.8.0" + }, + "scripts": { + "setup": "rm -Rf ../../build/android && rm -Rf ../../build/ios && cap add android && cap add ios && npm run icons", + "icons": "npm run icons:android && npm run icons:ios", + "icons:android": "capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 splashBackgroundColorDark #224851 --android --assetPath src/app-resources --androidProject ../../build/android", + "icons:ios": "capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 splashBackgroundColorDark #224851 --ios --assetPath src/app-resources --iosProject ../../build/ios", + "build": "npm run build:android && npm run build:ios", + "build:android": "cap sync android --deployment", + "build:ios": "cap sync ios --deployment" } } diff --git a/packages/browser-wallet-base/public/app.html b/packages/browser-wallet-base/public/app.html deleted file mode 100644 index 74ac76b..0000000 --- a/packages/browser-wallet-base/public/app.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - Bitgreen Wallet - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/readme.md b/packages/browser-wallet-base/readme.md index 63700bd..199cfa2 100644 --- a/packages/browser-wallet-base/readme.md +++ b/packages/browser-wallet-base/readme.md @@ -1,3 +1,33 @@ ## @bitgreen/browser-wallet-base ___ -Extension base structure. \ No newline at end of file +Extension base structure. Includes base files for extension as well as the capacitorjs hybrid app project. + +## Scripts +Normally all scripts are run from the main project, but you can also run them manually here: + +### `npm run setup` +This sets up the capacitorjs android and iOS platforms and generates the app icons. Platform code is in the form of Android Studio and XCode projects, respectively, in `../../build/android` and `../../build/ios` + +### `npm run icons` +Generates app icons and puts them in the platform build folders. + +### `npm run icons:android` +Generates android app icons and puts them in the android platform build folder. + +### `npm run icons:ios` +Generates iOS app icons and puts them in the iOS platform build folder. + +### `npm run build` +Sync the compiled app code into the platform folders. Compiled app code is generated from the main project and is located in `../../build/app` + +### `npm run build:android` +Sync the compiled app code into the android platform folder. + +### `npm run build:ios` +Sync the compiled app code into the iOS platform folder. + +## Webpack +There is a webpack config for each target (chrome, firefox and safari browser extension plus android and iOS apps), and are generated using `webpack.shared.cjs`. Some things to note about the webpack build proccess are: +- destination folder is removed before compilation +- when `--mode=development`, a watchdog is automatically started and all JS and SCSS files have inline sourcemaps for easier debugging +- the android and iOS platform folders will be re-synced upon every build, including in development mode \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/.gitignore b/packages/browser-wallet-base/src/android/.gitignore deleted file mode 100755 index c0ccbd0..0000000 --- a/packages/browser-wallet-base/src/android/.gitignore +++ /dev/null @@ -1,98 +0,0 @@ -# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore - -# Built application files -*.apk -*.aar -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -# Uncomment the following line in case you need and you don't have the release build type files in your app -# release/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ - -# Android Profiling -*.hprof - -# Copied web assets -app/src/main/assets/public - -# Generated Config files -app/src/main/assets/capacitor.config.json -app/src/main/assets/capacitor.plugins.json -app/src/main/res/xml/config.xml diff --git a/packages/browser-wallet-base/src/android/app/.gitignore b/packages/browser-wallet-base/src/android/app/.gitignore deleted file mode 100755 index 043df80..0000000 --- a/packages/browser-wallet-base/src/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/packages/browser-wallet-base/src/android/app/build.gradle b/packages/browser-wallet-base/src/android/app/build.gradle deleted file mode 100755 index c4ed4cd..0000000 --- a/packages/browser-wallet-base/src/android/app/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -apply plugin: 'com.android.application' - -android { - namespace "com.bitgreen.wallet" - compileSdkVersion rootProject.ext.compileSdkVersion - defaultConfig { - applicationId "com.bitgreen.wallet" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - aaptOptions { - // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. - // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - flatDir{ - dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" - implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" - implementation project(':capacitor-android') - testImplementation "junit:junit:$junitVersion" - androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" - androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" - implementation project(':capacitor-cordova-android-plugins') -} - -apply from: 'capacitor.build.gradle' - -try { - def servicesJSON = file('google-services.json') - if (servicesJSON.text) { - apply plugin: 'com.google.gms.google-services' - } -} catch(Exception e) { - logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} diff --git a/packages/browser-wallet-base/src/android/app/capacitor.build.gradle b/packages/browser-wallet-base/src/android/app/capacitor.build.gradle deleted file mode 100755 index eb4ae29..0000000 --- a/packages/browser-wallet-base/src/android/app/capacitor.build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } -} - -apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" -dependencies { - implementation project(':capacitor-app') - implementation project(':capacitor-keyboard') -} - - -if (hasProperty('postBuildExtras')) { - postBuildExtras() -} diff --git a/packages/browser-wallet-base/src/android/app/proguard-rules.pro b/packages/browser-wallet-base/src/android/app/proguard-rules.pro deleted file mode 100755 index f1b4245..0000000 --- a/packages/browser-wallet-base/src/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/packages/browser-wallet-base/src/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/packages/browser-wallet-base/src/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java deleted file mode 100755 index f2c2217..0000000 --- a/packages/browser-wallet-base/src/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import android.content.Context; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.getcapacitor.app", appContext.getPackageName()); - } -} diff --git a/packages/browser-wallet-base/src/android/app/src/main/AndroidManifest.xml b/packages/browser-wallet-base/src/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index 5f2321f..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/android/app/src/main/ic_launcher-playstore.png b/packages/browser-wallet-base/src/android/app/src/main/ic_launcher-playstore.png deleted file mode 100755 index 2cec21bdefb2ff9fb50b1b03f035f9ad6000455b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11374 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 diff --git a/packages/browser-wallet-base/src/android/app/src/main/java/com/bitgreen/wallet/MainActivity.java b/packages/browser-wallet-base/src/android/app/src/main/java/com/bitgreen/wallet/MainActivity.java deleted file mode 100755 index d26d64d..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/java/com/bitgreen/wallet/MainActivity.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.bitgreen.wallet; - -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.getcapacitor.BridgeActivity; - -public class MainActivity extends BridgeActivity { - private View overlayView; - private boolean isOverlayShown = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Inflate and add the custom background - overlayView = LayoutInflater.from(this).inflate(R.layout.background_layout, null); - } - - @Override - public void onPause() { - super.onPause(); - - getWindow().addContentView(overlayView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - } - - @Override - public void onResume() { - super.onResume(); - - // Add a delay of 400ms before hiding the overlay view - new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { - @Override - public void run() { - ViewGroup parent = (ViewGroup) overlayView.getParent(); - if (parent != null) { - parent.removeView(overlayView); - parent.requestLayout(); - } - } - }, 400); - } -} \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/packages/browser-wallet-base/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100755 index e6aee00..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/drawable/b_logo.png b/packages/browser-wallet-base/src/android/app/src/main/res/drawable/b_logo.png deleted file mode 100755 index c5ba800e699b3d7a7755d9cb9c99add39d93ebd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1481 zcmV;)1vdJLP)L($Div%}fpG;P6Ij6_`{ona2!7U;&1A zhtaX_cg}!qY<$f1FeA;6M$QvD#ln{+-rxK3P47peQ6nHDh67joQu*@D8Wh7xtMcXc z)Q}j?c~o*jNPh^OL+Q)h*MonK`5}gLK7}up4`}+_AK=?s9l+wOUK-HHT@Nyx{7PSY-giB~Hm4u7-MQL64nl;}$jf&TOG>p5 z=XLuFh;R!3q(5W;{7a>6#I=Nj%1go1-do-Ng;uX*fc)Qm?aPD1dT9R+b_h=7|HJjH z^Vokl6`aBcG+BS<>;_qL+Wc!!I-L3Hd0BG+d=0An-3P&#xOia7a6o)OGk-S|jOE#D zhJ$r0;h4p0*%M?qK=C9dqV`PmhT-6S7CY^=T`(N5cnYQwyMp1QQH$LxhLc7kc6?jw zGltV+3?~i5@WO)Oq=6VtU^r<0_@t0{5NY(C;owcgZlPxz7!KZz*y)@$b_kGMm}*;y z-B-Qg90HKo);tKtSWg47<^aTC=7O}mVmSHSxC0wT z@NF%>va1`d7*2lL{%FVGe)|E2(+`bw9P6;n>4!qXiPQ~iho=j{8FQE#AijuKf>|)N^1JPEc7tE)uKerp z#bG?Io|82P=beDo<+!*}1j7M|$0+Xv<8QrTI6!ezp<3)Fdc$z=ZpDuK5Tp=mk9jtd zcC;8y8nxJ6GMqFTvEyp$L?Dwa8BUKeoE~F1X&{CaxOgg&iP-&QIAHO-n0Y0F&M9Cx zct>5pXa}yQMss0P@KWq*yYF6?OgMKG32-5CzfonVHmb%mQ=bCls&xv+4z@*lnt zjJo~gR)Za;);7kM{~cDbdVa2^K7k9}W$l%ff>pKWts$mHX?6Z7FWc(+Ie*C+Clw-U z&Q~FXX^JaPk=>I$2o!s3`7M`#bUnau@|*5j8_IC<(qKOAdXVAdqrvQ*M#T<69$f0) zV|vUqZ=Vh5!f^5_{V>(^Em6dr`AP&>x$ZJ{E2xd5l8Be|fTP zBxQRq0%td<@f;V%aPA!by431s`wVjI+m9m7dvCU(mS zB;1$?EOvz-#g5meMvF)Iwb(J7MDE3o;UvP<)Gr;w=`n_r2Cq%sV};l;95fduY#?e5 zFC3l#;@Z>=FB}dQYt2OLxYRuXtu=+%aWyrPuQl%lw+xZ1sZo3|rN8?q7&Uif2XW!* zQFnq=5)r=b~NKoc#2P?jO1yU^sa_X=mE_wwBLo8t+aFCy!dfVyV4z4H(Y(X&ZAe z7{!Co^U*NgthR`J4%VFW&?&m(V}envIq7IkseJi#Xs3={7!F=7VX*A;bJ~@C7|!Vy jv1pgLiTD3m18MsOFUkA5$^#eD00000NkvXXu0mjf)F{aS diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/drawable/gradient_background.xml b/packages/browser-wallet-base/src/android/app/src/main/res/drawable/gradient_background.xml deleted file mode 100755 index f02cf01..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/drawable/gradient_background.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/drawable/ic_launcher_background.xml b/packages/browser-wallet-base/src/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100755 index 4455bf3..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/layout/activity_main.xml b/packages/browser-wallet-base/src/android/app/src/main/res/layout/activity_main.xml deleted file mode 100755 index b5ad138..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/layout/background_layout.xml b/packages/browser-wallet-base/src/android/app/src/main/res/layout/background_layout.xml deleted file mode 100755 index 234ced1..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/layout/background_layout.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100755 index 036d09b..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100755 index 036d09b..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100755 index f4faff43518bbb1dd4de459d78f63af2cbb4ba99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&iD%0{{RoN5ByfzXmIkB-K_Ormshep5rIx8DZM4 zn7t+(N0Q_yHM?jnT*3dq3e4cAVY?W#Z6nC(>-kf8f`13Qwr$nPJaP9F;-1FR5G7DR z_;YB(-MLSZ+qMmInl0OB03dpR1}OJAkONgv0s#u@24r02#V`0%KtTY1s-Qq10wQP< zhWbs7p=BuMxRFW zfAjf%B_vbMBuNs4mULY?|HpJu1c~WSExJTeFhU33j5ogksqAO>b>F%l@cZ{u;-S8D zX+3-2=Cb2yJ$L`lmu;So=kad4?bdH;K)^LLAOk|BV{so-PS$cH&c~819dJR30TDsj zI+ZA|O^0i4f6kp!0%qi-`kEFW`%HQ6Ugn9z%iZzoO+fzse}>#l>>T%Eqqb7VPHNk> zZMU(V9P+8%y_?ilQn!ClpYCjDw)iok{}Vv|zv~S`>Q&GYL3KNa$;KWu6~IF^4|$WcVn~bCzy#UjC!SOr4|R>}eT1^stOS-mYeA-M->P-X@%a z%2i9kMX0!-yrc#Is;3KJou92dr(jD9fCHoX>nN016Sg{lh9V7+(%S(n)q<#I0IRj2 zpaZ}{4M;f%pd$Y_b*o|9ut@phH76Yac1Q9D2P=L)ku3?J?&fF_%FZ&DTLIM06u>%T zqVm+dweFq*4H@v>>+~=v<%yWA*|l&EwCuX&K|j zV-5hjBKTAJXr`nQ+oDCNEK^=yWd+bUR{(2qG-K+zRscs*`0FT?SS{-vK+9wekjAwE zSgr*zEdW+(!4xatm?xek>nMPdT>k7k*D!8B1HiE(oIjNhr%Au5hm*E_SrTVs_n%ks z-03~Dq9xw={R`^;>v%8DE0#~9goM6e`D_%#9QJ_ap=7p*U@;B5Ggvszu^~r`)=1gN-32om1Rn0DpM-Ul**J+DpM-U zE|=5gbh(^Pm&-}z`(1Z$2m4(ojBb~F0s@1$4-D|W;>JSA<%`#@a)0gOWumH^faHHF E0NmW&MF0Q* diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp deleted file mode 100755 index c9bc5c2af2b720bf3b827acf4ee4b99a17f29992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804 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 diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp deleted file mode 100755 index 5397154f6896a2c1d24a9c5d3f44ad2280fd38a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594 zcmV-Y0pl#d4-T6bl=3i~wHjGnd`i&62LSh1+mq1E_jGKuAXg#~h^P%o7!44~+C)zn z9hi1r1`!5%cMt`-Y#`7sn)Lm_`~eK4-L{*`O_Yf(y(DF3W@e_8+mta}4uk&xM|q~Q zWtF>DME@tC>%X&2=R|}U+atAah=?#sMCuSRerG;NhIGsxlAvBpCF#$O@GAs=EYKDD zh1F8;uF>NK_1Teohk6ZRP#NT`@3*T_zG#3a_m~M5`19uaT;Hj<`@$E&&+2m?RJVK( zyv+wVoH(O{^;tG0ZaV>^;)#)1+^RWo%Lqbgr&yjcLZ$8fCKfkV=iw2>6OWcy4nTEs zj<2_Z7Us5tBYdq}iSmUE6YmsY*7izd?tp1E&R_bYk_qxZwnhia{fxxW2FAjuQu2o;4Cn+ccKgZUi%2 z*{ZnX+((u#!3br@Il0x5+5OgXjWI?#N5+qP}n zwr$(?j%{1*?m}k9Q;`|}%)EpDT7#pt^JHy%N4ehYCypw6UC)0!6KhL$Y}=-7jS#LP zux;D6^=zBhwrw6;Yp*#EeosyZqHWt|Ygse3-9Fp4k)(DjSGH}_wvMiC+xJE`GTXMT z%;pE!d@r`G>-;Ewwy}3-;I@&XX6G2XG>S$kP$=5)3$NG2N8nh{;5Q2mmn=-S~Wfp_g~ujL1o(#f}u2 zL@>y|$H2AIhCz;o+qOIeXFV4CPmdYWfAT>57`_-R_VO37nMkCFD^<;M--9G zHCr3ZnmA+1@HMW?oG{~f_i1%erO1{7Am5Uq$x(yF z3wvn2LPbcPIfK(vtnw{XXKXUHS0NTVRI0}a&|(EWI^CBr2_R=q95PkJ8a-F)gvLir zBoAYf0`2b9V`x7-A>0;?;#t>jcbGP6iJmoSN}cTvl81{ zC1C$IH)uUy=7`ppRU{LSaW{(WzFoF0NK9SKx2U%m;vPT?WDmJ)b&FOPH2@kPH8|wM z6*I-p(R!oyPo#$uSxo%5*@ZR+l94xKq1~G3b4YK`k}%^3fLRh}OcS+2>jkogG(W2W z)Uv-pX#ZgQ>zncG5|^hg(o;pOm^xwwz-LvKS&?s_j6C=f5)VO-{uZodR(5*K^iy{US50^d3*|0WayPr=7o=Eg}QGJd0q4Al020GzL2GT~SI>=;V zEK7{TixziidfWhD!v3#sm?3U~)|+&GkQ50dQ}HhefpeDie?9VMJoty;l<>vJI8Q1G z_IY`W*7Ii#X>(OYGGR!<;5@UhTR#zn7miZ|$iTRl!2>_@=-RCguj<*7rqtQ#AbE(W z<+aBQ%rFoqF4@reQ5<{L+0*+>6|o}IQH>6pI4u}N5@vN%1(s*{R(qFC;ZL=!U5zhK=!g~dc5 z&&(7*XRXE`HtzTUV7--S_Y8B>$wsKj-NC?I+Ox~ z*}KRYI9|EyASuAzgxARjuiuyuxNzO&d%p~%5Z5r!Vc>D?fh)Pe?|P4S2j{NXagBjz zR$K&d^PLR5F5Prk>crq^thcSP(crr-SaX?y_njAxQy|QQI~lkiKbe@%Gy6^4P4uuK zwsO?R6LpnLCHgG!rUIJ;5hqSwKXVf=cOQ#Up{ceX~q@_RoQXI%-7 z8K=v@f{LSO9&Xd56b_2DjTA(;|m@jozPT8_qVKKV8p=W(?Kfx8~4+h;Nd0Ik$eLH diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100755 index 5919fe76accd7d3bf91cbd9637140320ece0150f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1432 zcmV;J1!wwFNk&GH1pok7MM6+kP&iD41pojqU%(d-9y;5$o3^X*FJi0AFR*Rfwr!NQ zZQHhO+xEgJMy_j)mHAb>8nKhgwr$(Coe>>;$6BX>WZSlBXZIksZQHh;lx*9!ZQJ(y z|KD@(PpawDgCI$=Xvv_Ej*$Z0ot>gYBh%a>9_XH)~uFY|vvJinl zxi!%`vieZV{7N8S$bJttL*_{kR2EV)OLRC>sw1~LLQDRjSa4zBv%5UK>clKX1cG(9 zHR#9-B!geQX6n)TRvCd%dXEcK{=*4TQMm?)c%4k?%ydpAQ zitwMH3~31v+8uVp%eodT{TBbYnKx3DoTxmxXy8-DclFg<8FS;1aAut|s4t%{`8zg^ z`YZqrF=pDGLCluaABK?l<+7~-X)F+bFV~0(xY#GoZE}c+KD@s5y{iGhol~Om#*pOO|Dh^y$Q$N#slion$&v%B zT-s(35t9|21FYRqhbPxROoX^6fOR}+^X&GE2^aGOuqsmvT-l|V8E}0H7xToKbq*0< z7wp;u*3j3Icv;t8GoIXjb-QQ+;AoP93t8*;aLiJ-Cu!k@dB{4q&ZR6pCIK*PsK{pn z9xH(J?Eb6y_J9P=rCsWmaZ&^V=QbI?exHJdz2X=&^o?KtPe&P?S$1R@1a2J@H5aBv zyccmC{$BKN)#(KRgWtVIMEqgcdl3L1_e;J#uj~8=eqfHihf9_lS#}f=F?sO`ze#? znUlc%QM7m6cMzVrvP*l?JaySI2Gds^f=f2p7<$A+Pq_zJm$Men?!TBY(N6%o z^@w=@mxcnV%Z|)tmVh;h1**@^T|`8jS#Nm^fIrR+e5&BMwatE4+KMA?923Zfj(Rp$ ziU45Pi~mX3+&H8Pb#IWcdH4EJZgklsRRFTn0fXM9tvuBIvf;Z_+u-N2n)6fD=VtiV zUYuxu+_CtsG)FjjqE@kJmfO0-fi(VduM$~DUJ4pIIx=&W2T^W^yR@w2AIbO1* z=V+N$?u3KACqkMYOm`%WEu>miUBKTni00zog45(wl+DKy^h)ai&% z#@&+w>}SE_p18- z-k!IfrWGEsWY;4ex@p}|rjbB^<68pJw#?++B+z75KkoMw6%G4Oi6;CeMdK>>pBPPe zii(EK>cs>96R6m?ioR@98cGRN5~w9mr}~ZCO=&3I_U9SF_bq`)0`cZd mq+8aLV@X%81zmY6pS{eSiS)(K-wN(;R~etH-nidBWT+;PR}3B0dD>oxNY00y*;UKB={wQ6wjXL0FeR^Q1J(p;M`~kDjJB0 zkOEQU*+8OZnuIcgl*;Eokh|=;E_?6Z5Fm0cqKaKrnIf|e-};2{fT*0*7)fS7RSRfYcoQezmIt7f#&D2(AP zb_tpDF-pQ))MrLJ$S9yQ=M%pf-N~>&PZLBYmNv{XK1^nbyRhhLjA=BD3#6152c>ko zljus_b287E1m70MLhYRrg*1R^@O-2wOzLHU$ikyn-(%ckn7oTIlIn2iE3}m)hz@9t zDEJk^kIW)-6!Zo8?I}l5AF4n&SI(#qy+JBHbgbHONGrA~4#sp=BDv>r_ zJVR;)u|PRHNUGNRuvZAVWrxze;3A7mdicF8YvmqtKr3 z98zbLw0Duw5~IM~zBy#k*C=5wbe7R>QiEgp4@P(M45NFP2@@HScK-Pu!;c;9k3~0< zNhx(?800Maos5G?O!<;&auThcWE_Sj@aH5+w=gC!ef|sE?O;yr3zvz!*(QJX+8fK3bwEbfAaJ=nC2rebF;WqAz+T8xI$?g>6A5LgzE@ cRC_Pdxh`DdXxzUS0JtB&UTSIJ_y4cA0S&(5cK`qY diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100755 index d4e32366a0f9fa7904a3b7901c570c086ec5927a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3710 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 diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100755 index 351f16437e809db6fc2007110657cab9db4a5b85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2108 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 QD(REt`2X?$v0j6W6KL7v# diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100755 index c48c17ca0d27c076e2d9b4693a6a143d9e6a9bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5896 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 diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100755 index 68e3114b261401cd0de26b75eabf2f6c067b6bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2736 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 diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/packages/browser-wallet-base/src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp deleted file mode 100755 index 0ac5df213af6af5e237e2d0514f6bb4dffd2752c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 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 diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/values/colors.xml b/packages/browser-wallet-base/src/android/app/src/main/res/values/colors.xml deleted file mode 100755 index d33347c..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #224851 - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/values/ic_launcher_background.xml b/packages/browser-wallet-base/src/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100755 index bceae12..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #C0FF00 - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/values/strings.xml b/packages/browser-wallet-base/src/android/app/src/main/res/values/strings.xml deleted file mode 100755 index 694c099..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - Bitgreen Wallet - Bitgreen Wallet - com.bitgreen.wallet - com.bitgreen.wallet - diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/values/styles.xml b/packages/browser-wallet-base/src/android/app/src/main/res/values/styles.xml deleted file mode 100755 index 5ee2163..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/app/src/main/res/xml/file_paths.xml b/packages/browser-wallet-base/src/android/app/src/main/res/xml/file_paths.xml deleted file mode 100755 index bd0c4d8..0000000 --- a/packages/browser-wallet-base/src/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/build.gradle b/packages/browser-wallet-base/src/android/build.gradle deleted file mode 100755 index 9cc72cb..0000000 --- a/packages/browser-wallet-base/src/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.0.0' - classpath 'com.google.gms:google-services:4.3.15' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply from: "variables.gradle" - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/build.gradle b/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/build.gradle deleted file mode 100755 index 74a6240..0000000 --- a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/build.gradle +++ /dev/null @@ -1,59 +0,0 @@ -ext { - androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1' - cordovaAndroidVersion = project.hasProperty('cordovaAndroidVersion') ? rootProject.ext.cordovaAndroidVersion : '10.1.1' -} - -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.0.0' - } -} - -apply plugin: 'com.android.library' - -android { - namespace "capacitor.cordova.android.plugins" - compileSdkVersion project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 33 - defaultConfig { - minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22 - targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 33 - versionCode 1 - versionName "1.0" - } - lintOptions { - abortOnError false - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } -} - -repositories { - google() - mavenCentral() - flatDir{ - dirs 'src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(dir: 'src/main/libs', include: ['*.jar']) - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation "org.apache.cordova:framework:$cordovaAndroidVersion" - // SUB-PROJECT DEPENDENCIES START - - // SUB-PROJECT DEPENDENCIES END -} - -// PLUGIN GRADLE EXTENSIONS START -apply from: "cordova.variables.gradle" -// PLUGIN GRADLE EXTENSIONS END - -for (def func : cdvPluginPostBuildExtras) { - func() -} \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/cordova.variables.gradle b/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/cordova.variables.gradle deleted file mode 100755 index 5b55884..0000000 --- a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/cordova.variables.gradle +++ /dev/null @@ -1,7 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -ext { - cdvMinSdkVersion = project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22 - // Plugin gradle extensions can append to this to have code run at the end. - cdvPluginPostBuildExtras = [] - cordovaConfig = [:] -} \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml b/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml deleted file mode 100755 index cb9c8aa..0000000 --- a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep b/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep b/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep deleted file mode 100755 index 8b13789..0000000 --- a/packages/browser-wallet-base/src/android/capacitor-cordova-android-plugins/src/main/res/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/browser-wallet-base/src/android/capacitor.settings.gradle b/packages/browser-wallet-base/src/android/capacitor.settings.gradle deleted file mode 100755 index e4adbe0..0000000 --- a/packages/browser-wallet-base/src/android/capacitor.settings.gradle +++ /dev/null @@ -1,9 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../../node_modules/@capacitor/android/capacitor') - -include ':capacitor-app' -project(':capacitor-app').projectDir = new File('../../node_modules/@capacitor/app/android') - -include ':capacitor-keyboard' -project(':capacitor-keyboard').projectDir = new File('../../node_modules/@capacitor/keyboard/android') \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/gradle.properties b/packages/browser-wallet-base/src/android/gradle.properties deleted file mode 100755 index 2e87c52..0000000 --- a/packages/browser-wallet-base/src/android/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true diff --git a/packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.jar b/packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100755 index ccebba7710deaf9f98673a68957ea02138b60d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61608 zcmb5VV{~QRw)Y#`wrv{~+qP{x72B%VwzFc}c2cp;N~)5ZbDrJayPv(!dGEd-##*zr z)#n-$y^sH|_dchh3@8{H5D*j;5D<{i*8l5IFJ|DjL!e)upfGNX(kojugZ3I`oH1PvW`wFW_ske0j@lB9bX zO;2)`y+|!@X(fZ1<2n!Qx*)_^Ai@Cv-dF&(vnudG?0CsddG_&Wtae(n|K59ew)6St z#dj7_(Cfwzh$H$5M!$UDd8=4>IQsD3xV=lXUq($;(h*$0^yd+b{qq63f0r_de#!o_ zXDngc>zy`uor)4A^2M#U*DC~i+dc<)Tb1Tv&~Ev@oM)5iJ4Sn#8iRw16XXuV50BS7 zdBL5Mefch(&^{luE{*5qtCZk$oFr3RH=H!c3wGR=HJ(yKc_re_X9pD` zJ;uxPzUfVpgU>DSq?J;I@a+10l0ONXPcDkiYcihREt5~T5Gb}sT0+6Q;AWHl`S5dV>lv%-p9l#xNNy7ZCr%cyqHY%TZ8Q4 zbp&#ov1*$#grNG#1vgfFOLJCaNG@K|2!W&HSh@3@Y%T?3YI75bJp!VP*$*!< z;(ffNS_;@RJ`=c7yX04!u3JP*<8jeqLHVJu#WV&v6wA!OYJS4h<_}^QI&97-;=ojW zQ-1t)7wnxG*5I%U4)9$wlv5Fr;cIizft@&N+32O%B{R1POm$oap@&f| zh+5J{>U6ftv|vAeKGc|zC=kO(+l7_cLpV}-D#oUltScw})N>~JOZLU_0{Ka2e1evz z{^a*ZrLr+JUj;)K&u2CoCAXLC2=fVScI(m_p~0FmF>>&3DHziouln?;sxW`NB}cSX z8?IsJB)Z=aYRz!X=yJn$kyOWK%rCYf-YarNqKzmWu$ZvkP12b4qH zhS9Q>j<}(*frr?z<%9hl*i^#@*O2q(Z^CN)c2c z>1B~D;@YpG?G!Yk+*yn4vM4sO-_!&m6+`k|3zd;8DJnxsBYtI;W3We+FN@|tQ5EW= z!VU>jtim0Mw#iaT8t_<+qKIEB-WwE04lBd%Letbml9N!?SLrEG$nmn7&W(W`VB@5S zaY=sEw2}i@F_1P4OtEw?xj4@D6>_e=m=797#hg}f*l^`AB|Y0# z9=)o|%TZFCY$SzgSjS|8AI-%J4x}J)!IMxY3_KYze`_I=c1nmrk@E8c9?MVRu)7+Ue79|)rBX7tVB7U|w4*h(;Gi3D9le49B38`wuv zp7{4X^p+K4*$@gU(Tq3K1a#3SmYhvI42)GzG4f|u zwQFT1n_=n|jpi=70-yE9LA+d*T8u z`=VmmXJ_f6WmZveZPct$Cgu^~gFiyL>Lnpj*6ee>*0pz=t$IJ}+rE zsf@>jlcG%Wx;Cp5x)YSVvB1$yyY1l&o zvwX=D7k)Dn;ciX?Z)Pn8$flC8#m`nB&(8?RSdBvr?>T9?E$U3uIX7T?$v4dWCa46 z+&`ot8ZTEgp7G+c52oHJ8nw5}a^dwb_l%MOh(ebVj9>_koQP^$2B~eUfSbw9RY$_< z&DDWf2LW;b0ZDOaZ&2^i^g+5uTd;GwO(-bbo|P^;CNL-%?9mRmxEw~5&z=X^Rvbo^WJW=n_%*7974RY}JhFv46> zd}`2|qkd;89l}R;i~9T)V-Q%K)O=yfVKNM4Gbacc7AOd>#^&W&)Xx!Uy5!BHnp9kh z`a(7MO6+Ren#>R^D0K)1sE{Bv>}s6Rb9MT14u!(NpZOe-?4V=>qZ>}uS)!y~;jEUK z&!U7Fj&{WdgU#L0%bM}SYXRtM5z!6M+kgaMKt%3FkjWYh=#QUpt$XX1!*XkpSq-pl zhMe{muh#knk{9_V3%qdDcWDv}v)m4t9 zQhv{;} zc{}#V^N3H>9mFM8`i`0p+fN@GqX+kl|M94$BK3J-X`Hyj8r!#x6Vt(PXjn?N)qedP z=o1T^#?1^a{;bZ&x`U{f?}TMo8ToN zkHj5v|}r}wDEi7I@)Gj+S1aE-GdnLN+$hw!=DzglMaj#{qjXi_dwpr|HL(gcCXwGLEmi|{4&4#OZ4ChceA zKVd4K!D>_N=_X;{poT~4Q+!Le+ZV>=H7v1*l%w`|`Dx8{)McN@NDlQyln&N3@bFpV z_1w~O4EH3fF@IzJ9kDk@7@QctFq8FbkbaH7K$iX=bV~o#gfh?2JD6lZf(XP>~DACF)fGFt)X%-h1yY~MJU{nA5 ze2zxWMs{YdX3q5XU*9hOH0!_S24DOBA5usB+Ws$6{|AMe*joJ?RxfV}*7AKN9V*~J zK+OMcE@bTD>TG1*yc?*qGqjBN8mgg@h1cJLDv)0!WRPIkC` zZrWXrceVw;fB%3`6kq=a!pq|hFIsQ%ZSlo~)D z|64!aCnw-?>}AG|*iOl44KVf8@|joXi&|)1rB;EQWgm+iHfVbgllP$f!$Wf42%NO5b(j9Bw6L z;0dpUUK$5GX4QbMlTmLM_jJt!ur`_0~$b#BB7FL*%XFf<b__1o)Ao3rlobbN8-(T!1d-bR8D3S0@d zLI!*GMb5s~Q<&sjd}lBb8Nr0>PqE6_!3!2d(KAWFxa{hm`@u|a(%#i(#f8{BP2wbs zt+N_slWF4IF_O|{w`c~)Xvh&R{Au~CFmW#0+}MBd2~X}t9lz6*E7uAD`@EBDe$>7W zzPUkJx<`f$0VA$=>R57^(K^h86>09?>_@M(R4q($!Ck6GG@pnu-x*exAx1jOv|>KH zjNfG5pwm`E-=ydcb+3BJwuU;V&OS=6yM^4Jq{%AVqnTTLwV`AorIDD}T&jWr8pB&j28fVtk_y*JRP^t@l*($UZ z6(B^-PBNZ+z!p?+e8@$&jCv^EWLb$WO=}Scr$6SM*&~B95El~;W_0(Bvoha|uQ1T< zO$%_oLAwf1bW*rKWmlD+@CP&$ObiDy=nh1b2ejz%LO9937N{LDe7gle4i!{}I$;&Y zkexJ9Ybr+lrCmKWg&}p=`2&Gf10orS?4$VrzWidT=*6{KzOGMo?KI0>GL0{iFWc;C z+LPq%VH5g}6V@-tg2m{C!-$fapJ9y}c$U}aUmS{9#0CM*8pC|sfer!)nG7Ji>mfRh z+~6CxNb>6eWKMHBz-w2{mLLwdA7dA-qfTu^A2yG1+9s5k zcF=le_UPYG&q!t5Zd_*E_P3Cf5T6821bO`daa`;DODm8Ih8k89=RN;-asHIigj`n=ux>*f!OC5#;X5i;Q z+V!GUy0|&Y_*8k_QRUA8$lHP;GJ3UUD08P|ALknng|YY13)}!!HW@0z$q+kCH%xet zlWf@BXQ=b=4}QO5eNnN~CzWBbHGUivG=`&eWK}beuV*;?zt=P#pM*eTuy3 zP}c#}AXJ0OIaqXji78l;YrP4sQe#^pOqwZUiiN6^0RCd#D271XCbEKpk`HI0IsN^s zES7YtU#7=8gTn#lkrc~6)R9u&SX6*Jk4GFX7){E)WE?pT8a-%6P+zS6o&A#ml{$WX zABFz#i7`DDlo{34)oo?bOa4Z_lNH>n;f0nbt$JfAl~;4QY@}NH!X|A$KgMmEsd^&Y zt;pi=>AID7ROQfr;MsMtClr5b0)xo|fwhc=qk33wQ|}$@?{}qXcmECh>#kUQ-If0$ zseb{Wf4VFGLNc*Rax#P8ko*=`MwaR-DQ8L8V8r=2N{Gaips2_^cS|oC$+yScRo*uF zUO|5=?Q?{p$inDpx*t#Xyo6=s?bbN}y>NNVxj9NZCdtwRI70jxvm3!5R7yiWjREEd zDUjrsZhS|P&|Ng5r+f^kA6BNN#|Se}_GF>P6sy^e8kBrgMv3#vk%m}9PCwUWJg-AD zFnZ=}lbi*mN-AOm zCs)r=*YQAA!`e#1N>aHF=bb*z*hXH#Wl$z^o}x##ZrUc=kh%OHWhp=7;?8%Xj||@V?1c ziWoaC$^&04;A|T)!Zd9sUzE&$ODyJaBpvqsw19Uiuq{i#VK1!htkdRWBnb z`{rat=nHArT%^R>u#CjjCkw-7%g53|&7z-;X+ewb?OLWiV|#nuc8mp*LuGSi3IP<<*Wyo9GKV7l0Noa4Jr0g3p_$ z*R9{qn=?IXC#WU>48-k5V2Oc_>P;4_)J@bo1|pf=%Rcbgk=5m)CJZ`caHBTm3%!Z9 z_?7LHr_BXbKKr=JD!%?KhwdYSdu8XxPoA{n8^%_lh5cjRHuCY9Zlpz8g+$f@bw@0V z+6DRMT9c|>1^3D|$Vzc(C?M~iZurGH2pXPT%F!JSaAMdO%!5o0uc&iqHx?ImcX6fI zCApkzc~OOnfzAd_+-DcMp&AOQxE_EsMqKM{%dRMI5`5CT&%mQO?-@F6tE*xL?aEGZ z8^wH@wRl`Izx4sDmU>}Ym{ybUm@F83qqZPD6nFm?t?(7>h*?`fw)L3t*l%*iw0Qu#?$5eq!Qc zpQvqgSxrd83NsdO@lL6#{%lsYXWen~d3p4fGBb7&5xqNYJ)yn84!e1PmPo7ChVd%4 zHUsV0Mh?VpzZD=A6%)Qrd~i7 z96*RPbid;BN{Wh?adeD_p8YU``kOrGkNox3D9~!K?w>#kFz!4lzOWR}puS(DmfjJD z`x0z|qB33*^0mZdM&6$|+T>fq>M%yoy(BEjuh9L0>{P&XJ3enGpoQRx`v6$txXt#c z0#N?b5%srj(4xmPvJxrlF3H%OMB!jvfy z;wx8RzU~lb?h_}@V=bh6p8PSb-dG|-T#A?`c&H2`_!u+uenIZe`6f~A7r)`9m8atC zt(b|6Eg#!Q*DfRU=Ix`#B_dK)nnJ_+>Q<1d7W)eynaVn`FNuN~%B;uO2}vXr5^zi2 z!ifIF5@Zlo0^h~8+ixFBGqtweFc`C~JkSq}&*a3C}L?b5Mh-bW=e)({F_g4O3 zb@SFTK3VD9QuFgFnK4Ve_pXc3{S$=+Z;;4+;*{H}Rc;845rP?DLK6G5Y-xdUKkA6E3Dz&5f{F^FjJQ(NSpZ8q-_!L3LL@H* zxbDF{gd^U3uD;)a)sJwAVi}7@%pRM&?5IaUH%+m{E)DlA_$IA1=&jr{KrhD5q&lTC zAa3c)A(K!{#nOvenH6XrR-y>*4M#DpTTOGQEO5Jr6kni9pDW`rvY*fs|ItV;CVITh z=`rxcH2nEJpkQ^(;1c^hfb8vGN;{{oR=qNyKtR1;J>CByul*+=`NydWnSWJR#I2lN zTvgnR|MBx*XFsfdA&;tr^dYaqRZp*2NwkAZE6kV@1f{76e56eUmGrZ>MDId)oqSWw z7d&r3qfazg+W2?bT}F)4jD6sWaw`_fXZGY&wnGm$FRPFL$HzVTH^MYBHWGCOk-89y zA+n+Q6EVSSCpgC~%uHfvyg@ufE^#u?JH?<73A}jj5iILz4Qqk5$+^U(SX(-qv5agK znUkfpke(KDn~dU0>gdKqjTkVk`0`9^0n_wzXO7R!0Thd@S;U`y)VVP&mOd-2 z(hT(|$=>4FY;CBY9#_lB$;|Wd$aOMT5O_3}DYXEHn&Jrc3`2JiB`b6X@EUOD zVl0S{ijm65@n^19T3l%>*;F(?3r3s?zY{thc4%AD30CeL_4{8x6&cN}zN3fE+x<9; zt2j1RRVy5j22-8U8a6$pyT+<`f+x2l$fd_{qEp_bfxfzu>ORJsXaJn4>U6oNJ#|~p z`*ZC&NPXl&=vq2{Ne79AkQncuxvbOG+28*2wU$R=GOmns3W@HE%^r)Fu%Utj=r9t` zd;SVOnA(=MXgnOzI2@3SGKHz8HN~Vpx&!Ea+Df~`*n@8O=0!b4m?7cE^K*~@fqv9q zF*uk#1@6Re_<^9eElgJD!nTA@K9C732tV~;B`hzZ321Ph=^BH?zXddiu{Du5*IPg} zqDM=QxjT!Rp|#Bkp$(mL)aar)f(dOAXUiw81pX0DC|Y4;>Vz>>DMshoips^8Frdv} zlTD=cKa48M>dR<>(YlLPOW%rokJZNF2gp8fwc8b2sN+i6&-pHr?$rj|uFgktK@jg~ zIFS(%=r|QJ=$kvm_~@n=ai1lA{7Z}i+zj&yzY+!t$iGUy|9jH#&oTNJ;JW-3n>DF+ z3aCOzqn|$X-Olu_p7brzn`uk1F*N4@=b=m;S_C?#hy{&NE#3HkATrg?enaVGT^$qIjvgc61y!T$9<1B@?_ibtDZ{G zeXInVr5?OD_nS_O|CK3|RzzMmu+8!#Zb8Ik;rkIAR%6?$pN@d<0dKD2c@k2quB%s( zQL^<_EM6ow8F6^wJN1QcPOm|ehA+dP(!>IX=Euz5qqIq}Y3;ibQtJnkDmZ8c8=Cf3 zu`mJ!Q6wI7EblC5RvP*@)j?}W=WxwCvF3*5Up_`3*a~z$`wHwCy)2risye=1mSp%p zu+tD6NAK3o@)4VBsM!@);qgsjgB$kkCZhaimHg&+k69~drbvRTacWKH;YCK(!rC?8 zP#cK5JPHSw;V;{Yji=55X~S+)%(8fuz}O>*F3)hR;STU`z6T1aM#Wd+FP(M5*@T1P z^06O;I20Sk!bxW<-O;E081KRdHZrtsGJflFRRFS zdi5w9OVDGSL3 zNrC7GVsGN=b;YH9jp8Z2$^!K@h=r-xV(aEH@#JicPy;A0k1>g1g^XeR`YV2HfmqXY zYbRwaxHvf}OlCAwHoVI&QBLr5R|THf?nAevV-=~V8;gCsX>jndvNOcFA+DI+zbh~# zZ7`qNk&w+_+Yp!}j;OYxIfx_{f0-ONc?mHCiCUak=>j>~>YR4#w# zuKz~UhT!L~GfW^CPqG8Lg)&Rc6y^{%3H7iLa%^l}cw_8UuG;8nn9)kbPGXS}p3!L_ zd#9~5CrH8xtUd?{d2y^PJg+z(xIfRU;`}^=OlehGN2=?}9yH$4Rag}*+AWotyxfCJ zHx=r7ZH>j2kV?%7WTtp+-HMa0)_*DBBmC{sd$)np&GEJ__kEd`xB5a2A z*J+yx>4o#ZxwA{;NjhU*1KT~=ZK~GAA;KZHDyBNTaWQ1+;tOFFthnD)DrCn`DjBZ% zk$N5B4^$`n^jNSOr=t(zi8TN4fpaccsb`zOPD~iY=UEK$0Y70bG{idLx@IL)7^(pL z{??Bnu=lDeguDrd%qW1)H)H`9otsOL-f4bSu};o9OXybo6J!Lek`a4ff>*O)BDT_g z<6@SrI|C9klY(>_PfA^qai7A_)VNE4c^ZjFcE$Isp>`e5fLc)rg@8Q_d^Uk24$2bn z9#}6kZ2ZxS9sI(RqT7?El2@B+($>eBQrNi_k#CDJ8D9}8$mmm z4oSKO^F$i+NG)-HE$O6s1--6EzJa?C{x=QgK&c=)b(Q9OVoAXYEEH20G|q$}Hue%~ zO3B^bF=t7t48sN zWh_zA`w~|){-!^g?6Mqf6ieV zFx~aPUOJGR=4{KsW7I?<=J2|lY`NTU=lt=%JE9H1vBpkcn=uq(q~=?iBt_-r(PLBM zP-0dxljJO>4Wq-;stY)CLB4q`-r*T$!K2o}?E-w_i>3_aEbA^MB7P5piwt1dI-6o!qWCy0 ztYy!x9arGTS?kabkkyv*yxvsPQ7Vx)twkS6z2T@kZ|kb8yjm+^$|sEBmvACeqbz)RmxkkDQX-A*K!YFziuhwb|ym>C$}U|J)4y z$(z#)GH%uV6{ec%Zy~AhK|+GtG8u@c884Nq%w`O^wv2#A(&xH@c5M`Vjk*SR_tJnq z0trB#aY)!EKW_}{#L3lph5ow=@|D5LzJYUFD6 z7XnUeo_V0DVSIKMFD_T0AqAO|#VFDc7c?c-Q%#u00F%!_TW1@JVnsfvm@_9HKWflBOUD~)RL``-!P;(bCON_4eVdduMO>?IrQ__*zE@7(OX zUtfH@AX*53&xJW*Pu9zcqxGiM>xol0I~QL5B%Toog3Jlenc^WbVgeBvV8C8AX^Vj& z^I}H})B=VboO%q1;aU5ACMh{yK4J;xlMc`jCnZR^!~LDs_MP&8;dd@4LDWw~*>#OT zeZHwdQWS!tt5MJQI~cw|Ka^b4c|qyd_ly(+Ql2m&AAw^ zQeSXDOOH!!mAgzAp0z)DD>6Xo``b6QwzUV@w%h}Yo>)a|xRi$jGuHQhJVA%>)PUvK zBQ!l0hq<3VZ*RnrDODP)>&iS^wf64C;MGqDvx>|p;35%6(u+IHoNbK z;Gb;TneFo*`zUKS6kwF*&b!U8e5m4YAo03a_e^!5BP42+r)LFhEy?_7U1IR<; z^0v|DhCYMSj<-;MtY%R@Fg;9Kky^pz_t2nJfKWfh5Eu@_l{^ph%1z{jkg5jQrkvD< z#vdK!nku*RrH~TdN~`wDs;d>XY1PH?O<4^U4lmA|wUW{Crrv#r%N>7k#{Gc44Fr|t z@UZP}Y-TrAmnEZ39A*@6;ccsR>)$A)S>$-Cj!=x$rz7IvjHIPM(TB+JFf{ehuIvY$ zsDAwREg*%|=>Hw$`us~RP&3{QJg%}RjJKS^mC_!U;E5u>`X`jW$}P`Mf}?7G7FX#{ zE(9u1SO;3q@ZhDL9O({-RD+SqqPX)`0l5IQu4q)49TUTkxR(czeT}4`WV~pV*KY&i zAl3~X%D2cPVD^B43*~&f%+Op)wl<&|D{;=SZwImydWL6@_RJjxP2g)s=dH)u9Npki zs~z9A+3fj0l?yu4N0^4aC5x)Osnm0qrhz@?nwG_`h(71P znbIewljU%T*cC=~NJy|)#hT+lx#^5MuDDnkaMb*Efw9eThXo|*WOQzJ*#3dmRWm@! zfuSc@#kY{Um^gBc^_Xdxnl!n&y&}R4yAbK&RMc+P^Ti;YIUh|C+K1|=Z^{nZ}}rxH*v{xR!i%qO~o zTr`WDE@k$M9o0r4YUFFeQO7xCu_Zgy)==;fCJ94M_rLAv&~NhfvcLWCoaGg2ao~3e zBG?Ms9B+efMkp}7BhmISGWmJsKI@a8b}4lLI48oWKY|8?zuuNc$lt5Npr+p7a#sWu zh!@2nnLBVJK!$S~>r2-pN||^w|fY`CT{TFnJy`B|e5;=+_v4l8O-fkN&UQbA4NKTyntd zqK{xEKh}U{NHoQUf!M=2(&w+eef77VtYr;xs%^cPfKLObyOV_9q<(%76-J%vR>w9!us-0c-~Y?_EVS%v!* z15s2s3eTs$Osz$JayyH|5nPAIPEX=U;r&p;K14G<1)bvn@?bM5kC{am|C5%hyxv}a z(DeSKI5ZfZ1*%dl8frIX2?);R^^~LuDOpNpk-2R8U1w92HmG1m&|j&J{EK=|p$;f9 z7Rs5|jr4r8k5El&qcuM+YRlKny%t+1CgqEWO>3;BSRZi(LA3U%Jm{@{y+A+w(gzA< z7dBq6a1sEWa4cD0W7=Ld9z0H7RI^Z7vl(bfA;72j?SWCo`#5mVC$l1Q2--%V)-uN* z9ha*s-AdfbDZ8R8*fpwjzx=WvOtmSzGFjC#X)hD%Caeo^OWjS(3h|d9_*U)l%{Ab8 zfv$yoP{OuUl@$(-sEVNt{*=qi5P=lpxWVuz2?I7Dc%BRc+NGNw+323^ z5BXGfS71oP^%apUo(Y#xkxE)y?>BFzEBZ}UBbr~R4$%b7h3iZu3S(|A;&HqBR{nK& z$;GApNnz=kNO^FL&nYcfpB7Qg;hGJPsCW44CbkG1@l9pn0`~oKy5S777uH)l{irK!ru|X+;4&0D;VE*Ii|<3P zUx#xUqvZT5kVQxsF#~MwKnv7;1pR^0;PW@$@T7I?s`_rD1EGUdSA5Q(C<>5SzE!vw z;{L&kKFM-MO>hy#-8z`sdVx})^(Dc-dw;k-h*9O2_YZw}|9^y-|8RQ`BWJUJL(Cer zP5Z@fNc>pTXABbTRY-B5*MphpZv6#i802giwV&SkFCR zGMETyUm(KJbh+&$8X*RB#+{surjr;8^REEt`2&Dubw3$mx>|~B5IKZJ`s_6fw zKAZx9&PwBqW1Oz0r0A4GtnZd7XTKViX2%kPfv+^X3|_}RrQ2e3l=KG_VyY`H?I5&CS+lAX5HbA%TD9u6&s#v!G> zzW9n4J%d5ye7x0y`*{KZvqyXUfMEE^ZIffzI=Hh|3J}^yx7eL=s+TPH(Q2GT-sJ~3 zI463C{(ag7-hS1ETtU;_&+49ABt5!A7CwLwe z=SoA8mYZIQeU;9txI=zcQVbuO%q@E)JI+6Q!3lMc=Gbj(ASg-{V27u>z2e8n;Nc*pf}AqKz1D>p9G#QA+7mqqrEjGfw+85Uyh!=tTFTv3|O z+)-kFe_8FF_EkTw!YzwK^Hi^_dV5x-Ob*UWmD-})qKj9@aE8g240nUh=g|j28^?v7 zHRTBo{0KGaWBbyX2+lx$wgXW{3aUab6Bhm1G1{jTC7ota*JM6t+qy)c5<@ zpc&(jVdTJf(q3xB=JotgF$X>cxh7k*(T`-V~AR+`%e?YOeALQ2Qud( zz35YizXt(aW3qndR}fTw1p()Ol4t!D1pitGNL95{SX4ywzh0SF;=!wf=?Q?_h6!f* zh7<+GFi)q|XBsvXZ^qVCY$LUa{5?!CgwY?EG;*)0ceFe&=A;!~o`ae}Z+6me#^sv- z1F6=WNd6>M(~ z+092z>?Clrcp)lYNQl9jN-JF6n&Y0mp7|I0dpPx+4*RRK+VQI~>en0Dc;Zfl+x z_e_b7s`t1_A`RP3$H}y7F9_na%D7EM+**G_Z0l_nwE+&d_kc35n$Fxkd4r=ltRZhh zr9zER8>j(EdV&Jgh(+i}ltESBK62m0nGH6tCBr90!4)-`HeBmz54p~QP#dsu%nb~W z7sS|(Iydi>C@6ZM(Us!jyIiszMkd)^u<1D+R@~O>HqZIW&kearPWmT>63%_t2B{_G zX{&a(gOYJx!Hq=!T$RZ&<8LDnxsmx9+TBL0gTk$|vz9O5GkK_Yx+55^R=2g!K}NJ3 zW?C;XQCHZl7H`K5^BF!Q5X2^Mj93&0l_O3Ea3!Ave|ixx+~bS@Iv18v2ctpSt4zO{ zp#7pj!AtDmti$T`e9{s^jf(ku&E|83JIJO5Qo9weT6g?@vX!{7)cNwymo1+u(YQ94 zopuz-L@|5=h8A!(g-MXgLJC0MA|CgQF8qlonnu#j z;uCeq9ny9QSD|p)9sp3ebgY3rk#y0DA(SHdh$DUm^?GI<>%e1?&}w(b zdip1;P2Z=1wM+$q=TgLP$}svd!vk+BZ@h<^4R=GS2+sri7Z*2f`9 z5_?i)xj?m#pSVchk-SR!2&uNhzEi+#5t1Z$o0PoLGz*pT64%+|Wa+rd5Z}60(j?X= z{NLjtgRb|W?CUADqOS@(*MA-l|E342NxRaxLTDqsOyfWWe%N(jjBh}G zm7WPel6jXijaTiNita+z(5GCO0NM=Melxud57PP^d_U## zbA;9iVi<@wr0DGB8=T9Ab#2K_#zi=$igyK48@;V|W`fg~7;+!q8)aCOo{HA@vpSy-4`^!ze6-~8|QE||hC{ICKllG9fbg_Y7v z$jn{00!ob3!@~-Z%!rSZ0JO#@>|3k10mLK0JRKP-Cc8UYFu>z93=Ab-r^oL2 zl`-&VBh#=-?{l1TatC;VweM^=M7-DUE>m+xO7Xi6vTEsReyLs8KJ+2GZ&rxw$d4IT zPXy6pu^4#e;;ZTsgmG+ZPx>piodegkx2n0}SM77+Y*j^~ICvp#2wj^BuqRY*&cjmL zcKp78aZt>e{3YBb4!J_2|K~A`lN=u&5j!byw`1itV(+Q_?RvV7&Z5XS1HF)L2v6ji z&kOEPmv+k_lSXb{$)of~(BkO^py&7oOzpjdG>vI1kcm_oPFHy38%D4&A4h_CSo#lX z2#oqMCTEP7UvUR3mwkPxbl8AMW(e{ARi@HCYLPSHE^L<1I}OgZD{I#YH#GKnpRmW3 z2jkz~Sa(D)f?V?$gNi?6)Y;Sm{&?~2p=0&BUl_(@hYeX8YjaRO=IqO7neK0RsSNdYjD zaw$g2sG(>JR=8Iz1SK4`*kqd_3-?;_BIcaaMd^}<@MYbYisWZm2C2|Np_l|8r9yM|JkUngSo@?wci(7&O9a z%|V(4C1c9pps0xxzPbXH=}QTxc2rr7fXk$9`a6TbWKPCz&p=VsB8^W96W=BsB|7bc zf(QR8&Ktj*iz)wK&mW`#V%4XTM&jWNnDF56O+2bo<3|NyUhQ%#OZE8$Uv2a@J>D%t zMVMiHh?es!Ex19q&6eC&L=XDU_BA&uR^^w>fpz2_`U87q_?N2y;!Z!bjoeKrzfC)} z?m^PM=(z{%n9K`p|7Bz$LuC7!>tFOuN74MFELm}OD9?%jpT>38J;=1Y-VWtZAscaI z_8jUZ#GwWz{JqvGEUmL?G#l5E=*m>`cY?m*XOc*yOCNtpuIGD+Z|kn4Xww=BLrNYS zGO=wQh}Gtr|7DGXLF%|`G>J~l{k^*{;S-Zhq|&HO7rC_r;o`gTB7)uMZ|WWIn@e0( zX$MccUMv3ABg^$%_lNrgU{EVi8O^UyGHPNRt%R!1#MQJn41aD|_93NsBQhP80yP<9 zG4(&0u7AtJJXLPcqzjv`S~5;Q|5TVGccN=Uzm}K{v)?f7W!230C<``9(64}D2raRU zAW5bp%}VEo{4Rko`bD%Ehf=0voW?-4Mk#d3_pXTF!-TyIt6U+({6OXWVAa;s-`Ta5 zTqx&8msH3+DLrVmQOTBOAj=uoxKYT3DS1^zBXM?1W+7gI!aQNPYfUl{3;PzS9*F7g zWJN8x?KjBDx^V&6iCY8o_gslO16=kh(|Gp)kz8qlQ`dzxQv;)V&t+B}wwdi~uBs4? zu~G|}y!`3;8#vIMUdyC7YEx6bb^1o}G!Jky4cN?BV9ejBfN<&!4M)L&lRKiuMS#3} z_B}Nkv+zzxhy{dYCW$oGC&J(Ty&7%=5B$sD0bkuPmj7g>|962`(Q{ZZMDv%YMuT^KweiRDvYTEop3IgFv#)(w>1 zSzH>J`q!LK)c(AK>&Ib)A{g`Fdykxqd`Yq@yB}E{gnQV$K!}RsgMGWqC3DKE(=!{}ekB3+(1?g}xF>^icEJbc z5bdxAPkW90atZT+&*7qoLqL#p=>t-(-lsnl2XMpZcYeW|o|a322&)yO_8p(&Sw{|b zn(tY$xn5yS$DD)UYS%sP?c|z>1dp!QUD)l;aW#`%qMtQJjE!s2z`+bTSZmLK7SvCR z=@I4|U^sCwZLQSfd*ACw9B@`1c1|&i^W_OD(570SDLK`MD0wTiR8|$7+%{cF&){$G zU~|$^Ed?TIxyw{1$e|D$050n8AjJvvOWhLtLHbSB|HIfjMp+gu>DraHZJRrdO53(= z+o-f{+qNog+qSLB%KY;5>Av6X(>-qYk3IIEwZ5~6a+P9lMpC^ z8CJ0q>rEpjlsxCvJm=kms@tlN4+sv}He`xkr`S}bGih4t`+#VEIt{1veE z{ZLtb_pSbcfcYPf4=T1+|BtR!x5|X#x2TZEEkUB6kslKAE;x)*0x~ES0kl4Dex4e- zT2P~|lT^vUnMp{7e4OExfxak0EE$Hcw;D$ehTV4a6hqxru0$|Mo``>*a5=1Ym0u>BDJKO|=TEWJ5jZu!W}t$Kv{1!q`4Sn7 zrxRQOt>^6}Iz@%gA3&=5r;Lp=N@WKW;>O!eGIj#J;&>+3va^~GXRHCY2}*g#9ULab zitCJt-OV0*D_Q3Q`p1_+GbPxRtV_T`jyATjax<;zZ?;S+VD}a(aN7j?4<~>BkHK7bO8_Vqfdq1#W&p~2H z&w-gJB4?;Q&pG9%8P(oOGZ#`!m>qAeE)SeL*t8KL|1oe;#+uOK6w&PqSDhw^9-&Fa zuEzbi!!7|YhlWhqmiUm!muO(F8-F7|r#5lU8d0+=;<`{$mS=AnAo4Zb^{%p}*gZL! zeE!#-zg0FWsSnablw!9$<&K(#z!XOW z;*BVx2_+H#`1b@>RtY@=KqD)63brP+`Cm$L1@ArAddNS1oP8UE$p05R=bvZoYz+^6 z<)!v7pRvi!u_-V?!d}XWQR1~0q(H3{d^4JGa=W#^Z<@TvI6J*lk!A zZ*UIKj*hyO#5akL*Bx6iPKvR3_2-^2mw|Rh-3O_SGN3V9GRo52Q;JnW{iTGqb9W99 z7_+F(Op6>~3P-?Q8LTZ-lwB}xh*@J2Ni5HhUI3`ct|*W#pqb>8i*TXOLn~GlYECIj zhLaa_rBH|1jgi(S%~31Xm{NB!30*mcsF_wgOY2N0XjG_`kFB+uQuJbBm3bIM$qhUyE&$_u$gb zpK_r{99svp3N3p4yHHS=#csK@j9ql*>j0X=+cD2dj<^Wiu@i>c_v zK|ovi7}@4sVB#bzq$n3`EgI?~xDmkCW=2&^tD5RuaSNHf@Y!5C(Is$hd6cuyoK|;d zO}w2AqJPS`Zq+(mc*^%6qe>1d&(n&~()6-ZATASNPsJ|XnxelLkz8r1x@c2XS)R*H(_B=IN>JeQUR;T=i3<^~;$<+8W*eRKWGt7c#>N`@;#!`kZ!P!&{9J1>_g8Zj zXEXxmA=^{8A|3=Au+LfxIWra)4p<}1LYd_$1KI0r3o~s1N(x#QYgvL4#2{z8`=mXy zQD#iJ0itk1d@Iy*DtXw)Wz!H@G2St?QZFz zVPkM%H8Cd2EZS?teQN*Ecnu|PrC!a7F_XX}AzfZl3fXfhBtc2-)zaC2eKx*{XdM~QUo4IwcGgVdW69 z1UrSAqqMALf^2|(I}hgo38l|Ur=-SC*^Bo5ej`hb;C$@3%NFxx5{cxXUMnTyaX{>~ zjL~xm;*`d08bG_K3-E+TI>#oqIN2=An(C6aJ*MrKlxj?-;G zICL$hi>`F%{xd%V{$NhisHSL~R>f!F7AWR&7b~TgLu6!3s#~8|VKIX)KtqTH5aZ8j zY?wY)XH~1_a3&>#j7N}0az+HZ;is;Zw(Am{MX}YhDTe(t{ZZ;TG}2qWYO+hdX}vp9 z@uIRR8g#y~-^E`Qyem(31{H0&V?GLdq9LEOb2(ea#e-$_`5Q{T%E?W(6 z(XbX*Ck%TQM;9V2LL}*Tf`yzai{0@pYMwBu%(I@wTY!;kMrzcfq0w?X`+y@0ah510 zQX5SU(I!*Fag4U6a7Lw%LL;L*PQ}2v2WwYF(lHx_Uz2ceI$mnZ7*eZ?RFO8UvKI0H z9Pq-mB`mEqn6n_W9(s~Jt_D~j!Ln9HA)P;owD-l~9FYszs)oEKShF9Zzcmnb8kZ7% zQ`>}ki1kwUO3j~ zEmh140sOkA9v>j@#56ymn_RnSF`p@9cO1XkQy6_Kog?0ivZDb`QWOX@tjMd@^Qr(p z!sFN=A)QZm!sTh(#q%O{Ovl{IxkF!&+A)w2@50=?a-+VuZt6On1;d4YtUDW{YNDN_ zG@_jZi1IlW8cck{uHg^g=H58lPQ^HwnybWy@@8iw%G! zwB9qVGt_?~M*nFAKd|{cGg+8`+w{j_^;nD>IrPf-S%YjBslSEDxgKH{5p)3LNr!lD z4ii)^%d&cCXIU7UK?^ZQwmD(RCd=?OxmY(Ko#+#CsTLT;p#A%{;t5YpHFWgl+@)N1 zZ5VDyB;+TN+g@u~{UrWrv)&#u~k$S&GeW)G{M#&Di)LdYk?{($Cq zZGMKeYW)aMtjmKgvF0Tg>Mmkf9IB#2tYmH-s%D_9y3{tfFmX1BSMtbe<(yqAyWX60 zzkgSgKb3c{QPG2MalYp`7mIrYg|Y<4Jk?XvJK)?|Ecr+)oNf}XLPuTZK%W>;<|r+% zTNViRI|{sf1v7CsWHvFrkQ$F7+FbqPQ#Bj7XX=#M(a~9^80}~l-DueX#;b}Ajn3VE z{BWI}$q{XcQ3g{(p>IOzFcAMDG0xL)H%wA)<(gl3I-oVhK~u_m=hAr&oeo|4lZbf} z+pe)c34Am<=z@5!2;_lwya;l?xV5&kWe}*5uBvckm(d|7R>&(iJNa6Y05SvlZcWBlE{{%2- z`86)Y5?H!**?{QbzGG~|k2O%eA8q=gxx-3}&Csf6<9BsiXC)T;x4YmbBIkNf;0Nd5 z%whM^!K+9zH>on_<&>Ws?^v-EyNE)}4g$Fk?Z#748e+GFp)QrQQETx@u6(1fk2!(W zWiCF~MomG*y4@Zk;h#2H8S@&@xwBIs|82R*^K(i*0MTE%Rz4rgO&$R zo9Neb;}_ulaCcdn3i17MO3NxzyJ=l;LU*N9ztBJ30j=+?6>N4{9YXg$m=^9@Cl9VY zbo^{yS@gU=)EpQ#;UIQBpf&zfCA;00H-ee=1+TRw@(h%W=)7WYSb5a%$UqNS@oI@= zDrq|+Y9e&SmZrH^iA>Of8(9~Cf-G(P^5Xb%dDgMMIl8gk6zdyh`D3OGNVV4P9X|EvIhplXDld8d z^YWtYUz@tpg*38Xys2?zj$F8%ivA47cGSl;hjD23#*62w3+fwxNE7M7zVK?x_`dBSgPK zWY_~wF~OEZi9|~CSH8}Xi>#8G73!QLCAh58W+KMJJC81{60?&~BM_0t-u|VsPBxn* zW7viEKwBBTsn_A{g@1!wnJ8@&h&d>!qAe+j_$$Vk;OJq`hrjzEE8Wjtm)Z>h=*M25 zOgETOM9-8xuuZ&^@rLObtcz>%iWe%!uGV09nUZ*nxJAY%&KAYGY}U1WChFik7HIw% zZP$3Bx|TG_`~19XV7kfi2GaBEhKap&)Q<9`aPs#^!kMjtPb|+-fX66z3^E)iwyXK7 z8)_p<)O{|i&!qxtgBvWXx8*69WO$5zACl++1qa;)0zlXf`eKWl!0zV&I`8?sG)OD2Vy?reNN<{eK+_ za4M;Hh%&IszR%)&gpgRCP}yheQ+l#AS-GnY81M!kzhWxIR?PW`G3G?} z$d%J28uQIuK@QxzGMKU_;r8P0+oIjM+k)&lZ39i#(ntY)*B$fdJnQ3Hw3Lsi8z&V+ zZly2}(Uzpt2aOubRjttzqrvinBFH4jrN)f0hy)tj4__UTwN)#1fj3-&dC_Vh7}ri* zfJ=oqLMJ-_<#rwVyN}_a-rFBe2>U;;1(7UKH!$L??zTbbzP#bvyg7OQBGQklJ~DgP zd<1?RJ<}8lWwSL)`jM53iG+}y2`_yUvC!JkMpbZyb&50V3sR~u+lok zT0uFRS-yx@8q4fPRZ%KIpLp8R#;2%c&Ra4p(GWRT4)qLaPNxa&?8!LRVdOUZ)2vrh zBSx&kB%#Y4!+>~)<&c>D$O}!$o{<1AB$M7-^`h!eW;c(3J~ztoOgy6Ek8Pwu5Y`Xion zFl9fb!k2`3uHPAbd(D^IZmwR5d8D$495nN2`Ue&`W;M-nlb8T-OVKt|fHk zBpjX$a(IR6*-swdNk@#}G?k6F-~c{AE0EWoZ?H|ZpkBxqU<0NUtvubJtwJ1mHV%9v?GdDw; zAyXZiD}f0Zdt-cl9(P1la+vQ$Er0~v}gYJVwQazv zH#+Z%2CIfOf90fNMGos|{zf&N`c0@x0N`tkFv|_9af3~<0z@mnf*e;%r*Fbuwl-IW z{}B3=(mJ#iwLIPiUP`J3SoP~#)6v;aRXJ)A-pD2?_2_CZ#}SAZ<#v7&Vk6{*i(~|5 z9v^nC`T6o`CN*n%&9+bopj^r|E(|pul;|q6m7Tx+U|UMjWK8o-lBSgc3ZF=rP{|l9 zc&R$4+-UG6i}c==!;I#8aDIbAvgLuB66CQLRoTMu~jdw`fPlKy@AKYWS-xyZzPg&JRAa@m-H43*+ne!8B7)HkQY4 zIh}NL4Q79a-`x;I_^>s$Z4J4-Ngq=XNWQ>yAUCoe&SMAYowP>r_O}S=V+3=3&(O=h zNJDYNs*R3Y{WLmBHc?mFEeA4`0Y`_CN%?8qbDvG2m}kMAiqCv`_BK z_6a@n`$#w6Csr@e2YsMx8udNWtNt=kcqDZdWZ-lGA$?1PA*f4?X*)hjn{sSo8!bHz zb&lGdAgBx@iTNPK#T_wy`KvOIZvTWqSHb=gWUCKXAiB5ckQI`1KkPx{{%1R*F2)Oc z(9p@yG{fRSWE*M9cdbrO^)8vQ2U`H6M>V$gK*rz!&f%@3t*d-r3mSW>D;wYxOhUul zk~~&ip5B$mZ~-F1orsq<|1bc3Zpw6)Ws5;4)HilsN;1tx;N6)tuePw& z==OlmaN*ybM&-V`yt|;vDz(_+UZ0m&&9#{9O|?0I|4j1YCMW;fXm}YT$0%EZ5^YEI z4i9WV*JBmEU{qz5O{#bs`R1wU%W$qKx?bC|e-iS&d*Qm7S=l~bMT{~m3iZl+PIXq{ zn-c~|l)*|NWLM%ysfTV-oR0AJ3O>=uB-vpld{V|cWFhI~sx>ciV9sPkC*3i0Gg_9G!=4ar*-W?D9)?EFL1=;O+W8}WGdp8TT!Fgv z{HKD`W>t(`Cds_qliEzuE!r{ihwEv1l5o~iqlgjAyGBi)$%zNvl~fSlg@M=C{TE;V zQkH`zS8b&!ut(m)%4n2E6MB>p*4(oV>+PT51#I{OXs9j1vo>9I<4CL1kv1aurV*AFZ^w_qfVL*G2rG@D2 zrs87oV3#mf8^E5hd_b$IXfH6vHe&lm@7On~Nkcq~YtE!}ad~?5*?X*>y`o;6Q9lkk zmf%TYonZM`{vJg$`lt@MXsg%*&zZZ0uUSse8o=!=bfr&DV)9Y6$c!2$NHyYAQf*Rs zk{^?gl9E z5Im8wlAsvQ6C2?DyG@95gUXZ3?pPijug25g;#(esF_~3uCj3~94}b*L>N2GSk%Qst z=w|Z>UX$m!ZOd(xV*2xvWjN&c5BVEdVZ0wvmk)I+YxnyK%l~caR=7uNQ=+cnNTLZ@&M!I$Mj-r{!P=; z`C2)D=VmvK8@T5S9JZoRtN!S*D_oqOxyy!q6Zk|~4aT|*iRN)fL)c>-yycR>-is0X zKrko-iZw(f(!}dEa?hef5yl%p0-v-8#8CX8!W#n2KNyT--^3hq6r&`)5Y@>}e^4h- zlPiDT^zt}Ynk&x@F8R&=)k8j$=N{w9qUcIc&)Qo9u4Y(Ae@9tA`3oglxjj6c{^pN( zQH+Uds2=9WKjH#KBIwrQI%bbs`mP=7V>rs$KG4|}>dxl_k!}3ZSKeEen4Iswt96GGw`E6^5Ov)VyyY}@itlj&sao|>Sb5 zeY+#1EK(}iaYI~EaHQkh7Uh>DnzcfIKv8ygx1Dv`8N8a6m+AcTa-f;17RiEed>?RT zk=dAksmFYPMV1vIS(Qc6tUO+`1jRZ}tcDP? zt)=7B?yK2RcAd1+Y!$K5*ds=SD;EEqCMG6+OqPoj{&8Y5IqP(&@zq@=A7+X|JBRi4 zMv!czlMPz)gt-St2VZwDD=w_S>gRpc-g zUd*J3>bXeZ?Psjohe;z7k|d<*T21PA1i)AOi8iMRwTBSCd0ses{)Q`9o&p9rsKeLaiY zluBw{1r_IFKR76YCAfl&_S1*(yFW8HM^T()&p#6y%{(j7Qu56^ZJx1LnN`-RTwimdnuo*M8N1ISl+$C-%=HLG-s} zc99>IXRG#FEWqSV9@GFW$V8!{>=lSO%v@X*pz*7()xb>=yz{E$3VE;e)_Ok@A*~El zV$sYm=}uNlUxV~6e<6LtYli1!^X!Ii$L~j4e{sI$tq_A(OkGquC$+>Rw3NFObV2Z)3Rt~Jr{oYGnZaFZ^g5TDZlg;gaeIP} z!7;T{(9h7mv{s@piF{-35L=Ea%kOp;^j|b5ZC#xvD^^n#vPH=)lopYz1n?Kt;vZmJ z!FP>Gs7=W{sva+aO9S}jh0vBs+|(B6Jf7t4F^jO3su;M13I{2rd8PJjQe1JyBUJ5v zcT%>D?8^Kp-70bP8*rulxlm)SySQhG$Pz*bo@mb5bvpLAEp${?r^2!Wl*6d7+0Hs_ zGPaC~w0E!bf1qFLDM@}zso7i~(``)H)zRgcExT_2#!YOPtBVN5Hf5~Ll3f~rWZ(UsJtM?O*cA1_W0)&qz%{bDoA}{$S&-r;0iIkIjbY~ zaAqH45I&ALpP=9Vof4OapFB`+_PLDd-0hMqCQq08>6G+C;9R~}Ug_nm?hhdkK$xpI zgXl24{4jq(!gPr2bGtq+hyd3%Fg%nofK`psHMs}EFh@}sdWCd!5NMs)eZg`ZlS#O0 zru6b8#NClS(25tXqnl{|Ax@RvzEG!+esNW-VRxba(f`}hGoqci$U(g30i}2w9`&z= zb8XjQLGN!REzGx)mg~RSBaU{KCPvQx8)|TNf|Oi8KWgv{7^tu}pZq|BS&S<53fC2K4Fw6>M^s$R$}LD*sUxdy6Pf5YKDbVet;P!bw5Al-8I1Nr(`SAubX5^D9hk6$agWpF}T#Bdf{b9-F#2WVO*5N zp+5uGgADy7m!hAcFz{-sS0kM7O)qq*rC!>W@St~^OW@R1wr{ajyYZq5H!T?P0e+)a zaQ%IL@X_`hzp~vRH0yUblo`#g`LMC%9}P;TGt+I7qNcBSe&tLGL4zqZqB!Bfl%SUa z6-J_XLrnm*WA`34&mF+&e1sPCP9=deazrM=Pc4Bn(nV;X%HG^4%Afv4CI~&l!Sjzb z{rHZ3od0!Al{}oBO>F*mOFAJrz>gX-vs!7>+_G%BB(ljWh$252j1h;9p~xVA=9_`P z5KoFiz96_QsTK%B&>MSXEYh`|U5PjX1(+4b#1PufXRJ*uZ*KWdth1<0 zsAmgjT%bowLyNDv7bTUGy|g~N34I-?lqxOUtFpTLSV6?o?<7-UFy*`-BEUsrdANh} zBWkDt2SAcGHRiqz)x!iVoB~&t?$yn6b#T=SP6Ou8lW=B>=>@ik93LaBL56ub`>Uo!>0@O8?e)$t(sgy$I z6tk3nS@yFFBC#aFf?!d_3;%>wHR;A3f2SP?Na8~$r5C1N(>-ME@HOpv4B|Ty7%jAv zR}GJwsiJZ5@H+D$^Cwj#0XA_(m^COZl8y7Vv(k=iav1=%QgBOVzeAiw zaDzzdrxzj%sE^c9_uM5D;$A_7)Ln}BvBx^=)fO+${ou%B*u$(IzVr-gH3=zL6La;G zu0Kzy5CLyNGoKRtK=G0-w|tnwI)puPDOakRzG(}R9fl7#<|oQEX;E#yCWVg95 z;NzWbyF&wGg_k+_4x4=z1GUcn6JrdX4nOVGaAQ8#^Ga>aFvajQN{!+9rgO-dHP zIp@%&ebVg}IqnRWwZRTNxLds+gz2@~VU(HI=?Epw>?yiEdZ>MjajqlO>2KDxA>)cj z2|k%dhh%d8SijIo1~20*5YT1eZTDkN2rc^zWr!2`5}f<2f%M_$to*3?Ok>e9$X>AV z2jYmfAd)s|(h?|B(XYrIfl=Wa_lBvk9R1KaP{90-z{xKi+&8=dI$W0+qzX|ZovWGOotP+vvYR(o=jo?k1=oG?%;pSqxcU* zWVGVMw?z__XQ9mnP!hziHC`ChGD{k#SqEn*ph6l46PZVkm>JF^Q{p&0=MKy_6apts z`}%_y+Tl_dSP(;Ja&sih$>qBH;bG;4;75)jUoVqw^}ee=ciV;0#t09AOhB^Py7`NC z-m+ybq1>_OO+V*Z>dhk}QFKA8V?9Mc4WSpzj{6IWfFpF7l^au#r7&^BK2Ac7vCkCn{m0uuN93Ee&rXfl1NBY4NnO9lFUp zY++C1I;_{#OH#TeP2Dp?l4KOF8ub?m6zE@XOB5Aiu$E~QNBM@;r+A5mF2W1-c7>ex zHiB=WJ&|`6wDq*+xv8UNLVUy4uW1OT>ey~Xgj@MMpS@wQbHAh>ysYvdl-1YH@&+Q! z075(Qd4C!V`9Q9jI4 zSt{HJRvZec>vaL_brKhQQwbpQd4_Lmmr0@1GdUeU-QcC{{8o=@nwwf>+dIKFVzPriGNX4VjHCa zTbL9w{Y2V87c2ofX%`(48A+4~mYTiFFl!e{3K^C_k%{&QTsgOd0*95KmWN)P}m zTRr{`f7@=v#+z_&fKYkQT!mJn{*crj%ZJz#(+c?>cD&2Lo~FFAWy&UG*Op^pV`BR^I|g?T>4l5;b|5OQ@t*?_Slp`*~Y3`&RfKD^1uLezIW(cE-Dq2z%I zBi8bWsz0857`6e!ahet}1>`9cYyIa{pe53Kl?8|Qg2RGrx@AlvG3HAL-^9c^1GW;)vQt8IK+ zM>!IW*~682A~MDlyCukldMd;8P|JCZ&oNL(;HZgJ>ie1PlaInK7C@Jg{3kMKYui?e!b`(&?t6PTb5UPrW-6DVU%^@^E`*y-Fd(p|`+JH&MzfEq;kikdse ziFOiDWH(D< zyV7Rxt^D0_N{v?O53N$a2gu%1pxbeK;&ua`ZkgSic~$+zvt~|1Yb=UfKJW2F7wC^evlPf(*El+#}ZBy0d4kbVJsK- z05>;>?HZO(YBF&v5tNv_WcI@O@LKFl*VO?L(!BAd!KbkVzo;v@~3v`-816GG?P zY+H3ujC>5=Am3RIZDdT#0G5A6xe`vGCNq88ZC1aVXafJkUlcYmHE^+Z{*S->ol%-O znm9R0TYTr2w*N8Vs#s-5=^w*{Y}qp5GG)Yt1oLNsH7y~N@>Eghms|K*Sdt_u!&I}$ z+GSdFTpbz%KH+?B%Ncy;C`uW6oWI46(tk>r|5|-K6)?O0d_neghUUOa9BXHP*>vi; z={&jIGMn-92HvInCMJcyXwHTJ42FZp&Wxu+9Rx;1x(EcIQwPUQ@YEQQ`bbMy4q3hP zNFoq~Qd0=|xS-R}k1Im3;8s{BnS!iaHIMLx)aITl)+)?Yt#fov|Eh>}dv@o6R{tG>uHsy&jGmWN5+*wAik|78(b?jtysPHC#e+Bzz~V zS3eEXv7!Qn4uWi!FS3B?afdD*{fr9>B~&tc671fi--V}~E4un;Q|PzZRwk-azprM$4AesvUb5`S`(5x#5VJ~4%ET6&%GR$}muHV-5lTsCi_R|6KM(g2PCD@|yOpKluT zakH!1V7nKN)?6JmC-zJoA#ciFux8!)ajiY%K#RtEg$gm1#oKUKX_Ms^%hvKWi|B=~ zLbl-L)-=`bfhl`>m!^sRR{}cP`Oim-{7}oz4p@>Y(FF5FUEOfMwO!ft6YytF`iZRq zfFr{!&0Efqa{1k|bZ4KLox;&V@ZW$997;+Ld8Yle91he{BfjRhjFTFv&^YuBr^&Pe zswA|Bn$vtifycN8Lxr`D7!Kygd7CuQyWqf}Q_PM}cX~S1$-6xUD%-jrSi24sBTFNz(Fy{QL2AmNbaVggWOhP;UY4D>S zqKr!UggZ9Pl9Nh_H;qI`-WoH{ceXj?m8y==MGY`AOJ7l0Uu z)>M%?dtaz2rjn1SW3k+p`1vs&lwb%msw8R!5nLS;upDSxViY98IIbxnh{}mRfEp=9 zbrPl>HEJeN7J=KnB6?dwEA6YMs~chHNG?pJsEj#&iUubdf3JJwu=C(t?JpE6xMyhA3e}SRhunDC zn-~83*9=mADUsk^sCc%&&G1q5T^HR9$P#2DejaG`Ui*z1hI#h7dwpIXg)C{8s< z%^#@uQRAg-$z&fmnYc$Duw63_Zopx|n{Bv*9Xau{a)2%?H<6D>kYY7_)e>OFT<6TT z0A}MQLgXbC2uf`;67`mhlcUhtXd)Kbc$PMm=|V}h;*_%vCw4L6r>3Vi)lE5`8hkSg zNGmW-BAOO)(W((6*e_tW&I>Nt9B$xynx|sj^ux~?q?J@F$L4;rnm_xy8E*JYwO-02u9_@@W0_2@?B@1J{y~Q39N3NX^t7#`=34Wh)X~sU&uZWgS1Z09%_k|EjA4w_QqPdY`oIdv$dJZ;(!k)#U8L+|y~gCzn+6WmFt#d{OUuKHqh1-uX_p*Af8pFYkYvKPKBxyid4KHc}H` z*KcyY;=@wzXYR{`d{6RYPhapShXIV?0cg_?ahZ7do)Ot#mxgXYJYx}<%E1pX;zqHd zf!c(onm{~#!O$2`VIXezECAHVd|`vyP)Uyt^-075X@NZDBaQt<>trA3nY-Dayki4S zZ^j6CCmx1r46`4G9794j-WC0&R9(G7kskS>=y${j-2;(BuIZTLDmAyWTG~`0)Bxqk zd{NkDe9ug|ms@0A>JVmB-IDuse9h?z9nw!U6tr7t-Lri5H`?TjpV~8(gZWFq4Vru4 z!86bDB;3lpV%{rZ`3gtmcRH1hjj!loI9jN>6stN6A*ujt!~s!2Q+U1(EFQEQb(h4E z6VKuRouEH`G6+8Qv2C)K@^;ldIuMVXdDDu}-!7FS8~k^&+}e9EXgx~)4V4~o6P^52 z)a|`J-fOirL^oK}tqD@pqBZi_;7N43%{IQ{v&G9^Y^1?SesL`;Z(dt!nn9Oj5Odde%opv&t zxJ><~b#m+^KV&b?R#)fRi;eyqAJ_0(nL*61yPkJGt;gZxSHY#t>ATnEl-E%q$E16% zZdQfvhm5B((y4E3Hk6cBdwGdDy?i5CqBlCVHZr-rI$B#>Tbi4}Gcvyg_~2=6O9D-8 zY2|tKrNzbVR$h57R?Pe+gUU_il}ZaWu|Az#QO@};=|(L-RVf0AIW zq#pO+RfM7tdV`9lI6g;{qABNId`fG%U9Va^ravVT^)CklDcx)YJKeJdGpM{W1v8jg z@&N+mR?BPB=K1}kNwXk_pj44sd>&^;d!Z~P>O78emE@Qp@&8PyB^^4^2f7e)gekMv z2aZNvP@;%i{+_~>jK7*2wQc6nseT^n6St9KG#1~Y@$~zR_=AcO2hF5lCoH|M&c{vR zSp(GRVVl=T*m~dIA;HvYm8HOdCkW&&4M~UDd^H)`p__!4k+6b)yG0Zcek8OLw$C^K z3-BbLiG_%qX|ZYpXJ$(c@aa7b4-*IQkDF}=gZSV`*ljP|5mWuHSCcf$5qqhZTv&P?I$z^>}qP(q!Aku2yA5vu38d8x*q{6-1`%PrE_r0-9Qo?a#7Zbz#iGI7K<(@k^|i4QJ1H z4jx?{rZbgV!me2VT72@nBjucoT zUM9;Y%TCoDop?Q5fEQ35bCYk7!;gH*;t9t-QHLXGmUF;|vm365#X)6b2Njsyf1h9JW#x$;@x5Nx2$K$Z-O3txa%;OEbOn6xBzd4n4v)Va=sj5 z%rb#j7{_??Tjb8(Hac<^&s^V{yO-BL*uSUk2;X4xt%NC8SjO-3?;Lzld{gM5A=9AV z)DBu-Z8rRvXXwSVDH|dL-3FODWhfe1C_iF``F05e{dl(MmS|W%k-j)!7(ARkV?6r~ zF=o42y+VapxdZn;GnzZfGu<6oG-gQ7j7Zvgo7Am@jYxC2FpS@I;Jb%EyaJDBQC(q% zKlZ}TVu!>;i3t~OAgl@QYy1X|T~D{HOyaS*Bh}A}S#a9MYS{XV{R-|niEB*W%GPW! zP^NU(L<}>Uab<;)#H)rYbnqt|dOK(-DCnY==%d~y(1*{D{Eo1cqIV8*iMfx&J*%yh zx=+WHjt0q2m*pLx8=--UqfM6ZWjkev>W-*}_*$Y(bikH`#-Gn#!6_ zIA&kxn;XYI;eN9yvqztK-a113A%97in5CL5Z&#VsQ4=fyf&3MeKu70)(x^z_uw*RG zo2Pv&+81u*DjMO6>Mrr7vKE2CONqR6C0(*;@4FBM;jPIiuTuhQ-0&C)JIzo_k>TaS zN_hB;_G=JJJvGGpB?uGgSeKaix~AkNtYky4P7GDTW6{rW{}V9K)Cn^vBYKe*OmP!; zohJs=l-0sv5&pL6-bowk~(swtdRBZQHh8)m^r2+qTtZ zt4m$B?OQYNyfBA0E)g28a*{)a=%%f-?{F;++-Xs#5|7kSHTD*E9@$V ztE%7zX4A(L`n)FY8Y4pOnKC|Pf)j$iR#yP;V0+|Hki+D;t4I4BjkfdYliK9Gf6RYw z;3px$Ud5aTd`yq$N7*WOs!{X91hZZ;AJ9iQOH%p;v$R%OQum_h#rq9*{ve(++|24z zh2P;{-Z?u#rOqd0)D^_Ponv(Y9KMB9#?}nJdUX&r_rxF0%3__#8~ZwsyrSPmtWY27 z-54ZquV2t_W!*+%uwC=h-&_q~&nQer0(FL74to%&t^byl^C?wTaZ-IS9OssaQFP)1 zAov0o{?IRAcCf+PjMWSdmP42gysh|c9Ma&Q^?_+>>+-yrC8WR;*XmJ;>r9v*>=W}tgWG;WIt{~L8`gk8DP{dSdG z4SDM7g5ahMHYHHk*|mh9{AKh-qW7X+GEQybJt9A@RV{gaHUAva+=lSroK^NUJYEiL z?X6l9ABpd)9zzA^;FdZ$QQs#uD@hdcaN^;Q=AXlbHv511Meye`p>P4Y2nblEDEeZo}-$@g&L98Aih6tgLz--${eKTxymIipy0xSYgZZ zq^yyS4yNPTtPj-sM?R8@9Q1gtXPqv{$lb5i|C1yymwnGdfYV3nA-;5!Wl zD0fayn!B^grdE?q^}ba{-LIv*Z}+hZm_F9c$$cW!bx2DgJD&6|bBIcL@=}kQA1^Eh zXTEznqk)!!IcTl>ey?V;X8k<+C^DRA{F?T*j0wV`fflrLBQq!l7cbkAUE*6}WabyF zgpb+|tv=aWg0i}9kBL8ZCObYqHEycr5tpc-$|vdvaBsu#lXD@u_e1iL z{h>xMRS0a7KvW?VttrJFpX^5DC4Bv4cp6gNG6#8)7r7IxXfSNSp6)_6tZ4l>(D+0I zPhU)N!sKywaBusHdVE!yo5$20JAU8V_XcW{QmO!p*~ns8{2~bhjydnmA&=r zX9NSM9QYogYMDZ~kS#Qx`mt>AmeR3p@K$`fbJ%LQ1c5lEOz<%BS<}2DL+$>MFcE%e zlxC)heZ7#i80u?32eOJI9oQRz0z;JW@7Th4q}YmQ-`Z?@y3ia^_)7f37QMwDw~<-@ zT)B6fftmK_6YS!?{uaj5lLxyR++u*ZY2Mphm5cd7PA5=%rd)95hJ9+aGSNfjy>Ylc zoI0nGIT3sKmwX8h=6CbvhVO+ehFIR155h8iRuXZx^cW>rq5K4z_dvM#hRER=WR@THs%WELI9uYK9HN44Em2$#@k)hD zicqRPKV#yB;UlcsTL_}zCMK0T;eXHfu`y2(dfwm(v)IBbh|#R>`2cot{m7}8_X&oD zr@94PkMCl%d3FsC4pil=#{3uv^+)pvxfwmPUr)T)T|GcZVD$wVj$mjkjDs`5cm8N! zXVq2CvL;gWGpPI4;9j;2&hS*o+LNp&C5Ac=OXx*W5y6Z^az)^?G0)!_iAfjH5wiSE zD(F}hQZB#tF5iEx@0sS+dP70DbZ*<=5X^)Pxo^8aKzOzuyc2rq=<0-k;Y_ID1>9^v z+)nc36}?>jen*1%OX3R*KRASj${u$gZ$27Hpcj=95kK^aLzxhW6jj_$w6}%#1*$5D zG1H_vYFrCSwrRqYw*9<}OYAOQT)u%9lC`$IjZV<4`9Sc;j{Qv_6+uHrYifK&On4V_7yMil!0Yv55z@dFyD{U@Sy>|vTX=P_( zRm<2xj*Z}B30VAu@0e+}at*y?wXTz|rPalwo?4ZZc>hS0Ky6~mi@kv#?xP2a;yt?5=(-CqvP_3&$KdjB7Ku;# z`GLE*jW1QJB5d&E?IJO?1+!Q8HQMGvv^RuFoi=mM4+^tOqvX%X&viB%Ko2o-v4~~J z267ui;gsW?J=qS=D*@*xJvAy3IOop5bEvfR4MZC>9Y4Z$rGI|EHNNZ7KX;Ix{xSvm z-)Cau-xuTm|7`4kUdXvd_d^E=po(76ELfq5OgxIt3aqDy#zBfIy-5<3gpn{Ce`-ha z<;6y@{Bgqw?c~h*&j{FozQCh=`Lv-5Iw!KdSt;%GDOq%=(V!dJ-}|}|0o5G2kJj6{ z`jCSPs$9Fe8O(+qALZiJ$WtR=<@GvsdM)IJ`7XrBfW0iyYE#Vy^e@zbysg*B5Z_kSL6<)vqoaH zQ{!9!*{e9UZo^h+qZ`T@LfVwAEwc&+9{C8c%oj41q#hyn<&zA9IIur~V|{mmu`n5W z8)-Ou$YgjQ*PMIqHhZ_9E?(uoK0XM5aQkarcp}WT^7b^FC#^i>#8LGZ9puDuXUYas z7caX)V5U6uY-L5Wl%)j$qRkR;7@3T*N64YK_!`Fw=>CAwe~2loI1<>DZW&sb7Q)X;6E08&$h! z2=c1i4UOO{R4TmkTz+o9n`}+%d%blR6P;5{`qjtxlN$~I%tMMDCY`~e{+mRF!rj5( z3ywv)P_PUUqREu)TioPkg&5RKjY6z%pRxQPQ{#GNMTPag^S8(8l{!{WGNs2U1JA-O zq02VeYcArhTAS;v3);k(&6ayCH8SXN@r;1NQeJ*y^NHM+zOd;?t&c!Hq^SR_w6twGV8dl>j zjS+Zc&Yp7cYj&c1y3IxQ%*kWiYypvoh(k8g`HrY<_Bi-r%m-@SLfy-6mobxkWHxyS z>TtM2M4;Uqqy|+8Q++VcEq$PwomV1D4UzNA*Tgkg9#Gpz#~&iPf|Czx!J?qss?e|3 z4gTua75-P{2X7w9eeK3~GE0ip-D;%%gTi)8bR~Ez@)$gpuS~jZs`CrO5SR-Xy7bkA z89fr~mY}u4A$|r1$fe-;T{yJh#9Ime1iRu8eo?uY9@yqAU3P!rx~SsP;LTBL zeoMK(!;(Zt8313 z3)V)q_%eflKW?BnMZa}6E0c7t!$-mC$qt44OME5F(6B$E8w*TUN-h}0dOiXI+TH zYFrr&k1(yO(|J0vP|{22@Z}bxm@7BkjO)f)&^fv|?_JX+s)1*|7X7HH(W?b3QZ3!V|~m?8}uJsF>NvE4@fik zjyyh+U*tt`g6v>k9ub88a;ySvS1QawGn7}aaR**$rJA=a#eUT~ngUbJ%V=qsFIekLbv!YkqjTG{_$F;$w19$(ivIs*1>?2ka%uMOx@B9`LD zhm~)z@u4x*zcM1WhiX)!U{qOjJHt1xs{G1S?rYe)L)ntUu^-(o_dfqZu)}W(X%Uu| zN*qI@&R2fB#Jh|Mi+eMrZDtbNvYD3|v0Kx>E#Ss;Be*T$@DC!2A|mb%d}TTN3J+c= zu@1gTOXFYy972S+=C;#~)Z{Swr0VI5&}WYzH22un_Yg5o%f9fvV(`6!{C<(ZigQ2`wso)cj z9O12k)15^Wuv#rHpe*k5#4vb%c znP+Gjr<-p%01d<+^yrSoG?}F=eI8X;?=Fo2a~HUiJ>L!oE#9tXRp!adg-b9D;(6$E zeW0tH$US04zTX$OxM&X+2ip>KdFM?iG_fgOD-qB|uFng8*#Z5jgqGY=zLU?4!OlO#~YBTB9b9#~H@nqQ#5 z6bV));d?IJTVBC+79>rGuy1JgxPLy$dA7;_^^L)02m}XLjFR*qH`eI~+eJo(7D`LH z(W%lGnGK+Vk_3kyF*zpgO=1MxMg?hxe3}}YI>dVs8l}5eWjYu4=w6MWK09+05 zGdpa#$awd>Q|@aZa*z{5F3xy3n@E4YT9%TmMo0jxW59p0bI?&S}M+ z&^NG%rf7h*m9~p#b19|`wO5OMY-=^XT+=yrfGNpl<&~~FGsx_`IaFn+sEgF$hgOa~oAVAiu^a$jHcqkE=dj`ze z=axsfrzzh6VGD0x#6Ff=t%+VTiq!n6^gv*uIUD<9fOhvR;al5kcY${uunn}-!74<7 zmP^3cl-kyN(QY!!Z-^PY-OUkh=3ZWk6>le$_Q&xk4cgH{?i)C%2RM@pX5Q{jdSlo! zVau5v44cQX5|zQlQDt;dCg)oM0B<=P1CR!W%!^m$!{pKx;bn9DePJjWBX)q!`$;0K zqJIIyD#aK;#-3&Nf=&IhtbV|?ZGYHSphp~6th`p2rkw&((%kBV7<{siEOU7AxJj+FuRdDu$ zcmTW8usU_u!r)#jg|J=Gt{##7;uf4A5cdt6Y02}f(d2)z~ z)CH~gVAOwBLk$ZiIOn}NzDjvfw(w$u|BdCBI#)3xB-Ot?nz?iR38ayCm48M=_#9r7 zw8%pwQ<9mbEs5~_>pN3~#+Er~Q86J+2TDXM6umCbukd-X6pRIr5tF?VauT8jW> zY^#)log>jtJs2s3xoiPB7~8#1ZMv>Zx0}H58k-@H2huNyw~wsl0B8j)H5)H9c7y&i zp8^0;rKbxC1eEZ-#Qxvz)Xv$((8lK9I>BspPajluysw^f#t9P;OUis43mmEzX+lk* zc4T-Ms9_687GR+~QS#0~vxK#DSGN=a-m(@eZTqw2<+lN9>R~gK2)3;sT4%nI%Y|0m zX9SPR!>?~s=j5H4WMqeTW8QaLZ=1bWS5I3xZ&$(ypc=tHrv+hX@s)VG(tc!yvLM7n zshN=C#v={X1r;)xn0Pow_1eMhkn!{;x$BJ#PIz)m585&%cmzk;btQzZAN_^zis;n? z?6I~bN?s;7vg_dtoTc4A5Ow*Rb}No#UYl)sN|RmoYo}k^cKLXd8F`44?RrokkPvN5 ztUrx;U~B;jbE_qGd3n0j2i}A{enJvJ?gSF~NQj~EP5vM-w4@;QQ5n(Npic}XNW6B0 zq9F4T%6kp7qGhd0vpQcz+nMk8GOAmbz8Bt4@GtewGr6_>Xj>ge)SyfY}nu>Y!a@HoIx(StD zx`!>RT&}tpBL%nOF%7XIFW?n1AP*xthCMzhrU6G!U6?m4!CPWTvn#Yaoi_95CT2!L z|B=5zeRW30&ANGN>J9#GtCm&3SF6n4TqDz<-{@ZXkrkRDCpV$DwCtI^e&3i1A{Ar&JZtS^c+lyPa6 z%JJr42S_;eFC#M~bdtQePhOU32WDiZ4@H&af)z#$Y|hnQNb)8(3?1Ad>5uaZ1z zU~!jt3XUI@gpWb8tWTyH7DGvKvzYfqNIy3P{9vpwz_C-QL&`+8Io$F5PS-@YQJoEO z17D9P(+sXajWSH_8&C?fn>rTLX+(?KiwX#JNV)xE0!Q@>Tid$V2#r4y6fkph?YZ>^ z(o^q(0*P->3?I0cELXJn(N|#qTm6 zAPIL~n)m!50;*?5=MOOc4Wk;w(0c$(!e?vpV23S|n|Y7?nyc8)fD8t-KI&nTklH&BzqQ}D(1gH3P+5zGUzIjT~x`;e8JH=86&5&l-DP% z)F+Et(h|GJ?rMy-Zrf>Rv@<3^OrCJ1xv_N*_@-K5=)-jP(}h1Rts44H&ou8!G_C1E zhTfUDASJ2vu!4@j58{NN;78i?6__xR75QEDC4JN{>RmgcNrn-EOpEOcyR<8FS@RB@ zH!R7J=`KK^u06eeI|X@}KvQmdKE3AmAy8 zM4IIvde#e4O(iwag`UL5yQo>6&7^=D4yE-Eo9$9R2hR} zn;Z9i-d=R-xZl4@?s%8|m1M`$J6lW1r0Y)+8q$}Vn4qyR1jqTjGH;@Z!2KiGun2~x zaiEfzVT<|_b6t}~XPeflAm8hvCHP3Bp*tl{^y_e{Jsn@w+KP{7}bH_s=1S2E1sj=18a39*Ag~lbkT^_OQuYQey=b zW^{0xlQ@O$^cSxUZ8l(Mspg8z0cL*?yH4;X2}TdN)uN31A%$3$a=4;{S@h#Y(~i%) zc=K7Ggl=&2hYVic*W65gpSPE70pU;FN@3k?BYdNDKv6wlsBAF^);qiqI zhklsX4TaWiC%VbnZ|yqL+Pcc;(#&E*{+Rx&<&R{uTYCn^OD|mAk4%Q7gbbgMnZwE{ zy7QMK%jIjU@ye?0; z;0--&xVeD}m_hq9A8a}c9WkI2YKj8t!Mkk!o%AQ?|CCBL9}n570}OmZ(w)YI6#QS&p<={tcek*D{CPR%eVA1WBGUXf z%gO2vL7iVDr1$!LAW)1@H>GoIl=&yyZ7=*9;wrOYQ}O}u>h}4FWL?N2ivURlUi11- zl{G0fo`9?$iAEN<4kxa#9e0SZPqa{pw?K=tdN5tRc7HDX-~Ta6_+#s9W&d`6PB7dF*G@|!Mc}i zc=9&T+edI(@la}QU2An#wlkJ&7RmTEMhyC_A8hWM54?s1WldCFuBmT5*I3K9=1aj= z6V@93P-lUou`xmB!ATp0(We$?)p*oQs;(Kku15~q9`-LSl{(Efm&@%(zj?aK2;5}P z{6<@-3^k^5FCDT@Z%XABEcuPoumYkiD&)-8z2Q}HO9OVEU3WM;V^$5r4q>h^m73XF z5!hZ7SCjfxDcXyj(({vg8FU(m2_}36L_yR>fnW)u=`1t@mPa76`2@%8v@2@$N@TE` z)kYhGY1jD;B9V=Dv1>BZhR9IJmB?X9Wj99f@MvJ2Fim*R`rsRilvz_3n!nPFLmj({EP!@CGkY5R*Y_dSO{qto~WerlG}DMw9k+n}pk z*nL~7R2gB{_9=zpqX|*vkU-dx)(j+83uvYGP?K{hr*j2pQsfXn<_As6z%-z+wFLqI zMhTkG>2M}#BLIOZ(ya1y8#W<+uUo@(43=^4@?CX{-hAuaJki(_A(uXD(>`lzuM~M;3XA48ZEN@HRV{1nvt?CV)t;|*dow0Ue2`B*iA&!rI`fZQ=b28= z_dxF}iUQ8}nq0SA4NK@^EQ%=)OY;3fC<$goJ&Kp|APQ@qVbS-MtJQBc)^aO8mYFsbhafeRKdHPW&s^&;%>v zlTz`YE}CuQ@_X&mqm{+{!h2r)fPGeM_Ge4RRYQkrma`&G<>RW<>S(?#LJ}O-t)d$< zf}b0svP^Zu@)MqwEV^Fb_j zPYYs~vmEC~cOIE6Nc^@b@nyL!w5o?nQ!$mGq(Pa|1-MD}K0si<&}eag=}WLSDO zE4+eA~!J(K}605x&4 zT72P7J^)Y)b(3g2MZ@1bv%o1ggwU4Yb!DhQ=uu-;vX+Ix8>#y6wgNKuobvrPNx?$3 zI{BbX<=Y-cBtvY&#MpGTgOLYU4W+csqWZx!=AVMb)Z;8%#1*x_(-)teF>45TCRwi1 z)Nn>hy3_lo44n-4A@=L2gI$yXCK0lPmMuldhLxR8aI;VrHIS{Dk}yp= zwjhB6v@0DN=Hnm~3t>`CtnPzvA*Kumfn5OLg&-m&fObRD};c}Hf?n&mS< z%$wztc%kjWjCf-?+q(bZh9k~(gs?i4`XVfqMXvPVkUWfm4+EBF(nOkg!}4u)6I)JT zU6IXqQk?p1a2(bz^S;6ZH3Wy9!JvbiSr7%c$#G1eK2^=~z1WX+VW)CPD#G~)13~pX zErO(>x$J_4qu-)lNlZkLj2}y$OiKn0ad5Imu5p-2dnt)(YI|b7rJ3TBUQ8FB8=&ym50*ibd2NAbj z;JA&hJ$AJlldM+tO;Yl3rBOFiP8fDdF?t(`gkRpmT9inR@uX{bThYNmxx-LN5K8h0 ztS%w*;V%b`%;-NARbNXn9he&AO4$rvmkB#;aaOx?Wk|yBCmN{oMTK&E)`s&APR<-5 z#;_e75z;LJ)gBG~h<^`SGmw<$Z3p`KG|I@7Pd)sTJnouZ1hRvm3}V+#lPGk4b&A#Y z4VSNi8(R1z7-t=L^%;*;iMTIAjrXl;h106hFrR{n9o8vlz?+*a1P{rEZ2ie{luQs} zr6t746>eoqiO5)^y;4H%2~&FT*Qc*9_oC2$+&syHWsA=rn3B~4#QEW zf4GT3i_@)f(Fj}gAZj`7205M8!B&HhmbgyZB& z+COyAVNxql#DwfP;H48Yc+Y~ChV6b9auLnfXXvpjr<~lQ@>VbCpQvWz=lyVf1??_c zAo3C^otZD@(v?X)UX*@w?TF|F8KF>l7%!Dzu+hksSA^akEkx8QD(V(lK+HBCw6C}2onVExW)f$ zncm*HI(_H;jF@)6eu}Tln!t?ynRkcqBA5MitIM@L^(4_Ke}vy7c%$w{(`&7Rn=u>oDM+Z^RUYcbSOPwT(ONyq76R>$V6_M_UP4vs=__I#io{{((| zy5=k=oVr-Qt$FImP~+&sN8rf2UH*vRMpwohPc@9?id17La4weIfBNa>1Djy+1=ugn z@}Zs;eFY1OC}WBDxDF=i=On_33(jWE-QYV)HbQ^VM!n>Ci9_W0Zofz7!m>do@KH;S z4k}FqEAU2)b%B_B-QcPnM5Zh=dQ+4|DJoJwo?)f2nWBuZE@^>a(gP~ObzMuyNJTgJFUPcH`%9UFA(P23iaKgo0)CI!SZ>35LpFaD7 z)C2sW$ltSEYNW%%j8F;yK{iHI2Q^}coF@LX`=EvxZb*_O;2Z0Z5 z7 zlccxmCfCI;_^awp|G748%Wx%?t9Sh8!V9Y(9$B?9R`G)Nd&snX1j+VpuQ@GGk=y(W zK|<$O`Cad`Y4#W3GKXgs%lZduAd1t1<7LwG4*zaStE*S)XXPFDyKdgiaVXG2)LvDn zf}eQ_S(&2!H0Mq1Yt&WpM1!7b#yt_ie7naOfX129_E=)beKj|p1VW9q>>+e$3@G$K zrB%i_TT1DHjOf7IQ8)Wu4#K%ZSCDGMP7Ab|Kvjq7*~@ewPm~h_-8d4jmNH<&mNZC@CI zKxG5O08|@<4(6IEC@L-lcrrvix&_Dj4tBvl=8A}2UX|)~v#V$L22U}UHk`B-1MF(t zU6aVJWR!>Y0@4m0UA%Sq9B5;4hZvsOu=>L`IU4#3r_t}os|vSDVMA??h>QJ1FD1vR z*@rclvfD!Iqoxh>VP+?b9TVH8g@KjYR@rRWQy44A`f6doIi+8VTP~pa%`(Oa@5?=h z8>YxNvA##a3D0)^P|2|+0~f|UsAJV=q(S>eq-dehQ+T>*Q@qN zU8@kdpU5gGk%ozt?%c8oM6neA?GuSsOfU_b1U)uiEP8eRn~>M$p*R z43nSZs@^ahO78s zulbK@@{3=2=@^yZ)DuIC$ki;`2WNbD_#`LOHN9iMsrgzt-T<8aeh z(oXrqI$Kgt6)Icu=?11NWs>{)_ed1wh>)wv6RYNUA-C&bejw{cBE_5Wzeo!AHdTd+ z)d(_IKN7z^n|As~3XS=cCB_TgM7rK;X586re`{~Foml$aKs zb!4Pe7hEP|370EWwn$HKPM!kL94UPZ1%8B^e5fB+=Iw^6=?5n3tZGYjov83CLB&OQ++p)WCMeshCv_9-~G9C_2x`LxTDjUcW$l6e!6-&a^fM3oP9*g(H zmCk0nGt1UMdU#pfg1G0um5|sc|KO<+qU1E4iBF~RvN*+`7uNHH^gu{?nw2DSCjig% zI@ymKZSK=PhHJa(jW&xeApv&JcfSmNJ4uQ|pY=Lcc>=J|{>5Ug3@x#R_b@55xFgfs za^ANzWdD$ZYtFs$d7+oiw0ZmPk2&l|< zc8()wfiJx@EGpQT zG$8iLkQZ-086doF1R zh<#9cz_vRsJdoXbD=QgOtpm}cFAJX8c}>Jew;PQJSXSb^;wlC zxXLHTS|!GZ-VK_4wV<9bk4RUmlsByzW_^b>)$6R+jQ}^wco1nMA`9Lncs;&QGp!`5Tx#aXXU?}5_RrtUY zx(EMzDhl-a^y^f5yfFLMnOO#u)l69&4M?|ne|2EV>zQ}4JQCBel?~2I4?D|>L$%H(peOOII!U}i z-j)*h1rODe9{0`xmhG;`AKqw1p0_KhEIU8)DoGnEn9wAhXPaxO_(jNSij~J5m$P*$ z9Mt(t;eV}2+i|kjQpBFcNb7_(VbuF<;RQB~R~p>2*Lg>a&7DEEuq*I%Ls4{zHeUDq z+M0&YhEn^C*9-B4Q7HJ$xj)dORCXPK+)ZtLOa0o&)Sl+f(Y{p*68$-#yagW5^HQnQ z0pWpoQpxg8<&gx9im(>=x6v#&RbQ7^AsjxeSDA? zi4MEJUC~ByG!PiBjq7$pK&FA^5 z=Y@dtQnuy%IfsaR`TVP0q^3mixl&J-3!$H!ua#{A>0Z1JdLq#d4UV9nlYm641ZHl zH6mK~iI6lR3OUEVL}Z5{ONZ_6{Nk%Bv03ag<1HVN?R%w2^aR5@E>6(r>}IoMl$wRF zWr-DItN*k7T$NTT8B)+23c?171sADhjInb2Xb>GhFYGC&3{b>huvLlaS4O z^{j5q+b5H?Z)yuy%AByaVl2yj9cnalY1sMQ zXI#e%*CLajxGxP!K6xf9RD2pMHOfAa1d^Lr6kE`IBpxOiGXfNcoQ*FI6wsNtLD!T+ zC4r2q>5qz0f}UY^RY#1^0*FPO*Zp-U1h9U|qWjwqJaDB(pZ`<`U-xo7+JB$zvwV}^ z2>$0&Q5k#l|Er7*PPG1ycj4BGz zg&`d*?nUi1Q!OB>{V@T$A;)8@h;*Rb1{xk_8X<34L`s}xkH-rQZvjM`jI=jaJRGRg zeEcjYChf-78|RLrao%4HyZBfnAx5KaE~@Sx+o-2MLJ>j-6uDb!U`odj*=)0k)K75l zo^)8-iz{_k7-_qy{Ko~N#B`n@o#A22YbKiA>0f3k=p-B~XX=`Ug>jl$e7>I=hph0&AK z?ya;(NaKY_!od=tFUcGU5Kwt!c9EPUQLi;JDCT*{90O@Wc>b| zI;&GIY$JlQW^9?R$-OEUG|3sp+hn+TL(YK?S@ZW<4PQa}=IcUAn_wW3d!r#$B}n08 z*&lf(YN21NDJ74DqwV`l`RX(4zJ<(E4D}N0@QaE-hnfdPDku~@yhb^AeZL73RgovX z6=e>!`&e^l@1WA5h!}}PwwL*Gjg!LbC5g0|qb8H$^S{eGs%cc?4vTyVFW=s6KtfW? z@&Xm+E(uz(qDbwDvRQI9DdB<2sW}FYK9sg*f%-i*>*n{t-_wXvg~N7gM|a91B!x|K zyLbJ~6!!JZpZ`#HpCB8g#Q*~VU47Rp$NyZb3WhEgg3ivSwnjGJgi0BEV?!H}Z@QF| zrO`Kx*52;FR#J-V-;`oR-pr!t>bYf)UYcixN=(FUR6$fhN@~i09^3WeP3*)D*`*mJ z1u%klAbzQ=P4s%|FnVTZv%|@(HDB+ap5S#cFSJUSGkyI*Y>9Lwx|0lTs%uhoCW(f1 zi+|a9;vDPfh3nS<7m~wqTM6+pEm(&z-Ll;lFH!w#(Uk#2>Iv~2Hu}lITn7hnOny`~ z*Vj=r<&Nwpq^@g5m`u&QTBRoK*}plAuHg$L$~NO#wF0!*r0OfcS%)k0A??uY*@B^C zJe9WdU(w){rTIf<;rwJt^_35^d<A@$FqEZW6kwyfAo2x0T$Ye2MZox6Z7<%Qbu$}}u{rtE+h2M+Z}T4I zxF1cwJ(Uvp!T#mogWkhb(?SxD4_#tV(Sc8N4Gu*{Fh#})Pvb^ef%jrlnG*&Ie+J5 zsly5oo?1((um&lLDxn(DkYtk`My>lgKTp3Y4?hTQ4_`YNOFtjF-FUY#d#(EQd(rfz zB8z%Vi;?x)ZM$3c>yc5H8KBvSevnWNdCbAj?QCac)6-K~Xz@EZp}~N9q)5*Ufjz3C z6kkOeI{3H(^VO8hKDrVjy2DXd;5wr4nb`19yJi0DO@607MSx+7F$ zz3F7sl8JV@@sM$6`#JmSilqI%Bs)}Py2eFT;TjcG5?8$zwV60b(_5A>b#uk~7U^bO z>y|6SCrP2IGST(8HFuX|XQUXPLt2gL_hm|uj1Ws`O2VW>SyL^uXkl>Zvkcpi?@!F7 z%svLoT@{R#XrIh^*dE~$YhMwC+b7JE09NAS47kT%Ew zD!XjxA@1+KOAyu`H2z#h+pGm!lG>WI0v745l+Fd><3dh{ATq%h?JSdEt zu%J*zfFUx%Tx&0DS5WSbE)vwZSoAGT=;W#(DoiL($BcK;U*w`xA&kheyMLI673HCb7fGkp{_vdV2uo;vSoAH z9BuLM#Vzwt#rJH>58=KXa#O;*)_N{$>l7`umacQ0g$pI3iW4=L--O;Wiq0zy7OKp`j2r^y3`7X!?sq9rr5B{41BkBr1fEd1#Q3 z-dXc2RSb4U>FvpVhlQCIzQ-hs=8420z=7F2F(^xD;^RXgpjlh8S6*xCP#Gj2+Q0bAg?XARw3dnlQ*Lz3vk}m`HXmCgN=?bIL{T zi}Ds-xn|P)dxhraT@XY$ZQ&^%x8y!o+?n#+>+dZ1c{hYwNTNRke@3enT(a@}V*X{! z81+{Jc2UR;+Zcbc6cUlafh4DFKwp>;M}8SGD+YnW3Q_)*9Z_pny_z+MeYQmz?r%EVaN0d!NE*FVPq&U@vo{ef6wkMIDEWLbDs zz91$($XbGnQ?4WHjB~4xgPgKZts{p|g1B{-4##}#c5aL5C6_RJ_(*5>85B1}U!_<``}q-97Q7~u)(&lsb(WT^(*n7H%33%@_b zO5(?-v??s??33b19xiB7t_YT!q8!qAzN1#RD@3;kYAli%kazt#YN7}MhVu=ljuz27 z1`<+g8oVwy57&$`CiHeaM)tz(OSt4E# zJ@P6E*e504oUw~RD(=9WP8QdW^6wRdFbKII!GAWecJ(?{`EzTR@?j!3g?$@LLCt;U={>!9z7DU!(1Jq zqEwdx5q?W1Ncm7mXP8MFwAr?nw5$H%cb>Q><9j{Tk2RY9ngGvaJgWXx^r!ywk{ph- zs2PFto4@IIwBh{oXe;yMZJYlS?3%a-CJ#js90hoh5W5d^OMwCFmpryHFr|mG+*ZP$ zqyS5BW@s}|3xUO0PR<^{a2M(gkP5BDGxvkWkPudSV*TMRK5Qm4?~VuqVAOerffRt$HGAvp;M++Iq$E6alB z;ykBr-eZ6v_H^1Wip56Czj&=`mb^TsX|FPN#-gnlP03AkiJDM=?y|LzER1M93R4sC z*HT(;EV=*F*>!+Z{r!KG?6ODMGvkt3viG=@kQJHNMYd}bS4KrrHf4`&*(0m0R5Hqz zEk)r=sFeS?MZRvn<@Z0&bDw)XkMnw+_xqgp=W{;ioX`6;G-P9N%wfoYJ$-m$L#MC% z^sH?tSzA|WWP(cN3({~_*X$l{M*;1V{l$;T6b){#l4pswDTid26HaXgKed}13YIP= zJRvA3nmx{}R$Lr&S4!kWU3`~dxM}>VXWu6Xd(VP}z1->h&f%82eXD_TuTs@=c;l0T z|LHmWKJ+?7hkY=YM>t}zvb4|lV;!ARMtWFp!E^J=Asu9w&kVF*i{T#}sY++-qnVh! z5TQ|=>)+vutf{&qB+LO9^jm#rD7E5+tcorr^Fn5Xb0B;)f^$7Ev#}G_`r==ea294V z--v4LwjswWlSq9ba6i?IXr8M_VEGQ$H%hCqJTFQ3+1B9tmxDUhnNU%dy4+zbqYJ|o z3!N{b?A@{;cG2~nb-`|z;gEDL5ffF@oc3`R{fGi)0wtMqEkw4tRX3t;LVS3-zAmg^ zgL7Z{hmdPSz9oA@t>tZ1<|Khn&Lp=_!Q=@a?k+t~H&3jN?dr(}7s;{L+jiKY57?WsFBfW^mu6a03_^VKrdK=9egXw@!nzZ3TbYc*osyQNoCXPYoFS<&Nr97MrQCOK(gO8 z;0@iqRTJy4-RH)PJld5`AJN}n?5r^-enKrHQOR;z>UMfm+e8~4ZL5k>oXMiYq12Bx4eVQv0jFgp_zC#``sjZpywYqISMP}VZ@!~1Mf$!x|opj%mQ98JnSk@`~ zPmmyuPZKtZOnEC!1y!?`TYRsZ!II;d!iln}%e}bk5qIiUADERr*K$3dekgHV9TtBX zi5q!J!6Zgd#cLxRmZN^J`o@Zv{+p+<_#8^nvY)44Hw_2i@?R&5n^q33fpOnDg1nPQ z_r<$hURl~OketX|Tdbvf_7=3x^rSFJtEp@tuDpVB&uq)qW;xUQ7mmkr-@eZwa$l+? zoKk``Vz@TH#>jMce*8>@FZ+@BEUdYa_K0i|{*;j9MW3K%pnM*T;@>|o@lMhgLrpZP5aol(z>g;b4}|e$U~Fn zGL%(}p%Jsl4LxE!VW_Y4T>e}W4e#~F03H_^R!Q)kpJG{lO!@I4{mFo^V#ayHh_5~o zB$O71gcE(G@6xv);#Ky?e(Ed}^O+Ho(t=93T9T3TnEY(OVf_dR-gY@jj+iJSY?q|6prBv(S9A4k=2fNZz!W@S=B@~b?TJRTuBQq448@juN#Y=3q=^VCF>Z}n6wICJ<^^Kn8C;mK zZYiFSN#Z$?NDGV7(#}q2tAZAtE63icK-MY>UQu4MWlGIbJ$AF8Zt-jV;@7P5MPI>% zPWvO!t%1+s>-A%`;0^o8Ezeaa4DMwI8ooQrJ;ax@Qt*6XONWw)dPwOPI9@u*EG&844*1~EoZ2qsAe~M>d`;Bc_CWY zMoDKEmDh-}k9d6*<0g@aQmsnrM1H9IcKYZs)><)d92{|0Hh8?~XbF)7U+UmP@Pw_6geVB?7N$4J4*E0z3EO&5kRS(EE zv92(+e5WxLXMN{h;-|8@!Q#0q247hb^3R%*k3MuMO5*L}$0D#5P*N$aHd54C+=_RToYXTyewugOaDmGsCvb4H1s=@gkfVnzTCWKMa-Mm1v4Wq!t-JIrbV&EWwKDe ze#kJpOq#iRlFz%5#6Fio9IUlKnQ#X&DY8Ux#<-WqxAac-y%U_L+EZZ4Rg5*yNg`f< zSZn&uio@zanUCPqX1l4W&B!;UWs#P7B^|4WwoCxQXl|44n^cBNqu=3Vl*ltAqsUQO z9q_@nD0zq0O8r`coEm>9+|rA3HL#l}X;0##>SJS$cVavOZVCpSGf4mUU1( zWaRCUYc^9QbG9=vpWo%xP}CMFnMb{reA`K7tT(t5DM)d9l}jVPY>qoRzT zE3m-p#=i=$9x*CB`AL>SY}u3agYFl#uULNen#&44H;!L@I{RI=PlWxG8J((f)ma7A z@jLvQ>?Nx`n?3ChRG#HqE3MXP8*o3!Qq`+t8EMt_p)oeKHqPusBxPn!#?R??-=e3e zo73WNs_IZF`WLigre=|`aS2^> zN1zn!7k&Dh28t%VpJ%**&E!eAcB5oLjQFFcJQj*URMia%Ya3@q1UQ18=oWMM6`I}iT_&L1gl?*~6nU4q4Z0`H<5yDp(HeZ+RGf9`mM&= zn-qRp%i!g$R;i1d1aMZ{IewNjE@p2+Z{`x{*xL*x$?WV~{BjJpsP&C&JK0HLoyf z`0z^v&fBQSa!I7FU~9MaQ%e|?RP>sM^2PL!mE^Q1Ig_4M$5BRfi72oMYu6Ke?wmDX z@0a%-V|z}b23K=ye(W+fG#w|jJUnT{=KR5jfuq!RX}<1irTDw(${<&}dWQu4;EuE< z@3u4dBkQaCHHM&;cE0z50_V!(vJ1_V)A8?C#eJuLkt!98Z%|Bgzidc0j|z(&o)TCzYlrgZA zC3@i>L!&Gw_~7`>puB97I2lK)lESZQqVXc_8T^G2O#VHhO?IC$g zOYhXJ7)~C<8l|Xrftka@QuowScM{K&0zskoU$Aw~vIRVRF9TEQ4*3=_5)98B`=t8(N%ZuWqmwlW zllAzq=E5_5!sKDXam@w`ZD(nl%LAPxQuEtDcKPqu9LPJvNIITawU#c^PQ2HmZgs)r zH^+gRwZ?0)8IFQgU)+p@0Iqb^tcEoqcB@zhfz_FaOM&_d<|jnU>q5nSKa<@%9|dje zIupcg1!tRiMP4X=oG<7s4|AW&^-Cw4FL9OuI$t zxjc*y;Uw!G7a|jz>E*2+PlR(CemWebS7m-&*CDwnmxbiRqJvQ&os-sC&4OWt^(2@vG4|jui#Df@-D= zh3D%8Y3R6+jRBStSvH9pt&tCI`NK08J1*pC(?OM0h!bS-JK3I}`pDY-fDIaB_*W6KS+TO0Q*%kkeuN6uWITt=TsCGw6uBE710q; zRluI%j{?@jwhM|l5&TB!-TkQs!A=DXRE>u18t@;zndD0M$U@Igrt?UW2; z7%=dsHIVH_LCkGUU0fW&UMjDnvjcc0Mp(mK&;d~ZJ5EJ)#7@aTZvGDFXzFZg2Lq~s z5PR_LazNN)JD5K_uK*Hy{mXuHTkGGv|9V8KP#iQ$3!G*^>7UiE{|1G1A-qg(xH;Xa>&%f|BZkH zG=J^0pHzSAqv5*5ysQ{Puy^-_|IPrii zKS$mE10Zngf>Sgg@BjpRyJbrHeo zD8Ro0LI*W#+9?^xlOS^c>Z^^n^0I|FH^@^`ZR`{H=$ zjO0_$cnpBM7Zcm?H_RXIu-Lu~qweDSV|tEZBZh!e6hQy->}e;d#osZ1hQj{HhHkC0 zJ|F-HKmeTGgDe979ogBz24;@<|I7;TU!IXb@oWMsMECIETmQy`zPtM`|NP}PjzR_u zKMG1Z{%1kWeMfEf(10U#w!clmQ2)JC8zm(Fv!H4dUHQHCFLikID?hrd{0>kCQt?kP zdqn2ZG0}ytcQJ7t_B3s0ZvH3PYjkjQ`Q%;jV@?MK-+z3etBCGGo4f4`y^|AdCs!DH zThTQ;cL5dM{|tB_1y6K3bVa^hx_<9J(}5`2SDz1^0bT!Vm*JV;9~t&{IC{$DUAVV* z{|E=#yN{wNdTY@$6z{_KNA3&%w|vFu1n9XRcM0Ak>`UW!lQ`ah3D4r%}Z diff --git a/packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.properties b/packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100755 index 761b8f0..0000000 --- a/packages/browser-wallet-base/src/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/browser-wallet-base/src/android/gradlew b/packages/browser-wallet-base/src/android/gradlew deleted file mode 100755 index 79a61d4..0000000 --- a/packages/browser-wallet-base/src/android/gradlew +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/packages/browser-wallet-base/src/android/gradlew.bat b/packages/browser-wallet-base/src/android/gradlew.bat deleted file mode 100755 index 93e3f59..0000000 --- a/packages/browser-wallet-base/src/android/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/packages/browser-wallet-base/src/android/settings.gradle b/packages/browser-wallet-base/src/android/settings.gradle deleted file mode 100755 index 3b4431d..0000000 --- a/packages/browser-wallet-base/src/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -include ':app' -include ':capacitor-cordova-android-plugins' -project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') - -apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/packages/browser-wallet-base/src/android/variables.gradle b/packages/browser-wallet-base/src/android/variables.gradle deleted file mode 100755 index 5946ada..0000000 --- a/packages/browser-wallet-base/src/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 22 - compileSdkVersion = 33 - targetSdkVersion = 33 - androidxActivityVersion = '1.7.0' - androidxAppCompatVersion = '1.6.1' - androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.10.0' - androidxFragmentVersion = '1.5.6' - coreSplashScreenVersion = '1.0.0' - androidxWebkitVersion = '1.6.1' - junitVersion = '4.13.2' - androidxJunitVersion = '1.1.5' - androidxEspressoCoreVersion = '3.5.1' - cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/icon.png b/packages/browser-wallet-base/src/app-resources/icon.png similarity index 100% rename from packages/browser-wallet-base/src/apple/macOS (App)/Resources/icon.png rename to packages/browser-wallet-base/src/app-resources/icon.png diff --git a/packages/browser-wallet-base/src/app-resources/splash.png b/packages/browser-wallet-base/src/app-resources/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..86ff7848a2c0171f205f12709332640cba767329 GIT binary patch literal 321618 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

?WhsBG^Z7bkdPUux!9^ojn>D* z(zd^l$Z;kFBZFG1N%m|eFab1I#6Z!I%%s#91`2G17N}O0U0$u3iO?YLc3Q!zKKIfK zo86|?T14_R)mo596-XqGLzQXYkpMQ2Dw>6|i_j99S*)4eri?X%#e(AOuc?FmE}EWk ztCe`1`)s^x+J_E!DUcU-n;8LMrzE_2>^H|PnQu$_^lLxF(bRPJD!{-LTuI$n3b%NR z1G<31zSq~CY3u33Hd4E9+P%W+A8dEk7qdN^<(6K0a|RYu0*Aes_TD`x5pB2AG)>Qb z^L?Ykj0*xF5R)2!*5)|7#DbX*iSUZ^etCF9-}Z%At{W`0Qh%|%)18qv5C#Pdh{9@A zuv#l47=RiiB;94*Ojv~XC+zr-TNv%e4nS1{QNJ=*plYHJErj4xd1@6Er8Y2F0YOEL z1OZAZC`3%?qhx&gRxmSk^}xnz)@q4F9ExiD0bAMS9yRZmg)%=f$HmV_-gurIMUnRYAJG??2l z51?X<)~6dFvzay48sCnzP<5TaS|$ zzT;C$vps8QN&UWZe(U{1i|eqCPW0W4`{JV>-*#uToom074V(sjt`_qgj_1X@59|Pf z*FD%0J$$x>*qbD`{9f-S9>PEugH{CFS(ROLAz-JWqWN~ZK7j_*;QoKz4s_*h00aoA zrX~WB;%WeH1a)o~5};jYy`D%L#$rxLvlmF~Pr*cts9~c3h#Y#=Ho1vBSg$vmtxo}} zwI=2?3_F<&#Y}6hDWzJgN>%fU%ovzO1(*=b6a$f}5`Y%0A{0U-77_P*-PO{jV$e}Y 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

@Zh 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

O*gMzDkue~2FBR5t*RXN`(YSP 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 literal 0 HcmV?d00001 diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj deleted file mode 100644 index 5eca0f7..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1227 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 55; - objects = { - -/* Begin PBXBuildFile section */ - 041114892A17305F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8E8684622872B3500037E6C9 /* BitgreenWallet Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 041114932A17C28F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 0411149E2A17D0B50083C227 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 0411149D2A17D0B50083C227 /* config.xml */; }; - 041114BF2A17D29F0083C227 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041114BE2A17D29F0083C227 /* ViewController.swift */; }; - 041114C42A17D2E10083C227 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041114BA2A17D1DB0083C227 /* AppDelegate.swift */; }; - 041115072A17F6D60083C227 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 041114B22A17D1AD0083C227 /* icon.png */; }; - 041115082A17F6D60083C227 /* main.html in Resources */ = {isa = PBXBuildFile; fileRef = 041114B32A17D1AD0083C227 /* main.html */; }; - 041115092A17F6D60083C227 /* script.js in Resources */ = {isa = PBXBuildFile; fileRef = 041114B12A17D1AD0083C227 /* script.js */; }; - 0411150A2A17F6D60083C227 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 041114B42A17D1AD0083C227 /* style.css */; }; - 0432DBEC29F21DFE0011FCE0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E8684592872B3500037E6C9 /* Main.storyboard */; }; - 0432DBEF29F21EB40011FCE0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843C2872B3500037E6C9 /* Assets.xcassets */; }; - 047C28702A7169B600F81F5E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047C286C2A7169B600F81F5E /* LaunchScreen.storyboard */; }; - 047C28712A7169B600F81F5E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047C286E2A7169B600F81F5E /* Main.storyboard */; }; - 047C28732A7169C400F81F5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047C28722A7169C400F81F5E /* AppDelegate.swift */; }; - 047C28752A7169CE00F81F5E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 047C28742A7169CE00F81F5E /* capacitor.config.json */; }; - 047C28782A716A4800F81F5E /* public in Resources */ = {isa = PBXBuildFile; fileRef = 047C28772A716A4800F81F5E /* public */; }; - 047C28DA2A71D99E00F81F5E /* CapacitorKeyboard in Frameworks */ = {isa = PBXBuildFile; fileRef = 047C28D92A71D99E00F81F5E /* CapacitorKeyboard */; }; - 047C28FF2A75C26E00F81F5E /* CapacitorApp in Frameworks */ = {isa = PBXBuildFile; fileRef = 047C28FE2A75C26E00F81F5E /* CapacitorApp */; }; - 047D48EE2A040A1B00C416FC /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 047D48E92A040A1B00C416FC /* icons */; }; - 047D48EF2A040A1B00C416FC /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 047D48E92A040A1B00C416FC /* icons */; }; - 047D48F22A040A1B00C416FC /* default.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EB2A040A1B00C416FC /* default.js */; }; - 047D48F32A040A1B00C416FC /* default.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48EB2A040A1B00C416FC /* default.js */; }; - 047D48F62A040A1B00C416FC /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48ED2A040A1B00C416FC /* main.js */; }; - 047D48F72A040A1B00C416FC /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 047D48ED2A040A1B00C416FC /* main.js */; }; - 04B0525B29F9EC730049B197 /* inject.js in Resources */ = {isa = PBXBuildFile; fileRef = 04B0525629F9EC730049B197 /* inject.js */; }; - 04B0525C29F9EC730049B197 /* inject.js in Resources */ = {isa = PBXBuildFile; fileRef = 04B0525629F9EC730049B197 /* inject.js */; }; - 04C9ADAE2A14451600EFF193 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E86843C2872B3500037E6C9 /* Assets.xcassets */; }; - 271FBF1129B8DB52001D0940 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0329B8DB52001D0940 /* manifest.json */; }; - 271FBF1229B8DB52001D0940 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0329B8DB52001D0940 /* manifest.json */; }; - 271FBF1529B8DB52001D0940 /* components in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0429B8DB52001D0940 /* components */; }; - 271FBF1629B8DB52001D0940 /* components in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0429B8DB52001D0940 /* components */; }; - 271FBF2529B8DB52001D0940 /* page.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0829B8DB52001D0940 /* page.js */; }; - 271FBF2629B8DB52001D0940 /* page.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0829B8DB52001D0940 /* page.js */; }; - 271FBF2929B8DB52001D0940 /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0929B8DB52001D0940 /* background.js */; }; - 271FBF2A29B8DB52001D0940 /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0929B8DB52001D0940 /* background.js */; }; - 271FBF2D29B8DB52001D0940 /* content.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0A29B8DB52001D0940 /* content.js */; }; - 271FBF2E29B8DB52001D0940 /* content.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0A29B8DB52001D0940 /* content.js */; }; - 271FBF3529B8DB52001D0940 /* extension.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0C29B8DB52001D0940 /* extension.js */; }; - 271FBF3629B8DB52001D0940 /* extension.js in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0C29B8DB52001D0940 /* extension.js */; }; - 271FBF3929B8DB52001D0940 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0D29B8DB52001D0940 /* assets */; }; - 271FBF3A29B8DB52001D0940 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0D29B8DB52001D0940 /* assets */; }; - 271FBF3D29B8DB52001D0940 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0E29B8DB52001D0940 /* index.html */; }; - 271FBF3E29B8DB52001D0940 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 271FBF0E29B8DB52001D0940 /* index.html */; }; - 27751DC978D5825FA52507C7 /* Pods_BitgreenWallet__iOS_.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B976C688D8DD970F490FF3F6 /* Pods_BitgreenWallet__iOS_.framework */; }; - 8E86847F2872B3500037E6C9 /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */; }; - 8E8684802872B3500037E6C9 /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 0411148A2A17305F0083C227 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 8E8684302872B34D0037E6C9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8E8684612872B3500037E6C9; - remoteInfo = "BitgreenWallet Extension (iOS)"; - }; - 047C28AE2A716CD500F81F5E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 44D6062E8C618EC2B8F1D7229E8AD501; - remoteInfo = Capacitor; - }; - 047C28B02A716CD500F81F5E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1ABFDA3391AEBA42EFB0FEBF824A6E34; - remoteInfo = CapacitorCordova; - }; - 047C28BA2A7173A400F81F5E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = B7F9F70473009360419B24AC94D17877; - remoteInfo = "Pods-BitgreenWallet (iOS)"; - }; - 047C28D82A71D99E00F81F5E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 43F80CDA05D5624A6B812123E023B138; - remoteInfo = CapacitorKeyboard; - }; - 047C28FD2A75C26E00F81F5E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = CDFF4A7EE78A2AC8170A2DC20868DF1F; - remoteInfo = CapacitorApp; - }; - 8E86846E2872B3500037E6C9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 8E8684302872B34D0037E6C9 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8E86846B2872B3500037E6C9; - remoteInfo = "BitgreenWallet Extension (macOS)"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 0411148C2A1730600083C227 /* Embed Foundation Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 041114892A17305F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */, - ); - name = "Embed Foundation Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 8E86848D2872B3500037E6C9 /* Embed Foundation Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 041114932A17C28F0083C227 /* BitgreenWallet Extension.appex in Embed Foundation Extensions */, - ); - name = "Embed Foundation Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0411149D2A17D0B50083C227 /* config.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; - 041114B12A17D1AD0083C227 /* script.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = script.js; path = Resources/script.js; sourceTree = ""; }; - 041114B22A17D1AD0083C227 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icon.png; sourceTree = ""; }; - 041114B32A17D1AD0083C227 /* main.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = main.html; path = Resources/main.html; sourceTree = ""; }; - 041114B42A17D1AD0083C227 /* style.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = style.css; path = Resources/style.css; sourceTree = ""; }; - 041114BA2A17D1DB0083C227 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 041114BE2A17D29F0083C227 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 047C286D2A7169B600F81F5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 047C286F2A7169B600F81F5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 047C28722A7169C400F81F5E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 047C28742A7169CE00F81F5E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; - 047C28772A716A4800F81F5E /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; - 047C28A82A716CD500F81F5E /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = ""; }; - 047D48E92A040A1B00C416FC /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = ""; }; - 047D48EB2A040A1B00C416FC /* default.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = default.js; sourceTree = ""; }; - 047D48ED2A040A1B00C416FC /* main.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = main.js; sourceTree = ""; }; - 04B0525629F9EC730049B197 /* inject.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = inject.js; sourceTree = ""; }; - 04C9AD792A13080B00EFF193 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 271FBF0329B8DB52001D0940 /* manifest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = manifest.json; sourceTree = ""; }; - 271FBF0429B8DB52001D0940 /* components */ = {isa = PBXFileReference; lastKnownFileType = folder; path = components; sourceTree = ""; }; - 271FBF0829B8DB52001D0940 /* page.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = page.js; sourceTree = ""; }; - 271FBF0929B8DB52001D0940 /* background.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = background.js; sourceTree = ""; }; - 271FBF0A29B8DB52001D0940 /* content.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = content.js; sourceTree = ""; }; - 271FBF0C29B8DB52001D0940 /* extension.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = extension.js; sourceTree = ""; }; - 271FBF0D29B8DB52001D0940 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; - 271FBF0E29B8DB52001D0940 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; - 621754D54963E544190F54C9 /* Pods-BitgreenWallet (iOS).release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BitgreenWallet (iOS).release.xcconfig"; path = "Target Support Files/Pods-BitgreenWallet (iOS)/Pods-BitgreenWallet (iOS).release.xcconfig"; sourceTree = ""; }; - 8E77E44628754AA80020A55D /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = ""; }; - 8E86843C2872B3500037E6C9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariWebExtensionHandler.swift; sourceTree = ""; }; - 8E8684432872B3500037E6C9 /* BitgreenWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BitgreenWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E8684552872B3500037E6C9 /* BitgreenWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BitgreenWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E86845A2872B3500037E6C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 8E86845C2872B3500037E6C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8E86845D2872B3500037E6C9 /* BitgreenWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BitgreenWallet.entitlements; sourceTree = ""; }; - 8E8684622872B3500037E6C9 /* BitgreenWallet Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BitgreenWallet Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E8684672872B3500037E6C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BitgreenWallet Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E8684712872B3500037E6C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8E8684722872B3500037E6C9 /* BitgreenWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BitgreenWallet.entitlements; sourceTree = ""; }; - B976C688D8DD970F490FF3F6 /* Pods_BitgreenWallet__iOS_.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BitgreenWallet__iOS_.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FACF023E3802523EACD15DE1 /* Pods-BitgreenWallet (iOS).debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BitgreenWallet (iOS).debug.xcconfig"; path = "Target Support Files/Pods-BitgreenWallet (iOS)/Pods-BitgreenWallet (iOS).debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8E8684402872B3500037E6C9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 047C28FF2A75C26E00F81F5E /* CapacitorApp in Frameworks */, - 047C28DA2A71D99E00F81F5E /* CapacitorKeyboard in Frameworks */, - 27751DC978D5825FA52507C7 /* Pods_BitgreenWallet__iOS_.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E8684522872B3500037E6C9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E86845F2872B3500037E6C9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E8684692872B3500037E6C9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 041114B02A17D19D0083C227 /* Resources */ = { - isa = PBXGroup; - children = ( - 041114B22A17D1AD0083C227 /* icon.png */, - 041114B32A17D1AD0083C227 /* main.html */, - 041114B12A17D1AD0083C227 /* script.js */, - 041114B42A17D1AD0083C227 /* style.css */, - ); - name = Resources; - sourceTree = ""; - }; - 047C28A92A716CD500F81F5E /* Products */ = { - isa = PBXGroup; - children = ( - 047C28AF2A716CD500F81F5E /* Capacitor */, - 047C28FE2A75C26E00F81F5E /* CapacitorApp */, - 047C28B12A716CD500F81F5E /* CapacitorCordova */, - 047C28D92A71D99E00F81F5E /* CapacitorKeyboard */, - 047C28BB2A7173A400F81F5E /* Pods-BitgreenWallet (iOS) */, - ); - name = Products; - sourceTree = ""; - }; - 04C9ADD02A1507DE00EFF193 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B976C688D8DD970F490FF3F6 /* Pods_BitgreenWallet__iOS_.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 463C928A7F2C66B33B4978B9 /* Pods */ = { - isa = PBXGroup; - children = ( - FACF023E3802523EACD15DE1 /* Pods-BitgreenWallet (iOS).debug.xcconfig */, - 621754D54963E544190F54C9 /* Pods-BitgreenWallet (iOS).release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 8E86842F2872B34D0037E6C9 = { - isa = PBXGroup; - children = ( - 047C28A82A716CD500F81F5E /* Pods.xcodeproj */, - 8E8684342872B34D0037E6C9 /* Shared (App) */, - 8E86843D2872B3500037E6C9 /* Shared (Extension) */, - 8E8684452872B3500037E6C9 /* iOS (App) */, - 8E8684562872B3500037E6C9 /* macOS (App) */, - 8E8684662872B3500037E6C9 /* iOS (Extension) */, - 8E8684702872B3500037E6C9 /* macOS (Extension) */, - 8E8684442872B3500037E6C9 /* Products */, - 04C9ADD02A1507DE00EFF193 /* Frameworks */, - 463C928A7F2C66B33B4978B9 /* Pods */, - ); - sourceTree = ""; - }; - 8E8684342872B34D0037E6C9 /* Shared (App) */ = { - isa = PBXGroup; - children = ( - 8E86843C2872B3500037E6C9 /* Assets.xcassets */, - ); - path = "Shared (App)"; - sourceTree = ""; - }; - 8E86843D2872B3500037E6C9 /* Shared (Extension) */ = { - isa = PBXGroup; - children = ( - 8E8684912872B3510037E6C9 /* Resources */, - 8E86843E2872B3500037E6C9 /* SafariWebExtensionHandler.swift */, - ); - path = "Shared (Extension)"; - sourceTree = ""; - }; - 8E8684442872B3500037E6C9 /* Products */ = { - isa = PBXGroup; - children = ( - 8E8684432872B3500037E6C9 /* BitgreenWallet.app */, - 8E8684552872B3500037E6C9 /* BitgreenWallet.app */, - 8E8684622872B3500037E6C9 /* BitgreenWallet Extension.appex */, - 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */, - ); - name = Products; - sourceTree = ""; - }; - 8E8684452872B3500037E6C9 /* iOS (App) */ = { - isa = PBXGroup; - children = ( - 047C28772A716A4800F81F5E /* public */, - 047C28742A7169CE00F81F5E /* capacitor.config.json */, - 047C28722A7169C400F81F5E /* AppDelegate.swift */, - 047C286C2A7169B600F81F5E /* LaunchScreen.storyboard */, - 047C286E2A7169B600F81F5E /* Main.storyboard */, - 0411149D2A17D0B50083C227 /* config.xml */, - 04C9AD792A13080B00EFF193 /* Info.plist */, - ); - path = "iOS (App)"; - sourceTree = ""; - }; - 8E8684562872B3500037E6C9 /* macOS (App) */ = { - isa = PBXGroup; - children = ( - 041114B02A17D19D0083C227 /* Resources */, - 041114BE2A17D29F0083C227 /* ViewController.swift */, - 041114BA2A17D1DB0083C227 /* AppDelegate.swift */, - 8E8684592872B3500037E6C9 /* Main.storyboard */, - 8E86845C2872B3500037E6C9 /* Info.plist */, - 8E86845D2872B3500037E6C9 /* BitgreenWallet.entitlements */, - ); - path = "macOS (App)"; - sourceTree = ""; - }; - 8E8684662872B3500037E6C9 /* iOS (Extension) */ = { - isa = PBXGroup; - children = ( - 8E8684672872B3500037E6C9 /* Info.plist */, - ); - path = "iOS (Extension)"; - sourceTree = ""; - }; - 8E8684702872B3500037E6C9 /* macOS (Extension) */ = { - isa = PBXGroup; - children = ( - 8E8684712872B3500037E6C9 /* Info.plist */, - 8E8684722872B3500037E6C9 /* BitgreenWallet.entitlements */, - ); - path = "macOS (Extension)"; - sourceTree = ""; - }; - 8E8684912872B3510037E6C9 /* Resources */ = { - isa = PBXGroup; - children = ( - 047D48EB2A040A1B00C416FC /* default.js */, - 047D48E92A040A1B00C416FC /* icons */, - 047D48ED2A040A1B00C416FC /* main.js */, - 04B0525629F9EC730049B197 /* inject.js */, - 271FBF0D29B8DB52001D0940 /* assets */, - 271FBF0929B8DB52001D0940 /* background.js */, - 271FBF0429B8DB52001D0940 /* components */, - 271FBF0A29B8DB52001D0940 /* content.js */, - 271FBF0C29B8DB52001D0940 /* extension.js */, - 271FBF0E29B8DB52001D0940 /* index.html */, - 271FBF0329B8DB52001D0940 /* manifest.json */, - 271FBF0829B8DB52001D0940 /* page.js */, - 8E77E44628754AA80020A55D /* icons */, - ); - name = Resources; - path = "Shared (Extension)"; - sourceTree = SOURCE_ROOT; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8E8684422872B3500037E6C9 /* BitgreenWallet (iOS) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8E8684872872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet (iOS)" */; - buildPhases = ( - 041114BD2A17D23B0083C227 /* [CP] Check Pods Manifest.lock */, - 8E86843F2872B3500037E6C9 /* Sources */, - 8E8684402872B3500037E6C9 /* Frameworks */, - 8E8684412872B3500037E6C9 /* Resources */, - 0411148C2A1730600083C227 /* Embed Foundation Extensions */, - 047C28922A716C3000F81F5E /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 0411148B2A17305F0083C227 /* PBXTargetDependency */, - ); - name = "BitgreenWallet (iOS)"; - productName = "BitgreenWallet (iOS)"; - productReference = 8E8684432872B3500037E6C9 /* BitgreenWallet.app */; - productType = "com.apple.product-type.application"; - }; - 8E8684542872B3500037E6C9 /* BitgreenWallet (macOS) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8E86848E2872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet (macOS)" */; - buildPhases = ( - 8E8684512872B3500037E6C9 /* Sources */, - 8E8684522872B3500037E6C9 /* Frameworks */, - 8E8684532872B3500037E6C9 /* Resources */, - 8E86848D2872B3500037E6C9 /* Embed Foundation Extensions */, - ); - buildRules = ( - ); - dependencies = ( - 8E86846F2872B3500037E6C9 /* PBXTargetDependency */, - ); - name = "BitgreenWallet (macOS)"; - productName = "BitgreenWallet (macOS)"; - productReference = 8E8684552872B3500037E6C9 /* BitgreenWallet.app */; - productType = "com.apple.product-type.application"; - }; - 8E8684612872B3500037E6C9 /* BitgreenWallet Extension (iOS) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8E8684832872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet Extension (iOS)" */; - buildPhases = ( - 8E86845E2872B3500037E6C9 /* Sources */, - 8E86845F2872B3500037E6C9 /* Frameworks */, - 8E8684602872B3500037E6C9 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BitgreenWallet Extension (iOS)"; - productName = "BitgreenWallet Extension (iOS)"; - productReference = 8E8684622872B3500037E6C9 /* BitgreenWallet Extension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 8E86846B2872B3500037E6C9 /* BitgreenWallet Extension (macOS) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8E86848A2872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet Extension (macOS)" */; - buildPhases = ( - 8E8684682872B3500037E6C9 /* Sources */, - 8E8684692872B3500037E6C9 /* Frameworks */, - 8E86846A2872B3500037E6C9 /* Resources */, - 8EF31D9C28745F0A0069BECA /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BitgreenWallet Extension (macOS)"; - productName = "BitgreenWallet Extension (macOS)"; - productReference = 8E86846C2872B3500037E6C9 /* BitgreenWallet Extension.appex */; - productType = "com.apple.product-type.app-extension"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 8E8684302872B34D0037E6C9 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1430; - TargetAttributes = { - 8E8684422872B3500037E6C9 = { - CreatedOnToolsVersion = 13.4.1; - LastSwiftMigration = 1430; - }; - 8E8684542872B3500037E6C9 = { - CreatedOnToolsVersion = 13.4.1; - LastSwiftMigration = 1430; - }; - 8E8684612872B3500037E6C9 = { - CreatedOnToolsVersion = 13.4.1; - }; - 8E86846B2872B3500037E6C9 = { - CreatedOnToolsVersion = 13.4.1; - }; - }; - }; - buildConfigurationList = 8E8684332872B34D0037E6C9 /* Build configuration list for PBXProject "BitgreenWallet" */; - compatibilityVersion = "Xcode 13.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 8E86842F2872B34D0037E6C9; - productRefGroup = 8E8684442872B3500037E6C9 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 047C28A92A716CD500F81F5E /* Products */; - ProjectRef = 047C28A82A716CD500F81F5E /* Pods.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 8E8684422872B3500037E6C9 /* BitgreenWallet (iOS) */, - 8E8684542872B3500037E6C9 /* BitgreenWallet (macOS) */, - 8E8684612872B3500037E6C9 /* BitgreenWallet Extension (iOS) */, - 8E86846B2872B3500037E6C9 /* BitgreenWallet Extension (macOS) */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 047C28AF2A716CD500F81F5E /* Capacitor */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - name = Capacitor; - path = Capacitor.framework; - remoteRef = 047C28AE2A716CD500F81F5E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 047C28B12A716CD500F81F5E /* CapacitorCordova */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - name = CapacitorCordova; - path = Cordova.framework; - remoteRef = 047C28B02A716CD500F81F5E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 047C28BB2A7173A400F81F5E /* Pods-BitgreenWallet (iOS) */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - name = "Pods-BitgreenWallet (iOS)"; - path = Pods_BitgreenWallet__iOS_.framework; - remoteRef = 047C28BA2A7173A400F81F5E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 047C28D92A71D99E00F81F5E /* CapacitorKeyboard */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - name = CapacitorKeyboard; - path = CapacitorKeyboard.framework; - remoteRef = 047C28D82A71D99E00F81F5E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 047C28FE2A75C26E00F81F5E /* CapacitorApp */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - name = CapacitorApp; - path = CapacitorApp.framework; - remoteRef = 047C28FD2A75C26E00F81F5E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 8E8684412872B3500037E6C9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 047C28712A7169B600F81F5E /* Main.storyboard in Resources */, - 047C28702A7169B600F81F5E /* LaunchScreen.storyboard in Resources */, - 047C28752A7169CE00F81F5E /* capacitor.config.json in Resources */, - 04C9ADAE2A14451600EFF193 /* Assets.xcassets in Resources */, - 0411149E2A17D0B50083C227 /* config.xml in Resources */, - 047C28782A716A4800F81F5E /* public in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E8684532872B3500037E6C9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 041115072A17F6D60083C227 /* icon.png in Resources */, - 041115082A17F6D60083C227 /* main.html in Resources */, - 041115092A17F6D60083C227 /* script.js in Resources */, - 0411150A2A17F6D60083C227 /* style.css in Resources */, - 0432DBEF29F21EB40011FCE0 /* Assets.xcassets in Resources */, - 0432DBEC29F21DFE0011FCE0 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E8684602872B3500037E6C9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 047D48F62A040A1B00C416FC /* main.js in Resources */, - 047D48EE2A040A1B00C416FC /* icons in Resources */, - 04B0525B29F9EC730049B197 /* inject.js in Resources */, - 271FBF3D29B8DB52001D0940 /* index.html in Resources */, - 271FBF2529B8DB52001D0940 /* page.js in Resources */, - 271FBF2D29B8DB52001D0940 /* content.js in Resources */, - 271FBF1129B8DB52001D0940 /* manifest.json in Resources */, - 271FBF2929B8DB52001D0940 /* background.js in Resources */, - 271FBF3929B8DB52001D0940 /* assets in Resources */, - 271FBF3529B8DB52001D0940 /* extension.js in Resources */, - 271FBF1529B8DB52001D0940 /* components in Resources */, - 047D48F22A040A1B00C416FC /* default.js in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E86846A2872B3500037E6C9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 047D48F72A040A1B00C416FC /* main.js in Resources */, - 047D48EF2A040A1B00C416FC /* icons in Resources */, - 04B0525C29F9EC730049B197 /* inject.js in Resources */, - 271FBF3E29B8DB52001D0940 /* index.html in Resources */, - 271FBF2629B8DB52001D0940 /* page.js in Resources */, - 271FBF2E29B8DB52001D0940 /* content.js in Resources */, - 271FBF1229B8DB52001D0940 /* manifest.json in Resources */, - 271FBF2A29B8DB52001D0940 /* background.js in Resources */, - 271FBF3A29B8DB52001D0940 /* assets in Resources */, - 271FBF3629B8DB52001D0940 /* extension.js in Resources */, - 271FBF1629B8DB52001D0940 /* components in Resources */, - 047D48F32A040A1B00C416FC /* default.js in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 041114BD2A17D23B0083C227 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 12; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-BitgreenWallet (iOS)-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 047C28922A716C3000F81F5E /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BitgreenWallet (iOS)/Pods-BitgreenWallet (iOS)-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 8EF31D9C28745F0A0069BECA /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nxattr -cr ~/Library/Developer/Xcode/DerivedData || echo Clear\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8E86843F2872B3500037E6C9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 047C28732A7169C400F81F5E /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E8684512872B3500037E6C9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 041114BF2A17D29F0083C227 /* ViewController.swift in Sources */, - 041114C42A17D2E10083C227 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E86845E2872B3500037E6C9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8E86847F2872B3500037E6C9 /* SafariWebExtensionHandler.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E8684682872B3500037E6C9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8E8684802872B3500037E6C9 /* SafariWebExtensionHandler.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 0411148B2A17305F0083C227 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8E8684612872B3500037E6C9 /* BitgreenWallet Extension (iOS) */; - targetProxy = 0411148A2A17305F0083C227 /* PBXContainerItemProxy */; - }; - 8E86846F2872B3500037E6C9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8E86846B2872B3500037E6C9 /* BitgreenWallet Extension (macOS) */; - targetProxy = 8E86846E2872B3500037E6C9 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 047C286C2A7169B600F81F5E /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 047C286D2A7169B600F81F5E /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - 047C286E2A7169B600F81F5E /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 047C286F2A7169B600F81F5E /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 8E8684592872B3500037E6C9 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8E86845A2872B3500037E6C9 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 8E8684812872B3500037E6C9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 8E8684822872B3500037E6C9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 8E8684842872B3500037E6C9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 554R43WPXX; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "iOS (Extension)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "BitgreenWallet Extension"; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1.Extension"; - PRODUCT_NAME = "BitgreenWallet Extension"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8E8684852872B3500037E6C9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 554R43WPXX; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "iOS (Extension)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "BitgreenWallet Extension"; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1.Extension"; - PRODUCT_NAME = "BitgreenWallet Extension"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 8E8684882872B3500037E6C9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FACF023E3802523EACD15DE1 /* Pods-BitgreenWallet (iOS).debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 554R43WPXX; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "iOS (App)/Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "iOS (App)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "Bitgreen Wallet"; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = armv7; - INFOPLIST_KEY_UIRequiresFullScreen = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - "-framework", - WebKit, - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; - PRODUCT_NAME = BitgreenWallet; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - WK_WEB_VIEW_ONLY = 1; - }; - name = Debug; - }; - 8E8684892872B3500037E6C9 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 621754D54963E544190F54C9 /* Pods-BitgreenWallet (iOS).release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 554R43WPXX; - ENABLE_NS_ASSERTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "iOS (App)/Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "WK_WEB_VIEW_ONLY=$(WK_WEB_VIEW_ONLY)", - ); - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "iOS (App)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "Bitgreen Wallet"; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = armv7; - INFOPLIST_KEY_UIRequiresFullScreen = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - "-framework", - WebKit, - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; - PRODUCT_NAME = BitgreenWallet; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - WK_WEB_VIEW_ONLY = 1; - }; - name = Release; - }; - 8E86848B2872B3500037E6C9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; - CODE_SIGN_ENTITLEMENTS = "macOS (Extension)/BitgreenWallet.entitlements"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 554R43WPXX; - ENABLE_HARDENED_RUNTIME = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "macOS (Extension)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "BitgreenWallet Extension"; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@executable_path/../../../../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1.Extension"; - PRODUCT_NAME = "BitgreenWallet Extension"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; - SUPPORTS_MACCATALYST = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 8E86848C2872B3500037E6C9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; - CODE_SIGN_ENTITLEMENTS = "macOS (Extension)/BitgreenWallet.entitlements"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 554R43WPXX; - ENABLE_HARDENED_RUNTIME = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "macOS (Extension)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "BitgreenWallet Extension"; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@executable_path/../../../../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1.Extension"; - PRODUCT_NAME = "BitgreenWallet Extension"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; - SUPPORTS_MACCATALYST = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 8E86848F2872B3500037E6C9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = "$(ARCHS_STANDARD)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "macOS (App)/BitgreenWallet.entitlements"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 554R43WPXX; - ENABLE_HARDENED_RUNTIME = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "macOS (App)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = BitgreenWallet; - INFOPLIST_KEY_NSMainStoryboardFile = Main; - INFOPLIST_KEY_NSPrincipalClass = NSApplication; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - "-framework", - WebKit, - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; - PRODUCT_NAME = BitgreenWallet; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 8E8684902872B3500037E6C9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = "$(ARCHS_STANDARD)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "macOS (App)/BitgreenWallet.entitlements"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 554R43WPXX; - ENABLE_HARDENED_RUNTIME = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "macOS (App)/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = BitgreenWallet; - INFOPLIST_KEY_NSMainStoryboardFile = Main; - INFOPLIST_KEY_NSPrincipalClass = NSApplication; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "-framework", - SafariServices, - "-framework", - WebKit, - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.bitgreen.browser-wallet1"; - PRODUCT_NAME = BitgreenWallet; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 8E8684332872B34D0037E6C9 /* Build configuration list for PBXProject "BitgreenWallet" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8E8684812872B3500037E6C9 /* Debug */, - 8E8684822872B3500037E6C9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8E8684832872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet Extension (iOS)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8E8684842872B3500037E6C9 /* Debug */, - 8E8684852872B3500037E6C9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8E8684872872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet (iOS)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8E8684882872B3500037E6C9 /* Debug */, - 8E8684892872B3500037E6C9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8E86848A2872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet Extension (macOS)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8E86848B2872B3500037E6C9 /* Debug */, - 8E86848C2872B3500037E6C9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8E86848E2872B3500037E6C9 /* Build configuration list for PBXNativeTarget "BitgreenWallet (macOS)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8E86848F2872B3500037E6C9 /* Debug */, - 8E8684902872B3500037E6C9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 8E8684302872B34D0037E6C9 /* Project object */; -} diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/Mike.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index fdd74a7dfb7713194631f6fc268ba31695d08711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33439 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 diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/rappix.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index dc1c7216978294b61d4f7eca529f29b67f88484d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168731 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 z 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 diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 66da8742bde811d73451580c243f2b504cd45d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53946 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 diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings deleted file mode 100644 index 379adbe..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/project.xcworkspace/xcuserdata/samuelelandi.xcuserdatad/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,18 +0,0 @@ - - - - - BuildLocationStyle - UseAppPreferences - CustomBuildLocationType - RelativeToDerivedData - DerivedDataLocationStyle - Default - IssueFilterStyle - ShowActiveSchemeOnly - LiveSourceIssuesEnabled - - ShowSharedSchemesAutomaticallyEnabled - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme deleted file mode 100644 index 8079f68..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcshareddata/xcschemes/BitgreenWallet (macOS).xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/Mike.xcuserdatad/xcschemes/xcschememanagement.plist b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/Mike.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index a22950d..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/Mike.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - SchemeUserState - - BitgreenWallet (iOS).xcscheme_^#shared#^_ - - orderHint - 1 - - BitgreenWallet (macOS).xcscheme_^#shared#^_ - - orderHint - 0 - - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/rappix.xcuserdatad/xcschemes/xcschememanagement.plist b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/rappix.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 22f78b3..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/rappix.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - SchemeUserState - - BitgreenWallet (iOS).xcscheme_^#shared#^_ - - orderHint - 6 - - BitgreenWallet (macOS).xcscheme_^#shared#^_ - - orderHint - 0 - - CordovaLib.xcscheme_^#shared#^_ - - orderHint - 1 - - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 287e49a..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcodeproj/xcuserdata/samuelelandi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - BitgreenWallet (iOS).xcscheme_^#shared#^_ - - orderHint - 1 - - BitgreenWallet (macOS).xcscheme_^#shared#^_ - - orderHint - 0 - - - SuppressBuildableAutocreation - - 8E8684542872B3500037E6C9 - - primary - - - - - diff --git a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata b/packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index d9debb7..0000000 --- a/packages/browser-wallet-base/src/apple/BitgreenWallet.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/browser-wallet-base/src/apple/Podfile b/packages/browser-wallet-base/src/apple/Podfile deleted file mode 100644 index fb58cde..0000000 --- a/packages/browser-wallet-base/src/apple/Podfile +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' - -platform :ios, '13.0' -use_frameworks! - -# workaround to avoid Xcode caching of Pods that requires -# Product -> Clean Build Folder after new Cordova plugins installed -# Requires CocoaPods 1.6 or newer -install! 'cocoapods', :disable_input_output_paths => true - -def capacitor_pods - pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' - pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' -end - -target 'BitgreenWallet (iOS)' do - capacitor_pods - # Add your Pods here -end - -post_install do |installer| - assertDeploymentTarget(installer) -end diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/100.png deleted file mode 100644 index 38cca5a45dde9a09fccbe45e9939f8480f8599c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3092 zcmV+v4D0iWP)Px=&PhZ;RCr$PoeOYO)fvbC_p#aR=0$)+ozgOx$l+DZ%7 zQly1iXw-s|AkYU4f--`1N~to#ScVxp(}off%A-{@WH1H9Q9G@oB;>Jq@8jOickbTJ z-AxGF$T@r3y?2HgCWO7`p5Ohx?|lF7d}oy^Q#bLsFXu;?i2uO<=Hr#vNECGcz3<`m z_Ius;v_?aJdj4MgPp))7`gtBj$mH=yXU*99UASr>>bB%H!-vuHIiI~gMpj4TfX(A%o(9&}_%tBls^1ye2$isq-#04TR5L)(%DODPgRF-#?S>IWGD=ZLZU?qFNe$G3&b=5O#wPO zHSFI#37zdaR8^Es_MBl&GcaIaCq|BL#<-grFeJYdA%bHlQ2XBV!4;PS2)!BnvULKY zD?oFL2g@J02h9zc&^-p|=c&0A_BN=RiTptwm^Skw<}5gmF-0wCH57o{SPBLf1!BDt zrT`#;Ru4)Re+_{qFLd2ZArNbq7QGPRu!@d$9a%XcELij|=H7n+ou&fXj3YX>#N>Ac zDtIP`wuKOo)r;=DA`lT1kZ6^3PjXX{h=M?~7xykahsDcIqm$x_VD}{z5Spk+MCI-% zblqUC$~2TX3uRz51C8}QJh0>p9(lBuxi4`sg(`-sRiH|>g|MKnnaCN?#npEkhQh3~ ztD8Bx(x z=fmHRj=&rH$Dyl3M}{{70%c!h5gqLw+%WMn*1d291}%k!M0m-73?CK1hF8kj@|YJ8 znshCi3)Nm2fQ==$GmG(fA~4N(DD7E91w@kYv$VwyxQugv8t`=fhfr4;Y!9b6J zzf~7v!^$rsBa?u1doHq40`>Lz?_ufkYP3WY7I*kwD%+Wr@)%;fEV7XGJ4FDorj=Gz zS(=G;t8Yj3$)WIPhhnaaR#%j~QquU`whE33ffF$SL3#tpRZZ;Qe@jfo_%LjK z`Zi?xLvabBy~>*N;5j_@gBk=P3S0g0y&OO+82oP7mzEU+a(w_BUnz&qbtG0Ek^$h& z>OyQ;GZS5%8ngtV(@G9?{QQMVOqo=Vb|Kk%91y;{POb_hsAK4e7L@#|3Yy9OalG$s;3i_>ZHRRp^OHp=L=Zlcrz7nqO8SNV$QK!j&XIY&Sp;O)>^AnS$n&B$Bq) z3;uc$X#V-hM{K|J=_)vh%HTC+&H-&&uyu+>Ludk_tXO+f1aHe#H_nMVih_r zj)E-1P*8U<3$--`xO~ZvtejwcfeHXs6dN!5@ZjS$c=%gq1;!DF{LV86xmr-S^AOsS zvw7DcZh43enKG{WhD_}L-2{{$xB)(YxJN0M5=WmugpIq)k)PisC{q{MV|dj(q)P|M z@9TE_g?~Ln0Wwq*SpatKnuG&;CL%kxTUca8tY|%C$*Q+-@0)^q$*!hbu_Uf`|YtnjJ`ElHu6t4uNDG-*W z8wxTs6HoncHZIf-V#{A!OJhO3H3PTY@o)UB^n^fxQ8FMxmc5kxX(sXj?0IcGUVCW@ zOAwvHroHT4wBl{tci;QMmc2|qktK%Mi6Iq`xMb=M-_YEyJoSmz)tOokRu3R9lGsZrI`?cez_J;q^w?ZpFl!h@B7?jcr2d_6lY_5k+L5hy*Un z2|$SaPA<`~BzWgVOWg=0aEpcg+ zgIyYkISd6XuF#9IZpUGa9n;KO+jx(w+hIu}orHoqt{c{hm1W1Qb~6rsg33P>BkDfR z#_@`gI8jjqO*bsLKcN+YT-UVQKEYGZA7ic3qIwO59i*I$bTZ=l05(y>4(B|CHsaAe zs*VlEi|fC{EP}lR4k&ifZ0+_6Oe_|+6-X)|Bz2d)%(*}nJ?@iS)?nSh8;6SUV(E;y z-VkSjYThINuyPS0TS?Qr9zvGk)l59|#B7{D(^Jc$;67nW9oBBC6qKpQYU*5Ec3c!l z#$|~v2C;So&BUvFC*ai`lY6!!1XTlCLfvoIq37(d@)WbfexPfU}&a(wLtjMDu zDap=7(H&Iwfiw9Y1E^j7? zKZN8&+WzAQ@ZrbVSpU;IQ1_XiwLv(K*dQRZ@p{#!qnJ74Q?UmJ$OOd7L*n1oYvUp; zW!H=Vfd(H=9UF!}{Jt20#!O`Tx=XjVd_(fesIg5bd#M7@3~oIuJ?iPyXP9arww^=> zniX8v&h_DGW!2P>iN?zo2#?2zE8Q|6QFpa!(_eAx%!`7oBPuM)0>p+A4w0zA=dusI zB>jq=W|we06Wx_!NkhF4b00p7B};1r!sr1cbxohn=@-+>*RwaoK0m9u(TlIl`2fpS zzlAWlIMLO@ZVM3yq~v=N9P#HU7LpsIlYeMa!@P&iVZo!dY?mU<2;ZYLdQ@YqhMlVD zSFeibQ>Q~Pf3)y!G&g3#lfp9>$$ha^m0}_%H;9|3e}=gW&*P>E4QPuBkYZujE{mQ0 zF6IzSItQ!0Q^TIEQ`sBI>gPNPA6E%MbW6H7?Q$s^(~RQD^(Y$N%7!AYa!M!ytH z1d#5E7~qxUAZ7b>$6)llUJ(_`zTcG;0HFbiXnjsZo^>d7S?3;|)^d*uR=gOCeE4i2$V zxIkPWlFfi*!*N)M9{YlO>su01Q0PwSS#6pYP^2xc*Oi iGWU0ZBr{6_f9F4c39fzXVJY?i0000~I|-@c#sX|oN6f_yT3 z7={V1HCnw1!^rR_8KdyRKLPR@$KW55+a|-6Si)Pm77U|fYgex@_p)oNu|KtK_jR42 zy_dgjH9x-KimvV=_k~LTbmilEI+fF$cg20>iP*)Ss-l+tp7oN{tFlVfswS#ES6w!z zg&guG<;%+FEXm+i4n~IWjZ;#!QgmOQ5D9iT9&U2EgcR?#@rs|d#p!!b<0=ot=k(bW zCtoi2jOgp(<>@jr4Tr74(qjs2Mes~x1T zu6r4zC@6EUXa$A#!lFJ>->`Ayp6FhS!zSx5a<^^CnaMqS`c~epIO&rsq{@^+lQV$h%q~Is8=F~;mt()xUa!jzD|;SQs=K7n%@rqK5Lffxs8zfC!N`aE z>scyek#3`Ts$-Ae?`djWV%3%I`Q2vin9%bw*)m#l9us48m$m=k3vAd=dF4DdDq2>h zVk=F;(&lDTU7w>I|d z*NKgv0=D;`%*}PP^%=@64R>GCH0!6Q@1y&fUEy_QF&8g+^t|L3AY&H|Jx*qmD~HdO zzTwVQ53ADiv|Hxnld2Q&eZkM%uk7qyG`{k zKa*&CKK4l=YgR_9p?>^LAJ(O*p;L+4ReA zYrQM7bjrrOEhSDhbR^pDj`MiaM}9AoG1hzQ5XmTJuevgEeJh`MUWR?1-10?trEAMg z-aoZ^ynd6;xt)n)!&UuxT1VYW)u~Ta&3uOfe&ktA$EEFk%vTe7TExHL=sv%}J+_L*F+4My8Bu(s|};Ln8MC#lb++rh&Cnit1F|OHTL0JLs_{ZU?y<)CV}h^T z;eFf8|9YSFjHIz+T+0qMOxx(MWo~D!$Z+}+!!7J4V^p0jEt7v{U=F;0y^9xIsKC{O zrzc$)`k0aFjH!iH%n|srX#5k^LE;{M4G-*vbChfF~fAS%QW^>G~GkMsr4>a>J=b5C< zn0#7Y)G$HpyO=GE(I951w-tGT-9|db{J^l9$pFtSU*2;%YUN!g# zT})bFmGrZ8A&I|ZnJmRz2)lc7#@02)lO;h>QZ}25K>(~u8d!o^k(A1I7m7~O!9I9f zn;|y&Wnbv4S7SragVq5i;mgNF)aD z`n1)P1qv5V`JW5v|0AA1ZRLNIV%$jRQ;^3f(?)5li*&-tq><-mCfOf_X0*zI#=Bkp zxVH4hc5U&FVIFLsyTzr+7F93FdPHJS3OX-goRQx~O8mic=P9b;rDI0v1?uBj&F@=Z zUFHhsJ1HuYF~!pdC%ZZF4oMpJv|2uOviD(~gmhAH#S($Zp7hif21ax9EH#+ykYq$5 zu#sD|f4`9UgT4pc#Os=kvXh_TXvDxuXtxXgTKyHCA|7mpKtcVRh93pnGi36+6|^S% z7Y1D(ZJvhR{$PG-lE1@Pwmf8P&tD;77ahXM<{8JIyhzRBaZoxh_@`b%e1CvTOkp;T zaW6Gt|D}$YMHR?*`kIKTUFXdZ#RN9n+_D+ZpMLFy(MQ}JpXZFf@ZXP3+6==L-0v5g zyAG4rZ?=u?iY2+qa;(aVcL`7ajlrG|!rI%j!DO;zE5&G7%HAI)lO_BAgNs>L!CGkf zNy#^(uKZ;uu_|;d_S^0QlO-5>n{gIn547cF;Ov3VYbJ}4a+_|ZfvL@8UZQcFuvrVX zoSiJt|CqfjoPwp3c4^Co8%=uHGEnxO*og3zlm09DBb?L~!N1mYf@2Oz%Xtm?Y~Ae9 zyQ*V@D$MhH7X2BjVQ(T-aT14q{HuN|VsV|FteJse@Eh3tame* z8rX&Xu{$Q~C&wF?4a9Kl;;PBZ^qv7>evPc=U$zn~THdTd+D6hgF3$VQd7P$DFwuQs z^Zt7NV$ku!J#FhIKVB44T&4GFyZ?W1TFO)W9VA>(q{U-05F%$N^TIP<)IzedpPO&Bd-TcDuKY~;g#2~vja9hg~mZ{Bo_LVCY1*?5w8=$@=15`&Z` zii-ziPjzpzvY3(~^nPTs#U5F<5NW$3hY(7X1r*pSJ4 zSuj)E05kLLv)@WG8|j)kS=}K5OM`E!9Z5Wn+5J|A@jn=^aYdY2b#jKlqS!nyA&%AD zL{q1~uTiV5sY@H-CiKc=>xyGnL?>%z$y5-RLYAZ870d`hXdygoR|2^3-N$L5R+VWwo1gz77d8g26vacjBp-Jog_Pg>u#j_@< z3zIR6B{+qtb8>URiYqdQ=_JOieX@TgB0@X{Wb9Z&5wC1sHLteui@)7d4PO|nSp(yh zwVZ`Dr=5PgVX}iTpa#S5vcoa?u~h(U-nugC^Ou0)0cNlb*!!2;iwD)Q+3xYTH2=SU zF+&j&OsfLztv@`J{}v|YfkufLrkyQ`32Y>=p+EFr1RVtLcG}&Qlw*Rg>@#tW1t!vG zy>_zR(J7b!>5seM*B1=->fhE;(QHx8+iAhO>#wLwelMmbfr*Q7icaFp9-9X{CLf|% zcCuFOr$j#=ZvENDRij_6BAT!aoWuA_nXGw?c`;d49*r|%*we~gM<)OLf9DtepZ7HX z^TgkW{NH$NqqX(7EwU3bLnVxaqM^iH)IE=}A_QL^}oC$IZ78uauM zW>4iUN5DekFz0e426i62~*mo;qJ|OtL*)euy z-)wkEcmPmw8h8(aA1Q*FK_&Sr5PGw#LXPLJ>E`tXilZ z4v)1T1hL;PO$BycM<$c}T4Q?=9?Zxz<(`po=EH(s@mNlm)*edjo{f<>jD13omMM@h1DG1-L!om?(}|n0PtT!CKIu++7-f__DTlL zVKszG?GQ#pf0u@EPu^EPX5;PMi8!RJA7&1VzJO{v)U7{03O3QoFTR448?a2Ootv9T zTcC=RP)pkqGh4c#eu%Va$sLUCyXxRtCTBl*siP=+VVxxhISY37vi2Yp{3{P{L)zE= zuGYMdIXJug&cT1`C7Iot50y#yCsZ2~*;Nr`SLoGT=T2q|nW zjf`zEjVKh0odv}eb*~OcahF>CAU17L%>^ngcD7mj=U$utx{9jxkNLGhAtuAwz9HeGF_SR`M9xc-M+L_;z6=?9!Cl*VB>WE9 z2J}CDYz;P^5iyQJnsQXb7G-K29iE{3q(1q@3U_t18W1kadT-Tv?g$T~A-h{?g%#4bv_#Ee05e|x<)hk5Bm`$xPkl2)Ermj%bYrqG z(vJtq^^y2%9{96pd4cmW4Gf@%LsPU5l7Wt)Vdgr?Q;DmzT)4-gPxwuJn<>Ky1!2WA zrdVMD2~Z`K)84sZkD})CtD1pHn?=42f%Bp#g)nXLU@&-H{slBl{IZC6I(E=k7Ob>s zZn6j73%b!;-A4G3TRdZ5Ihmcua->ZjTD0qoz$_LOp z`esrw&x@3<@b&baAf#t+(%tcg{1j|QN9Yhb!(2w!R^}+T?|LGiN!}$(*gq96qbfy$ zW`i4H%X;pGN`r9-ud6t$yma)U=Q26%^k=qOECEmq;(TwTLhR1w?_k}GA$+>f6@OvK zb6D@-!EN3}4OiVE3kXE@VzCj=1xuQqrVt85HeBH>S|&v?!2lR=65aQnEOXeSlYy z@NIk)QdX(wA)I_wN{#y@M+3Y1$rEx}15lS><(GUWSGLDm+iZ~8y&!5Qk_t!*OW`Z3wQf*cXx2LYLm|a&QSSe z06EEE5OVMZWKRsXAZZ3ew&?8&Cg%&;z<$i$w>z)$*5uirq*Vl;Bw?xGtalxsGAH+PkvLg@Itcrx1%zJ=Tv?Wc*GLpU&xwlD7(1 z;A@T~?dS*_qI{VH3g?GEh-UPFVm8~}X26X!$_y_x_FOn5f6&5_Wt(QOUW1xN2s6Ke zSm-lYU>J7gqr#U(WzCy4Y;)j*?cjum zC2i@fQdrA9PqR^2=!?zuFCNa{zGwK-QYq&$GG(o%@(2slpT#{1VN`80~BMp9jk=84@fxZcTzI}G1BneNLpj|?FJw|G9>&2 z03f5fSE`0L4%8lto+b`rrCDbzl@HQCV}HnItf}d8Ou?OVd6%9P4JSWccFvF1x77cJ zKK~;~I7G#ykFU7G2Sx4!9|9UzJq~oVwp?lvFpf`GoH^#Z@VoZdGB~Ml5NE4!{@AgO z6E$v^P52cqq=a-n)4ld55@K0&Sp^TO(5&&{Xy6217*1 zt5DHwYi4Q(XV8mp6QoTMkdTa?(HSe0z+`hk(FBg~7CmLf0Bbnqxx~VN?#~h~b`o@s z8cWco-?WslB8eB1J5f;b!OIZM>&CMR#gu#561j! zsplT~v|mi()(@xlrz^s)t)Bdhw9h*l$XSpDQn0MZ<$F~^0~v?caPsuiUrm`}dnkP`DMg^& zojecpa@TS!+>|Z>hJev8ZLv@VeGl48&hC4k^A9szrezDJxk68nguep!d<;Y&3jdNA zqQ~Nl@MR({whW)M*C1MmTaiqh?e=%ve!CiJIL)b$o4=^hQdwB3}Nv~_9-Ud_;NP+qB>dGZrtj7J!!2;n-Wru&9j!1CG zhvlzgtVr-sybyqt;9s1n#A|V$>^-})`)B`&5323$U3`zXRpw4<%CD|HQzO~X_NV>& zL)ai=qgQs_r-!C-4ru+@I#$F;{Kf+rJ|(cJcu|0ZAp}j1I!NF!xElz(Ac@l}ER+CC zspWp&)^MW9<3ypB&hDg2kIP<;V+YH1AD6VRjXDeKhsA73t=d7otwF3`FGpRqM4z=z zD*d=Uw;MvfV@9f*k3Qe9&^70QSRqt1OoX{VGC!YChu@Ax87%afAt;SbIoSplw5ca6h@y*toz}4i#e==Dix*dV3Qdq``;6$F~gf;sQ3Hk^bI_D1gYM(`9##tcA1 zfzet?Xxl&+cG5Gh{XF>;P!St;re^!Jj=c z;@8k~`tf`#>43pQQ>5!kL?|?CNVpv4O@6i;t59pv2{`r>ruwxPGM^5-@|5KaoD3mS zNq`n7%Y#C$6DWC2%MfHwGc=sRs0W&gd3w^}A&tF0ReOwH&8@f3|DZqmVPL8&8KTVt zP)g~kP$EGINWm^hn?scBOl2I_-~=|MiQb!~?e~0>7kHgIUb7Fyhft!aO*y75u~PaV zXTCr|XW4qLf2TngSEtcJb&K>76Yh14g`$emdvhUk8w589%IR&to;?f z`4i4OyO@lf1g)nKDolB1MulWm-0MeSR72|J_V|p;ZxZ=m{}@$k({q`Q(i|C@+Rv5% zN`cElAQp7&5->+*-3$s1aVL=BMoQa?(P?Km=c2uoeEp9u33t5^SMZ6XQZ@%g2et{o zF+=uS+qAG#*%3vGB>_l1*xb#BPLPLY)i?Ef`Sl)Qejcod#8|EPZt!ZgBXz#d^E5CM z5fUEHKftpID;X-$ok7CSQoZO7e#XV5Sm(W_&|SkHEQEc`8p&Jy55`dvp_f49gHZYF z+JR|y(eK@`?^P85+!G}~eIqGvDIX>(ziqb|-DN#MO1%b8;EK$OGl=xtN^(#ERWKsd z%yH`_V2SAGFhTZf7;I^tN6+)6UkFJUZE+;p^aV=+ms!QD^Hp2wQ>3O4ru{EoIH z_#Y+0|13x_1}Nb;Co!OlG4NB*^HTYHl@lC5Jw*N8JN>{<(f+Mtvj|(wx}w*l#BgxM z0SkEJv1hn0|NPE?*tCoBaM*un$DhmS;C3ar^jsDWBOdBcyNIz~QsI;rR{hev|K`~j@abf0(eIUev_|^xmw6;Dgu{Ru9sHm;;SI!_ zEZ>kR2WNLCt11XZ`)BiPUdytV*OzFoPP2AB5DBQILn`Re>nW4ZPHk3wBxbyFTNT*v zn^zyn5W8N3luz@a7_Sb@Z!E@Rr@x@C67C~-nHvUY|9%$kEBU@l{ zczL;FTCqX+io<$JF#S z(;z8= zIL962!=Z}1RTuLq8;3i2uq`H6)`&V13814pTMkZ7jqE>qW@>(PU8Y8m%_g<}bZdt4KN#6g+hGx1IY##?%j)%D*^nYV3kpe_bNg)%!=_JaI_wA-7FjPy-+tK*L5DGdfy9e zW%XwJ(cFN^_yVcn z3)$OCQ5YdoX9Gx`wMhD(?)SR2rWJO+?%G`D@d(*cF7&iW^Fm=E+Ii+CM!#{`LY;&w zlQ-mLDQ1sER*2eG-lmo74u5iS9Mk-7okcE*eKmgKIR2A+Wl&iP`dvl?Bi-(&HJvt5 zennuwfXMs7VD{%%K&Ceb)EH;Z`Sw-#R4?VoviGY{)l;xz#% z?$q11Z${Y;i17+!JEDZyh{{;q5v3=wn9)sT&vy=m+;QpgRK4Hfh&ow(HQ~vyY9*z5 zDT7~OVi9fNNAlzRs>EXLIC{MXrr}TleZWV^D&iP4*Fay+$+q$I1fkh#P*>Biut;%R z5jriI(I?4Ouhdua&psQ%6axdsa6Sm;xCwF?Y)A`-feK;UyVI?A&)N@kShaQ> zgcOG|n;-79)5To4c@;Am4x4cQ!{V69{xrGE7|VmabR_Y5@>J}jTQa;PozGnq%NVJn zgU>NVJ||X37gkQ^Wu18S;gvA=XWX2660_`08`OC=coYw2--1vUbz&2j0uctgTCx5E zcPQR#NVVhSa2|Kd=#+BQ^zf_V`ZH`>QU`hhvJXRkdN1inRioF`hdS`E@wgL4sA$+X zi+D1nns!CM$84Z;#8PP?c~2TwQ%<)pP{yb71UxsLZ-GA#hc1wBPT8KsI?^S8rDM_t zs6<5;Sr+pQ5*K&P&W|k-o%wE$v*svP{Oq_stOUuD|D#@wYZ&VaylC!`RhmG*5OH}# zc?N^7$!dJhMd^F7mT8QI*Xpt?uKvwEY9|=o_*sCo!2dnnN(vpRw#HZ?#6m+1iuVC3 zJ*!ipxcKBJ)3(^m^cucj+Dn9J5)0UfN6uqBn4tTc8I)Z_jkQZ}1fY`@B>m*)&XsQ~ z@=mV$>3lYTZiq1FM~s~$#$k42F86HvXx^cAKJ0@bld+7HXTpblUmpTlq@yk84)@Ke z4n3DSuYcr}zkVWzB=UwAD=gp|oG%i=tQ5WlM$*WLgpf(aF=5THBAt0|8rM$RNkMrNzFV!9t+wH=8nY*`S z*E*$=EXElUrzn!!crhS)EWLKGs#1v)1D1?Yl|b9vQ^4) zAvO@C2l|8}0rc<4(DlUV+9D+9vBfaY?HbfK%AFT|~%sJ~>ndLNB{4&=ErDyXXR*f%Q3?M~t>hr9HfD75j zs>}2C94M}4wv8ecp(^Q&~B~m*h4=;%g^zE$13tT`ESe=7k zTaH_a1hhPET237n&Q%Dwp$S28r}ALw)(ZzgB`;UqRms`=OE_BG}-6#TT^Y-cbpb@+SUE}J`M_-XJ2qR#AY z>K7uD`?9dhavj@`)IXH&YA9uP}h4pAW$Cgz`%hG>*?zt z!3%dvcf{`zhkNgBLKgKY-ORU=+t;x-f4IZ9s$g`7qY5LQ>7Xfx53YbxPK@)d=RPD@p_XeQe$cMTk;=#vxkQl9EU^GJo^A*rF zLzqe_yZjWxlqYE2fK;CK(Uk#R26+QN2U7#=h6Ze3ann@?V&3^ikHx%GwGeFvs+b+H zEOjQn40OIHBQx9piVYKTkm;!Ko9Nz_0F}`+6Z|kWcp8LebMRvy0|X1oVAujR#yTv8 zb~P{mJ{1Ps)6Ua3o{pFL%}@uIwTkr+XFhRJ#$fJlo}BzTm68+iD*hu-Y{Auc;SJm~ zK3r6Tmz?ETlQ^Z2Xn%gcja0J!K-49M0>p5?wz!4x7Pn?*_S&RIPg4N2^E|NPk2slTQD-S10YO5qjCml}a z&}bB5RmtC};+Mx1bUjoc?TqupkZrO>Sk$T59Io^2bwVqd93Zcl8wnI&oJXiQTCo51 zoZHq}SE;n-OPtkHu;{V={g$&&GRW{y%2hT3foQQx_3ydHTNlCj)J{LHs?@cAzFhcetoF!akveQ^%VZ=X&tjc zayMARmon%3h^s5YeWr8iZAaTy7OgV_ubKnO-ji@gay7dc-m%>CQza6p0&7@dWHulM zp2Nv>jTsEKD*SkT!TWiXFHkPOxK(Tk&62Dzo}l3|IAy^?eRK@8%MfA`{9{jIEJ1iR zFEK*3Lu#>WkI5C_2m9ugLD&n22hFZJ^p0>2w<~pzATC9i1ytyX%p9qo)(7i_R z(388fA{e=FwXcu!SJ?NdZ4T|x%lU@KdVSk=$DR8Vr3E<{#qa!%wl|%iB1cA=BbG`Y zfDU&hNKB0~jvA|mf}YazuG`LqquU|XS&~<-cY8TbJ_HtRGEwY`?hgm-h91fSpFeFu zg($TL3b~T|9yS83TyQ-@wcA@2;T218$YY_#-|JgrzeIEMEE2u~bD)fujiF}AVK7p| zy3Rk4m3LjIyqnUq37+vP%|@J+3mP|6xuq5IM}`eP%>9v*G^{Y^jz!9TcxgQ!HXr`G zG3+-i>kfD@O3!9aB-g*MEDl5tRLjz#gO|wOz@|2@Rn$b2G^hEzenvZf4ukY{A!`L1 zV9Ixxa(=rs6okhc)>jD-3Y_!VDi)qzas@1BuJKfOHO30UYe%fe$pF)cz=~!b47vc& zC*+6@i{K0yY<`GVkIg(c5HzP4CLTR1Wrc|c9LnBGD)H5k10Yxg(p1Hjh!S<;6Swb8 z@8B+PVg)$e)PuZJOj3GOj@kHzYfN$3jJXWI(c$sE_1d|8LBplROQGWgko}(QC*cTk zJ_XK+i@2c(d8?Um#;EC1+KTaW!;fyRees`Z3S9JVq7?hIB8*HW$Fz#Sq zZ4p%o-fR@NEePrPzc&L;6uKr-^8(Q8(7xsaOgMl?XE-+oleagut+Wr{DG&V?N+3Ie zP~Qy>u&8D;N~eaD&3xB5h~Tde=Dklmu?5JK9CSLlg_1^W1$dT!&pUPG3#1SjczG4G zF&b42C0-Z&Mrwk!_l>y?zFKDUZ<3IXWx*Q`y4G%mF7o^{tMNnIV`VhYS)IV;nI;dJ2@4^Y>G*5PHcqPM+LiDgUJY9d1+I zl|Yat3}C&XLpI=N;E?QAl6H1lSC$mT#DOXV$chl`Q!eY^S+p@*w%2r~Gq2I(z&KSP zB=2ccHY*-5VaoM-7I=rXMyR&YC3X22GPM=y7OCj&bTJ@@O3m-DA> zLZ!5{pDgDjiMfs|_C0kIRS8tiDCKYw#8$>#yznP<-{Kpb?TXAf0M;Q|k>>0S*aznk z;Hq?jsojrHkV2;M2YVs+^??KKusz5kZvp||u3gcKT(v1F9sg3{d0&P0Z$q*bb_E4e zn$adsJhnD%{X4QZ5bDiGk7=F*txWiB4_kSv`3UM824sL1)w?xkoU055q!_eeHgFVS zk7GP=KNOSVZ-tDS9mgQ?MBfGYxC#Orw8Z@)oH?EzTdDf`-YWMO+Ri574?)>>{0Pqa zMLU5QuTw@|vD_M_`e^m-S{M$&`?qmLP%?1(MFU$Ec&qp931a0QsP4Vz_fr<&g^7(HFpGCyikfc>JuN)Q7(Ks1(AS2DrK9DcL1ZOK%5A=@obDKy*uI%X8asZa*;5 zWdWz2T0x3P1Yd73d15Sr5e-2Rj;}a9Rm9PlO`$H&$xsH0S$Slz=5hX=Gj)80+-R$< zcp-SePgA^+Uz26MLnB$*0#>WKijjo`-sj&oC^c>#CI$=;&Xw1@bk$j7{Jvg?4tTZp zcov-aXE!AP)%FW_q zD|*F1J#-wgQK=)vXYE?am`=N(1IiE95=_L!tD4W1VL11&1*gNbjS}GBRF%0oCD-4I zl(M1yI6^hT_%X}tQ##Aytsw74M9)Py0jO;BcfV!Oomq{tJa%5~J_P?Rd$X|YG2eLK z2TZKZOD93|4Y)3O;#KlzuYVAIv4NejupX$ZUJfUGNryT!oE-%zi7mNkD^HRERxgX0 zz!a|&0Sr35j&OrMyj5_y$H`B2*-|f$^K9kO-tG{n%5d0*#*&}9VYwm*Nm&YLY5X3T{jj1yj(@6axE6DY&PN`T(q^yjJjkkxWu4=|G@AFfk{9 z0~K4GwFz08 zD#0b~v4|qO(p=Uter}tSfG-|;eDRG!xd`~>q!2_MK{EUf%m^B(gkth3yVU7q$K0;z zyye;V6ak!rI*Q{CIUaOxf$R9;q8Ri$3IwW`uDQrf8)#Z4X9<1_x{>6$anN0;uzm0xBr;?b4LZPvCLZ~6 zQK;JZ1#REISFro2987Ojc$`rwVG&bUB2DtO893y5E6!cJ0L~WiS$A)trXMluksX@{ zDmDuT0{*0GgK>%Ii2fQ-Yy^eLTZ{u6HU2j$C__gF7Y3mxuX^YiL{vLgFQa#QXf^4S=K8I*fI$ zYAA5CwOwMHx8ZXYHdJPMe+Dg`^Q;&;OrO>)gSMADge|;!lBNb(or?y?OK|y6(M#~6 z`?8Ofqvj?>o<+HQp#GvIyZ|~w_6AXU+2#?=)V|jv4V|Sr7`r-w5x?Xg__`6(9-QR{Aim11&Z@nhC(`YsBfiY?K6OV~lf3a3esN*)(w?V^En2s~O8nwzza}q%?;K=;_i=5_ z=q37}Ae8&Az69H(lB`H!jI7;az)>IC1GR& zoG&_x_;Hu8*-?8`Bi^!Bpmlf!P`3^{kMe?%CFQjQ%TcD zYhF$;xe}n55>F0pU~+a5D*AH6m0N&vq%o_oxYG)LUvE3(u?Bl!Wb@BMMsDn4^t`&LSi#8xPk&b}jx zKD`6x&YhLM5}KiYHIw|b^*Sr@%L6a$OF>drFohVa2tQB<*T)L%19s&Z@v3K0GlrohBZhO1+ppO0lN%9| zoN+4d>V&$@j5C7Ds|V`8lDz9SBCOSfkXIX8RUjOFpjT@;ir8~DC=wM^v7CP4X*fN^ zEt=3ifkwo_(SxQ&NL4}I9>SbT3hyZ6=Z@|lJnJ;R9-LXU%VQk31U1^F@@gXhAU40^ z!jWwTqD}haj$_to8wtqCgFy4dAK%?WbeX~@mvqaa&yY4tq8KtU0!rS|a7dPuR&41t0*e6t)C5k#)VvDQ^0;pZt! zdkYK^u08XfO6@!{*41aQn>>W_JVS-}e;C3HcoEISvZwN-3q8;(l)f~_c@FZca|6uHE7vsTgYE1MERl75ZSotqe zHpz8lfv$&Ll)}Q?9syc*1Xgk6Ya2MV0wTH1K*r5 z;KQDO$R$%s;Q>HX3Wh|1Cd1Cn64v8P*9~bifn8uZ+wnl{{U5HYH{`ZPUx-a^oymi3 z^W+Rtzkr*6apToTBf2+|6@6%i1)YSa{`M^geneJnfJXc!hjPeSBGSjJ4tdkq8dz4# zv1HK~Ht5t|3~4b7#hM>-?wm_M4$W%SpCuNhr=ZU0h#yv0_1KCaItM{`_(KpO6ty74 zpEJynl8bcy%vstx(Y`Y~@0cb8&VTy}7HHHzg*SgowHf<<9 zlHFOCXs|815lZnuc%Fh^3Ln0f2qtTVlNy15x2pfz)WIKPTD?B@I9x!!0Qv^~=h%4v zxpo3^e(eGk(HOwi--MTmFJGFs@NMJFxcw86O~m3hBt1h=953W1wsEa%Ybz*W7<9 z8kb<-g{2YQD2^MDBpnZ3l{<~GtjGHgo3#{9-MJRqiW+mvJ?ni-7penyirN~7-Wftu zV+!G|dN2)WMO(<@Kirnk+1EPX-IxN6WQgXn-mwnm2>!r;*(5^vthuhxf-qBTpiAuB zaY&mCEiJBn{nZOJ`)#8+c!NZ+g`E8{g*2nhXkkWft`>lUdE@Qe#6_}(AyL%%Rf*e!xD!`jFU8(cn!A~AoMR>-A#nTFEOvDL6Wq&ey{0rx#go?>mp-J`nJxm;!1|d4X+v}BTHd{ z_l}t4K%X@7k3ENCHBUjp%nz-~H&my;v}RYn_k26HQ0{8L{mKo*(2x`BNh-{mzA|*- zVK^D-0dGsR{>JL*^+BLmPBP^teiXAOSrhFy!CD9#C_*zGUCZPl?E$9=NoV2thX~f= z_ZkXF{RSl1I0Hmw$)YmpYNxvZ;+0Wsyu|zL89`G|(5W}$wVvhsPGJOZ+bH%g*hz!l zHU>uPWuk+9kN*su&Zls_&c=JVS_gI4%0ZB>p7sD#^dr)#i+a$Nhvuyz?^FPrx91dh ze_z&vafmd64GpXev7itrb=H&e7Vu&FLqci*IWpqJaLXbeHa!&1zy4gye7rwRdL3AT zWONjjCJliJJcaW=Z2-)FLJfGW9GFdLxL$F>TdxX@kf*}CQ(M}M(1-O9A0Di~2D&pD zmw$)wtl2YOxq>2Q*sdQik3j#0g2C_ts*Jt_mgAINv+G}Sd#`qkalH=#Q$A_E z$R~VjE{BGT5FTji69?)+KW}NxVda)6|3e*y+v`|ATO<--aMYU)_P9b!lZDU*IFPIl z_gx{2yyn$a+i9=$(I3ck0rfK8AfC1 zi+)A0rU5}lyLQ-uanfF10s>ff8?p+oY6#G z;oqk0=KL5rxUDP;5(j;WEr$E~pGr70bz*^+jy{Bj?i&7)=RcECRiCA$^p0;Ltb{rC z0(wOEgM%Ad2K6bGaA4GPiSMbqRO{~npENQ-BYjqQ0sXUxx4esS-f&X|eynCPP?d_Y z`#Q@3GPXoa!MUY_E^61uIxI{%pSWd2o5Fh7#??|Z8L3WW#1e+jz5&foH_IN3)*lHS z9($hRImo@j^iX9W@4%RH3L4WH+lVK(x0M46&`0*~D=ldFaK^S$Z@XzRu)5b5eS8Gp zu>!Avuu?R!0LyTm@3f3Oq|(_@+|C!^>vz}r)qcNaz|=%lQ^6a96LHW6Uu}kzt=VPd z8u&>OT-7dHXXMj5J>7-$`fe^UXvX3N{T8Gzfrbwh5^-i$@=kqJE7rdWaLfJRIr~Io zHy3p)%a z2WZD!o}k2`;a)9;&J^xkdFL8G2peBt5o{R^A`(4hdF(%bR;o8eGu#iq>W<_hhihS_ z5Y*L~M*xk#M~aC21Z?G`@wW8)KXHXhBj;P}wrml%@jLbb&M6 zQ7vKTu1j|HgX8M0V{ z6+t>l#@4^RxKo7glFZZ@t1&rl%6)to@ybOI-HOyIK)~Z&wqi1xfy$w&=%Tc`7;epw z9w6(o;9_4xrS*ppnxhz9^LvY7TeZtaw_P6cEZr78=1J~IfzCmAaoF)k5RWes_=d_{ ztB|#5x;45l!0XWcz~MC|UeRNQC1jLMvX~gh3$}EF*iyrQ?n2fso}lO`skfusI`8Ty zNDlSrk27$ops3%V6;6l{l+g3ydsL+vX1+)2P!_aKDlc{9B=^I)^o(r%{I^auY0^Uf z(s+rWAGNiy!3^}7z23;|rY_<9W&N7Fw0Xjf5F95u20ihbiqPHdJ^042D^JUBBtDVr zS-W!IgWQ3LoTi8T`^4`X0|^g+(5`CVb*d#fprganV~NivJQGt}-mBF<+CLM#^a#9R zz~}bLzsTcX4(R26P3V42fi3LoH|-^h0xYOh%OJ+D+z_Yhi_MPy_mfC|ka70hi~P6} zY$=-z1D+=!$@A*8w{uFj`L}uCcL@Nme~ZHi1izb));AM}AHdFlJ{l$L=2IzA1?7p( z+6TQvv=@e)W887lANWnS{b-5|ei}|#^uQHY$OoZol8iASR&rvlq;`B>T1+o2~Nh|H2xGy+L*_$-hm_?rp+eOv^D=gP(zKiqE6QyQF~T_ z>YiI}gCbh6RP*-aJY>~E*5117+GJ)nffkd4) z9i9k4HpZU1K81|8z^dM(dLP(_W6a?(x8_F+|DBiq7dC;Ltd(89G)HJBf96Bou|2C{ zr56oscv%b3S@x}mAvM~I6~B76<-+&F(szN2d~vr-(wJ@lQbd^ute@i591UY6>}Ze_ zL53{dkcEL-3gYM4QSpN z>|?0PRzoqA398OgnT5Vr7(wxB3{W`>%?eu}&OJJm2Q>pk2EW^WWi!r(_8_)|=QsUZdu*W*=@T4=0pxPXWaS(6P`l|oN%-~iH`^uu&Lp{Og7y$Y zrWj!L@Y=*COA{vN2!xC+AgERFXw-ZHixS|0Uz1wG;n#^NqCbCqP0mgJY>c}5<^+6= zMktvpd4fH#_u&aOemCJKN1AC+ZzO@p}IK{a=80o+^ z1|@WuY^@JnY4DL@kJ>EiYEXkycP03c8t5keB@}zb9gR%_O z*xy$Sg*uLYdeJO2eNaJZZcD53%SU8xC>4t~VuI(HqvfTNEWf*%C?z4OCSQrlNX?Y-k(eE*30BV6Ba`_py0TdLvgaUEN z;we`u{FN_CAU3}Bsl5LI{4A0C$PO#(SZlL*lwt;5$3)w2L5Q6eD#rVd!-gGX-c7l$1gV=h!@9w~t zL3!Ad@-Q6P^L0M);wh+cMePu^69p<6xN5=BZDah8?>@2j;?UA_99)Y}nmTxTb{cRFRVCpf}ZeUEM$uN*jvmVyK&Q$vGGi2n=m05NuM3ikfgA{!cAmZb` z?=Y+J19wH22UoTg1v{IsVn!Q5Vmm&SnxOD`0w!%=gBLo?KRzqE`9SzA7;pB8Q!GK< zW?EJIH==_wU=P@E8e2(3TTV1*=rUI-6}~pxdL`)J31T=VZ%wmmKGfX~A2QjL_-P*; z@@+L(Ix!}E0G^jvb$~edmA?*t%Y!mt@{QKQk~XE68q@iqfosSq7rONa9y{6ZnLAZ- zE!~QknJd)do=fU3UY|LyXGaZinzreheLFN!7gYcmJ}9wJ0keKkqKS>RBwwN#8357h zf4|!5>T79@Fvd^{4(gppxQWdvFc_E za-$^Vzv~7%t3M);qT&7Xx}eA9!EtU941+gm=J@XqsC|L(1CC~1>&Lawe_dEcO3d*} z)R>~ev$ZSZP+c5lj~i42YV|XiVo#4aj$@O6oPB!+7~+HR=H;Q&@(Fy+E{ve5BuQa% z4^pml{Mgq(u3&y?)^0C~L%O`H2fl?!LbnLzt`WPE#5nAO21ErQ%d0tF{H5~%HG_|{ z71F>QPHA@)cP81oLm6w%U8fEm7AP?cttqk9W=Zk{(d+A?tG?b~X@pRtt30p~@4t1vF!>Ay{n?kkwDGx@39ULGT zFkwKE(R^^=+7-qgut(f9x?E%fj9(^S@=V@ZM=3e`I2oV|h>=K3&l9^iA9D8*rN@#@ z!M_RXf7#EJT;e-1u9_cl4P`qzN?jph2F|Nk(~k=RV4@C&4`v-J z^GIH8MRNb#{($T%sV0R9z-KvJuZtc~Eg9#*-!GN4W+ZyeklzwApUD7dG2;t^8r9E0q$v`@2)`9q*950 z#hHoF3kP44=p$Cx7xQ)+RGjPBUUN9k(Nz*-&^XGJkpuv3>y;{>hYh!upy)H+I{y^@ z#hFhHEHla8TE9!z{?>zTEZ}ADra|x1MBmsS?C~^y3hAnIZXjt9(Gmk=a4?4-3JqYO z7v(S1FN3cE+SV4*bOLc%FwssU13?gt!J$MDrattp@hOI8GP+FA$n#NchgEK7O9eWc zJ2otGUl0f$i!%i9!3QwrKi*7UDT0r*-3vtR2m2P#VcKuJW{8|2KE$Asw@1QoD#5&jA#^|XL7SOk^f#>;o zSa}WiPLo?m_LX-aieWPw=n1%U?;w~~6#)QM&2REW@I=x;;axO4ln=DVRb7WYhJzC< zOGJDn)H#l;Ac&rP1kDl%(}1#l;bH(PfWP`=S3S+nr=?bH|Jry;F^TBI3=R4<$FbrG zG_Tm7cp^LAA&S1)0ncg7&;?FGkUxWuy*#!FD@{)Z{#TZ2vW*{GRB3=YoCH5(gx=EZ z*mEr$gD(aHH7V>mnbZ9!{(B7BrAz|5`xIAhe|=rKNn zJfMYXuSQ@KI%0Qij}5>*6#&So03c^oW#`7>fQ(g8HN34jF{V`t{~rgAYuRmIx$tp@ zRaRI^sYJ{ShQlSaoq8=mgIf3pw%8>GPLz`$$0_Q8lbmL(eh6+#fd8|L%FAU9(A}|36U!~HxH^>(m26#Ri3h9FmWOyoa0ymlV(mdF# zxABmZTO+QuO!f0bCxqq1U@#gY7Jy>&Jc0F{KNs7LnD$@OfC))~>rnzW#_em@Dt+`l zcgjG=>!&L_$iAoIQ$uB!NTvu+yD}ge)wjl*dLm!iQDOCs8B=;^bnRZ*Giy)f(z9#q zm#nlk^L4xsC~2~eZe1u{s;2k3=ktZo(3~@&9mYegoUI)_ z#)kBU*0hq2E|;l&!K5*KrGtu>uMEmjpD`66jyWO%%;`G?kW!OF?UQKVsDPTmF#fS4 zVfWWwFU&c3I7&15$ye}0K!{^3)f3^JaQqG;0ZTDd<>m7;e#{yyvHBnU*zhBDDTgN99Y;UnorJ2Q!Z+Ph_M3 z``EHG-9a*}u%=_@3cMi;uw3Pf8aL!xPDg~1T10D4h|B;sk$VC6DT6D5n?%RmrYv)P z;PqK*a#o63;o?0G1()*#gZk-iM{?rAvs}>$2zkTii8o(m26;&PMB6AkYc80~Pi0-h z8XFdMoe16ULgacWqeF?mo?OYm)>}zi>LQ4wh*mls)}l`_peEK7dPjV575p|G6LA_4 zaUrn#jELQ5d{^gdve?qRWU@e|?lZdE>5k zD^nx7FVBr~0FPH6EC%Oi^P!5~2CyM$XhW;+MlkUbxpCCQMzZO>L*0>$r&?4$R)EfX zune}cVS>i&82Cq%wMb!Xzk3E0K{ZWS@7{5U?C*{1URYD6JqaDk{H?^6p#nsib3O$U zZ+b<5*=4=`?fmJnZojJ9&qPi1k`!8`;tf?a{g%eUsEun3F_rObp0+Io z2e;@1kzkORGtaiVxcJMlX?^dSyZk-s>pr%uQJ_%6$G#hfBG#!U-MWp4jVL@lFO0TA z6nI)uHPoVIh(iyVa0RSo50-)<=(ZI~JL8HcaLb|Q(n&DT9w0~*h|7zSfY zQ`IOb=HQn=LM31zVNuR%a6Zw`g?}up<3t4I%UPb>lgnH@6c*M}lK&buYj>*bJ#De_a{ZUANjT7f96 zzDFE~}-;5!GvLj(@gXQg?8WUKVIxC=a8g>BXcPAV-L zAY%Q${+WJq_&z8oRxN`!xdU1Cp>_Tzz~-fyh~&y zfJ9~PL>JiuB6!^`vgfjT@wZ;T&s(%-r&L@>1ADMn`9ZhPdGXh)2DLYT{PI%%Lc*SZ zB?FqoW>TV2*|bqgWR|pB_^(SY?D?8Bi{G~O7q*~jzkkC`^(S!Hu~vfIon(wRS!Xoq3X8zNU~@$4f}=KOKsgO=f1gzF8zLuJg@$F@qNIif zP;$MHiu|7k#~LgNDx~zx%4*gvmFt&ALx9@_0e{;fVcqkn6Mkgq6BH7n|_1zKa z8_`qUUn@v+YdrsCQ=?EYlp6FgPie(!FgKm(5Ds0ac`5JGxF}ffLy=$x2B+uIkI$(6 z#7XEGIO$@LQ(w50U;gJ2@E3^-&|(@c2`L)pW%`XzaQ3ijKf4d^O(1n!CmA4DO2G^O z%@iDskyWYittx7c#^njWS6-^vU;$}oTPY5tgGv^8(a57dE8RhzIQmVeE<-UI+&%Q# zpO7is8*c}-0hn3PsiQb;hbShC_hll#U8a_h6Z%g&q*b%Fg=}%z*mlgJu96?l>7h)= zc|c2~r%EF=sgwlJN^T-e9dYUm(CohSoJ_v5x4K|np)i>q+L-E|qv`Fwq0?tS4q7rn zkTSuxZV>UY!Q~xTBV}f_&D!merEad?cQ0`pNr!(0z$eef!Zh#0?R4>jtk#4V*h3yQ z2)Ss(%Z8oRi{*EwFDko(iR}56r$* zcBtDy9sG#E86p!mHTe*jxS`aVfyRxUb$vU0eTlu6Cc6g1&XqlIOyRx(2Ct9zM=>^n zU@DryN-vme!ka4+vAMxnw`32Q5i7~^&ubqFn3)1jTkeV8F$?hLkd|r{{fuIs$L{|w zWZ%m)RIRqqWX0=Kw8`ziyvph9C4-h6w%`(ORDBQx=@dYwnpTJeVTrBZ&y@=tukjwtlAEy(Yk7^F@ zR}WRin=Az8*v;Jrxa(QbQDNO1y%D?zEx%?#T7Qmj_|k}h-hzTLJG--}@|^nX{=*mg z=s1vztEtQ9UW305ip;xBw52)&<`zR2u%B$wL2o^ ztKFwP-D#O=;XqneEsfGPghGIX)im$-v^^7qQ1`BR?9(|3nSE9FyIuPcu3mlqk%N{3Ey;FK`LRf2c?VF*koh@VI4wkw(M$1Qhx-B&B z&b><-2mU#geq67}11YRFpB#Hs*kT6y4X=XAz2EzXKYi5(sAkXUY>Q1#>UQt%R5xiZ zO!?5q?6%le*%$P??p;V|&I1uS{@UAq(v(!u1nb(iHq%TLt+a=l0(dy$^_z?nd#B&vnS|8a~IM?msRk+@M1RR-jZVAT;E7(_> z+s}ao23o7cp2SLet7TFVKE-kHdE8mHER8;WCYZBK=!wNnq+Yj)i&mVblJhVOiarkzUu0+7CZ@K>JEXy^-_>~5IW+)pl8~MaKUt* zQL6`;bq!7?P+kSui4-@mjafyB5%xm|@qh)yXI#YjHLUnhxR)EE zxv)L-(a^z{IJj^^ddnDO;IRLe({yLU4QZ;>-Q(DwvKB!)DG8=s85oYhfJfZ8;rvXq z67VftMJ|(2y37 zvG-crV}-A!5n}^4pNAqFh1zdyJ>kA2s|_(StNGQ--de7MB(M!walTuCy2RF57Axbxb=P*N!msCTQ%+zJqG+5uPMxfLYssdpuEoCm8=d5|4XXi03vCP3?7?&lu-2W)RAk8QqXY3Ruuq=bo@++sL zw^QQ@b$qX2*jOu3{Bt$su0WKx~CAu&5kz# z&RhoC7s|TgpaBCePs?P z>&CEnQ~;RFJ1BlKES~9#7c^%OgL^hxLgV$(r~r7RO|J8MeeQ2Ncykf!#0R?%h@ zqjT%VlMSf8TxtDEh5<0%O^`Ab$Z^P?QT3J6(mn8?zU*r1Nj6;kRq)X%+JhK0pRyVI z6?MSsup3rJc;h~&0v=>w6W;dNML2EcRQSbz?0mS6t*pK{=a*p0l|FREloAG`?pZTn(MC*1jxpM?k7 z3bJ$`UkIWnYQ(s8_kDV+qER*20g4jt=CV7@hoz|8Ph(D-UH@1+8-iE#cd(h>X$4@> zi&XY2<~Q}?1YRlWsUR^eYreG#YQ3M?i-doDq*voj1m$=@7m94n8fukEXA+I?% ztOoD;t97R}T=4|aFOvsaFjB0DX+jm*ff^jyra|?SH8j87e?9__eIZ0W62J;x9}s}Q zps+&0Dt*W|tg{i@7AtfdaAu2-j-56-y@8xWRAoTzouOJkFoJN`(?wmMB3>Qj$caeC zV*kMNl;UprypJpu$bqo^;86pit~0>+GjW$;Y{LaS#cBMqhjkro!nL0hL$FiAeh*)v z`2;#COWg|`JY;tV5l=98YM1oh0-}^VdiHC zjL$;rjVe|S!(?}%fk~%&sOD|J3dhk-Lg~7;U2^cfpwqJybTB{N3hl9OI)7?tI~WDK zpVvfSZRA4DAA|1Rmd%uk*AK1-azP3;d-H5}xE4$_NxumYG)M9k$=B&?C}3g%_>+4_ zAFf6aN#M)uz#6<;dT|X?pq2pI|65`YSSkvOuztn3H|+Z6E6mKI!eZg(UI%;Fy&&MZ zsk$Z0p@IMyJ{7nm=-Y{98QJ8kLbtDL_|5n1XMs>#z@dJ2y^{`a4Q#KgL2e+`tIXMr zEBMERHv`wf?eaqaGZ|J_I~ntS23gxT-}wx*uwZ1SkpX>=rv-=gt^rqPiEn4zD(}fq z7NZ~U(vFLA^i_Zc8Fr4*1>E!X*eex-Z|#M)1#98H#vwPx`Bu(g)Be<5Z^-upFND{3WG)_jsD#CRE=<9*+vx<&LJuGj|1O;G zvl{H7p)^g>l$k*a@?Ert;+77suKX&~+~NL%r?s-Rh|54Fb&$#o;%Z+h_UpVG67B&c zK>uj)<&kAlSSxMm`LgS_gIfn{j)Z-UOc)qQe+@waMiG#=2o;KQ3SfM^&oHg^V6v%! zc_z?e(_`tzJ#*4Zt8 zc`_-Wcjx3{x0(ytAEc$ON+r)(a@0VQOmJrxwpsZf^Ksgg*g|t1*=H)qw>`otQ(7e@ z#@|%`usCVJikM}{7cd3JO`0erRP05(Wo}5H+_R127H^6ys(hlf|0W*%!Mg*3>e=Vs zBR<&3X(KU49w^P@RU9~t#Cl-O03rB!>g`n$)761n9(F;bz3pFo61}kx_#(IY-dqWJ ziQfj|@?PM8>ywYnTM1GSbgsP4laP%61C!nKos|<Ehkfw7~m0Z8z_P$UPf*uU8T3qB%CSaGb3M?Ux0k zvg0Gq@cQGKyb>zc(-z9q2^N&Dl6=UvgsP;B@$;j~2Jbf2PvDyWEDV;IK2(unB~XZq zS4-Asdp#==d79!xjaTQLq;j36C;9g<&ks8Y-g%FrD2t&HG6A^?(mzWwgHWI@8H2ix zk%6CTipd$y+ifJq)p3eX2UnuM@HRQicR`xOb|PY^nPZT{{=|2clBf38dtpyY8@V@&H3S8C1T-afNF@j_2YXtnGVH3vB)}ttTWle>q2Pwt z!gL_1&CajugpCC2K7nN9HK(nR+|&P~$%2XG^;4AD#Gg#joygfq%HwVaN({^}yu#9@ z5OvEmXvpmTdr89BJtXP^`e19E=eu)`a(Z`~T#xol5^8Uvu$o=01>y_9{n%27#pYHV zY;#JGOo&atC>bkrSv2T-8gEWmP52YF; z^fy!+0tSSzaC}p&t-=(5dkh0*UP>xpG1yLg`i9s9YnpIclma~Rpd0pa6XiYjX2ht$ z_5s(ZNYzmC+w%%d%RsM4-T6_XEte<)NxEptj*yrfqv$t~MVUsEN__CE1&UTpNiA%>%<$1=w)5GsnDBwYl1`64l??NM}!RPgl)n4QK|_-r;6yx zT|rf_P=7Lf7M}k=^(tFpmAPx;-H=~fC^|_89Z`6v5zJWe(WK=9)sU;cg8d80MKJK^ zM|P;DV&7A2(nUO=nbbP7Q71_y$V$epXJFk+tWO5kH^FZFFA^itb}IV7`EbeP!MSc- zcw$_~w5xN@ESJn;trPppc6ir5if4Nz`k{YjB$_4j+`a)HX| z3fLzv$i3HTk;@(COTOC#=0H*Ug8|7&5{Rk_AC4l`<4;|aIOic`4B*N(h+vDq@Ncx> z{}{k&-X&?6-x^v>JN1h$GVjnG^`;k9m4@1>xrsTWB!X5hn9NnRji!`2iOmgGz%bz1 zv_qhunDjN8hY|RB@4%*YmeneeezyW#c?U>?{6ayW~(B_n(28GJm59c^+Jcph7u|CD4m4& z@5-!`RKL>LnRF#v$q7-WNUn^rLPCE4D{)g63by_ z0DX6cChwHsk&YEuJa%{Cvl!w;`2@NtuPqZ_5E`LYJOh}#tYAIda1kSc7#2U$14Jgk zJX_#$Q>-DFXGtIqmDLH79|->c$+G@0P&WQLijOQfaGQw(Kw@0yvPh5{VL`#DeHo(C zGz*C=hvLvZS`xAe^6>}DfI>6`A+98^A+%%>zaK#+$0R2Ck4Tv!Z*j7-!bu7!H!Y;7JL|K^DjhbiMNNr zr0LyC=t?MR2&U{F7th^rRq}YrwE-7+!%97z%`GeRo~J?6`T@PX@6xCu6Iu2&QbNpl zvuIjipB@uBy|jf)2kwB2OapU?&NxR8qkagUiVd)8J$n*`Wzxy)PE{nM`*gEW?9bd6 zJ3RK`c-h~pB0PAjWsqs5PUN;`4 z4|gzMg}Fsb%|8|t7)Lc78hmc)GU&Q515-Rcix}n`zscEnpr;3?X+kQ3Y_}Q;bjYha zn#_?W+Q}sbOG}I(Vv`b3&S^8%AKbuuFM2TpUR*M)l5^x^+MiYd8#Ey{N3=^{Y%aa^ z#EY6Q97?-^;(xe_A@FYtI7@e(c0g}PJ;AymKo4+8*HFu@R~ug$2{TjIZ9H#AcO^SY z1#Wu{(3DH24S!KlX-=)m*`4pv+lWn`$%>z6@?UB`Gux%pm^R+iqdJ5tvqU%t-SBS4 zDVpDh(fZMl<897-y{b<;!{}9!;M}oF<;bb2gpERq%ah@s>di^L%H5TV7gj6@>b=~e zC>Va^@oe~{%?OP#v7gTYCofb6Aaw~Q=|OUfBlU&D--C(%ARr9^ZS08e0dp??DEB%s zwbOX_UTV~Z*$`Jo~9f7EoSWy!A> zk!b^c({$9@qrPm-z?_A=pD^_pD!i?nv5QVEIC1~T`I^pZe)}7bv)LL~+a^NgOcwhw z71I6&`FGCQB%K=Im&_@B^m4d$gK7|1Z)&=)sIpZ;A$W$av$R9XXY) z{xeFegUU+o+1#oag>^m$NZYX}bI&-t?KSGJKfMS%wJ~~6lrt{oI?~@gpofpyYy9yM zF)77)o~(xPcQB$Y_IuIqaI}s$-zfGICJjz3J7bg!*;Zm*;NoLc?n0%*qeL4gEp4i1 zK<2Onzi@%Ya=ZEX60%q~I0N*rNUqrL|HDZWB&D+U;vXxOnTZJg`^DU5dD749z5fB` C-bc>> diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/114.png deleted file mode 100644 index af87e151e7c06a24fcac1098bc38d4b5bdc4a196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3598 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 diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/167.png deleted file mode 100644 index 6d0f20bff109201ed2bb0c67e36872cdadddb793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5560 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 diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/180.png deleted file mode 100644 index b62a78d3b16892dcfe738ef2eb4c55ef1334574d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5742 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 diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/20.png deleted file mode 100644 index 69bb42fa0f39c8009932c7dd3e707a42152743a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 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 diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/29.png deleted file mode 100644 index 30ec2be65158ba3744486ec86b68f32d6da7b044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmV-Z1FZasP)Px&4M{{nR7gwhmdi_2VHn1L=Zu$h$m^sQX%~%B)6kM^6AB6;QGbB7Oj;G8kT!Iq ztRTh8Rl4y)ZKQ~xFcVU-+oF|(P~k+{LJdpNQP0si@r`p*XY`!oh1&FOW)|=FJ?DL& z=Y8H+>d+(&?~&$yEFKZhjp0#j5wm_nIVG@|tFab6J)ih{-n#}0P25dHup~7S1-Q*q~z#cY(VhC&j z^jvWfUq43?7N(;4x0Ua4bw);=wvnDS#QB@u#5yKX#V0OVYP0fc;5=QxcUJ@z)m!L(nI zMbV>xcRdcAB?aux_`&tMb_1(f0cdT@Gq%M{G35s;atQ{Sn^I}Go6W(zey&t^G3}AO zY7RUWICYj3@~tnDz1f3=hIkN}Ej&WmZg&u0dSlT%P+Iw#oSZ@2t1YikuMQd&J>?Zf zpp$~C%8ZYN5N=nwbgzS*J4VeiHE2=|bWU$Kwy|}~IMaSY5~)jyjfT1mo;0VCf3%PC zt8dLRwFX-Kpp~SAKq1Wnk-*2kNJ>v0Ath~u%KDdvGt1cU7i3!1{DMUPOof+e60#!G zSf9b8hII0ZTvS|pV~{DvQ)VHjF%CDfEI<|uN${*FHpYI25@w&_;+~n$thkr6Woz(W z@u)s!!tKhO0g8I+)5AAq6jer<3}Vl|VajiHvnkHK`Y9to+aB-Ymv5em_6Rt>wa}3; z!J)hXHrmy-%~JvJ*Ea_NYIR2vv0{F%%Z_AWJz8Oi**sn0bJoKD6=Px&n@L1LR9HvtmtAO+R~W~CCu#Dg+BJ1$x;E{=t~$`xi&8;1DDI-0=&kHS^k#m5 zx7M+WWlCwWD(c2IrJa>sj4{S;hfKRQ&J8Q}ZUaRTzpmQZ)};AtlJ|_0*J#qd@0+)Y z!Y({F2`A5a_~-op|L1v*2uhbEZwWwcD=T z96iv%^13Mf=PprOlO*-zh89w{NC2n4zrb6s$B3JhWW|aX7&_O&Ps1%VHibAgd=Z~7 zL#7-6Q!_rgKk3YB;N7kFSmsZVmI4YCE^s56oLItGu#rT(f)958!^b;r5G_{&IRNpP zhe%i>l@hiM$zPMiSDB`NXoNsrbb(&xwIb_YpoFDdphTF}z^s?OpNS0 zgn{!Hsjfh$wTiL0ERD7{mPsT02W8VzV7P;0ukm^9mo@* zazKuPAHHqn!JQg9Hs9mG=VQceMd$!Pz6hhUUQ%gQaxA7I3Dtf>gndIJG!zx#A^<2G zcD#R|8h>)34W+;>3>%LB8OYl3qrHFg;r5$OZ0KAA#R`!J7#wQl=ksfMquD4#nwCMI z-#eaOpv_2T=7PS#-)LSLA~CNQC{8kI!K)sf%VTvM?Rw6o_~7o&Y#r!5^E+>v0gy&< ziapl&=0rQ!{|K|PYjNCe-IOy`m%_7NW*$|tv?|4C16OEY zKjEYhnNLKyf#h*m<8;qP5^)bw3Up=oc`NsZP_u&Sf?KxTV%@q&oB<{tVFgZmU8+lqOk P00000NkvXXu0mjfimTHh diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/40.png deleted file mode 100644 index 9c05327b42a7f709425eef000088e67bd45357cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1221 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 diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/512.png deleted file mode 100644 index 432fbdda89259d264f988756de1fe8ae0ecf7ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 KMNUMnLSTa88^Kfn diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/87.png deleted file mode 100644 index 8f2a9719ddf50220c2542cf8be95f45b38df6dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2812 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 diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 8e70699..0000000 --- a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,346 +0,0 @@ -{ - "images" : [ - { - "filename" : "40.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "60.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "58.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "87.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "80.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "57.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "57x57" - }, - { - "filename" : "114.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "57x57" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "180.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "20.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "40.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "58.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "40.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "80.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "50.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "50x50" - }, - { - "filename" : "100.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "50x50" - }, - { - "filename" : "72.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "72x72" - }, - { - "filename" : "144.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "72x72" - }, - { - "filename" : "76.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "152.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "167.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "1024.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - }, - { - "filename" : "16.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "filename" : "32.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "filename" : "32.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "filename" : "64.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "filename" : "128.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "filename" : "256.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "filename" : "256.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "filename" : "512.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "filename" : "512.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "filename" : "1024.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - }, - { - "filename" : "48.png", - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "24x24", - "subtype" : "38mm" - }, - { - "filename" : "55.png", - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "27.5x27.5", - "subtype" : "42mm" - }, - { - "filename" : "58.png", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "87.png", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "66.png", - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "33x33", - "subtype" : "45mm" - }, - { - "filename" : "80.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "40x40", - "subtype" : "38mm" - }, - { - "filename" : "88.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "44x44", - "subtype" : "40mm" - }, - { - "filename" : "92.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "46x46", - "subtype" : "41mm" - }, - { - "filename" : "100.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "50x50", - "subtype" : "44mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "51x51", - "subtype" : "45mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "54x54", - "subtype" : "49mm" - }, - { - "filename" : "172.png", - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "86x86", - "subtype" : "38mm" - }, - { - "filename" : "196.png", - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "98x98", - "subtype" : "42mm" - }, - { - "filename" : "216.png", - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "108x108", - "subtype" : "44mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "117x117", - "subtype" : "45mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "129x129", - "subtype" : "49mm" - }, - { - "filename" : "1024.png", - "idiom" : "watch-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/Contents.json b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png b/packages/browser-wallet-base/src/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/1024.png deleted file mode 100644 index 434fb650113d1037920bd079b9b35c36b9ec66f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11604 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%0D9-h zswYPQcR4Ad9csv!MobDZqz%)uDdFfEz){Hh3sAKo&WLXD(+-97zMvxCQS<^~0dK0) zLieiPZ?R4LDo(l!pd^dyZxbQzJr0QjG+3Rp6%|p)NDStdCRo6Xj*j?PwXT=8z{x$t zxfa^r!Dhs+<|hBFv}m5yp-3bUG*nxicQj0rToo^lZVkCTRvp738jS!gOaI3hRl*Ne zdm+&C^awhvq=?2}eAK|orOZ(omJ?y)H23YP~p`ze{ zAFRP0N9w=+?gcVv(?ex}3=Q6yAH%LI)9N!DKAXT)*DuNlJi(;Vn!3Oe3Mizhg{uHx zn4Y=3h=TnPnySbPu2yab4j4=lA>3O2GC~>FNoJrGx%`9%@&Md0P>s)To^((T`kMEk zod7kl`XhG2JEkc*-BPr8XIdjcD}DN88&*UjNZ(YPtJkQ4<$m;j)eu)Rl5qi8y)=N8 z(Olh8x?og}u#2~Y?=dVctPHIdj77?DpL4(z{GbF!>9iI$^k_fFS7aua4`XGL0dP)K zJ!R-!qf&rA63L+O$#C3Gess-?zi7vh->3oK@=%V|0 zQ;GHFW>IawVmA}sT%gCSzb?j35;b6br80j%YMSj7XFcVCe1;|q%zh^gk5Q z1xfircdc14g8l(tHY&x!B@oR#!I-z`maaBd*za@0L=B{6W?9->SZ5P0&-qvK%i!c14gS)q+N%+V-{qMKv9c<{}ge(+M zU6OqIj)f6>f>>Z-yOc60ZxO?b;M?5gS3Gd;I%t4;NoKm|4!1EJ3*za>|JwdvY*n1Xc`RoU_B!>30B*gt&w(Ed6Z5z zAY&J3!n}9r2$p{u&IyI>1W42Oq&@={Le2P#x5l1di+> zxH=25p}tP)(>apQ6dUAsU!=YS!|FUaUZzewb%HGp5EW24QUCH4L?X7E1!QYoL5#{2 zTt$kA;K-6IKt63B6IoA!kONEM{QvyD!9A?k032Ye5DLmb_AVF9Hw3H$zX27%k=+k# zwyQZB*WecfZ|yk@LiS(?twIXSa1|GQR^mTP^r6E~^1~*w=(C56LfR6pFN*U%oG4$o zy;$^r7GY{9ktzu$MRa^Rv+h2M=kz-@@*Yi{@(*P0eS;PR`c^I-q>;f7~y{iYoZo z-72~Lm$6I#?Fn8?JU&WK1=-}~^X+$1FhLglyk>_sj5o+BNj=aS1|^3r70`X_4TCFu z4Z8Px(7CrQ7Fk%l3IO^1?_h`X6IpW6^?BfpGxT@y97!;Hfhuvr#%MsMYmB;<3*LNf ztaf?g?`UVoJ%MF>d)pIJ;g)!gx4Jfw+4`dDOwe8`&BZ8qZ_8~ukQ`;dijh$(8s~MN z5C4(Y_*AzVG?wj6oE?|de1%rmZ1etG&&bXk2GDev;%B4Y^f9n1AcvZ+-ZS3f-?j&S zVOeCI(%steV#Mx1|1Yt-vVu!5xkc@4_+#wqN7qZHU*69d-gCY!o|d0<@_cOfnudP8 zrMter`qBSev08UY!}5*xC43Y3LEO)OVHEpo^NSpI*Fhn`9vBb zs38u1y950#7YBxix%h>y^$Ftb@B`*^Sm;mwtMyC>CHFVfl8_xCp=)_QzJ9=1<}7Xx zCujUUxfF`HE-+|POiMPDZXV0n!qU{-(!}h}k9PtHtnfGRGRV}~-#^SR92i@$9a8)5 z!fBqAfIqxYGR&V`}PjRG5Sw&e%g1QxvAMNUzd17)L;Gq)g>S#JS503JT%Z( z#1*O??h`K3TVCm~8pLA#1J Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { - // Called when the app was launched with a url. Feel free to add additional processing here, - // but if you want the App API to support tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(app, open: url, options: options) - } - - func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - // Called when the app was launched with an activity, including Universal Links. - // Feel free to add additional processing here, but if you want the App API to support - // tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) - } - -} diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard b/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index e7ae5d7..0000000 --- a/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard b/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard deleted file mode 100644 index b44df7b..0000000 --- a/packages/browser-wallet-base/src/apple/iOS (App)/Base.lproj/Main.storyboard +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/Info.plist b/packages/browser-wallet-base/src/apple/iOS (App)/Info.plist deleted file mode 100644 index 364d0f3..0000000 --- a/packages/browser-wallet-base/src/apple/iOS (App)/Info.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json b/packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json deleted file mode 100644 index 67b3726..0000000 --- a/packages/browser-wallet-base/src/apple/iOS (App)/capacitor.config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "appId": "com.bitgreen.browser-wallet1", - "appName": "Bitgreen Wallet", - "server": { - "androidScheme": "https" - }, - "ios": { - "scrollEnabled": false, - "contentInset": "never" - }, - "plugins": { - "Keyboard": { - "resize": "none" - } - } -} diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/config.xml b/packages/browser-wallet-base/src/apple/iOS (App)/config.xml deleted file mode 100644 index 1b1b0e0..0000000 --- a/packages/browser-wallet-base/src/apple/iOS (App)/config.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova.js b/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova.js deleted file mode 100644 index e69de29..0000000 diff --git a/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova_plugins.js b/packages/browser-wallet-base/src/apple/iOS (App)/public/cordova_plugins.js deleted file mode 100644 index e69de29..0000000 diff --git a/packages/browser-wallet-base/src/apple/iOS (Extension)/Info.plist b/packages/browser-wallet-base/src/apple/iOS (Extension)/Info.plist deleted file mode 100644 index 9ee504d..0000000 --- a/packages/browser-wallet-base/src/apple/iOS (Extension)/Info.plist +++ /dev/null @@ -1,13 +0,0 @@ - - - - - NSExtension - - NSExtensionPointIdentifier - com.apple.Safari.web-extension - NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).SafariWebExtensionHandler - - - diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/AppDelegate.swift b/packages/browser-wallet-base/src/apple/macOS (App)/AppDelegate.swift deleted file mode 100644 index 877bfb5..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/AppDelegate.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// AppDelegate.swift -// macOS (App) -// -// Created by Samuele Landi on 04/07/2022. -// - -import Cocoa - -@main -class AppDelegate: NSObject, NSApplicationDelegate { - - func applicationDidFinishLaunching(_ notification: Notification) { - // Override point for customization after application launch. - } - - func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } - -} diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/Base.lproj/Main.storyboard b/packages/browser-wallet-base/src/apple/macOS (App)/Base.lproj/Main.storyboard deleted file mode 100644 index 31b88f3..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/Base.lproj/Main.storyboard +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/BitgreenWallet.entitlements b/packages/browser-wallet-base/src/apple/macOS (App)/BitgreenWallet.entitlements deleted file mode 100644 index 625af03..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/BitgreenWallet.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - com.apple.security.network.client - - - diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/Info.plist b/packages/browser-wallet-base/src/apple/macOS (App)/Info.plist deleted file mode 100644 index 61ec828..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/Info.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - LSApplicationCategoryType - public.app-category.utilities - SFSafariWebExtensionConverterVersion - 13.4.1 - - diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/main.html b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/main.html deleted file mode 100644 index 88fa598..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/main.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - Bitgreen Wallet Icon -

The Bitgreen Wallet extension is installed. You can close this window and turn on the Bitgreen Wallet extension in the Safari Settings.

-

The Bitgreen Wallet extension is installed. You can close this window and turn on the Bitgreen Wallet extension in the Safari Settings.

-

The Bitgreen Wallet extension is installed. You can close this window and turn on the Bitgreen Wallet extension in the Safari Settings.

-

The Bitgreen Wallet extension is installed. You can close this window and turn on the Bitgreen Wallet extension in the Safari Settings.

- - diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/script.js b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/script.js deleted file mode 100644 index e23ac01..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/script.js +++ /dev/null @@ -1,17 +0,0 @@ -function show(platform, enabled) { - document.body.classList.add(`platform-${platform}`); - - if (typeof enabled === "boolean") { - document.body.classList.toggle(`state-on`, enabled); - document.body.classList.toggle(`state-off`, !enabled); - } else { - document.body.classList.remove(`state-on`); - document.body.classList.remove(`state-off`); - } -} - -function openPreferences() { - webkit.messageHandlers.controller.postMessage("open-preferences"); -} - -document.querySelector("button.open-preferences").addEventListener("click", openPreferences); diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/style.css b/packages/browser-wallet-base/src/apple/macOS (App)/Resources/style.css deleted file mode 100644 index 6bbdd7e..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/Resources/style.css +++ /dev/null @@ -1,52 +0,0 @@ -* { - -webkit-user-drag: none; - cursor: default; - -webkit-user-select: none -} - -:root { - --spacing: 20px; - color-scheme: light dark -} - -body, html { - height: 100% -} - -body { - align-items: center; - display: flex; - flex-direction: column; - font: -apple-system-short-body; - gap: var(--spacing); - justify-content: center; - margin: 0 calc(var(--spacing) * 2); - text-align: center -} - -body:not(.platform-mac,.platform-ios) :is(.platform-mac,.platform-ios) { - display: none -} - -body.platform-ios .platform-mac, body.platform-mac .platform-ios { - display: none -} - -body:not(.state-on,.state-off) :is(.state-on,.state-off) { - display: none -} - -body.state-on :is(.state-off,.state-unknown) { - display: none -} - -body.state-off :is(.state-on,.state-unknown) { - display: none -} - -button { - font-size: 1em -} -.rounded { - border-radius: 16px; -} \ No newline at end of file diff --git a/packages/browser-wallet-base/src/apple/macOS (App)/ViewController.swift b/packages/browser-wallet-base/src/apple/macOS (App)/ViewController.swift deleted file mode 100644 index fd2aee1..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (App)/ViewController.swift +++ /dev/null @@ -1,77 +0,0 @@ -// -// ViewController.swift -// Shared (App) -// -// Created by Samuele Landi on 04/07/2022. -// - -import WebKit - -#if os(iOS) -import UIKit -typealias PlatformViewController = UIViewController -#elseif os(macOS) -import Cocoa -import SafariServices -typealias PlatformViewController = NSViewController -#endif - -let extensionBundleIdentifier = "org.bitgreen.browser-wallet" - -class ViewController: PlatformViewController, WKNavigationDelegate, WKScriptMessageHandler { - - @IBOutlet var webView: WKWebView! - - override func viewDidLoad() { - super.viewDidLoad() - - self.webView.navigationDelegate = self - -#if os(iOS) - self.webView.scrollView.isScrollEnabled = false -#endif - - self.webView.configuration.userContentController.add(self, name: "controller") - - self.webView.loadFileURL(Bundle.main.url(forResource: "main", withExtension: "html")!, allowingReadAccessTo: Bundle.main.resourceURL!) - } - - func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { -#if os(iOS) - webView.evaluateJavaScript("show('ios')") -#elseif os(macOS) - webView.evaluateJavaScript("show('mac')") - - SFSafariExtensionManager.getStateOfSafariExtension(withIdentifier: extensionBundleIdentifier) { (state, error) in - guard let state = state, error == nil else { - // Insert code to inform the user that something went wrong. - return - } - - DispatchQueue.main.async { - webView.evaluateJavaScript("show('mac', \(state.isEnabled))") - } - } -#endif - } - - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { -#if os(macOS) - if (message.body as! String != "open-preferences") { - return; - } - - SFSafariApplication.showPreferencesForExtension(withIdentifier: extensionBundleIdentifier) { error in - guard error == nil else { - // Insert code to inform the user that something went wrong. - return - } - - DispatchQueue.main.async { - NSApplication.shared.terminate(nil) - } - } -#endif - } - -} diff --git a/packages/browser-wallet-base/src/apple/macOS (Extension)/BitgreenWallet.entitlements b/packages/browser-wallet-base/src/apple/macOS (Extension)/BitgreenWallet.entitlements deleted file mode 100644 index f2ef3ae..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (Extension)/BitgreenWallet.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - - diff --git a/packages/browser-wallet-base/src/apple/macOS (Extension)/Info.plist b/packages/browser-wallet-base/src/apple/macOS (Extension)/Info.plist deleted file mode 100644 index c70bcd9..0000000 --- a/packages/browser-wallet-base/src/apple/macOS (Extension)/Info.plist +++ /dev/null @@ -1,15 +0,0 @@ - - - - - LSApplicationCategoryType - public.app-category.utilities - NSExtension - - NSExtensionPointIdentifier - com.apple.Safari.web-extension - NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).SafariWebExtensionHandler - - - diff --git a/packages/browser-wallet-base/public/index.html b/packages/browser-wallet-base/src/index.html similarity index 52% rename from packages/browser-wallet-base/public/index.html rename to packages/browser-wallet-base/src/index.html index ee8b9a9..97b4de4 100644 --- a/packages/browser-wallet-base/public/index.html +++ b/packages/browser-wallet-base/src/index.html @@ -3,10 +3,11 @@ + + + + Bitgreen Wallet - - - - + \ No newline at end of file diff --git a/packages/browser-wallet-base/src/safari/.DS_Store b/packages/browser-wallet-base/src/safari/.DS_Store deleted file mode 100644 index 07b9941269a55f6798107ed56822b114193a046b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKK~BR!3>=3Zg1Ge9Syi<{ex(Bk>I0!Am$WUazWF zg-eAHs_e?1UDtNBvr4=RK+4B@3=9F}RK@I&<{Q!fRktKdo&ix}jR#!ucZV}vZbiG} zKQf?uH$sUUEHTIW{xxX0mrESu2{W{)IqMkF;tH&)akC*)|Bb{;NlE81J1zSGQgg#k{=nmbq1UPXJEyEejfr=u}Ih( z#!m-LyaEvQ7#W4*cy=NNbr6e$y&*jmu~ed^O1ff*rPCi$T#>Lhv~);(GV7!#OS+** zI=M-R;gG`6tux>ZY%*|Q)1mhN)1UAEn@K)%2AqMtVn7Dfq$;_j)LXX}r@b~%FQ_US m*Bh= { - if (p === '--mode') { + args.forEach((arg, index) => { + if (arg === '--mode') { mode = args[index + 1] || mode; } }); @@ -33,23 +34,19 @@ module.exports = ( useSplitChunk = false, platform = 'chrome' ) => { - if (!['chrome', 'firefox', 'safari', 'ios', 'android'].includes(platform)) { + if (!['chrome', 'firefox', 'safari', 'android', 'ios'].includes(platform)) { platform = 'chrome'; } - const is_app = !!['ios', 'android'].includes(platform) + const is_app = ['android', 'ios'].includes(platform) const manifest = !is_app ? require(`./manifest-${platform}.json`) : null - let platform_dir = path.join(__dirname, `../../build/${platform}`); - let output_dir = platform_dir; - let cleanDirs = [platform_dir]; - if(platform === 'safari') { - output_dir = path.join(__dirname, `../../build/apple/Shared (Extension)`) - cleanDirs = [path.join(__dirname, `../../build/apple`)] - } else if(platform === 'ios') { - output_dir = path.join(__dirname, `../../build/apple/iOS (App)/public`) - } else if(platform === 'android') { - output_dir = path.join(__dirname, `../../build/android/app/src/main/assets/public`) - } + const output_dir = path.join(__dirname, `../../build/${is_app ? 'app' : platform}`) + + // clean destination folder + exec('rm -Rf ' + output_dir, (err, stdout, stderr) => { + if (stdout) process.stdout.write(stdout); + if (stderr) process.stderr.write(stderr); + }); let plugins = [ new webpack.ProvidePlugin({ @@ -70,36 +67,47 @@ module.exports = ( PLATFORM: JSON.stringify(platform) } }), - ]; - - let filesToCopy = [ - { - source: path.resolve(__dirname, '../browser-wallet-ui/src/components'), - destination: path.join(output_dir, 'components') - }, - ]; + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'src/index.html', + chunks: [is_app ? 'app' : 'extension'] + }), + ] - if (useSplitChunk) { - if(is_app) { - plugins.push( - new HtmlWebpackPlugin({ - filename: 'index.html', - template: 'public/app.html', - chunks: ['app'] - }) - ); - } else { - plugins.push( - new HtmlWebpackPlugin({ - filename: 'index.html', - template: 'public/index.html', - chunks: ['extension'] - }) - ); - } + let copyFiles = [{ // components + source: path.resolve(__dirname, '../browser-wallet-ui/src/components'), + destination: path.join(output_dir, 'components') + }] + if(!is_app) { + copyFiles.push({ // safari gets square icons, everyone else normal + source: path.join(__dirname, '../browser-wallet-ui/src/assets/icons/' + (platform === 'safari' ? 'square' : 'normal')), + destination: path.join(output_dir, 'icons') + }) } - if(!is_app) { + plugins.push(new FileManagerPlugin({ + events: { + onEnd: { + copy: copyFiles + } + } + })) + + if(is_app) { + if(mode === 'development') { + plugins.push({ + apply: (compiler) => { + compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => { + exec('cd ' + path.resolve(__dirname) + ' && cap sync ' + platform, (err, stdout, stderr) => { + if (stdout) process.stdout.write(stdout); + if (stderr) process.stderr.write(stderr); + }); + }); + } + }) + } + } else { + // add manifest for extension plugins.push(new ManifestPlugin({ config: { base: manifest, @@ -110,62 +118,20 @@ module.exports = ( })) } - if(platform === 'safari') { - filesToCopy.push({ - source: 'src/apple', - destination: path.join(output_dir, '../') - }); - filesToCopy.push({ - source: path.join(__dirname, '../browser-wallet-ui/src/assets/icons/square'), - destination: path.join(output_dir, 'icons') - }); - } else if(platform === 'ios') { - filesToCopy.push({ - source: 'capacitor.config.json', - destination: path.join(__dirname, '../../build/apple/iOS (App)/') - }); - } else if(platform === 'android') { - filesToCopy.push({ - source: 'src/android', - destination: path.join(__dirname, '../../build/android/'), - }); - filesToCopy.push({ - source: 'capacitor.config.json', - destination: path.join(__dirname, '../../build/android/app/src/main/assets/') - }); - } else { - filesToCopy.push({ - source: path.join(__dirname, '../browser-wallet-ui/src/assets/icons/normal'), - destination: path.join(output_dir, 'icons') - }); - } - - plugins.push(new FileManagerPlugin({ - events: { - onStart: { - delete: cleanDirs - }, - onEnd: { - copy: filesToCopy - } - }, - runOnceInWatchMode: true - })); - const result = { context: __dirname, - devtool: mode == 'development' ? 'source-map' : false, + devtool: mode == 'development' ? 'inline-source-map' : false, entry, module: { rules: [ - { + { // graphics and fonts go in assest folder test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/i, type: 'asset/resource', generator: { filename: './assets/[hash]-[name][ext][query]', }, }, - { + { // compile and auto-prefix SCSS test: /\.s?css$/, use: [ require.resolve('style-loader'), @@ -186,11 +152,8 @@ module.exports = ( ], }, output: { - chunkFilename: '[name].min.js', filename: '[name].js', - globalObject: '(typeof self !== \'undefined\' ? self : this)', path: output_dir, - publicPath: '', }, performance: { hints: false, @@ -216,12 +179,14 @@ module.exports = ( url: false, }, }, - watch: false, - }; - - result.optimization = {}; + optimization: {}, + watch: mode === 'development', + watchOptions: { + ignored: /node_modules|\.json$|\.csj$|\.xml|\.md$/ + } + } - if (useSplitChunk) { + if(useSplitChunk) { result.optimization = { splitChunks: { chunks: 'all', @@ -243,8 +208,8 @@ module.exports = ( }, }, }, - }; + } } - return result; -}; + return result +} diff --git a/packages/browser-wallet-ui/src/assets/b.png b/packages/browser-wallet-ui/src/assets/b.png deleted file mode 100644 index c5ba800e699b3d7a7755d9cb9c99add39d93ebd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1481 zcmV;)1vdJLP)L($Div%}fpG;P6Ij6_`{ona2!7U;&1A zhtaX_cg}!qY<$f1FeA;6M$QvD#ln{+-rxK3P47peQ6nHDh67joQu*@D8Wh7xtMcXc z)Q}j?c~o*jNPh^OL+Q)h*MonK`5}gLK7}up4`}+_AK=?s9l+wOUK-HHT@Nyx{7PSY-giB~Hm4u7-MQL64nl;}$jf&TOG>p5 z=XLuFh;R!3q(5W;{7a>6#I=Nj%1go1-do-Ng;uX*fc)Qm?aPD1dT9R+b_h=7|HJjH z^Vokl6`aBcG+BS<>;_qL+Wc!!I-L3Hd0BG+d=0An-3P&#xOia7a6o)OGk-S|jOE#D zhJ$r0;h4p0*%M?qK=C9dqV`PmhT-6S7CY^=T`(N5cnYQwyMp1QQH$LxhLc7kc6?jw zGltV+3?~i5@WO)Oq=6VtU^r<0_@t0{5NY(C;owcgZlPxz7!KZz*y)@$b_kGMm}*;y z-B-Qg90HKo);tKtSWg47<^aTC=7O}mVmSHSxC0wT z@NF%>va1`d7*2lL{%FVGe)|E2(+`bw9P6;n>4!qXiPQ~iho=j{8FQE#AijuKf>|)N^1JPEc7tE)uKerp z#bG?Io|82P=beDo<+!*}1j7M|$0+Xv<8QrTI6!ezp<3)Fdc$z=ZpDuK5Tp=mk9jtd zcC;8y8nxJ6GMqFTvEyp$L?Dwa8BUKeoE~F1X&{CaxOgg&iP-&QIAHO-n0Y0F&M9Cx zct>5pXa}yQMss0P@KWq*yYF6?OgMKG32-5CzfonVHmb%mQ=bCls&xv+4z@*lnt zjJo~gR)Za;);7kM{~cDbdVa2^K7k9}W$l%ff>pKWts$mHX?6Z7FWc(+Ie*C+Clw-U z&Q~FXX^JaPk=>I$2o!s3`7M`#bUnau@|*5j8_IC<(qKOAdXVAdqrvQ*M#T<69$f0) zV|vUqZ=Vh5!f^5_{V>(^Em6dr`AP&>x$ZJ{E2xd5l8Be|fTP zBxQRq0%td<@f;V%aPA!by431s`wVjI+m9m7dvCU(mS zB;1$?EOvz-#g5meMvF)Iwb(J7MDE3o;UvP<)Gr;w=`n_r2Cq%sV};l;95fduY#?e5 zFC3l#;@Z>=FB}dQYt2OLxYRuXtu=+%aWyrPuQl%lw+xZ1sZo3|rN8?q7&Uif2XW!* zQFnq=5)r=b~NKoc#2P?jO1yU^sa_X=mE_wwBLo8t+aFCy!dfVyV4z4H(Y(X&ZAe z7{!Co^U*NgthR`J4%VFW&?&m(V}envIq7IkseJi#Xs3={7!F=7VX*A;bJ~@C7|!Vy jv1pgLiTD3m18MsOFUkA5$^#eD00000NkvXXu0mjf)F{aS From 511f9a9bbdc4caf286700369a3fe0d9bd444f186 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 18:21:56 +0100 Subject: [PATCH 21/96] fixed app build scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e9d8249..ddfcba9 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production", "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production", "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production", - "build:android": "npm run build:app && cd ./packages/browser-wallet-base && npm run build:android", - "build:ios": "npm run build:app && cd ./packages/browser-wallet-base && npm run build:ios", + "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:android", + "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:ios", "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development", "dev:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", "dev:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", From d73d7c8c192611121864454e596dd681c065cea4 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 18:37:18 +0100 Subject: [PATCH 22/96] JS cleanup --- packages/browser-wallet-base/src/app.js | 120 +- .../browser-wallet-base/src/background.js | 122 +- packages/browser-wallet-base/src/content.js | 84 +- packages/browser-wallet-base/src/extension.js | 133 +- packages/browser-wallet-base/src/inject.js | 143 +- packages/browser-wallet-base/src/page.js | 56 +- .../src/polkadot/packageInfoApi.js | 8 +- .../browser-wallet-base/webpack.android.cjs | 6 +- .../browser-wallet-base/webpack.chrome.cjs | 18 +- .../browser-wallet-base/webpack.firefox.cjs | 16 +- packages/browser-wallet-base/webpack.ios.cjs | 6 +- .../browser-wallet-base/webpack.safari.cjs | 18 +- packages/browser-wallet-core/src/app.js | 28 +- .../src/background/extension.js | 1582 ++++++++--------- .../src/background/index.js | 305 ++-- .../src/background/tabs.js | 118 +- packages/browser-wallet-core/src/cache.js | 113 +- packages/browser-wallet-core/src/constants.js | 32 +- packages/browser-wallet-core/src/messaging.js | 7 - .../browser-wallet-core/src/page/index.js | 113 +- .../browser-wallet-core/src/page/injected.js | 11 - .../browser-wallet-core/src/page/messaging.js | 41 +- .../browser-wallet-core/src/polkadotApi.js | 632 +++---- .../src/services/databaseService.js | 40 +- .../browser-wallet-core/src/stores/account.js | 158 +- .../browser-wallet-core/src/stores/asset.js | 38 +- .../browser-wallet-core/src/stores/base.js | 267 ++- .../browser-wallet-core/src/stores/cache.js | 26 +- .../browser-wallet-core/src/stores/network.js | 102 +- .../browser-wallet-core/src/stores/session.js | 151 +- .../src/stores/settings.js | 6 +- .../browser-wallet-core/src/stores/token.js | 38 +- .../src/stores/transaction.js | 58 +- .../browser-wallet-core/src/stores/wallet.js | 12 +- packages/browser-wallet-ui/src/chart.js | 211 ++- packages/browser-wallet-ui/src/index.js | 778 ++++---- packages/browser-wallet-ui/src/messaging.js | 168 +- .../browser-wallet-ui/src/notifications.js | 66 +- packages/browser-wallet-ui/src/screens.js | 124 +- .../src/screens/accountCreate.js | 132 +- .../src/screens/accountEdit.js | 324 ++-- .../src/screens/accountManage.js | 106 +- .../src/screens/assetReceive.js | 84 +- .../src/screens/assetSend.js | 902 +++++----- .../src/screens/assetTransactionFinish.js | 156 +- .../src/screens/assetTransactionReview.js | 340 ++-- .../src/screens/connectionError.js | 106 +- .../src/screens/dashboard.js | 372 ++-- .../src/screens/extrinsicSend.js | 776 ++++---- .../browser-wallet-ui/src/screens/index.js | 1124 ++++++------ .../src/screens/kycAccredited.js | 108 +- .../src/screens/kycAdvanced.js | 123 +- .../browser-wallet-ui/src/screens/kycBasic.js | 119 +- .../browser-wallet-ui/src/screens/kycStart.js | 121 +- .../src/screens/networkCreate.js | 184 +- .../src/screens/networkManage.js | 101 +- .../browser-wallet-ui/src/screens/settings.js | 225 ++- .../browser-wallet-ui/src/screens/signIn.js | 392 ++-- .../src/screens/stakingCollator.js | 340 ++-- .../src/screens/stakingCollators.js | 320 ++-- .../src/screens/stakingHome.js | 319 ++-- .../src/screens/stakingIntro.js | 409 +++-- .../browser-wallet-ui/src/screens/tokenAll.js | 5 +- .../browser-wallet-ui/src/screens/tokenBBB.js | 209 ++- .../src/screens/transactionDetails.js | 76 +- .../src/screens/transactionHistory.js | 388 ++-- .../browser-wallet-ui/src/screens/wallet.js | 61 +- .../src/screens/walletBackup.js | 224 ++- .../src/screens/walletConfirm.js | 262 ++- .../src/screens/walletCreate.js | 315 ++-- .../src/screens/walletFinish.js | 136 +- .../src/screens/walletImport.js | 307 ++-- .../src/screens/walletPassword.js | 499 +++--- .../browser-wallet-ui/src/screens/welcome.js | 148 +- packages/browser-wallet-utils/src/index.js | 477 +++-- 75 files changed, 8067 insertions(+), 8178 deletions(-) delete mode 100644 packages/browser-wallet-core/src/messaging.js delete mode 100644 packages/browser-wallet-core/src/page/injected.js diff --git a/packages/browser-wallet-base/src/app.js b/packages/browser-wallet-base/src/app.js index 8e079ca..1917230 100644 --- a/packages/browser-wallet-base/src/app.js +++ b/packages/browser-wallet-base/src/app.js @@ -9,77 +9,77 @@ const db = new databaseService() const ui = new userInterface() async function extension() { - await db.ensureInit() + await db.ensureInit() - await ui.initUi() + await ui.initUi() - // Break if there is no wallet created/imported, and return to welcome screen. - if(!await db.stores.wallets.exists()) { - if(await db.stores.settings.asyncGet('skip_intro')) { - return await ui.goToScreen('walletScreen') - } else { - return await ui.goToScreen('welcomeScreen') - } + // Break if there is no wallet created/imported, and return to welcome screen. + if(!await db.stores.wallets.exists()) { + if(await db.stores.settings.asyncGet('skip_intro')) { + return await ui.goToScreen('walletScreen') + } else { + return await ui.goToScreen('welcomeScreen') } + } - return await ui.goToScreen('dashboardScreen', { - extend_delay: true - }) + return await ui.goToScreen('dashboardScreen', { + extend_delay: true + }) } document.addEventListener('deviceready', async() => { - await extension() - - App.addListener('appStateChange', async({ isActive }) => { - if(isActive) { - const logged_in = await ui.fastCheckLogin() - - if(await ui.db.stores.wallets.exists() && !logged_in) { - await ui.showLogin(true, true) - } - - if(isAndroid()) { - setTimeout(() => { - ui.hideInit(true) - }, 600) - } else { - ui.hideInit(true) - } - } else { - ui.showInit(true) - - await Keyboard.hide() - - // reset body - document.body.style.height = ''; - document.body.classList.remove('keyboard-opened') - } - }); - - Keyboard.addListener('keyboardWillShow', info => { - const bodyHeight = window.innerHeight - info.keyboardHeight - - // update body height and add class - if(isIOs()) document.body.style.height = bodyHeight + 'px'; - document.body.classList.add('keyboard-opened') - - ui.disableFooter() - }); - - Keyboard.addListener('keyboardWillHide', info => { - // reset body - if(isIOs()) document.body.style.height = ''; - document.body.classList.remove('keyboard-opened') - - ui.enableFooter() - }); + await extension() + + App.addListener('appStateChange', async({ isActive }) => { + if(isActive) { + const logged_in = await ui.fastCheckLogin() + + if(await ui.db.stores.wallets.exists() && !logged_in) { + await ui.showLogin(true, true) + } + + if(isAndroid()) { + setTimeout(() => { + ui.hideInit(true) + }, 600) + } else { + ui.hideInit(true) + } + } else { + ui.showInit(true) + + await Keyboard.hide() + + // reset body + document.body.style.height = ''; + document.body.classList.remove('keyboard-opened') + } + }); + + Keyboard.addListener('keyboardWillShow', info => { + const bodyHeight = window.innerHeight - info.keyboardHeight + + // update body height and add class + if(isIOs()) document.body.style.height = bodyHeight + 'px'; + document.body.classList.add('keyboard-opened') + + ui.disableFooter() + }); + + Keyboard.addListener('keyboardWillHide', info => { + // reset body + if(isIOs()) document.body.style.height = ''; + document.body.classList.remove('keyboard-opened') + + ui.enableFooter() + }); }, false) // request message window.addEventListener('message', async(event) => { - const data = event.data; + const data = event.data; - if(data.source !== 'ui') return false + if(data.source !== 'ui') return false - return appMessageHandler(data) + return appMessageHandler(data) }); \ No newline at end of file diff --git a/packages/browser-wallet-base/src/background.js b/packages/browser-wallet-base/src/background.js index f1df0f5..60bf6ee 100644 --- a/packages/browser-wallet-base/src/background.js +++ b/packages/browser-wallet-base/src/background.js @@ -13,83 +13,83 @@ polkadotApi(true).then() // listen for messages from both content.js and extension.js current_browser.runtime.onConnect.addListener((port) => { - console.info(`Connected to ${port.name}`); + console.info(`Connected to ${port.name}`); + if(port.name === 'PORT_EXTENSION') { + // reload on every wallet opening + polkadotApi(true).then() + + openCount += 1; + + if(waiting_to_stop) { + deleteTimer(port) + waiting_to_stop = false; + } + + port.open_count = openCount + ports_extension.push(port) + } else if(port.name === 'PORT_CONTENT') { + port_content = port + } else if(port.name === 'KEEP_ALIVE') { + port._timer = setTimeout(forceReconnect, reconnectTime, port); + } + + port.onMessage.addListener((data) => { + return backgroundMessageHandler(data, port) + }) + + port.onDisconnect.addListener(async(port) => { if(port.name === 'PORT_EXTENSION') { - // reload on every wallet opening - polkadotApi(true).then() + openCount -= 1; - openCount += 1; + if(openCount <= 0) { + waiting_to_stop = true; - if(waiting_to_stop) { - deleteTimer(port) - waiting_to_stop = false; - } + port._timer = setTimeout(() => { + waiting_to_stop = false + }, idleTime); + } - port.open_count = openCount - ports_extension.push(port) - } else if(port.name === 'PORT_CONTENT') { - port_content = port + // remove port from the list + ports_extension = ports_extension.filter((object, index) => { + return object.open_count !== port.open_count + }) } else if(port.name === 'KEEP_ALIVE') { - port._timer = setTimeout(forceReconnect, reconnectTime, port); + await findTab() + deleteTimer(port) } - port.onMessage.addListener((data) => { - return backgroundMessageHandler(data, port) - }) + if(port.name === 'PORT_CONTENT' && ports_extension.length > 0) { + for(const port_extension of ports_extension) { + // sends a kill signal back to extension + port_extension.postMessage({ + command: 'kill_popup', + tab_id: port?.sender?.tab?.id + }) + } + } - port.onDisconnect.addListener(async(port) => { - if(port.name === 'PORT_EXTENSION') { - openCount -= 1; - - if(openCount <= 0) { - waiting_to_stop = true; - - port._timer = setTimeout(() => { - waiting_to_stop = false - }, idleTime); - } - - // remove port from the list - ports_extension = ports_extension.filter((object, index) => { - return object.open_count !== port.open_count - }) - } else if(port.name === 'KEEP_ALIVE') { - await findTab() - deleteTimer(port) - } - - if(port.name === 'PORT_CONTENT' && ports_extension.length > 0) { - for(const port_extension of ports_extension) { - // sends a kill signal back to extension - port_extension.postMessage({ - command: 'kill_popup', - tab_id: port?.sender?.tab?.id - }) - } - } - - console.warn(`Disconnected from ${port.name}`); - }); + console.warn(`Disconnected from ${port.name}`); + }); }); current_browser.runtime.onInstalled.addListener((details) => { - if((isIOs() || isIPad()) && details.reason === 'install' && process.env.NODE_ENV === 'production') { - current_browser.runtime.setUninstallURL('', () => { - // Clear data on uninstall - current_browser.storage.local.clear() - }) - } + if((isIOs() || isIPad()) && details.reason === 'install' && process.env.NODE_ENV === 'production') { + current_browser.runtime.setUninstallURL('', () => { + // Clear data on uninstall + current_browser.storage.local.clear() + }) + } }) function forceReconnect(port) { - deleteTimer(port); - port.disconnect(); + deleteTimer(port); + port.disconnect(); } function deleteTimer(port) { - if(port._timer) { - clearTimeout(port._timer); - delete port._timer; - } + if(port._timer) { + clearTimeout(port._timer); + delete port._timer; + } } \ No newline at end of file diff --git a/packages/browser-wallet-base/src/content.js b/packages/browser-wallet-base/src/content.js index e31bf97..38072a8 100644 --- a/packages/browser-wallet-base/src/content.js +++ b/packages/browser-wallet-base/src/content.js @@ -4,70 +4,70 @@ const current_browser = getCurrentBrowser() let port_content function connectContent() { - port_content = current_browser.runtime.connect({ name: 'PORT_CONTENT' }); - port_content.onDisconnect.addListener(connectContent) + port_content = current_browser.runtime.connect({ name: 'PORT_CONTENT' }); + port_content.onDisconnect.addListener(connectContent) } connectContent() // This code is inject in all the pages to intercept the messages for the browser wallet // the code injection is managed by the manifest.json of the extension: "content_scripts" window.addEventListener("message", (event) => { - // Only accept messages from this window to itself [i.e. not from any iframes] (security concerns) - if(event.source !== window) { - console.warn("[Alert] Message not coming from the same web page. Possible attack.") - return; - } + // Only accept messages from this window to itself [i.e. not from any iframes] (security concerns) + if(event.source !== window) { + console.warn("[Alert] Message not coming from the same web page. Possible attack.") + return; + } - if(event.data.origin !== 'MESSAGE_ORIGIN_PAGE') { - return - } + if(event.data.origin !== 'MESSAGE_ORIGIN_PAGE') { + return + } - // forward message to extension - if(event.data.type && (event.data.type === "BITGREEN-BROWSER-WALLET")) { - // add the domain of origin to the message data - let message = event.data; - message.params.origin = event.origin; + // forward message to extension + if(event.data.type && (event.data.type === "BITGREEN-BROWSER-WALLET")) { + // add the domain of origin to the message data + let message = event.data; + message.params.origin = event.origin; - // send the message to the extension - port_content.postMessage(message); - } + // send the message to the extension + port_content.postMessage(message); + } - return true; + return true; }, false); // listen to messages from extension, and forward them to webpage current_browser.runtime.onConnect.addListener((port) => { - port.onMessage.addListener((data) => { - if(port.name.startsWith('PORT_CONTENT_RESOLVE') || data.response.resolve) { - // resolve message requested from tab - window.postMessage({ ...data, origin: 'MESSAGE_ORIGIN_CONTENT', resolve: true }, '*'); - } else if(port.name === 'PORT_CONTENT' || port.name === 'PORT_BACKGROUND') { - window.postMessage({ ...data, origin: 'MESSAGE_ORIGIN_CONTENT' }, '*'); - } else if(port.name === 'KEEP_ALIVE') { - // console.log('KEEP_ALIVE MESSAGE') - } - }) + port.onMessage.addListener((data) => { + if(port.name.startsWith('PORT_CONTENT_RESOLVE') || data.response.resolve) { + // resolve message requested from tab + window.postMessage({ ...data, origin: 'MESSAGE_ORIGIN_CONTENT', resolve: true }, '*'); + } else if(port.name === 'PORT_CONTENT' || port.name === 'PORT_BACKGROUND') { + window.postMessage({ ...data, origin: 'MESSAGE_ORIGIN_CONTENT' }, '*'); + } else if(port.name === 'KEEP_ALIVE') { + // console.log('KEEP_ALIVE MESSAGE') + } + }) - port.onDisconnect.addListener((port) => { - if(port.name === 'KEEP_ALIVE') { - return connectKeepAlive() - } + port.onDisconnect.addListener((port) => { + if(port.name === 'KEEP_ALIVE') { + return connectKeepAlive() + } - // resolve message if connection to the popup was lost - if(port.name.startsWith('PORT_CONTENT_RESOLVE')) { - // extract message id from port name - const message_id = port.name.split('=')[1] + // resolve message if connection to the popup was lost + if(port.name.startsWith('PORT_CONTENT_RESOLVE')) { + // extract message id from port name + const message_id = port.name.split('=')[1] - window.postMessage({ id: message_id, response: { success: false, status: 'closed', error: 'Communication to the popup has been lost.' }, origin: 'MESSAGE_ORIGIN_CONTENT', resolve: true }, '*'); - } - }); + window.postMessage({ id: message_id, response: { success: false, status: 'closed', error: 'Communication to the popup has been lost.' }, origin: 'MESSAGE_ORIGIN_CONTENT', resolve: true }, '*'); + } + }); }); // code to keep background.js persistent (mv3 hack) let keep_alive_port function connectKeepAlive() { - keep_alive_port = current_browser.runtime.connect({ name: 'KEEP_ALIVE' }); - keep_alive_port.onDisconnect.addListener(connectKeepAlive) + keep_alive_port = current_browser.runtime.connect({ name: 'KEEP_ALIVE' }); + keep_alive_port.onDisconnect.addListener(connectKeepAlive) } connectKeepAlive() diff --git a/packages/browser-wallet-base/src/extension.js b/packages/browser-wallet-base/src/extension.js index 89e9674..2b6d4cc 100644 --- a/packages/browser-wallet-base/src/extension.js +++ b/packages/browser-wallet-base/src/extension.js @@ -5,85 +5,78 @@ const db = new databaseService() const ui = new userInterface() const extension = async() => { - await db.ensureInit() + await db.ensureInit() - await ui.initUi() + await ui.initUi() - // preload polkadot api - const polkadotApiReady = await polkadotApi(true) + // preload polkadot api + const polkadotApiReady = await polkadotApi(true) - if(!polkadotApiReady) { - return setTimeout(() => { - polkadotApi(true).then(async(api_ready) => { - if(!api_ready) { - return await ui.goToScreen('connectionErrorScreen') - } - - await extension() - }) - }, 2000) - } - - const params = new URLSearchParams(window.location.search) - - const command = params.has('command') ? params.get('command') : null + if(!polkadotApiReady) { + return setTimeout(() => { + polkadotApi(true).then(async(api_ready) => { + if(!api_ready) { + return await ui.goToScreen('connectionErrorScreen') + } - if(command === 'new_wallet') { - return await ui.goToScreen('walletCreateScreen') - } + await extension() + }) + }, 2000) + } - // Break if there is no wallet created/imported, and return to welcome screen. - if(!await db.stores.wallets.exists()) { - if(await db.stores.settings.asyncGet('skip_intro')) { - if(!params.has('popup')) { - await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 2000) - } - return await ui.goToScreen('walletScreen', {}, true) - } else { - return await ui.goToScreen('welcomeScreen') - } - } + const params = new URLSearchParams(window.location.search) - if(command === 'sign_in' && params.get('origin')) { - return await ui.goToScreen('signInScreen', { - message_id: params.get('id'), - tab_id: params.get('tab_id'), - domain: params.get('origin'), - title: params.get('title') - }) - } + const command = params.has('command') ? params.get('command') : null - if(command === 'send') { - return await ui.goToScreen('assetSendScreen', { - message_id: params.get('id'), - tab_id: params.get('tab_id'), - kill_popup: params.get('kill_popup'), - amount: params.get('amount'), - recipient: params.get('recipient') - }) - } + if(command === 'new_wallet') { + return await ui.goToScreen('walletCreateScreen') + } - if(command === 'extrinsic') { - return await ui.goToScreen('extrinsicSendScreen', { - message_id: params.get('id'), - tab_id: params.get('tab_id'), - kill_popup: params.get('kill_popup'), - domain: params.get('domain'), - title: params.get('title'), - pallet: params.get('pallet'), - call: params.get('call'), - call_parameters: params.get('call_parameters') - }) + // Break if there is no wallet created/imported, and return to welcome screen. + if(!await db.stores.wallets.exists()) { + if(await db.stores.settings.asyncGet('skip_intro')) { + if(!params.has('popup')) { + await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 2000) + } + return await ui.goToScreen('walletScreen', {}, true) + } else { + return await ui.goToScreen('welcomeScreen') } - - return await ui.goToScreen('dashboardScreen') + } + + if(command === 'sign_in' && params.get('origin')) { + return await ui.goToScreen('signInScreen', { + message_id: params.get('id'), + tab_id: params.get('tab_id'), + domain: params.get('origin'), + title: params.get('title') + }) + } + + if(command === 'send') { + return await ui.goToScreen('assetSendScreen', { + message_id: params.get('id'), + tab_id: params.get('tab_id'), + kill_popup: params.get('kill_popup'), + amount: params.get('amount'), + recipient: params.get('recipient') + }) + } + + if(command === 'extrinsic') { + return await ui.goToScreen('extrinsicSendScreen', { + message_id: params.get('id'), + tab_id: params.get('tab_id'), + kill_popup: params.get('kill_popup'), + domain: params.get('domain'), + title: params.get('title'), + pallet: params.get('pallet'), + call: params.get('call'), + call_parameters: params.get('call_parameters') + }) + } + + return await ui.goToScreen('dashboardScreen') } extension().then() -// document.addEventListener('DOMContentLoaded', async function () { -// await extension() -// }) - -// document.addEventListener('deviceready', async function () { -// await extension() -// }) \ No newline at end of file diff --git a/packages/browser-wallet-base/src/inject.js b/packages/browser-wallet-base/src/inject.js index 0b92fb7..92b32c6 100644 --- a/packages/browser-wallet-base/src/inject.js +++ b/packages/browser-wallet-base/src/inject.js @@ -1,91 +1,86 @@ class BitgreenWalletPlaceholder { - provider = undefined; - isBitgreenWallet = true; - connected = false; - isConnected = () => false; - __waitProvider = async() => { - const self = this; - if(self.provider) { - return self.provider; - } else { - return await new Promise((resolve, reject) => { - let retry = 0; - const interval = setInterval(() => { - if(++retry > 30) { - clearInterval(interval); - reject(new Error('BitgreenWallet provider not found')) - } - if(self.provider) { - clearInterval(interval); - resolve(self.provider) - } - }, 100); - }) - } + provider = undefined; + isBitgreenWallet = true; + connected = false; + isConnected = () => false; + __waitProvider = async() => { + const self = this; + if(self.provider) { + return self.provider; + } else { + return await new Promise((resolve, reject) => { + let retry = 0; + const interval = setInterval(() => { + if(++retry > 30) { + clearInterval(interval); + reject(new Error('BitgreenWallet provider not found')) + } + if(self.provider) { + clearInterval(interval); + resolve(self.provider) + } + }, 100); + }) } + } - on() { - this.__waitProvider().then((provider) => { - provider.on(...arguments); - }); - } + on() { + this.__waitProvider().then((provider) => { + provider.on(...arguments); + }); + } - off() { - this.__waitProvider().then((provider) => { - provider.off(...arguments); - }); - } + off() { + this.__waitProvider().then((provider) => { + provider.off(...arguments); + }); + } - addListener() { - this.__waitProvider().then((provider) => { - provider.addListener(...arguments); - }); - } + addListener() { + this.__waitProvider().then((provider) => { + provider.addListener(...arguments); + }); + } - removeListener() { - this.__waitProvider().then((provider) => { - provider.removeListener(...arguments); - }); - } + removeListener() { + this.__waitProvider().then((provider) => { + provider.removeListener(...arguments); + }); + } - removeAllListeners() { - this.__waitProvider().then((provider) => { - provider.removeAllListeners(...arguments); - }); - } + removeAllListeners() { + this.__waitProvider().then((provider) => { + provider.removeAllListeners(...arguments); + }); + } - async enable() { - const provider = await this.__waitProvider(); - return await provider.enable(...arguments); - } + async request() { + const provider = await this.__waitProvider(); + return await provider.request(...arguments); + } - async request() { - const provider = await this.__waitProvider(); - return await provider.request(...arguments); - } - - async send() { - const provider = await this.__waitProvider(); - return await provider.send(...arguments); - } + async send() { + const provider = await this.__waitProvider(); + return await provider.send(...arguments); + } - async sendAsync() { - const provider = await this.__waitProvider(); - return await provider.sendAsync(...arguments); - } + async sendAsync() { + const provider = await this.__waitProvider(); + return await provider.sendAsync(...arguments); + } } window.BitgreenWallet = new Proxy(new BitgreenWalletPlaceholder(), { - get(obj, prop) { - if(prop === 'provider') { - return undefined; - } + get(obj, prop) { + if(prop === 'provider') { + return undefined; + } - if(obj.provider) { - return Reflect.get(obj.provider, prop); - } else { - return Reflect.get(obj, prop); - } + if(obj.provider) { + return Reflect.get(obj.provider, prop); + } else { + return Reflect.get(obj, prop); } + } }) \ No newline at end of file diff --git a/packages/browser-wallet-base/src/page.js b/packages/browser-wallet-base/src/page.js index f90a456..9dac004 100644 --- a/packages/browser-wallet-base/src/page.js +++ b/packages/browser-wallet-base/src/page.js @@ -1,42 +1,40 @@ -import { enablePage, open, signIn, send, query, extrinsic, pageMessageResponseHandler } from "@bitgreen/browser-wallet-core"; +import { open, signIn, send, query, extrinsic, pageMessageResponseHandler } from "@bitgreen/browser-wallet-core"; const version = process.env.PKG_VERSION -async function injectExtension(enable, { name, version }) { - // don't clobber the existing object, we will add it (or create as needed) - window.injectedWeb3 = window.injectedWeb3 || {}; - - // add our enable function - window.injectedWeb3[name] = { - // enable: () => enable(), // Temp disable - open: () => open(), - signIn: () => signIn(), - send: (amount = 0, recipient = false, kill_popup = true) => send(amount, recipient, kill_popup), - extrinsic: (pallet, call, call_parameters, kill_popup = true) => extrinsic(pallet, call, call_parameters, kill_popup), - query: (pallet, call, call_parameters) => query(pallet, call, call_parameters), - version - } +async function injectExtension({ name, version }) { + // don't clobber the existing object, we will add it (or create as needed) + window.injectedWeb3 = window.injectedWeb3 || {}; + + window.injectedWeb3[name] = { + open: () => open(), + signIn: () => signIn(), + send: (amount = 0, recipient = false, kill_popup = true) => send(amount, recipient, kill_popup), + extrinsic: (pallet, call, call_parameters, kill_popup = true) => extrinsic(pallet, call, call_parameters, kill_popup), + query: (pallet, call, call_parameters) => query(pallet, call, call_parameters), + version + } } function inject() { - injectExtension(enablePage, { - name: 'bitgreen-wallet-js', - version: version - }).then(r => { + injectExtension({ + name: 'bitgreen-wallet-js', + version: version + }).then(r => { - }); + }); } window.addEventListener("message", (event) => { - if(event.source !== window || event.data.origin !== 'MESSAGE_ORIGIN_CONTENT') { - return; - } - - if(event.data.id) { - pageMessageResponseHandler(event.data); - } else { - console.error('Missing id for response.'); - } + if(event.source !== window || event.data.origin !== 'MESSAGE_ORIGIN_CONTENT') { + return; + } + + if(event.data.id) { + pageMessageResponseHandler(event.data); + } else { + console.error('Missing id for response.'); + } }); inject() \ No newline at end of file diff --git a/packages/browser-wallet-base/src/polkadot/packageInfoApi.js b/packages/browser-wallet-base/src/polkadot/packageInfoApi.js index 2f19cd6..535075f 100644 --- a/packages/browser-wallet-base/src/polkadot/packageInfoApi.js +++ b/packages/browser-wallet-base/src/polkadot/packageInfoApi.js @@ -4,8 +4,8 @@ // Do not edit, auto-generated by @polkadot/dev export const packageInfo = { - name: '@polkadot/api', - path: 'auto', - type: 'esm', - version: '9.10.5' + name: '@polkadot/api', + path: 'auto', + type: 'esm', + version: '9.10.5' }; \ No newline at end of file diff --git a/packages/browser-wallet-base/webpack.android.cjs b/packages/browser-wallet-base/webpack.android.cjs index 4b36f4c..794c8d0 100755 --- a/packages/browser-wallet-base/webpack.android.cjs +++ b/packages/browser-wallet-base/webpack.android.cjs @@ -1,7 +1,7 @@ const createConfig = require('./webpack.shared.cjs'); module.exports = [ - createConfig({ - app: './src/app.js' - }, [], true, 'android') + createConfig({ + app: './src/app.js' + }, [], true, 'android') ]; \ No newline at end of file diff --git a/packages/browser-wallet-base/webpack.chrome.cjs b/packages/browser-wallet-base/webpack.chrome.cjs index 6976dad..82d9da6 100644 --- a/packages/browser-wallet-base/webpack.chrome.cjs +++ b/packages/browser-wallet-base/webpack.chrome.cjs @@ -1,13 +1,13 @@ const createConfig = require('./webpack.shared.cjs'); module.exports = [ - createConfig({ - background: './src/background.js', - content: './src/content.js', - page: './src/page.js', - inject: './src/inject.js' - }, {}, false, 'chrome'), - createConfig({ - extension: './src/extension.js' - }, [], true, 'chrome'), + createConfig({ + background: './src/background.js', + content: './src/content.js', + page: './src/page.js', + inject: './src/inject.js' + }, {}, false, 'chrome'), + createConfig({ + extension: './src/extension.js' + }, [], true, 'chrome'), ]; \ No newline at end of file diff --git a/packages/browser-wallet-base/webpack.firefox.cjs b/packages/browser-wallet-base/webpack.firefox.cjs index 37017e7..0165a6f 100644 --- a/packages/browser-wallet-base/webpack.firefox.cjs +++ b/packages/browser-wallet-base/webpack.firefox.cjs @@ -1,12 +1,12 @@ const createConfig = require('./webpack.shared.cjs'); module.exports = [ - createConfig({ - background: './src/background.js', - content: './src/content.js', - page: './src/page.js' - }, {}, false, 'firefox'), - createConfig({ - extension: './src/extension.js' - }, [], true, 'firefox') + createConfig({ + background: './src/background.js', + content: './src/content.js', + page: './src/page.js' + }, {}, false, 'firefox'), + createConfig({ + extension: './src/extension.js' + }, [], true, 'firefox') ]; \ No newline at end of file diff --git a/packages/browser-wallet-base/webpack.ios.cjs b/packages/browser-wallet-base/webpack.ios.cjs index 5ee7e9e..515206d 100644 --- a/packages/browser-wallet-base/webpack.ios.cjs +++ b/packages/browser-wallet-base/webpack.ios.cjs @@ -1,7 +1,7 @@ const createConfig = require('./webpack.shared.cjs'); module.exports = [ - createConfig({ - app: './src/app.js' - }, [], true, 'ios') + createConfig({ + app: './src/app.js' + }, [], true, 'ios') ]; \ No newline at end of file diff --git a/packages/browser-wallet-base/webpack.safari.cjs b/packages/browser-wallet-base/webpack.safari.cjs index 0b47243..652b939 100644 --- a/packages/browser-wallet-base/webpack.safari.cjs +++ b/packages/browser-wallet-base/webpack.safari.cjs @@ -1,13 +1,13 @@ const createConfig = require('./webpack.shared.cjs'); module.exports = [ - createConfig({ - background: './src/background.js', - content: './src/content.js', - page: './src/page.js', - inject: './src/inject.js' - }, {}, false, 'safari'), - createConfig({ - extension: './src/extension.js' - }, [], true, 'safari') + createConfig({ + background: './src/background.js', + content: './src/content.js', + page: './src/page.js', + inject: './src/inject.js' + }, {}, false, 'safari'), + createConfig({ + extension: './src/extension.js' + }, [], true, 'safari') ]; \ No newline at end of file diff --git a/packages/browser-wallet-core/src/app.js b/packages/browser-wallet-core/src/app.js index 5a7fddb..1a2f5de 100644 --- a/packages/browser-wallet-core/src/app.js +++ b/packages/browser-wallet-core/src/app.js @@ -2,23 +2,23 @@ import { knownApps } from "./constants.js"; import escapeStringRegexp from 'escape-string-regexp'; export const checkIfAppIsKnown = (domain) => { - // Check for exact match first - for(const app of knownApps) { - if (app.domain === domain) { - return app; - } + // Check for exact match first + for(const app of knownApps) { + if (app.domain === domain) { + return app; } + } - // Check for wildcard domains - for(const app of knownApps) { - // Escape regex characters and replace '*' with a regex wildcard - const pattern = escapeStringRegexp(app.domain.replace(/\*/g, '__WILDCARD__')).replace(/__WILDCARD__/g, '.*') - const regex = new RegExp(`^${pattern}$`); + // Check for wildcard domains + for(const app of knownApps) { + // Escape regex characters and replace '*' with a regex wildcard + const pattern = escapeStringRegexp(app.domain.replace(/\*/g, '__WILDCARD__')).replace(/__WILDCARD__/g, '.*') + const regex = new RegExp(`^${pattern}$`); - if (regex.test(domain)) { - return app; - } + if (regex.test(domain)) { + return app; } + } - return false + return false } \ No newline at end of file diff --git a/packages/browser-wallet-core/src/background/extension.js b/packages/browser-wallet-core/src/background/extension.js index bb4ccca..4366f75 100644 --- a/packages/browser-wallet-core/src/background/extension.js +++ b/packages/browser-wallet-core/src/background/extension.js @@ -1,21 +1,21 @@ import aesjs from 'aes-js' import {hexToU8a, stringToU8a, u8aToHex} from '@polkadot/util' import { - blake2AsU8a, - cryptoWaitReady, - keccakAsU8a, - mnemonicGenerate, - mnemonicValidate, - sha512AsU8a + blake2AsU8a, + cryptoWaitReady, + keccakAsU8a, + mnemonicGenerate, + mnemonicValidate, + sha512AsU8a } from '@polkadot/util-crypto' import { - AccountStore, - AssetStore, CacheStore, - NetworkStore, - SettingsStore, - TokenStore, - TransactionStore, - WalletStore + AccountStore, + AssetStore, CacheStore, + NetworkStore, + SettingsStore, + TokenStore, + TransactionStore, + WalletStore } from "../stores/index.js" import {Keyring} from "@polkadot/keyring" import {polkadotApi} from "../polkadotApi.js"; @@ -26,955 +26,955 @@ import {showPopup} from "./index.js"; import BigNumber from "bignumber.js"; class Extension { - #password + #password + + constructor() { + this.accounts_store = new AccountStore() + this.networks_store = new NetworkStore() + this.wallets_store = new WalletStore() + this.settings_store = new SettingsStore() + this.#password = null + this.password_timer = null + + this.init().then() + } + + async init() { + this.cache_store = new CacheStore(await this.networks_store.current()) + } + + async handle(data, from, port) { + await this.refreshPassword(data.command) + + try { + switch(data.command) { + case 'new_wallet_screen': + return await this.newWalletScreen() + case 'new_wallet': + return await this.newWallet(data?.params) + case 'save_wallet': + return await this.saveWallet(data?.params) + case 'unlock_wallet': + return await this.unlockWallet(data?.params) + case 'lock_wallet': + return await this.lockWallet() + case 'new_account': + return await this.newAccount(data?.params) + case 'save_network': + return await this.saveNetwork(data?.params) + case 'change_network': + return await this.changeNetwork(data?.params) + case 'get_last_block': + return await this.getLastBlock() + case 'get_balance': + return await this.getBalance() + case 'get_all_balances': + return await this.getAllBalances() + case 'get_vesting_contract': + return await this.getVestingContract() + case 'get_transactions': + return await this.getTransactions() + case 'get_asset_transactions': + return await this.getAssetTransactions() + case 'get_token_transactions': + return await this.getTokenTransactions() + case 'reveal_mnemonic': + return await this.revealMnemonic(data?.params) + case 'check_login': + return await this.checkLogin() + case 'fast_check_login': + return await this.fastCheckLogin() + case 'sign_in': + return await this.signIn(data?.id, data?.params) + case 'transfer': + return await this.transfer(data?.id, data?.params) + case 'extrinsic': + return await this.submitExtrinsic(data?.id, data?.params) + case 'change_setting': + return await this.changeSetting(data?.params) + case 'get_collators': + return await this.getCollators() + case 'get_estimated_fee': + return await this.getEstimatedFee(data?.params) + case 'check_api_ready': + return await this.checkApiReady() + case 'reconnect_api': + return await this.reconnectApi() + default: + return false + } + } catch (e) { + return false + } + + } + + async savePassword(password) { + this.#password = password + + await this.refreshPassword() + } + + async refreshPassword(command = null) { + let skip = false + + if(command && command === 'fast_check_login') { + skip = true + } + + if(!this.#password || skip) return false + + // refresh password - extend its time + clearTimeout(this.password_timer); + if(this.#password) { + this.password_timer = setTimeout(() => { + this.#password = null; + }, passwordTimeout) + } + } + + async newWalletScreen() { + return await showPopup('new_wallet'); + } + + async newWallet(params) { + const words = params?.words === 24 ? 24 : 12 + await cryptoWaitReady() + + const mnemonic = mnemonicGenerate(words); + return mnemonic.split(' ') + } + + async saveWallet(params) { + let mnemonic = params?.mnemonic + const password = params?.password + const name = params?.name + + // convert mnemonic to string, space separated + mnemonic = Object.entries(mnemonic).map(([key, value]) => `${value}`).join(' ') + + if(!mnemonicValidate(mnemonic)) { + return false + } + + const encrypted_data = await this.encryptWallet(mnemonic, password) + await this.wallets_store.asyncSet('main', encrypted_data) - constructor() { - this.accounts_store = new AccountStore() - this.networks_store = new NetworkStore() - this.wallets_store = new WalletStore() - this.settings_store = new SettingsStore() - this.#password = null - this.password_timer = null + // create main account & set as default + await this.createAccount(name, mnemonic, 'main') + await this.accounts_store.asyncSet('current', 'main') - this.init().then() - } - - async init() { - this.cache_store = new CacheStore(await this.networks_store.current()) - } + // import accounts with balance > 0 + this.importAccountsWithBalance(mnemonic, password).then() - async handle(data, from, port) { - await this.refreshPassword(data.command) + return true + } - try { - switch(data.command) { - case 'new_wallet_screen': - return await this.newWalletScreen() - case 'new_wallet': - return await this.newWallet(data?.params) - case 'save_wallet': - return await this.saveWallet(data?.params) - case 'unlock_wallet': - return await this.unlockWallet(data?.params) - case 'lock_wallet': - return await this.lockWallet() - case 'new_account': - return await this.newAccount(data?.params) - case 'save_network': - return await this.saveNetwork(data?.params) - case 'change_network': - return await this.changeNetwork(data?.params) - case 'get_last_block': - return await this.getLastBlock() - case 'get_balance': - return await this.getBalance() - case 'get_all_balances': - return await this.getAllBalances() - case 'get_vesting_contract': - return await this.getVestingContract() - case 'get_transactions': - return await this.getTransactions() - case 'get_asset_transactions': - return await this.getAssetTransactions() - case 'get_token_transactions': - return await this.getTokenTransactions() - case 'reveal_mnemonic': - return await this.revealMnemonic(data?.params) - case 'check_login': - return await this.checkLogin() - case 'fast_check_login': - return await this.fastCheckLogin() - case 'sign_in': - return await this.signIn(data?.id, data?.params) - case 'transfer': - return await this.transfer(data?.id, data?.params) - case 'extrinsic': - return await this.submitExtrinsic(data?.id, data?.params) - case 'change_setting': - return await this.changeSetting(data?.params) - case 'get_collators': - return await this.getCollators() - case 'get_estimated_fee': - return await this.getEstimatedFee(data?.params) - case 'check_api_ready': - return await this.checkApiReady() - case 'reconnect_api': - return await this.reconnectApi() - default: - return false - } - } catch (e) { - return false - } + async unlockWallet(params) { + const password = params?.password - } + const result = await this.decryptWallet(password) - async savePassword(password) { - this.#password = password + if(!result) return false - await this.refreshPassword() - } + await this.savePassword(password) - async refreshPassword(command = null) { - let skip = false + return true + } - if(command && command === 'fast_check_login') { - skip = true - } + async lockWallet() { + this.#password = null + clearTimeout(this.password_timer) + } - if(!this.#password || skip) return false + async newAccount(params) { + const password = params?.password + const name = params?.name + const next_id = await this.accounts_store.nextId() + let derivation_path = params?.derivation_path.toLowerCase() - // refresh password - extend its time - clearTimeout(this.password_timer); - if(this.#password) { - this.password_timer = setTimeout(() => { - this.#password = null; - }, passwordTimeout) - } + if(!password) { + return { error: 'Password is wrong!' } } - async newWalletScreen() { - return await showPopup('new_wallet'); + if(!name) { + return { error: 'Account Name is required.' } } - async newWallet(params) { - const words = params?.words === 24 ? 24 : 12 - await cryptoWaitReady() + if(derivation_path && derivation_path !== '') { + if(!derivation_path.match(/^[\w-]+$/g)) { + return { error: 'Invalid derivation path.' } + } - const mnemonic = mnemonicGenerate(words); - return mnemonic.split(' ') + const account_exist = await this.accounts_store.asyncGet(derivation_path) + if(account_exist) { + return { error: 'Account already exists.' } + } + } else { + derivation_path = next_id } - async saveWallet(params) { - let mnemonic = params?.mnemonic - const password = params?.password - const name = params?.name + const mnemonic = await this.decryptWallet(password, true) - // convert mnemonic to string, space separated - mnemonic = Object.entries(mnemonic).map(([key, value]) => `${value}`).join(' ') + if(mnemonic) { + const response = this.createAccount(name, mnemonic, derivation_path) + if(response) await this.accounts_store.asyncSet('current', derivation_path) + return response + } - if(!mnemonicValidate(mnemonic)) { - return false - } + return false + } - const encrypted_data = await this.encryptWallet(mnemonic, password) - await this.wallets_store.asyncSet('main', encrypted_data) + async saveNetwork(params) { + let network_id = params?.network_id + const network_name = params?.network_name + const network_url = params?.network_url + const switch_network = params?.switch_network - // create main account & set as default - await this.createAccount(name, mnemonic, 'main') - await this.accounts_store.asyncSet('current', 'main') + if(!network_id) { + network_id = await this.networks_store.nextId() + } - // import accounts with balance > 0 - this.importAccountsWithBalance(mnemonic, password).then() + await this.networks_store.asyncSet(network_id, { + name: network_name, + url: network_url + }) - return true + if(switch_network) { + await this.networks_store.asyncSet('current', network_id) + await polkadotApi(true) // reload polkadot API } + } - async unlockWallet(params) { - const password = params?.password + async changeNetwork(params) { + const network_id = params?.network_id - const result = await this.decryptWallet(password) + await this.networks_store.asyncSet('current', network_id) + await polkadotApi(true) // reload polkadot API + } - if(!result) return false + async getLastBlock() { + const polkadot_api = await polkadotApi() - await this.savePassword(password) + const block = await polkadot_api.rpc.chain.getBlock() - return true - } + return block.toJSON().block + } - async lockWallet() { - this.#password = null - clearTimeout(this.password_timer) + async getBalance() { + const polkadot_api = await polkadotApi() + const account = await this.accounts_store.current() + + const { nonce, data: balance } = await polkadot_api.query.system.account(account.address); + + return { + free: new BigNumber(balance.free).toString(), + reserved: new BigNumber(balance.reserved).toString(), + frozen: new BigNumber(balance?.frozen || 0).toString(), + total: new BigNumber(balance.free).plus(new BigNumber(balance.reserved)).plus(new BigNumber(balance?.frozen || 0)).toString(), } + } - async newAccount(params) { - const password = params?.password - const name = params?.name - const next_id = await this.accounts_store.nextId() - let derivation_path = params?.derivation_path.toLowerCase() + async getAllBalances() { + const current_network = await this.networks_store.current() + const current_account = await this.accounts_store.current() - if(!password) { - return { error: 'Password is wrong!' } - } + const polkadot_api = await polkadotApi() - if(!name) { - return { error: 'Account Name is required.' } - } + if(!['mainnet', 'testnet'].includes(current_network.id)) return false; - if(derivation_path && derivation_path !== '') { - if(!derivation_path.match(/^[\w-]+$/g)) { - return { error: 'Invalid derivation path.' } - } + const balances = { + tokens: [], + assets: [], - const account_exist = await this.accounts_store.asyncGet(derivation_path) - if(account_exist) { - return { error: 'Account already exists.' } - } - } else { - derivation_path = next_id - } + total: new BigNumber(0), + tokens_total: new BigNumber(0) + } - const mnemonic = await this.decryptWallet(password, true) + // Add BBB on the list + const { nonce, data: balance } = await polkadot_api.query.system.account(current_account.address); + const bbb_balance = balance.toPrimitive() + balances.tokens.push({ + token_name: 'BBB', + free: new BigNumber(bbb_balance.free).toString(), + reserved: new BigNumber(bbb_balance.reserved).toString(), + frozen: new BigNumber(bbb_balance?.frozen || 0).toString(), + total: new BigNumber(bbb_balance.free).plus(new BigNumber(bbb_balance.reserved)).plus(new BigNumber(bbb_balance?.frozen || 0)).toString(), + price: bbbTokenPrice + }) + balances.total = balances.total.plus(new BigNumber(bbb_balance.free)).plus(new BigNumber(bbb_balance.reserved)).plus(new BigNumber(bbb_balance?.frozen || 0)) - if(mnemonic) { - const response = this.createAccount(name, mnemonic, derivation_path) - if(response) await this.accounts_store.asyncSet('current', derivation_path) - return response + + try { + const url = current_network.api_endpoint + '/tokens-assets/ids?account=' + current_account.address + '&includeInfo=true'; + let result = await fetch(url, { + mode: 'cors', + headers: { + 'Content-Type': 'application/json', } + }) + result = await result.json() - return false - } + for(const asset of result.assets) { + let price = 0 - async saveNetwork(params) { - let network_id = params?.network_id - const network_name = params?.network_name - const network_url = params?.network_url - const switch_network = params?.switch_network + const asset_id = asset.assetId !== null ? asset.assetId : asset + const asset_name = asset?.projectName ? asset.projectName : `Credits [${asset}]` + try { + const data = (await polkadot_api.query.assets.account(asset_id, current_account.address)).toHuman() + if(data) { + balances.assets.push({ + asset_id: asset_id, + asset_name: asset_name, + balance: parseInt(data.balance.replaceAll(',', '')), + price: price + }) - if(!network_id) { - network_id = await this.networks_store.nextId() + balances.total = balances.total.plus(new BigNumber(humanToBalance(data.balance.replaceAll(',', '')))) + } + } catch (e) { + console.log('error getting asset balance') } + } - await this.networks_store.asyncSet(network_id, { - name: network_name, - url: network_url - }) + for(const token of result.tokens) { + let price = 0 + if(token === 'USDT' || token === 'USDC') { + price = 0.9898 + } - if(switch_network) { - await this.networks_store.asyncSet('current', network_id) - await polkadotApi(true) // reload polkadot API + try { + const { free, reserved, frozen } = await polkadot_api.query.tokens.accounts(current_account.address, token); + balances.tokens.push({ + token_name: token, + free: new BigNumber(free), + reserved: new BigNumber(reserved), + frozen: new BigNumber(frozen), + total: new BigNumber(free).plus(new BigNumber(reserved)).plus(new BigNumber(frozen)).toString(), + price: price + }) + + balances.total = balances.total.plus(new BigNumber(free)).plus(new BigNumber(reserved)).plus(new BigNumber(frozen)) + balances.tokens_total = balances.tokens_total.plus(new BigNumber(free)).plus(new BigNumber(reserved)).plus(new BigNumber(frozen)) + } catch (e) { + console.log('error getting token balance') } - } + } + } catch (e) {} - async changeNetwork(params) { - const network_id = params?.network_id + balances.total = balances.total.toString() + balances.tokens_total = balances.tokens_total.toString() - await this.networks_store.asyncSet('current', network_id) - await polkadotApi(true) // reload polkadot API - } + return balances + } - async getLastBlock() { - const polkadot_api = await polkadotApi() + async getVestingContract() { + const polkadot_api = await polkadotApi() + const current_account = await this.accounts_store.current() - const block = await polkadot_api.rpc.chain.getBlock() + let contract = await polkadot_api.query.vestingContract.vestingContracts(current_account.address) + contract = contract.toPrimitive() - return block.toJSON().block + if(contract && contract.amount) { + return contract } - async getBalance() { - const polkadot_api = await polkadotApi() - const account = await this.accounts_store.current() + return false + } - const { nonce, data: balance } = await polkadot_api.query.system.account(account.address); + async getBalanceByAddress(account_address) { + const polkadot_api = await polkadotApi() - return { - free: new BigNumber(balance.free).toString(), - reserved: new BigNumber(balance.reserved).toString(), - frozen: new BigNumber(balance?.frozen || 0).toString(), - total: new BigNumber(balance.free).plus(new BigNumber(balance.reserved)).plus(new BigNumber(balance?.frozen || 0)).toString(), - } + if(!addressValid(account_address)) { + return 0 } - async getAllBalances() { - const current_network = await this.networks_store.current() - const current_account = await this.accounts_store.current() + const { nonce, data: balance } = await polkadot_api.query.system.account(account_address); - const polkadot_api = await polkadotApi() + return balance.free.toString() + } - if(!['mainnet', 'testnet'].includes(current_network.id)) return false; + async initTransactionsStore() { + const current_network = await this.networks_store.current() + const current_account = await this.accounts_store.current() - const balances = { - tokens: [], - assets: [], + this.transactions_store = new TransactionStore(current_network, current_account) + } - total: new BigNumber(0), - tokens_total: new BigNumber(0) - } + async getTransactions() { + await this.initTransactionsStore() - // Add BBB on the list - const { nonce, data: balance } = await polkadot_api.query.system.account(current_account.address); - const bbb_balance = balance.toPrimitive() - balances.tokens.push({ - token_name: 'BBB', - free: new BigNumber(bbb_balance.free).toString(), - reserved: new BigNumber(bbb_balance.reserved).toString(), - frozen: new BigNumber(bbb_balance?.frozen || 0).toString(), - total: new BigNumber(bbb_balance.free).plus(new BigNumber(bbb_balance.reserved)).plus(new BigNumber(bbb_balance?.frozen || 0)).toString(), - price: bbbTokenPrice - }) - balances.total = balances.total.plus(new BigNumber(bbb_balance.free)).plus(new BigNumber(bbb_balance.reserved)).plus(new BigNumber(bbb_balance?.frozen || 0)) + await this.transactions_store.asyncRemoveAll() + await this.transactions_store.fetch() + let transactions = await this.transactions_store.asyncAll() - try { - const url = current_network.api_endpoint + '/tokens-assets/ids?account=' + current_account.address + '&includeInfo=true'; - let result = await fetch(url, { - mode: 'cors', - headers: { - 'Content-Type': 'application/json', - } - }) - result = await result.json() - - for(const asset of result.assets) { - let price = 0 - - const asset_id = asset.assetId !== null ? asset.assetId : asset - const asset_name = asset?.projectName ? asset.projectName : `Credits [${asset}]` - try { - const data = (await polkadot_api.query.assets.account(asset_id, current_account.address)).toHuman() - if(data) { - balances.assets.push({ - asset_id: asset_id, - asset_name: asset_name, - balance: parseInt(data.balance.replaceAll(',', '')), - price: price - }) - - balances.total = balances.total.plus(new BigNumber(humanToBalance(data.balance.replaceAll(',', '')))) - } - } catch (e) { - console.log('error getting asset balance') - } - } + // Sort by date by default + transactions.sort((a, b) => { + return new Date(Date.parse(b.value.createdAt)) - new Date(Date.parse(a.value.createdAt)); + }) - for(const token of result.tokens) { - let price = 0 - if(token === 'USDT' || token === 'USDC') { - price = 0.9898 - } + return transactions + } - try { - const { free, reserved, frozen } = await polkadot_api.query.tokens.accounts(current_account.address, token); - balances.tokens.push({ - token_name: token, - free: new BigNumber(free), - reserved: new BigNumber(reserved), - frozen: new BigNumber(frozen), - total: new BigNumber(free).plus(new BigNumber(reserved)).plus(new BigNumber(frozen)).toString(), - price: price - }) + async initAssetsStore() { + const current_network = await this.networks_store.current() + const current_account = await this.accounts_store.current() - balances.total = balances.total.plus(new BigNumber(free)).plus(new BigNumber(reserved)).plus(new BigNumber(frozen)) - balances.tokens_total = balances.tokens_total.plus(new BigNumber(free)).plus(new BigNumber(reserved)).plus(new BigNumber(frozen)) - } catch (e) { - console.log('error getting token balance') - } - } - } catch (e) {} + this.assets_store = new AssetStore(current_network, current_account) + } - balances.total = balances.total.toString() - balances.tokens_total = balances.tokens_total.toString() + async getAssetTransactions() { + await this.initAssetsStore() - return balances - } + await this.assets_store.asyncRemoveAll() + await this.assets_store.fetch() - async getVestingContract() { - const polkadot_api = await polkadotApi() - const current_account = await this.accounts_store.current() + let assets = await this.assets_store.asyncAll() - let contract = await polkadot_api.query.vestingContract.vestingContracts(current_account.address) - contract = contract.toPrimitive() + // Sort by date by default + assets.sort((a, b) => { + return new Date(Date.parse(b.value.createdAt)) - new Date(Date.parse(a.value.createdAt)); + }) - if(contract && contract.amount) { - return contract - } + return assets + } - return false - } + async initTokensStore() { + const current_network = await this.networks_store.current() + const current_account = await this.accounts_store.current() - async getBalanceByAddress(account_address) { - const polkadot_api = await polkadotApi() + this.tokens_store = new TokenStore(current_network, current_account) + } - if(!addressValid(account_address)) { - return 0 - } + async getTokenTransactions() { + await this.initTokensStore() - const { nonce, data: balance } = await polkadot_api.query.system.account(account_address); + await this.tokens_store.asyncRemoveAll() + await this.tokens_store.fetch() - return balance.free.toString() - } + let tokens = await this.tokens_store.asyncAll() - async initTransactionsStore() { - const current_network = await this.networks_store.current() - const current_account = await this.accounts_store.current() + // Sort by date by default + tokens.sort((a, b) => { + return new Date(Date.parse(b.value.createdAt)) - new Date(Date.parse(a.value.createdAt)); + }) - this.transactions_store = new TransactionStore(current_network, current_account) - } + return tokens + } - async getTransactions() { - await this.initTransactionsStore() + async revealMnemonic(params) { + const password = params?.password - await this.transactions_store.asyncRemoveAll() - await this.transactions_store.fetch() + if(!password) return false - let transactions = await this.transactions_store.asyncAll() + return await this.decryptWallet(password, true) + } - // Sort by date by default - transactions.sort((a, b) => { - return new Date(Date.parse(b.value.createdAt)) - new Date(Date.parse(a.value.createdAt)); - }) + async checkLogin() { + return await this.decryptWallet(this.#password) + } - return transactions - } + async fastCheckLogin() { + return !!this.#password + } - async initAssetsStore() { - const current_network = await this.networks_store.current() - const current_account = await this.accounts_store.current() + async encryptWallet(mnemonic, password) { + // get ascii value of first 2 chars + const vb1 = password.charCodeAt(0); + const vb2 = password.charCodeAt(1); - this.assets_store = new AssetStore(current_network, current_account) - } + // position to derive other 3 passwords + const p = vb1*vb2; - async getAssetTransactions() { - await this.initAssetsStore() + // derive the password used for encryption with an init vector (random string) and 100000 hashes with 3 different algorithms + let randomstring = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for(let i = 0; i < 32; i++) { + randomstring += characters.charAt(Math.floor(Math.random()*charactersLength)); + } + let dpwd1 = ''; + let dpwd2 = ''; + let dpwd3 = ''; + let h = keccakAsU8a(password + randomstring); + for(let i = 0; i < 100000; i++) { + h = keccakAsU8a(h); + if(i === p) { + dpwd1 = h; + } + h = sha512AsU8a(h); + if(i === p) { + dpwd2 = h; + } + h = blake2AsU8a(h); + if(i === p) { + dpwd3 = h; + } + } + + // 3 Layers encryption + // encrypt the secret words in AES256-CFB + let ivf = ''; + for(let i = 0; i < 16; i++) { + ivf += characters.charAt(Math.floor(Math.random()*charactersLength)); + } + const ivaescfb = aesjs.utils.utf8.toBytes(ivf); + const keyaescfb = dpwd1.slice(0, 32); + const aesCfb = new aesjs.ModeOfOperation.cfb(keyaescfb, ivaescfb); + const mnemonicbytes = aesjs.utils.utf8.toBytes(mnemonic); + + let encryptedaescfb = aesCfb.encrypt(mnemonicbytes); + + // encrypt the output of AES256-CFB in AES256-CTR + let ivs = ''; + for(let i = 0; i < 16; i++) { + ivs += characters.charAt(Math.floor(Math.random()*charactersLength)); + } + + const ivaesctr = aesjs.utils.utf8.toBytes(ivs); + //const keyaes= aesjs.utils.utf8.toBytes(dpwd2.slice(0,32)); + const keyaesctr = dpwd2.slice(0, 32); + let aesCtr = new aesjs.ModeOfOperation.ctr(keyaesctr, ivaesctr); + let encryptedaesctr = aesCtr.encrypt(encryptedaescfb); + + // encrypt the output of AES256-CTR in AES256-OFB + let ivso = ''; + for(let i = 0; i < 16; i++) { + ivso += characters.charAt(Math.floor(Math.random()*charactersLength)); + } + const ivaesofb = aesjs.utils.utf8.toBytes(ivso); + const keyaesofb = dpwd3.slice(0, 32); + let aesOfb = new aesjs.ModeOfOperation.ofb(keyaesofb, ivaesofb); + let encryptedaesofb = aesOfb.encrypt(encryptedaesctr); + let encryptedhex = aesjs.utils.hex.fromBytes(encryptedaesofb); + + // convert to Hex json + return { + "iv": randomstring, + "ivaescfb": u8aToHex(ivaescfb), + "ivaesctr": u8aToHex(ivaesctr), + "ivaesofb": u8aToHex(ivaesofb), + "encrypted": encryptedhex + }; + } + + async decryptWallet(password, mnemonic_only = false) { + if(password?.length < 2 || !password) { + return false; + } + + const wallet_data = await this.wallets_store.asyncGet('main') + if(!wallet_data) { + return false; + } + + try { + // get ascii value of first 2 chars + const vb1 = password.charCodeAt(0); + const vb2 = password.charCodeAt(1); + + // position to derive other 3 passwords + const p = vb1*vb2; + + // derive the password used for encryption with an init vector (random string) and 100000 hashes with 3 different algorithms + const enc = wallet_data; + let randomstring = enc.iv; + let dpwd1 = ''; + let dpwd2 = ''; + let dpwd3 = ''; + let h = keccakAsU8a(password + randomstring); + for(let i = 0; i < 100000; i++) { + h = keccakAsU8a(h); + if(i === p) { + dpwd1 = h; + } + h = sha512AsU8a(h); + if(i === p) { + dpwd2 = h; + } + h = blake2AsU8a(h); + if(i === p) { + dpwd3 = h; + } + } + + // decrypt AES-OFB + const ivaesofb = hexToU8a(enc.ivaesofb); + const keyaesofb = dpwd3.slice(0, 32); + let aesOfb = new aesjs.ModeOfOperation.ofb(keyaesofb, ivaesofb); + const encryptedhex = enc.encrypted; + const encryptedaesofb = aesjs.utils.hex.toBytes(encryptedhex); + let encryptedaesctr = aesOfb.decrypt(encryptedaesofb); - await this.assets_store.asyncRemoveAll() - await this.assets_store.fetch() + // decrypt AES-CTR + const ivaesctr = hexToU8a(enc.ivaesctr); + const keyaesctr = dpwd2.slice(0, 32); + let aesCtr = new aesjs.ModeOfOperation.ctr(keyaesctr, ivaesctr); + let encryptedaescfb = aesCtr.decrypt(encryptedaesctr); - let assets = await this.assets_store.asyncAll() + // decrypt AES-CFB + const ivaescfb = hexToU8a(enc.ivaescfb); + const keyaescfb = dpwd1.slice(0, 32); + let aesCfb = new aesjs.ModeOfOperation.cfb(keyaescfb, ivaescfb); + let decrypted = aesCfb.decrypt(encryptedaescfb); + let decrypted_mnemonic = aesjs.utils.utf8.fromBytes(decrypted); - // Sort by date by default - assets.sort((a, b) => { - return new Date(Date.parse(b.value.createdAt)) - new Date(Date.parse(a.value.createdAt)); - }) + if(!decrypted_mnemonic) { + return false; + } else { + if(!mnemonicValidate(decrypted_mnemonic)) { + return false; + } - return assets + if(mnemonic_only) { + return decrypted_mnemonic; + } + + return true; + } + } catch (e) { + console.log('Error decoding wallet:', e) + return false } + } - async initTokensStore() { - const current_network = await this.networks_store.current() - const current_account = await this.accounts_store.current() + async createAccount(name, mnemonic, account_id) { + await cryptoWaitReady() - this.tokens_store = new TokenStore(current_network, current_account) + let uri_mnemonic = mnemonic + if(account_id !== 'main') { + uri_mnemonic += '//' + account_id } - async getTokenTransactions() { - await this.initTokensStore() + const keyring = new Keyring({ + type: 'sr25519' + }); - await this.tokens_store.asyncRemoveAll() - await this.tokens_store.fetch() + const keypair = keyring.addFromUri(uri_mnemonic, { + name: '' + }, 'sr25519'); - let tokens = await this.tokens_store.asyncAll() + await this.accounts_store.asyncSet(account_id, { + "address": keypair.address, + "name": name + }) - // Sort by date by default - tokens.sort((a, b) => { - return new Date(Date.parse(b.value.createdAt)) - new Date(Date.parse(a.value.createdAt)); - }) + await this.cache_store.remove('last_fetch_kyc') - return tokens - } + return account_id + } - async revealMnemonic(params) { - const password = params?.password + async loadAccount(password, account_id, temp_load = false) { + await cryptoWaitReady() - if(!password) return false + let mnemonic = await this.decryptWallet(password, true) - return await this.decryptWallet(password, true) + if(!mnemonic) { + return false } - async checkLogin() { - return await this.decryptWallet(this.#password) + const account = await this.accounts_store.asyncGet(account_id) + if(account_id !== 'main' && account_id && (account || temp_load)) { + mnemonic += '//' + account_id } - async fastCheckLogin() { - return !!this.#password - } + const keyring = new Keyring({ + type: 'sr25519' + }); - async encryptWallet(mnemonic, password) { - // get ascii value of first 2 chars - const vb1 = password.charCodeAt(0); - const vb2 = password.charCodeAt(1); + return keyring.addFromUri(mnemonic, { name: temp_load ? 'Account ' + account_id : account.name }, 'sr25519'); + } - // position to derive other 3 passwords - const p = vb1*vb2; + async importAccountsWithBalance(mnemonic, password) { + for(let i = 0; i <= 100; i++) { + const account_id = i + const temp_account = await this.loadAccount(password, account_id.toString(), true) - // derive the password used for encryption with an init vector (random string) and 100000 hashes with 3 different algorithms - let randomstring = ''; - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const charactersLength = characters.length; - for(let i = 0; i < 32; i++) { - randomstring += characters.charAt(Math.floor(Math.random()*charactersLength)); - } - let dpwd1 = ''; - let dpwd2 = ''; - let dpwd3 = ''; - let h = keccakAsU8a(password + randomstring); - for(let i = 0; i < 100000; i++) { - h = keccakAsU8a(h); - if(i === p) { - dpwd1 = h; - } - h = sha512AsU8a(h); - if(i === p) { - dpwd2 = h; - } - h = blake2AsU8a(h); - if(i === p) { - dpwd3 = h; - } - } + if(await this.getBalanceByAddress(temp_account.address) > 0) { + // save this account + await this.createAccount('Account ' + account_id, mnemonic, account_id.toString()) + } else { + break + } + } + } - // 3 Layers encryption - // encrypt the secret words in AES256-CFB - let ivf = ''; - for(let i = 0; i < 16; i++) { - ivf += characters.charAt(Math.floor(Math.random()*charactersLength)); - } - const ivaescfb = aesjs.utils.utf8.toBytes(ivf); - const keyaescfb = dpwd1.slice(0, 32); - const aesCfb = new aesjs.ModeOfOperation.cfb(keyaescfb, ivaescfb); - const mnemonicbytes = aesjs.utils.utf8.toBytes(mnemonic); + async signIn(message_id, params) { + let data = {} - let encryptedaescfb = aesCfb.encrypt(mnemonicbytes); + const account = await this.loadAccount(params?.password, params?.account_id) + if(account) { + const dt = new Date() + const timestamp = dt.getTime() + const message = timestamp.toString() + "#" + params?.domain + const signature = account.sign(stringToU8a(message)) - // encrypt the output of AES256-CFB in AES256-CTR - let ivs = ''; - for(let i = 0; i < 16; i++) { - ivs += characters.charAt(Math.floor(Math.random()*charactersLength)); - } + data = { + message, + signature: u8aToHex(signature), + address: account.address + } + } else { + return false + } - const ivaesctr = aesjs.utils.utf8.toBytes(ivs); - //const keyaes= aesjs.utils.utf8.toBytes(dpwd2.slice(0,32)); - const keyaesctr = dpwd2.slice(0, 32); - let aesCtr = new aesjs.ModeOfOperation.ctr(keyaesctr, ivaesctr); - let encryptedaesctr = aesCtr.encrypt(encryptedaescfb); + return data + } - // encrypt the output of AES256-CTR in AES256-OFB - let ivso = ''; - for(let i = 0; i < 16; i++) { - ivso += characters.charAt(Math.floor(Math.random()*charactersLength)); - } - const ivaesofb = aesjs.utils.utf8.toBytes(ivso); - const keyaesofb = dpwd3.slice(0, 32); - let aesOfb = new aesjs.ModeOfOperation.ofb(keyaesofb, ivaesofb); - let encryptedaesofb = aesOfb.encrypt(encryptedaesctr); - let encryptedhex = aesjs.utils.hex.fromBytes(encryptedaesofb); + async transfer(message_id, params) { + const polkadot_api = await polkadotApi() - // convert to Hex json - return { - "iv": randomstring, - "ivaescfb": u8aToHex(ivaescfb), - "ivaesctr": u8aToHex(ivaesctr), - "ivaesofb": u8aToHex(ivaesofb), - "encrypted": encryptedhex - }; - } + let response = {} - async decryptWallet(password, mnemonic_only = false) { - if(password?.length < 2 || !password) { - return false; - } + const account = await this.loadAccount(params?.password, params?.account_id) - const wallet_data = await this.wallets_store.asyncGet('main') - if(!wallet_data) { - return false; - } + if(!account) { + return false + } - try { - // get ascii value of first 2 chars - const vb1 = password.charCodeAt(0); - const vb2 = password.charCodeAt(1); - - // position to derive other 3 passwords - const p = vb1*vb2; - - // derive the password used for encryption with an init vector (random string) and 100000 hashes with 3 different algorithms - const enc = wallet_data; - let randomstring = enc.iv; - let dpwd1 = ''; - let dpwd2 = ''; - let dpwd3 = ''; - let h = keccakAsU8a(password + randomstring); - for(let i = 0; i < 100000; i++) { - h = keccakAsU8a(h); - if(i === p) { - dpwd1 = h; - } - h = sha512AsU8a(h); - if(i === p) { - dpwd2 = h; - } - h = blake2AsU8a(h); - if(i === p) { - dpwd3 = h; - } - } + const asset = params?.asset - // decrypt AES-OFB - const ivaesofb = hexToU8a(enc.ivaesofb); - const keyaesofb = dpwd3.slice(0, 32); - let aesOfb = new aesjs.ModeOfOperation.ofb(keyaesofb, ivaesofb); - const encryptedhex = enc.encrypted; - const encryptedaesofb = aesjs.utils.hex.toBytes(encryptedhex); - let encryptedaesctr = aesOfb.decrypt(encryptedaesofb); - - // decrypt AES-CTR - const ivaesctr = hexToU8a(enc.ivaesctr); - const keyaesctr = dpwd2.slice(0, 32); - let aesCtr = new aesjs.ModeOfOperation.ctr(keyaesctr, ivaesctr); - let encryptedaescfb = aesCtr.decrypt(encryptedaesctr); - - // decrypt AES-CFB - const ivaescfb = hexToU8a(enc.ivaescfb); - const keyaescfb = dpwd1.slice(0, 32); - let aesCfb = new aesjs.ModeOfOperation.cfb(keyaescfb, ivaescfb); - let decrypted = aesCfb.decrypt(encryptedaescfb); - let decrypted_mnemonic = aesjs.utils.utf8.fromBytes(decrypted); - - if(!decrypted_mnemonic) { - return false; - } else { - if(!mnemonicValidate(decrypted_mnemonic)) { - return false; - } - - if(mnemonic_only) { - return decrypted_mnemonic; + return new Promise(async(resolve) => { + let transaction = null + if(asset.is_token) { + if(asset.name === 'bbb') { + transaction = polkadot_api.tx.balances.transfer(params?.recipient, humanToBalance(params?.amount)) + } else { + transaction = polkadot_api.tx.tokens.transfer(params?.recipient, asset.name, humanToBalance(params?.amount)) + } + } else { + transaction = polkadot_api.tx.assets.transfer(asset.asset_id, params?.recipient, params?.amount) + } + + await transaction + .signAndSend(account, { nonce: -1 }, ({ status, events = [], dispatchError }) => { + if(dispatchError) { + // for module errors, we have the section indexed, lookup + const decoded = polkadot_api.registry.findMetaError(dispatchError.asModule) + const { docs, method, section } = decoded + + if(dispatchError.isModule) { + response = { + success: false, + status: 'failed', + error: section + '.' + method + ' ' + docs.join(' '), + data: { + section, + method } - - return true; + } + } else { + // Other, CannotLookup, BadOrigin, no extra info + response = { + success: false, + status: 'failed', + error: dispatchError.toString() + } } - } catch (e) { - console.log('Error decoding wallet:', e) - return false - } - } - async createAccount(name, mnemonic, account_id) { - await cryptoWaitReady() + resolve(response) + } - let uri_mnemonic = mnemonic - if(account_id !== 'main') { - uri_mnemonic += '//' + account_id - } - - const keyring = new Keyring({ - type: 'sr25519' + if(status.isInBlock) { + // return result after confirmation + resolve({ + success: true, + data: { + block_hash: status?.asInBlock?.toHex() + } + }) + } + }).catch(err => { + resolve({ + success: false, + status: 'failed', + error: err.message + }) }); + }); + } - const keypair = keyring.addFromUri(uri_mnemonic, { - name: '' - }, 'sr25519'); + async submitExtrinsic(message_id, params) { + const polkadot_api = await polkadotApi() - await this.accounts_store.asyncSet(account_id, { - "address": keypair.address, - "name": name - }) + const pallet = params?.pallet + const call = params?.call + const call_parameters = params?.call_parameters + let call_request = call_parameters ? JSON.parse(call_parameters) : [] - await this.cache_store.remove('last_fetch_kyc') + let response = {} - return account_id - } + const account = await this.loadAccount(params?.password, params?.account_id) - async loadAccount(password, account_id, temp_load = false) { - await cryptoWaitReady() + if(!account) { + return false + } - let mnemonic = await this.decryptWallet(password, true) + if(pallet === 'utility' && (call === 'batch' || call === 'batchAll' || call === 'forceBatch')) { + try { + call_request = [] - if(!mnemonic) { - return false + for(const extrinsic of JSON.parse(call_parameters)) { + call_request.push(await polkadot_api.tx[extrinsic[0]][extrinsic[1]](...extrinsic[2])) } - const account = await this.accounts_store.asyncGet(account_id) - if(account_id !== 'main' && account_id && (account || temp_load)) { - mnemonic += '//' + account_id + call_request = [call_request] + } catch (e) { + return { + success: false, + status: 'failed', + error: e.message } + } - const keyring = new Keyring({ - type: 'sr25519' - }); - - return keyring.addFromUri(mnemonic, { name: temp_load ? 'Account ' + account_id : account.name }, 'sr25519'); } - async importAccountsWithBalance(mnemonic, password) { - for(let i = 0; i <= 100; i++) { - const account_id = i - const temp_account = await this.loadAccount(password, account_id.toString(), true) - - if(await this.getBalanceByAddress(temp_account.address) > 0) { - // save this account - await this.createAccount('Account ' + account_id, mnemonic, account_id.toString()) - } else { - break - } + return new Promise(async(resolve) => { + if(!polkadot_api.tx[pallet]) { + response = { + success: false, + status: 'failed', + error: 'Pallet not found.' } - } - - async signIn(message_id, params) { - let data = {} - - const account = await this.loadAccount(params?.password, params?.account_id) - if(account) { - const dt = new Date() - const timestamp = dt.getTime() - const message = timestamp.toString() + "#" + params?.domain - const signature = account.sign(stringToU8a(message)) - - data = { - message, - signature: u8aToHex(signature), - address: account.address - } - } else { - return false + return resolve(response) + } + if(!polkadot_api.tx[pallet][call]) { + response = { + success: false, + status: 'failed', + error: 'Pallet call not found.' } + return resolve(response) + } - return data - } - - async transfer(message_id, params) { - const polkadot_api = await polkadotApi() + try { + await polkadot_api.tx[pallet][call](...call_request) + .signAndSend(account, { nonce: -1 }, ({ status, events = [], dispatchError }) => { + events.forEach((e) => { + const ex = e.toHuman() - let response = {} + // handle batch interrupted case + if((pallet === 'utility' && (call === 'batch' || call === 'batchAll' || call === 'forceBatch')) + && (ex.event.section === 'utility' && ex.event.method === 'BatchInterrupted')) { - const account = await this.loadAccount(params?.password, params?.account_id) + const failedIndex = e.event.data[0]; + const error = e.event.data[1]; - if(!account) { - return false - } + console.log(`Batch failed at call index: ${failedIndex}`); - const asset = params?.asset + if (error) { + const decoded = polkadot_api.registry.findMetaError(error.asModule); + const { docs, method, section } = decoded; - return new Promise(async(resolve) => { - let transaction = null - if(asset.is_token) { - if(asset.name === 'bbb') { - transaction = polkadot_api.tx.balances.transfer(params?.recipient, humanToBalance(params?.amount)) - } else { - transaction = polkadot_api.tx.tokens.transfer(params?.recipient, asset.name, humanToBalance(params?.amount)) - } - } else { - transaction = polkadot_api.tx.assets.transfer(asset.asset_id, params?.recipient, params?.amount) - } + // console.log("Error Details:", error, decoded); - await transaction - .signAndSend(account, { nonce: -1 }, ({ status, events = [], dispatchError }) => { - if(dispatchError) { - // for module errors, we have the section indexed, lookup - const decoded = polkadot_api.registry.findMetaError(dispatchError.asModule) - const { docs, method, section } = decoded - - if(dispatchError.isModule) { - response = { - success: false, - status: 'failed', - error: section + '.' + method + ' ' + docs.join(' '), - data: { - section, - method - } - } - } else { - // Other, CannotLookup, BadOrigin, no extra info - response = { - success: false, - status: 'failed', - error: dispatchError.toString() - } - } - - resolve(response) - } - - if(status.isInBlock) { - // return result after confirmation - resolve({ - success: true, - data: { - block_hash: status?.asInBlock?.toHex() - } - }) - } - }).catch(err => { + if(error.isModule) { resolve({ - success: false, - status: 'failed', - error: err.message + success: false, + status: 'failed', + error: section + '.' + method + ' - ' + docs.join(' '), + data: { + failedIndex: failedIndex.toString() + } }) - }); - }); - } - - async submitExtrinsic(message_id, params) { - const polkadot_api = await polkadotApi() - - const pallet = params?.pallet - const call = params?.call - const call_parameters = params?.call_parameters - let call_request = call_parameters ? JSON.parse(call_parameters) : [] - - let response = {} - - const account = await this.loadAccount(params?.password, params?.account_id) - - if(!account) { - return false - } - - if(pallet === 'utility' && (call === 'batch' || call === 'batchAll' || call === 'forceBatch')) { - try { - call_request = [] - - for(const extrinsic of JSON.parse(call_parameters)) { - call_request.push(await polkadot_api.tx[extrinsic[0]][extrinsic[1]](...extrinsic[2])) + } } + } + }) + if(dispatchError) { + if(dispatchError.isModule) { + // for module errors, we have the section indexed, lookup + const decoded = polkadot_api.registry.findMetaError(dispatchError.asModule) + const { docs, method, section } = decoded - call_request = [call_request] - } catch (e) { - return { - success: false, - status: 'failed', - error: e.message - } - } - - } - - return new Promise(async(resolve) => { - if(!polkadot_api.tx[pallet]) { - response = { - success: false, - status: 'failed', - error: 'Pallet not found.' + response = { + success: false, + status: 'failed', + error: section + '.' + method + ' - ' + docs.join(' '), + data: { + section, + method + } } - return resolve(response) - } - if(!polkadot_api.tx[pallet][call]) { + } else { + // Other, CannotLookup, BadOrigin, no extra info response = { - success: false, - status: 'failed', - error: 'Pallet call not found.' + success: false, + status: 'failed', + error: dispatchError.toString() } - return resolve(response) + } + + resolve(response) } - try { - await polkadot_api.tx[pallet][call](...call_request) - .signAndSend(account, { nonce: -1 }, ({ status, events = [], dispatchError }) => { - events.forEach((e) => { - const ex = e.toHuman() - - // handle batch interrupted case - if((pallet === 'utility' && (call === 'batch' || call === 'batchAll' || call === 'forceBatch')) - && (ex.event.section === 'utility' && ex.event.method === 'BatchInterrupted')) { - - const failedIndex = e.event.data[0]; - const error = e.event.data[1]; - - console.log(`Batch failed at call index: ${failedIndex}`); - - if (error) { - const decoded = polkadot_api.registry.findMetaError(error.asModule); - const { docs, method, section } = decoded; - - // console.log("Error Details:", error, decoded); - - if(error.isModule) { - resolve({ - success: false, - status: 'failed', - error: section + '.' + method + ' - ' + docs.join(' '), - data: { - failedIndex: failedIndex.toString() - } - }) - } - } - } - }) - if(dispatchError) { - if(dispatchError.isModule) { - // for module errors, we have the section indexed, lookup - const decoded = polkadot_api.registry.findMetaError(dispatchError.asModule) - const { docs, method, section } = decoded - - response = { - success: false, - status: 'failed', - error: section + '.' + method + ' - ' + docs.join(' '), - data: { - section, - method - } - } - } else { - // Other, CannotLookup, BadOrigin, no extra info - response = { - success: false, - status: 'failed', - error: dispatchError.toString() - } - } - - resolve(response) - } - - - if(status.isInBlock) { - resolve({ - success: true, - data: { - block_hash: status.asInBlock.toHex() - } - }) - } - }).catch(err => { - resolve({ - success: false, - status: 'failed', - error: err.message - }) - }); - } catch (e) { - resolve({ - success: false, - status: 'failed', - error: e.message - }) + + if(status.isInBlock) { + resolve({ + success: true, + data: { + block_hash: status.asInBlock.toHex() + } + }) } - }); - } + }).catch(err => { + resolve({ + success: false, + status: 'failed', + error: err.message + }) + }); + } catch (e) { + resolve({ + success: false, + status: 'failed', + error: e.message + }) + } + }); + } - async changeSetting(params) { - for(const [key, value] of Object.entries(params)) { - await this.settings_store.asyncSet(key, value) - } + async changeSetting(params) { + for(const [key, value] of Object.entries(params)) { + await this.settings_store.asyncSet(key, value) } + } - async getCollators() { - const polkadot_api = await polkadotApi() + async getCollators() { + const polkadot_api = await polkadotApi() - const candidates = await polkadot_api.query.parachainStaking.candidates() - const invulnerables = await polkadot_api.query.parachainStaking.invulnerables() + const candidates = await polkadot_api.query.parachainStaking.candidates() + const invulnerables = await polkadot_api.query.parachainStaking.invulnerables() - return (candidates.toHuman()).concat(invulnerables.toHuman()) - } + return (candidates.toHuman()).concat(invulnerables.toHuman()) + } - async getEstimatedFee(params) { - const polkadot_api = await polkadotApi() + async getEstimatedFee(params) { + const polkadot_api = await polkadotApi() - try { - let info = await polkadot_api.tx[params?.pallet][params?.call](...params?.call_parameters).paymentInfo(params?.account_address) - info = info.toJSON() + try { + let info = await polkadot_api.tx[params?.pallet][params?.call](...params?.call_parameters).paymentInfo(params?.account_address) + info = info.toJSON() - return info.partialFee - } catch (e) { - console.log('Error getting estimated fee: ', e) - return 0 - } + return info.partialFee + } catch (e) { + console.log('Error getting estimated fee: ', e) + return 0 } + } - async checkApiReady() { - const polkadot_api = await polkadotApi() + async checkApiReady() { + const polkadot_api = await polkadotApi() - return !!polkadot_api?.isReady - } + return !!polkadot_api?.isReady + } - async reconnectApi() { - const polkadot_api = await polkadotApi(true) + async reconnectApi() { + const polkadot_api = await polkadotApi(true) - return !!polkadot_api?.isReady - } + return !!polkadot_api?.isReady + } } export default Extension \ No newline at end of file diff --git a/packages/browser-wallet-core/src/background/index.js b/packages/browser-wallet-core/src/background/index.js index 35fe8a4..0457035 100644 --- a/packages/browser-wallet-core/src/background/index.js +++ b/packages/browser-wallet-core/src/background/index.js @@ -1,13 +1,11 @@ import Extension from './extension.js' import Tabs from './tabs.js' import { - customReviver, - getCurrentBrowser, - isFirefox, - isIOs, - isIPad, - isMacOs, - isSafari + getCurrentBrowser, + isIOs, + isIPad, + isMacOs, + isSafari } from "@bitgreen/browser-wallet-utils"; const current_browser = getCurrentBrowser() @@ -18,191 +16,190 @@ const tabs = new Tabs() let opened_tabs = [] const appMessageHandler = (data) => { - let promise = extension.handle(data); - - if(!promise) { - return false - } - - promise.then((response) => { - // return response to frontend - window.postMessage({ - source: 'bg', - id: data.id, - response: JSON.stringify(response) - }); - }).catch((error) => { - console.error(error); - window.postMessage({ error: error.message, errorCode: error.code, errorData: error.data, id: data.id }); + let promise = extension.handle(data); + + if(!promise) { + return false + } + + promise.then((response) => { + // return response to frontend + window.postMessage({ + source: 'bg', + id: data.id, + response: JSON.stringify(response) }); + }).catch((error) => { + console.error(error); + window.postMessage({ error: error.message, errorCode: error.code, errorData: error.data, id: data.id }); + }); } const backgroundMessageHandler = (data, port) => { - const isExtension = port.name === 'PORT_EXTENSION' - const isContent = port.name === 'PORT_CONTENT' - const sender = port.sender - const from = isExtension ? 'extension' : (sender.tab && sender.tab.url) || sender.url || 'unknown'; - - let promise = isExtension ? extension.handle(data, from, port) : (isContent ? tabs.handle(data, from, port) : null); - - if(!promise) { - return false + const isExtension = port.name === 'PORT_EXTENSION' + const isContent = port.name === 'PORT_CONTENT' + const sender = port.sender + const from = isExtension ? 'extension' : (sender.tab && sender.tab.url) || sender.url || 'unknown'; + + let promise = isExtension ? extension.handle(data, from, port) : (isContent ? tabs.handle(data, from, port) : null); + + if(!promise) { + return false + } + + promise.then((response) => { + if(port) { + try { + port.postMessage({ id: data.id, response }) + } catch (e) { + console.log('Error sending message.') + } } - - promise.then((response) => { - if(port) { - try { - port.postMessage({ id: data.id, response }) - } catch (e) { - console.log('Error sending message.') - } - } - }).catch((error) => { - console.error(error); - - // only send message back to port if it's still connected - if(port) { - try { - port.postMessage({ error: error.message, errorCode: error.code, errorData: error.data, id: data.id }) - } catch (e) { - console.log('Error sending message back.') - } - } - }); + }).catch((error) => { + console.error(error); + + // only send message back to port if it's still connected + if(port) { + try { + port.postMessage({ error: error.message, errorCode: error.code, errorData: error.data, id: data.id }) + } catch (e) { + console.log('Error sending message back.') + } + } + }); } const showPopup = async(command, params = {}) => { - const origin_tab_id = await getCurrentTabId() - - let url = 'index.html?' + new URLSearchParams({ - tab_id: origin_tab_id, - command, - ...params - }).toString(); - - if(isSafari() && isMacOs()) { - const response = await current_browser.windows.create({ - url: url, - type: 'popup', - focused: true, - width: 400, - height: 600 - }); + const origin_tab_id = await getCurrentTabId() + + let url = 'index.html?' + new URLSearchParams({ + tab_id: origin_tab_id, + command, + ...params + }).toString(); + + if(isSafari() && isMacOs()) { + const response = await current_browser.windows.create({ + url: url, + type: 'popup', + focused: true, + width: 400, + height: 600 + }); - opened_tabs.push({ + opened_tabs.push({ + message_id: params.id, + origin_tab_id: origin_tab_id, + wallet_tab_id: response.tabs[0].id + }) + } else { + current_browser.windows.getCurrent((win) => { + let width = win.width; + let top = win.top; + let left = win.left; + + current_browser.tabs.create({ + url: current_browser.runtime.getURL(url), + active: isIOs() || isIPad() + }, (tab) => { + // adjust position + top = top + 80; + left = left + width - 400 - 100; + + if(isIOs()) { + opened_tabs.push({ message_id: params.id, origin_tab_id: origin_tab_id, - wallet_tab_id: response.tabs[0].id - }) - } else { - current_browser.windows.getCurrent((win) => { - let width = win.width; - let height = win.height; - let top = win.top; - let left = win.left; - - current_browser.tabs.create({ - url: current_browser.runtime.getURL(url), - active: isIOs() || isIPad() - }, (tab) => { - // adjust position - top = top + 80; - left = left + width - 400 - 100; - - if(isIOs()) { - opened_tabs.push({ - message_id: params.id, - origin_tab_id: origin_tab_id, - wallet_tab_id: tab.id - }) - } - - // After the tab has been created, open a window to inject the tab - current_browser.windows.create({ - tabId: tab.id, - type: 'popup', - focused: true, - width: 400, - height: 600, - left, - top - }); - }); + wallet_tab_id: tab.id + }) + } + + // After the tab has been created, open a window to inject the tab + current_browser.windows.create({ + tabId: tab.id, + type: 'popup', + focused: true, + width: 400, + height: 600, + left, + top }); - } + }); + }); + } } const getCurrentTabId = () => { - return new Promise((resolve, reject) => { - current_browser.tabs.query({ active: true, currentWindow: true }, function(tabs) { - resolve(tabs[0].id) - }) + return new Promise((resolve, reject) => { + current_browser.tabs.query({ active: true, currentWindow: true }, function(tabs) { + resolve(tabs[0].id) }) + }) } const findTab = async(tabs) => { - for(const { id: tabId } of tabs || await current_browser.tabs.query({ url: '*://*/*' })) { - try { - await current_browser.scripting.executeScript({ target: { tabId }, func: keepAlive }); - current_browser.tabs.onUpdated.removeListener(onTabUpdate); - return; - } catch(e) { - } + for(const { id: tabId } of tabs || await current_browser.tabs.query({ url: '*://*/*' })) { + try { + await current_browser.scripting.executeScript({ target: { tabId }, func: keepAlive }); + current_browser.tabs.onUpdated.removeListener(onTabUpdate); + return; + } catch(e) { } - current_browser.tabs.onUpdated.addListener(onTabUpdate); + } + current_browser.tabs.onUpdated.addListener(onTabUpdate); } const onTabUpdate = (tabId, info, tab) => /^https?:/.test(info.url) && findTab([tab]); const keepAlive = () => { - current_browser.runtime.connect({ name: 'KEEP_ALIVE' }).onDisconnect.addListener(keepAlive); + current_browser.runtime.connect({ name: 'KEEP_ALIVE' }).onDisconnect.addListener(keepAlive); } const sendMessageToTab = (tab_id, message_id, response) => { - const tab = current_browser.tabs.connect(parseInt(tab_id), { name: 'PORT_BACKGROUND' }); + const tab = current_browser.tabs.connect(parseInt(tab_id), { name: 'PORT_BACKGROUND' }); - tab.postMessage({ - id: message_id, - response - }); + tab.postMessage({ + id: message_id, + response + }); } // Handle communication lost on safari if(isSafari()) { - current_browser.tabs.onRemoved.addListener(async(tab_id, removeInfo) => { - opened_tabs.map((data) => { - // If wallet tab is closed, send message back to webpage - if(data.wallet_tab_id === tab_id) { - // Remove from opened tabs - opened_tabs = opened_tabs.filter((data) => { - return data.wallet_tab_id !== tab_id - }) - - sendMessageToTab(data.origin_tab_id, data.message_id,{ success: false, status: 'closed', resolve: true, error: 'Communication to the popup has been lost.' }) - } + current_browser.tabs.onRemoved.addListener(async(tab_id, removeInfo) => { + opened_tabs.map((data) => { + // If wallet tab is closed, send message back to webpage + if(data.wallet_tab_id === tab_id) { + // Remove from opened tabs + opened_tabs = opened_tabs.filter((data) => { + return data.wallet_tab_id !== tab_id }) - }); - current_browser.tabs.onUpdated.addListener(async(tab_id) => { - opened_tabs.map((data) => { - // If origin tab is closed, kill all popups from that tab - if(data.origin_tab_id === tab_id) { - // Remove from opened tabs - opened_tabs = opened_tabs.filter((data) => { - return data.origin_tab_id !== tab_id - }) - - current_browser.tabs.sendMessage(data.wallet_tab_id, { command: "kill_popup" }); - } + sendMessageToTab(data.origin_tab_id, data.message_id,{ success: false, status: 'closed', resolve: true, error: 'Communication to the popup has been lost.' }) + } + }) + }); + + current_browser.tabs.onUpdated.addListener(async(tab_id) => { + opened_tabs.map((data) => { + // If origin tab is closed, kill all popups from that tab + if(data.origin_tab_id === tab_id) { + // Remove from opened tabs + opened_tabs = opened_tabs.filter((data) => { + return data.origin_tab_id !== tab_id }) + + current_browser.tabs.sendMessage(data.wallet_tab_id, { command: "kill_popup" }); + } }) + }) } export { - appMessageHandler, - backgroundMessageHandler, - showPopup, - getCurrentTabId, - findTab, - sendMessageToTab + appMessageHandler, + backgroundMessageHandler, + showPopup, + getCurrentTabId, + findTab, + sendMessageToTab } \ No newline at end of file diff --git a/packages/browser-wallet-core/src/background/tabs.js b/packages/browser-wallet-core/src/background/tabs.js index 8a8a474..b0e8743 100644 --- a/packages/browser-wallet-core/src/background/tabs.js +++ b/packages/browser-wallet-core/src/background/tabs.js @@ -2,79 +2,79 @@ import { getCurrentTabId, sendMessageToTab, showPopup } from "./index.js"; import { polkadotApi } from "../polkadotApi.js"; class Tabs { - async handle(data, from, port) { - switch(data.command) { - case 'open': - return await this.open(data.params) - case 'sign_in': - return await this.signIn(data.params) - case 'send': - return await this.send(data.params) - case 'extrinsic': - return await this.extrinsic(data.params) - case 'query': - return await this.query(data.params) - default: - return false - } + async handle(data, from, port) { + switch(data.command) { + case 'open': + return await this.open(data.params) + case 'sign_in': + return await this.signIn(data.params) + case 'send': + return await this.send(data.params) + case 'extrinsic': + return await this.extrinsic(data.params) + case 'query': + return await this.query(data.params) + default: + return false } + } - open(params) { - return new Promise(async(resolve, reject) => { - await showPopup('open', params); + open(params) { + return new Promise(async(resolve, reject) => { + await showPopup('open', params); - resolve(true) - }) - } + resolve(true) + }) + } - signIn(params) { - return new Promise(async(resolve, reject) => { - await showPopup('sign_in', params); + signIn(params) { + return new Promise(async(resolve, reject) => { + await showPopup('sign_in', params); - resolve(true) - }) - } + resolve(true) + }) + } - send(params) { - return new Promise(async(resolve, reject) => { - await showPopup('send', params); + send(params) { + return new Promise(async(resolve, reject) => { + await showPopup('send', params); - resolve(true) - }) - } + resolve(true) + }) + } - extrinsic(params) { - return new Promise(async(resolve, reject) => { - await showPopup('extrinsic', params); + extrinsic(params) { + return new Promise(async(resolve, reject) => { + await showPopup('extrinsic', params); - resolve(true) - }) - } + resolve(true) + }) + } - async query(params) { - const polkadot_api = await polkadotApi() + async query(params) { + const polkadot_api = await polkadotApi() - const pallet = params?.pallet - const call = params?.call - const call_parameters = params?.call_parameters - let result + const pallet = params?.pallet + const call = params?.call + const call_parameters = params?.call_parameters + let result - try { - result = { - success: true, - data: await polkadot_api.query[pallet][call](...call_parameters) - } - } catch(err) { - result = { - success: false, - error: err.message - }; - } + try { + result = { + success: true, + data: await polkadot_api.query[pallet][call](...call_parameters) + } + } catch(err) { + result = { + success: false, + error: err.message + }; + } - await sendMessageToTab(await getCurrentTabId(), params.id, result) + sendMessageToTab(await getCurrentTabId(), params.id, result) - return result - } + return result + } } export default Tabs \ No newline at end of file diff --git a/packages/browser-wallet-core/src/cache.js b/packages/browser-wallet-core/src/cache.js index 0417044..841ab14 100644 --- a/packages/browser-wallet-core/src/cache.js +++ b/packages/browser-wallet-core/src/cache.js @@ -1,85 +1,82 @@ -import {AccountStore, databaseService} from "./index.js"; -import { polkadot } from "@polkadot/types/extrinsic/signedExtensions/polkadot"; - const getChainMetaData = async (polkadot_api, db) => { - const now = new Date().getTime() - const last_fetch = await db.stores.cache.asyncGet('last_fetch_metadata') || 0 - - // One call per 24h - if(now < (last_fetch + 1000 * 60 * 60 * 24)) return false - - let data = await polkadot_api.rpc.state.getMetadata() - data = data.toJSON() - - for(const t of data.metadata.v14.lookup.types) { - if(t.type.path[0] && t.type.path[0].match(/^pallet/i) - && t.type.path[1]&& t.type.path[1] === 'pallet' - && t.type.path[2] && t.type.path[2] === 'Call') { - const pallet_name = t.type.path[0].replace('pallet_', '').replaceAll('_', '') - - // save all metadata for each pallet call - for(const call of t.type.def.variant.variants) { - db.stores.cache.set(`docs_${pallet_name}:${call.name.replaceAll('_', '')}`, { - docs: call.docs, - fields: call.fields - }) - } - } + const now = new Date().getTime() + const last_fetch = await db.stores.cache.asyncGet('last_fetch_metadata') || 0 + + // One call per 24h + if(now < (last_fetch + 1000 * 60 * 60 * 24)) return false + + let data = await polkadot_api.rpc.state.getMetadata() + data = data.toJSON() + + for(const t of data.metadata.v14.lookup.types) { + if(t.type.path[0] && t.type.path[0].match(/^pallet/i) + && t.type.path[1]&& t.type.path[1] === 'pallet' + && t.type.path[2] && t.type.path[2] === 'Call') { + const pallet_name = t.type.path[0].replace('pallet_', '').replaceAll('_', '') + + // save all metadata for each pallet call + for(const call of t.type.def.variant.variants) { + db.stores.cache.set(`docs_${pallet_name}:${call.name.replaceAll('_', '')}`, { + docs: call.docs, + fields: call.fields + }) + } } + } - db.stores.cache.set('last_fetch_metadata', now) + db.stores.cache.set('last_fetch_metadata', now) } const getInflationAmount = async(polkadot_api, db) => { - const now = new Date().getTime() + const now = new Date().getTime() - const last_fetch = await db.stores.cache.asyncGet('last_fetch_inflation') || 0 + const last_fetch = await db.stores.cache.asyncGet('last_fetch_inflation') || 0 - // One call per 12 hours - if(now < (last_fetch + 1000 * 60 * 60 * 12)) return false + // One call per 12 hours + if(now < (last_fetch + 1000 * 60 * 60 * 12)) return false - const inflation_amount = await polkadot_api.query.parachainStaking.inflationAmountPerBlock() + const inflation_amount = await polkadot_api.query.parachainStaking.inflationAmountPerBlock() - db.stores.cache.set('inflation_amount', inflation_amount.toString()) + db.stores.cache.set('inflation_amount', inflation_amount.toString()) - db.stores.cache.set('last_fetch_inflation', now) + db.stores.cache.set('last_fetch_inflation', now) } const getKycAddresses = async(polkadot_api, db) => { - // return await db.stores.cache.asyncRemoveAll(); - const now = new Date().getTime() - - const last_fetch = await db.stores.cache.asyncGet('last_fetch_kyc') || 0 + + const now = new Date().getTime() - // One call per 10 minutes - if(now < (last_fetch + 1000 * 60 * 10)) return false + const last_fetch = await db.stores.cache.asyncGet('last_fetch_kyc') || 0 - const all_accounts = await db.stores.accounts.asyncAll() + // One call per 10 minutes + if(now < (last_fetch + 1000 * 60 * 10)) return false - for(const account of all_accounts) { - try { - const kyc_data = await polkadot_api.query.kycPallet.members(account.value.address) + const all_accounts = await db.stores.accounts.asyncAll() - const match = kyc_data.toString().match(/KYCLevel(\d+)/); - const kycLevel = match ? match[1] : null; + for(const account of all_accounts) { + try { + const kyc_data = await polkadot_api.query.kycPallet.members(account.value.address) - if(kycLevel) { - db.stores.cache.set('kyc_' + account.value.address, kycLevel); - } else { - db.stores.cache.remove('kyc_' + account.value.address) - } - } catch { - db.stores.cache.remove('kyc_' + account.value.address) - } + const match = kyc_data.toString().match(/KYCLevel(\d+)/); + const kycLevel = match ? match[1] : null; + if(kycLevel) { + db.stores.cache.set('kyc_' + account.value.address, kycLevel); + } else { + db.stores.cache.remove('kyc_' + account.value.address) + } + } catch { + db.stores.cache.remove('kyc_' + account.value.address) } - db.stores.cache.set('last_fetch_kyc', now) + } + + db.stores.cache.set('last_fetch_kyc', now) } export { - getChainMetaData, - getInflationAmount, - getKycAddresses + getChainMetaData, + getInflationAmount, + getKycAddresses } diff --git a/packages/browser-wallet-core/src/constants.js b/packages/browser-wallet-core/src/constants.js index 2b71d90..5bb6b7c 100644 --- a/packages/browser-wallet-core/src/constants.js +++ b/packages/browser-wallet-core/src/constants.js @@ -11,20 +11,20 @@ export const bbbTokenPrice = 0.35 // price of bbb token // list of all known apps export const knownApps = [ - { - title: 'Bitgreen App', - domain: 'https://*.bitgreen.org' - }, - { - title: 'Bitgreen', - domain: 'https://bitgreen.org' - }, - { - title: 'Habbit - Bitgreen', - domain: 'https://habbit.bitgreen.org' - }, - { - title: 'Carbon Marketplace - Bitgreen', - domain: 'https://carbon.bitgreen.org' - } + { + title: 'Bitgreen App', + domain: 'https://*.bitgreen.org' + }, + { + title: 'Bitgreen', + domain: 'https://bitgreen.org' + }, + { + title: 'Habbit - Bitgreen', + domain: 'https://habbit.bitgreen.org' + }, + { + title: 'Carbon Marketplace - Bitgreen', + domain: 'https://carbon.bitgreen.org' + } ] \ No newline at end of file diff --git a/packages/browser-wallet-core/src/messaging.js b/packages/browser-wallet-core/src/messaging.js deleted file mode 100644 index 9d6bf28..0000000 --- a/packages/browser-wallet-core/src/messaging.js +++ /dev/null @@ -1,7 +0,0 @@ -const sendToExtension = () => { - -} - -export { - sendToExtension -} \ No newline at end of file diff --git a/packages/browser-wallet-core/src/page/index.js b/packages/browser-wallet-core/src/page/index.js index 99b4d1d..883e08c 100644 --- a/packages/browser-wallet-core/src/page/index.js +++ b/packages/browser-wallet-core/src/page/index.js @@ -3,91 +3,84 @@ import { generateMessageId } from "@bitgreen/browser-wallet-utils"; const handlers = {} const sendMessage = (command, params = {}, subscribe = false) => { - return new Promise((resolve, reject) => { - const message_id = generateMessageId() + return new Promise((resolve, reject) => { + const message_id = generateMessageId() - handlers[message_id] = { reject, resolve, subscribe }; + handlers[message_id] = { reject, resolve, subscribe }; - window.postMessage({ - id: message_id, - type: "BITGREEN-BROWSER-WALLET", - command: command, - params: { - id: message_id, - ...params - }, - origin: 'MESSAGE_ORIGIN_PAGE' - }); - }) + window.postMessage({ + id: message_id, + type: "BITGREEN-BROWSER-WALLET", + command: command, + params: { + id: message_id, + ...params + }, + origin: 'MESSAGE_ORIGIN_PAGE' + }); + }) } const open = async() => { - return await sendMessage('open', { domain: origin }, false); -} - -// the enable function, called by the dapp to allow access -const enablePage = async() => { - const title = document.querySelector('title')?.innerText - return await sendMessage('sign_in', { domain: origin }, true); + return await sendMessage('open', { domain: origin }, false); } const signIn = async() => { - const title = document.querySelector('title')?.innerText - return await sendMessage('sign_in', { domain: origin, title, kill_popup: true }, true); + const title = document.querySelector('title')?.innerText + return await sendMessage('sign_in', { domain: origin, title, kill_popup: true }, true); } const send = async(amount = 0, recipient = false, kill_popup = true) => { - return await sendMessage('send', { - amount, - recipient, - kill_popup - }, kill_popup); + return await sendMessage('send', { + amount, + recipient, + kill_popup + }, kill_popup); } const query = async(pallet, call, call_parameters) => { - return await sendMessage('query', { - pallet, call, call_parameters - }); + return await sendMessage('query', { + pallet, call, call_parameters + }); } const extrinsic = async(pallet, call, call_parameters, kill_popup = true) => { - const title = document.querySelector('title')?.innerText - return await sendMessage('extrinsic', { - domain: origin, - title, - pallet, - call, - call_parameters: JSON.stringify(call_parameters), - kill_popup, - }, kill_popup); + const title = document.querySelector('title')?.innerText + return await sendMessage('extrinsic', { + domain: origin, + title, + pallet, + call, + call_parameters: JSON.stringify(call_parameters), + kill_popup, + }, kill_popup); } const pageMessageResponseHandler = (data) => { - const handler = handlers[data.id]; + const handler = handlers[data.id]; - if(!handler) { - console.error(`Unknown response: ${JSON.stringify(data)}`); + if(!handler) { + console.error(`Unknown response: ${JSON.stringify(data)}`); - return; - } + return; + } - // return only if not subscribed (wait for background to resolve) - if(!handler?.subscribe || data?.resolve) { - if(data.error) { - handler.reject((data.error)); - } else { - handler.resolve(data.response); - } + // return only if not subscribed (wait for background to resolve) + if(!handler?.subscribe || data?.resolve) { + if(data.error) { + handler.reject((data.error)); + } else { + handler.resolve(data.response); } + } } export { - sendMessage, - open, - enablePage, - signIn, - send, - query, - extrinsic, - pageMessageResponseHandler + sendMessage, + open, + signIn, + send, + query, + extrinsic, + pageMessageResponseHandler } \ No newline at end of file diff --git a/packages/browser-wallet-core/src/page/injected.js b/packages/browser-wallet-core/src/page/injected.js deleted file mode 100644 index 5323b12..0000000 --- a/packages/browser-wallet-core/src/page/injected.js +++ /dev/null @@ -1,11 +0,0 @@ -// import PostMessageProvider from "./messaging.js"; - -class Injected { - provider; - - constructor(sendRequest) { - // this.provider = new PostMessageProvider(sendRequest); - } -} - -export default Injected \ No newline at end of file diff --git a/packages/browser-wallet-core/src/page/messaging.js b/packages/browser-wallet-core/src/page/messaging.js index 2692b8b..f6b1a9f 100644 --- a/packages/browser-wallet-core/src/page/messaging.js +++ b/packages/browser-wallet-core/src/page/messaging.js @@ -3,36 +3,31 @@ import EventEmitter from 'eventemitter3'; let sendRequest class PostMessageProvider { - #eventemitter; + #eventemitter; - isClonable = true; + isClonable = true; - // Whether or not the actual extension background provider is connected - #isConnected = false; + // Whether or not the actual extension background provider is connected + #isConnected = false; - // Subscription IDs are (historically) not guaranteed to be globally unique; - // only unique for a given subscription method; which is why we identify - // the subscriptions based on subscription id + type - #subscriptions = {}; // {[(type,subscriptionId)]: callback} + constructor(_sendRequest) { + this.#eventemitter = new EventEmitter(); - constructor(_sendRequest) { - this.#eventemitter = new EventEmitter(); + sendRequest = _sendRequest; + } - sendRequest = _sendRequest; - } + clone() { + return new PostMessageProvider(sendRequest); + } - clone() { - return new PostMessageProvider(sendRequest); - } + async connect() { + // FIXME This should see if the extension's state's provider can disconnect + console.error('PostMessageProvider.disconnect() is not implemented.'); + } - async connect() { - // FIXME This should see if the extension's state's provider can disconnect - console.error('PostMessageProvider.disconnect() is not implemented.'); - } - - async send(method, params) { - return sendRequest('pub(rpc.send)', { method, params }); - } + async send(method, params) { + return sendRequest('pub(rpc.send)', { method, params }); + } } export default PostMessageProvider \ No newline at end of file diff --git a/packages/browser-wallet-core/src/polkadotApi.js b/packages/browser-wallet-core/src/polkadotApi.js index a7956fc..fc59757 100644 --- a/packages/browser-wallet-core/src/polkadotApi.js +++ b/packages/browser-wallet-core/src/polkadotApi.js @@ -9,343 +9,343 @@ let ws_provider = undefined; let api = undefined const initPolkadotApi = async(force = false) => { - const db = new DatabaseService() + const db = new DatabaseService() - await db.ensureInit() + await db.ensureInit() - return new Promise(async(resolve) => { - const networks_store = new NetworkStore() - const current_network = await networks_store.current() + return new Promise(async(resolve) => { + const networks_store = new NetworkStore() + const current_network = await networks_store.current() - if(force) { - if(ws_provider?.isConnected) ws_provider.disconnect() - ws_provider = null - } + if(force) { + if(ws_provider?.isConnected) ws_provider.disconnect() + ws_provider = null + } - if(!ws_provider?.isConnected) { - try { - ws_provider_url = current_network.url - ws_provider = new WsProvider(ws_provider_url, false) + if(!ws_provider?.isConnected) { + try { + ws_provider_url = current_network.url + ws_provider = new WsProvider(ws_provider_url, false) - await ws_provider.connect() - } catch (e) { - api = null - console.log('Error connecting to WS provider.', e) - } - } + await ws_provider.connect() + } catch (e) { + api = null + console.log('Error connecting to WS provider.', e) + } + } - if (ws_provider) { - ws_provider.on('connected', async (e) => { - const api_promise = await ApiPromise.create({ - provider: ws_provider, types: - { - "CallOf": "Call", - "DispatchTime": { - "_enum": { - "At": "BlockNumber", - "After": "BlockNumber" - } - }, - "ScheduleTaskIndex": "u32", - "DelayedOrigin": { - "delay": "BlockNumber", - "origin": "PalletsOrigin" - }, - "StorageValue": "Vec", - "GraduallyUpdate": { - "key": "StorageKey", - "targetValue": "StorageValue", - "perBlock": "StorageValue" - }, - "StorageKeyBytes": "Vec", - "StorageValueBytes": "Vec", - "RpcDataProviderId": "Text", - "OrderedSet": "Vec", - "OrmlAccountData": { - "free": "Balance", - "frozen": "Balance", - "reserved": "Balance" - }, - "OrmlBalanceLock": { - "amount": "Balance", - "id": "LockIdentifier" - }, - "DelayedDispatchTime": { - "_enum": { - "At": "BlockNumber", - "After": "BlockNumber" - } - }, - "DispatchId": "u32", - "Price": "FixedU128", - "OrmlVestingSchedule": { - "start": "BlockNumber", - "period": "BlockNumber", - "periodCount": "u32", - "perPeriod": "Compact" - }, - "VestingScheduleOf": "OrmlVestingSchedule", - "PalletBalanceOf": "Balance", - "ChangeBalance": { - "_enum": { - "NoChange": "Null", - "NewValue": "Balance" - } - }, - "BalanceWrapper": { - "amount": "Balance" - }, - "BalanceRequest": { - "amount": "Balance" - }, - "EvmAccountInfo": { - "nonce": "Index", - "contractInfo": "Option", - "developerDeposit": "Option" - }, - "CodeInfo": { - "codeSize": "u32", - "refCount": "u32" - }, - "EvmContractInfo": { - "codeHash": "H256", - "maintainer": "H160", - "deployed": "bool" - }, - "EvmAddress": "H160", - "CallRequest": { - "from": "Option", - "to": "Option", - "gasLimit": "Option", - "storageLimit": "Option", - "value": "Option", - "data": "Option" - }, - "CID": "Vec", - "ClassId": "u32", - "ClassIdOf": "ClassId", - "TokenId": "u64", - "TokenIdOf": "TokenId", - "TokenInfoOf": { - "metadata": "CID", - "owner": "AccountId", - "data": "TokenData" - }, - "TokenData": { - "deposit": "Balance" - }, - "Properties": { - "_set": { - "_bitLength": 8, - "Transferable": 1, - "Burnable": 2 - } - }, - "BondingLedger": { - "total": "Compact", - "active": "Compact", - "unlocking": "Vec" - }, - "Amount": "i128", - "AmountOf": "Amount", - "AuctionId": "u32", - "AuctionIdOf": "AuctionId", - "TokenSymbol": { - "_enum": { - "BITG": 0, - "USDG": 1 - } - }, - "CurrencyId": { - "_enum": { - "Token": "TokenSymbol", - "DEXShare": "(TokenSymbol, TokenSymbol)", - "ERC20": "EvmAddress" - } - }, - "CurrencyIdOf": "CurrencyId", - "AuthoritysOriginId": { - "_enum": [ - "Root" - ] - }, - "TradingPair": "(CurrencyId, CurrencyId)", - "AsOriginId": "AuthoritysOriginId", - "SubAccountStatus": { - "bonded": "Balance", - "available": "Balance", - "unbonding": "Vec<(EraIndex,Balance)>", - "mockRewardRate": "Rate" - }, - "Params": { - "targetMaxFreeUnbondedRatio": "Ratio", - "targetMinFreeUnbondedRatio": "Ratio", - "targetUnbondingToFreeRatio": "Ratio", - "unbondingToFreeAdjustment": "Ratio", - "baseFeeRate": "Rate" - }, - "Ledger": { - "bonded": "Balance", - "unbondingToFree": "Balance", - "freePool": "Balance", - "toUnbondNextEra": "(Balance, Balance)" - }, - "ChangeRate": { - "_enum": { - "NoChange": "Null", - "NewValue": "Rate" - } - }, - "ChangeRatio": { - "_enum": { - "NoChange": "Null", - "NewValue": "Ratio" - } - }, - "BalanceInfo": { - "amount": "Balance" - }, - "Rate": "FixedU128", - "Ratio": "FixedU128", - "PublicKey": "[u8; 20]", - "DestAddress": "Vec", - "Keys": "SessionKeys2", - "PalletsOrigin": { - "_enum": { - "System": "SystemOrigin", - "Timestamp": "Null", - "RandomnessCollectiveFlip": "Null", - "Balances": "Null", - "Accounts": "Null", - "Currencies": "Null", - "Tokens": "Null", - "Vesting": "Null", - "Utility": "Null", - "Multisig": "Null", - "Recovery": "Null", - "Proxy": "Null", - "Scheduler": "Null", - "Indices": "Null", - "GraduallyUpdate": "Null", - "Authorship": "Null", - "Babe": "Null", - "Grandpa": "Null", - "Staking": "Null", - "Session": "Null", - "Historical": "Null", - "Authority": "DelayedOrigin", - "ElectionsPhragmen": "Null", - "Contracts": "Null", - "EVM": "Null", - "Sudo": "Null", - "TransactionPayment": "Null" - } - }, - "LockState": { - "_enum": { - "Committed": "None", - "Unbonding": "BlockNumber" - } - }, - "LockDuration": { - "_enum": [ - "OneMonth", - "OneYear", - "TenYears" - ] - }, - "EraIndex": "u32", - "Era": { - "index": "EraIndex", - "start": "BlockNumber" - }, - "Commitment": { - "state": "LockState", - "duration": "LockDuration", - "amount": "Balance", - "candidate": "AccountId" - }, - "AssetDetails": { - "owner": "AccountId", - "issuer": "AccountId", - "admin": "AccountId", - "freezer": "AccountId", - "supply": "Balance", - "deposit": "DepositBalance", - "max_zombies": "u32", - "min_balance": "Balance", - "zombies": "u32", - "accounts": "u32", - "is_frozen": "bool" - }, - "AssetMetadata": { - "deposit": "DepositBalance", - "name": "Vec", - "symbol": "Vec", - "decimals": "u8" - }, - "AssetBalance": { - "balance": "Balance", - "is_frozen": "bool", - "is_zombie": "bool" - }, - "AssetId": "u32", - "BalanceOf": "Balance", - "VCU": { - "serial_number": "i32", - "project": "Vec", - "amount_co2": "Balance", - "ipfs_hash": "Vec" - } - } - }); - await api_promise.isReady + if (ws_provider) { + ws_provider.on('connected', async (e) => { + const api_promise = await ApiPromise.create({ + provider: ws_provider, types: + { + "CallOf": "Call", + "DispatchTime": { + "_enum": { + "At": "BlockNumber", + "After": "BlockNumber" + } + }, + "ScheduleTaskIndex": "u32", + "DelayedOrigin": { + "delay": "BlockNumber", + "origin": "PalletsOrigin" + }, + "StorageValue": "Vec", + "GraduallyUpdate": { + "key": "StorageKey", + "targetValue": "StorageValue", + "perBlock": "StorageValue" + }, + "StorageKeyBytes": "Vec", + "StorageValueBytes": "Vec", + "RpcDataProviderId": "Text", + "OrderedSet": "Vec", + "OrmlAccountData": { + "free": "Balance", + "frozen": "Balance", + "reserved": "Balance" + }, + "OrmlBalanceLock": { + "amount": "Balance", + "id": "LockIdentifier" + }, + "DelayedDispatchTime": { + "_enum": { + "At": "BlockNumber", + "After": "BlockNumber" + } + }, + "DispatchId": "u32", + "Price": "FixedU128", + "OrmlVestingSchedule": { + "start": "BlockNumber", + "period": "BlockNumber", + "periodCount": "u32", + "perPeriod": "Compact" + }, + "VestingScheduleOf": "OrmlVestingSchedule", + "PalletBalanceOf": "Balance", + "ChangeBalance": { + "_enum": { + "NoChange": "Null", + "NewValue": "Balance" + } + }, + "BalanceWrapper": { + "amount": "Balance" + }, + "BalanceRequest": { + "amount": "Balance" + }, + "EvmAccountInfo": { + "nonce": "Index", + "contractInfo": "Option", + "developerDeposit": "Option" + }, + "CodeInfo": { + "codeSize": "u32", + "refCount": "u32" + }, + "EvmContractInfo": { + "codeHash": "H256", + "maintainer": "H160", + "deployed": "bool" + }, + "EvmAddress": "H160", + "CallRequest": { + "from": "Option", + "to": "Option", + "gasLimit": "Option", + "storageLimit": "Option", + "value": "Option", + "data": "Option" + }, + "CID": "Vec", + "ClassId": "u32", + "ClassIdOf": "ClassId", + "TokenId": "u64", + "TokenIdOf": "TokenId", + "TokenInfoOf": { + "metadata": "CID", + "owner": "AccountId", + "data": "TokenData" + }, + "TokenData": { + "deposit": "Balance" + }, + "Properties": { + "_set": { + "_bitLength": 8, + "Transferable": 1, + "Burnable": 2 + } + }, + "BondingLedger": { + "total": "Compact", + "active": "Compact", + "unlocking": "Vec" + }, + "Amount": "i128", + "AmountOf": "Amount", + "AuctionId": "u32", + "AuctionIdOf": "AuctionId", + "TokenSymbol": { + "_enum": { + "BITG": 0, + "USDG": 1 + } + }, + "CurrencyId": { + "_enum": { + "Token": "TokenSymbol", + "DEXShare": "(TokenSymbol, TokenSymbol)", + "ERC20": "EvmAddress" + } + }, + "CurrencyIdOf": "CurrencyId", + "AuthoritysOriginId": { + "_enum": [ + "Root" + ] + }, + "TradingPair": "(CurrencyId, CurrencyId)", + "AsOriginId": "AuthoritysOriginId", + "SubAccountStatus": { + "bonded": "Balance", + "available": "Balance", + "unbonding": "Vec<(EraIndex,Balance)>", + "mockRewardRate": "Rate" + }, + "Params": { + "targetMaxFreeUnbondedRatio": "Ratio", + "targetMinFreeUnbondedRatio": "Ratio", + "targetUnbondingToFreeRatio": "Ratio", + "unbondingToFreeAdjustment": "Ratio", + "baseFeeRate": "Rate" + }, + "Ledger": { + "bonded": "Balance", + "unbondingToFree": "Balance", + "freePool": "Balance", + "toUnbondNextEra": "(Balance, Balance)" + }, + "ChangeRate": { + "_enum": { + "NoChange": "Null", + "NewValue": "Rate" + } + }, + "ChangeRatio": { + "_enum": { + "NoChange": "Null", + "NewValue": "Ratio" + } + }, + "BalanceInfo": { + "amount": "Balance" + }, + "Rate": "FixedU128", + "Ratio": "FixedU128", + "PublicKey": "[u8; 20]", + "DestAddress": "Vec", + "Keys": "SessionKeys2", + "PalletsOrigin": { + "_enum": { + "System": "SystemOrigin", + "Timestamp": "Null", + "RandomnessCollectiveFlip": "Null", + "Balances": "Null", + "Accounts": "Null", + "Currencies": "Null", + "Tokens": "Null", + "Vesting": "Null", + "Utility": "Null", + "Multisig": "Null", + "Recovery": "Null", + "Proxy": "Null", + "Scheduler": "Null", + "Indices": "Null", + "GraduallyUpdate": "Null", + "Authorship": "Null", + "Babe": "Null", + "Grandpa": "Null", + "Staking": "Null", + "Session": "Null", + "Historical": "Null", + "Authority": "DelayedOrigin", + "ElectionsPhragmen": "Null", + "Contracts": "Null", + "EVM": "Null", + "Sudo": "Null", + "TransactionPayment": "Null" + } + }, + "LockState": { + "_enum": { + "Committed": "None", + "Unbonding": "BlockNumber" + } + }, + "LockDuration": { + "_enum": [ + "OneMonth", + "OneYear", + "TenYears" + ] + }, + "EraIndex": "u32", + "Era": { + "index": "EraIndex", + "start": "BlockNumber" + }, + "Commitment": { + "state": "LockState", + "duration": "LockDuration", + "amount": "Balance", + "candidate": "AccountId" + }, + "AssetDetails": { + "owner": "AccountId", + "issuer": "AccountId", + "admin": "AccountId", + "freezer": "AccountId", + "supply": "Balance", + "deposit": "DepositBalance", + "max_zombies": "u32", + "min_balance": "Balance", + "zombies": "u32", + "accounts": "u32", + "is_frozen": "bool" + }, + "AssetMetadata": { + "deposit": "DepositBalance", + "name": "Vec", + "symbol": "Vec", + "decimals": "u8" + }, + "AssetBalance": { + "balance": "Balance", + "is_frozen": "bool", + "is_zombie": "bool" + }, + "AssetId": "u32", + "BalanceOf": "Balance", + "VCU": { + "serial_number": "i32", + "project": "Vec", + "amount_co2": "Balance", + "ipfs_hash": "Vec" + } + } + }); + await api_promise.isReady - api = api_promise + api = api_promise - resolve(api) + resolve(api) - // cache data we need - getChainMetaData(api_promise, db).then() - getInflationAmount(api_promise, db).then() - getKycAddresses(api_promise, db).then() - }) + // cache data we need + getChainMetaData(api_promise, db).then() + getInflationAmount(api_promise, db).then() + getKycAddresses(api_promise, db).then() + }) - ws_provider.on('error', async (e) => { - api = undefined + ws_provider.on('error', async (e) => { + api = undefined - console.warn('Polkadot WS provider error: ', e) + console.warn('Polkadot WS provider error: ', e) - if (current_network.id !== 'mainnet' && current_network.id !== 'testnet') { - await networks_store.asyncSet('current', 'mainnet') // reset to mainnet - } + if (current_network.id !== 'mainnet' && current_network.id !== 'testnet') { + await networks_store.asyncSet('current', 'mainnet') // reset to mainnet + } - resolve(api) - }); + resolve(api) + }); - ws_provider.on('disconnected', async (e) => { - api = undefined + ws_provider.on('disconnected', async (e) => { + api = undefined - console.warn('Polkadot WS provider disconnected.') - }) - } - }); + console.warn('Polkadot WS provider disconnected.') + }) + } + }); } const polkadotApi = async(force = false) => { - if(!api || force || !ws_provider?.isConnected || isIOs()) { - const success = await initPolkadotApi(force) - if(!success) { - setTimeout(() => { - initPolkadotApi(force) - }, 1000) - return undefined - } + if(!api || force || !ws_provider?.isConnected || isIOs()) { + const success = await initPolkadotApi(force) + if(!success) { + setTimeout(() => { + initPolkadotApi(force) + }, 1000) + return undefined } + } - return api + return api } export { - polkadotApi + polkadotApi } \ No newline at end of file diff --git a/packages/browser-wallet-core/src/services/databaseService.js b/packages/browser-wallet-core/src/services/databaseService.js index 3b1fd4d..8813335 100644 --- a/packages/browser-wallet-core/src/services/databaseService.js +++ b/packages/browser-wallet-core/src/services/databaseService.js @@ -2,32 +2,32 @@ import { AccountStore, SessionStore, SettingsStore, CacheStore, WalletStore } fr import NetworkStore from "../stores/network.js"; class DatabaseService { - constructor() { - this.stores = {} - } + constructor() { + this.stores = {} + } - async init() { - const networks_store = new NetworkStore(); + async init() { + const networks_store = new NetworkStore(); - const current_network = await networks_store.current(); + const current_network = await networks_store.current(); - const cache_store = new CacheStore(current_network); + const cache_store = new CacheStore(current_network); - this.stores = { - accounts: new AccountStore(), - session: new SessionStore(), - settings: new SettingsStore(), - wallets: new WalletStore(), - networks: networks_store, - cache: cache_store - }; - } + this.stores = { + accounts: new AccountStore(), + session: new SessionStore(), + settings: new SettingsStore(), + wallets: new WalletStore(), + networks: networks_store, + cache: cache_store + }; + } - async ensureInit() { - if (Object.keys(this.stores).length === 0) { - await this.init(); - } + async ensureInit() { + if (Object.keys(this.stores).length === 0) { + await this.init(); } + } } export default DatabaseService \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/account.js b/packages/browser-wallet-core/src/stores/account.js index b3f8c2e..b85e01e 100644 --- a/packages/browser-wallet-core/src/stores/account.js +++ b/packages/browser-wallet-core/src/stores/account.js @@ -1,99 +1,99 @@ import BaseStore from "./base.js"; class AccountStore extends BaseStore { - constructor() { - super('account'); - } + constructor() { + super('account'); + } - getByAddress(address, update) { - if(!address) return update(null) + getByAddress(address, update) { + if(!address) return update(null) - this.asyncAll().then(all_accounts => { - for(const account of all_accounts) { - if(account.value.address.toLowerCase() === address.toString().toLowerCase()) { - update(this.asyncGet(account.key)) - } - } + this.asyncAll().then(all_accounts => { + for(const account of all_accounts) { + if(account.value.address.toLowerCase() === address.toString().toLowerCase()) { + update(this.asyncGet(account.key)) + } + } - update(null) - }) - } + update(null) + }) + } - async asyncGetByAddress(address) { - return new Promise((resolve) => { - this.getByAddress(address, resolve); - }); - } + async asyncGetByAddress(address) { + return new Promise((resolve) => { + this.getByAddress(address, resolve); + }); + } - async exists() { - return await this.asyncTotal() > 0 - } - - async current() { - if(!await this.exists()) return false + async exists() { + return await this.asyncTotal() > 0 + } - let current_id = await this.asyncGet('current') - let account = await this.asyncGet(current_id) + async current() { + if(!await this.exists()) return false - if(!current_id || !account) { - current_id = 'main' - await this.asyncSet('current', current_id) - } + let current_id = await this.asyncGet('current') + let account = await this.asyncGet(current_id) - account = await this.asyncGet(current_id) - - return { - id: current_id, - name: '', - address: '', - ...account - } + if(!current_id || !account) { + current_id = 'main' + await this.asyncSet('current', current_id) } - all(update, exclude = []) { - this.allMap((map) => { - let items = [] - - for(const [key, value] of Object.entries(map)) { - if(!exclude.includes(key)) items.push({key, value}) - } - - // Sort accounts by key. Keep 'main' at the top. - items.sort((a, b) => { - if(a.key === 'main') { - return -1 - } else { - if(parseInt(a.key) < parseInt(b.key)) { - return -1 - } - - if(parseInt(a.key) > parseInt(b.key)) { - return 1 - } - } - - return 0 - }) - - update(items) - }); - } - async asyncAll() { - return new Promise((resolve) => { - this.all(resolve, ['current']); - }); - } + account = await this.asyncGet(current_id) - async nextId() { - let next_id = 0 - for(const account of await this.asyncAll()) { - if(parseInt(account?.key) >= next_id) { - next_id = parseInt(account?.key) + 1 - } + return { + id: current_id, + name: '', + address: '', + ...account + } + } + + all(update, exclude = []) { + this.allMap((map) => { + let items = [] + + for(const [key, value] of Object.entries(map)) { + if(!exclude.includes(key)) items.push({key, value}) + } + + // Sort accounts by key. Keep 'main' at the top. + items.sort((a, b) => { + if(a.key === 'main') { + return -1 + } else { + if(parseInt(a.key) < parseInt(b.key)) { + return -1 + } + + if(parseInt(a.key) > parseInt(b.key)) { + return 1 + } } - return next_id.toString() + return 0 + }) + + update(items) + }); + } + async asyncAll() { + return new Promise((resolve) => { + this.all(resolve, ['current']); + }); + } + + async nextId() { + let next_id = 0 + for(const account of await this.asyncAll()) { + if(parseInt(account?.key) >= next_id) { + next_id = parseInt(account?.key) + 1 + } } + + return next_id.toString() + } } export default AccountStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/asset.js b/packages/browser-wallet-core/src/stores/asset.js index a73e62f..1284b0e 100644 --- a/packages/browser-wallet-core/src/stores/asset.js +++ b/packages/browser-wallet-core/src/stores/asset.js @@ -2,33 +2,33 @@ import BaseStore from "./base.js"; class AssetStore extends BaseStore { constructor(network, account) { - const network_name = network.name - .toLowerCase() - .trim() - .replace(/[^\w\s-]/g, '') - .replace(/[\s_-]+/g, '_') - .replace(/^-+|-+$/g, '') + const network_name = network.name + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '_') + .replace(/^-+|-+$/g, '') - super('asset_' + network_name + '_' + account.address) + super('asset_' + network_name + '_' + account.address) - this.network = network - this.account = account + this.network = network + this.account = account } async fetch() { - if(!['mainnet', 'testnet'].includes(this.network.id)) return false; + if(!['mainnet', 'testnet'].includes(this.network.id)) return false; - const url = this.network.api_endpoint + '/asset/transactions?account=' + this.account.address + '&pageSize=10&page=1'; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = this.network.api_endpoint + '/asset/transactions?account=' + this.account.address + '&pageSize=10&page=1'; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - for(const asset of result.transactions) { - await this.asyncSet(asset.id, asset) - } + for(const asset of result.transactions) { + await this.asyncSet(asset.id, asset) + } - return result + return result } } diff --git a/packages/browser-wallet-core/src/stores/base.js b/packages/browser-wallet-core/src/stores/base.js index 053941f..04afbef 100644 --- a/packages/browser-wallet-core/src/stores/base.js +++ b/packages/browser-wallet-core/src/stores/base.js @@ -1,179 +1,176 @@ import { - customReviver, - getCurrentBrowser, - isFirefox, - isIOs, - isSafari, - isStandaloneApp + customReviver, + getCurrentBrowser, + isStandaloneApp } from "@bitgreen/browser-wallet-utils"; import BigNumber from "bignumber.js"; const current_browser = getCurrentBrowser() class BaseStore { - #prefix = ''; + #prefix = ''; - constructor(prefix) { - this.#prefix = prefix ? `${prefix}:` : ''; - } + constructor(prefix) { + this.#prefix = prefix ? `${prefix}:` : ''; + } - get(_key, update) { - if(!_key) return update(null) + get(_key, update) { + if(!_key) return update(null) - const key = `${this.#prefix}${_key.toString().toLowerCase()}`; + const key = `${this.#prefix}${_key.toString().toLowerCase()}`; - if(isStandaloneApp()) { - let value + if(isStandaloneApp()) { + let value - try { - value = JSON.parse(localStorage.getItem(key), customReviver) - } catch (e) { - value = localStorage.getItem(key) - } + try { + value = JSON.parse(localStorage.getItem(key), customReviver) + } catch (e) { + value = localStorage.getItem(key) + } - update(value) - } else { - current_browser.storage.local.get([key], (result) => { - lastError('get'); + update(value) + } else { + current_browser.storage.local.get([key], (result) => { + lastError('get'); - update(result[key]); - }); - } + update(result[key]); + }); } + } - async asyncGet(_key) { - return new Promise((resolve) => { - this.get(_key, resolve); - }); - } + async asyncGet(_key) { + return new Promise((resolve) => { + this.get(_key, resolve); + }); + } - remove(_key, update) { - const key = `${this.#prefix}${_key.toString().toLowerCase()}`; + remove(_key, update) { + const key = `${this.#prefix}${_key.toString().toLowerCase()}`; - if(isStandaloneApp()) { - localStorage.removeItem(key); + if(isStandaloneApp()) { + localStorage.removeItem(key); - update && update() - } else { - current_browser.storage.local.remove(key, () => { - lastError('remove'); + update && update() + } else { + current_browser.storage.local.remove(key, () => { + lastError('remove'); - update && update(); - }); - } + update && update(); + }); } + } - set(_key, value, update) { - const key = `${this.#prefix}${_key.toString().toLowerCase()}`; + set(_key, value, update) { + const key = `${this.#prefix}${_key.toString().toLowerCase()}`; - if(isStandaloneApp()) { - localStorage.setItem(key, JSON.stringify(value)); + if(isStandaloneApp()) { + localStorage.setItem(key, JSON.stringify(value)); - update && update(); - } else { - current_browser.storage.local.set({ [key]: value }, () => { - lastError('set'); - - update && update(); - }); - } - } - - async asyncSet(_key, value) { - return new Promise((resolve) => { - this.set(_key, value, resolve); - }); - } - - all(update, exclude = []) { - this.allMap((map) => { - let items = [] - - for(const [key, value] of Object.entries(map)) { - if(!exclude.includes(key)) items.push({key, value}) - } - - update(items) - }); - } + update && update(); + } else { + current_browser.storage.local.set({ [key]: value }, () => { + lastError('set'); - async asyncAll() { - return new Promise((resolve) => { - this.all(resolve); - }); + update && update(); + }); } + } + + async asyncSet(_key, value) { + return new Promise((resolve) => { + this.set(_key, value, resolve); + }); + } + + all(update, exclude = []) { + this.allMap((map) => { + let items = [] + + for(const [key, value] of Object.entries(map)) { + if(!exclude.includes(key)) items.push({key, value}) + } + + update(items) + }); + } + + async asyncAll() { + return new Promise((resolve) => { + this.all(resolve); + }); + } + + allMap(update) { + if(isStandaloneApp()) { + const map = {}; + + for(let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + let value + + try { + value = JSON.parse(localStorage.getItem(key), customReviver) + } catch (e) { + value = localStorage.getItem(key) + } - allMap(update) { - if(isStandaloneApp()) { - const map = {}; - - for(let i = 0; i < localStorage.length; i++) { - const key = localStorage.key(i); - let value - - try { - value = JSON.parse(localStorage.getItem(key), customReviver) - } catch (e) { - value = localStorage.getItem(key) - } - - if(key.startsWith(this.#prefix)) { - map[key.replace(this.#prefix, '')] = value; - } - } - - update(map); - } else { - current_browser.storage.local.get(null, (result) => { - lastError('all'); + if(key.startsWith(this.#prefix)) { + map[key.replace(this.#prefix, '')] = value; + } + } - const entries = Object.entries(result); - const map = {}; + update(map); + } else { + current_browser.storage.local.get(null, (result) => { + lastError('all'); - for(let i = 0; i < entries.length; i++) { - const [key, value] = entries[i]; + const entries = Object.entries(result); + const map = {}; - if(key.startsWith(this.#prefix)) { - map[key.replace(this.#prefix, '')] = value; - } - } + for(let i = 0; i < entries.length; i++) { + const [key, value] = entries[i]; - update(map); - }); + if(key.startsWith(this.#prefix)) { + map[key.replace(this.#prefix, '')] = value; + } } - } - - async asyncAllMap() { - return new Promise((resolve) => { - this.allMap(resolve); - }); - } - async asyncRemoveAll() { - for(const record of await this.asyncAll()) { - this.remove(record.key) - } + update(map); + }); } + } - total(update) { - this.allMap((map) => { - update(Object.keys(map).length) - }); - } + async asyncAllMap() { + return new Promise((resolve) => { + this.allMap(resolve); + }); + } - async asyncTotal() { - return new Promise((resolve) => { - this.total(resolve); - }); + async asyncRemoveAll() { + for(const record of await this.asyncAll()) { + this.remove(record.key) } + } + + total(update) { + this.allMap((map) => { + update(Object.keys(map).length) + }); + } + + async asyncTotal() { + return new Promise((resolve) => { + this.total(resolve); + }); + } } const lastError = (type) => { - const error = current_browser.runtime.lastError; + const error = current_browser.runtime.lastError; - if(error) { - console.error(`BaseStore.${type}:: runtime.lastError:`, error); - } + if(error) { + console.error(`BaseStore.${type}:: runtime.lastError:`, error); + } }; export default BaseStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/cache.js b/packages/browser-wallet-core/src/stores/cache.js index 6b532a6..10f5963 100644 --- a/packages/browser-wallet-core/src/stores/cache.js +++ b/packages/browser-wallet-core/src/stores/cache.js @@ -1,21 +1,21 @@ import BaseStore from "./base.js"; class CacheStore extends BaseStore { - constructor(network = null) { - let network_name = 'global' - if(network && network.name) { - network_name = network.name - .toLowerCase() - .trim() - .replace(/[^\w\s-]/g, '') - .replace(/[\s_-]+/g, '_') - .replace(/^-+|-+$/g, '') - } + constructor(network = null) { + let network_name = 'global' + if(network && network.name) { + network_name = network.name + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '_') + .replace(/^-+|-+$/g, '') + } - super('cache_' + network_name); + super('cache_' + network_name); - this.network = network - } + this.network = network + } } export default CacheStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/network.js b/packages/browser-wallet-core/src/stores/network.js index 786ee8d..7cc787a 100644 --- a/packages/browser-wallet-core/src/stores/network.js +++ b/packages/browser-wallet-core/src/stores/network.js @@ -1,68 +1,68 @@ import BaseStore from "./base.js"; class NetworkStore extends BaseStore { - constructor() { - super('network'); - } - - async exists() { - return await this.asyncTotal() > 0 - } + constructor() { + super('network'); + } - async current() { - let current_id = await this.asyncGet('current') - let network + async exists() { + return await this.asyncTotal() > 0 + } - if(!current_id) { - current_id = 'mainnet' - await this.asyncSet('current', current_id) - } + async current() { + let current_id = await this.asyncGet('current') + let network - if(current_id === 'mainnet') { - network = { - name: 'Mainnet', - url: 'wss://mainnet.bitgreen.org', - api_endpoint: 'https://api-mainnet.bitgreen.org' - } - } else if(current_id === 'testnet') { - network = { - name: 'Testnet', - url: 'wss://testnet.bitgreen.org', - api_endpoint: 'https://api-testnet.bitgreen.org' - } - } else { - network = await this.asyncGet(current_id) - } + if(!current_id) { + current_id = 'mainnet' + await this.asyncSet('current', current_id) + } - if(!network) { - current_id = 'mainnet' - await this.asyncSet('current', current_id) - } + if(current_id === 'mainnet') { + network = { + name: 'Mainnet', + url: 'wss://mainnet.bitgreen.org', + api_endpoint: 'https://api-mainnet.bitgreen.org' + } + } else if(current_id === 'testnet') { + network = { + name: 'Testnet', + url: 'wss://testnet.bitgreen.org', + api_endpoint: 'https://api-testnet.bitgreen.org' + } + } else { + network = await this.asyncGet(current_id) + } - return { - id: current_id, - name: '', - url: '', - ...network - } + if(!network) { + current_id = 'mainnet' + await this.asyncSet('current', current_id) } - async asyncAll() { - return new Promise((resolve) => { - this.all(resolve, ['current']); - }); + return { + id: current_id, + name: '', + url: '', + ...network } + } - async nextId() { - let next_id = 1 - for(const network of await this.asyncAll()) { - if(parseInt(network?.key) >= next_id) { - next_id = parseInt(network?.key) + 1 - } - } + async asyncAll() { + return new Promise((resolve) => { + this.all(resolve, ['current']); + }); + } - return next_id + async nextId() { + let next_id = 1 + for(const network of await this.asyncAll()) { + if(parseInt(network?.key) >= next_id) { + next_id = parseInt(network?.key) + 1 + } } + + return next_id + } } export default NetworkStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/session.js b/packages/browser-wallet-core/src/stores/session.js index d969728..bd1c7a2 100644 --- a/packages/browser-wallet-core/src/stores/session.js +++ b/packages/browser-wallet-core/src/stores/session.js @@ -1,117 +1,114 @@ import BaseStore from "./base.js"; import { - customReviver, - getCurrentBrowser, - isFirefox, - isIOs, - isSafari, - isStandaloneApp + customReviver, + getCurrentBrowser, + isStandaloneApp } from "@bitgreen/browser-wallet-utils"; const current_browser = getCurrentBrowser() class SessionStore extends BaseStore { - constructor() { - super(''); - } + constructor() { + super(''); + } - get(_key, update) { - const key = `${_key}`; + get(_key, update) { + const key = `${_key}`; - if(isStandaloneApp()) { - let value + if(isStandaloneApp()) { + let value - try { - value = JSON.parse(sessionStorage.getItem(key), customReviver) - } catch (e) { - value = sessionStorage.getItem(key) - } + try { + value = JSON.parse(sessionStorage.getItem(key), customReviver) + } catch (e) { + value = sessionStorage.getItem(key) + } - update(value) - } else { - current_browser.storage.session.get([key], (result) => { - lastError('get'); + update(value) + } else { + current_browser.storage.session.get([key], (result) => { + lastError('get'); - update(result[key]); - }); - } + update(result[key]); + }); } + } - remove(_key, update) { - const key = `${_key}`; + remove(_key, update) { + const key = `${_key}`; - if(isStandaloneApp()) { - sessionStorage.removeItem(key); + if(isStandaloneApp()) { + sessionStorage.removeItem(key); - update && update() - } else { - current_browser.storage.session.remove(key, () => { - lastError('remove'); + update && update() + } else { + current_browser.storage.session.remove(key, () => { + lastError('remove'); - update && update(); - }); - } + update && update(); + }); } + } - set(_key, value, update) { - const key = `${_key}`; + set(_key, value, update) { + const key = `${_key}`; - if(isStandaloneApp()) { - sessionStorage.setItem(key, JSON.stringify(value)); + if(isStandaloneApp()) { + sessionStorage.setItem(key, JSON.stringify(value)); - update && update(); - } else { - current_browser.storage.session.set({ [key]: value }, () => { - lastError('set'); + update && update(); + } else { + current_browser.storage.session.set({ [key]: value }, () => { + lastError('set'); - update && update(); - }); - } + update && update(); + }); } + } - allMap(update) { - if(isStandaloneApp()) { - const map = {}; + allMap(update) { + if(isStandaloneApp()) { + const map = {}; - for(let i = 0; i < sessionStorage.length; i++) { - const key = sessionStorage.key(i); - let value + for(let i = 0; i < sessionStorage.length; i++) { + const key = sessionStorage.key(i); + let value - try { - value = JSON.parse(localStorage.getItem(key), customReviver) - } catch (e) { - value = localStorage.getItem(key) - } - - map[key] = value; - } + try { + value = JSON.parse(localStorage.getItem(key), customReviver) + } catch (e) { + value = localStorage.getItem(key) + } - update(map); - } else { - current_browser.storage.session.get(null, (result) => { - lastError('all'); + map[key] = value; + } - const entries = Object.entries(result); - const map = {}; + update(map); + } else { + current_browser.storage.session.get(null, (result) => { + lastError('all'); - for(let i = 0; i < entries.length; i++) { - const [key, value] = entries[i]; + const entries = Object.entries(result); + const map = {}; - map[key] = value; - } + for(let i = 0; i < entries.length; i++) { + const [key, value] = entries[i]; - update(map); - }); + map[key] = value; } + + update(map); + }); } + } } const lastError = (type) => { - const error = current_browser.runtime.lastError; + const error = current_browser.runtime.lastError; - if(error) { - console.error(`SessionStore.${type}:: runtime.lastError:`, error); - } + if(error) { + console.error(`SessionStore.${type}:: runtime.lastError:`, error); + } }; export default SessionStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/settings.js b/packages/browser-wallet-core/src/stores/settings.js index 1d29c9b..896039b 100644 --- a/packages/browser-wallet-core/src/stores/settings.js +++ b/packages/browser-wallet-core/src/stores/settings.js @@ -1,9 +1,9 @@ import BaseStore from "./base.js"; class SettingsStore extends BaseStore { - constructor() { - super('settings'); - } + constructor() { + super('settings'); + } } export default SettingsStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/token.js b/packages/browser-wallet-core/src/stores/token.js index 5192d0c..9d5ec7f 100644 --- a/packages/browser-wallet-core/src/stores/token.js +++ b/packages/browser-wallet-core/src/stores/token.js @@ -2,33 +2,33 @@ import BaseStore from "./base.js"; class TokenStore extends BaseStore { constructor(network, account) { - const network_name = network.name - .toLowerCase() - .trim() - .replace(/[^\w\s-]/g, '') - .replace(/[\s_-]+/g, '_') - .replace(/^-+|-+$/g, '') + const network_name = network.name + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '_') + .replace(/^-+|-+$/g, '') - super('token_' + network_name + '_' + account.address) + super('token_' + network_name + '_' + account.address) - this.network = network - this.account = account + this.network = network + this.account = account } async fetch() { - if(!['mainnet', 'testnet'].includes(this.network.id)) return false; + if(!['mainnet', 'testnet'].includes(this.network.id)) return false; - const url = this.network.api_endpoint + '/token/transactions?account=' + this.account.address + '&pageSize=10&page=1'; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = this.network.api_endpoint + '/token/transactions?account=' + this.account.address + '&pageSize=10&page=1'; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - for(const token of result) { - await this.asyncSet(token.id, token) - } + for(const token of result) { + await this.asyncSet(token.id, token) + } - return result + return result } } diff --git a/packages/browser-wallet-core/src/stores/transaction.js b/packages/browser-wallet-core/src/stores/transaction.js index 3b71959..68061e7 100644 --- a/packages/browser-wallet-core/src/stores/transaction.js +++ b/packages/browser-wallet-core/src/stores/transaction.js @@ -1,37 +1,37 @@ import BaseStore from "./base.js"; class TransactionStore extends BaseStore { - constructor(network, account) { - const network_name = network.name - .toLowerCase() - .trim() - .replace(/[^\w\s-]/g, '') - .replace(/[\s_-]+/g, '_') - .replace(/^-+|-+$/g, '') - - super('transaction_' + network_name + '_' + account.address) - - this.network = network - this.account = account + constructor(network, account) { + const network_name = network.name + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '_') + .replace(/^-+|-+$/g, '') + + super('transaction_' + network_name + '_' + account.address) + + this.network = network + this.account = account + } + + async fetch() { + if(!['mainnet', 'testnet'].includes(this.network.id)) return false; + + const date = new Date(); + const date_end = date.toISOString().slice(0, 19).replace('T', '+'); + const url = this.network.api_endpoint + '/transactions?account=' + this.account.address; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() + + for(const transaction of result.transactions) { + await this.asyncSet(transaction.hash, transaction) } - async fetch() { - if(!['mainnet', 'testnet'].includes(this.network.id)) return false; - - const date = new Date(); - const date_end = date.toISOString().slice(0, 19).replace('T', '+'); - const url = this.network.api_endpoint + '/transactions?account=' + this.account.address; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() - - for(const transaction of result.transactions) { - await this.asyncSet(transaction.hash, transaction) - } - - return result - } + return result + } } export default TransactionStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/wallet.js b/packages/browser-wallet-core/src/stores/wallet.js index 5382961..6f4f1cb 100644 --- a/packages/browser-wallet-core/src/stores/wallet.js +++ b/packages/browser-wallet-core/src/stores/wallet.js @@ -1,13 +1,13 @@ import BaseStore from "./base.js"; class WalletStore extends BaseStore { - constructor() { - super('wallet'); - } + constructor() { + super('wallet'); + } - async exists() { - return await this.asyncTotal() > 0 - } + async exists() { + return await this.asyncTotal() > 0 + } } export default WalletStore \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/chart.js b/packages/browser-wallet-ui/src/chart.js index 1d3839b..c847763 100644 --- a/packages/browser-wallet-ui/src/chart.js +++ b/packages/browser-wallet-ui/src/chart.js @@ -1,5 +1,4 @@ import { formatAmount, getAmountDecimal } from "@bitgreen/browser-wallet-utils"; -import anime from "animejs"; let bbb_token_amount, nature_based_token_amount, impact_bonds_amount, other_amount let total_amount = 0 @@ -9,115 +8,115 @@ let per_3 = 1 let per_4 = 1 const initChart = (amounts) => { - amounts = { - bbb_token_amount: 0, - nature_based_token_amount: 0, - impact_bonds_amount: 0, - other_amount: 0, - ...amounts, - } - - bbb_token_amount = amounts.bbb_token_amount - nature_based_token_amount = amounts.nature_based_token_amount - impact_bonds_amount = amounts.impact_bonds_amount - other_amount = amounts.other_amount - - total_amount = bbb_token_amount + nature_based_token_amount + impact_bonds_amount + other_amount - - per_1 = bbb_token_amount / total_amount * 100 - per_2 = nature_based_token_amount / total_amount * 100 - per_3 = impact_bonds_amount / total_amount * 100 - per_4 = other_amount / total_amount * 100 - - if (total_amount === 0) { - per_4 = 100 - } - - renderChart(true) + amounts = { + bbb_token_amount: 0, + nature_based_token_amount: 0, + impact_bonds_amount: 0, + other_amount: 0, + ...amounts, + } + + bbb_token_amount = amounts.bbb_token_amount + nature_based_token_amount = amounts.nature_based_token_amount + impact_bonds_amount = amounts.impact_bonds_amount + other_amount = amounts.other_amount + + total_amount = bbb_token_amount + nature_based_token_amount + impact_bonds_amount + other_amount + + per_1 = bbb_token_amount / total_amount * 100 + per_2 = nature_based_token_amount / total_amount * 100 + per_3 = impact_bonds_amount / total_amount * 100 + per_4 = other_amount / total_amount * 100 + + if (total_amount === 0) { + per_4 = 100 + } + + renderChart(true) } const renderChart = (init_render = false) => { - const offset = 25 - const bbb_token_el = document.querySelector('#chart #bbb_token') - const nature_based_el = document.querySelector('#chart #nature_based') - const impact_bonds_el = document.querySelector('#chart #impact_bonds') - const other_el = document.querySelector('#chart #other') - const bar_el = document.querySelector('#chart #bar') - const text_el = document.querySelector('#chart .chart-text') - const amount_el = text_el.querySelector('.amount') - const decimal_el = text_el.querySelector('.decimals') - - const amount_info = getAmountDecimal(formatAmount(total_amount, 2), 2) - - amount_el.innerHTML = amount_info.amount - decimal_el.innerHTML = '.' + amount_info.decimals - - if(total_amount >= 1000000) { - decimal_el.classList.add('d-none') - } else { - decimal_el.classList.remove('d-none') - } - - if(total_amount >= 1000000) { - text_el.classList.add('text-small') - } else { - text_el.classList.remove('text-small') - } - - bbb_token_el.style.transition = "stroke-dasharray, stroke-dashoffset"; - bbb_token_el.style.strokeDasharray = "0 100"; - bbb_token_el.style.strokeDashoffset = "50"; - - nature_based_el.style.transition = "stroke-dasharray, stroke-dashoffset"; - nature_based_el.style.strokeDasharray = "0 100"; - nature_based_el.style.strokeDashoffset = "50"; - - impact_bonds_el.style.transition = "stroke-dasharray, stroke-dashoffset"; - impact_bonds_el.style.strokeDasharray = "0 100"; - impact_bonds_el.style.strokeDashoffset = "50"; - - other_el.style.transition = "stroke-dasharray, stroke-dashoffset"; - other_el.style.strokeDasharray = "0 100"; - other_el.style.strokeDashoffset = "50"; - - bar_el.style.transition = "stroke-opacity"; - bar_el.style.strokeOpacity = "0"; - - text_el.style.transition = "fill-opacity"; - text_el.style.fillOpacity = "0"; - - if (!init_render) { - setTimeout(() => { - bar_el.style.transition = "stroke-opacity 0.6s ease-in-out"; - bar_el.style.strokeOpacity = "1"; - }, 200) - - setTimeout(() => { - text_el.style.transition = "fill-opacity 0.6s ease-in-out"; - text_el.style.fillOpacity = "1"; - }, 1000) - - setTimeout(() => { - bbb_token_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; - bbb_token_el.style.strokeDasharray = per_1 + " " + (100 - per_1); - bbb_token_el.style.strokeDashoffset = offset; - - nature_based_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; - nature_based_el.style.strokeDasharray = per_2 + " " + (100 - per_2); - nature_based_el.style.strokeDashoffset = 100 - per_1 + offset; - - impact_bonds_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; - impact_bonds_el.style.strokeDasharray = per_3 + " " + (100 - per_3); - impact_bonds_el.style.strokeDashoffset = 100 - (per_1 + per_2) + offset; - - other_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; - other_el.style.strokeDasharray = per_4 + " " + (100 - per_4); - other_el.style.strokeDashoffset = 100 - (per_1 + per_2 + per_3) + offset; - }, 600); - } + const offset = 25 + const bbb_token_el = document.querySelector('#chart #bbb_token') + const nature_based_el = document.querySelector('#chart #nature_based') + const impact_bonds_el = document.querySelector('#chart #impact_bonds') + const other_el = document.querySelector('#chart #other') + const bar_el = document.querySelector('#chart #bar') + const text_el = document.querySelector('#chart .chart-text') + const amount_el = text_el.querySelector('.amount') + const decimal_el = text_el.querySelector('.decimals') + + const amount_info = getAmountDecimal(formatAmount(total_amount, 2), 2) + + amount_el.innerHTML = amount_info.amount + decimal_el.innerHTML = '.' + amount_info.decimals + + if(total_amount >= 1000000) { + decimal_el.classList.add('d-none') + } else { + decimal_el.classList.remove('d-none') + } + + if(total_amount >= 1000000) { + text_el.classList.add('text-small') + } else { + text_el.classList.remove('text-small') + } + + bbb_token_el.style.transition = "stroke-dasharray, stroke-dashoffset"; + bbb_token_el.style.strokeDasharray = "0 100"; + bbb_token_el.style.strokeDashoffset = "50"; + + nature_based_el.style.transition = "stroke-dasharray, stroke-dashoffset"; + nature_based_el.style.strokeDasharray = "0 100"; + nature_based_el.style.strokeDashoffset = "50"; + + impact_bonds_el.style.transition = "stroke-dasharray, stroke-dashoffset"; + impact_bonds_el.style.strokeDasharray = "0 100"; + impact_bonds_el.style.strokeDashoffset = "50"; + + other_el.style.transition = "stroke-dasharray, stroke-dashoffset"; + other_el.style.strokeDasharray = "0 100"; + other_el.style.strokeDashoffset = "50"; + + bar_el.style.transition = "stroke-opacity"; + bar_el.style.strokeOpacity = "0"; + + text_el.style.transition = "fill-opacity"; + text_el.style.fillOpacity = "0"; + + if (!init_render) { + setTimeout(() => { + bar_el.style.transition = "stroke-opacity 0.6s ease-in-out"; + bar_el.style.strokeOpacity = "1"; + }, 200) + + setTimeout(() => { + text_el.style.transition = "fill-opacity 0.6s ease-in-out"; + text_el.style.fillOpacity = "1"; + }, 1000) + + setTimeout(() => { + bbb_token_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; + bbb_token_el.style.strokeDasharray = per_1 + " " + (100 - per_1); + bbb_token_el.style.strokeDashoffset = offset; + + nature_based_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; + nature_based_el.style.strokeDasharray = per_2 + " " + (100 - per_2); + nature_based_el.style.strokeDashoffset = 100 - per_1 + offset; + + impact_bonds_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; + impact_bonds_el.style.strokeDasharray = per_3 + " " + (100 - per_3); + impact_bonds_el.style.strokeDashoffset = 100 - (per_1 + per_2) + offset; + + other_el.style.transition = "stroke-dasharray 0.6s ease-in-out"; + other_el.style.strokeDasharray = per_4 + " " + (100 - per_4); + other_el.style.strokeDashoffset = 100 - (per_1 + per_2 + per_3) + offset; + }, 600); + } } export { - initChart, - renderChart + initChart, + renderChart } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/index.js b/packages/browser-wallet-ui/src/index.js index 1c09742..3b7a2da 100644 --- a/packages/browser-wallet-ui/src/index.js +++ b/packages/browser-wallet-ui/src/index.js @@ -1,29 +1,28 @@ import { updateElement } from './screens.js' import { - goToScreen, - doLogin, - hideLogin, - copyText, - updateAccounts, - showLogin, - currentScreen, - clearHistory, - reloadScreen, - scrollToBottom, - disableFooter, - enableFooter, - freezeRoot, - unFreezeRoot, - showInit, - hideInit + goToScreen, + doLogin, + hideLogin, + copyText, + updateAccounts, + showLogin, + currentScreen, + clearHistory, + reloadScreen, + scrollToBottom, + disableFooter, + enableFooter, + freezeRoot, + unFreezeRoot, + showInit, + hideInit } from './screens/index.js' import { sendMessage } from "./messaging.js"; import { hideNotification, showNotification } from "./notifications.js"; -import anime from 'animejs'; import DOMPurify from 'dompurify'; import * as jdenticon from 'jdenticon' -import {Tooltip} from 'bootstrap' +import { Tooltip } from 'bootstrap' /* import stores */ import { databaseService } from "@bitgreen/browser-wallet-core"; @@ -31,410 +30,409 @@ import { databaseService } from "@bitgreen/browser-wallet-core"; /* import styles */ import './scss/styles.scss' -/* import utilitis */ -import {formatAddress, isIOs, isStandaloneApp} from "@bitgreen/browser-wallet-utils"; +/* import utilities */ +import { formatAddress, isIOs, isStandaloneApp } from "@bitgreen/browser-wallet-utils"; class userInterface { - constructor() { - this.db = new databaseService() - } - - initUi = async() => { - await this.db.ensureInit() - - await updateElement('body', 'init', {}, false) - - this.current_account = await this.db.stores.accounts.current() - - await this.initHeader() - await this.initFooter() - await this.initLogin() - await this.initCustomActions() - } - - initHeader = async() => { - await updateElement('#header', 'shared/header', { - account_jdenticon: jdenticon.toSvg(this.current_account.address,56), - account_address: formatAddress(this.current_account?.address, 8, 8), - full_account_address: this.current_account?.address, - account_name: (this.current_account?.name && this.current_account?.name?.length) > 14 ? this.current_account?.name?.substring(0,14)+'...' : this.current_account?.name - }, false) - - await this.initAccounts() - - let accounts_modal_el = document.querySelector("#accounts_modal"); - document.querySelector("#header #go_settings").addEventListener("click", () => goToScreen('settingsScreen')) - document.querySelector("#header #top_logo").addEventListener("click", () => goToScreen('dashboardScreen')) - document.querySelector("#header #current_wallet").addEventListener("click", (e) => { - if(document.querySelector("#header #current_wallet").classList.contains('active')) { - accounts_modal_el.classList.remove('fade') - accounts_modal_el.classList.remove('show') - } else { - accounts_modal_el.classList.add('fade') - accounts_modal_el.classList.add('show') - } - }) - document.querySelector("#accounts_modal #hide_accounts_modal").addEventListener("click", (e) => { - accounts_modal_el.classList.remove('fade') - accounts_modal_el.classList.remove('show') - }) - document.querySelector("#header #go_copy").addEventListener("click", async(e) => { - await this.copyCurrentAddress(e.target.dataset.address) - }); - document.querySelector("#accounts_modal #copy_address").addEventListener("click", async(e) => { - await this.copyCurrentAddress(e.target.dataset.address) - }); - document.querySelector("#accounts_modal #lock_wallet").addEventListener("click", async(e) => { - return await this.lockWallet() - }) - document.querySelector("#accounts_modal #manage_accounts").addEventListener("click", async() => { - accounts_modal_el.classList.remove('fade') - accounts_modal_el.classList.remove('show') - - return await goToScreen('accountManageScreen') - }) - } - - lockWallet = async() => { - let accounts_modal_el = document.querySelector("#accounts_modal"); - + constructor() { + this.db = new databaseService() + } + + initUi = async() => { + await this.db.ensureInit() + + await updateElement('body', 'init', {}, false) + + this.current_account = await this.db.stores.accounts.current() + + await this.initHeader() + await this.initFooter() + await this.initLogin() + await this.initCustomActions() + } + + initHeader = async() => { + await updateElement('#header', 'shared/header', { + account_jdenticon: jdenticon.toSvg(this.current_account.address,56), + account_address: formatAddress(this.current_account?.address, 8, 8), + full_account_address: this.current_account?.address, + account_name: (this.current_account?.name && this.current_account?.name?.length) > 14 ? this.current_account?.name?.substring(0,14)+'...' : this.current_account?.name + }, false) + + await this.initAccounts() + + let accounts_modal_el = document.querySelector("#accounts_modal"); + document.querySelector("#header #go_settings").addEventListener("click", () => goToScreen('settingsScreen')) + document.querySelector("#header #top_logo").addEventListener("click", () => goToScreen('dashboardScreen')) + document.querySelector("#header #current_wallet").addEventListener("click", (e) => { + if(document.querySelector("#header #current_wallet").classList.contains('active')) { accounts_modal_el.classList.remove('fade') accounts_modal_el.classList.remove('show') + } else { + accounts_modal_el.classList.add('fade') + accounts_modal_el.classList.add('show') + } + }) + document.querySelector("#accounts_modal #hide_accounts_modal").addEventListener("click", (e) => { + accounts_modal_el.classList.remove('fade') + accounts_modal_el.classList.remove('show') + }) + document.querySelector("#header #go_copy").addEventListener("click", async(e) => { + await this.copyCurrentAddress(e.target.dataset.address) + }); + document.querySelector("#accounts_modal #copy_address").addEventListener("click", async(e) => { + await this.copyCurrentAddress(e.target.dataset.address) + }); + document.querySelector("#accounts_modal #lock_wallet").addEventListener("click", async(e) => { + return await this.lockWallet() + }) + document.querySelector("#accounts_modal #manage_accounts").addEventListener("click", async() => { + accounts_modal_el.classList.remove('fade') + accounts_modal_el.classList.remove('show') + + return await goToScreen('accountManageScreen') + }) + } + + lockWallet = async() => { + let accounts_modal_el = document.querySelector("#accounts_modal"); + + accounts_modal_el.classList.remove('fade') + accounts_modal_el.classList.remove('show') + + await showLogin(false, true) + await sendMessage('lock_wallet') + setTimeout(async() => { + return await goToScreen('dashboardScreen') + }, 1200) // redirect to dashboard + } + + copyCurrentAddress = async(address) => { + await copyText(address) + await showNotification('Account address copied to clipboard.', 'info') + } + + initAccounts = async() => { + const current_account = await this.db.stores.accounts.current() + const kyc_level = await this.db.stores.cache.asyncGet('kyc_' + current_account.address) + + await updateElement('#accounts_modal', 'accounts/modal', { + current_account_name: (current_account?.name && current_account?.name?.length > 14) ? current_account?.name?.substring(0,14)+'...' : current_account?.name, + current_account_address: formatAddress(current_account?.address, 16, 8), + full_account_address: current_account?.address, + is_primary: current_account?.id === 'main' ? '' : 'hidden', + is_kyc_verified: kyc_level ? `verified verified-${kyc_level}` : 'unverified', + }, false) + + await updateAccounts(current_account?.id) + } + + initFooter = async() => { + await updateElement('#main_footer', 'shared/footer', {}, false) + + const dashboardTooltip = new Tooltip('#main_footer #go_dashboardScreen', { + html: true, + offset: [0, -8], + placement: 'top', + container: 'body', + popperConfig: (config) => { + const flip = config.modifiers.find(({ name }) => name === 'flip') + + flip.options = { + ...flip.options, + boundary: document.querySelector('#root'), + } - await showLogin(false, true) - await sendMessage('lock_wallet') - setTimeout(async() => { - return await goToScreen('dashboardScreen') - }, 1200) // redirect to dashboard - } - - copyCurrentAddress = async(address) => { - await copyText(address) - await showNotification('Account address copied to clipboard.', 'info') - } - - initAccounts = async() => { - const current_account = await this.db.stores.accounts.current() - const kyc_level = await this.db.stores.cache.asyncGet('kyc_' + current_account.address) - - await updateElement('#accounts_modal', 'accounts/modal', { - current_account_name: (current_account?.name && current_account?.name?.length > 14) ? current_account?.name?.substring(0,14)+'...' : current_account?.name, - current_account_address: formatAddress(current_account?.address, 16, 8), - full_account_address: current_account?.address, - is_primary: current_account?.id === 'main' ? '' : 'hidden', - is_kyc_verified: kyc_level ? `verified verified-${kyc_level}` : 'unverified', - }, false) - - await updateAccounts(current_account?.id) - } - - initFooter = async() => { - await updateElement('#main_footer', 'shared/footer', {}, false) - - const dashboardTooltip = new Tooltip('#main_footer #go_dashboardScreen', { - html: true, - offset: [0, -8], - placement: 'top', - container: 'body', - popperConfig: (config) => { - const flip = config.modifiers.find(({ name }) => name === 'flip') - - flip.options = { - ...flip.options, - boundary: document.querySelector('#root'), - } - - return config - }, - template: '' - }) - - const assetSendTooltip = new Tooltip('#main_footer #go_assetSendScreen', { - html: true, - offset: [0, -8], - placement: 'top', - container: 'body', - popperConfig: (config) => { - const flip = config.modifiers.find(({ name }) => name === 'flip') - - flip.options = { - ...flip.options, - boundary: document.querySelector('#root'), - } - - return config - }, - template: '' - }) - - const transactionHistoryTooltip = new Tooltip('#main_footer #go_transactionHistoryScreen', { - html: true, - offset: [0, -8], - placement: 'top', - container: 'body', - popperConfig: (config) => { - const flip = config.modifiers.find(({ name }) => name === 'flip') - - flip.options = { - ...flip.options, - boundary: document.querySelector('#root'), - } - - return config - }, - template: '' - }) - - const stakeHomeTooltip = new Tooltip('#main_footer #go_stakingHomeScreen', { - html: true, - offset: [0, -8], - placement: 'top', - container: 'body', - popperConfig: (config) => { - const flip = config.modifiers.find(({ name }) => name === 'flip') - - flip.options = { - ...flip.options, - boundary: document.querySelector('#root'), - } - - return config - }, - template: '' - }) - - document.querySelector("#main_footer #go_dashboardScreen").addEventListener("click", async() => { - setTimeout(() => { - dashboardTooltip.hide() - }, 600) - - await goToScreen('dashboardScreen') - }) - document.querySelector("#main_footer #go_assetSendScreen").addEventListener("click", async() => { - setTimeout(() => { - assetSendTooltip.hide() - }, 800) - - await clearHistory() - await goToScreen('assetSendScreen') - }) - document.querySelector("#main_footer #go_transactionHistoryScreen").addEventListener("click", async() => { - setTimeout(() => { - transactionHistoryTooltip.hide() - }, 800) - - await clearHistory() - await goToScreen('transactionHistoryScreen') - }) - document.querySelector("#main_footer #go_stakingHomeScreen").addEventListener("click", async() => { - setTimeout(() => { - stakeHomeTooltip.hide() - }, 800) - - await clearHistory() - await goToScreen('stakingHomeScreen') - }) - } - - initLogin = async() => { - await updateElement('#login_screen', 'login', { - wallet_title: isStandaloneApp() ? 'WALLET APP' : 'BROWSER WALLET' - }, false) - - const input_form = document.querySelector("#login_screen #input_form") - const input_field = input_form.querySelector("#password") - const show_password = input_form.querySelector(".show-password") - - show_password.addEventListener("click", () => { - if(input_field.type === 'password') { - input_field.type = 'text' - show_password.innerHTML = '' - } else { - input_field.type = 'password' - show_password.innerHTML = '' - } - }) - - document.querySelector("#login_screen #do_login").addEventListener("click", () => this.doLoginEvent()) - document.querySelector("#login_screen #password").addEventListener("keypress", async(e) => { - if (e.key === "Enter") { - return await this.doLoginEvent(); - } - await scrollToBottom() - }) - - document.querySelector("#login_screen #password").addEventListener("focus", async() => { - document.querySelector("#login_screen").classList.add('focused') - - await scrollToBottom() - await scrollToBottom(200) - await scrollToBottom(1600) - }) - - document.querySelector("#login_screen #password").addEventListener("blur", async() => { - document.querySelector("#login_screen").classList.remove('focused') - }) - - window.addEventListener("click", async() => { - const login_screen = document.querySelector("#login_screen") - const input_field = input_form.querySelector("#password") - - if(login_screen.classList.contains('inactive')) return - - input_field.focus() - }) - } - - doLoginEvent = async() => { - freezeRoot() - - const status_message = document.querySelector("#login_screen #status_message") - const input_form = document.querySelector("#login_screen #input_form") - const input_field = input_form.querySelector("#password") - const show_password = input_form.querySelector(".show-password") - - const current_screen = currentScreen() - const password = DOMPurify.sanitize(document.querySelector("#login_screen #password").value); - - status_message.classList.add('active') - input_form.classList.add('inactive') - - const result = await doLogin(password) + return config + }, + template: '' + }) + + const assetSendTooltip = new Tooltip('#main_footer #go_assetSendScreen', { + html: true, + offset: [0, -8], + placement: 'top', + container: 'body', + popperConfig: (config) => { + const flip = config.modifiers.find(({ name }) => name === 'flip') + + flip.options = { + ...flip.options, + boundary: document.querySelector('#root'), + } - if(result) { - hideNotification() - await hideLogin() - if(current_screen.name === 'dashboardScreen') await reloadScreen() - } else { - await showNotification('Password is wrong!', 'error', 1800, isStandaloneApp() ? 60 : 0) - input_form.classList.remove('inactive') + return config + }, + template: '' + }) + + const transactionHistoryTooltip = new Tooltip('#main_footer #go_transactionHistoryScreen', { + html: true, + offset: [0, -8], + placement: 'top', + container: 'body', + popperConfig: (config) => { + const flip = config.modifiers.find(({ name }) => name === 'flip') + + flip.options = { + ...flip.options, + boundary: document.querySelector('#root'), } - setTimeout(() => { - input_form.classList.remove('inactive') - }, 1000) + return config + }, + template: '' + }) + + const stakeHomeTooltip = new Tooltip('#main_footer #go_stakingHomeScreen', { + html: true, + offset: [0, -8], + placement: 'top', + container: 'body', + popperConfig: (config) => { + const flip = config.modifiers.find(({ name }) => name === 'flip') + + flip.options = { + ...flip.options, + boundary: document.querySelector('#root'), + } - // reset to init screen - show_password.innerHTML = '' + return config + }, + template: '' + }) + + document.querySelector("#main_footer #go_dashboardScreen").addEventListener("click", async() => { + setTimeout(() => { + dashboardTooltip.hide() + }, 600) + + await goToScreen('dashboardScreen') + }) + document.querySelector("#main_footer #go_assetSendScreen").addEventListener("click", async() => { + setTimeout(() => { + assetSendTooltip.hide() + }, 800) + + await clearHistory() + await goToScreen('assetSendScreen') + }) + document.querySelector("#main_footer #go_transactionHistoryScreen").addEventListener("click", async() => { + setTimeout(() => { + transactionHistoryTooltip.hide() + }, 800) + + await clearHistory() + await goToScreen('transactionHistoryScreen') + }) + document.querySelector("#main_footer #go_stakingHomeScreen").addEventListener("click", async() => { + setTimeout(() => { + stakeHomeTooltip.hide() + }, 800) + + await clearHistory() + await goToScreen('stakingHomeScreen') + }) + } + + initLogin = async() => { + await updateElement('#login_screen', 'login', { + wallet_title: isStandaloneApp() ? 'WALLET APP' : 'BROWSER WALLET' + }, false) + + const input_form = document.querySelector("#login_screen #input_form") + const input_field = input_form.querySelector("#password") + const show_password = input_form.querySelector(".show-password") + + show_password.addEventListener("click", () => { + if(input_field.type === 'password') { + input_field.type = 'text' + show_password.innerHTML = '' + } else { input_field.type = 'password' - status_message.classList.remove('active') - unFreezeRoot() + show_password.innerHTML = '' + } + }) + + document.querySelector("#login_screen #do_login").addEventListener("click", () => this.doLoginEvent()) + document.querySelector("#login_screen #password").addEventListener("keypress", async(e) => { + if (e.key === "Enter") { + return await this.doLoginEvent(); + } + await scrollToBottom() + }) + + document.querySelector("#login_screen #password").addEventListener("focus", async() => { + document.querySelector("#login_screen").classList.add('focused') + + await scrollToBottom() + await scrollToBottom(200) + await scrollToBottom(1600) + }) + + document.querySelector("#login_screen #password").addEventListener("blur", async() => { + document.querySelector("#login_screen").classList.remove('focused') + }) + + window.addEventListener("click", async() => { + const login_screen = document.querySelector("#login_screen") + const input_field = input_form.querySelector("#password") + + if(login_screen.classList.contains('inactive')) return + + input_field.focus() + }) + } + + doLoginEvent = async() => { + freezeRoot() + + const status_message = document.querySelector("#login_screen #status_message") + const input_form = document.querySelector("#login_screen #input_form") + const input_field = input_form.querySelector("#password") + const show_password = input_form.querySelector(".show-password") + + const current_screen = currentScreen() + const password = DOMPurify.sanitize(document.querySelector("#login_screen #password").value); + + status_message.classList.add('active') + input_form.classList.add('inactive') + + const result = await doLogin(password) + + if(result) { + hideNotification() + await hideLogin() + if(current_screen.name === 'dashboardScreen') await reloadScreen() + } else { + await showNotification('Password is wrong!', 'error', 1800, isStandaloneApp() ? 60 : 0) + input_form.classList.remove('inactive') } - goToScreen = async(name, params = {}, force = false) => { - return goToScreen(name, params, false, force) - } + setTimeout(() => { + input_form.classList.remove('inactive') + }, 1000) - initCustomActions = async() => { - if(isIOs() || isStandaloneApp()) { - const url_params = new URLSearchParams(window.location.search) - if(url_params.has('popup')) { - document.querySelector("#login_screen").classList.add('mini') + // reset to init screen + show_password.innerHTML = '' + input_field.type = 'password' + status_message.classList.remove('active') + unFreezeRoot() + } - await disableFooter() - } + goToScreen = async(name, params = {}, force = false) => { + return goToScreen(name, params, false, force) + } - this.disableDoubleClickZoom() - // this.limitScroll() - await this.handleFooterVisibility() - } - } + initCustomActions = async() => { + if(isIOs() || isStandaloneApp()) { + const url_params = new URLSearchParams(window.location.search) + if(url_params.has('popup')) { + document.querySelector("#login_screen").classList.add('mini') - // Disable double click event on iOS - disableDoubleClickZoom = () => { - let lastTouchEnd = 0 - const delay = 400 - - document.addEventListener('touchend', function(event) { - var now = (new Date()).getTime(); - if (now - lastTouchEnd <= delay) { - event.preventDefault(); - } - lastTouchEnd = now; - }, false); - } - - limitScroll = () => { - let ticking = false - window.addEventListener('scroll', async() => { - if(!ticking) { - window.requestAnimationFrame(async() => { - const bodyElement = document.getElementsByTagName('body')[0] - const bodyElementOffset = bodyElement.offsetHeight; - const innerHeight = window.innerHeight + await disableFooter() + } - // Get the current scroll position - const scrollPosition = window.scrollY; - - if((scrollPosition + innerHeight > bodyElementOffset)) { - await scrollToBottom() - } + this.disableDoubleClickZoom() + await this.handleFooterVisibility() + } + } + + // Disable double click event on iOS + disableDoubleClickZoom = () => { + let lastTouchEnd = 0 + const delay = 400 + + document.addEventListener('touchend', function(event) { + var now = (new Date()).getTime(); + if (now - lastTouchEnd <= delay) { + event.preventDefault(); + } + lastTouchEnd = now; + }, false); + } + + limitScroll = () => { + let ticking = false + window.addEventListener('scroll', async() => { + if(!ticking) { + window.requestAnimationFrame(async() => { + const bodyElement = document.getElementsByTagName('body')[0] + const bodyElementOffset = bodyElement.offsetHeight; + const innerHeight = window.innerHeight + + // Get the current scroll position + const scrollPosition = window.scrollY; + + if((scrollPosition + innerHeight > bodyElementOffset)) { + await scrollToBottom() + } - ticking = false; - }); + ticking = false; + }); - ticking = true; - } + ticking = true; + } + }); + } + + handleFooterVisibility = async() => { + let ticking = false + window.addEventListener('resize', () => { + if(!ticking) { + window.requestAnimationFrame(async() => { + const htmlElement = document.getElementsByTagName('html')[0] + const htmlElementOffset = htmlElement.offsetHeight; + + if(htmlElementOffset < 400 || !(await this.db.stores.wallets.exists())) { + await disableFooter() + } else { + await enableFooter() + } + + ticking = false; }); - } - handleFooterVisibility = async() => { - let ticking = false - window.addEventListener('resize', () => { - if(!ticking) { - window.requestAnimationFrame(async() => { - const htmlElement = document.getElementsByTagName('html')[0] - const htmlElementOffset = htmlElement.offsetHeight; - - if(htmlElementOffset < 400 || !(await this.db.stores.wallets.exists())) { - await disableFooter() - } else { - await enableFooter() - } - - ticking = false; - }); - - ticking = true; - } - }) - } + ticking = true; + } + }) + } - enableFooter = () => { - this.db.stores.wallets.exists().then(r => { - if(r) enableFooter() - }) - } + enableFooter = () => { + this.db.stores.wallets.exists().then(r => { + if(r) enableFooter() + }) + } - disableFooter = () => { - return disableFooter() - } + disableFooter = () => { + return disableFooter() + } - showInit = (locked = false) => { - return showInit(locked) - } + showInit = (locked = false) => { + return showInit(locked) + } - hideInit = (unlocked = false) => { - return hideInit(unlocked) - } + hideInit = (unlocked = false) => { + return hideInit(unlocked) + } - fastCheckLogin = async() => { - const logged_in = await sendMessage('fast_check_login') + fastCheckLogin = async() => { + const logged_in = await sendMessage('fast_check_login') - return !!logged_in - } + return !!logged_in + } - showLogin = async(instant = false, force = false) => { - await showLogin(instant, force) + showLogin = async(instant = false, force = false) => { + await showLogin(instant, force) - setTimeout(async() => { - return await goToScreen('dashboardScreen') - }, 1200) // redirect to dashboard - } + setTimeout(async() => { + return await goToScreen('dashboardScreen') + }, 1200) // redirect to dashboard + } } export default userInterface export { - showNotification + showNotification } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/messaging.js b/packages/browser-wallet-ui/src/messaging.js index 482d421..c4f0fbf 100644 --- a/packages/browser-wallet-ui/src/messaging.js +++ b/packages/browser-wallet-ui/src/messaging.js @@ -1,13 +1,9 @@ import { - customReviver, - generateMessageId, - getCurrentBrowser, - isFirefox, - isIOs, - isSafari, - isStandaloneApp + customReviver, + generateMessageId, + getCurrentBrowser, + isStandaloneApp } from "@bitgreen/browser-wallet-utils"; -import {appMessageHandler} from "@bitgreen/browser-wallet-core"; const current_browser = getCurrentBrowser() const port = current_browser?.runtime?.connect({ name: 'PORT_EXTENSION' }); @@ -18,120 +14,116 @@ const url_params = new URLSearchParams(window.location.search) // Set up the listener for messages, any incoming resolves the promise. port?.onMessage?.addListener((data) => { - const handler = handlers[data.id]; + const handler = handlers[data.id]; - const urlParams = new URLSearchParams(window.location.search) + const urlParams = new URLSearchParams(window.location.search) - // Receives this signal from background page, triggered when origin tab was changed/closed. - if(data.command === 'kill_popup' && url_params.get('kill_popup') === 'true' && urlParams.get('tab_id').toString() === data?.tab_id.toString()) { - if(port) port.disconnect() + // Receives this signal from background page, triggered when origin tab was changed/closed. + if(data.command === 'kill_popup' && url_params.get('kill_popup') === 'true' && urlParams.get('tab_id').toString() === data?.tab_id.toString()) { + if(port) port.disconnect() - if(kill_popup) window.close() + if(kill_popup) window.close() - return; - } + return; + } - if(!handler && data.command !== 'kill_popup') { - console.error(`Unknown response: ${JSON.stringify(data)}`); + if(!handler && data.command !== 'kill_popup') { + console.error(`Unknown response: ${JSON.stringify(data)}`); - return; - } + return; + } - if(!handler?.subscriber) { - delete handlers[data.id]; - } + if(!handler?.subscriber) { + delete handlers[data.id]; + } - if(data.error) { - handler.reject(new Error(data.error)); - } else { - handler.resolve(data.response); - } + if(data.error) { + handler.reject(new Error(data.error)); + } else { + handler.resolve(data.response); + } }); // Listen for messages from background current_browser?.runtime?.onMessage?.addListener((data) => { - if(data.command === 'kill_popup' && url_params.get('kill_popup') === 'true') { - window.close() + if(data.command === 'kill_popup' && url_params.get('kill_popup') === 'true') { + window.close() - return; - } + return; + } }) // Handle messages from background on standalone app if(isStandaloneApp()) { - window.addEventListener('message', async(event) => { - const data = event.data; + window.addEventListener('message', async(event) => { + const data = event.data; - const handler = handlers[data.id]; + const handler = handlers[data.id]; - if(data.source !== 'bg') return false + if(data.source !== 'bg') return false - if(!handler) { - console.error(`Unknown response: ${JSON.stringify(data)}`); + if(!handler) { + console.error(`Unknown response: ${JSON.stringify(data)}`); - return; - } + return; + } - if(!handler.subscriber) { - delete handlers[data.id]; - } + if(!handler.subscriber) { + delete handlers[data.id]; + } - if(data.error) { - handler.reject(new Error(data.error)); - } else { - let response = data.response - try { - response = JSON.parse(data.response, customReviver) - } catch { + if(data.error) { + handler.reject(new Error(data.error)); + } else { + let response = data.response + try { + response = JSON.parse(data.response, customReviver) + } catch { - } + } - handler.resolve(response); - } - }); + handler.resolve(response); + } + }); } -// port.onDisconnect.addListener((obj) => { -// console.log('disconnected port'); -// }) - const sendMessage = (command, params = {}, message_id = null) => { - return new Promise((resolve, reject) => { - if(!message_id) { - message_id = generateMessageId() - } + return new Promise((resolve, reject) => { + if(!message_id) { + message_id = generateMessageId() + } - handlers[message_id] = { reject, resolve }; - - try { - const message = { - id: message_id, - type: "BITGREEN-BROWSER-WALLET", - command: command, - params: params - } - - if(isStandaloneApp()) { - window.postMessage({ - source: 'ui', - ...message - }); - } else { - if(port.name) { - port.postMessage(message); - } - } - } catch(e) { - resolve({}) + handlers[message_id] = { reject, resolve }; + + try { + const message = { + id: message_id, + type: "BITGREEN-BROWSER-WALLET", + command: command, + params: params + } + + if(isStandaloneApp()) { + window.postMessage({ + source: 'ui', + ...message + }); + } else { + if(port.name) { + port.postMessage(message); } - }) + } + } catch(e) { + resolve({}) + } + }) } const disableKillPopup = async() => { - kill_popup = false + kill_popup = false } export { - sendMessage, - disableKillPopup + sendMessage, + disableKillPopup } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/notifications.js b/packages/browser-wallet-ui/src/notifications.js index 8fc46bd..942208c 100644 --- a/packages/browser-wallet-ui/src/notifications.js +++ b/packages/browser-wallet-ui/src/notifications.js @@ -2,45 +2,45 @@ import Toastify from 'toastify-js' let notification const showNotification = async(message, type, duration = 2000, offset = 40) => { - let classes, icon_classes - if(type === 'success') { - classes = 'notification notification-success' - icon_classes = 'icon icon-success' - } else if(type === 'error') { - classes = 'notification notification-error' - icon_classes = 'icon icon-alert' - } else { - classes = 'notification notification-info' - icon_classes = 'icon icon-alert' - } + let classes, icon_classes + if(type === 'success') { + classes = 'notification notification-success' + icon_classes = 'icon icon-success' + } else if(type === 'error') { + classes = 'notification notification-error' + icon_classes = 'icon icon-alert' + } else { + classes = 'notification notification-info' + icon_classes = 'icon icon-alert' + } - if(notification) { - notification.hideToast() - } + if(notification) { + notification.hideToast() + } - notification = Toastify({ - text: '
'+message+'
', - offset: { - y: offset - }, - duration: duration, - className: classes, - close: false, - stopOnFocus: false, - gravity: "top", // `top` or `bottom` - position: "left", // `left`, `center` or `right` - escapeMarkup: false, - onClick: function(){ - notification.hideToast() - } - }).showToast(); + notification = Toastify({ + text: '
'+message+'
', + offset: { + y: offset + }, + duration: duration, + className: classes, + close: false, + stopOnFocus: false, + gravity: "top", + position: "left", + escapeMarkup: false, + onClick: function(){ + notification.hideToast() + } + }).showToast(); } const hideNotification = () => { - if(notification) notification.hideToast() + if(notification) notification.hideToast() } export { - showNotification, - hideNotification + showNotification, + hideNotification } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens.js b/packages/browser-wallet-ui/src/screens.js index 1842d50..ebe199a 100644 --- a/packages/browser-wallet-ui/src/screens.js +++ b/packages/browser-wallet-ui/src/screens.js @@ -1,93 +1,93 @@ import { isAndroid, isIOs, isMacOs, isStandaloneApp } from "@bitgreen/browser-wallet-utils"; const renderTemplate = async(template, params = {}) => { - let template_data = await loadTemplate(template) + let template_data = await loadTemplate(template) - if(Object.keys(params).length > 0) { - // replace variables - return interpolate(template_data, params) - } + if(Object.keys(params).length > 0) { + // replace variables + return interpolate(template_data, params) + } - return template_data + return template_data } const loadTemplate = async(template) => { - let result = await fetch(`./components/${template}.html`).catch(function(e) { - return false - }) + let result = await fetch(`./components/${template}.html`).catch(function(e) { + return false + }) - if(!result) { - return false - } + if(!result) { + return false + } - return result.text() + return result.text() } const interpolate = (template_data, params) => { - let output_data = template_data?.toString() - let param_values = Object.entries(params) - - for(let param of param_values) { - let name = param[0]?.toString() - let value = param[1] + let output_data = template_data?.toString() + let param_values = Object.entries(params) - if(value === undefined || value === null) { - value = '' - } else { - value = value.toString() - } + for(let param of param_values) { + let name = param[0]?.toString() + let value = param[1] - output_data = output_data.replaceAll('${'+name+'}', value) + if(value === undefined || value === null) { + value = '' + } else { + value = value.toString() } - return output_data + output_data = output_data.replaceAll('${'+name+'}', value) + } + + return output_data } const updateElement = async(element, template_name = 'false', params = {}, append = true) => { - const template_data = template_name !== '' ? await renderTemplate(template_name, params) : ''; - - let el = document.querySelector('#root') // default element - if(element === 'body') { - const url_params = new URLSearchParams(window.location.search) - - el = document.getElementsByTagName('body')[0] - - // Add class to body, so we can apply custom CSS. - if(isIOs()) { - el.classList.add('ios') - } else if(isAndroid()) { - el.classList.add('android') - } else if(isMacOs() && !url_params.get('popup')) { - el.classList.add('macos') - } - - if(isStandaloneApp()) { - el.classList.add('app') - } - } else if(element) { - el = document.querySelector(element) - } + const template_data = template_name !== '' ? await renderTemplate(template_name, params) : ''; - if(!el) { - console.log(`Element not found. [${element}]`) - return false; - } + let el = document.querySelector('#root') // default element + if(element === 'body') { + const url_params = new URLSearchParams(window.location.search) - if(append) { - el.innerHTML += template_data - } else { - el.innerHTML = template_data + el = document.getElementsByTagName('body')[0] + + // Add class to body, so we can apply custom CSS. + if(isIOs()) { + el.classList.add('ios') + } else if(isAndroid()) { + el.classList.add('android') + } else if(isMacOs() && !url_params.get('popup')) { + el.classList.add('macos') } - return true + if(isStandaloneApp()) { + el.classList.add('app') + } + } else if(element) { + el = document.querySelector(element) + } + + if(!el) { + console.log(`Element not found. [${element}]`) + return false; + } + + if(append) { + el.innerHTML += template_data + } else { + el.innerHTML = template_data + } + + return true } const resetElement = async(element) => { - return updateElement(element, '', false, false) + return updateElement(element, '', false, false) } export { - renderTemplate, - updateElement, - resetElement + renderTemplate, + updateElement, + resetElement } diff --git a/packages/browser-wallet-ui/src/screens/accountCreate.js b/packages/browser-wallet-ui/src/screens/accountCreate.js index 946b6e6..598aa61 100644 --- a/packages/browser-wallet-ui/src/screens/accountCreate.js +++ b/packages/browser-wallet-ui/src/screens/accountCreate.js @@ -5,81 +5,81 @@ import { showNotification } from "../notifications.js"; import DOMPurify from 'dompurify'; export default async function accountCreateScreen() { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'New Account' - }, - header: false, - footer: false - }) - await screen.init() - - await screen.set('.content', 'accounts/create') + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'New Account' + }, + header: false, + footer: false + }) + await screen.init() - const input_field = document.querySelector("#root #password") - const show_password = document.querySelector("#root .show-password") + await screen.set('.content', 'accounts/create') - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #derivation_path_check', - type: 'change', - listener: () => { - const derivation_path_wrapper = document.querySelector("#root #derivation_path_wrapper") - const derivation_path_check = document.querySelector("#root #derivation_path_check").checked - - if(derivation_path_check) { - derivation_path_wrapper.classList.remove('hidden') - } else { - derivation_path_wrapper.classList.add('hidden') - } - } - }, - { - element: '#root #store_account', - listener: () => storeAccount() - }, - { - element: '#root .show-password', - listener: () => { - if(input_field.type === 'password') { - input_field.type = 'text' - show_password.innerHTML = '' - } else { - input_field.type = 'password' - show_password.innerHTML = '' - } - } - } - ]) + const input_field = document.querySelector("#root #password") + const show_password = document.querySelector("#root .show-password") - const storeAccount = async() => { - const password = DOMPurify.sanitize(document.querySelector("#root #password").value); - const name = DOMPurify.sanitize(document.querySelector("#root #wallet_name").value); + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#root #derivation_path_check', + type: 'change', + listener: () => { + const derivation_path_wrapper = document.querySelector("#root #derivation_path_wrapper") const derivation_path_check = document.querySelector("#root #derivation_path_check").checked - let derivation_path = '' if(derivation_path_check) { - derivation_path = DOMPurify.sanitize(document.querySelector("#root #derivation_path").value); + derivation_path_wrapper.classList.remove('hidden') + } else { + derivation_path_wrapper.classList.add('hidden') } - - const response = await sendMessage('new_account', { - password, name, derivation_path - }) - - if(response && !response.error) { - await updateAccounts(response) - await goToScreen('accountManageScreen', {}, true) - await showNotification('New account created!', 'success') + } + }, + { + element: '#root #store_account', + listener: () => storeAccount() + }, + { + element: '#root .show-password', + listener: () => { + if(input_field.type === 'password') { + input_field.type = 'text' + show_password.innerHTML = '' } else { - await showNotification(response.error || 'Password is wrong!', 'error') + input_field.type = 'password' + show_password.innerHTML = '' } + } + } + ]) + + const storeAccount = async() => { + const password = DOMPurify.sanitize(document.querySelector("#root #password").value); + const name = DOMPurify.sanitize(document.querySelector("#root #wallet_name").value); + const derivation_path_check = document.querySelector("#root #derivation_path_check").checked + let derivation_path = '' - show_password.innerHTML = '' - input_field.type = 'password' + if(derivation_path_check) { + derivation_path = DOMPurify.sanitize(document.querySelector("#root #derivation_path").value); } + + const response = await sendMessage('new_account', { + password, name, derivation_path + }) + + if(response && !response.error) { + await updateAccounts(response) + await goToScreen('accountManageScreen', {}, true) + await showNotification('New account created!', 'success') + } else { + await showNotification(response.error || 'Password is wrong!', 'error') + } + + show_password.innerHTML = '' + input_field.type = 'password' + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/accountEdit.js b/packages/browser-wallet-ui/src/screens/accountEdit.js index d27197f..caf130f 100644 --- a/packages/browser-wallet-ui/src/screens/accountEdit.js +++ b/packages/browser-wallet-ui/src/screens/accountEdit.js @@ -7,168 +7,168 @@ import anime from "animejs"; import { formatAddress } from "@bitgreen/browser-wallet-utils"; export default async function accountEditScreen(params) { - const screen = new Screen({ - template_name: 'layouts/default_custom_header_medium', - template_params: { - title: 'Manage Account', - equal_padding: 'equal-padding' - }, - header: false, - footer: false - }) - await screen.init() - - const account_id = params?.account_id - - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) - - const account = await accounts_store.asyncGet(account_id) - - await screen.set('#heading', 'accounts/edit/heading', { - account_name: account?.name, - current_account_address: formatAddress(account?.address, 16, 8) - }) - - const kyc_level = await cache_store.asyncGet('kyc_' + account.address) - - await screen.set('#bordered_content', 'accounts/edit/content', { - account_id, - account_address: account?.address, - derivation_path: account_id !== 'main' ? account_id : '' - }) - - if(kyc_level) { - const go_kyc_el = document.querySelector('#heading #go_kyc') - - go_kyc_el.querySelector('.kyc-status .icon').classList.add('text-green') - if(typeof kyc_level === 'string') { - if(parseInt(kyc_level) === 4) { - go_kyc_el.querySelector('.kyc-status .text').innerHTML = `Accredited (LVL ${kyc_level.toString()})` - } else if(parseInt(kyc_level) > 1) { - go_kyc_el.querySelector('.kyc-status .text').innerHTML = `Advanced (LVL ${kyc_level.toString()})` - } else { - go_kyc_el.querySelector('.kyc-status .text').innerHTML = `Basic (LVL ${kyc_level.toString()})` - } - } + const screen = new Screen({ + template_name: 'layouts/default_custom_header_medium', + template_params: { + title: 'Manage Account', + equal_padding: 'equal-padding' + }, + header: false, + footer: false + }) + await screen.init() + + const account_id = params?.account_id + + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + + const account = await accounts_store.asyncGet(account_id) + + await screen.set('#heading', 'accounts/edit/heading', { + account_name: account?.name, + current_account_address: formatAddress(account?.address, 16, 8) + }) + + const kyc_level = await cache_store.asyncGet('kyc_' + account.address) + + await screen.set('#bordered_content', 'accounts/edit/content', { + account_id, + account_address: account?.address, + derivation_path: account_id !== 'main' ? account_id : '' + }) + + if(kyc_level) { + const go_kyc_el = document.querySelector('#heading #go_kyc') + + go_kyc_el.querySelector('.kyc-status .icon').classList.add('text-green') + if(typeof kyc_level === 'string') { + if(parseInt(kyc_level) === 4) { + go_kyc_el.querySelector('.kyc-status .text').innerHTML = `Accredited (LVL ${kyc_level.toString()})` + } else if(parseInt(kyc_level) > 1) { + go_kyc_el.querySelector('.kyc-status .text').innerHTML = `Advanced (LVL ${kyc_level.toString()})` + } else { + go_kyc_el.querySelector('.kyc-status .text').innerHTML = `Basic (LVL ${kyc_level.toString()})` + } } - - if(account_id !== 'main') await screen.set('#bordered_content .footer .forget-account', 'accounts/edit/delete_button') - - await screen.append('#root', 'accounts/edit/delete_modal', { - account_id, - account_name: account?.name, - account_address: account?.address - }) - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - const switch_account_el = document.querySelector("#switch_to_this") - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #wallet_name', - type: 'input', - listener: () => { - const wallet_name = document.querySelector("#root #wallet_name").value - const save_wallet_button = document.querySelector("#root #save_wallet") - - if(wallet_name.length > 3) { - save_wallet_button.classList.add('btn-primary') - save_wallet_button.classList.remove('disabled') - } else { - save_wallet_button.classList.remove('btn-primary') - save_wallet_button.classList.add('disabled') - } - } - }, - { - element: '#heading #copy_address', - listener: async() => { - await copyText(account.address) - await showNotification('Account address copied to clipboard.', 'info', 2000, 54) - } - }, - { - element: '#root #save_wallet', - listener: async(e) => { - const id = e.target.dataset.id; - const name = DOMPurify.sanitize(document.querySelector("#root #wallet_name").value) - const switch_account = switch_account_el?.checked === true - - await accounts_store.asyncSet(id, { - ...account, - name - }) - - await updateAccounts(switch_account ? id : null) - - await showNotification('Account data saved successfully.', 'success', 2000, 58) - } - }, - { - element: '#root #delete_wallet', - listener: async() => { - document.querySelector("#delete_modal").classList.add('fade') - document.querySelector("#delete_modal").classList.add('show') - } - }, - { - element: '#root #go_kyc', - listener: () => { - if(kyc_level) { - if(kyc_level === '4') { - return goToScreen('kycAccreditedScreen', { - account_id: account_id - }) - } - - if(kyc_level === '2' || kyc_level === '3') { - return goToScreen('kycAdvancedScreen', { - account_id: account_id, - kyc_level: kyc_level - }) - } - - return goToScreen('kycBasicScreen', { - account_id: account_id - }) - } else { - return goToScreen('kycStartScreen', { - account_id: account_id - }) - } - } - }, - { - element: '#root #hide_modal', - listener: () => { - document.querySelector("#delete_modal").classList.remove('fade') - document.querySelector("#delete_modal").classList.remove('show') - } - }, - { - element: '#root #confirm_delete_wallet', - listener: async(e) => { - const id = e.target.dataset.id; - - accounts_store.remove(id, async() => { - await updateAccounts() - await goToScreen('accountManageScreen', {}, true) - await showNotification('Account deleted successfully.', 'info', 2000, 58) - }) - } + } + + if(account_id !== 'main') await screen.set('#bordered_content .footer .forget-account', 'accounts/edit/delete_button') + + await screen.append('#root', 'accounts/edit/delete_modal', { + account_id, + account_name: account?.name, + account_address: account?.address + }) + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + const switch_account_el = document.querySelector("#switch_to_this") + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#root #wallet_name', + type: 'input', + listener: () => { + const wallet_name = document.querySelector("#root #wallet_name").value + const save_wallet_button = document.querySelector("#root #save_wallet") + + if(wallet_name.length > 3) { + save_wallet_button.classList.add('btn-primary') + save_wallet_button.classList.remove('disabled') + } else { + save_wallet_button.classList.remove('btn-primary') + save_wallet_button.classList.add('disabled') } - ]) + } + }, + { + element: '#heading #copy_address', + listener: async() => { + await copyText(account.address) + await showNotification('Account address copied to clipboard.', 'info', 2000, 54) + } + }, + { + element: '#root #save_wallet', + listener: async(e) => { + const id = e.target.dataset.id; + const name = DOMPurify.sanitize(document.querySelector("#root #wallet_name").value) + const switch_account = switch_account_el?.checked === true + + await accounts_store.asyncSet(id, { + ...account, + name + }) + + await updateAccounts(switch_account ? id : null) + + await showNotification('Account data saved successfully.', 'success', 2000, 58) + } + }, + { + element: '#root #delete_wallet', + listener: async() => { + document.querySelector("#delete_modal").classList.add('fade') + document.querySelector("#delete_modal").classList.add('show') + } + }, + { + element: '#root #go_kyc', + listener: () => { + if(kyc_level) { + if(kyc_level === '4') { + return goToScreen('kycAccreditedScreen', { + account_id: account_id + }) + } + + if(kyc_level === '2' || kyc_level === '3') { + return goToScreen('kycAdvancedScreen', { + account_id: account_id, + kyc_level: kyc_level + }) + } + + return goToScreen('kycBasicScreen', { + account_id: account_id + }) + } else { + return goToScreen('kycStartScreen', { + account_id: account_id + }) + } + } + }, + { + element: '#root #hide_modal', + listener: () => { + document.querySelector("#delete_modal").classList.remove('fade') + document.querySelector("#delete_modal").classList.remove('show') + } + }, + { + element: '#root #confirm_delete_wallet', + listener: async(e) => { + const id = e.target.dataset.id; + + accounts_store.remove(id, async() => { + await updateAccounts() + await goToScreen('accountManageScreen', {}, true) + await showNotification('Account deleted successfully.', 'info', 2000, 58) + }) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/accountManage.js b/packages/browser-wallet-ui/src/screens/accountManage.js index 0f4cd83..23d9824 100644 --- a/packages/browser-wallet-ui/src/screens/accountManage.js +++ b/packages/browser-wallet-ui/src/screens/accountManage.js @@ -6,64 +6,64 @@ import {formatAddress} from "@bitgreen/browser-wallet-utils"; import anime from "animejs"; export default async function accountManageScreen() { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - header: false, - footer: true - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + header: false, + footer: true + }) + await screen.init() + + await screen.set('#heading', 'accounts/manage/heading') + await screen.set('#bordered_content', 'accounts/manage/content') - await screen.set('#heading', 'accounts/manage/heading') - await screen.set('#bordered_content', 'accounts/manage/content') + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + const current_account = await accounts_store.current() + const all_accounts = await accounts_store.asyncAll() - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) - const current_account = await accounts_store.current() - const all_accounts = await accounts_store.asyncAll() + for(const a of all_accounts) { + const account_id = a?.key + const account = a.value + const kyc_level = await cache_store.asyncGet('kyc_' + account.address) - for(const a of all_accounts) { - const account_id = a?.key - const account = a.value - const kyc_level = await cache_store.asyncGet('kyc_' + account.address) + await screen.append('#root #wallet_list', 'accounts/manage/list_item', { + account_id, + derivation_path: account_id?.toString() === 'main' ? '' : '//' + account_id, + hide_derivation: account_id?.toString() === 'main' ? 'd-none hidden' : '', + account_jdenticon: jdenticon.toSvg(account?.address,56), + account_name: (account?.name && account?.name.length > 10) ? account?.name.substring(0,10)+'...' : account?.name, + account_address: formatAddress(account?.address, 16, 8), + is_main: account_id?.toString() === 'main' ? '' : 'hidden', + is_current: account_id?.toString() === current_account?.id?.toString() ? '' : 'hidden', + is_kyc_verified: kyc_level ? `verified verified-${kyc_level}` : 'unverified', + }) + } - await screen.append('#root #wallet_list', 'accounts/manage/list_item', { - account_id, - derivation_path: account_id?.toString() === 'main' ? '' : '//' + account_id, - hide_derivation: account_id?.toString() === 'main' ? 'd-none hidden' : '', - account_jdenticon: jdenticon.toSvg(account?.address,56), - account_name: (account?.name && account?.name.length > 10) ? account?.name.substring(0,10)+'...' : account?.name, - account_address: formatAddress(account?.address, 16, 8), - is_main: account_id?.toString() === 'main' ? '' : 'hidden', - is_current: account_id?.toString() === current_account?.id?.toString() ? '' : 'hidden', - is_kyc_verified: kyc_level ? `verified verified-${kyc_level}` : 'unverified', + screen.setListeners([ + { + element: '#heading #new_account', + listener: () => goToScreen('accountCreateScreen') + }, + { + element: '#heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#root #wallet_list .button-item', + listener: (e) => { + return goToScreen('accountEditScreen', { + account_id: e.target.dataset?.id }) + } } + ]) - screen.setListeners([ - { - element: '#heading #new_account', - listener: () => goToScreen('accountCreateScreen') - }, - { - element: '#heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #wallet_list .button-item', - listener: (e) => { - return goToScreen('accountEditScreen', { - account_id: e.target.dataset?.id - }) - } - } - ]) - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/assetReceive.js b/packages/browser-wallet-ui/src/screens/assetReceive.js index 524c7f6..a898b1b 100644 --- a/packages/browser-wallet-ui/src/screens/assetReceive.js +++ b/packages/browser-wallet-ui/src/screens/assetReceive.js @@ -5,52 +5,52 @@ import QRCode from 'qrcode' import anime from "animejs"; export default async function assetReceiveScreen() { - const screen = new Screen({ - template_name: 'layouts/default', - header: true, - footer: true - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/default', + header: true, + footer: true + }) + await screen.init() - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() - await screen.set('#heading', 'shared/heading', { - title: 'Receive' - }) + await screen.set('#heading', 'shared/heading', { + title: 'Receive' + }) - await screen.set('#bordered_content', 'asset/receive', { - address: current_account.address - }) + await screen.set('#bordered_content', 'asset/receive', { + address: current_account.address + }) - await QRCode.toString(current_account.address, { - width: 160, - quality: 4, - margin: 0, - color: { - dark:"#224851", - light:"#ffffff" - }, - errorCorrectionLevel: 'L' - }, (err, string) => { - document.querySelector("#qrcode").innerHTML = string - }); + await QRCode.toString(current_account.address, { + width: 160, + quality: 4, + margin: 0, + color: { + dark:"#224851", + light:"#ffffff" + }, + errorCorrectionLevel: 'L' + }, (err, string) => { + document.querySelector("#qrcode").innerHTML = string + }); - screen.setListeners([ - { - element: '#bordered_content #copy_qrcode, #bordered_content #copy_address', - listener: async() => { - await copyText(current_account.address) - await showNotification('Account address copied to clipboard.', 'info') - } - } - ]) + screen.setListeners([ + { + element: '#bordered_content #copy_qrcode, #bordered_content #copy_address', + listener: async() => { + await copyText(current_account.address) + await showNotification('Account address copied to clipboard.', 'info') + } + } + ]) - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/assetSend.js b/packages/browser-wallet-ui/src/screens/assetSend.js index 7b1e454..64ae229 100644 --- a/packages/browser-wallet-ui/src/screens/assetSend.js +++ b/packages/browser-wallet-ui/src/screens/assetSend.js @@ -2,11 +2,11 @@ import Screen, { clearHistory, goToScreen, updateCurrentParams } from './index.j import { disableKillPopup, sendMessage } from "../messaging.js"; import {AccountStore, WalletStore} from "@bitgreen/browser-wallet-core"; import { - addressValid, - balanceToHuman, - formatAddress, - formatAmount, - humanToBalance + addressValid, + balanceToHuman, + formatAddress, + formatAmount, + humanToBalance } from "@bitgreen/browser-wallet-utils"; import { showNotification } from "../notifications.js"; @@ -15,487 +15,487 @@ import anime from "animejs"; import { renderTemplate } from "../screens.js"; export default async function assetSendScreen(params) { - const wallet_store = new WalletStore() - if(!await wallet_store.exists()) { - await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() - return await goToScreen('walletScreen', {}, false, true) - } - - const screen = new Screen({ - template_name: 'layouts/default', - login: false, - header: true, - footer: true, - tab_id: params?.tab_id, - message_id: params?.message_id - }) - await screen.init() - - // do not kill popup if tab is closed - // note: params always return string! - if(params?.kill_popup === 'false') await disableKillPopup() - - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - - await screen.set('#heading', 'shared/heading', { - title: 'Send' - }) - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - let current_asset = {} - - let preselected_asset = params?.asset || params?.asset === 0 ? params.asset : 'bbb' - let recipient = params?.recipient ? params.recipient : null - let preselected_amount = params?.amount ? params.amount : (0).toFixed(2) - await screen.set('#bordered_content', 'asset/send', { - recipient, - from_name: current_account.name, - from_address: formatAddress(current_account.address, 16, 8) - }) - - const asset_info_el = document.querySelector("#asset_info"); - const amount_el = document.querySelector("#root #amount") - const usd_amount_el = document.querySelector("#root #usd_amount") - const send_info_el = document.querySelector("#root #send_info .info") - const send_error_el = document.querySelector("#root #send_info .error") - const total_amount_el = document.querySelector("#root #send_info .total-amount") - const recipient_el = document.querySelector("#root #recipient") - - const feeTooltip = new Tooltip('#root #go_review_transaction') - - screen.setListeners([ - { - element: '#root #from_account', - listener: () => { - let accounts_modal_el = document.querySelector("#accounts_modal"); - - if(document.querySelector("#header #current_wallet").classList.contains('active')) { - accounts_modal_el.classList.remove('fade') - accounts_modal_el.classList.remove('show') - } else { - accounts_modal_el.classList.add('fade') - accounts_modal_el.classList.add('show') - } - } - }, - { - element: '#root #asset_info', - listener: (e) => { - let dropdown_el = document.querySelector("#asset_info .dropdown"); - - if(dropdown_el.contains(e.target)) { - if(!e.target.dataset?.token && !e.target.dataset?.asset) return false - - if(parseInt(e.target.dataset?.asset) >= 0) { - selectAsset(e.target.dataset?.asset, '0') - } else { - selectAsset(e.target.dataset?.token, '0.00') - } - - toggleAssetDropdown() - - } else { - toggleAssetDropdown() - } - } - }, - { - element: '#root #amount', - type: 'input', - listener: (e) => { - if(!current_asset.is_token) { - e.target.value = parseInt(e.target.value.toString()) - } - - syncAmount('amount') - } - }, - { - element: '#root #usd_amount', - type: 'input', - listener: (e) => { - if(current_asset.price <= 0) { - e.target.value = (0).toFixed(2) - return - } - - syncAmount('usd_amount') - } - }, - { - element: '#root #max_amount', - listener: () => maxAmount() - }, - { - element: '#root #recipient', - type: 'input', - listener: () => checkAddress() - }, - { - element: '#go_review_transaction', - listener: async() => { - feeTooltip.hide() - updateCurrentParams({ - asset: current_asset.name, - amount: amount_el.value, - recipient: recipient_el.value - }) - await goToScreen('assetTransactionReviewScreen', { - amount: amount_el.value, - recipient: recipient_el.value, - account_id: current_account.id, - - current_asset: current_asset, - - // forward this in order to send response - tab_id: params?.tab_id, - message_id: params?.message_id - }) - } - } - ]) - - const checkAddress = () => { - const address = recipient_el.value - const button_el = document.querySelector("#go_review_transaction") - - let is_ok = false - - if(parseFloat(amount_el.value) > 0) { - if(current_asset.is_token) { - if(current_asset?.name === 'bbb') { - if((parseFloat(amount_el.value) + parseFloat(estimated_fee)) <= parseFloat(balanceToHuman(current_asset.balance, 18))) { - is_ok = true - } - } else if(parseFloat(amount_el.value) <= parseFloat(balanceToHuman(current_asset.balance, 18))) { - is_ok = true - } - } else if(parseInt(amount_el.value) <= parseInt(current_asset.balance)) { - is_ok = true - } - - if(is_ok) { - amount_el.classList.remove('error') - - send_info_el.classList.add('d-block') - send_error_el.classList.remove('d-block') - } else { - amount_el.classList.add('error') - - send_info_el.classList.remove('d-block') - send_error_el.classList.add('d-block') - } + const wallet_store = new WalletStore() + if(!await wallet_store.exists()) { + await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) + await clearHistory() + return await goToScreen('walletScreen', {}, false, true) + } + + const screen = new Screen({ + template_name: 'layouts/default', + login: false, + header: true, + footer: true, + tab_id: params?.tab_id, + message_id: params?.message_id + }) + await screen.init() + + // do not kill popup if tab is closed + // note: params always return string! + if(params?.kill_popup === 'false') await disableKillPopup() + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + + await screen.set('#heading', 'shared/heading', { + title: 'Send' + }) + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + let current_asset = {} + + let preselected_asset = params?.asset || params?.asset === 0 ? params.asset : 'bbb' + let recipient = params?.recipient ? params.recipient : null + let preselected_amount = params?.amount ? params.amount : (0).toFixed(2) + await screen.set('#bordered_content', 'asset/send', { + recipient, + from_name: current_account.name, + from_address: formatAddress(current_account.address, 16, 8) + }) + + const asset_info_el = document.querySelector("#asset_info"); + const amount_el = document.querySelector("#root #amount") + const usd_amount_el = document.querySelector("#root #usd_amount") + const send_info_el = document.querySelector("#root #send_info .info") + const send_error_el = document.querySelector("#root #send_info .error") + const total_amount_el = document.querySelector("#root #send_info .total-amount") + const recipient_el = document.querySelector("#root #recipient") + + const feeTooltip = new Tooltip('#root #go_review_transaction') + + screen.setListeners([ + { + element: '#root #from_account', + listener: () => { + let accounts_modal_el = document.querySelector("#accounts_modal"); + + if(document.querySelector("#header #current_wallet").classList.contains('active')) { + accounts_modal_el.classList.remove('fade') + accounts_modal_el.classList.remove('show') } else { - button_el.classList.remove('btn-primary') - button_el.classList.add('disabled') + accounts_modal_el.classList.add('fade') + accounts_modal_el.classList.add('show') } + } + }, + { + element: '#root #asset_info', + listener: (e) => { + let dropdown_el = document.querySelector("#asset_info .dropdown"); + + if(dropdown_el.contains(e.target)) { + if(!e.target.dataset?.token && !e.target.dataset?.asset) return false + + if(parseInt(e.target.dataset?.asset) >= 0) { + selectAsset(e.target.dataset?.asset, '0') + } else { + selectAsset(e.target.dataset?.token, '0.00') + } + + toggleAssetDropdown() - if(is_ok && addressValid(address)) { - button_el.classList.remove('disabled') - button_el.classList.add('btn-primary') } else { - button_el.classList.remove('btn-primary') - button_el.classList.add('disabled') + toggleAssetDropdown() + } + } + }, + { + element: '#root #amount', + type: 'input', + listener: (e) => { + if(!current_asset.is_token) { + e.target.value = parseInt(e.target.value.toString()) } - } - let estimated_fee = 0 - const getEstimatedFee = async() => { - const address = recipient_el.value - - if(current_asset.is_token) { - if(current_asset.name.toLowerCase() === 'bbb') { - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'balances', - call: 'transfer', - call_parameters: [ - addressValid(address) ? address : current_account.address, - humanToBalance(amount_el.value) - ], - account_address: current_account.address - }) - } else { - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'tokens', - call: 'transfer', - call_parameters: [ - addressValid(address) ? address : current_account.address, - current_asset.name, - humanToBalance(amount_el.value) - ], - account_address: current_account.address - }) - } - } else { - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'assets', - call: 'transfer', - call_parameters: [ - current_asset.name, - addressValid(address) ? address : current_account.address, - parseInt(amount_el.value) - ], - account_address: current_account.address - }) + syncAmount('amount') + } + }, + { + element: '#root #usd_amount', + type: 'input', + listener: (e) => { + if(current_asset.price <= 0) { + e.target.value = (0).toFixed(2) + return } - estimated_fee = formatAmount(balanceToHuman(estimated_fee , 18), 18) + syncAmount('usd_amount') + } + }, + { + element: '#root #max_amount', + listener: () => maxAmount() + }, + { + element: '#root #recipient', + type: 'input', + listener: () => checkAddress() + }, + { + element: '#go_review_transaction', + listener: async() => { + feeTooltip.hide() + updateCurrentParams({ + asset: current_asset.name, + amount: amount_el.value, + recipient: recipient_el.value + }) + await goToScreen('assetTransactionReviewScreen', { + amount: amount_el.value, + recipient: recipient_el.value, + account_id: current_account.id, + + current_asset: current_asset, + + // forward this in order to send response + tab_id: params?.tab_id, + message_id: params?.message_id + }) + } + } + ]) + + const checkAddress = () => { + const address = recipient_el.value + const button_el = document.querySelector("#go_review_transaction") + + let is_ok = false + + if(parseFloat(amount_el.value) > 0) { + if(current_asset.is_token) { + if(current_asset?.name === 'bbb') { + if((parseFloat(amount_el.value) + parseFloat(estimated_fee)) <= parseFloat(balanceToHuman(current_asset.balance, 18))) { + is_ok = true + } + } else if(parseFloat(amount_el.value) <= parseFloat(balanceToHuman(current_asset.balance, 18))) { + is_ok = true + } + } else if(parseInt(amount_el.value) <= parseInt(current_asset.balance)) { + is_ok = true + } + + if(is_ok) { + amount_el.classList.remove('error') + + send_info_el.classList.add('d-block') + send_error_el.classList.remove('d-block') + } else { + amount_el.classList.add('error') + + send_info_el.classList.remove('d-block') + send_error_el.classList.add('d-block') + } + } else { + button_el.classList.remove('btn-primary') + button_el.classList.add('disabled') + } - document.querySelector('#bordered_content #go_review_transaction').dataset.bsOriginalTitle = `Estimated Transaction Fee:
${estimated_fee.toString()} BBB` + if(is_ok && addressValid(address)) { + button_el.classList.remove('disabled') + button_el.classList.add('btn-primary') + } else { + button_el.classList.remove('btn-primary') + button_el.classList.add('disabled') + } + } + + let estimated_fee = 0 + const getEstimatedFee = async() => { + const address = recipient_el.value + + if(current_asset.is_token) { + if(current_asset.name.toLowerCase() === 'bbb') { + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'balances', + call: 'transfer', + call_parameters: [ + addressValid(address) ? address : current_account.address, + humanToBalance(amount_el.value) + ], + account_address: current_account.address + }) + } else { + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'tokens', + call: 'transfer', + call_parameters: [ + addressValid(address) ? address : current_account.address, + current_asset.name, + humanToBalance(amount_el.value) + ], + account_address: current_account.address + }) + } + } else { + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'assets', + call: 'transfer', + call_parameters: [ + current_asset.name, + addressValid(address) ? address : current_account.address, + parseInt(amount_el.value) + ], + account_address: current_account.address + }) + } + + estimated_fee = formatAmount(balanceToHuman(estimated_fee , 18), 18) + + document.querySelector('#bordered_content #go_review_transaction').dataset.bsOriginalTitle = `Estimated Transaction Fee:
${estimated_fee.toString()} BBB` + + return estimated_fee + } - return estimated_fee + let decimals = 2 + const syncAmount = (type = 'both') => { + let amount, usd_amount, total_amount + + if(type === 'usd_amount') { + if(current_asset.price > 0) { + amount = usd_amount_el.value / current_asset.price + } else { + amount = 0 + } + } + if(type === 'amount' || type === 'both') { + amount = amount_el.value + usd_amount = amount_el.value * current_asset.price } - let decimals = 2 - const syncAmount = (type = 'both') => { - let amount, usd_amount, total_amount + if(type === 'amount' || type === 'both') { + let amount_info = amount.toString().split('.') + + if(amount_info[1]) { + decimals = amount_info[1].length + } else { + decimals = 0 + } - if(type === 'usd_amount') { - if(current_asset.price > 0) { - amount = usd_amount_el.value / current_asset.price - } else { - amount = 0 - } + if(type === 'both') { + // min 4 decimals + if(decimals < 2) { + decimals = 2 } - if(type === 'amount' || type === 'both') { - amount = amount_el.value - usd_amount = amount_el.value * current_asset.price + } + + // max 18 decimals + if(decimals > 18) { + decimals = 18 + } + + if(!current_asset.is_token) { + decimals = 0 + } + } else { + // min 2 decimals + if(decimals < 2) { + decimals = 2 + } + } + + amount = parseFloat(amount).toFixed(decimals) + usd_amount = parseFloat(usd_amount).toFixed(2) + total_amount = (parseFloat(amount) + parseFloat(estimated_fee)).toFixed(decimals) + + if(type === 'amount' || type === 'both') usd_amount_el.value = usd_amount + if(type === 'usd_amount' || type === 'both') amount_el.value = amount + + total_amount_el.innerHTML = isNaN(total_amount) ? '0' : total_amount + + getEstimatedFee().then() + checkAddress() + } + + const maxAmount = () => { + let max_amount = current_asset.balance + + if(current_asset.is_token) { + if(current_asset?.name === 'bbb') { + max_amount = parseFloat(balanceToHuman(current_asset.balance, 18)) - parseFloat(estimated_fee) + + if(max_amount <= 0) { + max_amount = 0.00 } - if(type === 'amount' || type === 'both') { - let amount_info = amount.toString().split('.') - - if(amount_info[1]) { - decimals = amount_info[1].length - } else { - decimals = 0 - } - - if(type === 'both') { - // min 4 decimals - if(decimals < 2) { - decimals = 2 - } - } - - // max 18 decimals - if(decimals > 18) { - decimals = 18 - } - - if(!current_asset.is_token) { - decimals = 0 - } + if(max_amount > 100000) { + amount_el.value = (max_amount - 0.0001).toFixed(4) + } else if(max_amount > 1000) { + amount_el.value = (max_amount - 0.000001).toFixed(6) } else { - // min 2 decimals - if(decimals < 2) { - decimals = 2 - } + max_amount = max_amount - 0.00000001 + if(max_amount <= 0) { + max_amount = 0.00 + amount_el.value = max_amount.toFixed(2) + } else { + amount_el.value = max_amount.toFixed(8) + } } + } else { + max_amount = parseFloat(balanceToHuman(current_asset.balance, 18)) - amount = parseFloat(amount).toFixed(decimals) - usd_amount = parseFloat(usd_amount).toFixed(2) - total_amount = (parseFloat(amount) + parseFloat(estimated_fee)).toFixed(decimals) + if(max_amount > 10000) { + amount_el.value = max_amount.toFixed(4) + } else { + amount_el.value = max_amount.toFixed(8) + } + } + } else { + amount_el.value = max_amount.toFixed(0) + } - if(type === 'amount' || type === 'both') usd_amount_el.value = usd_amount - if(type === 'usd_amount' || type === 'both') amount_el.value = amount + syncAmount('amount') + } - total_amount_el.innerHTML = isNaN(total_amount) ? '0' : total_amount + const toggleAssetDropdown = () => { + if(asset_info_el.classList.contains('active')) { + asset_info_el.classList.remove('active') + } else { + if(!asset_info_el.classList.contains('disabled')) { + asset_info_el.classList.add('active') + } + } + } - getEstimatedFee().then() - checkAddress() + let all_balances = null + const selectAsset = async(selected_asset = 'BBB', amount = '0.00') => { + if(!all_balances) { + all_balances = await sendMessage('get_all_balances') } - const maxAmount = () => { - let max_amount = current_asset.balance - - if(current_asset.is_token) { - if(current_asset?.name === 'bbb') { - max_amount = parseFloat(balanceToHuman(current_asset.balance, 18)) - parseFloat(estimated_fee) - - if(max_amount <= 0) { - max_amount = 0.00 - } - - if(max_amount > 100000) { - amount_el.value = (max_amount - 0.0001).toFixed(4) - } else if(max_amount > 1000) { - amount_el.value = (max_amount - 0.000001).toFixed(6) - } else { - max_amount = max_amount - 0.00000001 - if(max_amount <= 0) { - max_amount = 0.00 - amount_el.value = max_amount.toFixed(2) - } else { - amount_el.value = max_amount.toFixed(8) - } - } - } else { - max_amount = parseFloat(balanceToHuman(current_asset.balance, 18)) - - if(max_amount > 10000) { - amount_el.value = max_amount.toFixed(4) - } else { - amount_el.value = max_amount.toFixed(8) - } - } - } else { - amount_el.value = max_amount.toFixed(0) + document.querySelector('#bordered_content #amount').value = amount + + await screen.reset('#bordered_content #asset_info .dropdown .content') + + const defaultIcon = await renderTemplate('shared/icons/default') + + const bbbIcon = await renderTemplate('shared/icons/bbb') + const usdtIcon = await renderTemplate('shared/icons/usdt') + const usdcIcon = await renderTemplate('shared/icons/usdc') + const dotIcon = await renderTemplate('shared/icons/dot') + const carbonCreditIcon = await renderTemplate('shared/icons/carbon_credit') + + for (const token of all_balances.tokens) { + let icon = defaultIcon + if(token.token_name === 'BBB') icon = bbbIcon + if(token.token_name === 'USDT') icon = usdtIcon + if(token.token_name === 'USDC') icon = usdcIcon + if(token.token_name === 'DOT') icon = dotIcon + + const available_balance = balanceToHuman(token.free, 2) + + if(selected_asset.toString().toLowerCase() === token.token_name.toLowerCase()) { + usd_amount_el.removeAttribute('disabled') + + screen.setParam('#choose_quantity .asset-name', token.token_name.toUpperCase() + ' TOKENS') + screen.setParam('#bordered_content .asset-symbol', token.token_name.toUpperCase()) + + current_asset = { + is_token: true, + asset_id: token.name, + name: token.token_name.toLowerCase(), + balance: token.free, + price: token.price } - syncAmount('amount') - } + const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') - const toggleAssetDropdown = () => { - if(asset_info_el.classList.contains('active')) { - asset_info_el.classList.remove('active') - } else { - if(!asset_info_el.classList.contains('disabled')) { - asset_info_el.classList.add('active') - } + if(asset_icon_el) { + asset_icon_el.classList.add('animate-out') } + + setTimeout(async() => { + await screen.set('#bordered_content #asset_info .selected', 'asset/list_item', { + token: token.token_name, + asset_name: token.token_name + ' Token', + balance: formatAmount(available_balance, 2), + icon: icon + }) + + const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') + + setTimeout(async() => { + asset_icon_el.classList.add('animate-in') + }, 10) + }, 300) + } else { + // little delay for smooth transition + setTimeout(() => { + screen.append('#bordered_content #asset_info .dropdown .content', 'asset/list_item', { + token: token.token_name, + asset_name: token.token_name + ' Token', + balance: formatAmount(available_balance, 2), + icon: icon + }) + }, 300) + } } - let all_balances = null - const selectAsset = async(selected_asset = 'BBB', amount = '0.00') => { - if(!all_balances) { - all_balances = await sendMessage('get_all_balances') - } + for (const asset of all_balances.assets) { + let icon = carbonCreditIcon - document.querySelector('#bordered_content #amount').value = amount - - await screen.reset('#bordered_content #asset_info .dropdown .content') - - const defaultIcon = await renderTemplate('shared/icons/default') - - const bbbIcon = await renderTemplate('shared/icons/bbb') - const usdtIcon = await renderTemplate('shared/icons/usdt') - const usdcIcon = await renderTemplate('shared/icons/usdc') - const dotIcon = await renderTemplate('shared/icons/dot') - const carbonCreditIcon = await renderTemplate('shared/icons/carbon_credit') - - for (const token of all_balances.tokens) { - let icon = defaultIcon - if(token.token_name === 'BBB') icon = bbbIcon - if(token.token_name === 'USDT') icon = usdtIcon - if(token.token_name === 'USDC') icon = usdcIcon - if(token.token_name === 'DOT') icon = dotIcon - - const available_balance = balanceToHuman(token.free, 2) - - if(selected_asset.toString().toLowerCase() === token.token_name.toLowerCase()) { - usd_amount_el.removeAttribute('disabled') - - screen.setParam('#choose_quantity .asset-name', token.token_name.toUpperCase() + ' TOKENS') - screen.setParam('#bordered_content .asset-symbol', token.token_name.toUpperCase()) - - current_asset = { - is_token: true, - asset_id: token.name, - name: token.token_name.toLowerCase(), - balance: token.free, - price: token.price - } - - const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') - - if(asset_icon_el) { - asset_icon_el.classList.add('animate-out') - } - - setTimeout(async() => { - await screen.set('#bordered_content #asset_info .selected', 'asset/list_item', { - token: token.token_name, - asset_name: token.token_name + ' Token', - balance: formatAmount(available_balance, 2), - icon: icon - }) - - const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') - - setTimeout(async() => { - asset_icon_el.classList.add('animate-in') - }, 10) - }, 300) - } else { - // little delay for smooth transition - setTimeout(() => { - screen.append('#bordered_content #asset_info .dropdown .content', 'asset/list_item', { - token: token.token_name, - asset_name: token.token_name + ' Token', - balance: formatAmount(available_balance, 2), - icon: icon - }) - }, 300) - } - } + const available_balance = asset.balance + const asset_short_name = asset.asset_name.length > 22 ? asset.asset_name.substring(0,22) + '...' : asset.asset_name - for (const asset of all_balances.assets) { - let icon = carbonCreditIcon - - const available_balance = asset.balance - const asset_short_name = asset.asset_name.length > 22 ? asset.asset_name.substring(0,22) + '...' : asset.asset_name - - if(parseInt(selected_asset) === parseInt(asset.asset_id)) { - screen.setParam('#choose_quantity .asset-name', 'CREDITS') - screen.setParam('#bordered_content .asset-symbol', 'CREDITS') - usd_amount_el.setAttribute('disabled', 'disabled') - - current_asset = { - is_token: false, - asset_id: asset.asset_id, - name: asset_short_name, - balance: asset.balance, - price: asset.price - } - - const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') - - if(asset_icon_el) { - asset_icon_el.classList.add('animate-out') - } - - setTimeout(async() => { - await screen.set('#bordered_content #asset_info .selected', 'asset/list_item', { - asset: asset.asset_id, - asset_name: asset_short_name, - balance: available_balance, - icon: icon - }) - - const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') - - setTimeout(async() => { - asset_icon_el.classList.add('animate-in') - }, 10) - }, 300) - } else { - // little delay for smooth transition - setTimeout(() => { - screen.append('#bordered_content #asset_info .dropdown .content', 'asset/list_item', { - asset: asset.asset_id, - asset_name: asset_short_name, - balance: available_balance, - icon: icon - }) - }, 400) - } + if(parseInt(selected_asset) === parseInt(asset.asset_id)) { + screen.setParam('#choose_quantity .asset-name', 'CREDITS') + screen.setParam('#bordered_content .asset-symbol', 'CREDITS') + usd_amount_el.setAttribute('disabled', 'disabled') + + current_asset = { + is_token: false, + asset_id: asset.asset_id, + name: asset_short_name, + balance: asset.balance, + price: asset.price } - if(all_balances.tokens.length + all_balances.assets.length > 1) { - asset_info_el.classList.remove('disabled') + const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') + + if(asset_icon_el) { + asset_icon_el.classList.add('animate-out') } - syncAmount('amount') + setTimeout(async() => { + await screen.set('#bordered_content #asset_info .selected', 'asset/list_item', { + asset: asset.asset_id, + asset_name: asset_short_name, + balance: available_balance, + icon: icon + }) + + const asset_icon_el = document.querySelector('#bordered_content #asset_info .selected .asset-icon') + + setTimeout(async() => { + asset_icon_el.classList.add('animate-in') + }, 10) + }, 300) + } else { + // little delay for smooth transition + setTimeout(() => { + screen.append('#bordered_content #asset_info .dropdown .content', 'asset/list_item', { + asset: asset.asset_id, + asset_name: asset_short_name, + balance: available_balance, + icon: icon + }) + }, 400) + } } - selectAsset(preselected_asset, preselected_amount).then() + + if(all_balances.tokens.length + all_balances.assets.length > 1) { + asset_info_el.classList.remove('disabled') + } + + syncAmount('amount') + } + selectAsset(preselected_asset, preselected_amount).then() } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js b/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js index 3b7b762..9412a90 100644 --- a/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js +++ b/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js @@ -3,92 +3,92 @@ import Screen, { clearHistory, goToScreen } from './index.js' import anime from "animejs"; export default async function assetTransactionFinishScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page_content', - login: false, - header: false, - footer: false - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/full_page_content', + login: false, + header: false, + footer: false + }) + await screen.init() - const account_name = params?.account_name - const account_address = params?.account_address + const account_name = params?.account_name + const account_address = params?.account_address - await screen.set('.content', 'asset/finish_transaction', { - account_name: (account_name.length > 14 ? account_name.substring(0,14)+'...' : account_name), - account_address: account_address, - recipient_address: params?.recipient - }) + await screen.set('.content', 'asset/finish_transaction', { + account_name: (account_name.length > 14 ? account_name.substring(0,14)+'...' : account_name), + account_address: account_address, + recipient_address: params?.recipient + }) - anime({ - targets: '#success_icon', - translateY: [-50, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 200, - }); + anime({ + targets: '#success_icon', + translateY: [-50, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 200, + }); - anime({ - targets: '#heading_text', - translateY: [50, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 200, - }); + anime({ + targets: '#heading_text', + translateY: [50, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 200, + }); - anime({ - targets: '#message_text', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 800, - delay: 400 - }); + anime({ + targets: '#message_text', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 800, + delay: 400 + }); - anime({ - targets: '#transaction_info', - scale: [0.5, 1], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 800, - }); + anime({ + targets: '#transaction_info', + scale: [0.5, 1], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 800, + }); - anime({ - targets: '#another_transaction', - translateX: [-40, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 800, - }); + anime({ + targets: '#another_transaction', + translateX: [-40, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 800, + }); - anime({ - targets: '#go_to_dashboard', - translateX: [30, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 1200, - }); + anime({ + targets: '#go_to_dashboard', + translateX: [30, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 1200, + }); - screen.setListeners([ - { - element: '#root #another_transaction', - listener: async() => { - await clearHistory() - await goToScreen('assetSendScreen') - } - }, - { - element: '#root #go_to_dashboard', - listener: async() => { - if(params?.from_tab) { - window.close() - } - await goToScreen('dashboardScreen') - } + screen.setListeners([ + { + element: '#root #another_transaction', + listener: async() => { + await clearHistory() + await goToScreen('assetSendScreen') + } + }, + { + element: '#root #go_to_dashboard', + listener: async() => { + if(params?.from_tab) { + window.close() } - ]) + await goToScreen('dashboardScreen') + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/assetTransactionReview.js b/packages/browser-wallet-ui/src/screens/assetTransactionReview.js index 2b02056..544d1c3 100644 --- a/packages/browser-wallet-ui/src/screens/assetTransactionReview.js +++ b/packages/browser-wallet-ui/src/screens/assetTransactionReview.js @@ -1,192 +1,190 @@ -import Screen, { currentScreen, goBackScreen, goToScreen } from './index.js' +import Screen, { goBackScreen, goToScreen } from './index.js' import { sendMessage } from "../messaging.js"; import DOMPurify from "dompurify"; import {AccountStore, bbbTokenPrice} from "@bitgreen/browser-wallet-core"; import { - addressValid, - balanceToHuman, - formatAmount, - getAmountDecimal, - humanToBalance + balanceToHuman, + getAmountDecimal, + humanToBalance } from "@bitgreen/browser-wallet-utils"; import { showNotification } from "../notifications.js"; export default async function assetTransactionReviewScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Review Transaction' - }, - login: false, - header: false, - footer: false, - tab_id: params?.tab_id, - message_id: params?.message_id - }) - await screen.init() - - const accounts_store = new AccountStore() - const account = await accounts_store.asyncGet(params?.account_id) - - const recipient = params?.recipient - const asset_amount = params?.amount - const asset_info = getAmountDecimal(asset_amount, 2) - const usd_info = getAmountDecimal(asset_amount * params?.current_asset?.price, 2) // TODO: update price! - - let estimated_fee = 0 - if(params?.current_asset.is_token) { - if(params?.current_asset.name.toLowerCase() === 'bbb') { - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'balances', - call: 'transfer', - call_parameters: [ - params?.recipient, - humanToBalance(params?.amount) - ], - account_address: account.address - }) - } else { - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'tokens', - call: 'transfer', - call_parameters: [ - params?.recipient, - params?.current_asset.name, - humanToBalance(params?.amount) - ], - account_address: account.address - }) - } + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Review Transaction' + }, + login: false, + header: false, + footer: false, + tab_id: params?.tab_id, + message_id: params?.message_id + }) + await screen.init() + + const accounts_store = new AccountStore() + const account = await accounts_store.asyncGet(params?.account_id) + + const recipient = params?.recipient + const asset_amount = params?.amount + const asset_info = getAmountDecimal(asset_amount, 2) + const usd_info = getAmountDecimal(asset_amount * params?.current_asset?.price, 2) // TODO: update price! + + let estimated_fee = 0 + if(params?.current_asset.is_token) { + if(params?.current_asset.name.toLowerCase() === 'bbb') { + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'balances', + call: 'transfer', + call_parameters: [ + params?.recipient, + humanToBalance(params?.amount) + ], + account_address: account.address + }) } else { - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'assets', - call: 'transfer', - call_parameters: [ - params?.current_asset?.name, - params?.recipient, - params?.amount - ], - account_address: account.address - }) + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'tokens', + call: 'transfer', + call_parameters: [ + params?.recipient, + params?.current_asset.name, + humanToBalance(params?.amount) + ], + account_address: account.address + }) } - - const fee_usd = balanceToHuman(estimated_fee, 4) * bbbTokenPrice - const fee_info = getAmountDecimal(fee_usd, 4) - - let asset_name = '' - if(params?.current_asset?.is_token) { - asset_name = params?.current_asset?.name?.toUpperCase() - } else { - asset_name = 'CREDITS' - } - - await screen.set('.content', 'asset/review_transaction', { - asset_name: asset_name, - asset_amount: asset_info.amount, - asset_decimals: asset_info.decimals, - usd_amount: params?.current_asset?.price > 0 ? '$' + usd_info.amount : 'N/A', - usd_decimals: params?.current_asset?.price > 0 ? '.' + usd_info.decimals : '', - fee_amount: fee_usd < 0.0001 ? '0' : fee_info.amount, - fee_decimals: fee_usd < 0.0001 ? '0001' : fee_info.decimals, - account_name: (account.name.length > 14 ? account.name.substring(0,14)+'...' : account.name), - account_address: account.address, - recipient_address: recipient + } else { + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'assets', + call: 'transfer', + call_parameters: [ + params?.current_asset?.name, + params?.recipient, + params?.amount + ], + account_address: account.address }) - - await screen.append('.content', 'global/loading', { - title: 'processing transaction', - desc: 'Hold tight while we get confirmation of this transaction.', - top: '0;', - padding_top: '60px' - }); - - const input_field = document.querySelector("#root .footer #password") - const show_password = document.querySelector("#root .footer .show-password") - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#approve_transaction', - listener: () => makeTransaction() - }, - { - element: '#root #password', - type: 'keypress', - listener: async(e) => { - if(e.key === "Enter") { - await makeTransaction() - } - } - }, - { - element: '#root .footer .show-password', - listener: () => { - if(input_field.type === 'password') { - input_field.type = 'text' - show_password.innerHTML = '' - } else { - input_field.type = 'password' - show_password.innerHTML = '' - } - } + } + + const fee_usd = balanceToHuman(estimated_fee, 4) * bbbTokenPrice + const fee_info = getAmountDecimal(fee_usd, 4) + + let asset_name = '' + if(params?.current_asset?.is_token) { + asset_name = params?.current_asset?.name?.toUpperCase() + } else { + asset_name = 'CREDITS' + } + + await screen.set('.content', 'asset/review_transaction', { + asset_name: asset_name, + asset_amount: asset_info.amount, + asset_decimals: asset_info.decimals, + usd_amount: params?.current_asset?.price > 0 ? '$' + usd_info.amount : 'N/A', + usd_decimals: params?.current_asset?.price > 0 ? '.' + usd_info.decimals : '', + fee_amount: fee_usd < 0.0001 ? '0' : fee_info.amount, + fee_decimals: fee_usd < 0.0001 ? '0001' : fee_info.decimals, + account_name: (account.name.length > 14 ? account.name.substring(0,14)+'...' : account.name), + account_address: account.address, + recipient_address: recipient + }) + + await screen.append('.content', 'global/loading', { + title: 'processing transaction', + desc: 'Hold tight while we get confirmation of this transaction.', + top: '0;', + padding_top: '60px' + }); + + const input_field = document.querySelector("#root .footer #password") + const show_password = document.querySelector("#root .footer .show-password") + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#approve_transaction', + listener: () => makeTransaction() + }, + { + element: '#root #password', + type: 'keypress', + listener: async(e) => { + if(e.key === "Enter") { + await makeTransaction() } - ]) - - const makeTransaction = async() => { - const password_el = document.querySelector("#root #password") - - showProcessing() - - const response = await sendMessage('transfer', { - password: DOMPurify.sanitize(password_el?.value), - account_id: params?.account_id, - asset: params?.current_asset, - amount: params?.amount, - recipient: params?.recipient, - tab_id: params?.tab_id - }, params?.message_id) - - if(response?.success) { - // send message to tab if response is successful - screen.sendMessageToTab({ - ...response - }) - - await goToScreen('assetTransactionFinishScreen', { - account_name: account.name, - account_address: account.address, - recipient: params?.recipient, - from_tab: !!params?.tab_id - }) - } else if(response?.status === 'failed' && response.error) { - hideProcessing() - await showNotification(response.error, 'error', 5000) + } + }, + { + element: '#root .footer .show-password', + listener: () => { + if(input_field.type === 'password') { + input_field.type = 'text' + show_password.innerHTML = '' } else { - hideProcessing() - await showNotification('Password is wrong!', 'error') + input_field.type = 'password' + show_password.innerHTML = '' } - - show_password.innerHTML = '' - input_field.type = 'password' + } + } + ]) + + const makeTransaction = async() => { + const password_el = document.querySelector("#root #password") + + showProcessing() + + const response = await sendMessage('transfer', { + password: DOMPurify.sanitize(password_el?.value), + account_id: params?.account_id, + asset: params?.current_asset, + amount: params?.amount, + recipient: params?.recipient, + tab_id: params?.tab_id + }, params?.message_id) + + if(response?.success) { + // send message to tab if response is successful + screen.sendMessageToTab({ + ...response + }) + + await goToScreen('assetTransactionFinishScreen', { + account_name: account.name, + account_address: account.address, + recipient: params?.recipient, + from_tab: !!params?.tab_id + }) + } else if(response?.status === 'failed' && response.error) { + hideProcessing() + await showNotification(response.error, 'error', 5000) + } else { + hideProcessing() + await showNotification('Password is wrong!', 'error') } - const showProcessing = () => { - const loading_el = document.querySelector("#loading_content") + show_password.innerHTML = '' + input_field.type = 'password' + } - loading_el.classList.add('active') + const showProcessing = () => { + const loading_el = document.querySelector("#loading_content") - screen.freezeRoot() - } + loading_el.classList.add('active') - const hideProcessing = () => { - setTimeout(() => { - const loading_el = document.querySelector("#loading_content") + screen.freezeRoot() + } - loading_el.classList.remove('active') - screen.unFreezeRoot() - }, 1200) - } + const hideProcessing = () => { + setTimeout(() => { + const loading_el = document.querySelector("#loading_content") + + loading_el.classList.remove('active') + screen.unFreezeRoot() + }, 1200) + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/connectionError.js b/packages/browser-wallet-ui/src/screens/connectionError.js index b404b2d..7722f76 100644 --- a/packages/browser-wallet-ui/src/screens/connectionError.js +++ b/packages/browser-wallet-ui/src/screens/connectionError.js @@ -1,61 +1,59 @@ import Screen, {goBackScreen, goToScreen, reloadScreen} from './index.js' import anime from "animejs"; -import {polkadotApi} from "@bitgreen/browser-wallet-core"; -import toast from "bootstrap/js/src/toast.js"; import {showNotification} from "../notifications.js"; import {sendMessage} from "../messaging.js"; export default async function connectionErrorScreen() { - const screen = new Screen({ - template_name: 'layouts/full_page_secondary', - login: false, - header: false, - footer: false - }) - await screen.init() - - await screen.set('.content', 'connection_error') - - anime({ - targets: '#root .footer', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 200 - }); - - screen.setListeners([ - { - element: '#try_again', - listener: async() => { - document.querySelector("#bbb_loader").classList.add('active') - - screen.freezeRoot() - anime({ - targets: '#root .footer', - opacity: [1, 0], - easing: 'easeInOutSine', - duration: 200 - }); - - const api_ready = await sendMessage('reconnect_api') - setTimeout(async() => { - screen.unFreezeRoot() - - if(api_ready) { - await goBackScreen() - await showNotification('Connection successfully restored!', 'info', 2000, 0) - } else { - document.querySelector("#bbb_loader").classList.remove('active') - - anime({ - targets: '#root .footer', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 200 - }); - } - }, 2000) - } - } - ]) + const screen = new Screen({ + template_name: 'layouts/full_page_secondary', + login: false, + header: false, + footer: false + }) + await screen.init() + + await screen.set('.content', 'connection_error') + + anime({ + targets: '#root .footer', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 200 + }); + + screen.setListeners([ + { + element: '#try_again', + listener: async() => { + document.querySelector("#bbb_loader").classList.add('active') + + screen.freezeRoot() + anime({ + targets: '#root .footer', + opacity: [1, 0], + easing: 'easeInOutSine', + duration: 200 + }); + + const api_ready = await sendMessage('reconnect_api') + setTimeout(async() => { + screen.unFreezeRoot() + + if(api_ready) { + await goBackScreen() + await showNotification('Connection successfully restored!', 'info', 2000, 0) + } else { + document.querySelector("#bbb_loader").classList.remove('active') + + anime({ + targets: '#root .footer', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 200 + }); + } + }, 2000) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/dashboard.js b/packages/browser-wallet-ui/src/screens/dashboard.js index 692c9b3..4228667 100644 --- a/packages/browser-wallet-ui/src/screens/dashboard.js +++ b/packages/browser-wallet-ui/src/screens/dashboard.js @@ -8,204 +8,204 @@ import { balanceToHuman, formatAmount, getAmountDecimal, humanToBalance, sleep } import BigNumber from "bignumber.js"; export default async function dashboardScreen(params = { - imported: false + imported: false }) { - const wallet_store = new WalletStore() - if(!await wallet_store.exists()) { - await clearHistory() - return await goToScreen('walletScreen', {}, false, true) + const wallet_store = new WalletStore() + if(!await wallet_store.exists()) { + await clearHistory() + return await goToScreen('walletScreen', {}, false, true) + } + + const screen = new Screen({ + template_name: 'layouts/page_big_heading', + header: true, + footer: true, + freeze_root: true, + freeze_root_delay: 1200 + }) + await screen.init() + + const token_price_info = getAmountDecimal(bbbTokenPrice, 2) + + await screen.set('#heading', 'dashboard/heading', { + token_price: token_price_info.amount, + token_price_decimals: token_price_info.decimals + }) + + await screen.set('#bordered_content', 'dashboard/content') + document.querySelector('#bordered_content').classList.add('no-overflow') + + await clearHistory() + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + anime({ + targets: '#portfolio', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 200 + }); + + anime({ + targets: '#portfolio .info h1', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 300, + delay: 200 + }); + + anime({ + targets: '#portfolio #bbb_token_info svg', + scale: [0.4, 1], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 300 + }); + + anime({ + targets: '#portfolio #bbb_token_info .amounts', + translateX: [20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + anime({ + targets: '#portfolio .info p', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 300, + delay: function(el, i) { + return i*400 + 100 + }, + }); + + anime({ + targets: '#portfolio .info p .icon.icon-circle', + translateX: [20, 0], + scale: [1.5, 1], + easing: 'easeInOutSine', + duration: 300, + delay: function(el, i) { + return i*400 + 100 + }, + }); + + anime({ + targets: '#bordered_content #top_items button', + duration: 400, + translateX: [20, 0], + opacity: [0, 1], + easing: 'linear', + delay: function(el, i) { + return i*300 + 200 + }, + }); + + sendMessage('get_all_balances').then(async(all_balances) => { + let bbb_balance = 0 + let other_usd_amount = 0 + for(const token of all_balances.tokens) { + if(token.token_name === 'BBB') { + bbb_balance = new BigNumber(token.total) + } else { + other_usd_amount += balanceToHuman(token.total, 18) * token.price + } + } + for(const asset of all_balances.assets) { + other_usd_amount += asset.balance * asset.price } - const screen = new Screen({ - template_name: 'layouts/page_big_heading', - header: true, - footer: true, - freeze_root: true, - freeze_root_delay: 1200 - }) - await screen.init() - - const token_price_info = getAmountDecimal(bbbTokenPrice, 2) - - await screen.set('#heading', 'dashboard/heading', { - token_price: token_price_info.amount, - token_price_decimals: token_price_info.decimals - }) - - await screen.set('#bordered_content', 'dashboard/content') - document.querySelector('#bordered_content').classList.add('no-overflow') + const vesting_contract = await sendMessage('get_vesting_contract') - await clearHistory() + let vesting_balance = new BigNumber(0) + if(vesting_contract) { + vesting_balance = balanceToHuman(vesting_contract?.amount, 18) + } - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + const total_bbb_balance = balanceToHuman(bbb_balance.plus(new BigNumber(vesting_contract?.amount || 0)), 18) - anime({ - targets: '#portfolio', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 200 - }); + const bbb_usd_amount = balanceToHuman(bbb_balance, 18) * bbbTokenPrice - anime({ - targets: '#portfolio .info h1', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 300, - delay: 200 - }); + const vesting_usd_amount = vesting_balance * bbbTokenPrice - anime({ - targets: '#portfolio #bbb_token_info svg', - scale: [0.4, 1], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 300 - }); + if(vesting_usd_amount > 0) { + document.querySelector('#portfolio #vesting_info').classList.remove('d-none') + document.querySelector('#portfolio #vesting_info').classList.add('d-flex') - anime({ - targets: '#portfolio #bbb_token_info .amounts', - translateX: [20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); + screen.setParam('#portfolio .vesting_usd_amount', '$' + formatAmount(vesting_usd_amount, vesting_usd_amount < 1000000 ? 2 : 0)) + } - anime({ - targets: '#portfolio .info p', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 300, - delay: function(el, i) { - return i*400 + 100 - }, - }); + await screen.set('#chart', 'dashboard/chart') + initChart({ + bbb_token_amount: bbb_usd_amount + vesting_usd_amount, + other_amount: other_usd_amount + }) - anime({ - targets: '#portfolio .info p .icon.icon-circle', - translateX: [20, 0], - scale: [1.5, 1], - easing: 'easeInOutSine', - duration: 300, - delay: function(el, i) { - return i*400 + 100 - }, - }); + screen.setParam('#portfolio .bbb_usd_amount', '$' + formatAmount(bbb_usd_amount, bbb_usd_amount < 1000000 ? 2 : 0)) + screen.setParam('#portfolio .other_usd_amount', '$' + formatAmount(other_usd_amount, bbb_usd_amount < 1000000 ? 2 : 0)) + screen.setParam('#bordered_content .all_balance', formatAmount(balanceToHuman(new BigNumber(all_balances.total).plus(new BigNumber(vesting_contract?.amount || 0))), 2)) + screen.setParam('#bordered_content .bbb_balance', formatAmount(total_bbb_balance, 2)) + screen.setParam('#bordered_content .token_balance', formatAmount(balanceToHuman(all_balances.tokens_total), 2)) + }).then(() => { + renderChart() + }).then(() => { anime({ - targets: '#bordered_content #top_items button', - duration: 400, - translateX: [20, 0], - opacity: [0, 1], - easing: 'linear', - delay: function(el, i) { - return i*300 + 200 - }, + targets: '#bordered_content .button-item', + easing: 'easeInOutSine', + translateX: [-20, 0], + opacity: [0, 1], + duration: function(el, i) { + return 400 - i*50 + }, + delay: function(el, i) { + return i*200 + 200 + }, }); - - sendMessage('get_all_balances').then(async(all_balances) => { - let bbb_balance = 0 - let other_usd_amount = 0 - for(const token of all_balances.tokens) { - if(token.token_name === 'BBB') { - bbb_balance = new BigNumber(token.total) - } else { - other_usd_amount += balanceToHuman(token.total, 18) * token.price - } - } - for(const asset of all_balances.assets) { - other_usd_amount += asset.balance * asset.price - } - - const vesting_contract = await sendMessage('get_vesting_contract') - - let vesting_balance = new BigNumber(0) - if(vesting_contract) { - vesting_balance = balanceToHuman(vesting_contract?.amount, 18) - } - - const total_bbb_balance = balanceToHuman(bbb_balance.plus(new BigNumber(vesting_contract?.amount || 0)), 18) - - const bbb_usd_amount = balanceToHuman(bbb_balance, 18) * bbbTokenPrice - - const vesting_usd_amount = vesting_balance * bbbTokenPrice - - if(vesting_usd_amount > 0) { - document.querySelector('#portfolio #vesting_info').classList.remove('d-none') - document.querySelector('#portfolio #vesting_info').classList.add('d-flex') - - screen.setParam('#portfolio .vesting_usd_amount', '$' + formatAmount(vesting_usd_amount, vesting_usd_amount < 1000000 ? 2 : 0)) - } - - await screen.set('#chart', 'dashboard/chart') - initChart({ - bbb_token_amount: bbb_usd_amount + vesting_usd_amount, - other_amount: other_usd_amount - }) - - screen.setParam('#portfolio .bbb_usd_amount', '$' + formatAmount(bbb_usd_amount, bbb_usd_amount < 1000000 ? 2 : 0)) - screen.setParam('#portfolio .other_usd_amount', '$' + formatAmount(other_usd_amount, bbb_usd_amount < 1000000 ? 2 : 0)) - - screen.setParam('#bordered_content .all_balance', formatAmount(balanceToHuman(new BigNumber(all_balances.total).plus(new BigNumber(vesting_contract?.amount || 0))), 2)) - screen.setParam('#bordered_content .bbb_balance', formatAmount(total_bbb_balance, 2)) - screen.setParam('#bordered_content .token_balance', formatAmount(balanceToHuman(all_balances.tokens_total), 2)) - }).then(() => { - renderChart() - }).then(() => { - anime({ - targets: '#bordered_content .button-item', - easing: 'easeInOutSine', - translateX: [-20, 0], - opacity: [0, 1], - duration: function(el, i) { - return 400 - i*50 - }, - delay: function(el, i) { - return i*200 + 200 - }, - }); - }).catch(() => { - // TODO: handle this like: - // goToScreen('connectionErrorScreen') - }) - - screen.setListeners([ - { - element: '#send', - listener: () => goToScreen('assetSendScreen') - }, - { - element: '#receive', - listener: () => goToScreen('assetReceiveScreen') - }, - { - element: '#nature_based_credits', - listener: () => goToScreen('natureBasedCreditsScreen') - }, - { - element: '#retired_credits', - listener: () => goToScreen('retiredCreditsScreen') - }, - { - element: '#all_assests', - listener: () => goToScreen('assetAllScreen') - }, - { - element: '#bbb_tokens', - listener: () => goToScreen('tokenBBBScreen') - }, - { - element: '#other_tokens', - listener: () => goToScreen('tokenAllScreen') - }, - ]) + }).catch(() => { + // TODO: handle this like: + // goToScreen('connectionErrorScreen') + }) + + screen.setListeners([ + { + element: '#send', + listener: () => goToScreen('assetSendScreen') + }, + { + element: '#receive', + listener: () => goToScreen('assetReceiveScreen') + }, + { + element: '#nature_based_credits', + listener: () => goToScreen('natureBasedCreditsScreen') + }, + { + element: '#retired_credits', + listener: () => goToScreen('retiredCreditsScreen') + }, + { + element: '#all_assests', + listener: () => goToScreen('assetAllScreen') + }, + { + element: '#bbb_tokens', + listener: () => goToScreen('tokenBBBScreen') + }, + { + element: '#other_tokens', + listener: () => goToScreen('tokenAllScreen') + }, + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/extrinsicSend.js b/packages/browser-wallet-ui/src/screens/extrinsicSend.js index da33537..fce767c 100644 --- a/packages/browser-wallet-ui/src/screens/extrinsicSend.js +++ b/packages/browser-wallet-ui/src/screens/extrinsicSend.js @@ -1,5 +1,5 @@ import Screen, { clearHistory, goBackScreen, goToScreen, scrollToBottom } from './index.js' -import { disableKillPopup, sendMessage } from "../messaging.js"; +import { sendMessage } from "../messaging.js"; import { AccountStore, checkIfAppIsKnown, NetworkStore, WalletStore, CacheStore } from "@bitgreen/browser-wallet-core"; import DOMPurify from "dompurify"; @@ -7,443 +7,443 @@ import { showNotification } from "../notifications.js"; import anime from "animejs"; export default async function extrinsicSendScreen(params) { - const wallet_store = new WalletStore() - if(!await wallet_store.exists()) { - await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() - return await goToScreen('walletScreen', {}, false, true) + const wallet_store = new WalletStore() + if(!await wallet_store.exists()) { + await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) + await clearHistory() + return await goToScreen('walletScreen', {}, false, true) + } + + let win_height = 600 + if(params?.message_id && params?.tab_id) { + win_height = 700 + } + + const screen = new Screen({ + template_name: 'layouts/default', + login: false, + header: true, + footer: false, + tab_id: params?.tab_id, + message_id: params?.message_id, + win_height: win_height + }) + await screen.init() + + const domain = params?.domain + const pallet = params?.pallet + const call = params?.call?.replaceAll('_', '') + + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + const current_account = await accounts_store.current() + + await screen.set('#heading', 'shared/heading', { + title: 'Confirm Transaction' + }) + + await screen.set('#bordered_content', 'extrinsic/send', { + domain + }) + + let extrinsics = [] + if(pallet === 'utility' && (call === 'batch' || call === 'batchAll' || call === 'forceBatch')) { + let index = 0 + for(const extrinsic of JSON.parse(params.call_parameters)) { + extrinsics.push({ + index, + pallet: extrinsic[0], + call: extrinsic[1], + call_parameters: extrinsic[2], + }) + + index++ } - - let win_height = 600 - if(params?.message_id && params?.tab_id) { - win_height = 700 - } - - const screen = new Screen({ - template_name: 'layouts/default', - login: false, - header: true, - footer: false, - tab_id: params?.tab_id, - message_id: params?.message_id, - win_height: win_height - }) - await screen.init() - - const domain = params?.domain - const pallet = params?.pallet - const call = params?.call?.replaceAll('_', '') - - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) - const current_account = await accounts_store.current() - - await screen.set('#heading', 'shared/heading', { - title: 'Confirm Transaction' - }) - - await screen.set('#bordered_content', 'extrinsic/send', { - domain + } else { + extrinsics.push({ + index: 0, + pallet: pallet, + call: call, + call_parameters: params?.call_parameters ? JSON.parse(params.call_parameters) : [], }) - - let extrinsics = [] - if(pallet === 'utility' && (call === 'batch' || call === 'batchAll' || call === 'forceBatch')) { - let index = 0 - for(const extrinsic of JSON.parse(params.call_parameters)) { - extrinsics.push({ - index, - pallet: extrinsic[0], - call: extrinsic[1], - call_parameters: extrinsic[2], - }) - - index++ - } - } else { - extrinsics.push({ - index: 0, - pallet: pallet, - call: call, - call_parameters: params?.call_parameters ? JSON.parse(params.call_parameters) : [], - }) - } - - // Show all extrinsics - for(const extrinsic of extrinsics) { - const docs = await cache_store.asyncGet(`docs_${extrinsic.pallet}:${extrinsic.call}`) - - // show request params - let raw_request = {} - if(docs?.fields) { - for(const [key, field] of Object.entries(docs?.fields)) { - raw_request = { - ...raw_request, - [field.name]: extrinsic.call_parameters[key] - } - } - } - - await screen.append('#bordered_content #transactions', 'extrinsic/list_item', { - index: extrinsic.index, - human_index: extrinsic.index + 1, - is_last: extrinsics.length - 1 === extrinsic.index, - pallet: extrinsic.pallet.length > 9 ? extrinsic.pallet.substring(0, 9) + '...' : extrinsic.pallet, - pallet_full: extrinsic.pallet, - call: extrinsic.call.length > 9 ? extrinsic.call.substring(0, 9) + '...' : extrinsic.call, - call_full: extrinsic.call, - docs: docs?.docs[0] || '', - raw_request: JSON.stringify(raw_request).length >= 150 ? JSON.stringify(raw_request).substring(0, 150) + '...' : JSON.stringify(raw_request) - }) - } - - if(params?.message_id && params?.tab_id) { - await screen.set('#app_info', 'app_info', { - domain, - title: params?.title?.substring(0, 60) - }); - - const app = checkIfAppIsKnown(domain) - if(app) { - screen.setParam('#app_info h3', app.title) - document.querySelector('#app_info').classList.add('known') + } + + // Show all extrinsics + for(const extrinsic of extrinsics) { + const docs = await cache_store.asyncGet(`docs_${extrinsic.pallet}:${extrinsic.call}`) + + // show request params + let raw_request = {} + if(docs?.fields) { + for(const [key, field] of Object.entries(docs?.fields)) { + raw_request = { + ...raw_request, + [field.name]: extrinsic.call_parameters[key] } - } else { - document.querySelector('#app_info').classList.remove('d-flex') - document.querySelector('#app_info').classList.add('d-none') - - // expand transactions - document.querySelector('#transactions').style.height = 'calc(100% - 100px)' + } } - await screen.append('#bordered_content', 'global/loading', { - title: 'Processing Transaction', - desc: 'Hold tight while we get confirmation of this transaction.', - top: '5px', - padding_top: '60px' - }); - - const transaction_items = document.querySelector("#bordered_content #transactions") - document.querySelectorAll("#bordered_content .transaction-item").forEach(t => { - t.addEventListener("click", function(e) { - if(t.classList.contains('active')) { - t.classList.remove('active') - } else { - document.querySelectorAll('#bordered_content .transaction-item').forEach(t => { - t.classList.remove('active') - }) - - t.classList.add('active') - } - - setTimeout(() => { - t.scrollIntoView({ behavior: 'smooth' }); - }, 200) - }) + await screen.append('#bordered_content #transactions', 'extrinsic/list_item', { + index: extrinsic.index, + human_index: extrinsic.index + 1, + is_last: extrinsics.length - 1 === extrinsic.index, + pallet: extrinsic.pallet.length > 9 ? extrinsic.pallet.substring(0, 9) + '...' : extrinsic.pallet, + pallet_full: extrinsic.pallet, + call: extrinsic.call.length > 9 ? extrinsic.call.substring(0, 9) + '...' : extrinsic.call, + call_full: extrinsic.call, + docs: docs?.docs[0] || '', + raw_request: JSON.stringify(raw_request).length >= 150 ? JSON.stringify(raw_request).substring(0, 150) + '...' : JSON.stringify(raw_request) }) + } - await screen.append('#loading_content #content .done', 'global/button', { - id: 'show_transaction', - title: 'Transaction Summary', - class: 'btn-secondary-outline btn-sm btn-rounded me-1 ms-1', - icon: 'hidden m-0' - }) + if(params?.message_id && params?.tab_id) { + await screen.set('#app_info', 'app_info', { + domain, + title: params?.title?.substring(0, 60) + }); - if(params?.tab_id) { - await screen.append('#loading_content #content .done', 'global/button', { - id: 'close_tab', - title: 'Close and Return', - class: 'btn-dark btn-sm btn-rounded me-1 ms-1', - icon: 'hidden m-0' - }); + const app = checkIfAppIsKnown(domain) + if(app) { + screen.setParam('#app_info h3', app.title) + document.querySelector('#app_info').classList.add('known') } + } else { + document.querySelector('#app_info').classList.remove('d-flex') + document.querySelector('#app_info').classList.add('d-none') + + // expand transactions + document.querySelector('#transactions').style.height = 'calc(100% - 100px)' + } + + await screen.append('#bordered_content', 'global/loading', { + title: 'Processing Transaction', + desc: 'Hold tight while we get confirmation of this transaction.', + top: '5px', + padding_top: '60px' + }); + + const transaction_items = document.querySelector("#bordered_content #transactions") + document.querySelectorAll("#bordered_content .transaction-item").forEach(t => { + t.addEventListener("click", function(e) { + if(t.classList.contains('active')) { + t.classList.remove('active') + } else { + document.querySelectorAll('#bordered_content .transaction-item').forEach(t => { + t.classList.remove('active') + }) - const input_field = document.querySelector("#root .footer #password") - const show_password = document.querySelector("#root .footer .show-password") + t.classList.add('active') + } - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + setTimeout(() => { + t.scrollIntoView({ behavior: 'smooth' }); + }, 200) + }) + }) - anime({ - targets: '#transactions .button-item', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 250, - delay: function(el, i) { return (i * 150) > 1200 ? 1200 : (i * 150) }, - }); + await screen.append('#loading_content #content .done', 'global/button', { + id: 'show_transaction', + title: 'Transaction Summary', + class: 'btn-secondary-outline btn-sm btn-rounded me-1 ms-1', + icon: 'hidden m-0' + }) - anime({ - targets: '#bordered_content .footer', - translateY: 0, - duration: 1, - delay: 200 + if(params?.tab_id) { + await screen.append('#loading_content #content .done', 'global/button', { + id: 'close_tab', + title: 'Close and Return', + class: 'btn-dark btn-sm btn-rounded me-1 ms-1', + icon: 'hidden m-0' }); + } + + const input_field = document.querySelector("#root .footer #password") + const show_password = document.querySelector("#root .footer .show-password") + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + anime({ + targets: '#transactions .button-item', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 250, + delay: function(el, i) { return (i * 150) > 1200 ? 1200 : (i * 150) }, + }); + + anime({ + targets: '#bordered_content .footer', + translateY: 0, + duration: 1, + delay: 200 + }); + + screen.setListeners([ + { + element: '#approve_extrinsic', + listener: async() => { + await approveExtrinsic() + } + }, + { + element: '#password', + type: 'keypress', + listener: async(e) => { + if(e.key === "Enter") { + await approveExtrinsic() + } + await scrollToBottom() + } + }, + { + element: '#password', + type: 'focus', + listener: async() => { + await scrollToBottom() + await scrollToBottom(200) + await scrollToBottom(1600) + } + }, + { + element: '#deny_extrinsic', + listener: async() => { + if(params?.message_id && params?.tab_id) { + screen.sendMessageToTab({ + success: false, + status: 'denied', + error: 'User has denied this request.' + }) + + window.close() + } else { + await goBackScreen() + } + } + }, + { + element: '#show_transaction', + listener: async() => { + screen.freezeRoot() - screen.setListeners([ - { - element: '#approve_extrinsic', - listener: async() => { - await approveExtrinsic() - } - }, - { - element: '#password', - type: 'keypress', - listener: async(e) => { - if(e.key === "Enter") { - await approveExtrinsic() - } - await scrollToBottom() - } - }, - { - element: '#password', - type: 'focus', - listener: async() => { - await scrollToBottom() - await scrollToBottom(200) - await scrollToBottom(1600) - } - }, - { - element: '#deny_extrinsic', - listener: async() => { - if(params?.message_id && params?.tab_id) { - screen.sendMessageToTab({ - success: false, - status: 'denied', - error: 'User has denied this request.' - }) - - window.close() - } else { - await goBackScreen() - } - } - }, - { - element: '#show_transaction', - listener: async() => { - screen.freezeRoot() - - hideProcessing(400) - } - }, - { - element: '#close_tab', - listener: async() => { - window.close() - - return await goToScreen('dashboardScreen') - } - }, - { - element: '#root .footer .show-password', - listener: () => { - if(input_field.type === 'password') { - input_field.type = 'text' - show_password.innerHTML = '' - } else { - input_field.type = 'password' - show_password.innerHTML = '' - } - } + hideProcessing(400) + } + }, + { + element: '#close_tab', + listener: async() => { + window.close() + + return await goToScreen('dashboardScreen') + } + }, + { + element: '#root .footer .show-password', + listener: () => { + if(input_field.type === 'password') { + input_field.type = 'text' + show_password.innerHTML = '' + } else { + input_field.type = 'password' + show_password.innerHTML = '' + } + } + } + ]) + + const approveExtrinsic = async() => { + showProcessing() + + const response = await sendMessage('extrinsic', { + password: DOMPurify.sanitize(document.querySelector('#root #password')?.value), + account_id: current_account.id, + pallet: pallet, + call: call, + call_parameters: params?.call_parameters, + tab_id: params?.tab_id + }, params?.message_id) + + if(response?.success) { + // send message to tab if response is successful + screen.sendMessageToTab({ + ...response + }) + + showProcessingDone() + } else if(response?.status === 'failed' && response.error) { + // send message to tab if response is unsuccessful + screen.sendMessageToTab({ + ...response + }) + + document.querySelectorAll('#transactions .button-item').forEach(t => { + if(response.data?.failedIndex) { + if(parseInt(t.dataset.id) < parseInt(response.data.failedIndex)) { + t.querySelector('.status').classList.add('success') + t.querySelector('.status').innerHTML = '' + } else if(parseInt(t.dataset.id) === parseInt(response.data.failedIndex)) { + t.querySelector('.status').classList.add('error') + t.querySelector('.status').innerHTML = '' + } else { + t.querySelector('.status').classList.add('pending') + t.querySelector('.status').innerHTML = '?' + } + } else { + t.querySelector('.status').classList.add('error') + t.querySelector('.status').innerHTML = '' } - ]) - - const approveExtrinsic = async() => { - showProcessing() - - const response = await sendMessage('extrinsic', { - password: DOMPurify.sanitize(document.querySelector('#root #password')?.value), - account_id: current_account.id, - pallet: pallet, - call: call, - call_parameters: params?.call_parameters, - tab_id: params?.tab_id - }, params?.message_id) - - if(response?.success) { - // send message to tab if response is successful - screen.sendMessageToTab({ - ...response - }) - - showProcessingDone() - } else if(response?.status === 'failed' && response.error) { - // send message to tab if response is unsuccessful - screen.sendMessageToTab({ - ...response - }) - - document.querySelectorAll('#transactions .button-item').forEach(t => { - if(response.data?.failedIndex) { - if(parseInt(t.dataset.id) < parseInt(response.data.failedIndex)) { - t.querySelector('.status').classList.add('success') - t.querySelector('.status').innerHTML = '' - } else if(parseInt(t.dataset.id) === parseInt(response.data.failedIndex)) { - t.querySelector('.status').classList.add('error') - t.querySelector('.status').innerHTML = '' - } else { - t.querySelector('.status').classList.add('pending') - t.querySelector('.status').innerHTML = '?' - } - } else { - t.querySelector('.status').classList.add('error') - t.querySelector('.status').innerHTML = '' - } - - const error_el = document.createElement('div'); - error_el.classList.add('mt-1', 'mb-2', 'px-2', 'text-gray', 'text-center'); - if(response.data?.failedIndex) { - error_el.innerHTML = 'Transaction interrupted with error:
' + response.error; - } else { - error_el.innerHTML = 'Transaction failed with error:
' + response.error; - } - t.insertAdjacentElement('afterend', error_el) - }) - - showProcessingFail() + + const error_el = document.createElement('div'); + error_el.classList.add('mt-1', 'mb-2', 'px-2', 'text-gray', 'text-center'); + if(response.data?.failedIndex) { + error_el.innerHTML = 'Transaction interrupted with error:
' + response.error; } else { - hideProcessing() - await showNotification('Password is wrong!', 'error') + error_el.innerHTML = 'Transaction failed with error:
' + response.error; } + t.insertAdjacentElement('afterend', error_el) + }) - show_password.innerHTML = '' - input_field.type = 'password' + showProcessingFail() + } else { + hideProcessing() + await showNotification('Password is wrong!', 'error') } - const showProcessing = () => { - const loading_el = document.querySelector("#loading_content") + show_password.innerHTML = '' + input_field.type = 'password' + } - loading_el.classList.add('active') + const showProcessing = () => { + const loading_el = document.querySelector("#loading_content") - screen.freezeRoot() - } + loading_el.classList.add('active') - const showProcessingDone = () => { - screen.unFreezeRoot() + screen.freezeRoot() + } - const loading_el = document.querySelector("#loading_content") - const checkmark_el = loading_el.querySelector("#checkmark") - const content_done_el = loading_el.querySelector("#content .done") - const content_init_text_el = loading_el.querySelector("#content .init .text") - const content_init_desc_el = loading_el.querySelector("#content .init .desc") - const content_done_text_el = loading_el.querySelector("#content .done .text") - const content_done_desc_el = loading_el.querySelector("#content .done .desc") + const showProcessingDone = () => { + screen.unFreezeRoot() - const primary_element = document.querySelector('#loading_content #primary') + const loading_el = document.querySelector("#loading_content") + const checkmark_el = loading_el.querySelector("#checkmark") + const content_done_el = loading_el.querySelector("#content .done") + const content_init_text_el = loading_el.querySelector("#content .init .text") + const content_init_desc_el = loading_el.querySelector("#content .init .desc") + const content_done_text_el = loading_el.querySelector("#content .done .text") + const content_done_desc_el = loading_el.querySelector("#content .done .desc") - primary_element.style.transition = "stroke-dasharray 1.2s ease-out, stroke-dashoffset 1.2s ease-out"; - primary_element.style.strokeDasharray = "100 0"; - primary_element.style.strokeDashoffset = "0"; + const primary_element = document.querySelector('#loading_content #primary') - // mark transaction(s) as completed - document.querySelectorAll("#bordered_content .transaction-item").forEach(t => { - t.querySelector('.status').classList.add('success') - t.querySelector('.status').innerHTML = '' - }) + primary_element.style.transition = "stroke-dasharray 1.2s ease-out, stroke-dashoffset 1.2s ease-out"; + primary_element.style.strokeDasharray = "100 0"; + primary_element.style.strokeDashoffset = "0"; + + // mark transaction(s) as completed + document.querySelectorAll("#bordered_content .transaction-item").forEach(t => { + t.querySelector('.status').classList.add('success') + t.querySelector('.status').innerHTML = '' + }) - setTimeout(() => { - content_done_el.classList.add('active') + setTimeout(() => { + content_done_el.classList.add('active') - content_done_text_el.innerHTML = 'Transaction Completed' - if(params?.tab_id) { - content_done_desc_el.innerHTML = 'You can close this window and continue with the application that made the request.' - } else { - content_done_desc_el.innerHTML = 'Your transaction details are provided below.' - } + content_done_text_el.innerHTML = 'Transaction Completed' + if(params?.tab_id) { + content_done_desc_el.innerHTML = 'You can close this window and continue with the application that made the request.' + } else { + content_done_desc_el.innerHTML = 'Your transaction details are provided below.' + } - content_init_text_el.classList.add('d-none') - content_init_desc_el.classList.add('d-none') - }, 600) + content_init_text_el.classList.add('d-none') + content_init_desc_el.classList.add('d-none') + }, 600) - setTimeout(() => { - checkmark_el.classList.add('show') - }, 800) + setTimeout(() => { + checkmark_el.classList.add('show') + }, 800) - setTimeout(() => { - loading_el.classList.add('done') - }, 1200) + setTimeout(() => { + loading_el.classList.add('done') + }, 1200) - prepareSummary() - } + prepareSummary() + } - const showProcessingFail = () => { - screen.unFreezeRoot() + const showProcessingFail = () => { + screen.unFreezeRoot() - const loading_el = document.querySelector("#loading_content") - const failed_el = loading_el.querySelector("#failed") - const content_done_el = loading_el.querySelector("#content .done") - const content_init_text_el = loading_el.querySelector("#content .init .text") - const content_init_desc_el = loading_el.querySelector("#content .init .desc") - const content_done_text_el = loading_el.querySelector("#content .done .text") - const content_done_desc_el = loading_el.querySelector("#content .done .desc") + const loading_el = document.querySelector("#loading_content") + const failed_el = loading_el.querySelector("#failed") + const content_done_el = loading_el.querySelector("#content .done") + const content_init_text_el = loading_el.querySelector("#content .init .text") + const content_init_desc_el = loading_el.querySelector("#content .init .desc") + const content_done_text_el = loading_el.querySelector("#content .done .text") + const content_done_desc_el = loading_el.querySelector("#content .done .desc") - const primary_element = document.querySelector('#loading_content #primary') + const primary_element = document.querySelector('#loading_content #primary') - primary_element.style.transition = "stroke 1.2s ease-out, stroke-dasharray 1.2s ease-out, stroke-dashoffset 1.2s ease-out"; - primary_element.style.strokeDasharray = "100 0"; - primary_element.style.strokeDashoffset = "0"; - primary_element.style.stroke = "#CC2400"; + primary_element.style.transition = "stroke 1.2s ease-out, stroke-dasharray 1.2s ease-out, stroke-dashoffset 1.2s ease-out"; + primary_element.style.strokeDasharray = "100 0"; + primary_element.style.strokeDashoffset = "0"; + primary_element.style.stroke = "#CC2400"; - setTimeout(() => { - content_done_el.classList.add('active') + setTimeout(() => { + content_done_el.classList.add('active') - content_done_text_el.innerHTML = 'Transaction Failed' - content_done_desc_el.innerHTML = 'Your transaction was not successful.' + content_done_text_el.innerHTML = 'Transaction Failed' + content_done_desc_el.innerHTML = 'Your transaction was not successful.' - content_init_text_el.classList.add('d-none') - content_init_desc_el.classList.add('d-none') - }, 600) + content_init_text_el.classList.add('d-none') + content_init_desc_el.classList.add('d-none') + }, 600) - setTimeout(() => { - failed_el.classList.add('show') - }, 800) + setTimeout(() => { + failed_el.classList.add('show') + }, 800) - setTimeout(() => { - loading_el.classList.add('done') - }, 1200) + setTimeout(() => { + loading_el.classList.add('done') + }, 1200) - // show alert - document.querySelector('#error_alert').classList.remove('d-none') + // show alert + document.querySelector('#error_alert').classList.remove('d-none') - prepareSummary() - } + prepareSummary() + } - const prepareSummary = () => { - // hide app info - document.querySelector('#app_info').classList.remove('d-flex') - document.querySelector('#app_info').classList.add('d-none') + const prepareSummary = () => { + // hide app info + document.querySelector('#app_info').classList.remove('d-flex') + document.querySelector('#app_info').classList.add('d-none') - // expand transactions - document.querySelector('#transactions').style.height = 'calc(100% - 30px)' + // expand transactions + document.querySelector('#transactions').style.height = 'calc(100% - 30px)' - anime({ - targets: '#bordered_content .footer', - translateY: 200, - duration: 1200, - delay: 0 - }); + anime({ + targets: '#bordered_content .footer', + translateY: 200, + duration: 1200, + delay: 0 + }); - // remove password - document.querySelector('#password').value = '' + // remove password + document.querySelector('#password').value = '' - screen.setParam('#heading h1', 'Transaction Summary') - } + screen.setParam('#heading h1', 'Transaction Summary') + } - const hideProcessing = (delay = 800) => { - setTimeout(() => { - const loading_el = document.querySelector("#loading_content") + const hideProcessing = (delay = 800) => { + setTimeout(() => { + const loading_el = document.querySelector("#loading_content") - loading_el.classList.remove('active') - screen.unFreezeRoot() - }, delay) - } + loading_el.classList.remove('active') + screen.unFreezeRoot() + }, delay) + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index 0ca6cee..497f798 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -1,14 +1,12 @@ import { resetElement, updateElement } from "../screens.js"; import { sendMessage } from "../messaging.js"; import { - formatAddress, - getCurrentBrowser, - isFirefox, - isIOs, - isMacOs, - isSafari, isStandaloneApp, - isWindows, - sleep + formatAddress, + getCurrentBrowser, + isMacOs, + isStandaloneApp, + isWindows, + sleep } from "@bitgreen/browser-wallet-utils"; import {AccountStore, CacheStore, NetworkStore} from "@bitgreen/browser-wallet-core"; import { hideNotification } from "../notifications.js"; @@ -59,449 +57,449 @@ let logged_in = false let lock_timeout = null class Screen { - initialized = false - tab = false - - options = { - element: '#root', - template_name: 'init', - template_params: {}, - header: false, - footer: false, - login: true, - auto_load: true, - smooth_load: false, - freeze_root: false, - freeze_root_delay: 0, - win_width: 400, - win_height: 600 - } - - constructor(opts) { - this.header_el = document.querySelector('#header') - this.footer_el = document.querySelector('#main_footer') - - this.options = { - ...this.options, - ...opts - } - } + initialized = false + tab = false - async init() { - logged_in = await this.fastCheckLogin(true) + options = { + element: '#root', + template_name: 'init', + template_params: {}, + header: false, + footer: false, + login: true, + auto_load: true, + smooth_load: false, + freeze_root: false, + freeze_root_delay: 0, + win_width: 400, + win_height: 600 + } - this.options.login ? await showLogin(true) : hideLogin(true) + constructor(opts) { + this.header_el = document.querySelector('#header') + this.footer_el = document.querySelector('#main_footer') - this.resizeTo(this.options.win_width, this.options.win_height) + this.options = { + ...this.options, + ...opts + } + } - this.options.freeze_root ? this.freezeRoot() : this.unFreezeRoot + async init() { + logged_in = await this.fastCheckLogin(true) - this.options.header ? this.showHeader() : this.hideHeader() - this.options.footer ? this.showFooter() : this.hideFooter() + this.options.login ? await showLogin(true) : hideLogin(true) - if(this.options.smooth_load) this.resetRoot() - if(this.options.auto_load) await this.set() && hideInit() - if(this.options.tab_id && this.options.message_id) await this.loadTab() + this.resizeTo(this.options.win_width, this.options.win_height) - setTimeout(this.unFreezeRoot, this.options.freeze_root_delay) + this.options.freeze_root ? this.freezeRoot() : this.unFreezeRoot - this.initialized = true + this.options.header ? this.showHeader() : this.hideHeader() + this.options.footer ? this.showFooter() : this.hideFooter() - return this.initialized - } + if(this.options.smooth_load) this.resetRoot() + if(this.options.auto_load) await this.set() && hideInit() + if(this.options.tab_id && this.options.message_id) await this.loadTab() - async fastCheckLogin(init = true) { - if(init) { - clearTimeout(lock_timeout) - } + setTimeout(this.unFreezeRoot, this.options.freeze_root_delay) - // refresh status every 10 seconds - lock_timeout = setTimeout(async() => { - logged_in = await this.fastCheckLogin(false) + this.initialized = true - if(this.options.login && !logged_in) await showLogin() - }, 10000) + return this.initialized + } - return await sendMessage('fast_check_login') + async fastCheckLogin(init = true) { + if(init) { + clearTimeout(lock_timeout) } - resizeTo(width, height) { - if(isWindows()) { - // Add 16px width and 39px height on windows. - width += 16 - height += 39 - } else if(isMacOs()) { - // Add 39px height on macOS. - height += 39 - } - - window.resizeTo(width, height) // Set window height - } + // refresh status every 10 seconds + lock_timeout = setTimeout(async() => { + logged_in = await this.fastCheckLogin(false) - resetRoot() { - document.querySelector('#root').classList.remove('init') - } + if(this.options.login && !logged_in) await showLogin() + }, 10000) - showRoot() { - document.querySelector('#root').classList.add('init') - } + return await sendMessage('fast_check_login') + } - freezeRoot() { - document.querySelector('#root').classList.add('freeze') + resizeTo(width, height) { + if(isWindows()) { + // Add 16px width and 39px height on windows. + width += 16 + height += 39 + } else if(isMacOs()) { + // Add 39px height on macOS. + height += 39 } - unFreezeRoot() { - document.querySelector('#root').classList.remove('freeze') - } + window.resizeTo(width, height) // Set window height + } - showInit() { - document.querySelector("#init_screen").classList.remove("inactive") - } + resetRoot() { + document.querySelector('#root').classList.remove('init') + } - async set(element = this.options.element, template_name = this.options.template_name, params = this.options.template_params) { - await updateElement(element, template_name, params, false) + showRoot() { + document.querySelector('#root').classList.add('init') + } - if(element === '#root') this.showRoot() + freezeRoot() { + document.querySelector('#root').classList.add('freeze') + } - return true - } + unFreezeRoot() { + document.querySelector('#root').classList.remove('freeze') + } - async append(element, template_name, params) { - return await updateElement(element, template_name, params, true) - } + showInit() { + document.querySelector("#init_screen").classList.remove("inactive") + } - async reset(element) { - return await resetElement(element) - } + async set(element = this.options.element, template_name = this.options.template_name, params = this.options.template_params) { + await updateElement(element, template_name, params, false) - setParam(element, value) { - document.querySelector(element).innerHTML = value - } + if(element === '#root') this.showRoot() - setListeners(options = []) { - for(let option of options) { - if(option.element) { - for(let element of document.querySelectorAll(option.element)) { - this.setListener(element, option.listener, option.type) - } - } - } - } + return true + } - setListener(element, method, type = 'click') { - return element.addEventListener(type, method) - } + async append(element, template_name, params) { + return await updateElement(element, template_name, params, true) + } - showHeader() { - if(!this.header_el.classList.contains('visible')) { - anime({ - targets: '#header', - duration: 400, - translateY: [-60, 0], - opacity: 1, - easing: 'linear', - delay: !this.header_el.classList.contains('init') ? 400 : 0 - }); - } + async reset(element) { + return await resetElement(element) + } - this.header_el.classList.add('visible') - this.header_el.classList.add('init') - } + setParam(element, value) { + document.querySelector(element).innerHTML = value + } - hideHeader() { - if(this.header_el.classList.contains('visible')) { - anime({ - targets: '#header', - duration: 400, - translateY: [0, -60], - opacity: [1, 0], - easing: 'linear', - delay: 0 - }); + setListeners(options = []) { + for(let option of options) { + if(option.element) { + for(let element of document.querySelectorAll(option.element)) { + this.setListener(element, option.listener, option.type) } + } + } + } + + setListener(element, method, type = 'click') { + return element.addEventListener(type, method) + } + + showHeader() { + if(!this.header_el.classList.contains('visible')) { + anime({ + targets: '#header', + duration: 400, + translateY: [-60, 0], + opacity: 1, + easing: 'linear', + delay: !this.header_el.classList.contains('init') ? 400 : 0 + }); + } + + this.header_el.classList.add('visible') + this.header_el.classList.add('init') + } + + hideHeader() { + if(this.header_el.classList.contains('visible')) { + anime({ + targets: '#header', + duration: 400, + translateY: [0, -60], + opacity: [1, 0], + easing: 'linear', + delay: 0 + }); + } + + this.header_el.classList.remove('visible') + } + + showFooter() { + const current_screen = currentScreen() - this.header_el.classList.remove('visible') - } - - showFooter() { - const current_screen = currentScreen() - - if(!logged_in) return false - - if(!this.footer_el.classList.contains('visible') && !this.footer_el.classList.contains('disabled')) { - anime({ - targets: '#main_footer', - duration: 300, - translateY: [60, 0], - opacity: 1, - easing: 'linear', - delay: 400 - }); - } + if(!logged_in) return false - for(let element of this.footer_el.querySelectorAll('.item')) { - element.classList.remove('active') + if(!this.footer_el.classList.contains('visible') && !this.footer_el.classList.contains('disabled')) { + anime({ + targets: '#main_footer', + duration: 300, + translateY: [60, 0], + opacity: 1, + easing: 'linear', + delay: 400 + }); + } - if(element.id === 'go_' + current_screen.name) { - element.classList.add('active') - } + for(let element of this.footer_el.querySelectorAll('.item')) { + element.classList.remove('active') - if(element.id === 'go_stakingHomeScreen' && current_screen.name.includes('staking')) { - element.classList.add('active') - } - } + if(element.id === 'go_' + current_screen.name) { + element.classList.add('active') + } - this.footer_el.classList.add('visible') + if(element.id === 'go_stakingHomeScreen' && current_screen.name.includes('staking')) { + element.classList.add('active') + } } - hideFooter() { - if(this.footer_el.classList.contains('visible')) { - anime({ - targets: '#main_footer', - duration: 300, - translateY: [0, 120], - opacity: [1, 0], - easing: 'linear', - delay: 0 - }); - } - - this.footer_el.classList.remove('visible') - } + this.footer_el.classList.add('visible') + } - hideInit() { - setTimeout(function() { - document.querySelector("#init_screen").classList.add("fade-out"); - }, 200); - setTimeout(function() { - document.querySelector("#init_screen").classList.add("inactive") - document.querySelector("#init_screen").classList.remove("fade-out") - }, 400) + hideFooter() { + if(this.footer_el.classList.contains('visible')) { + anime({ + targets: '#main_footer', + duration: 300, + translateY: [0, 120], + opacity: [1, 0], + easing: 'linear', + delay: 0 + }); } - async loadTab() { - this.options.tab_id = parseInt(this.options.tab_id) - this.options.message_id = parseFloat(this.options.message_id) + this.footer_el.classList.remove('visible') + } - if(!this.options.tab_id || !this.options.message_id) { - return false - } + hideInit() { + setTimeout(function() { + document.querySelector("#init_screen").classList.add("fade-out"); + }, 200); + setTimeout(function() { + document.querySelector("#init_screen").classList.add("inactive") + document.querySelector("#init_screen").classList.remove("fade-out") + }, 400) + } - this.tab = await current_browser.tabs.connect(this.options.tab_id, { name: 'PORT_CONTENT_RESOLVE=' + this.options.message_id }); + async loadTab() { + this.options.tab_id = parseInt(this.options.tab_id) + this.options.message_id = parseFloat(this.options.message_id) - return this.tab + if(!this.options.tab_id || !this.options.message_id) { + return false } - sendMessageToTab(response) { - try { - this.tab.postMessage({ - id: this.options.message_id, - response - }) + this.tab = await current_browser.tabs.connect(this.options.tab_id, { name: 'PORT_CONTENT_RESOLVE=' + this.options.message_id }); - return true - } catch(e) { - return false - } + return this.tab + } + + sendMessageToTab(response) { + try { + this.tab.postMessage({ + id: this.options.message_id, + response + }) + + return true + } catch(e) { + return false } + } } const freezeRoot = () => { - document.querySelector('#root').classList.add('freeze') + document.querySelector('#root').classList.add('freeze') } const unFreezeRoot = () => { - document.querySelector('#root').classList.remove('freeze') + document.querySelector('#root').classList.remove('freeze') } const showInit = (locked = false) => { - document.querySelector("#init_screen").classList.remove("inactive") - document.querySelector("#init_screen").classList.add("fade-in") + document.querySelector("#init_screen").classList.remove("inactive") + document.querySelector("#init_screen").classList.add("fade-in") - if(locked) { - document.querySelector("#init_screen").classList.add("locked") - } + if(locked) { + document.querySelector("#init_screen").classList.add("locked") + } - document.querySelector("#init_screen").classList.add("loaded") + document.querySelector("#init_screen").classList.add("loaded") } const hideInit = (unlocked = false) => { - const isLoaded = document.querySelector("#init_screen").classList.contains("loaded") - - if(unlocked || !document.querySelector("#init_screen").classList.contains("locked")) { - setTimeout(function() { - document.querySelector("#init_screen").classList.remove("fade-in") - document.querySelector("#init_screen").classList.add("fade-out"); - }, unlocked && isLoaded ? 0 : 300); - setTimeout(function() { - document.querySelector("#init_screen").classList.add("inactive") - document.querySelector("#init_screen").classList.remove("fade-out") - }, unlocked && isLoaded ? 300 : 600) - } + const isLoaded = document.querySelector("#init_screen").classList.contains("loaded") + + if(unlocked || !document.querySelector("#init_screen").classList.contains("locked")) { + setTimeout(function() { + document.querySelector("#init_screen").classList.remove("fade-in") + document.querySelector("#init_screen").classList.add("fade-out"); + }, unlocked && isLoaded ? 0 : 300); + setTimeout(function() { + document.querySelector("#init_screen").classList.add("inactive") + document.querySelector("#init_screen").classList.remove("fade-out") + }, unlocked && isLoaded ? 300 : 600) + } } const checkLogin = async() => { - return await sendMessage('check_login') + return await sendMessage('check_login') } const showLogin = async(instant = false, force = false) => { - if(logged_in && !force) { - return hideLogin() - } - - logged_in = false - - if(document.querySelector("#login_screen").classList.contains('inactive')) { - document.querySelector("#login_screen").classList.remove('inactive') - document.querySelector("#login_screen").removeAttribute('style'); - - anime({ - targets: '.separator', - easing: 'linear', - duration: 300, - delay: 300, - translateY: [20, 0], - opacity: [0, 1] - }); - - anime({ - targets: '.browser-wallet', - easing: 'linear', - duration: 300, - delay: 400, - translateX: [-30, 0], - opacity: [0, 1] - }); - - anime({ - targets: '.footer-only', - easing: 'linear', - duration: 400, - delay: 500, - opacity: [0, 1] - }); - - anime({ - targets: '#login_option', - easing: 'linear', - duration: 300, - delay: 600, - translateY: [-20, 0], - opacity: [0, 1] - }); - - if(!instant) { - anime({ - targets: '#login_screen', - easing: 'linear', - duration: 200, - opacity: [0, 1] - }); - } - } + if(logged_in && !force) { + return hideLogin() + } + + logged_in = false + + if(document.querySelector("#login_screen").classList.contains('inactive')) { + document.querySelector("#login_screen").classList.remove('inactive') + document.querySelector("#login_screen").removeAttribute('style'); + + anime({ + targets: '.separator', + easing: 'linear', + duration: 300, + delay: 300, + translateY: [20, 0], + opacity: [0, 1] + }); + + anime({ + targets: '.browser-wallet', + easing: 'linear', + duration: 300, + delay: 400, + translateX: [-30, 0], + opacity: [0, 1] + }); + + anime({ + targets: '.footer-only', + easing: 'linear', + duration: 400, + delay: 500, + opacity: [0, 1] + }); + + anime({ + targets: '#login_option', + easing: 'linear', + duration: 300, + delay: 600, + translateY: [-20, 0], + opacity: [0, 1] + }); - setTimeout(() => { - if(!isStandaloneApp()) document.querySelector("#login_screen #password").focus(); - }, 100) + if(!instant) { + anime({ + targets: '#login_screen', + easing: 'linear', + duration: 200, + opacity: [0, 1] + }); + } + } + + setTimeout(() => { + if(!isStandaloneApp()) document.querySelector("#login_screen #password").focus(); + }, 100) } const doLogin = async(password) => { - const result = await sendMessage('unlock_wallet', { - password - }) + const result = await sendMessage('unlock_wallet', { + password + }) - if(result) { - logged_in = true - } + if(result) { + logged_in = true + } - return result + return result } const hideLogin = (instant = false) => { - if(!instant) { - document.querySelector("#login_screen").classList.add("fade-out"); - - setTimeout(() => { - document.querySelector("#login_screen").classList.add("inactive") - document.querySelector("#login_screen").classList.remove("fade-out") - document.querySelector("#login_screen #password").value = ''; // remove password from a field - }, 400); - } else { - document.querySelector("#login_screen").classList.add("inactive") - document.querySelector("#login_screen #password").value = ''; // remove password from a field - } + if(!instant) { + document.querySelector("#login_screen").classList.add("fade-out"); + + setTimeout(() => { + document.querySelector("#login_screen").classList.add("inactive") + document.querySelector("#login_screen").classList.remove("fade-out") + document.querySelector("#login_screen #password").value = ''; // remove password from a field + }, 400); + } else { + document.querySelector("#login_screen").classList.add("inactive") + document.querySelector("#login_screen #password").value = ''; // remove password from a field + } } const enableFooter = () => { - const footer_el = document.querySelector('#main_footer') - - if(footer_el.classList.contains('disabled') && footer_el.classList.contains('visible')) { - anime({ - targets: '#main_footer', - duration: 300, - translateY: [60, 0], - opacity: 1, - easing: 'linear', - delay: 400 - }); - } - - footer_el.classList.remove('disabled') + const footer_el = document.querySelector('#main_footer') + + if(footer_el.classList.contains('disabled') && footer_el.classList.contains('visible')) { + anime({ + targets: '#main_footer', + duration: 300, + translateY: [60, 0], + opacity: 1, + easing: 'linear', + delay: 400 + }); + } + + footer_el.classList.remove('disabled') } const disableFooter = () => { - const footer_el = document.querySelector('#main_footer') - - if(!footer_el.classList.contains('disabled')) { - anime({ - targets: '#main_footer', - duration: 300, - translateY: [0, 120], - opacity: [1, 0], - easing: 'linear', - delay: 0 - }); - } - - footer_el.classList.add('disabled') + const footer_el = document.querySelector('#main_footer') + + if(!footer_el.classList.contains('disabled')) { + anime({ + targets: '#main_footer', + duration: 300, + translateY: [0, 120], + opacity: [1, 0], + easing: 'linear', + delay: 0 + }); + } + + footer_el.classList.add('disabled') } const screens = { - welcomeScreen, - walletScreen, - walletCreateScreen, - walletImportScreen, - walletConfirmScreen, - walletPasswordScreen, - walletFinishScreen, - walletBackupScreen, - accountManageScreen, - accountCreateScreen, - accountEditScreen, - dashboardScreen, - signInScreen, - assetAllScreen, - assetSendScreen, - assetReceiveScreen, - assetTransactionReviewScreen, - assetTransactionFinishScreen, - transactionHistoryScreen, - transactionDetailsScreen, - settingsScreen, - networkManageScreen, - networkCreateScreen, - extrinsicSendScreen, - tokenAllScreen, - tokenBBBScreen, - stakingHomeScreen, - stakingIntroScreen, - stakingCollatorsScreen, - stakingCollatorScreen, - kycStartScreen, - kycBasicScreen, - kycAdvancedScreen, - kycAccreditedScreen, - connectionErrorScreen + welcomeScreen, + walletScreen, + walletCreateScreen, + walletImportScreen, + walletConfirmScreen, + walletPasswordScreen, + walletFinishScreen, + walletBackupScreen, + accountManageScreen, + accountCreateScreen, + accountEditScreen, + dashboardScreen, + signInScreen, + assetAllScreen, + assetSendScreen, + assetReceiveScreen, + assetTransactionReviewScreen, + assetTransactionFinishScreen, + transactionHistoryScreen, + transactionDetailsScreen, + settingsScreen, + networkManageScreen, + networkCreateScreen, + extrinsicSendScreen, + tokenAllScreen, + tokenBBBScreen, + stakingHomeScreen, + stakingIntroScreen, + stakingCollatorsScreen, + stakingCollatorScreen, + kycStartScreen, + kycBasicScreen, + kycAdvancedScreen, + kycAccreditedScreen, + connectionErrorScreen } let screen_history = [] @@ -509,255 +507,255 @@ let active_screen = null let transitioning = false const goToScreen = async(name, params = {}, go_back = false, force = false) => { - if(!force) hideNotification() + if(!force) hideNotification() - // pause if still changing screen - if(transitioning && !force) return false - transitioning = true - setTimeout(() => { - transitioning = false - }, 600) + // pause if still changing screen + if(transitioning && !force) return false + transitioning = true + setTimeout(() => { + transitioning = false + }, 600) - if(typeof screens[name] !== 'function') { - console.warn(`Screen not found. [${name}]`) - return false - } + if(typeof screens[name] !== 'function') { + console.warn(`Screen not found. [${name}]`) + return false + } - if(active_screen?.name === name && !force) { - return false - } + if(active_screen?.name === name && !force) { + return false + } - if(!go_back && !force) { - screen_history.push({name, params}) - } + if(!go_back && !force) { + screen_history.push({name, params}) + } - active_screen = { - name, params - } + active_screen = { + name, params + } - if(!force) { - anime({ - targets: '#root', - opacity: [1, 0], - easing: 'easeInOutSine', - duration: 150 - }); - - anime({ - targets: '#root', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 1, - delay: 300 - }); - - await sleep(300) - } + if(!force) { + anime({ + targets: '#root', + opacity: [1, 0], + easing: 'easeInOutSine', + duration: 150 + }); - await screens[name](params) + anime({ + targets: '#root', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 1, + delay: 300 + }); - transitioning = false + await sleep(300) + } - return true + await screens[name](params) + + transitioning = false + + return true } const currentScreen = () => { - return screen_history[screen_history.length - 1] + return screen_history[screen_history.length - 1] } const updateCurrentParams = (params) => { - let current_screen = screen_history[screen_history.length - 1] - current_screen.params = { - ...current_screen.params, - ...params - } + let current_screen = screen_history[screen_history.length - 1] + current_screen.params = { + ...current_screen.params, + ...params + } } const goBackScreen = async() => { - screen_history.pop() + screen_history.pop() - const previous_screen = screen_history[screen_history.length - 1] + const previous_screen = screen_history[screen_history.length - 1] - if(previous_screen) { - return await goToScreen(previous_screen.name, previous_screen.params, true) - } else { - await clearHistory() - return await goToScreen('dashboardScreen') - } + if(previous_screen) { + return await goToScreen(previous_screen.name, previous_screen.params, true) + } else { + await clearHistory() + return await goToScreen('dashboardScreen') + } } const clearHistory = async() => { - // send response to page if any - for(const screen of screen_history) { - if(screen?.params?.message_id && screen?.params?.tab_id) { - const tab = await current_browser.tabs.connect(parseInt(screen.params.tab_id), { name: 'PORT_CONTENT_RESOLVE=' + screen.params.message_id }); - - try { - tab.postMessage({ - id: screen.params.message_id, - response: { - success: false, - status: 'expired', - error: 'Request expired.' - } - }) - } catch(e) { - // console.log(e) - } - } + // send response to page if any + for(const screen of screen_history) { + if(screen?.params?.message_id && screen?.params?.tab_id) { + const tab = await current_browser.tabs.connect(parseInt(screen.params.tab_id), { name: 'PORT_CONTENT_RESOLVE=' + screen.params.message_id }); + + try { + tab.postMessage({ + id: screen.params.message_id, + response: { + success: false, + status: 'expired', + error: 'Request expired.' + } + }) + } catch(e) { + // console.log(e) + } } - screen_history = [currentScreen()] - return true + } + screen_history = [currentScreen()] + return true } const reloadScreen = async() => { - const current_screen = currentScreen() + const current_screen = currentScreen() - if(current_screen) { - return await goToScreen(current_screen.name, current_screen.params, true, true) - } else { - return await goToScreen('dashboardScreen') - } + if(current_screen) { + return await goToScreen(current_screen.name, current_screen.params, true, true) + } else { + return await goToScreen('dashboardScreen') + } } const updateAccounts = async(current_account_id = null) => { - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + + if(current_account_id) { + await accounts_store.asyncSet('current', current_account_id) + } + + const accounts = await accounts_store.asyncAll() + const current_account = await accounts_store.current() + + const header_logo_el = document.querySelector("#header #top_logo"); + const accounts_modal_el = document.querySelector("#accounts_modal"); + const current_account_el = document.querySelector("#header #current_wallet"); + const go_copy_el = document.querySelector("#header #go_copy"); + + if(!current_account) { + header_logo_el.classList.add('full') + current_account_el.classList.add('hidden') + go_copy_el.classList.add('hidden') + + } else { + header_logo_el.classList.remove('full') + current_account_el.classList.remove('hidden') + go_copy_el.classList.remove('hidden') + } + + accounts_modal_el.querySelector('.address').innerHTML = formatAddress(current_account?.address, 16, 8) + + setTimeout(async() => { + await resetElement('#accounts_modal #wallet_list') + + for(const a of accounts) { + const account = a?.value + const account_id = a?.key + const account_jdenticon = jdenticon.toSvg(account.address,56) + const is_current = account_id?.toString() === current_account?.id?.toString() + const is_kyced = await cache_store.asyncGet('kyc_' + account.address) + + if(is_current) { + current_account_el.querySelector('.jdenticon .jdenticon-content').innerHTML = account_jdenticon + current_account_el.querySelector('.name').innerHTML = (account.name && account.name.length > 14) ? account.name.substring(0,14)+'...' : account.name + current_account_el.querySelector('.address').innerHTML = formatAddress(account?.address, 8, 8) + + if(is_kyced) { + current_account_el.querySelector('.kyc-status').classList.add('verified') + } else { + current_account_el.querySelector('.kyc-status').classList.remove('verified') + } - if(current_account_id) { - await accounts_store.asyncSet('current', current_account_id) - } + go_copy_el.dataset.address = account?.address; + accounts_modal_el.querySelector('#copy_address .btn').dataset.address = account?.address + + accounts_modal_el.querySelector('.title').innerHTML = (account.name && account.name.length > 14) ? account.name.substring(0,14)+'...' : account.name + accounts_modal_el.querySelector('.address').innerHTML = formatAddress(account?.address, 12, 8) - const accounts = await accounts_store.asyncAll() - const current_account = await accounts_store.current() + if(is_kyced) { + accounts_modal_el.querySelector('.kyc-status').classList.add('verified') + accounts_modal_el.querySelector('.kyc-status').classList.remove('unverified') + } else { + accounts_modal_el.querySelector('.kyc-status').classList.remove('verified') + accounts_modal_el.querySelector('.kyc-status').classList.add('unverified') + } - const header_logo_el = document.querySelector("#header #top_logo"); - const accounts_modal_el = document.querySelector("#accounts_modal"); - const current_account_el = document.querySelector("#header #current_wallet"); - const go_copy_el = document.querySelector("#header #go_copy"); + if(account_id?.toString() === 'main') { + accounts_modal_el.querySelector('.badge-primary').classList.remove('hidden') + } else { + accounts_modal_el.querySelector('.badge-primary').classList.add('hidden') + } + } - if(!current_account) { - header_logo_el.classList.add('full') - current_account_el.classList.add('hidden') - go_copy_el.classList.add('hidden') + const kyc_level = await cache_store.asyncGet('kyc_' + account.address) - } else { - header_logo_el.classList.remove('full') - current_account_el.classList.remove('hidden') - go_copy_el.classList.remove('hidden') + await updateElement('#accounts_modal #wallet_list', 'accounts/modal_item', { + account_id, + account_jdenticon, + account_name: (account.name && account.name.length > 10) ? account.name.substring(0,10)+'...' : account.name, + account_address: formatAddress(account?.address, 16, 8), + is_main: account_id?.toString() === 'main' ? '' : 'hidden', + is_current: is_current ? '' : 'hidden', + is_kyc_verified: kyc_level ? `verified verified-${kyc_level}` : 'unverified', + }, true) } - accounts_modal_el.querySelector('.address').innerHTML = formatAddress(current_account?.address, 16, 8) - - setTimeout(async() => { - await resetElement('#accounts_modal #wallet_list') - - for(const a of accounts) { - const account = a?.value - const account_id = a?.key - const account_jdenticon = jdenticon.toSvg(account.address,56) - const is_current = account_id?.toString() === current_account?.id?.toString() - const is_kyced = await cache_store.asyncGet('kyc_' + account.address) - - if(is_current) { - current_account_el.querySelector('.jdenticon .jdenticon-content').innerHTML = account_jdenticon - current_account_el.querySelector('.name').innerHTML = (account.name && account.name.length > 14) ? account.name.substring(0,14)+'...' : account.name - current_account_el.querySelector('.address').innerHTML = formatAddress(account?.address, 8, 8) - - if(is_kyced) { - current_account_el.querySelector('.kyc-status').classList.add('verified') - } else { - current_account_el.querySelector('.kyc-status').classList.remove('verified') - } - - go_copy_el.dataset.address = account?.address; - accounts_modal_el.querySelector('#copy_address .btn').dataset.address = account?.address - - accounts_modal_el.querySelector('.title').innerHTML = (account.name && account.name.length > 14) ? account.name.substring(0,14)+'...' : account.name - accounts_modal_el.querySelector('.address').innerHTML = formatAddress(account?.address, 12, 8) - - if(is_kyced) { - accounts_modal_el.querySelector('.kyc-status').classList.add('verified') - accounts_modal_el.querySelector('.kyc-status').classList.remove('unverified') - } else { - accounts_modal_el.querySelector('.kyc-status').classList.remove('verified') - accounts_modal_el.querySelector('.kyc-status').classList.add('unverified') - } - - if(account_id?.toString() === 'main') { - accounts_modal_el.querySelector('.badge-primary').classList.remove('hidden') - } else { - accounts_modal_el.querySelector('.badge-primary').classList.add('hidden') - } - } - - const kyc_level = await cache_store.asyncGet('kyc_' + account.address) - - await updateElement('#accounts_modal #wallet_list', 'accounts/modal_item', { - account_id, - account_jdenticon, - account_name: (account.name && account.name.length > 10) ? account.name.substring(0,10)+'...' : account.name, - account_address: formatAddress(account?.address, 16, 8), - is_main: account_id?.toString() === 'main' ? '' : 'hidden', - is_current: is_current ? '' : 'hidden', - is_kyc_verified: kyc_level ? `verified verified-${kyc_level}` : 'unverified', - }, true) - } - - document.querySelectorAll("#accounts_modal #wallet_list .wallet").forEach(w => { - w.addEventListener("click", async(e) => { - const account_id = e.target.dataset?.id + document.querySelectorAll("#accounts_modal #wallet_list .wallet").forEach(w => { + w.addEventListener("click", async(e) => { + const account_id = e.target.dataset?.id - accounts_modal_el.classList.remove('fade') - accounts_modal_el.classList.remove('show') + accounts_modal_el.classList.remove('fade') + accounts_modal_el.classList.remove('show') - await updateAccounts(account_id) + await updateAccounts(account_id) - await reloadScreen() - }) - }) - }, 200) + await reloadScreen() + }) + }) + }, 200) } const copyText = async(text) => { - await navigator.clipboard.writeText(text); + await navigator.clipboard.writeText(text); } const scrollToBottom = async(delay = 0) => { - if(delay > 0) await sleep(delay) - - const bodyElement = document.getElementsByTagName('body')[0] - const bodyElementOffset = bodyElement.offsetHeight; - const outerHeight = window.outerHeight - - const url_params = new URLSearchParams(window.location.search) - if(url_params.has('popup')) { - window.scrollTo(0, 1000) - } else { - window.scrollTo(0, outerHeight - bodyElementOffset + 90) - } + if(delay > 0) await sleep(delay) + + const bodyElement = document.getElementsByTagName('body')[0] + const bodyElementOffset = bodyElement.offsetHeight; + const outerHeight = window.outerHeight + + const url_params = new URLSearchParams(window.location.search) + if(url_params.has('popup')) { + window.scrollTo(0, 1000) + } else { + window.scrollTo(0, outerHeight - bodyElementOffset + 90) + } } export default Screen export { - screens, - showLogin, - doLogin, - hideLogin, - goToScreen, - goBackScreen, - reloadScreen, - updateCurrentParams, - currentScreen, - clearHistory, - updateAccounts, - copyText, - enableFooter, - disableFooter, - scrollToBottom, - freezeRoot, - unFreezeRoot, - showInit, - hideInit + screens, + showLogin, + doLogin, + hideLogin, + goToScreen, + goBackScreen, + reloadScreen, + updateCurrentParams, + currentScreen, + clearHistory, + updateAccounts, + copyText, + enableFooter, + disableFooter, + scrollToBottom, + freezeRoot, + unFreezeRoot, + showInit, + hideInit } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/kycAccredited.js b/packages/browser-wallet-ui/src/screens/kycAccredited.js index d7f304a..2c44e14 100644 --- a/packages/browser-wallet-ui/src/screens/kycAccredited.js +++ b/packages/browser-wallet-ui/src/screens/kycAccredited.js @@ -1,62 +1,58 @@ -import Screen, { copyText, goBackScreen, goToScreen, updateAccounts } from './index.js' -import {AccountStore, NetworkStore} from "@bitgreen/browser-wallet-core"; +import Screen, { copyText, goBackScreen } from './index.js' +import { AccountStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; +import { formatAddress } from "@bitgreen/browser-wallet-utils"; -import DOMPurify from 'dompurify'; import anime from "animejs"; -import {formatAddress, isFirefox, isSafari} from "@bitgreen/browser-wallet-utils"; export default async function kycAccreditedScreen(params) { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - template_params: { - equal_padding: 'equal-padding' - }, - header: false, - footer: false - }) - await screen.init() - - const account_id = params?.account_id - const kyc_level = params?.kyc_level - - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const account = await accounts_store.asyncGet(account_id) - const current_network = await networks_store.current() - - await screen.set('#heading', 'kyc/heading', { - account_name: account?.name, - current_account_address: formatAddress(account?.address, 16, 8) - }) - - await screen.set('#bordered_content', 'kyc/accredited', { - account_id, - account_address: account?.address, - derivation_path: account_id !== 'main' ? account_id : '' - }) - - await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#heading #copy_address', - listener: async() => { - await copyText(account.address) - await showNotification('Account address copied to clipboard.', 'info', 2000) - } - } - ]) + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + template_params: { + equal_padding: 'equal-padding' + }, + header: false, + footer: false + }) + await screen.init() + + const account_id = params?.account_id + + const accounts_store = new AccountStore() + const account = await accounts_store.asyncGet(account_id) + + await screen.set('#heading', 'kyc/heading', { + account_name: account?.name, + current_account_address: formatAddress(account?.address, 16, 8) + }) + + await screen.set('#bordered_content', 'kyc/accredited', { + account_id, + account_address: account?.address, + derivation_path: account_id !== 'main' ? account_id : '' + }) + + await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#heading #copy_address', + listener: async() => { + await copyText(account.address) + await showNotification('Account address copied to clipboard.', 'info', 2000) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/kycAdvanced.js b/packages/browser-wallet-ui/src/screens/kycAdvanced.js index 4c718ec..a521ecd 100644 --- a/packages/browser-wallet-ui/src/screens/kycAdvanced.js +++ b/packages/browser-wallet-ui/src/screens/kycAdvanced.js @@ -1,77 +1,76 @@ -import Screen, { copyText, goBackScreen, goToScreen, updateAccounts } from './index.js' -import {AccountStore, NetworkStore} from "@bitgreen/browser-wallet-core"; +import Screen, { copyText, goBackScreen } from './index.js' +import { AccountStore, NetworkStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; +import {formatAddress, isFirefox, isSafari} from "@bitgreen/browser-wallet-utils"; -import DOMPurify from 'dompurify'; import anime from "animejs"; -import {formatAddress, isFirefox, isSafari} from "@bitgreen/browser-wallet-utils"; export default async function kycAdvancedScreen(params) { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - template_params: { - equal_padding: 'equal-padding' - }, - header: false, - footer: false - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + template_params: { + equal_padding: 'equal-padding' + }, + header: false, + footer: false + }) + await screen.init() - const account_id = params?.account_id - const kyc_level = params?.kyc_level + const account_id = params?.account_id + const kyc_level = params?.kyc_level - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const account = await accounts_store.asyncGet(account_id) - const current_network = await networks_store.current() + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const account = await accounts_store.asyncGet(account_id) + const current_network = await networks_store.current() - await screen.set('#heading', 'kyc/heading', { - account_name: account?.name, - current_account_address: formatAddress(account?.address, 16, 8) - }) + await screen.set('#heading', 'kyc/heading', { + account_name: account?.name, + current_account_address: formatAddress(account?.address, 16, 8) + }) - await screen.set('#bordered_content', 'kyc/advanced', { - account_id, - account_address: account?.address, - derivation_path: account_id !== 'main' ? account_id : '', - kyc_level: kyc_level - }) + await screen.set('#bordered_content', 'kyc/advanced', { + account_id, + account_address: account?.address, + derivation_path: account_id !== 'main' ? account_id : '', + kyc_level: kyc_level + }) - await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') + await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#heading #copy_address', - listener: async() => { - await copyText(account.address) - await showNotification('Account address copied to clipboard.', 'info', 2000) - } - }, - { - element: '#root #go_kyc_start', - listener: async() => { - const current_browser = (isFirefox() || isSafari()) ? browser : chrome + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#heading #copy_address', + listener: async() => { + await copyText(account.address) + await showNotification('Account address copied to clipboard.', 'info', 2000) + } + }, + { + element: '#root #go_kyc_start', + listener: async() => { + const current_browser = (isFirefox() || isSafari()) ? browser : chrome - const url = `${current_network.api_endpoint}/kyc/start?address=${account.address}&state=wallet&type=accredited`; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = `${current_network.api_endpoint}/kyc/start?address=${account.address}&state=wallet&type=accredited`; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - current_browser.tabs.create({ url: result.url }) - } - } - ]) + current_browser.tabs.create({ url: result.url }) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/kycBasic.js b/packages/browser-wallet-ui/src/screens/kycBasic.js index 09b5c50..4ada5dc 100644 --- a/packages/browser-wallet-ui/src/screens/kycBasic.js +++ b/packages/browser-wallet-ui/src/screens/kycBasic.js @@ -1,75 +1,74 @@ -import Screen, { copyText, goBackScreen, goToScreen, updateAccounts } from './index.js' -import {AccountStore, NetworkStore} from "@bitgreen/browser-wallet-core"; +import Screen, { copyText, goBackScreen } from './index.js' +import { AccountStore, NetworkStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; +import {formatAddress, isFirefox, isSafari} from "@bitgreen/browser-wallet-utils"; -import DOMPurify from 'dompurify'; import anime from "animejs"; -import {formatAddress, isFirefox, isSafari} from "@bitgreen/browser-wallet-utils"; export default async function kycBasicScreen(params) { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - template_params: { - equal_padding: 'equal-padding' - }, - header: false, - footer: false - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + template_params: { + equal_padding: 'equal-padding' + }, + header: false, + footer: false + }) + await screen.init() - const account_id = params?.account_id + const account_id = params?.account_id - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const account = await accounts_store.asyncGet(account_id) - const current_network = await networks_store.current() + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const account = await accounts_store.asyncGet(account_id) + const current_network = await networks_store.current() - await screen.set('#heading', 'kyc/heading', { - account_name: account?.name, - current_account_address: formatAddress(account?.address, 16, 8) - }) + await screen.set('#heading', 'kyc/heading', { + account_name: account?.name, + current_account_address: formatAddress(account?.address, 16, 8) + }) - await screen.set('#bordered_content', 'kyc/basic', { - account_id, - account_address: account?.address, - derivation_path: account_id !== 'main' ? account_id : '' - }) + await screen.set('#bordered_content', 'kyc/basic', { + account_id, + account_address: account?.address, + derivation_path: account_id !== 'main' ? account_id : '' + }) - await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') + await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#heading #copy_address', - listener: async() => { - await copyText(account.address) - await showNotification('Account address copied to clipboard.', 'info', 2000) - } - }, - { - element: '#root #go_kyc_start', - listener: async() => { - const current_browser = (isFirefox() || isSafari()) ? browser : chrome + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#heading #copy_address', + listener: async() => { + await copyText(account.address) + await showNotification('Account address copied to clipboard.', 'info', 2000) + } + }, + { + element: '#root #go_kyc_start', + listener: async() => { + const current_browser = (isFirefox() || isSafari()) ? browser : chrome - const url = `${current_network.api_endpoint}/kyc/start?address=${account.address}&state=wallet&type=accredited`; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = `${current_network.api_endpoint}/kyc/start?address=${account.address}&state=wallet&type=accredited`; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - current_browser.tabs.create({ url: result.url }) - } - } - ]) + current_browser.tabs.create({ url: result.url }) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/kycStart.js b/packages/browser-wallet-ui/src/screens/kycStart.js index 92adc48..89a2c86 100644 --- a/packages/browser-wallet-ui/src/screens/kycStart.js +++ b/packages/browser-wallet-ui/src/screens/kycStart.js @@ -1,78 +1,75 @@ -import Screen, { copyText, goBackScreen, goToScreen, updateAccounts } from './index.js' +import Screen, { copyText, goBackScreen } from './index.js' import { AccountStore, CacheStore, NetworkStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; +import { formatAddress, isFirefox, isSafari } from "@bitgreen/browser-wallet-utils"; -import DOMPurify from 'dompurify'; import anime from "animejs"; -import { formatAddress, isFirefox, isSafari } from "@bitgreen/browser-wallet-utils"; export default async function kycStartScreen(params) { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - template_params: { - equal_padding: 'equal-padding' - }, - header: false, - footer: false - }) - await screen.init() - - const account_id = params?.account_id + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + template_params: { + equal_padding: 'equal-padding' + }, + header: false, + footer: false + }) + await screen.init() - const accounts_store = new AccountStore() - const networks_store = new NetworkStore() - const current_network = await networks_store.current() - const cache_store = new CacheStore(current_network) - const account = await accounts_store.asyncGet(account_id) + const account_id = params?.account_id - const is_kyced = await cache_store.asyncGet('kyc_' + account.address) + const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const current_network = await networks_store.current() + const cache_store = new CacheStore(current_network) + const account = await accounts_store.asyncGet(account_id) - await screen.set('#heading', 'kyc/heading', { - account_name: account?.name, - current_account_address: formatAddress(account?.address, 16, 8) - }) + await screen.set('#heading', 'kyc/heading', { + account_name: account?.name, + current_account_address: formatAddress(account?.address, 16, 8) + }) - await screen.set('#bordered_content', 'kyc/start', { - account_id, - account_address: account?.address, - derivation_path: account_id !== 'main' ? account_id : '' - }) + await screen.set('#bordered_content', 'kyc/start', { + account_id, + account_address: account?.address, + derivation_path: account_id !== 'main' ? account_id : '' + }) - await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') + await screen.set('#bordered_content .footer .fractal-logo', 'kyc/fractal') - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#heading #copy_address', - listener: async() => { - await copyText(account.address) - await showNotification('Account address copied to clipboard.', 'info', 2000, 58) - } - }, - { - element: '#root #go_kyc_start', - listener: async() => { - const current_browser = (isFirefox() || isSafari()) ? browser : chrome + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#heading #copy_address', + listener: async() => { + await copyText(account.address) + await showNotification('Account address copied to clipboard.', 'info', 2000, 58) + } + }, + { + element: '#root #go_kyc_start', + listener: async() => { + const current_browser = (isFirefox() || isSafari()) ? browser : chrome - const url = `${current_network.api_endpoint}/kyc/start?address=${account.address}&state=wallet`; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = `${current_network.api_endpoint}/kyc/start?address=${account.address}&state=wallet`; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - current_browser.tabs.create({ url: result.url }) - } - } - ]) + current_browser.tabs.create({ url: result.url }) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/networkCreate.js b/packages/browser-wallet-ui/src/screens/networkCreate.js index e797ad7..cf5822e 100644 --- a/packages/browser-wallet-ui/src/screens/networkCreate.js +++ b/packages/browser-wallet-ui/src/screens/networkCreate.js @@ -6,110 +6,110 @@ import { showNotification } from "../notifications.js"; import DOMPurify from "dompurify"; export default async function networkCreateScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: params?.network_id ? 'Edit Custom Network' : 'Add New Network' - }, - header: false, - footer: false - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: params?.network_id ? 'Edit Custom Network' : 'Add New Network' + }, + header: false, + footer: false + }) + await screen.init() - const network_id = params?.network_id - const network_store = new NetworkStore() - const network = await network_store.asyncGet(network_id) + const network_id = params?.network_id + const network_store = new NetworkStore() + const network = await network_store.asyncGet(network_id) - await screen.set('.content', 'network/create', { - network_id: network_id, - network_name: network?.name, - network_url: network?.url, - is_new: params?.network_id ? 'hidden' : '', - hide_delete: !params?.network_id ? 'hidden' : '', - }) + await screen.set('.content', 'network/create', { + network_id: network_id, + network_name: network?.name, + network_url: network?.url, + is_new: params?.network_id ? 'hidden' : '', + hide_delete: !params?.network_id ? 'hidden' : '', + }) - const delete_modal_el = document.querySelector("#delete_modal") - const network_name_el = document.querySelector("#network_name") - const network_url_el = document.querySelector("#network_url") - const switch_network_el = document.querySelector("#switch_to_this") + const delete_modal_el = document.querySelector("#delete_modal") + const network_name_el = document.querySelector("#network_name") + const network_url_el = document.querySelector("#network_url") + const switch_network_el = document.querySelector("#switch_to_this") - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #network_name, #root #network_url', - type: 'input', - listener: () => checkNetwork() - }, - { - element: '#root #save_network', - listener: async(e) => { - const network_name = DOMPurify.sanitize(network_name_el.value) - const network_url = DOMPurify.sanitize(network_url_el.value) - const switch_network = switch_network_el?.checked === true + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#root #network_name, #root #network_url', + type: 'input', + listener: () => checkNetwork() + }, + { + element: '#root #save_network', + listener: async(e) => { + const network_name = DOMPurify.sanitize(network_name_el.value) + const network_url = DOMPurify.sanitize(network_url_el.value) + const switch_network = switch_network_el?.checked === true - await sendMessage('save_network', { - network_id, - network_name, - network_url, - switch_network - }) + await sendMessage('save_network', { + network_id, + network_name, + network_url, + switch_network + }) - await goToScreen('networkManageScreen', {}, true) - await showNotification('Network saved successfully!', 'success') - } - }, - { - element: '#delete_network', - listener: () => { - delete_modal_el.classList.add('fade') - delete_modal_el.classList.add('show') - } - }, - { - element: '#hide_modal', - listener: () => { - delete_modal_el.classList.remove('fade') - delete_modal_el.classList.remove('show') - } - }, - { - element: '#confirm_delete_network', - listener: async(e) => { - const network_id = e.target.dataset.id; + await goToScreen('networkManageScreen', {}, true) + await showNotification('Network saved successfully!', 'success') + } + }, + { + element: '#delete_network', + listener: () => { + delete_modal_el.classList.add('fade') + delete_modal_el.classList.add('show') + } + }, + { + element: '#hide_modal', + listener: () => { + delete_modal_el.classList.remove('fade') + delete_modal_el.classList.remove('show') + } + }, + { + element: '#confirm_delete_network', + listener: async(e) => { + const network_id = e.target.dataset.id; - network_store.remove(network_id) + network_store.remove(network_id) - await goToScreen('networkManageScreen', {}, true, true) - await showNotification('Network deleted successfully.', 'info') - } - } - ]) - - const isValidWssUrl = (string) => { - let url; + await goToScreen('networkManageScreen', {}, true, true) + await showNotification('Network deleted successfully.', 'info') + } + } + ]) - try { - url = new URL(string); - } catch (_) { - return false; - } + const isValidWssUrl = (string) => { + let url; - return url.protocol === "ws:" || url.protocol === "wss:"; + try { + url = new URL(string); + } catch (_) { + return false; } - const checkNetwork = () => { - const save_network_el = document.querySelector("#save_network") + return url.protocol === "ws:" || url.protocol === "wss:"; + } + + const checkNetwork = () => { + const save_network_el = document.querySelector("#save_network") - if(network_name_el?.value?.length === 0 || network_url_el?.value?.length === 0 || !isValidWssUrl(network_url_el?.value)) { - save_network_el.classList.add('disabled') - save_network_el.classList.remove('btn-primary') - } else { - save_network_el.classList.remove('disabled') - save_network_el.classList.add('btn-primary') - } + if(network_name_el?.value?.length === 0 || network_url_el?.value?.length === 0 || !isValidWssUrl(network_url_el?.value)) { + save_network_el.classList.add('disabled') + save_network_el.classList.remove('btn-primary') + } else { + save_network_el.classList.remove('disabled') + save_network_el.classList.add('btn-primary') } - checkNetwork() + } + checkNetwork() } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/networkManage.js b/packages/browser-wallet-ui/src/screens/networkManage.js index 1e76f86..64ba928 100644 --- a/packages/browser-wallet-ui/src/screens/networkManage.js +++ b/packages/browser-wallet-ui/src/screens/networkManage.js @@ -3,61 +3,60 @@ import { NetworkStore } from "@bitgreen/browser-wallet-core"; import anime from "animejs"; export default async function networkManageScreen() { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - header: false, - footer: true - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + header: false, + footer: true + }) + await screen.init() - await screen.set('#heading', 'network/manage/heading') - await screen.set('#bordered_content', 'network/manage/content') + await screen.set('#heading', 'network/manage/heading') + await screen.set('#bordered_content', 'network/manage/content') - const network_store = new NetworkStore() - const current_network = await network_store.current() - const all_networks = await network_store.asyncAll() + const network_store = new NetworkStore() + const all_networks = await network_store.asyncAll() - if(all_networks?.length < 1) { - await screen.append('#root #wallet_list', 'shared/alert', { - message: 'No custom networks added.', - alert_type: 'alert-info' - }) - } + if(all_networks?.length < 1) { + await screen.append('#root #wallet_list', 'shared/alert', { + message: 'No custom networks added.', + alert_type: 'alert-info' + }) + } - for(const n of all_networks) { - const network_id = n?.key - const network = n.value - await screen.append('#root #wallet_list', 'network/manage/list_item', { - network_id, - network_name: network.name, - network_url: network.url - }) - } + for(const n of all_networks) { + const network_id = n?.key + const network = n.value + await screen.append('#root #wallet_list', 'network/manage/list_item', { + network_id, + network_name: network.name, + network_url: network.url + }) + } - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); - screen.setListeners([ - { - element: '#heading #new_network', - listener: () => goToScreen('networkCreateScreen') - }, - { - element: '#heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #wallet_list .button-item', - listener: (e) => { - return goToScreen('networkCreateScreen', { - network_id: e.target.dataset?.id - }) - } - } - ]) + screen.setListeners([ + { + element: '#heading #new_network', + listener: () => goToScreen('networkCreateScreen') + }, + { + element: '#heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#root #wallet_list .button-item', + listener: (e) => { + return goToScreen('networkCreateScreen', { + network_id: e.target.dataset?.id + }) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/settings.js b/packages/browser-wallet-ui/src/screens/settings.js index 5f92d8c..b8fd8c1 100644 --- a/packages/browser-wallet-ui/src/screens/settings.js +++ b/packages/browser-wallet-ui/src/screens/settings.js @@ -1,126 +1,123 @@ import Screen, { goBackScreen, goToScreen, reloadScreen } from './index.js' import { AccountStore, NetworkStore, SettingsStore } from "@bitgreen/browser-wallet-core"; +import { getCurrentBrowser } from "@bitgreen/browser-wallet-utils"; import { sendMessage } from "../messaging.js"; - -import DOMPurify from "dompurify"; import { showNotification } from "../notifications.js"; -import {getCurrentBrowser, isFirefox, isIOs, isSafari} from "@bitgreen/browser-wallet-utils"; +import DOMPurify from "dompurify"; export default async function settingsScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Settings' - }, - login: false, - header: false, - footer: true, - }) - await screen.init() - - await screen.set('.content', 'settings/index', { - version: process.env.PKG_VERSION - }) - - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - - const settings_store = new SettingsStore() - - if(current_account) { - await screen.set('#wallet_settings', 'settings/partial/wallet_settings') - } else { - await screen.set('#wallet_settings', 'settings/partial/wallet_create') - } - - const networks_store = new NetworkStore() - const all_networks = await networks_store.asyncAll() - const current_network = await networks_store.current() + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Settings' + }, + login: false, + header: false, + footer: true, + }) + await screen.init() + + await screen.set('.content', 'settings/index', { + version: process.env.PKG_VERSION + }) + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + + if(current_account) { + await screen.set('#wallet_settings', 'settings/partial/wallet_settings') + } else { + await screen.set('#wallet_settings', 'settings/partial/wallet_create') + } + + const networks_store = new NetworkStore() + const all_networks = await networks_store.asyncAll() + const current_network = await networks_store.current() + + await screen.append('#root #change_network', 'settings/partial/network_select', { + network_id: 'mainnet', + network_name: 'Mainnet', + selected: current_network.id === 'mainnet' ? 'selected' : '' + }) + + await screen.append('#root #change_network', 'settings/partial/network_select', { + network_id: 'testnet', + network_name: 'Testnet', + selected: current_network.id === 'testnet' ? 'selected' : '' + }) + + for(const n of all_networks) { + const network_id = n?.key + const network = n.value await screen.append('#root #change_network', 'settings/partial/network_select', { - network_id: 'mainnet', - network_name: 'Mainnet', - selected: current_network.id === 'mainnet' ? 'selected' : '' + network_id, + network_name: network.name, + selected: current_network.id === network_id ? 'selected' : '' }) - - await screen.append('#root #change_network', 'settings/partial/network_select', { - network_id: 'testnet', - network_name: 'Testnet', - selected: current_network.id === 'testnet' ? 'selected' : '' - }) - - for(const n of all_networks) { - const network_id = n?.key - const network = n.value - - await screen.append('#root #change_network', 'settings/partial/network_select', { - network_id, - network_name: network.name, - selected: current_network.id === network_id ? 'selected' : '' + } + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#change_network', + type: 'change', + listener: async() => { + const network_id = DOMPurify.sanitize(document.querySelector("#change_network").value); + + screen.showInit() + screen.freezeRoot() + + await sendMessage('change_network', { + network_id }) - } - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#change_network', - type: 'change', - listener: async() => { - const network_id = DOMPurify.sanitize(document.querySelector("#change_network").value); - screen.showInit() - screen.freezeRoot() - - await sendMessage('change_network', { - network_id - }) - - setTimeout(async() => { - const current_network = await networks_store.current() - - if(current_network.id !== network_id) { - await sendMessage('change_network', { - network_id: current_network.id - }) - await reloadScreen() - await showNotification('Cannot connect to this network. Reverted back to mainnet.', 'error') - } else { - window.top.location.reload() - } - - screen.unFreezeRoot() - }, 800) - } - }, - { - element: '#manage_networks', - listener: () => goToScreen('networkManageScreen') - }, - { - element: '#manage_accounts', - listener: () => goToScreen('accountManageScreen') - }, - { - element: '#backup_wallet', - listener: () => goToScreen('walletBackupScreen') - }, - { - element: '#go_import', - listener: () => goToScreen('walletImportScreen') - }, - { - element: '#go_new', - listener: () => goToScreen('walletCreateScreen') - }, - { - element: '#go_support', - listener: () => { - const current_browser = getCurrentBrowser() - current_browser.tabs.create({ url: 'https://bitgreen.org/contact' }) - } - } - ]) + setTimeout(async() => { + const current_network = await networks_store.current() + + if(current_network.id !== network_id) { + await sendMessage('change_network', { + network_id: current_network.id + }) + await reloadScreen() + await showNotification('Cannot connect to this network. Reverted back to mainnet.', 'error') + } else { + window.top.location.reload() + } + + screen.unFreezeRoot() + }, 800) + } + }, + { + element: '#manage_networks', + listener: () => goToScreen('networkManageScreen') + }, + { + element: '#manage_accounts', + listener: () => goToScreen('accountManageScreen') + }, + { + element: '#backup_wallet', + listener: () => goToScreen('walletBackupScreen') + }, + { + element: '#go_import', + listener: () => goToScreen('walletImportScreen') + }, + { + element: '#go_new', + listener: () => goToScreen('walletCreateScreen') + }, + { + element: '#go_support', + listener: () => { + const current_browser = getCurrentBrowser() + current_browser.tabs.create({ url: 'https://bitgreen.org/contact' }) + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/signIn.js b/packages/browser-wallet-ui/src/screens/signIn.js index 14cb4c5..828508d 100644 --- a/packages/browser-wallet-ui/src/screens/signIn.js +++ b/packages/browser-wallet-ui/src/screens/signIn.js @@ -7,219 +7,219 @@ import anime from "animejs"; import { showNotification } from "../notifications.js"; export default async function signInScreen(params) { - const wallet_store = new WalletStore() - if(!await wallet_store.exists()) { - await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() - return await goToScreen('walletScreen', {}, false, true) - } - - const screen = new Screen({ - template_name: 'layouts/default', - login: false, - header: true, - footer: false, - tab_id: params?.tab_id, - message_id: params?.message_id - }) - await screen.init() - - const domain = params?.domain - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - - await screen.set('#heading', 'shared/heading', { - title: 'Sign In Request' - }) - - await screen.set('#bordered_content', 'sign_in', { - domain: domain - }) - - await screen.set('#app_info', 'app_info', { - domain, - title: params?.title?.substring(0, 60) - }); - - const app = checkIfAppIsKnown(domain) - if(app) { - screen.setParam('#app_info h3', app.title) - document.querySelector('#app_info').classList.add('known') - } - - setTimeout(() => { - document.querySelector("#root #password").focus(); - }, 100) - - await screen.append('#bordered_content', 'global/loading', { - title: 'Approving sign in', - desc: 'Hold tight while we get confirmation of this sign in request.', - top: '16px', - padding_top: '40px', - checkmark_top: '88px' - }); - - await screen.append('#loading_content #content .done', 'global/button', { - id: 'close_tab', - title: 'Close and return', - class: 'btn-dark btn-sm btn-rounded', - icon: 'hidden m-0' - }); - - const input_field = document.querySelector("#root .footer #password") - const show_password = document.querySelector("#root .footer .show-password") - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - screen.setListeners([ - { - element: '#execute_sign_in', - listener: async() => await doSignIn() - }, - { - element: '#root #password', - type: 'keypress', - listener: async(e) => { - if(e.key === "Enter") { - await doSignIn() - } - await scrollToBottom() - } - }, - { - element: '#root #password', - type: 'focus', - listener: async() => { - await scrollToBottom() - await scrollToBottom(200) - await scrollToBottom(1600) - } - }, - { - element: '#deny_sign_in', - listener: async() => { - screen.sendMessageToTab({ - success: false, - status: 'denied', - error: 'User has denied this request.' - }) - - window.close() - - return await goToScreen('dashboardScreen') - } - }, - { - element: '#close_tab', - listener: async() => { - window.close() - - return await goToScreen('dashboardScreen') - } - }, - { - element: '#root .footer .show-password', - listener: () => { - if(input_field.type === 'password') { - input_field.type = 'text' - show_password.innerHTML = '' - } else { - input_field.type = 'password' - show_password.innerHTML = '' - } - } + const wallet_store = new WalletStore() + if(!await wallet_store.exists()) { + await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) + await clearHistory() + return await goToScreen('walletScreen', {}, false, true) + } + + const screen = new Screen({ + template_name: 'layouts/default', + login: false, + header: true, + footer: false, + tab_id: params?.tab_id, + message_id: params?.message_id + }) + await screen.init() + + const domain = params?.domain + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + + await screen.set('#heading', 'shared/heading', { + title: 'Sign In Request' + }) + + await screen.set('#bordered_content', 'sign_in', { + domain: domain + }) + + await screen.set('#app_info', 'app_info', { + domain, + title: params?.title?.substring(0, 60) + }); + + const app = checkIfAppIsKnown(domain) + if(app) { + screen.setParam('#app_info h3', app.title) + document.querySelector('#app_info').classList.add('known') + } + + setTimeout(() => { + document.querySelector("#root #password").focus(); + }, 100) + + await screen.append('#bordered_content', 'global/loading', { + title: 'Approving sign in', + desc: 'Hold tight while we get confirmation of this sign in request.', + top: '16px', + padding_top: '40px', + checkmark_top: '88px' + }); + + await screen.append('#loading_content #content .done', 'global/button', { + id: 'close_tab', + title: 'Close and return', + class: 'btn-dark btn-sm btn-rounded', + icon: 'hidden m-0' + }); + + const input_field = document.querySelector("#root .footer #password") + const show_password = document.querySelector("#root .footer .show-password") + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + screen.setListeners([ + { + element: '#execute_sign_in', + listener: async() => await doSignIn() + }, + { + element: '#root #password', + type: 'keypress', + listener: async(e) => { + if(e.key === "Enter") { + await doSignIn() } - ]) - - const doSignIn = async() => { - showProcessing() - - const data = await sendMessage('sign_in', { - password: DOMPurify.sanitize(document.querySelector('#root #password')?.value), - account_id: current_account.id, - domain: params?.domain, - tab_id: params?.tab_id - }, params?.message_id) - - if(data) { - // send message to tab if response is successful - screen.sendMessageToTab({ - success: true, - data - }) - - showProcessingDone() - // window.close() + await scrollToBottom() + } + }, + { + element: '#root #password', + type: 'focus', + listener: async() => { + await scrollToBottom() + await scrollToBottom(200) + await scrollToBottom(1600) + } + }, + { + element: '#deny_sign_in', + listener: async() => { + screen.sendMessageToTab({ + success: false, + status: 'denied', + error: 'User has denied this request.' + }) + + window.close() + + return await goToScreen('dashboardScreen') + } + }, + { + element: '#close_tab', + listener: async() => { + window.close() + + return await goToScreen('dashboardScreen') + } + }, + { + element: '#root .footer .show-password', + listener: () => { + if(input_field.type === 'password') { + input_field.type = 'text' + show_password.innerHTML = '' } else { - hideProcessing() - await showNotification('Password is wrong!', 'error') + input_field.type = 'password' + show_password.innerHTML = '' } - - show_password.innerHTML = '' - input_field.type = 'password' + } + } + ]) + + const doSignIn = async() => { + showProcessing() + + const data = await sendMessage('sign_in', { + password: DOMPurify.sanitize(document.querySelector('#root #password')?.value), + account_id: current_account.id, + domain: params?.domain, + tab_id: params?.tab_id + }, params?.message_id) + + if(data) { + // send message to tab if response is successful + screen.sendMessageToTab({ + success: true, + data + }) + + showProcessingDone() + // window.close() + } else { + hideProcessing() + await showNotification('Password is wrong!', 'error') } - const showProcessing = () => { - const loading_el = document.querySelector("#loading_content") + show_password.innerHTML = '' + input_field.type = 'password' + } - loading_el.classList.add('active') + const showProcessing = () => { + const loading_el = document.querySelector("#loading_content") - screen.freezeRoot() - } + loading_el.classList.add('active') + + screen.freezeRoot() + } - const showProcessingDone = () => { - screen.unFreezeRoot() + const showProcessingDone = () => { + screen.unFreezeRoot() - const loading_el = document.querySelector("#loading_content") - const checkmark_el = loading_el.querySelector("#checkmark") - const content_done_el = loading_el.querySelector("#content .done") - const content_init_text_el = loading_el.querySelector("#content .init .text") - const content_init_desc_el = loading_el.querySelector("#content .init .desc") - const content_done_text_el = loading_el.querySelector("#content .done .text") - const content_done_desc_el = loading_el.querySelector("#content .done .desc") + const loading_el = document.querySelector("#loading_content") + const checkmark_el = loading_el.querySelector("#checkmark") + const content_done_el = loading_el.querySelector("#content .done") + const content_init_text_el = loading_el.querySelector("#content .init .text") + const content_init_desc_el = loading_el.querySelector("#content .init .desc") + const content_done_text_el = loading_el.querySelector("#content .done .text") + const content_done_desc_el = loading_el.querySelector("#content .done .desc") - const primary_element = document.querySelector('#loading_content #primary') + const primary_element = document.querySelector('#loading_content #primary') - primary_element.style.transition = "stroke-dasharray 1.2s ease-out, stroke-dashoffset 1.2s ease-out"; - primary_element.style.strokeDasharray = "100 0"; - primary_element.style.strokeDashoffset = "0"; + primary_element.style.transition = "stroke-dasharray 1.2s ease-out, stroke-dashoffset 1.2s ease-out"; + primary_element.style.strokeDasharray = "100 0"; + primary_element.style.strokeDashoffset = "0"; - setTimeout(() => { - content_done_el.classList.add('active') + setTimeout(() => { + content_done_el.classList.add('active') - content_done_text_el.innerHTML = 'Sign in approved' - content_done_desc_el.innerHTML = 'You can close this window and continue with the application that made the sign in request.' + content_done_text_el.innerHTML = 'Sign in approved' + content_done_desc_el.innerHTML = 'You can close this window and continue with the application that made the sign in request.' - content_init_text_el.classList.add('d-none') - content_init_desc_el.classList.add('d-none') - }, 600) + content_init_text_el.classList.add('d-none') + content_init_desc_el.classList.add('d-none') + }, 600) - setTimeout(() => { - checkmark_el.classList.add('show') - }, 800) + setTimeout(() => { + checkmark_el.classList.add('show') + }, 800) - setTimeout(() => { - loading_el.classList.add('done') - }, 1200) + setTimeout(() => { + loading_el.classList.add('done') + }, 1200) - anime({ - targets: '#bordered_content .footer', - translateY: 150, - duration: 1200, - delay: 0 - }); - } + anime({ + targets: '#bordered_content .footer', + translateY: 150, + duration: 1200, + delay: 0 + }); + } - const hideProcessing = () => { - const loading_el = document.querySelector("#loading_content") + const hideProcessing = () => { + const loading_el = document.querySelector("#loading_content") - loading_el.classList.remove('active') - screen.unFreezeRoot() - } + loading_el.classList.remove('active') + screen.unFreezeRoot() + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/stakingCollator.js b/packages/browser-wallet-ui/src/screens/stakingCollator.js index 98edc70..40ce7f6 100644 --- a/packages/browser-wallet-ui/src/screens/stakingCollator.js +++ b/packages/browser-wallet-ui/src/screens/stakingCollator.js @@ -3,190 +3,190 @@ import { AccountStore, CacheStore, NetworkStore } from "@bitgreen/browser-wallet import { sendMessage } from "../messaging.js"; import { - addressValid, - balanceToHuman, - calculateCollatorApy, - formatAddress, - formatAmount, - getAmountDecimal, - humanToBalance, + addressValid, + balanceToHuman, + calculateCollatorApy, + formatAddress, + formatAmount, + getAmountDecimal, + humanToBalance, } from "@bitgreen/browser-wallet-utils"; import anime from "animejs"; import * as jdenticon from "jdenticon"; import BigNumber from "bignumber.js"; export default async function stakingCollatorScreen(params) { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - login: true, - header: false, - footer: true - }) - await screen.init() - - await screen.set('#heading', 'staking/collator/heading', { - title: formatAddress(params.collator) - }) - - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) - - const all_collators = await sendMessage('get_collators') - - const collator = all_collators.find((c) => { - return c.who === params?.collator - }) - - const delegator = collator.delegators.find((d) => { - return d.who === current_account.address - }) - - const original_balance = await sendMessage('get_balance') - const inflation_amount = await cache_store.asyncGet('inflation_amount') - - const collator_apy = calculateCollatorApy(all_collators, collator, inflation_amount) - const collator_apy_data = getAmountDecimal(formatAmount(collator_apy.toString(), 2), 2) - - await screen.set('#bordered_content', 'staking/collator/content', { - collator_jdenticon: jdenticon.toSvg(params?.collator, 56), - total_stake: formatAmount(balanceToHuman(new BigNumber(collator?.totalStake?.replaceAll(',', '') || 0)), 2, '', true), - my_stake: formatAmount(balanceToHuman(new BigNumber(delegator?.deposit?.replaceAll(',', '') || 0)), 2, '', true), - balance: formatAmount(balanceToHuman(original_balance.free, 2), 2), - max_balance: balanceToHuman(original_balance.free, 18), - apy_amount: collator_apy_data.amount, - apy_decimals: collator_apy_data.decimals + const screen = new Screen({ + template_name: 'layouts/default_custom_header', + login: true, + header: false, + footer: true + }) + await screen.init() + + await screen.set('#heading', 'staking/collator/heading', { + title: formatAddress(params.collator) + }) + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + + const all_collators = await sendMessage('get_collators') + + const collator = all_collators.find((c) => { + return c.who === params?.collator + }) + + const delegator = collator.delegators.find((d) => { + return d.who === current_account.address + }) + + const original_balance = await sendMessage('get_balance') + const inflation_amount = await cache_store.asyncGet('inflation_amount') + + const collator_apy = calculateCollatorApy(all_collators, collator, inflation_amount) + const collator_apy_data = getAmountDecimal(formatAmount(collator_apy.toString(), 2), 2) + + await screen.set('#bordered_content', 'staking/collator/content', { + collator_jdenticon: jdenticon.toSvg(params?.collator, 56), + total_stake: formatAmount(balanceToHuman(new BigNumber(collator?.totalStake?.replaceAll(',', '') || 0)), 2, '', true), + my_stake: formatAmount(balanceToHuman(new BigNumber(delegator?.deposit?.replaceAll(',', '') || 0)), 2, '', true), + balance: formatAmount(balanceToHuman(original_balance.free, 2), 2), + max_balance: balanceToHuman(original_balance.free, 18), + apy_amount: collator_apy_data.amount, + apy_decimals: collator_apy_data.decimals + }) + document.querySelector('#bordered_content').classList.add('medium') + document.querySelector('#bordered_content').classList.add('no-overflow') + + if(balanceToHuman(new BigNumber(delegator?.deposit.replaceAll(',', ''))) > 0) { + document.querySelector('#bordered_content #unbond').classList.remove('disabled') + } + + const amount_el = document.querySelector("#root #amount") + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + anime({ + targets: '#bordered_content .collator-image', + opacity: [0, 1], + translateY: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#root #amount', + type: 'input', + listener: () => syncAmount() + }, + { + element: '#root #max_amount', + listener: () => maxAmount() + }, + { + element: '#root #unbond', + listener: async() => { + await goToScreen('extrinsicSendScreen', { + pallet: 'parachainStaking', + call: 'undelegate', + call_parameters: JSON.stringify([ + params?.collator + ]) + }) + } + }, + { + element: '#root #nominate', + listener: async() => { + await goToScreen('extrinsicSendScreen', { + pallet: 'parachainStaking', + call: 'delegate', + call_parameters: JSON.stringify([ + params?.collator, + humanToBalance(amount_el.value) + ]) + }) + } + } + ]) + + let estimated_fee = 0 + const getEstimatedFee = async() => { + const amount = humanToBalance(amount_el.value) + estimated_fee = await sendMessage('get_estimated_fee', { + pallet: 'parachainStaking', + call: 'delegate', + call_parameters: [ + collator.who, + amount + ], + account_address: current_account.address }) - document.querySelector('#bordered_content').classList.add('medium') - document.querySelector('#bordered_content').classList.add('no-overflow') - if(balanceToHuman(new BigNumber(delegator?.deposit.replaceAll(',', ''))) > 0) { - document.querySelector('#bordered_content #unbond').classList.remove('disabled') + estimated_fee = formatAmount(balanceToHuman(estimated_fee , 18), 18) + } + getEstimatedFee().then() + + const syncAmount = () => { + const button_el = document.querySelector("#root #nominate") + + if(parseFloat(amount_el.value) > 0 + && (parseFloat(amount_el.value) + parseFloat(balanceToHuman(estimated_fee, 4))) <= parseFloat(balanceToHuman(original_balance.free, 18)) + ) { + button_el.classList.remove('disabled') + button_el.classList.add('btn-primary') + + amount_el.classList.remove('error') + } else { + button_el.classList.remove('btn-primary') + button_el.classList.add('disabled') + + if((parseFloat(amount_el.value) + parseFloat(balanceToHuman(estimated_fee, 4))) > parseFloat(balanceToHuman(original_balance.free, 18))) { + amount_el.classList.add('error') + } else { + amount_el.classList.remove('error') + } } - const amount_el = document.querySelector("#root #amount") - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - anime({ - targets: '#bordered_content .collator-image', - opacity: [0, 1], - translateY: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #amount', - type: 'input', - listener: () => syncAmount() - }, - { - element: '#root #max_amount', - listener: () => maxAmount() - }, - { - element: '#root #unbond', - listener: async() => { - await goToScreen('extrinsicSendScreen', { - pallet: 'parachainStaking', - call: 'undelegate', - call_parameters: JSON.stringify([ - params?.collator - ]) - }) - } - }, - { - element: '#root #nominate', - listener: async() => { - await goToScreen('extrinsicSendScreen', { - pallet: 'parachainStaking', - call: 'delegate', - call_parameters: JSON.stringify([ - params?.collator, - humanToBalance(amount_el.value) - ]) - }) - } - } - ]) - - let estimated_fee = 0 - const getEstimatedFee = async() => { - const amount = humanToBalance(amount_el.value) - estimated_fee = await sendMessage('get_estimated_fee', { - pallet: 'parachainStaking', - call: 'delegate', - call_parameters: [ - collator.who, - amount - ], - account_address: current_account.address - }) - - estimated_fee = formatAmount(balanceToHuman(estimated_fee , 18), 18) - } getEstimatedFee().then() + } - const syncAmount = () => { - const button_el = document.querySelector("#root #nominate") - - if(parseFloat(amount_el.value) > 0 - && (parseFloat(amount_el.value) + parseFloat(balanceToHuman(estimated_fee, 4))) <= parseFloat(balanceToHuman(original_balance.free, 18)) - ) { - button_el.classList.remove('disabled') - button_el.classList.add('btn-primary') - - amount_el.classList.remove('error') - } else { - button_el.classList.remove('btn-primary') - button_el.classList.add('disabled') + const maxAmount = () => { + let max_amount = parseFloat(balanceToHuman(original_balance.free, 18)) - parseFloat(balanceToHuman(estimated_fee, 4)) - if((parseFloat(amount_el.value) + parseFloat(balanceToHuman(estimated_fee, 4))) > parseFloat(balanceToHuman(original_balance.free, 18))) { - amount_el.classList.add('error') - } else { - amount_el.classList.remove('error') - } - } - - getEstimatedFee().then() + if(max_amount <= 0) { + max_amount = 0.00 } - const maxAmount = () => { - let max_amount = parseFloat(balanceToHuman(original_balance.free, 18)) - parseFloat(balanceToHuman(estimated_fee, 4)) - - if(max_amount <= 0) { - max_amount = 0.00 - } - - if(max_amount > 100000) { - amount_el.value = (max_amount - 0.0001).toFixed(4) - } else if(max_amount > 1000) { - amount_el.value = (max_amount - 0.000001).toFixed(6) - } else { - max_amount = max_amount - 0.00000001 - if(max_amount <= 0) { - max_amount = 0.00 - amount_el.value = max_amount.toFixed(2) - } else { - amount_el.value = max_amount.toFixed(8) - } - } - - syncAmount() + if(max_amount > 100000) { + amount_el.value = (max_amount - 0.0001).toFixed(4) + } else if(max_amount > 1000) { + amount_el.value = (max_amount - 0.000001).toFixed(6) + } else { + max_amount = max_amount - 0.00000001 + if(max_amount <= 0) { + max_amount = 0.00 + amount_el.value = max_amount.toFixed(2) + } else { + amount_el.value = max_amount.toFixed(8) + } } + + syncAmount() + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/stakingCollators.js b/packages/browser-wallet-ui/src/screens/stakingCollators.js index 4961c9d..83923e6 100644 --- a/packages/browser-wallet-ui/src/screens/stakingCollators.js +++ b/packages/browser-wallet-ui/src/screens/stakingCollators.js @@ -1,180 +1,178 @@ import Screen, { goToScreen, updateCurrentParams } from './index.js' import { AccountStore, CacheStore, NetworkStore, SettingsStore } from "@bitgreen/browser-wallet-core"; -import { sendMessage } from "../messaging.js"; - import { - balanceToHuman, calculateCollatorApy, - formatAddress, - formatAmount, getAmountDecimal, - isFirefox, - isIOs, - isSafari + balanceToHuman, + calculateCollatorApy, + formatAddress, + formatAmount, + getAmountDecimal } from "@bitgreen/browser-wallet-utils"; +import { sendMessage } from "../messaging.js"; import BigNumber from "bignumber.js"; import anime from "animejs"; import * as jdenticon from "jdenticon"; export default async function stakingCollatorsScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Collators' - }, - login: true, - header: false, - footer: true - }) - await screen.init() - - await screen.set('.content', 'staking/collators') + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Collators' + }, + login: true, + header: false, + footer: true + }) + await screen.init() + + await screen.set('.content', 'staking/collators') + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + + if(params?.target === 'my_nominations') { + showMyNominations() + } else { + showAllCollators() + } + + const balance = await sendMessage('get_balance') + const inflation_amount = await cache_store.asyncGet('inflation_amount') + + const all_collators = await sendMessage('get_collators') + let total_my_nominations = 0 + + let my_stake = new BigNumber(0) + for(const [key, collator] of Object.entries(all_collators)) { + const collator_apy = calculateCollatorApy(all_collators, collator, inflation_amount) + const collator_apy_data = getAmountDecimal(formatAmount(collator_apy.toString(), 2), 2) + + for(const [key, delegator] of Object.entries(collator.delegators)) { + if(delegator.who === current_account.address) { + await screen.append('.slide.my-nominations .collator-list', 'staking/list_item', { + collator_jdenticon: jdenticon.toSvg(collator.who,56), + collator_address: formatAddress(collator.who, 8, 12), + collator_full_address: collator.who, + total_stake: formatAmount(balanceToHuman(new BigNumber(delegator.deposit.replaceAll(',',''))), 2, '', true), + apy_amount: collator_apy_data.amount, + apy_decimals: collator_apy_data.decimals + }) - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) + total_my_nominations++ - if(params?.target === 'my_nominations') { - showMyNominations() - } else { - showAllCollators() + my_stake = my_stake.plus(new BigNumber(delegator?.deposit.replaceAll(',',''))) + } } - const balance = await sendMessage('get_balance') - const inflation_amount = await cache_store.asyncGet('inflation_amount') - - const all_collators = await sendMessage('get_collators') - let total_my_nominations = 0 - - let my_stake = new BigNumber(0) - for(const [key, collator] of Object.entries(all_collators)) { - const collator_apy = calculateCollatorApy(all_collators, collator, inflation_amount) - const collator_apy_data = getAmountDecimal(formatAmount(collator_apy.toString(), 2), 2) - - for(const [key, delegator] of Object.entries(collator.delegators)) { - if(delegator.who === current_account.address) { - await screen.append('.slide.my-nominations .collator-list', 'staking/list_item', { - collator_jdenticon: jdenticon.toSvg(collator.who,56), - collator_address: formatAddress(collator.who, 8, 12), - collator_full_address: collator.who, - total_stake: formatAmount(balanceToHuman(new BigNumber(delegator.deposit.replaceAll(',',''))), 2, '', true), - apy_amount: collator_apy_data.amount, - apy_decimals: collator_apy_data.decimals - }) - - total_my_nominations++ - - my_stake = my_stake.plus(new BigNumber(delegator?.deposit.replaceAll(',',''))) - } - } - - await screen.append('.slide.all-collators .collator-list', 'staking/list_item', { - collator_jdenticon: jdenticon.toSvg(collator.who,56), - collator_address: formatAddress(collator.who, 8, 12), - collator_full_address: collator.who, - total_stake: formatAmount(balanceToHuman(new BigNumber(collator.totalStake.replaceAll(',',''))), 2, '', true), - apy_amount: collator_apy_data.amount, - apy_decimals: collator_apy_data.decimals + await screen.append('.slide.all-collators .collator-list', 'staking/list_item', { + collator_jdenticon: jdenticon.toSvg(collator.who,56), + collator_address: formatAddress(collator.who, 8, 12), + collator_full_address: collator.who, + total_stake: formatAmount(balanceToHuman(new BigNumber(collator.totalStake.replaceAll(',',''))), 2, '', true), + apy_amount: collator_apy_data.amount, + apy_decimals: collator_apy_data.decimals + }) + } + + screen.setParam('.slide.my-nominations .total-staked', formatAmount(balanceToHuman(my_stake), 2)) + screen.setParam('.slide.my-nominations .total-available', formatAmount(balanceToHuman(balance.free), 2)) + + screen.setParam('#my_nominations .badge', total_my_nominations) + screen.setParam('#all_collators .badge', all_collators.length) + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goToScreen('stakingHomeScreen') + }, + { + element: '#my_nominations', + listener: () => showMyNominations() + }, + { + element: '#all_collators', + listener: () => showAllCollators() + }, + { + element: '#staking_collators .button-item', + listener: (e) => { + if(!e.target.dataset?.collator) return false + + return goToScreen('stakingCollatorScreen', { + collator: e.target.dataset?.collator }) + } } - - screen.setParam('.slide.my-nominations .total-staked', formatAmount(balanceToHuman(my_stake), 2)) - screen.setParam('.slide.my-nominations .total-available', formatAmount(balanceToHuman(balance.free), 2)) - - screen.setParam('#my_nominations .badge', total_my_nominations) - screen.setParam('#all_collators .badge', all_collators.length) - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goToScreen('stakingHomeScreen') - }, - { - element: '#my_nominations', - listener: () => showMyNominations() - }, - { - element: '#all_collators', - listener: () => showAllCollators() - }, - { - element: '#staking_collators .button-item', - listener: (e) => { - if(!e.target.dataset?.collator) return false - - return goToScreen('stakingCollatorScreen', { - collator: e.target.dataset?.collator - }) - } - } - ]) - - function showMyNominations() { - const my_nominations_el = document.querySelector('#my_nominations') - const all_collators_el = document.querySelector('#all_collators') - - const my_nominations_slide_el = document.querySelector('.slide.my-nominations') - const all_collators_slide_el = document.querySelector('.slide.all-collators') - - if(all_collators_slide_el.classList.contains('active')) { - anime({ - targets: '.slide.all-collators', - opacity: [1, 0], - easing: 'easeInOutSine', - duration: 400 - }); - } - - anime({ - targets: '.slide.my-nominations', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - - my_nominations_el.classList.add('active') - all_collators_el.classList.remove('active') - - my_nominations_slide_el.classList.add('active') - all_collators_slide_el.classList.remove('active') - - updateCurrentParams({ - target: 'my_nominations' - }) + ]) + + function showMyNominations() { + const my_nominations_el = document.querySelector('#my_nominations') + const all_collators_el = document.querySelector('#all_collators') + + const my_nominations_slide_el = document.querySelector('.slide.my-nominations') + const all_collators_slide_el = document.querySelector('.slide.all-collators') + + if(all_collators_slide_el.classList.contains('active')) { + anime({ + targets: '.slide.all-collators', + opacity: [1, 0], + easing: 'easeInOutSine', + duration: 400 + }); } - function showAllCollators() { - const my_nominations_el = document.querySelector('#my_nominations') - const all_collators_el = document.querySelector('#all_collators') - - const my_nominations_slide_el = document.querySelector('.slide.my-nominations') - const all_collators_slide_el = document.querySelector('.slide.all-collators') - - if(my_nominations_slide_el.classList.contains('active')) { - anime({ - targets: '.slide.my-nominations', - opacity: [1, 0], - easing: 'easeInOutSine', - duration: 400 - }); - } - - anime({ - targets: '.slide.all-collators', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - - my_nominations_el.classList.remove('active') - all_collators_el.classList.add('active') - - my_nominations_slide_el.classList.remove('active') - all_collators_slide_el.classList.add('active') - - updateCurrentParams({ - target: 'all_collators' - }) + anime({ + targets: '.slide.my-nominations', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + my_nominations_el.classList.add('active') + all_collators_el.classList.remove('active') + + my_nominations_slide_el.classList.add('active') + all_collators_slide_el.classList.remove('active') + + updateCurrentParams({ + target: 'my_nominations' + }) + } + + function showAllCollators() { + const my_nominations_el = document.querySelector('#my_nominations') + const all_collators_el = document.querySelector('#all_collators') + + const my_nominations_slide_el = document.querySelector('.slide.my-nominations') + const all_collators_slide_el = document.querySelector('.slide.all-collators') + + if(my_nominations_slide_el.classList.contains('active')) { + anime({ + targets: '.slide.my-nominations', + opacity: [1, 0], + easing: 'easeInOutSine', + duration: 400 + }); } + + anime({ + targets: '.slide.all-collators', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + my_nominations_el.classList.remove('active') + all_collators_el.classList.add('active') + + my_nominations_slide_el.classList.remove('active') + all_collators_slide_el.classList.add('active') + + updateCurrentParams({ + target: 'all_collators' + }) + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/stakingHome.js b/packages/browser-wallet-ui/src/screens/stakingHome.js index b9c80ae..776a2c8 100644 --- a/packages/browser-wallet-ui/src/screens/stakingHome.js +++ b/packages/browser-wallet-ui/src/screens/stakingHome.js @@ -1,182 +1,179 @@ -import Screen, { clearHistory, goBackScreen, goToScreen, scrollToBottom } from './index.js' -import { sendMessage } from "../messaging.js"; -import DOMPurify from "dompurify"; +import Screen, { clearHistory, goToScreen } from './index.js' import { - AccountStore, - CacheStore, - NetworkStore, - WalletStore, - polkadotApi + AccountStore, + CacheStore, + NetworkStore, + WalletStore, + polkadotApi } from "@bitgreen/browser-wallet-core"; - -import anime from "animejs"; -import { showNotification } from "../notifications.js"; import { - balanceToHuman, - calculateCollatorApy, calculateUserRewardPerBlock, - formatAddress, - formatAmount, - getAmountDecimal, getApyByAddress, getAverageApy, getTotalStakedByAddress + balanceToHuman, + calculateUserRewardPerBlock, + formatAmount, + getAmountDecimal, getApyByAddress, getAverageApy, getTotalStakedByAddress } from "@bitgreen/browser-wallet-utils"; +import { sendMessage } from "../messaging.js"; +import { showNotification } from "../notifications.js"; +import anime from "animejs"; import BigNumber from "bignumber.js"; export default async function stakingHomeScreen() { - const wallet_store = new WalletStore() - if(!await wallet_store.exists()) { - await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() - return await goToScreen('walletScreen', {}, false, true) + const wallet_store = new WalletStore() + if(!await wallet_store.exists()) { + await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) + await clearHistory() + return await goToScreen('walletScreen', {}, false, true) + } + + const screen = new Screen({ + template_name: 'layouts/full_page_secondary', + login: true, + header: true, + footer: true + }) + await screen.init() + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + const networks_store = new NetworkStore() + const cache_store = new CacheStore(await networks_store.current()) + + const all_collators = await sendMessage('get_collators') + + const balance = await sendMessage('get_balance') + const inflation_amount = await cache_store.asyncGet('inflation_amount') + + const my_total_stake = getTotalStakedByAddress(all_collators, current_account.address) + const average_user_apy = getApyByAddress(all_collators, current_account.address, inflation_amount) + + if(my_total_stake > 0) { + let reward_per_block = calculateUserRewardPerBlock(my_total_stake, average_user_apy, inflation_amount) + let reward_base = 'BBB' + + if(reward_per_block.isLessThan(new BigNumber(1000000 / Math.pow(10, 18))) ) { + reward_base = 'nBBB' + reward_per_block = reward_per_block.multipliedBy(new BigNumber(1000000000)) + } else if(reward_per_block.isLessThan(new BigNumber(1000000000 / Math.pow(10, 18))) ) { + reward_base = 'mmBBB' + reward_per_block = reward_per_block.multipliedBy(new BigNumber(1000000)) + } else if(reward_per_block.isLessThan(new BigNumber(1000000000000 / Math.pow(10, 18))) ) { + reward_base = 'mBBB' + reward_per_block = reward_per_block.multipliedBy(new BigNumber(1000)) } - const screen = new Screen({ - template_name: 'layouts/full_page_secondary', - login: true, - header: true, - footer: true - }) - await screen.init() - - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - const networks_store = new NetworkStore() - const cache_store = new CacheStore(await networks_store.current()) - - const all_collators = await sendMessage('get_collators') - - const balance = await sendMessage('get_balance') - const inflation_amount = await cache_store.asyncGet('inflation_amount') - - const my_total_stake = getTotalStakedByAddress(all_collators, current_account.address) - const average_user_apy = getApyByAddress(all_collators, current_account.address, inflation_amount) - - if(my_total_stake > 0) { - let reward_per_block = calculateUserRewardPerBlock(my_total_stake, average_user_apy, inflation_amount) - let reward_base = 'BBB' - - if(reward_per_block.isLessThan(new BigNumber(1000000 / Math.pow(10, 18))) ) { - reward_base = 'nBBB' - reward_per_block = reward_per_block.multipliedBy(new BigNumber(1000000000)) - } else if(reward_per_block.isLessThan(new BigNumber(1000000000 / Math.pow(10, 18))) ) { - reward_base = 'mmBBB' - reward_per_block = reward_per_block.multipliedBy(new BigNumber(1000000)) - } else if(reward_per_block.isLessThan(new BigNumber(1000000000000 / Math.pow(10, 18))) ) { - reward_base = 'mBBB' - reward_per_block = reward_per_block.multipliedBy(new BigNumber(1000)) - } - - const reward_data = getAmountDecimal(formatAmount(!reward_per_block.isNaN() ? reward_per_block.toString() : 0, 6), 6) - const collator_apy_data = getAmountDecimal(formatAmount(average_user_apy.toString(), 2), 2) - - await screen.set('.content', 'staking/home/active', { - apy_amount: collator_apy_data.amount, - apy_decimals: collator_apy_data.decimals, - reward_amount: reward_data?.amount || 0, - reward_decimals: reward_data?.decimals || 0, - reward_base: reward_base - }) - - await screen.set('.content #staking_info', 'staking/home/info', { - 'locked_amount': formatAmount(balanceToHuman(balance.frozen + balance.reserved), 2), - 'available_amount': formatAmount(balanceToHuman(balance.free), 2) - }) - - anime({ - targets: '#root .content #change_nominations', - opacity: [0, 1], - translateX: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - } else { - const average_apy = getAverageApy(all_collators, inflation_amount) - const collator_apy_data = getAmountDecimal(formatAmount(average_apy.toString(), 2), 2) - - await screen.set('.content', 'staking/home/inactive', { - apy_amount: collator_apy_data.amount, - apy_decimals: collator_apy_data.decimals - }) - - await screen.set('.content #staking_info', 'staking/home/info', { - 'locked_amount': formatAmount(balanceToHuman(balance.frozen + balance.reserved), 2), - 'available_amount': formatAmount(balanceToHuman(balance.free), 2) - }) - - anime({ - targets: '#root .content #get_started_staking', - opacity: [0, 1], - translateX: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - } + const reward_data = getAmountDecimal(formatAmount(!reward_per_block.isNaN() ? reward_per_block.toString() : 0, 6), 6) + const collator_apy_data = getAmountDecimal(formatAmount(average_user_apy.toString(), 2), 2) - polkadotApi().then((polkadot_api) => { - polkadot_api.query.parachainStaking.unbondedDelegates(current_account.address).then((data) => { - data = data.toJSON() - - const deposit = new BigNumber(data?.deposit?.replaceAll(',','') || 0) + await screen.set('.content', 'staking/home/active', { + apy_amount: collator_apy_data.amount, + apy_decimals: collator_apy_data.decimals, + reward_amount: reward_data?.amount || 0, + reward_decimals: reward_data?.decimals || 0, + reward_base: reward_base + }) - if(deposit > 0) { - document.querySelector('#root .content #withdraw_unbonded').classList.remove('d-none') + await screen.set('.content #staking_info', 'staking/home/info', { + 'locked_amount': formatAmount(balanceToHuman(balance.frozen + balance.reserved), 2), + 'available_amount': formatAmount(balanceToHuman(balance.free), 2) + }) - screen.setParam('#root .content .unbonded-amount', formatAmount(balanceToHuman(deposit), 2)) + anime({ + targets: '#root .content #change_nominations', + opacity: [0, 1], + translateX: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + } else { + const average_apy = getAverageApy(all_collators, inflation_amount) + const collator_apy_data = getAmountDecimal(formatAmount(average_apy.toString(), 2), 2) - anime({ - targets: '#root .content #withdraw_unbonded', - opacity: [0, 1], - translateX: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - } - }) + await screen.set('.content', 'staking/home/inactive', { + apy_amount: collator_apy_data.amount, + apy_decimals: collator_apy_data.decimals }) - screen.setListeners([ - { - element: '#root .content #get_started_staking', - listener: () => goToScreen('stakingIntroScreen') - }, - { - element: '#root .content #change_nominations', - listener: () => goToScreen('stakingCollatorsScreen', { - target: 'my_nominations' - }) - }, - { - element: '#root .content #withdraw_unbonded', - listener: () => goToScreen('extrinsicSendScreen', { - pallet: 'parachainStaking', - call: 'withdrawUnbonded' - }) - }, - ]) + await screen.set('.content #staking_info', 'staking/home/info', { + 'locked_amount': formatAmount(balanceToHuman(balance.frozen + balance.reserved), 2), + 'available_amount': formatAmount(balanceToHuman(balance.free), 2) + }) anime({ - targets: '#root .content', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400 + targets: '#root .content #get_started_staking', + opacity: [0, 1], + translateX: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 200 }); + } - anime({ - targets: '#root .content #balance .text-white', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: function(el, i) { - return i*200 + 100 - }, - }); + polkadotApi().then((polkadot_api) => { + polkadot_api.query.parachainStaking.unbondedDelegates(current_account.address).then((data) => { + data = data.toJSON() - anime({ - targets: '#root .content .bottom-text', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); + const deposit = new BigNumber(data?.deposit?.replaceAll(',','') || 0) + + if(deposit > 0) { + document.querySelector('#root .content #withdraw_unbonded').classList.remove('d-none') + + screen.setParam('#root .content .unbonded-amount', formatAmount(balanceToHuman(deposit), 2)) + + anime({ + targets: '#root .content #withdraw_unbonded', + opacity: [0, 1], + translateX: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + } + }) + }) + + screen.setListeners([ + { + element: '#root .content #get_started_staking', + listener: () => goToScreen('stakingIntroScreen') + }, + { + element: '#root .content #change_nominations', + listener: () => goToScreen('stakingCollatorsScreen', { + target: 'my_nominations' + }) + }, + { + element: '#root .content #withdraw_unbonded', + listener: () => goToScreen('extrinsicSendScreen', { + pallet: 'parachainStaking', + call: 'withdrawUnbonded' + }) + }, + ]) + + anime({ + targets: '#root .content', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400 + }); + + anime({ + targets: '#root .content #balance .text-white', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: function(el, i) { + return i*200 + 100 + }, + }); + + anime({ + targets: '#root .content .bottom-text', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/stakingIntro.js b/packages/browser-wallet-ui/src/screens/stakingIntro.js index 01a0bf6..d3180a2 100644 --- a/packages/browser-wallet-ui/src/screens/stakingIntro.js +++ b/packages/browser-wallet-ui/src/screens/stakingIntro.js @@ -1,212 +1,209 @@ -import Screen, { clearHistory, goBackScreen, goToScreen, scrollToBottom } from './index.js' +import Screen, { goToScreen } from './index.js' +import { AccountStore, SettingsStore } from "@bitgreen/browser-wallet-core"; +import { getTotalStakedByAddress } from "@bitgreen/browser-wallet-utils"; import { sendMessage } from "../messaging.js"; -import DOMPurify from "dompurify"; -import { AccountStore, SettingsStore, WalletStore } from "@bitgreen/browser-wallet-core"; - import anime from "animejs"; -import { showNotification } from "../notifications.js"; -import { getTotalStakedByAddress } from "@bitgreen/browser-wallet-utils"; export default async function stakingIntroScreen(params) { - const settings_store = new SettingsStore() - - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() - - const all_collators = await sendMessage('get_collators') - const my_total_stake = getTotalStakedByAddress(all_collators, current_account.address) - - if(my_total_stake > 0) { - return await goToScreen('stakingHomeScreen', params, false, true) + const settings_store = new SettingsStore() + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + + const all_collators = await sendMessage('get_collators') + const my_total_stake = getTotalStakedByAddress(all_collators, current_account.address) + + if(my_total_stake > 0) { + return await goToScreen('stakingHomeScreen', params, false, true) + } + + const screen = new Screen({ + template_name: 'layouts/full_page_secondary', + login: true, + header: true, + footer: false + }) + await screen.init() + + await screen.set('.content', 'staking/intro') + + const step_1_el = document.querySelector('#staking_intro #step_1') + const step_2_el = document.querySelector('#staking_intro #step_2') + const step_3_el = document.querySelector('#staking_intro #step_3') + + const dots_el = document.querySelector('#staking_intro .dots') + + screen.setListeners([ + { + element: '#staking_intro #go_step_2', + listener: async() => { + step_1_el.classList.remove('step-active') + step_2_el.classList.add('step-active') + dots_el.querySelector('.dot-2').classList.add('dot-active') + + anime({ + targets: '#staking_intro #step_1', + opacity: [1, 0], + easing: 'easeInOutSine', + duration: 200 + }); + + anime({ + targets: '#staking_intro #step_2 .image', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + + anime({ + targets: '#staking_intro #step_2 .step-number', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + + anime({ + targets: '#staking_intro #step_2 h3', + opacity: [0, 1], + translateX: [-40, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 300 + }); + + anime({ + targets: '#staking_intro #step_2 p', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + anime({ + targets: '#staking_intro #step_2 .btn', + opacity: [0, 1], + translateY: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + } + }, + { + element: '#staking_intro #go_step_3', + listener: async() => { + step_2_el.classList.remove('step-active') + step_3_el.classList.add('step-active') + + dots_el.querySelector('.dot-3').classList.add('dot-active') + + anime({ + targets: '#staking_intro #step_2', + opacity: [1, 0], + easing: 'easeInOutSine', + duration: 200 + }); + + anime({ + targets: '#staking_intro #step_3 .image', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + + anime({ + targets: '#staking_intro #step_3 .step-number', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + + anime({ + targets: '#staking_intro #step_3 h3', + opacity: [0, 1], + translateX: [-40, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 300 + }); + + anime({ + targets: '#staking_intro #step_3 p', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + anime({ + targets: '#staking_intro #step_3 .btn', + opacity: [0, 1], + translateY: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + } + }, + { + element: '#staking_intro #go_nominating', + listener: async() => { + await settings_store.asyncSet('staking_intro', 'true') + await goToScreen('stakingCollatorsScreen') + } } - - const screen = new Screen({ - template_name: 'layouts/full_page_secondary', - login: true, - header: true, - footer: false - }) - await screen.init() - - await screen.set('.content', 'staking/intro') - - const step_1_el = document.querySelector('#staking_intro #step_1') - const step_2_el = document.querySelector('#staking_intro #step_2') - const step_3_el = document.querySelector('#staking_intro #step_3') - - const dots_el = document.querySelector('#staking_intro .dots') - - screen.setListeners([ - { - element: '#staking_intro #go_step_2', - listener: async() => { - step_1_el.classList.remove('step-active') - step_2_el.classList.add('step-active') - dots_el.querySelector('.dot-2').classList.add('dot-active') - - anime({ - targets: '#staking_intro #step_1', - opacity: [1, 0], - easing: 'easeInOutSine', - duration: 200 - }); - - anime({ - targets: '#staking_intro #step_2 .image', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - - anime({ - targets: '#staking_intro #step_2 .step-number', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - - anime({ - targets: '#staking_intro #step_2 h3', - opacity: [0, 1], - translateX: [-40, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 300 - }); - - anime({ - targets: '#staking_intro #step_2 p', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - - anime({ - targets: '#staking_intro #step_2 .btn', - opacity: [0, 1], - translateY: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - } - }, - { - element: '#staking_intro #go_step_3', - listener: async() => { - step_2_el.classList.remove('step-active') - step_3_el.classList.add('step-active') - - dots_el.querySelector('.dot-3').classList.add('dot-active') - - anime({ - targets: '#staking_intro #step_2', - opacity: [1, 0], - easing: 'easeInOutSine', - duration: 200 - }); - - anime({ - targets: '#staking_intro #step_3 .image', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - - anime({ - targets: '#staking_intro #step_3 .step-number', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - - anime({ - targets: '#staking_intro #step_3 h3', - opacity: [0, 1], - translateX: [-40, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 300 - }); - - anime({ - targets: '#staking_intro #step_3 p', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - - anime({ - targets: '#staking_intro #step_3 .btn', - opacity: [0, 1], - translateY: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - } - }, - { - element: '#staking_intro #go_nominating', - listener: async() => { - await settings_store.asyncSet('staking_intro', 'true') - await goToScreen('stakingCollatorsScreen') - } - } - ]) - - anime({ - targets: '#staking_intro #step_1 .image', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400 - }); - - anime({ - targets: '#staking_intro #step_1 .step-number', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 200 - }); - - anime({ - targets: '#staking_intro #step_1 h3', - opacity: [0, 1], - translateX: [-40, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 300 - }); - - anime({ - targets: '#staking_intro #step_1 p', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - - anime({ - targets: '#staking_intro #step_1 .btn', - opacity: [0, 1], - translateY: [-20, 0], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); - - anime({ - targets: '#staking_intro .dots', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 400 - }); + ]) + + anime({ + targets: '#staking_intro #step_1 .image', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400 + }); + + anime({ + targets: '#staking_intro #step_1 .step-number', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 200 + }); + + anime({ + targets: '#staking_intro #step_1 h3', + opacity: [0, 1], + translateX: [-40, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 300 + }); + + anime({ + targets: '#staking_intro #step_1 p', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + anime({ + targets: '#staking_intro #step_1 .btn', + opacity: [0, 1], + translateY: [-20, 0], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); + + anime({ + targets: '#staking_intro .dots', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 400 + }); } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/tokenAll.js b/packages/browser-wallet-ui/src/screens/tokenAll.js index a9ce05c..098c90e 100644 --- a/packages/browser-wallet-ui/src/screens/tokenAll.js +++ b/packages/browser-wallet-ui/src/screens/tokenAll.js @@ -1,7 +1,6 @@ import Screen, { goBackScreen, goToScreen, reloadScreen } from "./index.js"; import {balanceToHuman, getAmountDecimal} from "@bitgreen/browser-wallet-utils"; import {sendMessage} from "../messaging.js"; -import {bbbTokenPrice} from "@bitgreen/browser-wallet-core"; import {renderTemplate} from "../screens.js"; import anime from "animejs"; @@ -70,12 +69,12 @@ export default async function tokenAllScreen(params) { }) }) - t.addEventListener("click", function(e) { + t.addEventListener("click", () => { if(t.classList.contains('active')) { t.classList.remove('active') } else { document.querySelectorAll("#bordered_content .transaction-item").forEach(t => { - t.classList.remove('active') + t.classList.remove('active') }) t.classList.add('active') diff --git a/packages/browser-wallet-ui/src/screens/tokenBBB.js b/packages/browser-wallet-ui/src/screens/tokenBBB.js index 30a0692..9e532ce 100644 --- a/packages/browser-wallet-ui/src/screens/tokenBBB.js +++ b/packages/browser-wallet-ui/src/screens/tokenBBB.js @@ -1,111 +1,110 @@ -import Screen, { goBackScreen, goToScreen, reloadScreen } from "./index.js"; +import Screen, { goBackScreen, goToScreen } from "./index.js"; import { balanceToHuman, formatAmount, getAmountDecimal } from "@bitgreen/browser-wallet-utils"; -import {sendMessage} from "../messaging.js"; -import { AccountStore, bbbTokenPrice, CacheStore, NetworkStore } from "@bitgreen/browser-wallet-core"; -import {renderTemplate} from "../screens.js"; +import { bbbTokenPrice } from "@bitgreen/browser-wallet-core"; +import { sendMessage } from "../messaging.js"; import anime from "animejs"; import BigNumber from "bignumber.js"; export default async function tokenBBBScreen(params) { - const screen = new Screen({ - template_name: "layouts/default_custom_header_medium", - header: false, - footer: true, - }); - await screen.init(); - - await screen.set('#heading', 'token/bbb/heading') - - await screen.set("#bordered_content", "token/bbb/content"); - - sendMessage('get_balance').then(async(balance) => { - const vesting_contract = await sendMessage('get_vesting_contract') - const last_block = await sendMessage('get_last_block') - - const bbb_available = new BigNumber(balance.free) - let bbb_total = new BigNumber(balance.total) - if(vesting_contract) { - bbb_total = bbb_total.plus(new BigNumber(vesting_contract?.amount)) - - const bbb_vesting_info = getAmountDecimal(formatAmount(balanceToHuman(new BigNumber(vesting_contract?.amount)), 2), 2) - const bbb_vesting_usd_info = getAmountDecimal(formatAmount(balanceToHuman(new BigNumber(vesting_contract?.amount)) * bbbTokenPrice, 2), 2) // TODO: update price! - screen.setParam('#bordered_content .bbb-vesting-amount', bbb_vesting_info.amount) - screen.setParam('#bordered_content .bbb-vesting-decimals', bbb_vesting_info.decimals) - screen.setParam('#bordered_content .bbb-vesting-usd-amount', bbb_vesting_usd_info.amount) - screen.setParam('#bordered_content .bbb-vesting-usd-decimals', bbb_vesting_usd_info.decimals) - - if(last_block.header.number > vesting_contract?.expiry) { - document.querySelector("#bordered_content #vesting_info").classList.remove('transaction-item-disabled') - document.querySelector("#bordered_content #vesting_withdraw").classList.remove('d-none') - } else { - const now = new Date().getTime() - const unlock_date = new Date(now + ((vesting_contract?.expiry - last_block.header.number) * 12)).toLocaleDateString('en-US', { - month: '2-digit', - day: '2-digit', - year: 'numeric' - }) - - document.querySelector("#bordered_content #vesting_unlocks").classList.remove('d-none') - - screen.setParam('#bordered_content #vesting_unlocks .unlocks-from', unlock_date) - } - - document.querySelector("#bordered_content #vesting_info").classList.remove('d-none') - } - - const bbb_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_total), 2), 2) - const usd_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_total) * bbbTokenPrice, 2), 2) // TODO: update price! - - screen.setParam('#bordered_content #amounts .bbb-amount', bbb_info.amount) - screen.setParam('#bordered_content #amounts .bbb-decimals', bbb_info.decimals) - - screen.setParam('#bordered_content #amounts .usd-amount', usd_info.amount) - screen.setParam('#bordered_content #amounts .usd-decimals', usd_info.decimals) - - const bbb_available_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_available), 2), 2) - const bbb_available_usd_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_available) * bbbTokenPrice, 2), 2) // TODO: update price! - screen.setParam('#bordered_content .bbb-available-amount', bbb_available_info.amount) - screen.setParam('#bordered_content .bbb-available-decimals', bbb_available_info.decimals) - screen.setParam('#bordered_content .bbb-available-usd-amount', bbb_available_usd_info.amount) - screen.setParam('#bordered_content .bbb-available-usd-decimals', bbb_available_usd_info.decimals) - - const bbb_locked_info = getAmountDecimal(formatAmount(balanceToHuman(balance.frozen + balance.reserved), 2), 2) - const bbb_locked_usd_info = getAmountDecimal(formatAmount(balanceToHuman(balance.frozen + balance.reserved) * bbbTokenPrice, 2), 2) // TODO: update price! - screen.setParam('#bordered_content .bbb-locked-amount', bbb_locked_info.amount) - screen.setParam('#bordered_content .bbb-locked-decimals', bbb_locked_info.decimals) - screen.setParam('#bordered_content .bbb-locked-usd-amount', bbb_locked_usd_info.amount) - screen.setParam('#bordered_content .bbb-locked-usd-decimals', bbb_locked_usd_info.decimals) - - if(bbb_available > 0) { - document.querySelector("#bordered_content #bbb_send").classList.remove('disabled') - } - }) - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - screen.setListeners([ - { - element: "#heading #go_back", - listener: () => goBackScreen() - }, - { - element: "#bordered_content #bbb_send", - listener: () => goToScreen('assetSendScreen', { - asset: 'bbb' - }) - }, - { - element: "#bordered_content #vesting_withdraw", - listener: () => goToScreen('extrinsicSendScreen', { - pallet: 'vestingContract', - call: 'withdrawVested' - }) - } - ]); + const screen = new Screen({ + template_name: "layouts/default_custom_header_medium", + header: false, + footer: true, + }); + await screen.init(); + + await screen.set('#heading', 'token/bbb/heading') + + await screen.set("#bordered_content", "token/bbb/content"); + + sendMessage('get_balance').then(async(balance) => { + const vesting_contract = await sendMessage('get_vesting_contract') + const last_block = await sendMessage('get_last_block') + + const bbb_available = new BigNumber(balance.free) + let bbb_total = new BigNumber(balance.total) + if(vesting_contract) { + bbb_total = bbb_total.plus(new BigNumber(vesting_contract?.amount)) + + const bbb_vesting_info = getAmountDecimal(formatAmount(balanceToHuman(new BigNumber(vesting_contract?.amount)), 2), 2) + const bbb_vesting_usd_info = getAmountDecimal(formatAmount(balanceToHuman(new BigNumber(vesting_contract?.amount)) * bbbTokenPrice, 2), 2) // TODO: update price! + screen.setParam('#bordered_content .bbb-vesting-amount', bbb_vesting_info.amount) + screen.setParam('#bordered_content .bbb-vesting-decimals', bbb_vesting_info.decimals) + screen.setParam('#bordered_content .bbb-vesting-usd-amount', bbb_vesting_usd_info.amount) + screen.setParam('#bordered_content .bbb-vesting-usd-decimals', bbb_vesting_usd_info.decimals) + + if(last_block.header.number > vesting_contract?.expiry) { + document.querySelector("#bordered_content #vesting_info").classList.remove('transaction-item-disabled') + document.querySelector("#bordered_content #vesting_withdraw").classList.remove('d-none') + } else { + const now = new Date().getTime() + const unlock_date = new Date(now + ((vesting_contract?.expiry - last_block.header.number) * 12)).toLocaleDateString('en-US', { + month: '2-digit', + day: '2-digit', + year: 'numeric' + }) + + document.querySelector("#bordered_content #vesting_unlocks").classList.remove('d-none') + + screen.setParam('#bordered_content #vesting_unlocks .unlocks-from', unlock_date) + } + + document.querySelector("#bordered_content #vesting_info").classList.remove('d-none') + } + + const bbb_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_total), 2), 2) + const usd_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_total) * bbbTokenPrice, 2), 2) // TODO: update price! + + screen.setParam('#bordered_content #amounts .bbb-amount', bbb_info.amount) + screen.setParam('#bordered_content #amounts .bbb-decimals', bbb_info.decimals) + + screen.setParam('#bordered_content #amounts .usd-amount', usd_info.amount) + screen.setParam('#bordered_content #amounts .usd-decimals', usd_info.decimals) + + const bbb_available_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_available), 2), 2) + const bbb_available_usd_info = getAmountDecimal(formatAmount(balanceToHuman(bbb_available) * bbbTokenPrice, 2), 2) // TODO: update price! + screen.setParam('#bordered_content .bbb-available-amount', bbb_available_info.amount) + screen.setParam('#bordered_content .bbb-available-decimals', bbb_available_info.decimals) + screen.setParam('#bordered_content .bbb-available-usd-amount', bbb_available_usd_info.amount) + screen.setParam('#bordered_content .bbb-available-usd-decimals', bbb_available_usd_info.decimals) + + const bbb_locked_info = getAmountDecimal(formatAmount(balanceToHuman(balance.frozen + balance.reserved), 2), 2) + const bbb_locked_usd_info = getAmountDecimal(formatAmount(balanceToHuman(balance.frozen + balance.reserved) * bbbTokenPrice, 2), 2) // TODO: update price! + screen.setParam('#bordered_content .bbb-locked-amount', bbb_locked_info.amount) + screen.setParam('#bordered_content .bbb-locked-decimals', bbb_locked_info.decimals) + screen.setParam('#bordered_content .bbb-locked-usd-amount', bbb_locked_usd_info.amount) + screen.setParam('#bordered_content .bbb-locked-usd-decimals', bbb_locked_usd_info.decimals) + + if(bbb_available > 0) { + document.querySelector("#bordered_content #bbb_send").classList.remove('disabled') + } + }) + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + screen.setListeners([ + { + element: "#heading #go_back", + listener: () => goBackScreen() + }, + { + element: "#bordered_content #bbb_send", + listener: () => goToScreen('assetSendScreen', { + asset: 'bbb' + }) + }, + { + element: "#bordered_content #vesting_withdraw", + listener: () => goToScreen('extrinsicSendScreen', { + pallet: 'vestingContract', + call: 'withdrawVested' + }) + } + ]); } diff --git a/packages/browser-wallet-ui/src/screens/transactionDetails.js b/packages/browser-wallet-ui/src/screens/transactionDetails.js index e631d57..df0f7bc 100644 --- a/packages/browser-wallet-ui/src/screens/transactionDetails.js +++ b/packages/browser-wallet-ui/src/screens/transactionDetails.js @@ -3,48 +3,48 @@ import {AccountStore, bbbTokenPrice, NetworkStore, TransactionStore} from "@bitg import {balanceToHuman, formatAddress, getAmountDecimal} from "@bitgreen/browser-wallet-utils"; export default async function transactionDetailsScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Transaction Detail' - } - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Transaction Detail' + } + }) + await screen.init() - const networks_store = new NetworkStore() - const accounts_store = new AccountStore() + const networks_store = new NetworkStore() + const accounts_store = new AccountStore() - const current_network = await networks_store.current() - const current_account = await accounts_store.current() + const current_network = await networks_store.current() + const current_account = await accounts_store.current() - const transactions_store = new TransactionStore(current_network, current_account) - const transaction = await transactions_store.asyncGet(params?.hash) + const transactions_store = new TransactionStore(current_network, current_account) + const transaction = await transactions_store.asyncGet(params?.hash) - const asset_info = getAmountDecimal(balanceToHuman(transaction.amount, 2), 2) - const usd_info = getAmountDecimal(balanceToHuman(transaction.amount) * bbbTokenPrice, 2) // TODO: update price! - const fee_info = getAmountDecimal(0.27, 2) // TODO: calculate fees! - const sent = transaction.from.toLowerCase() === current_account.address.toLowerCase() - const account_name = '(' + (current_account.name.length > 14 ? current_account.name.substring(0,14)+'...' : current_account.name) + ')' + const asset_info = getAmountDecimal(balanceToHuman(transaction.amount, 2), 2) + const usd_info = getAmountDecimal(balanceToHuman(transaction.amount) * bbbTokenPrice, 2) // TODO: update price! + const fee_info = getAmountDecimal(0.27, 2) // TODO: calculate fees! + const sent = transaction.from.toLowerCase() === current_account.address.toLowerCase() + const account_name = '(' + (current_account.name.length > 14 ? current_account.name.substring(0,14)+'...' : current_account.name) + ')' - await screen.set('.content', 'transaction/details', { - asset_amount: asset_info.amount, - asset_decimals: asset_info.decimals, - usd_amount: usd_info.amount, - usd_decimals: usd_info.decimals, - fee_amount: fee_info.amount, - fee_decimals: fee_info.decimals, - from_account_address: formatAddress(transaction.from, 16, 16), - from_account_name: sent ? account_name : '', - recipient_name: !sent ? account_name : '', - recipient_address: formatAddress(transaction.to, 16, 16), - wss_endpoint: encodeURI(current_network.url), - block_number: transaction.blockNumber - }) + await screen.set('.content', 'transaction/details', { + asset_amount: asset_info.amount, + asset_decimals: asset_info.decimals, + usd_amount: usd_info.amount, + usd_decimals: usd_info.decimals, + fee_amount: fee_info.amount, + fee_decimals: fee_info.decimals, + from_account_address: formatAddress(transaction.from, 16, 16), + from_account_name: sent ? account_name : '', + recipient_name: !sent ? account_name : '', + recipient_address: formatAddress(transaction.to, 16, 16), + wss_endpoint: encodeURI(current_network.url), + block_number: transaction.blockNumber + }) - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - } - ]) + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/transactionHistory.js b/packages/browser-wallet-ui/src/screens/transactionHistory.js index 0adadfc..3761dc5 100644 --- a/packages/browser-wallet-ui/src/screens/transactionHistory.js +++ b/packages/browser-wallet-ui/src/screens/transactionHistory.js @@ -1,216 +1,216 @@ -import Screen, {clearHistory, goToScreen} from './index.js' -import {AccountStore, NetworkStore, WalletStore} from "@bitgreen/browser-wallet-core"; +import Screen, { clearHistory, goToScreen } from './index.js' +import { AccountStore, WalletStore } from "@bitgreen/browser-wallet-core"; +import { balanceToHuman, getAmountDecimal } from "@bitgreen/browser-wallet-utils"; import { showNotification } from "../notifications.js"; import { sendMessage } from "../messaging.js"; -import { balanceToHuman, getAmountDecimal } from "@bitgreen/browser-wallet-utils"; import anime from "animejs"; export default async function transactionHistoryScreen() { - const wallet_store = new WalletStore() - if(!await wallet_store.exists()) { - await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() - return await goToScreen('walletScreen', {}, false, true) + const wallet_store = new WalletStore() + if(!await wallet_store.exists()) { + await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) + await clearHistory() + return await goToScreen('walletScreen', {}, false, true) + } + + const screen = new Screen({ + template_name: 'layouts/default', + header: true, + footer: true + }) + await screen.init() + + const accounts_store = new AccountStore() + const current_account = await accounts_store.current() + + await screen.set('#heading', 'shared/heading', { + title: 'Transaction History' + }) + + await screen.set('#bordered_content', 'transaction/history') + + await screen.append('#bordered_content', 'global/loading_bbb', { + title: 'Loading', + top: '16px', + padding_top: '40px', + }); + + showLoading() + + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); + + const all_transactions = [] + + const [transactions, token_transactions, asset_transactions] = await Promise.all([ + sendMessage('get_transactions'), + sendMessage('get_token_transactions'), + sendMessage('get_asset_transactions') + ]) + + if(transactions?.length) { + for(const t of transactions) { + all_transactions.push({ + type: 'bbb', + ...t + }) + } + } + + if(token_transactions?.length) { + for (const t of token_transactions) { + all_transactions.push({ + type: 'token', + ...t + }) } + } + + if(asset_transactions?.length) { + for (const t of asset_transactions) { + all_transactions.push({ + type: 'asset', + ...t + }) + } + } - const screen = new Screen({ - template_name: 'layouts/default', - header: true, - footer: true - }) - await screen.init() + // Default sort by date with secondary sort by index (if available) + all_transactions.sort((a, b) => { + const dateA = new Date(a.value.createdAt); + const dateB = new Date(b.value.createdAt); - const accounts_store = new AccountStore() - const current_account = await accounts_store.current() + // Compare dates in descending order + if (dateB > dateA) return 1; + if (dateA > dateB) return -1; - await screen.set('#heading', 'shared/heading', { - title: 'Transaction History' - }) + // If dates are equal, compare indices in ascending order (treat undefined as Infinity) + const indexA = a.value.index || Infinity; + const indexB = b.value.index || Infinity; - await screen.set('#bordered_content', 'transaction/history') - - await screen.append('#bordered_content', 'global/loading_bbb', { - title: 'Loading', - top: '16px', - padding_top: '40px', - }); - - showLoading() - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - const all_transactions = [] - - const [transactions, token_transactions, asset_transactions] = await Promise.all([ - sendMessage('get_transactions'), - sendMessage('get_token_transactions'), - sendMessage('get_asset_transactions') - ]) - - if(transactions?.length) { - for(const t of transactions) { - all_transactions.push({ - type: 'bbb', - ...t - }) - } - } + return indexB - indexA; + }); + + for(const transaction of all_transactions) { + if(!transaction.value) continue + + let asset_name = 'BBB' // Default + let asset_type = 'TOKENS' // Default + let human_balance = balanceToHuman(transaction.value.amount) + if(transaction.type === 'token') asset_name = transaction.value.tokenId - if(token_transactions?.length) { - for (const t of token_transactions) { - all_transactions.push({ - type: 'token', - ...t - }) - } + if(transaction.type === 'asset') { + asset_name = 'CO2' + human_balance = transaction.value.amount + asset_type = 'CREDITS' } - if(asset_transactions?.length) { - for (const t of asset_transactions) { - all_transactions.push({ - type: 'asset', - ...t - }) - } + const asset_info = getAmountDecimal(human_balance, 2) + const created_at = new Date(Date.parse(transaction.value.createdAt)) + const sent = transaction.value.from.toLowerCase() === current_account.address.toLowerCase() + + let asset_decimals = '.' + asset_info.decimals + + let icon + let asset_prefix = '' + if(transaction.type === 'asset') { + asset_decimals = '' + + if(transaction.value.type === 'PURCHASED') { + icon = 'PURCHASED' + asset_prefix = '+' + } else if(transaction.value.type === 'SOLD') { + icon = 'SOLD' + asset_prefix = '-' + } else if(transaction.value.type === 'SENT' || transaction.value.type === 'ORDER_CREATED') { + icon = 'SENT' + asset_prefix = '-' + } else if(transaction.value.type === 'RECEIVED' || transaction.value.type === 'ORDER_CANCELLED') { + icon = 'RECEIVED' + asset_prefix = '+' + }else if(transaction.value.type === 'RETIRED') { + icon = 'RETIRED' + asset_prefix = '-' + } else if(transaction.value.type === 'ISSUED') { + icon = 'ISSUED' + asset_prefix = '+' + } + } else { + if(sent) { + icon = 'SENT' + asset_prefix = '-' + } else { + icon = 'RECEIVED' + asset_prefix = '+' + } } - // Default sort by date with secondary sort by index (if available) - all_transactions.sort((a, b) => { - const dateA = new Date(a.value.createdAt); - const dateB = new Date(b.value.createdAt); - - // Compare dates in descending order - if (dateB > dateA) return 1; - if (dateA > dateB) return -1; - - // If dates are equal, compare indices in ascending order (treat undefined as Infinity) - const indexA = a.value.index || Infinity; - const indexB = b.value.index || Infinity; - - return indexB - indexA; - }); - - for(const transaction of all_transactions) { - if(!transaction.value) continue - - let asset_name = 'BBB' // Default - let asset_type = 'TOKENS' // Default - let human_balance = balanceToHuman(transaction.value.amount) - if(transaction.type === 'token') asset_name = transaction.value.tokenId - - if(transaction.type === 'asset') { - asset_name = 'CO2' - human_balance = transaction.value.amount - asset_type = 'CREDITS' - } - - const asset_info = getAmountDecimal(human_balance, 2) - const created_at = new Date(Date.parse(transaction.value.createdAt)) - const sent = transaction.value.from.toLowerCase() === current_account.address.toLowerCase() - - let asset_decimals = '.' + asset_info.decimals - - let icon - let asset_prefix = '' - if(transaction.type === 'asset') { - asset_decimals = '' - - if(transaction.value.type === 'PURCHASED') { - icon = 'PURCHASED' - asset_prefix = '+' - } else if(transaction.value.type === 'SOLD') { - icon = 'SOLD' - asset_prefix = '-' - } else if(transaction.value.type === 'SENT' || transaction.value.type === 'ORDER_CREATED') { - icon = 'SENT' - asset_prefix = '-' - } else if(transaction.value.type === 'RECEIVED' || transaction.value.type === 'ORDER_CANCELLED') { - icon = 'RECEIVED' - asset_prefix = '+' - }else if(transaction.value.type === 'RETIRED') { - icon = 'RETIRED' - asset_prefix = '-' - } else if(transaction.value.type === 'ISSUED') { - icon = 'ISSUED' - asset_prefix = '+' - } - } else { - if(sent) { - icon = 'SENT' - asset_prefix = '-' - } else { - icon = 'RECEIVED' - asset_prefix = '+' - } - } - - await screen.append('#bordered_content #transactions', 'transaction/list_item', { - asset_name: asset_name, - hash: transaction.value.hash, - created_at: created_at.getDate(), - created_at_month: created_at.toLocaleString('default', { month: 'short' }), - asset_amount: asset_prefix + asset_info.amount, - asset_decimals: asset_decimals, - asset_type: asset_type, - icon: icon, - received: !sent ? '' : 'd-none hidden', + await screen.append('#bordered_content #transactions', 'transaction/list_item', { + asset_name: asset_name, + hash: transaction.value.hash, + created_at: created_at.getDate(), + created_at_month: created_at.toLocaleString('default', { month: 'short' }), + asset_amount: asset_prefix + asset_info.amount, + asset_decimals: asset_decimals, + asset_type: asset_type, + icon: icon, + received: !sent ? '' : 'd-none hidden', + }) + } + + if(all_transactions?.length < 1) { + await screen.append('#bordered_content #transactions', 'shared/alert', { + message: 'No transactions found yet.', + alert_type: 'alert-info' + }) + } + + // hide loading + const loading_el = document.querySelector("#loading_content") + setTimeout(() => { + loading_el.classList.remove('active') + screen.unFreezeRoot() + }, 600) + + anime({ + targets: '#transactions .button-item', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 250, + delay: function(el, i) { return (i * 150) > 1200 ? 1200 : (i * 150) }, + }); + + screen.setListeners([ + { + element: '#root #transactions .button-item', + listener: async(e) => { + if(!e.target.dataset?.hash) return false + + const transaction = all_transactions.find((t) => { + return e.target.dataset?.hash.toLowerCase() === t.value.hash.toLowerCase() }) - } - if(all_transactions?.length < 1) { - await screen.append('#bordered_content #transactions', 'shared/alert', { - message: 'No transactions found yet.', - alert_type: 'alert-info' + // TODO: temp disable asset transaction details. + if(transaction?.type === 'asset' || transaction?.type === 'token') return + + return await goToScreen('transactionDetailsScreen', { + hash: e.target.dataset?.hash }) + } } + ]) - // hide loading + function showLoading() { const loading_el = document.querySelector("#loading_content") - setTimeout(() => { - loading_el.classList.remove('active') - screen.unFreezeRoot() - }, 600) - - anime({ - targets: '#transactions .button-item', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 250, - delay: function(el, i) { return (i * 150) > 1200 ? 1200 : (i * 150) }, - }); - - screen.setListeners([ - { - element: '#root #transactions .button-item', - listener: async(e) => { - if(!e.target.dataset?.hash) return false - - const transaction = all_transactions.find((t) => { - return e.target.dataset?.hash.toLowerCase() === t.value.hash.toLowerCase() - }) - - // TODO: temp disable asset transaction details. - if(transaction?.type === 'asset' || transaction?.type === 'token') return - - return await goToScreen('transactionDetailsScreen', { - hash: e.target.dataset?.hash - }) - } - } - ]) - - function showLoading() { - const loading_el = document.querySelector("#loading_content") - - loading_el.classList.add('active') - - screen.freezeRoot() - } + + loading_el.classList.add('active') + + screen.freezeRoot() + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/wallet.js b/packages/browser-wallet-ui/src/screens/wallet.js index 03ebeb6..6863747 100644 --- a/packages/browser-wallet-ui/src/screens/wallet.js +++ b/packages/browser-wallet-ui/src/screens/wallet.js @@ -1,40 +1,37 @@ -import anime from 'animejs'; - import Screen, { goToScreen } from './index.js' -import { sendMessage } from "../messaging.js"; -import { WalletStore } from "@bitgreen/browser-wallet-core"; +import anime from 'animejs'; export default async function walletScreen() { - const screen = new Screen({ - template_name: 'layouts/default', - header: true, - login: false, - smooth_load: true, - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/default', + header: true, + login: false, + smooth_load: true, + }) + await screen.init() - await screen.set('#heading', 'shared/heading', { - title: 'Get Started' - }) + await screen.set('#heading', 'shared/heading', { + title: 'Get Started' + }) - await screen.set('#bordered_content', 'wallet/index') + await screen.set('#bordered_content', 'wallet/index') - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); + anime({ + targets: '#bordered_content', + opacity: [0, 1], + translateY: [20, 0], + easing: 'easeInOutSine', + duration: 400 + }); - screen.setListeners([ - { - element: '#new_wallet', - listener: () => goToScreen('walletCreateScreen') - }, - { - element: '#import_wallet', - listener: () => goToScreen('walletImportScreen') - } - ]) + screen.setListeners([ + { + element: '#new_wallet', + listener: () => goToScreen('walletCreateScreen') + }, + { + element: '#import_wallet', + listener: () => goToScreen('walletImportScreen') + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/walletBackup.js b/packages/browser-wallet-ui/src/screens/walletBackup.js index e869454..2fecab1 100644 --- a/packages/browser-wallet-ui/src/screens/walletBackup.js +++ b/packages/browser-wallet-ui/src/screens/walletBackup.js @@ -1,128 +1,126 @@ -import Screen, { goBackScreen, goToScreen } from './index.js' +import Screen, { goBackScreen } from './index.js' import { randomString } from '@bitgreen/browser-wallet-utils' import { sendMessage } from "../messaging.js"; - +import { showNotification } from "../notifications.js"; import DOMPurify from 'dompurify'; import anime from 'animejs'; -import { showNotification } from "../notifications.js"; export default async function walletBackupScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Back Up Wallet' - }, - header: false - // smooth_load: true + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Back Up Wallet' + }, + header: false + }) + await screen.init() + + await screen.set('.content', 'wallet/backup') + + let copy_mnemonic = '' + + let index = 1 + for(const w of Array(12).fill()) { + const value = randomString(Math.floor(Math.random() * 4) + 3) + await screen.append('#backup_mnemonics', 'wallet/partial/word', { + index: index++, value }) - await screen.init() + } + + const input_field = document.querySelector("#root .footer #password") + const show_password = document.querySelector("#root .footer .show-password") + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#reveal_mnemonics', + listener: () => revealMnemonics() + }, + { + element: '#copy_seed', + listener: async() => { + await navigator.clipboard.writeText(copy_mnemonic); + + await showNotification('Secret phrase copied to your clipboard! Keep it safe!', 'info') + } + }, + { + element: '#password', + type: 'keypress', + listener: async(e) => { + if(e.key === 'Enter') { + await revealMnemonics() + } + } + }, + { + element: '#root .footer .show-password', + listener: () => { + if(input_field.type === 'password') { + input_field.type = 'text' + show_password.innerHTML = '' + } else { + input_field.type = 'password' + show_password.innerHTML = '' + } + } + } + ]) - await screen.set('.content', 'wallet/backup') + const revealMnemonics = async() => { + const password = DOMPurify.sanitize(document.querySelector('#password_input #password').value) + + const mnemonics = await sendMessage('reveal_mnemonic', { + password + }) - let copy_mnemonic = '' + if(mnemonics) { + copy_mnemonic = mnemonics - let index = 1 - for(const w of Array(12).fill()) { - const value = randomString(Math.floor(Math.random() * 4) + 3) + await screen.reset('#backup_mnemonics') + let index = 1 + for(const word of mnemonics.split(' ')) { await screen.append('#backup_mnemonics', 'wallet/partial/word', { - index: index++, value + index: index++, + value: word }) + } + + document.querySelector('#backup_mnemonics').classList.remove('mnemonics-hidden') + document.querySelector('#copy_seed').classList.remove('btn-hidden') + + anime({ + targets: '#password_input', + duration: 300, + translateY: [0, 60], + opacity: [1, 0], + easing: 'linear', + delay: 0 + }); + + anime({ + targets: '#copy_seed', + duration: 300, + opacity: [0, 1], + easing: 'linear', + delay: 1200 + }); + + anime({ + targets: '#backup_mnemonics .badge .text', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 250, + delay: function(el, i) { return i * 50 + 1200 }, + }); + } else { + await showNotification('Password is wrong!', 'error') } - const input_field = document.querySelector("#root .footer #password") - const show_password = document.querySelector("#root .footer .show-password") - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#reveal_mnemonics', - listener: () => revealMnemonics() - }, - { - element: '#copy_seed', - listener: async() => { - await navigator.clipboard.writeText(copy_mnemonic); - - await showNotification('Secret phrase copied to your clipboard! Keep it safe!', 'info') - } - }, - { - element: '#password', - type: 'keypress', - listener: async(e) => { - if(e.key === 'Enter') { - await revealMnemonics() - } - } - }, - { - element: '#root .footer .show-password', - listener: () => { - if(input_field.type === 'password') { - input_field.type = 'text' - show_password.innerHTML = '' - } else { - input_field.type = 'password' - show_password.innerHTML = '' - } - } - } - ]) - - const revealMnemonics = async() => { - const password = DOMPurify.sanitize(document.querySelector('#password_input #password').value) - - const mnemonics = await sendMessage('reveal_mnemonic', { - password - }) - - if(mnemonics) { - copy_mnemonic = mnemonics - - await screen.reset('#backup_mnemonics') - let index = 1 - for(const word of mnemonics.split(' ')) { - await screen.append('#backup_mnemonics', 'wallet/partial/word', { - index: index++, - value: word - }) - } - - document.querySelector('#backup_mnemonics').classList.remove('mnemonics-hidden') - document.querySelector('#copy_seed').classList.remove('btn-hidden') - - anime({ - targets: '#password_input', - duration: 300, - translateY: [0, 60], - opacity: [1, 0], - easing: 'linear', - delay: 0 - }); - - anime({ - targets: '#copy_seed', - duration: 300, - opacity: [0, 1], - easing: 'linear', - delay: 1200 - }); - - anime({ - targets: '#backup_mnemonics .badge .text', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 250, - delay: function(el, i) { return i * 50 + 1200 }, - }); - } else { - await showNotification('Password is wrong!', 'error') - } - - show_password.innerHTML = '' - input_field.type = 'password' - } + show_password.innerHTML = '' + input_field.type = 'password' + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/walletConfirm.js b/packages/browser-wallet-ui/src/screens/walletConfirm.js index 09c4aeb..a5376a1 100644 --- a/packages/browser-wallet-ui/src/screens/walletConfirm.js +++ b/packages/browser-wallet-ui/src/screens/walletConfirm.js @@ -10,157 +10,155 @@ let user_mnemonic_array = []; let user_mnemonic_sortable = []; export default async function walletConfirmScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Create Wallet', - equal_padding: '' - }, - login: false, - header: false - // smooth_load: true - }) - await screen.init() - - await screen.set('.content', 'wallet/confirm') - - if(params.mnemonic) { - mnemonic_array = params.mnemonic - shuffled_mnemonic_array = shuffleArray(params.mnemonic); - let index = 0 - for(const value of shuffled_mnemonic_array) { - // const index = params.mnemonic.indexOf(value); - await screen.append('#shuffled_mnemonics', 'wallet/partial/word-no-index', { - value, index: index++ - }) - } + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Create Wallet', + equal_padding: '' + }, + login: false, + header: false + }) + await screen.init() + + await screen.set('.content', 'wallet/confirm') + + if(params.mnemonic) { + mnemonic_array = params.mnemonic + shuffled_mnemonic_array = shuffleArray(params.mnemonic); + let index = 0 + for(const value of shuffled_mnemonic_array) { + await screen.append('#shuffled_mnemonics', 'wallet/partial/word-no-index', { + value, index: index++ + }) } - - const user_mnemonics_el = document.querySelector("#user_mnemonics"); - user_mnemonic_sortable = Sortable.create(user_mnemonics_el, { - dataIdAttr: 'data-id', - easing: "cubic-bezier(1, 0, 0, 1)", - animation: 150, - invertSwap: true, - emptyInsertThreshold: 100, - onUpdate: function(evt) { - refreshUserMnemonics() - checkWords() - }, - onChoose: function(evt) { - evt.item.classList.add('selected') - document.querySelector("#user_mnemonics").classList.add('dragging') - }, - onUnchoose: function(evt) { - evt.item.classList.remove('selected') - document.querySelector("#user_mnemonics").classList.remove('dragging') - } - }); - - anime({ - targets: '#shuffled_mnemonics .word', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 150, - delay: function(el, i) { - return i*50 - }, - }); - - anime({ - targets: '#shuffled_mnemonics', - opacity: [0, 1], - duration: 0 - }); - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#shuffled_mnemonics', - listener: addWord - }, - { - element: '#user_mnemonics', - listener: removeWord - }, - { - element: '#continue_new_key', - listener: () => goToScreen('walletPasswordScreen', params) - } - ]) + } + + const user_mnemonics_el = document.querySelector("#user_mnemonics"); + user_mnemonic_sortable = Sortable.create(user_mnemonics_el, { + dataIdAttr: 'data-id', + easing: "cubic-bezier(1, 0, 0, 1)", + animation: 150, + invertSwap: true, + emptyInsertThreshold: 100, + onUpdate: function(evt) { + refreshUserMnemonics() + checkWords() + }, + onChoose: function(evt) { + evt.item.classList.add('selected') + document.querySelector("#user_mnemonics").classList.add('dragging') + }, + onUnchoose: function(evt) { + evt.item.classList.remove('selected') + document.querySelector("#user_mnemonics").classList.remove('dragging') + } + }); + + anime({ + targets: '#shuffled_mnemonics .word', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 150, + delay: function(el, i) { + return i*50 + }, + }); + + anime({ + targets: '#shuffled_mnemonics', + opacity: [0, 1], + duration: 0 + }); + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#shuffled_mnemonics', + listener: addWord + }, + { + element: '#user_mnemonics', + listener: removeWord + }, + { + element: '#continue_new_key', + listener: () => goToScreen('walletPasswordScreen', params) + } + ]) } function addWord(e) { - let word_el = e.target - let index = word_el.dataset.index - let word = shuffled_mnemonic_array[index]; + let word_el = e.target + let index = word_el.dataset.index + let word = shuffled_mnemonic_array[index]; - if(!word) { - return false; - } + if(!word) { + return false; + } - shuffled_mnemonic_array.splice(shuffled_mnemonic_array.indexOf(shuffled_mnemonic_array[index]), 1) + shuffled_mnemonic_array.splice(shuffled_mnemonic_array.indexOf(shuffled_mnemonic_array[index]), 1) - refreshUserMnemonics(word) + refreshUserMnemonics(word) - checkWords() + checkWords() } function removeWord(e) { - let word_el = e.target - let index = word_el.dataset.index - let word = user_mnemonic_array[index]; + let word_el = e.target + let index = word_el.dataset.index + let word = user_mnemonic_array[index]; - if(!word) { - return false; - } + if(!word) { + return false; + } - shuffled_mnemonic_array.push(word) + shuffled_mnemonic_array.push(word) - refreshUserMnemonics(index, 'remove'); + refreshUserMnemonics(index, 'remove'); - checkWords() + checkWords() } function refreshUserMnemonics(word = null, action = 'add') { - user_mnemonic_array = user_mnemonic_sortable.toArray() - - if(word && action === 'add') { - user_mnemonic_array.push(word) - } else if(word && action === 'remove') { - user_mnemonic_array.splice(user_mnemonic_array.indexOf(user_mnemonic_array[word]), 1) - } - - let user_mnemonics = ''; - user_mnemonic_array.forEach(function(val, index) { - user_mnemonics = user_mnemonics + '
' + (index + 1) + '' + val + '
'; - }) - - let shuffled_mnemonics = ''; - shuffled_mnemonic_array.forEach(function(val, index) { - shuffled_mnemonics = shuffled_mnemonics + '
' + val + '
'; - }) - - if(user_mnemonic_array.length > 0) { - document.querySelector("#user_mnemonics").classList.remove('hidden') - } else { - document.querySelector("#user_mnemonics").classList.add('hidden') - } - - document.querySelector("#user_mnemonics").innerHTML = user_mnemonics; - document.querySelector("#shuffled_mnemonics").innerHTML = shuffled_mnemonics; + user_mnemonic_array = user_mnemonic_sortable.toArray() + + if(word && action === 'add') { + user_mnemonic_array.push(word) + } else if(word && action === 'remove') { + user_mnemonic_array.splice(user_mnemonic_array.indexOf(user_mnemonic_array[word]), 1) + } + + let user_mnemonics = ''; + user_mnemonic_array.forEach(function(val, index) { + user_mnemonics = user_mnemonics + '
' + (index + 1) + '' + val + '
'; + }) + + let shuffled_mnemonics = ''; + shuffled_mnemonic_array.forEach(function(val, index) { + shuffled_mnemonics = shuffled_mnemonics + '
' + val + '
'; + }) + + if(user_mnemonic_array.length > 0) { + document.querySelector("#user_mnemonics").classList.remove('hidden') + } else { + document.querySelector("#user_mnemonics").classList.add('hidden') + } + + document.querySelector("#user_mnemonics").innerHTML = user_mnemonics; + document.querySelector("#shuffled_mnemonics").innerHTML = shuffled_mnemonics; } function checkWords() { - if(JSON.stringify(user_mnemonic_array) === JSON.stringify(mnemonic_array)) { - document.querySelector("#continue_new_key").classList.remove('disabled') - document.querySelector("#continue_new_key").classList.add('btn-primary') - } else { - document.querySelector("#continue_new_key").classList.add('disabled') - document.querySelector("#continue_new_key").classList.remove('btn-primary') - } + if(JSON.stringify(user_mnemonic_array) === JSON.stringify(mnemonic_array)) { + document.querySelector("#continue_new_key").classList.remove('disabled') + document.querySelector("#continue_new_key").classList.add('btn-primary') + } else { + document.querySelector("#continue_new_key").classList.add('disabled') + document.querySelector("#continue_new_key").classList.remove('btn-primary') + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/walletCreate.js b/packages/browser-wallet-ui/src/screens/walletCreate.js index 0fdf36a..218098f 100644 --- a/packages/browser-wallet-ui/src/screens/walletCreate.js +++ b/packages/browser-wallet-ui/src/screens/walletCreate.js @@ -1,191 +1,188 @@ import Screen, {clearHistory, goBackScreen, goToScreen, updateCurrentParams} from './index.js' +import { WalletStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; - -import anime from 'animejs'; import { sendMessage } from "../messaging.js"; -import {WalletStore} from "@bitgreen/browser-wallet-core"; -import {isIOs} from "@bitgreen/browser-wallet-utils"; +import anime from 'animejs'; export default async function walletCreateScreen(params) { - let current_words = 12 - let mnemonic = params?.mnemonic + let current_words = 12 + let mnemonic = params?.mnemonic - const url_params = new URLSearchParams(window.location.search) + const url_params = new URLSearchParams(window.location.search) - if(url_params.has('popup')) { - await sendMessage('new_wallet_screen') - window.close() - return - } + if(url_params.has('popup')) { + await sendMessage('new_wallet_screen') + window.close() + return + } - const wallet_store = new WalletStore() - if(await wallet_store.exists()) { - await clearHistory() - return await goToScreen('dashboardScreen', {}, false, true) - } + const wallet_store = new WalletStore() + if(await wallet_store.exists()) { + await clearHistory() + return await goToScreen('dashboardScreen', {}, false, true) + } - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Create Wallet', - equal_padding: '' - }, - login: false, - header: false - // smooth_load: true - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Create Wallet', + equal_padding: '' + }, + login: false, + header: false + }) + await screen.init() - await screen.set('.content', 'wallet/create') + await screen.set('.content', 'wallet/create') - if(!mnemonic) { - mnemonic = await regenerateWords(current_words) - } + if(!mnemonic) { + mnemonic = await regenerateWords(current_words) + } - const button_left = document.querySelector(".choose-words .btn.btn-left") - const button_right = document.querySelector(".choose-words .btn.btn-right") + const button_left = document.querySelector(".choose-words .btn.btn-left") + const button_right = document.querySelector(".choose-words .btn.btn-right") - if(mnemonic.length === 24) { - current_words = 24 + if(mnemonic.length === 24) { + current_words = 24 - window.resizeTo(400, 680) // Extend window height + window.resizeTo(400, 680) // Extend window height - button_left.classList.remove('btn-secondary') - button_right.classList.add('btn-secondary') - } else { - current_words = 12 + button_left.classList.remove('btn-secondary') + button_right.classList.add('btn-secondary') + } else { + current_words = 12 - button_left.classList.add('btn-secondary') - button_right.classList.remove('btn-secondary') - } + button_left.classList.add('btn-secondary') + button_right.classList.remove('btn-secondary') + } - for(const value of mnemonic) { - const index = mnemonic.indexOf(value); - await screen.append('#mnemonics', 'wallet/partial/word', { - value, index: index+1 - }) - } + for(const value of mnemonic) { + const index = mnemonic.indexOf(value); + await screen.append('#mnemonics', 'wallet/partial/word', { + value, index: index+1 + }) + } + + anime({ + targets: '.icon-alert', + scale: [1, 0.8, 1.2, 1], + easing: 'easeInOutSine', + duration: 1600, + delay: 200, + }); + + anime({ + targets: '#mnemonics', + opacity: [0, 1], + duration: 0 + }); + + anime({ + targets: '#mnemonics .word', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 150, + delay: function(el, i) { return i * 50 }, + }); + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#import_wallet', + listener: () => goToScreen('walletScreen') + }, + { + element: '#agree_new_key', + type: 'change', + listener: () => agreeNewKey() + }, + { + element: '#continue_new_key', + listener: () => goToScreen('walletConfirmScreen', { + mnemonic + }) + }, + { + element: '#copy_seed', + listener: () => copySeed(mnemonic) + }, + { + element: '.choose-words .btn', + listener: async(e) => { + const button_left = document.querySelector(".choose-words .btn.btn-left") + const button_right = document.querySelector(".choose-words .btn.btn-right") + + const words = parseInt(e.target.dataset.words) + + if(words === current_words) return false + current_words = words === 24 ? 24 : 12 + + if(current_words === 24) { + screen.resizeTo(400, 680) // Extend window height + + button_left.classList.remove('btn-secondary') + button_right.classList.add('btn-secondary') + } else { + screen.resizeTo(400, 600) // Reset window height + + + button_left.classList.add('btn-secondary') + button_right.classList.remove('btn-secondary') + } - anime({ - targets: '.icon-alert', - scale: [1, 0.8, 1.2, 1], - easing: 'easeInOutSine', - duration: 1600, - delay: 200, - }); - - anime({ - targets: '#mnemonics', - opacity: [0, 1], - duration: 0 - }); - - anime({ - targets: '#mnemonics .word', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 150, - delay: function(el, i) { return i * 50 }, - }); - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#import_wallet', - listener: () => goToScreen('walletScreen') - }, - { - element: '#agree_new_key', - type: 'change', - listener: () => agreeNewKey() - }, - { - element: '#continue_new_key', - listener: () => goToScreen('walletConfirmScreen', { - mnemonic - }) - }, - { - element: '#copy_seed', - listener: () => copySeed(mnemonic) - }, - { - element: '.choose-words .btn', - listener: async(e) => { - const button_left = document.querySelector(".choose-words .btn.btn-left") - const button_right = document.querySelector(".choose-words .btn.btn-right") - - const words = parseInt(e.target.dataset.words) - - if(words === current_words) return false - current_words = words === 24 ? 24 : 12 - - if(current_words === 24) { - screen.resizeTo(400, 680) // Extend window height - - button_left.classList.remove('btn-secondary') - button_right.classList.add('btn-secondary') - } else { - screen.resizeTo(400, 600) // Reset window height - - - button_left.classList.add('btn-secondary') - button_right.classList.remove('btn-secondary') - } - - await screen.reset('#mnemonics') - mnemonic = await regenerateWords(current_words) - for(const value of mnemonic) { - const index = mnemonic.indexOf(value); - await screen.append('#mnemonics', 'wallet/partial/word', { - value, index: index+1 - }) - } - - anime({ - targets: '#mnemonics .word', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 150, - delay: function(el, i) { return i * 50 }, - }); - } + await screen.reset('#mnemonics') + mnemonic = await regenerateWords(current_words) + for(const value of mnemonic) { + const index = mnemonic.indexOf(value); + await screen.append('#mnemonics', 'wallet/partial/word', { + value, index: index+1 + }) } - ]) + + anime({ + targets: '#mnemonics .word', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 150, + delay: function(el, i) { return i * 50 }, + }); + } + } + ]) } function agreeNewKey() { - let agree = document.querySelector("#agree_new_key"); - let continue_new_key = document.querySelector("#continue_new_key"); - - if(agree.checked === true) { - continue_new_key.classList.remove('disabled') - continue_new_key.classList.add('btn-primary') - } else { - continue_new_key.classList.add('disabled') - continue_new_key.classList.remove('btn-primary') - } + let agree = document.querySelector("#agree_new_key"); + let continue_new_key = document.querySelector("#continue_new_key"); + + if(agree.checked === true) { + continue_new_key.classList.remove('disabled') + continue_new_key.classList.add('btn-primary') + } else { + continue_new_key.classList.add('disabled') + continue_new_key.classList.remove('btn-primary') + } } async function regenerateWords(words) { - const mnemonic = await sendMessage('new_wallet', { - words: words - }) - updateCurrentParams({ - mnemonic - }) - return mnemonic + const mnemonic = await sendMessage('new_wallet', { + words: words + }) + updateCurrentParams({ + mnemonic + }) + return mnemonic } async function copySeed(mnemonic_array) { - await navigator.clipboard.writeText(mnemonic_array.join(' ')); + await navigator.clipboard.writeText(mnemonic_array.join(' ')); - await showNotification('Secret phrase copied to your clipboard! Keep it safe!', 'info') + await showNotification('Secret phrase copied to your clipboard! Keep it safe!', 'info') } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/walletFinish.js b/packages/browser-wallet-ui/src/screens/walletFinish.js index 91be860..e2c26da 100644 --- a/packages/browser-wallet-ui/src/screens/walletFinish.js +++ b/packages/browser-wallet-ui/src/screens/walletFinish.js @@ -3,81 +3,81 @@ import Screen, { goToScreen, clearHistory, updateAccounts } from './index.js' import anime from 'animejs'; export default async function walletFinishScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page_content', - login: false, - header: false - }) - await screen.init() + const screen = new Screen({ + template_name: 'layouts/full_page_content', + login: false, + header: false + }) + await screen.init() - await screen.set('.content', 'wallet/finish', { - message: params?.imported ? 'imported' : 'created' - }) + await screen.set('.content', 'wallet/finish', { + message: params?.imported ? 'imported' : 'created' + }) - if(!params?.imported) { - await screen.set('#create_new_account', 'global/button', { - id: 'new_account', - title: 'Create another account', - class: 'btn-text btn-sm', - icon: 'icon-plus me-2' - }) - } + if(!params?.imported) { + await screen.set('#create_new_account', 'global/button', { + id: 'new_account', + title: 'Create another account', + class: 'btn-text btn-sm', + icon: 'icon-plus me-2' + }) + } - await clearHistory() - await updateAccounts() + await clearHistory() + await updateAccounts() - anime({ - targets: '#success_icon', - translateY: [-50, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 400, - }); + anime({ + targets: '#success_icon', + translateY: [-50, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 400, + }); - anime({ - targets: '#heading_text', - translateY: [50, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 400, - }); + anime({ + targets: '#heading_text', + translateY: [50, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 400, + }); - anime({ - targets: '#message_text', - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 600, - delay: 800 - }); + anime({ + targets: '#message_text', + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 600, + delay: 800 + }); - anime({ - targets: '#new_account', - translateX: [-40, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 800, - }); + anime({ + targets: '#new_account', + translateX: [-40, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 800, + }); - anime({ - targets: '#go_to_dashboard', - translateX: [-50, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 400, - delay: 1000, - }); + anime({ + targets: '#go_to_dashboard', + translateX: [-50, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 400, + delay: 1000, + }); - screen.setListeners([ - { - element: '#go_to_dashboard', - listener: () => goToScreen('dashboardScreen') - }, - { - element: '#new_account', - listener: () => goToScreen('accountCreateScreen') - } - ]) + screen.setListeners([ + { + element: '#go_to_dashboard', + listener: () => goToScreen('dashboardScreen') + }, + { + element: '#new_account', + listener: () => goToScreen('accountCreateScreen') + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/walletImport.js b/packages/browser-wallet-ui/src/screens/walletImport.js index b903a2e..8c630c7 100644 --- a/packages/browser-wallet-ui/src/screens/walletImport.js +++ b/packages/browser-wallet-ui/src/screens/walletImport.js @@ -10,178 +10,177 @@ let import_mnemonic_array = []; let import_mnemonic_sortable = []; export default async function walletImportScreen(params = {}) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Import Wallet' - }, - login: false, - header: false - // smooth_load: true - }) - await screen.init() - - await screen.set('.content', 'wallet/import') - - import_mnemonic_array = [] - if(params.mnemonic) { - importWord(false, params.mnemonic.join(' ')) + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Import Wallet' + }, + login: false, + header: false + }) + await screen.init() + + await screen.set('.content', 'wallet/import') + + import_mnemonic_array = [] + if(params.mnemonic) { + importWord(false, params.mnemonic.join(' ')) + } + + let import_mnemonics_el = document.querySelector("#import_mnemonics"); + import_mnemonic_sortable = Sortable.create(import_mnemonics_el, { + dataIdAttr: 'data-id', + easing: "cubic-bezier(1, 0, 0, 1)", + animation: 150, + invertSwap: true, + emptyInsertThreshold: 100, + onUpdate: (evt) => { + refreshImportedMnemonics(); + checkMnemonics() + }, + onChoose: (evt) => { + evt.item.classList.add('selected') + document.querySelector("#import_mnemonics").classList.add('dragging') + }, + onUnchoose: (evt) => { + evt.item.classList.remove('selected') + document.querySelector("#import_mnemonics").classList.remove('dragging') } - - let import_mnemonics_el = document.querySelector("#import_mnemonics"); - import_mnemonic_sortable = Sortable.create(import_mnemonics_el, { - dataIdAttr: 'data-id', - easing: "cubic-bezier(1, 0, 0, 1)", - animation: 150, - invertSwap: true, - emptyInsertThreshold: 100, - onUpdate: (evt) => { - refreshImportedMnemonics(); - checkMnemonics() - }, - onChoose: (evt) => { - evt.item.classList.add('selected') - document.querySelector("#import_mnemonics").classList.add('dragging') - }, - onUnchoose: (evt) => { - evt.item.classList.remove('selected') - document.querySelector("#import_mnemonics").classList.remove('dragging') - } - }); - - await refreshImportedMnemonics() - checkMnemonics() - - anime({ - targets: '#shuffled_mnemonics .word', - translateX: [-20, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: 150, - delay: function(el, i) { - return i*50 - }, - }); - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#import_word', - listener: importWord - }, - { - element: '#import_mnemonics', - listener: removeWord - }, - { - element: '#keyword', - type: 'keypress', - listener: (e) => { - if(e.key === "Enter") { - importWord(false) - } - } - }, - { - element: '#continue_new_key', - listener: () => { - updateCurrentParams({ - mnemonic: import_mnemonic_array - }) - goToScreen('walletPasswordScreen', { - mnemonic: import_mnemonic_array, - imported: true - }) - } + }); + + await refreshImportedMnemonics() + checkMnemonics() + + anime({ + targets: '#shuffled_mnemonics .word', + translateX: [-20, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: 150, + delay: function(el, i) { + return i*50 + }, + }); + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#import_word', + listener: importWord + }, + { + element: '#import_mnemonics', + listener: removeWord + }, + { + element: '#keyword', + type: 'keypress', + listener: (e) => { + if(e.key === "Enter") { + importWord(false) } - ]) + } + }, + { + element: '#continue_new_key', + listener: () => { + updateCurrentParams({ + mnemonic: import_mnemonic_array + }) + goToScreen('walletPasswordScreen', { + mnemonic: import_mnemonic_array, + imported: true + }) + } + } + ]) } function importWord(e, input = false) { - if(!input) { - input = DOMPurify.sanitize(document.querySelector("#keyword").value); - } - document.querySelector("#keyword").value = '' - - if(!input) { - return false; - } - - for(const value of input.split(',')) { - const index = input.indexOf(value); - for(const word of value.split(' ')) { - const index = input.indexOf(value); - if(word) { - // max 24 words - if(import_mnemonic_array.length >= 24) { - return false; - } - // maximum word length is 8 - refreshImportedMnemonics(word.trim().substring(0, 8)); - } - refreshImportedMnemonics() + if(!input) { + input = DOMPurify.sanitize(document.querySelector("#keyword").value); + } + document.querySelector("#keyword").value = '' + + if(!input) { + return false; + } + + for(const value of input.split(',')) { + const index = input.indexOf(value); + for(const word of value.split(' ')) { + const index = input.indexOf(value); + if(word) { + // max 24 words + if(import_mnemonic_array.length >= 24) { + return false; } + // maximum word length is 8 + refreshImportedMnemonics(word.trim().substring(0, 8)); + } + refreshImportedMnemonics() } + } - checkMnemonics() + checkMnemonics() } function removeWord(e) { - let word_el = e.target - let index = word_el.dataset.index - let word = import_mnemonic_array[index]; + let word_el = e.target + let index = word_el.dataset.index + let word = import_mnemonic_array[index]; - if(!word) { - return false; - } + if(!word) { + return false; + } - refreshImportedMnemonics(index, 'remove'); + refreshImportedMnemonics(index, 'remove'); - checkMnemonics() + checkMnemonics() } function refreshImportedMnemonics(word = null, action = 'add') { - import_mnemonic_array = import_mnemonic_sortable.toArray() - - if(word && action === 'add') { - import_mnemonic_array.push(word) - } else if(word && action === 'remove') { - import_mnemonic_array.splice(import_mnemonic_array.indexOf(import_mnemonic_array[word]), 1) - } - - let import_mnemonics = ''; - import_mnemonic_array.forEach(function(val, index) { - import_mnemonics = import_mnemonics + '
'+(index+1)+''+val+'
'; - }) - - if(import_mnemonic_array.length > 0) { - document.querySelector("#mnemonics_info").classList.remove('hidden') - document.querySelector("#import_mnemonics").classList.remove('hidden') - } else { - document.querySelector("#mnemonics_info").classList.add('hidden') - document.querySelector("#import_mnemonics").classList.add('hidden') - } - - document.querySelector("#import_mnemonics").innerHTML = import_mnemonics; + import_mnemonic_array = import_mnemonic_sortable.toArray() + + if(word && action === 'add') { + import_mnemonic_array.push(word) + } else if(word && action === 'remove') { + import_mnemonic_array.splice(import_mnemonic_array.indexOf(import_mnemonic_array[word]), 1) + } + + let import_mnemonics = ''; + import_mnemonic_array.forEach(function(val, index) { + import_mnemonics = import_mnemonics + '
'+(index+1)+''+val+'
'; + }) + + if(import_mnemonic_array.length > 0) { + document.querySelector("#mnemonics_info").classList.remove('hidden') + document.querySelector("#import_mnemonics").classList.remove('hidden') + } else { + document.querySelector("#mnemonics_info").classList.add('hidden') + document.querySelector("#import_mnemonics").classList.add('hidden') + } + + document.querySelector("#import_mnemonics").innerHTML = import_mnemonics; } function checkMnemonics() { - let m = '' - import_mnemonic_array.forEach(function(word, index) { - m = m + ' ' + word.trim(); - }); - m = m.trim() - - const isValidMnemonic = mnemonicValidate(m); - - if(!isValidMnemonic) { - document.querySelector("#continue_new_key").classList.add('disabled') - document.querySelector("#continue_new_key").classList.remove('btn-primary') - } else { - document.querySelector("#continue_new_key").classList.remove('disabled') - document.querySelector("#continue_new_key").classList.add('btn-primary') - } + let m = '' + import_mnemonic_array.forEach(function(word, index) { + m = m + ' ' + word.trim(); + }); + m = m.trim() + + const isValidMnemonic = mnemonicValidate(m); + + if(!isValidMnemonic) { + document.querySelector("#continue_new_key").classList.add('disabled') + document.querySelector("#continue_new_key").classList.remove('btn-primary') + } else { + document.querySelector("#continue_new_key").classList.remove('disabled') + document.querySelector("#continue_new_key").classList.add('btn-primary') + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/walletPassword.js b/packages/browser-wallet-ui/src/screens/walletPassword.js index 0555f09..5ae5b3d 100644 --- a/packages/browser-wallet-ui/src/screens/walletPassword.js +++ b/packages/browser-wallet-ui/src/screens/walletPassword.js @@ -6,274 +6,273 @@ import { showNotification } from "../notifications.js"; import anime from "animejs"; export default async function walletPasswordScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: 'Create Wallet', - equal_padding: '' - }, - login: false, - header: false - // smooth_load: true + const screen = new Screen({ + template_name: 'layouts/full_page', + template_params: { + title: 'Create Wallet', + equal_padding: '' + }, + login: false, + header: false + }) + await screen.init() + + await screen.set('.content', 'wallet/password') + + await screen.append('#root', 'global/loading', { + title: 'Wallet Setup in Progress', + desc: 'Hold on tight as we prepare your wallet for use. Please be patient.', + top: '0', + padding_top: '80px', + checkmark_top: '128px' + }); + + if(params?.imported) { + // TODO: do not show for now + await screen.append('#loading_content #content .done', 'global/button', { + id: 'new_account', + title: 'Import another wallet', + class: 'btn-white btn-sm w-75 mt-2 d-none transparent-element', + icon: 'icon-import me-2' }) - await screen.init() - - await screen.set('.content', 'wallet/password') - - await screen.append('#root', 'global/loading', { - title: 'Wallet Setup in Progress', - desc: 'Hold on tight as we prepare your wallet for use. Please be patient.', - top: '0', - padding_top: '80px', - checkmark_top: '128px' - }); - - if(params?.imported) { - // do not show for now - await screen.append('#loading_content #content .done', 'global/button', { - id: 'new_account', - title: 'Import another wallet', - class: 'btn-white btn-sm w-75 mt-2 d-none transparent-element', - icon: 'icon-import me-2' - }) - } else { - await screen.append('#loading_content #content .done', 'global/button', { - id: 'new_account', - title: 'Create another account', - class: 'btn-white btn-sm w-75 mt-2 transparent-element', - icon: 'icon-plus me-2' - }) - } - - await screen.append('#loading_content #content .done', 'global/button_right_icon', { - id: 'go_to_dashboard', - title: 'View Portfolio', - class: 'btn-primary btn-rounded btn-sm w-75 mt-2 transparent-element', - icon: 'icon-right-arrow me-2' + } else { + await screen.append('#loading_content #content .done', 'global/button', { + id: 'new_account', + title: 'Create another account', + class: 'btn-white btn-sm w-75 mt-2 transparent-element', + icon: 'icon-plus me-2' }) + } + + await screen.append('#loading_content #content .done', 'global/button_right_icon', { + id: 'go_to_dashboard', + title: 'View Portfolio', + class: 'btn-primary btn-rounded btn-sm w-75 mt-2 transparent-element', + icon: 'icon-right-arrow me-2' + }) + + const input_field_password = document.querySelector("#root #password") + const show_password_password = document.querySelector("#root .show-password-password") + const input_field_password_repeat = document.querySelector("#root #password_repeat") + const show_password_password_repeat = document.querySelector("#root .show-password-repeat") + + screen.setListeners([ + { + element: '.heading #go_back', + listener: () => goBackScreen() + }, + { + element: '#password', + type: 'input', + listener: checkPassword + }, + { + element: '#password_repeat', + type: 'input', + listener: checkPassword + }, + { + element: '#wallet_name', + type: 'input', + listener: checkPassword + }, + { + element: '#set_password', + listener: async() => { + showProcessing() + + const result = await sendMessage('save_wallet', { + mnemonic: params.mnemonic, + password: DOMPurify.sanitize(document.querySelector('#root #password')?.value), + name: DOMPurify.sanitize(document.querySelector('#root #wallet_name')?.value) + }) - const input_field_password = document.querySelector("#root #password") - const show_password_password = document.querySelector("#root .show-password-password") - const input_field_password_repeat = document.querySelector("#root #password_repeat") - const show_password_password_repeat = document.querySelector("#root .show-password-repeat") + if(result) { + setTimeout(() => { + showProcessingDone() + }, 10000) + } else { + await showNotification('Something went wrong. Please try again or contact us.', 'error', 2800, 0) + } - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#password', - type: 'input', - listener: checkPassword - }, - { - element: '#password_repeat', - type: 'input', - listener: checkPassword - }, - { - element: '#wallet_name', - type: 'input', - listener: checkPassword - }, - { - element: '#set_password', - listener: async() => { - showProcessing() - - const result = await sendMessage('save_wallet', { - mnemonic: params.mnemonic, - password: DOMPurify.sanitize(document.querySelector('#root #password')?.value), - name: DOMPurify.sanitize(document.querySelector('#root #wallet_name')?.value) - }) - - if(result) { - setTimeout(() => { - showProcessingDone() - }, 10000) - } else { - await showNotification('Something went wrong. Please try again or contact us.', 'error', 2800, 0) - } - - show_password_password.innerHTML = '' - input_field_password.type = 'password' - show_password_password_repeat.innerHTML = '' - input_field_password_repeat.type = 'password' - } - }, - { - element: '#go_to_dashboard', - listener: () => goToScreen('dashboardScreen') - }, - { - element: '#new_account', - listener: () => goToScreen('accountCreateScreen') - }, - { - element: '#root .show-password-password', - listener: () => { - if(input_field_password.type === 'password') { - input_field_password.type = 'text' - show_password_password.innerHTML = '' - } else { - input_field_password.type = 'password' - show_password_password.innerHTML = '' - } - } - }, - { - element: '#root .show-password-repeat', - listener: () => { - if(input_field_password_repeat.type === 'password') { - input_field_password_repeat.type = 'text' - show_password_password_repeat.innerHTML = '' - } else { - input_field_password_repeat.type = 'password' - show_password_password_repeat.innerHTML = '' - } - } + show_password_password.innerHTML = '' + input_field_password.type = 'password' + show_password_password_repeat.innerHTML = '' + input_field_password_repeat.type = 'password' + } + }, + { + element: '#go_to_dashboard', + listener: () => goToScreen('dashboardScreen') + }, + { + element: '#new_account', + listener: () => goToScreen('accountCreateScreen') + }, + { + element: '#root .show-password-password', + listener: () => { + if(input_field_password.type === 'password') { + input_field_password.type = 'text' + show_password_password.innerHTML = '' + } else { + input_field_password.type = 'password' + show_password_password.innerHTML = '' + } + } + }, + { + element: '#root .show-password-repeat', + listener: () => { + if(input_field_password_repeat.type === 'password') { + input_field_password_repeat.type = 'text' + show_password_password_repeat.innerHTML = '' + } else { + input_field_password_repeat.type = 'password' + show_password_password_repeat.innerHTML = '' } - ]) + } + } + ]) - const showProcessing = () => { - const loading_el = document.querySelector("#loading_content") + const showProcessing = () => { + const loading_el = document.querySelector("#loading_content") - loading_el.classList.add('active') - loading_el.classList.add('no-border-radius') + loading_el.classList.add('active') + loading_el.classList.add('no-border-radius') - screen.freezeRoot() - } + screen.freezeRoot() + } - const showProcessingDone = () => { - screen.unFreezeRoot() - - const loading_el = document.querySelector("#loading_content") - const checkmark_el = loading_el.querySelector("#checkmark") - const content_done_el = loading_el.querySelector("#content .done") - const content_init_text_el = loading_el.querySelector("#content .init .text") - const content_init_desc_el = loading_el.querySelector("#content .init .desc") - const content_done_text_el = loading_el.querySelector("#content .done .text") - const content_done_desc_el = loading_el.querySelector("#content .done .desc") - - const primary_element = document.querySelector('#loading_content #primary') - - primary_element.style.transition = "stroke-dasharray 0.4s ease-out, stroke-dashoffset 0.4s ease-out, stroke 0.4s ease-out"; - primary_element.style.strokeDasharray = "100 0"; - primary_element.style.strokeDashoffset = "0"; - - setTimeout(async() => { - loading_el.classList.add('dark') - - content_done_el.classList.add('active') - - if(params?.imported) { - content_done_text_el.innerHTML = 'Successfully imported wallet' - } else { - content_done_text_el.innerHTML = 'Successfully created wallet' - } - - content_done_desc_el.innerHTML = 'Congratulations, your wallet is ready to use.' - - content_init_text_el.classList.add('d-none') - content_init_desc_el.classList.add('d-none') - - anime({ - targets: '#loading_content #content .done .btn', - translateY: [-30, 0], - opacity: [0, 1], - easing: 'easeInOutSine', - duration: function(el, i) { - return 400 - }, - delay: function(el, i) { - return i*300 + 100 - }, - }); - }, 200) - - setTimeout(() => { - checkmark_el.classList.add('show') - }, 200) - - setTimeout(() => { - loading_el.classList.add('done') - }, 600) - - updateAccounts() - } -} + const showProcessingDone = () => { + screen.unFreezeRoot() -function checkPassword() { - const password_el = document.querySelector('#root #password') - const password_repeat_el = document.querySelector('#root #password_repeat') - const wallet_name_el = document.querySelector('#root #wallet_name') + const loading_el = document.querySelector("#loading_content") + const checkmark_el = loading_el.querySelector("#checkmark") + const content_done_el = loading_el.querySelector("#content .done") + const content_init_text_el = loading_el.querySelector("#content .init .text") + const content_init_desc_el = loading_el.querySelector("#content .init .desc") + const content_done_text_el = loading_el.querySelector("#content .done .text") + const content_done_desc_el = loading_el.querySelector("#content .done .desc") - let password = DOMPurify.sanitize(password_el?.value); - let password_repeat = DOMPurify.sanitize(password_repeat_el?.value); - let wallet_name = DOMPurify.sanitize(wallet_name_el?.value); - let success = true; + const primary_element = document.querySelector('#loading_content #primary') - if(!password_el) { - return false - } + primary_element.style.transition = "stroke-dasharray 0.4s ease-out, stroke-dashoffset 0.4s ease-out, stroke 0.4s ease-out"; + primary_element.style.strokeDasharray = "100 0"; + primary_element.style.strokeDashoffset = "0"; - if(password.length >= 12) { - // has 12+ chars - document.querySelector('#length_icon').innerHTML = '' - } else { - document.querySelector('#length_icon').innerHTML = '' - success = false; - } + setTimeout(async() => { + loading_el.classList.add('dark') - if(password.match(/[a-z]/g)) { - // has lowercase - document.querySelector('#lowercase_icon').innerHTML = '' - } else { - document.querySelector('#lowercase_icon').innerHTML = '' - success = false; - } + content_done_el.classList.add('active') - if(password.match(/[A-Z]/g)) { - // has uppercase - document.querySelector('#uppercase_icon').innerHTML = '' - } else { - document.querySelector('#uppercase_icon').innerHTML = '' - success = false; - } + if(params?.imported) { + content_done_text_el.innerHTML = 'Successfully imported wallet' + } else { + content_done_text_el.innerHTML = 'Successfully created wallet' + } - if(password.match(/[0-9]/g)) { - // has digit - document.querySelector('#digit_icon').innerHTML = '' - } else { - document.querySelector('#digit_icon').innerHTML = '' - success = false; - } + content_done_desc_el.innerHTML = 'Congratulations, your wallet is ready to use.' - if(password.match(/[$&+,:;=?@#|'<>.^*()%!-]/g)) { - // has special char - document.querySelector('#symbol_icon').innerHTML = '' - } else { - document.querySelector('#symbol_icon').innerHTML = '' - success = false; - } + content_init_text_el.classList.add('d-none') + content_init_desc_el.classList.add('d-none') - if(password === password_repeat) { - document.querySelector('#repeat_icon').innerHTML = '' - } else { - document.querySelector('#repeat_icon').innerHTML = '' - success = false; - } + anime({ + targets: '#loading_content #content .done .btn', + translateY: [-30, 0], + opacity: [0, 1], + easing: 'easeInOutSine', + duration: function(el, i) { + return 400 + }, + delay: function(el, i) { + return i*300 + 100 + }, + }); + }, 200) - if(wallet_name.length === 0) { - success = false; - } + setTimeout(() => { + checkmark_el.classList.add('show') + }, 200) - if(success) { - document.querySelector("#set_password").classList.remove('disabled') - document.querySelector("#set_password").classList.add('btn-primary') - } else { - document.querySelector("#set_password").classList.add('disabled') - document.querySelector("#set_password").classList.remove('btn-primary') - } + setTimeout(() => { + loading_el.classList.add('done') + }, 600) + + updateAccounts() + } +} + +function checkPassword() { + const password_el = document.querySelector('#root #password') + const password_repeat_el = document.querySelector('#root #password_repeat') + const wallet_name_el = document.querySelector('#root #wallet_name') + + let password = DOMPurify.sanitize(password_el?.value); + let password_repeat = DOMPurify.sanitize(password_repeat_el?.value); + let wallet_name = DOMPurify.sanitize(wallet_name_el?.value); + let success = true; + + if(!password_el) { + return false + } + + if(password.length >= 12) { + // has 12+ chars + document.querySelector('#length_icon').innerHTML = '' + } else { + document.querySelector('#length_icon').innerHTML = '' + success = false; + } + + if(password.match(/[a-z]/g)) { + // has lowercase + document.querySelector('#lowercase_icon').innerHTML = '' + } else { + document.querySelector('#lowercase_icon').innerHTML = '' + success = false; + } + + if(password.match(/[A-Z]/g)) { + // has uppercase + document.querySelector('#uppercase_icon').innerHTML = '' + } else { + document.querySelector('#uppercase_icon').innerHTML = '' + success = false; + } + + if(password.match(/[0-9]/g)) { + // has digit + document.querySelector('#digit_icon').innerHTML = '' + } else { + document.querySelector('#digit_icon').innerHTML = '' + success = false; + } + + if(password.match(/[$&+,:;=?@#|'<>.^*()%!-]/g)) { + // has special char + document.querySelector('#symbol_icon').innerHTML = '' + } else { + document.querySelector('#symbol_icon').innerHTML = '' + success = false; + } + + if(password === password_repeat) { + document.querySelector('#repeat_icon').innerHTML = '' + } else { + document.querySelector('#repeat_icon').innerHTML = '' + success = false; + } + + if(wallet_name.length === 0) { + success = false; + } + + if(success) { + document.querySelector("#set_password").classList.remove('disabled') + document.querySelector("#set_password").classList.add('btn-primary') + } else { + document.querySelector("#set_password").classList.add('disabled') + document.querySelector("#set_password").classList.remove('btn-primary') + } } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/welcome.js b/packages/browser-wallet-ui/src/screens/welcome.js index 71caf1e..f9a0346 100644 --- a/packages/browser-wallet-ui/src/screens/welcome.js +++ b/packages/browser-wallet-ui/src/screens/welcome.js @@ -5,87 +5,87 @@ import anime from 'animejs'; import {isStandaloneApp} from "@bitgreen/browser-wallet-utils"; export default async function welcomeScreen() { - const settings = new SettingsStore() + const settings = new SettingsStore() - const screen = new Screen({ - template_name: 'welcome', - template_params: { - wallet_title: isStandaloneApp() ? 'WALLET APP' : 'BROWSER WALLET' - }, - login: false, - auto_load: false - }) - await screen.init() + const screen = new Screen({ + template_name: 'welcome', + template_params: { + wallet_title: isStandaloneApp() ? 'WALLET APP' : 'BROWSER WALLET' + }, + login: false, + auto_load: false + }) + await screen.init() - await screen.set() + await screen.set() - anime({ - targets: '#init_screen', - opacity: 0, - duration: 1000, - delay: 2000 - }); - anime({ - targets: '#init_screen .init-logo', - delay: 600, - easing: 'linear', - keyframes: [ - { translateY: isStandaloneApp() ? -163 : -100, scale: 0.323232, duration: 800 }, - { translateX: isStandaloneApp() ? -288 : -290, duration: 600 }, - ] - }); + anime({ + targets: '#init_screen', + opacity: 0, + duration: 1000, + delay: 2000 + }); + anime({ + targets: '#init_screen .init-logo', + delay: 600, + easing: 'linear', + keyframes: [ + { translateY: isStandaloneApp() ? -163 : -100, scale: 0.323232, duration: 800 }, + { translateX: isStandaloneApp() ? -288 : -290, duration: 600 }, + ] + }); - anime({ - targets: '.bitgreen-svg path', - strokeDashoffset: [anime.setDashoffset, 0], - easing: 'easeInOutSine', - "fill-opacity": "1", - "stroke-width": "0", - duration: 400, - delay: function(el, i) { - return i * 200 + 300 - }, - }); + anime({ + targets: '.bitgreen-svg path', + strokeDashoffset: [anime.setDashoffset, 0], + easing: 'easeInOutSine', + "fill-opacity": "1", + "stroke-width": "0", + duration: 400, + delay: function(el, i) { + return i * 200 + 300 + }, + }); - anime({ - targets: '.separator', - easing: 'linear', - duration: 500, - delay: 3000, - translateY: [-20, 0], - opacity: [0, 1] - }); + anime({ + targets: '.separator', + easing: 'linear', + duration: 500, + delay: 3000, + translateY: [-20, 0], + opacity: [0, 1] + }); - anime({ - targets: '.browser-wallet', - easing: 'linear', - duration: 300, - delay: 3200, - translateX: [-30, 0], - opacity: [0, 1] - }); + anime({ + targets: '.browser-wallet', + easing: 'linear', + duration: 300, + delay: 3200, + translateX: [-30, 0], + opacity: [0, 1] + }); - anime({ - targets: '#get_started', - easing: 'linear', - duration: 400, - delay: 3400, - translateY: [40, 0], - opacity: [0, 1] - }); + anime({ + targets: '#get_started', + easing: 'linear', + duration: 400, + delay: 3400, + translateY: [40, 0], + opacity: [0, 1] + }); - setTimeout(function() { - document.querySelector("#init_screen").classList.add("inactive") - document.querySelector("#init_screen .init-logo").style = {}; - }, 4000) + setTimeout(function() { + document.querySelector("#init_screen").classList.add("inactive") + document.querySelector("#init_screen .init-logo").style = {}; + }, 4000) - screen.setListeners([ - { - element: '#get_started', - listener: () => { - settings.set('skip_intro', true) - goToScreen('walletScreen') - } - } - ]) + screen.setListeners([ + { + element: '#get_started', + listener: () => { + settings.set('skip_intro', true) + goToScreen('walletScreen') + } + } + ]) } \ No newline at end of file diff --git a/packages/browser-wallet-utils/src/index.js b/packages/browser-wallet-utils/src/index.js index 91aa968..924e94f 100644 --- a/packages/browser-wallet-utils/src/index.js +++ b/packages/browser-wallet-utils/src/index.js @@ -3,359 +3,356 @@ import { hexToU8a, isHex } from "@polkadot/util"; import BigNumber from "bignumber.js"; const getBrowser = () => { - let userAgent = navigator.userAgent; - let browserName = ''; - - if (userAgent.match(/chrome|chromium|crios/i)) { - browserName = "chrome"; - } else if (userAgent.match(/firefox|fxios/i)) { - browserName = "firefox"; - } else if (userAgent.match(/safari/i)) { - browserName = "safari"; - } else if (userAgent.match(/opr\//i)) { - browserName = "opera"; - } else if (userAgent.match(/edg/i)) { - browserName = "edge"; - } - - return browserName; + let userAgent = navigator.userAgent; + let browserName = ''; + + if (userAgent.match(/chrome|chromium|crios/i)) { + browserName = "chrome"; + } else if (userAgent.match(/firefox|fxios/i)) { + browserName = "firefox"; + } else if (userAgent.match(/safari/i)) { + browserName = "safari"; + } else if (userAgent.match(/opr\//i)) { + browserName = "opera"; + } else if (userAgent.match(/edg/i)) { + browserName = "edge"; + } + + return browserName; } const isChrome = () => { - return getBrowser() === 'chrome' + return getBrowser() === 'chrome' } const isFirefox = () => { - return getBrowser() === 'firefox' + return getBrowser() === 'firefox' } const isSafari = () => { - return getBrowser() === 'safari' + return getBrowser() === 'safari' } const sleep = (ms) => new Promise(r => setTimeout(r, ms)); let messageIdCounter = 0 const generateMessageId = () => { - return `${Date.now()}.${++messageIdCounter}`; + return `${Date.now()}.${++messageIdCounter}`; } const shuffleArray = (array) => { - let cloned_array = [...array]; - for (let i = cloned_array.length - 1; i > 0; i--) { - let j = Math.floor(Math.random() * (i + 1)); - let temp = cloned_array[i]; - cloned_array[i] = cloned_array[j]; - cloned_array[j] = temp; - } - return cloned_array + let cloned_array = [...array]; + for (let i = cloned_array.length - 1; i > 0; i--) { + let j = Math.floor(Math.random() * (i + 1)); + let temp = cloned_array[i]; + cloned_array[i] = cloned_array[j]; + cloned_array[j] = temp; + } + return cloned_array } const randomString = (len) => { - let text = ""; + let text = ""; - let charset = "abcdefghijklmnopqrstuvwxyz"; + let charset = "abcdefghijklmnopqrstuvwxyz"; - for (let i = 0; i < len; i++) - text += charset.charAt(Math.floor(Math.random() * charset.length)); + for (let i = 0; i < len; i++) + text += charset.charAt(Math.floor(Math.random() * charset.length)); - return text; + return text; } const randomNumber = (min, max) => { - return Math.floor(Math.random() * (max - min + 1)) + min + return Math.floor(Math.random() * (max - min + 1)) + min } const balanceToHuman = (balance, decimals = 4) => { - const calc_decimals = Math.pow(10, decimals) - return (Math.floor(balance / 1000000000000000000 * calc_decimals) / calc_decimals).toFixed(decimals); + const calc_decimals = Math.pow(10, decimals) + return (Math.floor(balance / 1000000000000000000 * calc_decimals) / calc_decimals).toFixed(decimals); } const formatAmount = (amount, decimals, symbol = '', force_k = false) => { - let formatted_amount - if(typeof amount !== 'number') { - amount = new BigNumber(amount) - } - - const string_amount = amount.toFixed(decimals).toString() - - // Split the number string into the integer and decimal parts - const parts = string_amount.split("."); - - if(parts[0].length > 9) { - return formatAmount(amount / 1000000000, decimals, 'B') - } else if(parts[0].length > 6) { - return formatAmount(amount / 1000000, decimals, 'M') - } else if(parts[0].length > 4) { - return formatAmount(amount / 1000, decimals, 'K') - } - - if(force_k && parts[0].length > 3) { - return formatAmount(amount / 1000, decimals, 'K') - } - - // Add commas to the integer part - parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); - - // Pad the decimal part with zeros if necessary - if (parts.length > 1) { - parts[1] = parts[1].padEnd(decimals, "0").substring(0, decimals); - } else { - parts[1] = (0).toString().padEnd(decimals, "0"); - } - - // Concatenate the integer and decimal parts with a period separator - formatted_amount = parts.join(".") + symbol; - - return formatted_amount + let formatted_amount + if(typeof amount !== 'number') { + amount = new BigNumber(amount) + } + + const string_amount = amount.toFixed(decimals).toString() + + // Split the number string into the integer and decimal parts + const parts = string_amount.split("."); + + if(parts[0].length > 9) { + return formatAmount(amount / 1000000000, decimals, 'B') + } else if(parts[0].length > 6) { + return formatAmount(amount / 1000000, decimals, 'M') + } else if(parts[0].length > 4) { + return formatAmount(amount / 1000, decimals, 'K') + } + + if(force_k && parts[0].length > 3) { + return formatAmount(amount / 1000, decimals, 'K') + } + + // Add commas to the integer part + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); + + // Pad the decimal part with zeros if necessary + if (parts.length > 1) { + parts[1] = parts[1].padEnd(decimals, "0").substring(0, decimals); + } else { + parts[1] = (0).toString().padEnd(decimals, "0"); + } + + // Concatenate the integer and decimal parts with a period separator + formatted_amount = parts.join(".") + symbol; + + return formatted_amount } const humanToBalance = (amount) => { - const decimals = new BigNumber(1000000000000000000) - const amountBalance = new BigNumber(parseFloat(amount)) + const decimals = new BigNumber(1000000000000000000) + const amountBalance = new BigNumber(parseFloat(amount)) - const result = amountBalance.times(decimals); - return result.toFixed(0) + const result = amountBalance.times(decimals); + return result.toFixed(0) } const getAmountDecimal = (amount, decimals = 2) => { - let amount_info = null - if(typeof amount === 'string') { - amount_info = amount.split('.') - } else { - amount_info = parseFloat(amount).toFixed(decimals).toString().split('.') - } - - const regex = /[^0-9]$/; - const match = amount_info[1] ? amount_info[1].match(regex) : null - - let decimal_info = amount_info[1]?.substring(0, decimals) || '00' - if(match) { - decimal_info = decimal_info + match[0] - } - - return { - amount: amount_info[0], - decimals: decimal_info - } + let amount_info = null + if(typeof amount === 'string') { + amount_info = amount.split('.') + } else { + amount_info = parseFloat(amount).toFixed(decimals).toString().split('.') + } + + const regex = /[^0-9]$/; + const match = amount_info[1] ? amount_info[1].match(regex) : null + + let decimal_info = amount_info[1]?.substring(0, decimals) || '00' + if(match) { + decimal_info = decimal_info + match[0] + } + + return { + amount: amount_info[0], + decimals: decimal_info + } } const addressValid = (address) => { - try { - encodeAddress( - isHex(address) - ? hexToU8a(address) - : decodeAddress(address) - ); - - return true; - } catch (error) { - return false; - } + try { + encodeAddress( + isHex(address) + ? hexToU8a(address) + : decodeAddress(address) + ); + + return true; + } catch (error) { + return false; + } } const formatAddress = (address, first = 8, last = 6) => { - return address?.substring(0, first) + '...' + address?.substring(address?.length - last) + return address?.substring(0, first) + '...' + address?.substring(address?.length - last) } const getOperatingSystem = () => { - let userAgent = navigator.userAgent; - let osName = 'other'; - - if (userAgent.match(/Windows/i)) { - osName = "windows"; - } else if (userAgent.match(/Linux/i)) { - osName = "linux"; - } else if (userAgent.match(/Android/i)) { - osName = "android"; - } else if (userAgent.match(/iPad/i) || navigator.platform === 'iPad' || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) { - osName = "ipad"; - } else if (userAgent.match(/iPhone/i)) { - osName = "ios"; - } else if (userAgent.match(/Macintosh/i)) { - osName = "macos"; - } - - return osName; + let userAgent = navigator.userAgent; + let osName = 'other'; + + if (userAgent.match(/Windows/i)) { + osName = "windows"; + } else if (userAgent.match(/Linux/i)) { + osName = "linux"; + } else if (userAgent.match(/Android/i)) { + osName = "android"; + } else if (userAgent.match(/iPad/i) || navigator.platform === 'iPad' || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) { + osName = "ipad"; + } else if (userAgent.match(/iPhone/i)) { + osName = "ios"; + } else if (userAgent.match(/Macintosh/i)) { + osName = "macos"; + } + + return osName; } const isWindows = () => { - return getOperatingSystem() === 'windows' + return getOperatingSystem() === 'windows' } const isMacOs = () => { - return getOperatingSystem() === 'macos' + return getOperatingSystem() === 'macos' } const isIOs = () => { - return getOperatingSystem() === 'ios' + return getOperatingSystem() === 'ios' } const isIPad = () => { - return getOperatingSystem() === 'ipad' + return getOperatingSystem() === 'ipad' } const isAndroid = () => { - return process.env.PLATFORM === 'android' + return process.env.PLATFORM === 'android' } const isStandaloneApp = () => { - return isIOs() || isIPad() || isAndroid() + return isIOs() || isIPad() || isAndroid() } const getTotalStakedByAddress = (all_collators, address) => { - let total_take = new BigNumber(0) - - for(const [key, collator] of Object.entries(all_collators)) { - for(const [key, delegator] of Object.entries(collator.delegators)) { - if(delegator.who === address) { - total_take = total_take.plus(new BigNumber(delegator?.deposit.replaceAll(',', ''))) - } - } + let total_take = new BigNumber(0) + + for(const [key, collator] of Object.entries(all_collators)) { + for(const [key, delegator] of Object.entries(collator.delegators)) { + if(delegator.who === address) { + total_take = total_take.plus(new BigNumber(delegator?.deposit.replaceAll(',', ''))) + } } + } - return total_take + return total_take } const getApyByAddress = (all_collators, address, block_reward) => { - const my_nominations = [] - - for(const [key, collator] of Object.entries(all_collators)) { - for(const [key, delegator] of Object.entries(collator.delegators)) { - if(delegator.who === address) { - my_nominations.push(calculateCollatorApy(all_collators, collator, block_reward)) - } - } - } + const my_nominations = [] - let total_apy = new BigNumber(0) - for(const apy of my_nominations) { - total_apy = total_apy.plus(apy) + for(const [key, collator] of Object.entries(all_collators)) { + for(const [key, delegator] of Object.entries(collator.delegators)) { + if(delegator.who === address) { + my_nominations.push(calculateCollatorApy(all_collators, collator, block_reward)) + } } + } - return total_apy.dividedBy(new BigNumber(my_nominations.length)) + let total_apy = new BigNumber(0) + for(const apy of my_nominations) { + total_apy = total_apy.plus(apy) + } + + return total_apy.dividedBy(new BigNumber(my_nominations.length)) } const getAverageApy = (all_collators, block_reward) => { - block_reward = new BigNumber(block_reward.toString()) - - let total_apy = new BigNumber(0) + block_reward = new BigNumber(block_reward.toString()) - for(const [key, collator] of Object.entries(all_collators)) { - total_apy = total_apy.plus(calculateCollatorApy(all_collators, collator, block_reward)) - } + let total_apy = new BigNumber(0) - if(total_apy.isEqualTo(0)) return 0 + for(const [key, collator] of Object.entries(all_collators)) { + total_apy = total_apy.plus(calculateCollatorApy(all_collators, collator, block_reward)) + } - // console.log('total_apy', total_apy, total_apy.toString()) + if(total_apy.isEqualTo(0)) return 0 - return total_apy.dividedBy(new BigNumber(all_collators.length)) + return total_apy.dividedBy(new BigNumber(all_collators.length)) } const calculateCollatorApy = (all_collators, collator, block_reward) => { - const blocks_per_year = new BigNumber(365 * 24 * 60 * 60 / 12) - block_reward = new BigNumber(block_reward.toString()) + const blocks_per_year = new BigNumber(365 * 24 * 60 * 60 / 12) + block_reward = new BigNumber(block_reward.toString()) - let total_stake = new BigNumber(0) - for(const [key, collator] of Object.entries(all_collators)) { - total_stake = total_stake.plus(new BigNumber(collator?.totalStake.replaceAll(',', ''))) - } + let total_stake = new BigNumber(0) + for(const [key, collator] of Object.entries(all_collators)) { + total_stake = total_stake.plus(new BigNumber(collator?.totalStake.replaceAll(',', ''))) + } - if (total_stake.isEqualTo(0)) return 0; // Handle division by zero - const collator_stake = new BigNumber(collator?.totalStake.replaceAll(',', '')); + if (total_stake.isEqualTo(0)) return 0; // Handle division by zero + const collator_stake = new BigNumber(collator?.totalStake.replaceAll(',', '')); - const share = collator_stake.dividedBy(total_stake).times(blocks_per_year).times(block_reward); + const share = collator_stake.dividedBy(total_stake).times(blocks_per_year).times(block_reward); - const collator_apy = share.dividedBy(collator_stake).times(100) + const collator_apy = share.dividedBy(collator_stake).times(100) - return collator_apy + return collator_apy } const calculateUserApy = (stake, collator_stake, total_stake, block_reward, total_collators) => { - stake = new BigNumber(stake.toString()) - collator_stake = new BigNumber(collator_stake.toString()) - total_stake = new BigNumber(total_stake.toString()) - block_reward = new BigNumber(block_reward.toString()) - total_collators = new BigNumber(total_collators) - - const blocks_per_year = new BigNumber(365 * 24 * 60 * 60 / 12) - - // Calculate expected reward per block - const expected_reward_per_block = stake - .dividedBy(collator_stake) - .multipliedBy(new BigNumber(0.9)) // commission 10% - .multipliedBy(block_reward) - .dividedBy(total_collators); - - // calculate apy - return expected_reward_per_block - .multipliedBy(blocks_per_year) - .dividedBy(total_stake) - .multipliedBy(new BigNumber(100)) + stake = new BigNumber(stake.toString()) + collator_stake = new BigNumber(collator_stake.toString()) + total_stake = new BigNumber(total_stake.toString()) + block_reward = new BigNumber(block_reward.toString()) + total_collators = new BigNumber(total_collators) + + const blocks_per_year = new BigNumber(365 * 24 * 60 * 60 / 12) + + // Calculate expected reward per block + const expected_reward_per_block = stake + .dividedBy(collator_stake) + .multipliedBy(new BigNumber(0.9)) // commission 10% + .multipliedBy(block_reward) + .dividedBy(total_collators); + + // calculate apy + return expected_reward_per_block + .multipliedBy(blocks_per_year) + .dividedBy(total_stake) + .multipliedBy(new BigNumber(100)) } const calculateUserRewardPerBlock = (stake, apy, block_reward) => { - stake = new BigNumber(stake.toString()) - apy = new BigNumber(apy.toString()) - block_reward = new BigNumber(block_reward.toString()) + stake = new BigNumber(stake.toString()) + apy = new BigNumber(apy.toString()) + block_reward = new BigNumber(block_reward.toString()) - const blocks_per_year = new BigNumber(365 * 24 * 60 * 60 / 12) + const blocks_per_year = new BigNumber(365 * 24 * 60 * 60 / 12) - const reward_per_year = stake.multipliedBy(apy).dividedBy(new BigNumber(100)) + const reward_per_year = stake.multipliedBy(apy).dividedBy(new BigNumber(100)) - return reward_per_year.dividedBy(blocks_per_year).dividedBy(block_reward) + return reward_per_year.dividedBy(blocks_per_year).dividedBy(block_reward) } const getCurrentBrowser = () => { - let current_browser = null + let current_browser = null - try { - current_browser = (isFirefox() || isSafari()) ? browser : chrome - } catch (e) { - // console.log('undefined') - } + try { + current_browser = (isFirefox() || isSafari()) ? browser : chrome + } catch (e) { + } - return current_browser + return current_browser } // Custom reviver function to handle BigNumber instances const customReviver = (key, value) => { - if (typeof value === 'object' && value !== null && value._isBigNumber) { - return new BigNumber(value); - } - return value; + if (typeof value === 'object' && value !== null && value._isBigNumber) { + return new BigNumber(value); + } + return value; } export { - getBrowser, - isChrome, - isFirefox, - isSafari, - sleep, - generateMessageId, - shuffleArray, - randomString, - randomNumber, - balanceToHuman, - formatAmount, - humanToBalance, - getAmountDecimal, - addressValid, - formatAddress, - getOperatingSystem, - isWindows, - isMacOs, - isIOs, - isIPad, - isAndroid, - isStandaloneApp, - getTotalStakedByAddress, - getApyByAddress, - getAverageApy, - calculateCollatorApy, - calculateUserApy, - calculateUserRewardPerBlock, - getCurrentBrowser, - customReviver + getBrowser, + isChrome, + isFirefox, + isSafari, + sleep, + generateMessageId, + shuffleArray, + randomString, + randomNumber, + balanceToHuman, + formatAmount, + humanToBalance, + getAmountDecimal, + addressValid, + formatAddress, + getOperatingSystem, + isWindows, + isMacOs, + isIOs, + isIPad, + isAndroid, + isStandaloneApp, + getTotalStakedByAddress, + getApyByAddress, + getAverageApy, + calculateCollatorApy, + calculateUserApy, + calculateUserRewardPerBlock, + getCurrentBrowser, + customReviver } \ No newline at end of file From 3fd214502d7cf3812f1f4262f47857e511a76785 Mon Sep 17 00:00:00 2001 From: rappix Date: Mon, 4 Mar 2024 19:04:27 +0100 Subject: [PATCH 23/96] fix: capacitor commands --- packages/browser-wallet-base/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 5d4fe66..5242c19 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -65,8 +65,8 @@ "scripts": { "setup": "rm -Rf ../../build/android && rm -Rf ../../build/ios && cap add android && cap add ios && npm run icons", "icons": "npm run icons:android && npm run icons:ios", - "icons:android": "capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 splashBackgroundColorDark #224851 --android --assetPath src/app-resources --androidProject ../../build/android", - "icons:ios": "capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 splashBackgroundColorDark #224851 --ios --assetPath src/app-resources --iosProject ../../build/ios", + "icons:android": "capacitor-assets generate --iconBackgroundColor='#224851' --iconBackgroundColorDark='#224851' --splashBackgroundColor='#224851' --splashBackgroundColorDark='#224851' --android --assetPath src/app-resources --androidProject ../../build/android", + "icons:ios": "capacitor-assets generate --iconBackgroundColor='#224851' --iconBackgroundColorDark='#224851' --splashBackgroundColor='#224851' --splashBackgroundColorDark='#224851' --ios --assetPath src/app-resources --iosProject ../../build/ios", "build": "npm run build:android && npm run build:ios", "build:android": "cap sync android --deployment", "build:ios": "cap sync ios --deployment" From 4fd19c497c88605dcca547aee9f6244b6da20edd Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 19:07:07 +0100 Subject: [PATCH 24/96] fixed background image problem, first-load offset problem --- packages/browser-wallet-ui/src/scss/_app.scss | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/browser-wallet-ui/src/scss/_app.scss b/packages/browser-wallet-ui/src/scss/_app.scss index e978e33..db0759e 100644 --- a/packages/browser-wallet-ui/src/scss/_app.scss +++ b/packages/browser-wallet-ui/src/scss/_app.scss @@ -22,19 +22,8 @@ body.app { } #login_screen { - position: absolute !important; width: 100vw; background-color: transparent; - - &:after { - background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); - content: ""; - height: 100%; - position: fixed; - width: 100%; - top: 0; - z-index: 98; - } } #init_screen { @@ -52,7 +41,6 @@ body.app { #full_page, #heading, #bordered_content { - position: absolute; width: 100vw; } From 11ed8983c10c73682f14d7cd52a3180035cf2cc5 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 19:08:29 +0100 Subject: [PATCH 25/96] support link fix --- .../browser-wallet-ui/src/components/settings/index.html | 8 ++++---- packages/browser-wallet-ui/src/screens/settings.js | 7 ------- packages/browser-wallet-ui/src/scss/_buttons.scss | 5 ++++- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/browser-wallet-ui/src/components/settings/index.html b/packages/browser-wallet-ui/src/components/settings/index.html index e935efb..3ff31ff 100644 --- a/packages/browser-wallet-ui/src/components/settings/index.html +++ b/packages/browser-wallet-ui/src/components/settings/index.html @@ -22,10 +22,10 @@
-
-

Support

Get help or provide feedback to us!

- -
+
+

Support

Get help or provide feedback to us!

+ +
diff --git a/packages/browser-wallet-ui/src/screens/settings.js b/packages/browser-wallet-ui/src/screens/settings.js index b8fd8c1..d295723 100644 --- a/packages/browser-wallet-ui/src/screens/settings.js +++ b/packages/browser-wallet-ui/src/screens/settings.js @@ -111,13 +111,6 @@ export default async function settingsScreen(params) { { element: '#go_new', listener: () => goToScreen('walletCreateScreen') - }, - { - element: '#go_support', - listener: () => { - const current_browser = getCurrentBrowser() - current_browser.tabs.create({ url: 'https://bitgreen.org/contact' }) - } } ]) } \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_buttons.scss b/packages/browser-wallet-ui/src/scss/_buttons.scss index c8ef291..8ed0826 100644 --- a/packages/browser-wallet-ui/src/scss/_buttons.scss +++ b/packages/browser-wallet-ui/src/scss/_buttons.scss @@ -6,6 +6,7 @@ border-radius: 0; padding: 10px 18px; box-shadow: none !important; + text-decoration: none; &.btn-hidden { pointer-events: none; @@ -54,6 +55,7 @@ font-size: 14px; margin-left: 8px; min-width: 20px; + color: inherit; &.icon-left { margin-left: 0; @@ -190,8 +192,8 @@ width: 100%; min-height: 85px; background-color: $colorWhite; + text-decoration: none; margin-bottom: 15px; - box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); border-radius: 4px; cursor: pointer; @@ -515,6 +517,7 @@ .icon { width: 60px; font-size: 18px; + color: $colorDark; &.icon-small { width: 10%; From 42f43139e78a4e9a9bfb7093fcde71cfb41bcb72 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 19:09:07 +0100 Subject: [PATCH 26/96] copy to clipboard for app --- packages/browser-wallet-ui/src/screens/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index 497f798..b44214c 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -10,6 +10,8 @@ import { } from "@bitgreen/browser-wallet-utils"; import {AccountStore, CacheStore, NetworkStore} from "@bitgreen/browser-wallet-core"; import { hideNotification } from "../notifications.js"; +import { Clipboard } from '@capacitor/clipboard'; + import anime from 'animejs'; import * as jdenticon from "jdenticon"; @@ -719,7 +721,7 @@ const updateAccounts = async(current_account_id = null) => { } const copyText = async(text) => { - await navigator.clipboard.writeText(text); + await Clipboard.write({string: text}); } const scrollToBottom = async(delay = 0) => { From 0896062616dcd2085286b1fba4e629d9410fa793 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 4 Mar 2024 20:31:53 +0100 Subject: [PATCH 27/96] authentification-server JS cleanup --- .../BrowserWallet-Authentication-Server.js | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/authentication-server/BrowserWallet-Authentication-Server.js b/authentication-server/BrowserWallet-Authentication-Server.js index 98ae8fb..efc8775 100644 --- a/authentication-server/BrowserWallet-Authentication-Server.js +++ b/authentication-server/BrowserWallet-Authentication-Server.js @@ -8,42 +8,46 @@ const { cryptoWaitReady, signatureVerify } = require('@polkadot/util-crypto'); const {stringToU8a,hexToU8a} = require('@polkadot/util'); // set limit of authentication from the same ip address, 5 attempts each minute const limiter = RateLimit({ - windowMs: 1*60*1000, // 1 minute + windowMs: 60000, // 1 minute max: 5 }); // create web server object let app = express(); + // apply rate limiter to all requests app.use(limiter); mainloop(); async function mainloop(){ - console.log("[info] - Browser Wallet/ Authentication Server - ver. 1.00 - Starting"); - await cryptoWaitReady(); - app.use(bodyParser.urlencoded({ extended: true })); - //check authentication - app.post('/',async function(req, res) { - BrowserWalletToken=""; - if (typeof req.body.BrowserWalletToken != 'undefined'){ - BrowserWalletToken=DOMPurify.sanitize(req.body.BrowserWalletToken); - bj=JSON.parse(BrowserWalletToken); - // verify signature - const signature=hexToU8a(bj.signature); - const message=stringToU8a(bj.message) - if(signatureVerify(message, signature,bj.address).isValid) { - res.send("Authentication is valid for:"+bj.address); - }else { - res.send("Authentication is NOT valid for:"+bj.address); - } - - }else { - res.send("BrowserWalletToken has not been received"); + console.log("[info] - Browser Wallet/ Authentication Server - ver. 1.00 - Starting"); + await cryptoWaitReady(); + app.use(bodyParser.urlencoded({ extended: true })); + + //check authentication + app.post('/',async function(req, res) { + BrowserWalletToken=""; + if (typeof req.body.BrowserWalletToken != 'undefined'){ + BrowserWalletToken=DOMPurify.sanitize(req.body.BrowserWalletToken); + bj=JSON.parse(BrowserWalletToken); + + // verify signature + const signature=hexToU8a(bj.signature); + const message=stringToU8a(bj.message) + if(signatureVerify(message, signature,bj.address).isValid) { + res.send("Authentication is valid for:" + bj.address); + }else { + res.send("Authentication is NOT valid for:" + bj.address); } - }); - // listening to server port - console.log("[info] - listening for connections on port TCP/3001..."); - app.listen(3001,function() {}); + + }else { + res.send("BrowserWalletToken has not been received"); + } + }); + + // listening to server port + console.log("[info] - listening for connections on port TCP/3001..."); + app.listen(3001,function() {}); } From 7ba470bc73d3de337bc10d229b528f60c8e9e0b7 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Tue, 5 Mar 2024 12:23:17 +0100 Subject: [PATCH 28/96] force bash for icon generation --- .../browser-wallet-base/generate-icons.sh | 20 +++++++++++++++++++ packages/browser-wallet-base/package.json | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 packages/browser-wallet-base/generate-icons.sh diff --git a/packages/browser-wallet-base/generate-icons.sh b/packages/browser-wallet-base/generate-icons.sh new file mode 100644 index 0000000..7fac8f3 --- /dev/null +++ b/packages/browser-wallet-base/generate-icons.sh @@ -0,0 +1,20 @@ +#!/bin/bash +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + --target*) + if [[ $key == "--target="* ]]; then + target="${key#*=}" + else + target="$2" + shift + fi + ;; + *) + echo "Unknown option: $key" + exit 1 + ;; + esac + shift +done +npx capacitor-assets generate --iconBackgroundColor \#224851 --iconBackgroundColorDark \#224851 --splashBackgroundColor \#224851 --splashBackgroundColorDark \#224851 --${target} --assetPath src/app-resources --${target}Project ../../build/${target} \ No newline at end of file diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 5242c19..a62cd16 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -65,8 +65,8 @@ "scripts": { "setup": "rm -Rf ../../build/android && rm -Rf ../../build/ios && cap add android && cap add ios && npm run icons", "icons": "npm run icons:android && npm run icons:ios", - "icons:android": "capacitor-assets generate --iconBackgroundColor='#224851' --iconBackgroundColorDark='#224851' --splashBackgroundColor='#224851' --splashBackgroundColorDark='#224851' --android --assetPath src/app-resources --androidProject ../../build/android", - "icons:ios": "capacitor-assets generate --iconBackgroundColor='#224851' --iconBackgroundColorDark='#224851' --splashBackgroundColor='#224851' --splashBackgroundColorDark='#224851' --ios --assetPath src/app-resources --iosProject ../../build/ios", + "icons:android": "bash generate-icons.sh --target=android", + "icons:ios": "bash generate-icons.sh --target=ios", "build": "npm run build:android && npm run build:ios", "build:android": "cap sync android --deployment", "build:ios": "cap sync ios --deployment" From c63f7a18cd52c24caa1bb6357ff367be27a4e369 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Tue, 5 Mar 2024 12:39:44 +0100 Subject: [PATCH 29/96] force bash for icon generation ios fix --- packages/browser-wallet-base/generate-icons.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/browser-wallet-base/generate-icons.sh b/packages/browser-wallet-base/generate-icons.sh index 7fac8f3..693d473 100644 --- a/packages/browser-wallet-base/generate-icons.sh +++ b/packages/browser-wallet-base/generate-icons.sh @@ -17,4 +17,5 @@ while [[ $# -gt 0 ]]; do esac shift done -npx capacitor-assets generate --iconBackgroundColor \#224851 --iconBackgroundColorDark \#224851 --splashBackgroundColor \#224851 --splashBackgroundColorDark \#224851 --${target} --assetPath src/app-resources --${target}Project ../../build/${target} \ No newline at end of file +if [ "$target" = "ios" ]; then appPath="/App"; else appPath=""; fi +npx capacitor-assets generate --iconBackgroundColor \#224851 --iconBackgroundColorDark \#224851 --splashBackgroundColor \#224851 --splashBackgroundColorDark \#224851 --${target} --assetPath src/app-resources --${target}Project ../../build/${target}${appPath} \ No newline at end of file From 4356db1b419e6094f3f644a9dc2c3b58484a3614 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Wed, 6 Mar 2024 20:14:32 +0100 Subject: [PATCH 30/96] modified state management to use native back button --- packages/browser-wallet-base/src/extension.js | 6 +- packages/browser-wallet-ui/src/index.js | 10 +-- .../src/screens/accountCreate.js | 2 +- .../src/screens/accountEdit.js | 2 +- .../src/screens/assetReceive.js | 2 +- .../src/screens/assetSend.js | 4 +- .../src/screens/assetTransactionFinish.js | 4 +- .../src/screens/dashboard.js | 6 +- .../src/screens/extrinsicSend.js | 4 +- .../browser-wallet-ui/src/screens/index.js | 87 +++++++++++-------- .../browser-wallet-ui/src/screens/signIn.js | 6 +- .../src/screens/stakingHome.js | 4 +- .../src/screens/transactionHistory.js | 4 +- .../src/screens/walletCreate.js | 4 +- .../src/screens/walletFinish.js | 4 +- 15 files changed, 82 insertions(+), 67 deletions(-) diff --git a/packages/browser-wallet-base/src/extension.js b/packages/browser-wallet-base/src/extension.js index 2b6d4cc..07ddf05 100644 --- a/packages/browser-wallet-base/src/extension.js +++ b/packages/browser-wallet-base/src/extension.js @@ -16,7 +16,7 @@ const extension = async() => { return setTimeout(() => { polkadotApi(true).then(async(api_ready) => { if(!api_ready) { - return await ui.goToScreen('connectionErrorScreen') + return await ui.goToScreen('connectionErrorScreen', {}, true) } await extension() @@ -40,7 +40,7 @@ const extension = async() => { } return await ui.goToScreen('walletScreen', {}, true) } else { - return await ui.goToScreen('welcomeScreen') + return await ui.goToScreen('welcomeScreen', {}, true) } } @@ -50,7 +50,7 @@ const extension = async() => { tab_id: params.get('tab_id'), domain: params.get('origin'), title: params.get('title') - }) + }, true) } if(command === 'send') { diff --git a/packages/browser-wallet-ui/src/index.js b/packages/browser-wallet-ui/src/index.js index 3b7a2da..506d210 100644 --- a/packages/browser-wallet-ui/src/index.js +++ b/packages/browser-wallet-ui/src/index.js @@ -7,7 +7,7 @@ import { updateAccounts, showLogin, currentScreen, - clearHistory, + expireBrowserTabRequest, reloadScreen, scrollToBottom, disableFooter, @@ -214,7 +214,7 @@ class userInterface { assetSendTooltip.hide() }, 800) - await clearHistory() + await expireBrowserTabRequest() await goToScreen('assetSendScreen') }) document.querySelector("#main_footer #go_transactionHistoryScreen").addEventListener("click", async() => { @@ -222,7 +222,7 @@ class userInterface { transactionHistoryTooltip.hide() }, 800) - await clearHistory() + await expireBrowserTabRequest() await goToScreen('transactionHistoryScreen') }) document.querySelector("#main_footer #go_stakingHomeScreen").addEventListener("click", async() => { @@ -230,7 +230,7 @@ class userInterface { stakeHomeTooltip.hide() }, 800) - await clearHistory() + await expireBrowserTabRequest() await goToScreen('stakingHomeScreen') }) } @@ -321,7 +321,7 @@ class userInterface { } goToScreen = async(name, params = {}, force = false) => { - return goToScreen(name, params, false, force) + return goToScreen(name, params, true, force) } initCustomActions = async() => { diff --git a/packages/browser-wallet-ui/src/screens/accountCreate.js b/packages/browser-wallet-ui/src/screens/accountCreate.js index 598aa61..88132a5 100644 --- a/packages/browser-wallet-ui/src/screens/accountCreate.js +++ b/packages/browser-wallet-ui/src/screens/accountCreate.js @@ -73,7 +73,7 @@ export default async function accountCreateScreen() { if(response && !response.error) { await updateAccounts(response) - await goToScreen('accountManageScreen', {}, true) + await goToScreen('accountManageScreen', {}, false) await showNotification('New account created!', 'success') } else { await showNotification(response.error || 'Password is wrong!', 'error') diff --git a/packages/browser-wallet-ui/src/screens/accountEdit.js b/packages/browser-wallet-ui/src/screens/accountEdit.js index caf130f..c990a41 100644 --- a/packages/browser-wallet-ui/src/screens/accountEdit.js +++ b/packages/browser-wallet-ui/src/screens/accountEdit.js @@ -165,7 +165,7 @@ export default async function accountEditScreen(params) { accounts_store.remove(id, async() => { await updateAccounts() - await goToScreen('accountManageScreen', {}, true) + await goToScreen('accountManageScreen', {}, false) await showNotification('Account deleted successfully.', 'info', 2000, 58) }) } diff --git a/packages/browser-wallet-ui/src/screens/assetReceive.js b/packages/browser-wallet-ui/src/screens/assetReceive.js index a898b1b..eb9274c 100644 --- a/packages/browser-wallet-ui/src/screens/assetReceive.js +++ b/packages/browser-wallet-ui/src/screens/assetReceive.js @@ -1,4 +1,4 @@ -import Screen, { copyText, goToScreen } from './index.js' +import Screen, { copyText } from './index.js' import { AccountStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; import QRCode from 'qrcode' diff --git a/packages/browser-wallet-ui/src/screens/assetSend.js b/packages/browser-wallet-ui/src/screens/assetSend.js index 64ae229..8626346 100644 --- a/packages/browser-wallet-ui/src/screens/assetSend.js +++ b/packages/browser-wallet-ui/src/screens/assetSend.js @@ -1,4 +1,4 @@ -import Screen, { clearHistory, goToScreen, updateCurrentParams } from './index.js' +import Screen, { expireBrowserTabRequest, goToScreen, updateCurrentParams } from './index.js' import { disableKillPopup, sendMessage } from "../messaging.js"; import {AccountStore, WalletStore} from "@bitgreen/browser-wallet-core"; import { @@ -18,7 +18,7 @@ export default async function assetSendScreen(params) { const wallet_store = new WalletStore() if(!await wallet_store.exists()) { await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('walletScreen', {}, false, true) } diff --git a/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js b/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js index 9412a90..47a1ada 100644 --- a/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js +++ b/packages/browser-wallet-ui/src/screens/assetTransactionFinish.js @@ -1,4 +1,4 @@ -import Screen, { clearHistory, goToScreen } from './index.js' +import Screen, { expireBrowserTabRequest, goToScreen } from './index.js' import anime from "animejs"; @@ -77,7 +77,7 @@ export default async function assetTransactionFinishScreen(params) { { element: '#root #another_transaction', listener: async() => { - await clearHistory() + await expireBrowserTabRequest() await goToScreen('assetSendScreen') } }, diff --git a/packages/browser-wallet-ui/src/screens/dashboard.js b/packages/browser-wallet-ui/src/screens/dashboard.js index 4228667..37cc418 100644 --- a/packages/browser-wallet-ui/src/screens/dashboard.js +++ b/packages/browser-wallet-ui/src/screens/dashboard.js @@ -1,5 +1,5 @@ import {bbbTokenPrice, WalletStore} from "@bitgreen/browser-wallet-core"; -import Screen, { clearHistory, goToScreen } from './index.js' +import Screen, { expireBrowserTabRequest, goToScreen } from './index.js' import anime from 'animejs'; import { sendMessage } from "../messaging.js"; @@ -12,7 +12,7 @@ export default async function dashboardScreen(params = { }) { const wallet_store = new WalletStore() if(!await wallet_store.exists()) { - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('walletScreen', {}, false, true) } @@ -35,7 +35,7 @@ export default async function dashboardScreen(params = { await screen.set('#bordered_content', 'dashboard/content') document.querySelector('#bordered_content').classList.add('no-overflow') - await clearHistory() + await expireBrowserTabRequest() anime({ targets: '#bordered_content', diff --git a/packages/browser-wallet-ui/src/screens/extrinsicSend.js b/packages/browser-wallet-ui/src/screens/extrinsicSend.js index fce767c..9dfeef4 100644 --- a/packages/browser-wallet-ui/src/screens/extrinsicSend.js +++ b/packages/browser-wallet-ui/src/screens/extrinsicSend.js @@ -1,4 +1,4 @@ -import Screen, { clearHistory, goBackScreen, goToScreen, scrollToBottom } from './index.js' +import Screen, { expireBrowserTabRequest, goBackScreen, goToScreen, scrollToBottom } from './index.js' import { sendMessage } from "../messaging.js"; import { AccountStore, checkIfAppIsKnown, NetworkStore, WalletStore, CacheStore } from "@bitgreen/browser-wallet-core"; @@ -10,7 +10,7 @@ export default async function extrinsicSendScreen(params) { const wallet_store = new WalletStore() if(!await wallet_store.exists()) { await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('walletScreen', {}, false, true) } diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index b44214c..ddb6965 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -3,16 +3,16 @@ import { sendMessage } from "../messaging.js"; import { formatAddress, getCurrentBrowser, + isAndroid, isMacOs, isStandaloneApp, isWindows, sleep } from "@bitgreen/browser-wallet-utils"; -import {AccountStore, CacheStore, NetworkStore} from "@bitgreen/browser-wallet-core"; +import { AccountStore, CacheStore, NetworkStore, databaseService } from "@bitgreen/browser-wallet-core"; import { hideNotification } from "../notifications.js"; import { Clipboard } from '@capacitor/clipboard'; - - +import { App } from '@capacitor/app'; import anime from 'animejs'; import * as jdenticon from "jdenticon"; @@ -350,6 +350,7 @@ const showLogin = async(instant = false, force = false) => { } logged_in = false + screen_history = [] if(document.querySelector("#login_screen").classList.contains('inactive')) { document.querySelector("#login_screen").classList.remove('inactive') @@ -508,33 +509,45 @@ let screen_history = [] let active_screen = null let transitioning = false -const goToScreen = async(name, params = {}, go_back = false, force = false) => { - if(!force) hideNotification() - - // pause if still changing screen - if(transitioning && !force) return false - transitioning = true - setTimeout(() => { - transitioning = false - }, 600) - +const goToScreen = async(name, params = {}, can_go_back = true, force = false) => { + if(typeof screens[name] !== 'function') { console.warn(`Screen not found. [${name}]`) return false } - if(active_screen?.name === name && !force) { - return false + if(force) { + screen_history = [] + } else { + hideNotification() } - if(!go_back && !force) { - screen_history.push({name, params}) + if(active_screen?.name === name) { + if(force) { + can_go_back = false + updateCurrentParams(params) + } else { + return false + } } + // pause if still changing screen + if(transitioning && !force) return false + + transitioning = true + setTimeout(() => { + transitioning = false + }, 600) + active_screen = { name, params } + if(can_go_back) { + screen_history.push(active_screen) + history.pushState(active_screen, '') + } + if(!force) { anime({ targets: '#root', @@ -562,33 +575,37 @@ const goToScreen = async(name, params = {}, go_back = false, force = false) => { } const currentScreen = () => { - return screen_history[screen_history.length - 1] + return active_screen; } const updateCurrentParams = (params) => { - let current_screen = screen_history[screen_history.length - 1] - current_screen.params = { - ...current_screen.params, + active_screen.params = { + ...active_screen.params, ...params } + screen_history[screen_history.length - 1] = active_screen + history.replaceState(active_screen, '') } -const goBackScreen = async() => { - screen_history.pop() +const goBackScreen = () => { + screen_history.pop(); + if(screen_history.length) { + let last_screen = screen_history[screen_history.length - 1] + goToScreen(last_screen.name, last_screen.params, false) + } else if(isStandaloneApp()) { + App.minimizeApp(); + } +} - const previous_screen = screen_history[screen_history.length - 1] +App.addListener('backButton', goBackScreen) - if(previous_screen) { - return await goToScreen(previous_screen.name, previous_screen.params, true) - } else { - await clearHistory() - return await goToScreen('dashboardScreen') - } +if(!isAndroid()) { + window.addEventListener('popstate', goBackScreen) } -const clearHistory = async() => { +const expireBrowserTabRequest = async() => { // send response to page if any - for(const screen of screen_history) { + for(const state of screen_history) { if(screen?.params?.message_id && screen?.params?.tab_id) { const tab = await current_browser.tabs.connect(parseInt(screen.params.tab_id), { name: 'PORT_CONTENT_RESOLVE=' + screen.params.message_id }); @@ -602,11 +619,9 @@ const clearHistory = async() => { } }) } catch(e) { - // console.log(e) } } } - screen_history = [currentScreen()] return true } @@ -614,7 +629,7 @@ const reloadScreen = async() => { const current_screen = currentScreen() if(current_screen) { - return await goToScreen(current_screen.name, current_screen.params, true, true) + return await goToScreen(current_screen.name, current_screen.params, false) } else { return await goToScreen('dashboardScreen') } @@ -750,7 +765,7 @@ export { reloadScreen, updateCurrentParams, currentScreen, - clearHistory, + expireBrowserTabRequest, updateAccounts, copyText, enableFooter, diff --git a/packages/browser-wallet-ui/src/screens/signIn.js b/packages/browser-wallet-ui/src/screens/signIn.js index 828508d..a2ba215 100644 --- a/packages/browser-wallet-ui/src/screens/signIn.js +++ b/packages/browser-wallet-ui/src/screens/signIn.js @@ -1,7 +1,7 @@ -import Screen, {clearHistory, goToScreen, scrollToBottom} from './index.js' +import Screen, { expireBrowserTabRequest, goToScreen, scrollToBottom } from './index.js' import { sendMessage } from "../messaging.js"; import DOMPurify from "dompurify"; -import {AccountStore, checkIfAppIsKnown, WalletStore} from "@bitgreen/browser-wallet-core"; +import { AccountStore, checkIfAppIsKnown, WalletStore } from "@bitgreen/browser-wallet-core"; import anime from "animejs"; import { showNotification } from "../notifications.js"; @@ -10,7 +10,7 @@ export default async function signInScreen(params) { const wallet_store = new WalletStore() if(!await wallet_store.exists()) { await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('walletScreen', {}, false, true) } diff --git a/packages/browser-wallet-ui/src/screens/stakingHome.js b/packages/browser-wallet-ui/src/screens/stakingHome.js index 776a2c8..7d1d795 100644 --- a/packages/browser-wallet-ui/src/screens/stakingHome.js +++ b/packages/browser-wallet-ui/src/screens/stakingHome.js @@ -1,4 +1,4 @@ -import Screen, { clearHistory, goToScreen } from './index.js' +import Screen, { expireBrowserTabRequest, goToScreen } from './index.js' import { AccountStore, CacheStore, @@ -21,7 +21,7 @@ export default async function stakingHomeScreen() { const wallet_store = new WalletStore() if(!await wallet_store.exists()) { await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('walletScreen', {}, false, true) } diff --git a/packages/browser-wallet-ui/src/screens/transactionHistory.js b/packages/browser-wallet-ui/src/screens/transactionHistory.js index 3761dc5..5996a85 100644 --- a/packages/browser-wallet-ui/src/screens/transactionHistory.js +++ b/packages/browser-wallet-ui/src/screens/transactionHistory.js @@ -1,4 +1,4 @@ -import Screen, { clearHistory, goToScreen } from './index.js' +import Screen, { expireBrowserTabRequest, goToScreen } from './index.js' import { AccountStore, WalletStore } from "@bitgreen/browser-wallet-core"; import { balanceToHuman, getAmountDecimal } from "@bitgreen/browser-wallet-utils"; import { showNotification } from "../notifications.js"; @@ -9,7 +9,7 @@ export default async function transactionHistoryScreen() { const wallet_store = new WalletStore() if(!await wallet_store.exists()) { await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 3200) - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('walletScreen', {}, false, true) } diff --git a/packages/browser-wallet-ui/src/screens/walletCreate.js b/packages/browser-wallet-ui/src/screens/walletCreate.js index 218098f..5447270 100644 --- a/packages/browser-wallet-ui/src/screens/walletCreate.js +++ b/packages/browser-wallet-ui/src/screens/walletCreate.js @@ -1,4 +1,4 @@ -import Screen, {clearHistory, goBackScreen, goToScreen, updateCurrentParams} from './index.js' +import Screen, { expireBrowserTabRequest, goBackScreen, goToScreen, updateCurrentParams } from './index.js' import { WalletStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; import { sendMessage } from "../messaging.js"; @@ -18,7 +18,7 @@ export default async function walletCreateScreen(params) { const wallet_store = new WalletStore() if(await wallet_store.exists()) { - await clearHistory() + await expireBrowserTabRequest() return await goToScreen('dashboardScreen', {}, false, true) } diff --git a/packages/browser-wallet-ui/src/screens/walletFinish.js b/packages/browser-wallet-ui/src/screens/walletFinish.js index e2c26da..a3c3991 100644 --- a/packages/browser-wallet-ui/src/screens/walletFinish.js +++ b/packages/browser-wallet-ui/src/screens/walletFinish.js @@ -1,4 +1,4 @@ -import Screen, { goToScreen, clearHistory, updateAccounts } from './index.js' +import Screen, { goToScreen, expireBrowserTabRequest, updateAccounts } from './index.js' import anime from 'animejs'; @@ -23,7 +23,7 @@ export default async function walletFinishScreen(params) { }) } - await clearHistory() + await expireBrowserTabRequest() await updateAccounts() anime({ From ec0140d0d6e2fa726c5a8d0bede71d455706d126 Mon Sep 17 00:00:00 2001 From: rappix Date: Thu, 7 Mar 2024 15:47:15 +0100 Subject: [PATCH 31/96] fixes for xcode project & icon generation scrips --- package-lock.json | 702 ++++++++++++++++++ package.json | 8 +- .../browser-wallet-base/capacitor.config.json | 4 +- .../browser-wallet-base/generate-icons.sh | 21 - packages/browser-wallet-base/package.json | 18 +- .../scripts/generate-icons.js | 100 +++ .../src/app-resources/icon_rounded.png | Bin 0 -> 42897 bytes .../browser-wallet-base/webpack.shared.cjs | 9 +- .../src/assets/icons/normal/128x128.png | Bin 14185 -> 0 bytes .../src/assets/icons/normal/16x16.png | Bin 528 -> 0 bytes .../src/assets/icons/normal/256x256.png | Bin 17921 -> 0 bytes .../src/assets/icons/normal/32x32.png | Bin 853 -> 0 bytes .../src/assets/icons/normal/48x48.png | Bin 1122 -> 0 bytes .../src/assets/icons/normal/512x512.png | Bin 23440 -> 0 bytes .../src/assets/icons/normal/64x64.png | Bin 1546 -> 0 bytes .../src/assets/icons/square/1024x1024.png | Bin 11604 -> 0 bytes .../src/assets/icons/square/128x128.png | Bin 2536 -> 0 bytes .../src/assets/icons/square/16x16.png | Bin 1601 -> 0 bytes .../src/assets/icons/square/256x256.png | Bin 3512 -> 0 bytes .../src/assets/icons/square/32x32.png | Bin 1724 -> 0 bytes .../src/assets/icons/square/512x512.png | Bin 6032 -> 0 bytes .../src/assets/icons/square/64x64.png | Bin 1912 -> 0 bytes 22 files changed, 822 insertions(+), 40 deletions(-) delete mode 100644 packages/browser-wallet-base/generate-icons.sh create mode 100644 packages/browser-wallet-base/scripts/generate-icons.js create mode 100644 packages/browser-wallet-base/src/app-resources/icon_rounded.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/128x128.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/16x16.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/256x256.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/32x32.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/48x48.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/512x512.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/normal/64x64.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/1024x1024.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/128x128.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/16x16.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/256x256.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/32x32.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/512x512.png delete mode 100644 packages/browser-wallet-ui/src/assets/icons/square/64x64.png diff --git a/package-lock.json b/package-lock.json index 2131f57..c367f6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -331,6 +331,16 @@ "node": ">=10.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", + "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -340,6 +350,456 @@ "node": ">=6.9.0" } }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz", + "integrity": "sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz", + "integrity": "sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz", + "integrity": "sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz", + "integrity": "sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz", + "integrity": "sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz", + "integrity": "sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz", + "integrity": "sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz", + "integrity": "sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz", + "integrity": "sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz", + "integrity": "sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz", + "integrity": "sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz", + "integrity": "sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz", + "integrity": "sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz", + "integrity": "sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz", + "integrity": "sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz", + "integrity": "sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.45.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz", + "integrity": "sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz", + "integrity": "sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@ionic/cli-framework-output": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", @@ -11756,6 +12216,7 @@ "process": "^0.11.10", "sass": "^1.71.0", "sass-loader": "^14.1.1", + "sharp": "^0.33.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "style-loader": "^3.3.4", @@ -12129,6 +12590,46 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, + "packages/browser-wallet-base/node_modules/sharp": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz", + "integrity": "sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.1", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.2", + "@img/sharp-darwin-x64": "0.33.2", + "@img/sharp-libvips-darwin-arm64": "1.0.1", + "@img/sharp-libvips-darwin-x64": "1.0.1", + "@img/sharp-libvips-linux-arm": "1.0.1", + "@img/sharp-libvips-linux-arm64": "1.0.1", + "@img/sharp-libvips-linux-s390x": "1.0.1", + "@img/sharp-libvips-linux-x64": "1.0.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1", + "@img/sharp-libvips-linuxmusl-x64": "1.0.1", + "@img/sharp-linux-arm": "0.33.2", + "@img/sharp-linux-arm64": "0.33.2", + "@img/sharp-linux-s390x": "0.33.2", + "@img/sharp-linux-x64": "0.33.2", + "@img/sharp-linuxmusl-arm64": "0.33.2", + "@img/sharp-linuxmusl-x64": "0.33.2", + "@img/sharp-wasm32": "0.33.2", + "@img/sharp-win32-ia32": "0.33.2", + "@img/sharp-win32-x64": "0.33.2" + } + }, "packages/browser-wallet-core": { "name": "@bitgreen/browser-wallet-core", "version": "1.3.0", @@ -12234,6 +12735,7 @@ "process": "^0.11.10", "sass": "^1.71.0", "sass-loader": "^14.1.1", + "sharp": "^0.33.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "style-loader": "^3.3.4", @@ -12527,6 +13029,36 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "sharp": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz", + "integrity": "sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==", + "dev": true, + "requires": { + "@img/sharp-darwin-arm64": "0.33.2", + "@img/sharp-darwin-x64": "0.33.2", + "@img/sharp-libvips-darwin-arm64": "1.0.1", + "@img/sharp-libvips-darwin-x64": "1.0.1", + "@img/sharp-libvips-linux-arm": "1.0.1", + "@img/sharp-libvips-linux-arm64": "1.0.1", + "@img/sharp-libvips-linux-s390x": "1.0.1", + "@img/sharp-libvips-linux-x64": "1.0.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1", + "@img/sharp-libvips-linuxmusl-x64": "1.0.1", + "@img/sharp-linux-arm": "0.33.2", + "@img/sharp-linux-arm64": "0.33.2", + "@img/sharp-linux-s390x": "0.33.2", + "@img/sharp-linux-x64": "0.33.2", + "@img/sharp-linuxmusl-arm64": "0.33.2", + "@img/sharp-linuxmusl-x64": "0.33.2", + "@img/sharp-wasm32": "0.33.2", + "@img/sharp-win32-ia32": "0.33.2", + "@img/sharp-win32-x64": "0.33.2", + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + } } } }, @@ -12748,12 +13280,182 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@emnapi/runtime": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", + "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, "@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true }, + "@img/sharp-darwin-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz", + "integrity": "sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-darwin-arm64": "1.0.1" + } + }, + "@img/sharp-darwin-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz", + "integrity": "sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-darwin-x64": "1.0.1" + } + }, + "@img/sharp-libvips-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz", + "integrity": "sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-arm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz", + "integrity": "sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz", + "integrity": "sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-s390x": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz", + "integrity": "sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz", + "integrity": "sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz", + "integrity": "sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz", + "integrity": "sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==", + "dev": true, + "optional": true + }, + "@img/sharp-linux-arm": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz", + "integrity": "sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-arm": "1.0.1" + } + }, + "@img/sharp-linux-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz", + "integrity": "sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-arm64": "1.0.1" + } + }, + "@img/sharp-linux-s390x": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz", + "integrity": "sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-s390x": "1.0.1" + } + }, + "@img/sharp-linux-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz", + "integrity": "sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-x64": "1.0.1" + } + }, + "@img/sharp-linuxmusl-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz", + "integrity": "sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1" + } + }, + "@img/sharp-linuxmusl-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz", + "integrity": "sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.1" + } + }, + "@img/sharp-wasm32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz", + "integrity": "sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/runtime": "^0.45.0" + } + }, + "@img/sharp-win32-ia32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz", + "integrity": "sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==", + "dev": true, + "optional": true + }, + "@img/sharp-win32-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz", + "integrity": "sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==", + "dev": true, + "optional": true + }, "@ionic/cli-framework-output": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", diff --git a/package.json b/package.json index ddfcba9..488e640 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,10 @@ ], "scripts": { "setup": "npm install && cd ./packages/browser-wallet-base && npm run setup", - "build:all": "npm run build:chrome && npm run build:firefox && npm run build:safari && npm run build:app", - "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production", - "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production", - "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production", + "build": "npm run build:chrome && npm run build:firefox && npm run build:safari && npm run build:android && npm run build:ios", + "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production && cd ./packages/browser-wallet-base && npm run icons:chrome", + "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production && cd ./packages/browser-wallet-base && npm run icons:firefox", + "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:safari", "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:android", "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:ios", "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development", diff --git a/packages/browser-wallet-base/capacitor.config.json b/packages/browser-wallet-base/capacitor.config.json index 224aef0..6aaa975 100755 --- a/packages/browser-wallet-base/capacitor.config.json +++ b/packages/browser-wallet-base/capacitor.config.json @@ -6,10 +6,10 @@ "androidScheme": "https" }, "android": { - "path": "../../build/android" + "path": "../../build/platforms/android" }, "ios": { - "path": "../../build/ios", + "path": "../../build/platforms/ios", "scrollEnabled": false, "contentInset": "never" }, diff --git a/packages/browser-wallet-base/generate-icons.sh b/packages/browser-wallet-base/generate-icons.sh deleted file mode 100644 index 693d473..0000000 --- a/packages/browser-wallet-base/generate-icons.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -while [[ $# -gt 0 ]]; do - key="$1" - case $key in - --target*) - if [[ $key == "--target="* ]]; then - target="${key#*=}" - else - target="$2" - shift - fi - ;; - *) - echo "Unknown option: $key" - exit 1 - ;; - esac - shift -done -if [ "$target" = "ios" ]; then appPath="/App"; else appPath=""; fi -npx capacitor-assets generate --iconBackgroundColor \#224851 --iconBackgroundColorDark \#224851 --splashBackgroundColor \#224851 --splashBackgroundColorDark \#224851 --${target} --assetPath src/app-resources --${target}Project ../../build/${target}${appPath} \ No newline at end of file diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index a62cd16..35611a6 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -55,6 +55,7 @@ "process": "^0.11.10", "sass": "^1.71.0", "sass-loader": "^14.1.1", + "sharp": "^0.33.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "style-loader": "^3.3.4", @@ -63,12 +64,17 @@ "webpack-extension-manifest-plugin": "^0.8.0" }, "scripts": { - "setup": "rm -Rf ../../build/android && rm -Rf ../../build/ios && cap add android && cap add ios && npm run icons", - "icons": "npm run icons:android && npm run icons:ios", - "icons:android": "bash generate-icons.sh --target=android", - "icons:ios": "bash generate-icons.sh --target=ios", + "setup": "rm -Rf ../../build/platforms/android && rm -Rf ../../build/platforms/ios && cap add android && cap add ios && npm run assets", + "assets": "npm run assets:android && npm run assets:ios", + "assets:ios": "npx capacitor-assets generate --iconBackgroundColor '#224851' --iconBackgroundColorDark '#224851' --splashBackgroundColor '#224851' --splashBackgroundColorDark '#224851' --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", + "assets:android": "npx capacitor-assets generate --iconBackgroundColor '#224851' --iconBackgroundColorDark '#224851' --splashBackgroundColor '#224851' --splashBackgroundColorDark '#224851' --android --assetPath src/app-resources --androidProject ../../build/platforms/android", + "icons": "npm run icons:chrome && npm run icons:firefox && npm run icons:macos && npm run icons:ios && npm run icons:safari", + "icons:chrome": "node scripts/generate-icons.js --platform 'chrome'", + "icons:firefox": "node scripts/generate-icons.js --platform 'firefox'", + "icons:ios": "node scripts/generate-icons.js --platform 'ios'", "build": "npm run build:android && npm run build:ios", - "build:android": "cap sync android --deployment", - "build:ios": "cap sync ios --deployment" + "build:android": "cap sync android", + "build:ios": "cap sync ios && npm run icons:ios", + "build:safari": "node scripts/generate-icons.js --platform 'safari' && xcrun safari-web-extension-converter ../../build/tmp/safari --project-location '../../build/platforms/safari' --app-name 'Bitgreen Wallet' --bundle-identifier 'com.bitgreen.wallet.extension' --copy-resources --macos-only --force --no-open --no-prompt && node scripts/generate-icons.js --platform 'macos'" } } diff --git a/packages/browser-wallet-base/scripts/generate-icons.js b/packages/browser-wallet-base/scripts/generate-icons.js new file mode 100644 index 0000000..90679ff --- /dev/null +++ b/packages/browser-wallet-base/scripts/generate-icons.js @@ -0,0 +1,100 @@ +import sharp from 'sharp'; +import fs from 'fs'; + +// Parse command-line arguments +const args = process.argv.slice(2); +const platformIndex = args.indexOf('--platform'); +const platform = platformIndex !== -1 && args[platformIndex + 1]; // Get the platform argument value + +if (!['macos', 'ios', 'safari', 'chrome', 'firefox'].includes(platform)) { + console.log('Invalid platform.') + process.exit(0) +} + +// Load the input image +const inputImagePath = ['macos', 'ios', 'safari'].includes(platform) ? 'src/app-resources/icon_rounded.png' : 'src/app-resources/icon.png'; + +// Create output directory if it doesn't exist +let outputDirectory = `../../build/platforms/${platform}/icons`; +let dimensions = [16, 32, 48, 64, 128] + +if(platform === 'macos') { + outputDirectory = `../../build/platforms/safari/Bitgreen Wallet/Bitgreen Wallet/Assets.xcassets/AppIcon.appiconset`; + + dimensions = [16, 32, 128, 256, 512] +} else if(platform === 'ios') { + outputDirectory = `../../build/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset`; + + dimensions = [20, 29, 40, 60, 76, 83.5, 1024] +} else if(platform === 'safari') { + outputDirectory = `../../build/tmp/safari/icons`; + + dimensions = [16, 32, 64, 128, 256, 512, 1024] +} + +fs.rmSync(outputDirectory, { recursive: true, force: true }); +fs.mkdirSync(outputDirectory, { recursive: true }); // Create output directory along with parent directories if they don't exist + +function generateIcon(size, idiom = '', scale = 1) { + const filename = idiom.length > 0 ? `icon-${size}@${scale}x.png` : `${size}x${size}.png` + + const scaledSize = Math.round(size * scale); + + sharp(inputImagePath) + .resize(scaledSize, scaledSize) + .toFile(`${outputDirectory}/${filename}`, (err, info) => { + if (err) { + console.error(`Error resizing image for dimension ${size}:`, err); + } else { + // console.log(`Resized image for dimension ${size} (${scale}x) saved successfully.`); + } + }); + + return { + size: `${size}x${size}`, + idiom: idiom, + filename: filename, + scale: `${scale}x` + }; +} + +// Generate Contents.json +const contentsJson = { + images: [], + info: { + version: 1, + author: 'xcode' + } +}; + +for (const size of dimensions) { + if(platform === 'macos') { + contentsJson.images.push(generateIcon(size, 'mac', 1)); + contentsJson.images.push(generateIcon(size, 'mac', 2)); + } else if (platform === 'ios') { + if (size === 1024) { + contentsJson.images.push(generateIcon(size, 'ios-marketing', 1)); + } else { + if (![76, 83.5].includes(size)) { + contentsJson.images.push(generateIcon(size, 'iphone', 2)); + contentsJson.images.push(generateIcon(size, 'iphone', 3)); + } + + if (![60, 83.5].includes(size)) { + contentsJson.images.push(generateIcon(size, 'ipad', 1)); + } + if(size !== 60) { + contentsJson.images.push(generateIcon(size, 'ipad', 2)); + } + } + } else { + contentsJson.images.push(generateIcon(size)); + } +} + +if(['macos', 'ios'].includes(platform)) { + fs.writeFileSync(`${outputDirectory}/Contents.json`, JSON.stringify(contentsJson, null, 4)); +} + +console.log('Icons generated successfully.'); + diff --git a/packages/browser-wallet-base/src/app-resources/icon_rounded.png b/packages/browser-wallet-base/src/app-resources/icon_rounded.png new file mode 100644 index 0000000000000000000000000000000000000000..304bac728580e5092ff25b7dbddf081af72588fa GIT binary patch literal 42897 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 C4;VTC literal 0 HcmV?d00001 diff --git a/packages/browser-wallet-base/webpack.shared.cjs b/packages/browser-wallet-base/webpack.shared.cjs index 2320cea..9b6d7fe 100644 --- a/packages/browser-wallet-base/webpack.shared.cjs +++ b/packages/browser-wallet-base/webpack.shared.cjs @@ -7,6 +7,7 @@ const ManifestPlugin = require('webpack-extension-manifest-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const pkgJson = require('./package.json'); +const sharp = require("sharp"); const args = process.argv.slice(2); let mode = 'production'; @@ -40,7 +41,7 @@ module.exports = ( const is_app = ['android', 'ios'].includes(platform) const manifest = !is_app ? require(`./manifest-${platform}.json`) : null - const output_dir = path.join(__dirname, `../../build/${is_app ? 'app' : platform}`) + const output_dir = path.join(__dirname, `../../build/${is_app ? 'app' : (platform === 'safari' ? 'tmp/safari' : 'platforms/' + platform)}`) // clean destination folder exec('rm -Rf ' + output_dir, (err, stdout, stderr) => { @@ -78,12 +79,6 @@ module.exports = ( source: path.resolve(__dirname, '../browser-wallet-ui/src/components'), destination: path.join(output_dir, 'components') }] - if(!is_app) { - copyFiles.push({ // safari gets square icons, everyone else normal - source: path.join(__dirname, '../browser-wallet-ui/src/assets/icons/' + (platform === 'safari' ? 'square' : 'normal')), - destination: path.join(output_dir, 'icons') - }) - } plugins.push(new FileManagerPlugin({ events: { diff --git a/packages/browser-wallet-ui/src/assets/icons/normal/128x128.png b/packages/browser-wallet-ui/src/assets/icons/normal/128x128.png deleted file mode 100644 index 9b55736d530d5b4cf33b94cd9aa17e8235c89480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14185 zcmeIYWmFu^7BxJBdvKS*A=u#VuE9O{;O@@g?gV!U4uL=*xVt21a0?PV5CQ~yNuKB0 z`rbcxt?&JJXRV&@t~zJeIlFe(bWK&Xs){T+3NZ=*06>?QlTv>^Lw_Gg2+!aBBBtX2 z06B-RrmnlXsTauE)ydMv9s+XrafW~(-Zqv1fcJ7)j*T`=drH`o9bPBgWWOs{{;c4^ z?zL4+7!1ncTHA}N5t?Z6i{90VGVtBg<8|iKR`qhWvQpVz`ukm`4`2NEm7Aw^x<&Ki zulFB(?{K<v!M! zAKq=Z?^$`@54Q+*ZT92649r_RVZXUxiS*#mj<96ZHr+}!yO<+cfG1|;9CP!DLQOjQ1_Gyub zj|h)HM&?#Dt}DY$1arS0JKc8qfCAbTuDTNAuBN&&%N42X1mnJ8qgX?RYB6KwS9JxJ z+8@NWHI;k%wzaiC_Y44B8soK1%lb!oex7x!{OxXHXZ?xbZ8^)YYBFRFKjd#F_+}^G zPYA3WkJrEJNqnQD=g~ahvJy6vAb8R-Ue|sSh}4WT5lx@xKUP_u_juZzVGwlph+6+K zWAXkf4TJg2XlGV^oplS2US6c%bX_WPIMz^1%L^@5N* zZspc}HRmiYNa*GCgH9kPZQw=DQ%gRl>zc9esaJQvesdWISN(84bDEk1=rPtV%iei3Q&*5gn^!UAPZn_D!}8qc|1}to9*!{IZulp1fh_x1fE?_ik>;i2fH> z&iVPk2mie>x2+Rtg<4`dL|cp61790Qg2)xR`9m>;wc-dzRI$zr`O`RE6-x^%?%}n? z?{Vx2V>CpBm$qn;Nh*F#sqOr0d&{r-wWKLC+UYy&>LH;KUjj%KJM52TpmVQB3#8I& z!F80fJ-!otCb(I}-}2v28}>2sJDwhDQ=Tv69eXmGOhPy81I2g@z zT2kmaIwWFCqB;kq?N+jQ6BA!$e*GHYBuUF{7n9aiHSVFFv`i7*B8VI^<%HoAK|Y>e zm8K|}nCXdzHZjxjUt;Z! zU#U@sF;%und}wvV0oj%7Ib#*(3N4JUp(*3O=fkEbI8$j-W~m!G=hOXm>e9oL=N}050ZPvR*0-7-W%AH>hn_C z+;1}iwN@ROf_X~R&ukez6*(g$v@B7}_~U{tQqa5B+Y%_^T3T3zC*dl>aCH1xB9d#lT2Pigr@1pD2o?RQ}qjRCAm zE@z=n#h?7`_l_nS|IYIA08lxFE8ww!XKy7ODZF^YF$iLS*GsP5=|W<8VgKQhA65gdT^2I5db+ zMFV5>VRHRhh&1_=9h93f8*hX~1@>q^3SAa_^uP?u_Q@WfObJx9poDO&0C13*FEH;( z?=a>z-$b4pA^iL7zPKoK7Fs+n}u|DzcjrnMe{fsxXtHSXFFS0A3C?1+1*29 zKe`DVD`wPtr8wqCGn^5r@8R6% z38TH0`o2u`jtkuh#|1{hs|xuMNMIByey7<~mNdgXn4R;ve)$*#-K}GErLugdU_r14 zIdwZsOE#-2;LJvf$y!5MK@)Spr?_z?I=sQnS`{Ns=|FrUjY-#je_`EiS7x0_C(~ct zQg~ECMsF8Ih9(4AD`{yuwIXo9n<8xtM4aYAi-)=-tERX4CB%aUJOpE}DTpdem3Qt8 zQpqAowJuQz!yH|rC*;5-7=r0n3v0r@lnZWb!#;&8RL07Sn){e}lhGcquA8%9yjA-V zTAiJli-H^6wly`Ja^0uN-d*7<+u1ksN$7x3sdm7}G!?fTXquY~GI)>wcL8re+EOhnU4#6QE3!A0 zgfU}{p1ElTgbMGmMaDu&i!5h>_?n-^l{7F6kFlyK9F6eZW4Vp1JDE7S!SHU3cf?

kc!6T?P#JOY~99X2*9R}JYz2W&;(yv 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 diff --git a/packages/browser-wallet-ui/src/assets/icons/normal/48x48.png b/packages/browser-wallet-ui/src/assets/icons/normal/48x48.png deleted file mode 100644 index ce8d48aa111758ad3781e764b499321dd5a4712a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1122 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 Ri7NqpX#35K^7heL{{d7EP)+~< diff --git a/packages/browser-wallet-ui/src/assets/icons/normal/64x64.png b/packages/browser-wallet-ui/src/assets/icons/normal/64x64.png deleted file mode 100644 index 6fb960c93caf0c5e6b1d52e6a580dfc22508eec0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1546 zcmV+l2KD)gP)Ua|fm|d~#vB_Gl}N*{FE`9D>1NC6SJAghv`d_>ko1ci-C zO_qu%ZI)|M$Oa5!Q~@G*QBL@-d@RXQfO*QIjGLl}3JhUH0ZQ;IsNe0~peDaJHIlY$zk&|J zuKR?koxZoD0yK(Jc&|UU$|SSZXLw`ga6|fQt1u5QFt6 z-MBRICeq~G*eb@~S=Lg7N|Y+zZGj<>Rgb@LyC0uje$7#KQo?R*lLC16k_J z>C4c-@@I-oKEUMNfA8a8#BA4)6bgI)-t+kGtHGx2j~*NrYv@aSZY5(QEH*44Yj>Yx z{e0;UeDKN7fqi%H^h1NfyzLZi92yExm7L6R=9S0jJ^oMAww0wG=pfE;!u{+hKou>E z$S8fsgVX%KHJqVPT(IGoQC|HSM}}E{awxFvS-rdf|0yeQ6yP<9tg$TSzVchM$%k1) zTx@0WT`EN!LdMwIJc#>09g`?i^9;nm9ld2W%< z*B@SV1Qh<#)gNIB83tC~&Y=0Xg2|EJALu~YIRsLv@o@%s_UzEbQGkUMc=e4{?Xk)`PJtKi9cygk)SIdB_=RN{pujL_A*1jvb57BH=xNjT z1-(?*OCi>CfxV#nnWq>&`)AWOT84jUBqaL^AXGwHbc6ypE%ri%_=iPOsDK(W%*;2Z z0u!Hs!M|XLjV`3bvczi}daw)@7WYeLA^@pT0j!r>FbprAi)qF${2r(eXt0sbWqb&D z;kY+65podOtNCrk>VZAaZDLj;ftT5DPl*DwXN5IBFLd*O8Dtbb z4f4nQM-LCf02TgmOJdsXW@+M2g*iMli=q^KMy(wf3XOMRnj(dwXzlf!(|uZ30NcxQ zXx&7xmxL8T3=~Bx?uW))U^|1ufWlvu2cmv@Pv|8=Y@KmGH&S604azW7B4@wAU5!kT zF+a@Nu|`10s6pA=OV~6Qpk{K06tMO%oo>3f-(S-05t#P=-!vVjX4r&`3__tVOGQ{G zxuT!*cajEXgW?OmP*z|e<^`rfuQvN0ZgCm;?^%FyYm{)<{&K6%^6gRK%P|TkULH6QtRogX#q#u!VlI-51&_fEglN z%g~uhi1hwI)NXMr!|w@%5&7kbNM&)JNLfM^*{2%k&5=kJ;AP&%HTi*9Z)NNjj9eo* zT#R{4d{jGatbXE@p|6^373$iN=*f`$P+1L$GWH%`%L_?_Cy6Y;i+Znso!CX}E)}_Z zQ&QNNhX&dTaQVT;$aZ}WF@bb3BDjk&1-Q6Pm#Xu$2s1D>uW+Jf`UPs^3h+W@8~|Qq wPoC;U;<8hrpoaRp!3?=o5qdU_x5i!m2kJ`5C`fB1t^fc407*qoM6N<$f?;sbng9R* diff --git a/packages/browser-wallet-ui/src/assets/icons/square/1024x1024.png b/packages/browser-wallet-ui/src/assets/icons/square/1024x1024.png deleted file mode 100644 index 434fb650113d1037920bd079b9b35c36b9ec66f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11604 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%0D9-h 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 bdD(gS<#`N-w-iHbfPxI3u6{1-oD!M<&%i{S diff --git a/packages/browser-wallet-ui/src/assets/icons/square/256x256.png b/packages/browser-wallet-ui/src/assets/icons/square/256x256.png deleted file mode 100644 index 24931a6330b192ad390abfefb2aea64e37e6a560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3512 zcma)<2~bnl8pqGgN`h<>L?TN-DmzUGXh>PYCPV{)f z1w^1|l_D(_MOiM2peR~92o$9tBBc*O5vdDR-bG)1(~fWE&790V_xu0;`Mxjb%sn^z z`9c0#WGWc|pv4XF4FLc`rx4JmG28V|;x>=raEiA4+}iK&3yd(j?@FSYtGiRxxdle9hojE9CIe> zwOi!Vy!PxOXIZx_Kf0!vqRH($d|^`O()RsPZ-l* z9o569ZH86Ij8S?hVYC^4xu@Y*>I^F#gmkSQBCuGv0+6-@0C*1oZ_yAu3P3U)fPV=9U>5*js4Ti1?1l;{d|sGe%Pg*C z7K_Xc3^EHLv!G=bQ{Jx=Ti_U1=#W@popHsq@E)aVlw9``Zy(CD2ne$j^OoGr?%ZVejLW8J)s`;n{r6lpJ=A7Y zaF4>-6@RQU0l2;k@I$FSrj?h<6(kHd2 zEx#`odQ89h`t>8?v&YO0Q;*l|>e0yB1;o5|15XCxYzrV+B!waE0?2t55)rNad7TG|@u z&+otVhA5oB4Z`7#9vrBxDf4^iX|LfaK&CswMl%)^ff$^&!WR?IXrQi;h z=2A)TJ1J3q3{9&&j?sY+gW7@Q7^1FBYv~u{* zjNU?Tw3OJRxB~_aT>ExteWua8=UB^|44-gJv$5vhg5?4YSX|sLM`MqMS)7n~6Jo$b zPBN0#6rM}~{n;%b&$Y%x3TQ`Su0fV@Q5X43I8;~doG3vj{0PS?+Un=gTv_aic}TK= z%s5@oY_Xmt#mk%#?U(jdrf@cZHQoB3vCeT^4CpfW#r!x!@?hq-7!0_o-0DxV?}s!l zhM8E?9(x;sN7+*1&&PZ~OW_%e(a?!>G_pU1I+FPtydggd16Jc{2Vn}V?4Hn{(Crs8 zK;q0YAj4k=y*`=(_aqYS#siRfz8Ru-YM4W&5m3Ph?s^xf<_6PXPX+dAH0F8VHAt}7 z8VDXt5Zx>YtuY|~yBAjBtzMa0pl8Tho95UDl3E{LqQKb&iF28+;9yf#rzusx>DP4Ps03-*Jpd!`Ao1`gCDd5cDQ^3=z z(uo~T?ZX{BV_N1b*G4wsEVvDtV;e0xUaaidWp@VS3`(O#32^e=0Jex&sJ{aOlQa$LC{o&FZO;Iq=P2Xz5q!!Qo&)?qV!AFAvM9`byZeo{aFI0wB=$z74iI z0$!Q3C#UVc1{tE6?zWL;@ClrUK}R3#jKzt8F0;Cz_(Olrw(BJ6 zPHOG*F`ND)bvf9$LL+$>jDrhaLxQ~P5>Rv|?2(IjtOf_eK?aSOsfx;ZgNnN^^{6$z zu0il@eDm|V;2=ZK`l0T9Mo_h1bFaFjZ1*N80(w0J+yZ$Ph~6<d?TD$Jtu~0-o(K@*`X$+PApW6&2Y!Uz;9>1w$hZQQd@p=jHm+$Yb*{^{5rE{ zju1x+43-CyyU+I)usA7YBN<*RcTdmYE47i7GiP;SnB`AOLMOo1ofgTVLUve~9X5@T z;f}x3A>v-`)yJ?%Bo-&$KUoLO2MwE7X&kX# z2l2KK2#oCRY=;5ZNLTK3YqFo{pQ;i;7QwnM3kqINOs>O?i&ML#d;*f+%h6^B^Kqci zCQF8)g6dE)f8SZh%opV&I6R2I>3YwfU(z)U4Lx0P%&g9lk5!s{bAJ)y>E6#cKkq(> zI(_rWyKX}5)StZ<2D8qB2CxlE`=ulTPA1$sdX!XyJh{;&f~u1;>dQb=+T{|RL3UKJ z4g9;g1ypjXFmJl3)Ed@Y8X9JdKt)!4fMbgF0Tpq|N_8#$>U5q#3Pn$S8nFYhYjaEl zwY~%IsmKiwVfYKFK6pe6(FZx}?=bgX(IND1I60Z`KaLm@0(IL!P4e-i~iXKGQ+MBw3OkkZz5 zprUP7y|7#QuD;aHW5H;@=eA1SX=QIs{IrpMcIwuzir)l9-ni?0ap&yNSL5x*ssAuAma<)#9}Nr1x3y6NbuNP>MHb8UmZ_8Y5>==$K^ZRrEPLAA zm_P1eg;IK-C?7?7t%U_UhJs@T{hi5f6m>AXWzS5cYrN#-U9<0L$ZJWeeIPA*HwZnfF}&Hh0Tmx({h ztc%^JQ2D>zgeqdyTZAeJ@aG2dX-hP%5_A^$#RH0TRNYpBs z=tEYtZM9JSq3`(ySya?T`;6=3Hk#W|d|8Sl9xxyEbk1$iMRP3rFNZBsC{tCkIH?-& zlVjp#BATxvK`4{gjYdMR3XhN$?{Ed#TGeW^qH^Th6VxG LFUYsrTd?cjdN^I3 diff --git a/packages/browser-wallet-ui/src/assets/icons/square/32x32.png b/packages/browser-wallet-ui/src/assets/icons/square/32x32.png deleted file mode 100644 index 583d1b6e06c1e8631940c4c0476e7d48f1998799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1724 zcma)+3rtg27{^aVK#EWbB}nmcK?b-1_5oO{Af>IPSfI8DqB!W|7B2KK0!5tb~u=bqf}|NGzXeBU`a zCE^5u3z13$0JsQac@j7ywlTvFzIjK?-2f0aVO*{lQz!rkDk~_9jJ*;)yDMFK)X$T% zghIY1J{W8^v$8$SV&5CYI(9|cn0-8TH^ocP-q_!7k>70ZN=if!YNF zhPJof1yYB>%l6HE7w=KuvI>CY#;S)7EY|epFZZ_I`|0kwy4K%5s_DH?I`YEM;x$;i z)wU^$SV=qp`2heFZUJBnh6)D(Fwp>bngIa20st?4RrAWFP*8|PN&GhJv^FcD%?jGA zcIQUy*L}v6e!|jMFQ~ptibxmu#jaeI9TT0yS(X!X_zo#JNz`tgUN=ZQF-Y9sOUXa! zFWe9rEEVO~`)_TTTiWGa(M#Fc?X9W^6`CS5_lLAw?W|U-N$@HVrX$E#2zW?CPGlkc zaMH)78Ub+junhvJteORbj<_(M@A$-y3f#i0`zx=&&^aNGlf=4ueeYHG4rC_ZBWN1d zm_09f=#kYbsXc4oP1&$Bv+H4Ws2ix@@Rq#<+rnnNPAnQh0x8+&54$jmj-IK!wf2l- z!m;bU>m^701FQC7E}!$`3d`9EgA0qfePM{#nRKKjd3$mb)lxU#<@ikb&p-GoIIrCw zr5!Gb%ahGlo+{GL8O=KIa7pnFS2H=Hl%1QJ6gm6QkoJ3*;Q?xZ`a=Kd=z453qMYa2 zwt~^LIfHtMZ~!OYoaMR40xNhA=dZ?86YU)C_=hai$TCq8s?Ef+0Fx2_*s=)9?vw6uIR#UWt4|20#ZdjL z7O75!=gJHy5D4SN2qTnE3uV&gIiD|vl>g*E@GO%?u9acxscT1kMx>CRJq6FzY4irv zXvB0{5b*}pr$BD*6x`p7V1!4A^)%bHH|M{|iFzQo&0&lJ!JsL?I5A%!)Z(Z?ktNe+ zqRVv#jSPn!V(qg$ur+w$|MmRYTSoX|Rx$8-46W}^VHIcTaGeIl4VYp)D=ZtA;p26? zdzz`xg-qd^I7GJNB*yYkHDEsIyKXz4J~kHK^lXJrztMnYX5m0=lB+QV!qaJFnD$&5 zeJ#ZN-eF4As4!sq@qFW3DK}wiJOtAsMu{Lsl*xft0PuWAYh+rJN~XX~2GlUV^P(?y t^+3RN63{8(VrP;Bjb6;r+z>~~m0&TcV9x{Fz% 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 From fd0eee819e6c8fa214106a31c99e396e359c23a4 Mon Sep 17 00:00:00 2001 From: rappix Date: Thu, 7 Mar 2024 16:12:42 +0100 Subject: [PATCH 32/96] fix: adjustments for build & dev commands --- package.json | 8 ++++---- .../browser-wallet-base/scripts/generate-icons.js | 2 +- packages/browser-wallet-base/webpack.shared.cjs | 12 +++++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 488e640..afb691d 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:safari", "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:android", "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:ios", - "dev:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development", - "dev:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", - "dev:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", + "dev:chrome": "(cd ./packages/browser-wallet-base && npm run icons:chrome) && (webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development)", + "dev:firefox": "(cd ./packages/browser-wallet-base && npm run icons:firefox) && webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", + "dev:safari": "(cd ./packages/browser-wallet-base && npm run icons:safari) && webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", "dev:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development", - "dev:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", + "dev:ios": "(cd ./packages/browser-wallet-base && npm run icons:ios) && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { diff --git a/packages/browser-wallet-base/scripts/generate-icons.js b/packages/browser-wallet-base/scripts/generate-icons.js index 90679ff..e31702c 100644 --- a/packages/browser-wallet-base/scripts/generate-icons.js +++ b/packages/browser-wallet-base/scripts/generate-icons.js @@ -12,7 +12,7 @@ if (!['macos', 'ios', 'safari', 'chrome', 'firefox'].includes(platform)) { } // Load the input image -const inputImagePath = ['macos', 'ios', 'safari'].includes(platform) ? 'src/app-resources/icon_rounded.png' : 'src/app-resources/icon.png'; +const inputImagePath = ['macos', 'ios', 'safari', 'chrome'].includes(platform) ? 'src/app-resources/icon_rounded.png' : 'src/app-resources/icon.png'; // Create output directory if it doesn't exist let outputDirectory = `../../build/platforms/${platform}/icons`; diff --git a/packages/browser-wallet-base/webpack.shared.cjs b/packages/browser-wallet-base/webpack.shared.cjs index 9b6d7fe..a53a709 100644 --- a/packages/browser-wallet-base/webpack.shared.cjs +++ b/packages/browser-wallet-base/webpack.shared.cjs @@ -43,11 +43,13 @@ module.exports = ( const manifest = !is_app ? require(`./manifest-${platform}.json`) : null const output_dir = path.join(__dirname, `../../build/${is_app ? 'app' : (platform === 'safari' ? 'tmp/safari' : 'platforms/' + platform)}`) - // clean destination folder - exec('rm -Rf ' + output_dir, (err, stdout, stderr) => { - if (stdout) process.stdout.write(stdout); - if (stderr) process.stderr.write(stderr); - }); + if(mode === 'production') { + // clean destination folder + exec('rm -Rf ' + output_dir, (err, stdout, stderr) => { + if (stdout) process.stdout.write(stdout); + if (stderr) process.stderr.write(stderr); + }); + } let plugins = [ new webpack.ProvidePlugin({ From 1289c5aebdfb0a85992b07c5608764399a443f49 Mon Sep 17 00:00:00 2001 From: rappix Date: Thu, 7 Mar 2024 17:56:20 +0100 Subject: [PATCH 33/96] safari and ios updates --- .../browser-wallet-base/capacitor.config.json | 2 +- packages/browser-wallet-base/package.json | 2 +- .../scripts/generate-icons.js | 2 +- .../{icon.png => icon_normal.png} | Bin .../src/app-resources/icon_rounded.png | Bin 42897 -> 39888 bytes 5 files changed, 3 insertions(+), 3 deletions(-) rename packages/browser-wallet-base/src/app-resources/{icon.png => icon_normal.png} (100%) diff --git a/packages/browser-wallet-base/capacitor.config.json b/packages/browser-wallet-base/capacitor.config.json index 6aaa975..3163b05 100755 --- a/packages/browser-wallet-base/capacitor.config.json +++ b/packages/browser-wallet-base/capacitor.config.json @@ -1,5 +1,5 @@ { - "appId": "com.bitgreen.wallet", + "appId": "com.bitgreen.wallet.app", "appName": "Bitgreen Wallet", "webDir": "../../build/app", "server": { diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 35611a6..6a7231f 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -75,6 +75,6 @@ "build": "npm run build:android && npm run build:ios", "build:android": "cap sync android", "build:ios": "cap sync ios && npm run icons:ios", - "build:safari": "node scripts/generate-icons.js --platform 'safari' && xcrun safari-web-extension-converter ../../build/tmp/safari --project-location '../../build/platforms/safari' --app-name 'Bitgreen Wallet' --bundle-identifier 'com.bitgreen.wallet.extension' --copy-resources --macos-only --force --no-open --no-prompt && node scripts/generate-icons.js --platform 'macos'" + "build:safari": "node scripts/generate-icons.js --platform 'safari' && xcrun safari-web-extension-converter ../../build/tmp/safari --project-location '../../build/platforms/safari' --app-name 'Bitgreen Wallet' --bundle-identifier 'com.bitgreen.extension' --copy-resources --macos-only --force --no-open --no-prompt && node scripts/generate-icons.js --platform 'macos'" } } diff --git a/packages/browser-wallet-base/scripts/generate-icons.js b/packages/browser-wallet-base/scripts/generate-icons.js index e31702c..2fef306 100644 --- a/packages/browser-wallet-base/scripts/generate-icons.js +++ b/packages/browser-wallet-base/scripts/generate-icons.js @@ -12,7 +12,7 @@ if (!['macos', 'ios', 'safari', 'chrome', 'firefox'].includes(platform)) { } // Load the input image -const inputImagePath = ['macos', 'ios', 'safari', 'chrome'].includes(platform) ? 'src/app-resources/icon_rounded.png' : 'src/app-resources/icon.png'; +const inputImagePath = ['macos', 'safari', 'chrome'].includes(platform) ? 'src/app-resources/icon_rounded.png' : 'src/app-resources/icon_normal.png'; // Create output directory if it doesn't exist let outputDirectory = `../../build/platforms/${platform}/icons`; diff --git a/packages/browser-wallet-base/src/app-resources/icon.png b/packages/browser-wallet-base/src/app-resources/icon_normal.png similarity index 100% rename from packages/browser-wallet-base/src/app-resources/icon.png rename to packages/browser-wallet-base/src/app-resources/icon_normal.png diff --git a/packages/browser-wallet-base/src/app-resources/icon_rounded.png b/packages/browser-wallet-base/src/app-resources/icon_rounded.png index 304bac728580e5092ff25b7dbddf081af72588fa..6d23134fc86192bfc1d9cf9859f37f760f06ca2b 100644 GIT binary patch literal 39888 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

C@C%3ZH?xX8RE=C)#)-|h>R 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 literal 42897 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 C4;VTC From 4f0ac439015834645a1a90b977888db7c4887242 Mon Sep 17 00:00:00 2001 From: rappix Date: Thu, 7 Mar 2024 22:22:38 +0100 Subject: [PATCH 34/96] fixes: polkadot api, broken screens for standalone app --- packages/browser-wallet-core/src/polkadotApi.js | 2 +- packages/browser-wallet-ui/src/index.js | 2 +- packages/browser-wallet-ui/src/screens/dashboard.js | 2 +- packages/browser-wallet-ui/src/scss/_app.scss | 11 +++++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/browser-wallet-core/src/polkadotApi.js b/packages/browser-wallet-core/src/polkadotApi.js index fc59757..2aa1dbc 100644 --- a/packages/browser-wallet-core/src/polkadotApi.js +++ b/packages/browser-wallet-core/src/polkadotApi.js @@ -333,7 +333,7 @@ const initPolkadotApi = async(force = false) => { } const polkadotApi = async(force = false) => { - if(!api || force || !ws_provider?.isConnected || isIOs()) { + if(!api || force || !ws_provider?.isConnected) { const success = await initPolkadotApi(force) if(!success) { setTimeout(() => { diff --git a/packages/browser-wallet-ui/src/index.js b/packages/browser-wallet-ui/src/index.js index 506d210..196cd80 100644 --- a/packages/browser-wallet-ui/src/index.js +++ b/packages/browser-wallet-ui/src/index.js @@ -278,7 +278,7 @@ class userInterface { const login_screen = document.querySelector("#login_screen") const input_field = input_form.querySelector("#password") - if(login_screen.classList.contains('inactive')) return + if(login_screen.classList.contains('inactive') || isStandaloneApp()) return input_field.focus() }) diff --git a/packages/browser-wallet-ui/src/screens/dashboard.js b/packages/browser-wallet-ui/src/screens/dashboard.js index 37cc418..793aa0e 100644 --- a/packages/browser-wallet-ui/src/screens/dashboard.js +++ b/packages/browser-wallet-ui/src/screens/dashboard.js @@ -173,7 +173,7 @@ export default async function dashboardScreen(params = { return i*200 + 200 }, }); - }).catch(() => { + }).catch((e) => { // TODO: handle this like: // goToScreen('connectionErrorScreen') }) diff --git a/packages/browser-wallet-ui/src/scss/_app.scss b/packages/browser-wallet-ui/src/scss/_app.scss index db0759e..dcc7621 100644 --- a/packages/browser-wallet-ui/src/scss/_app.scss +++ b/packages/browser-wallet-ui/src/scss/_app.scss @@ -22,8 +22,19 @@ body.app { } #login_screen { + position: absolute !important; width: 100vw; background-color: transparent; + + &:after { + background: linear-gradient(to bottom, #224851, #133948); + content: ""; + height: 100%; + position: fixed; + width: 100%; + top: 0; + z-index: 98; + } } #init_screen { From 81bd07b34221d6954a485a385fdb31596c158661 Mon Sep 17 00:00:00 2001 From: rappix Date: Fri, 8 Mar 2024 01:28:55 +0100 Subject: [PATCH 35/96] fix build & dev commands --- package.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index afb691d..6dcedab 100644 --- a/package.json +++ b/package.json @@ -25,16 +25,16 @@ "scripts": { "setup": "npm install && cd ./packages/browser-wallet-base && npm run setup", "build": "npm run build:chrome && npm run build:firefox && npm run build:safari && npm run build:android && npm run build:ios", - "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production && cd ./packages/browser-wallet-base && npm run icons:chrome", - "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production && cd ./packages/browser-wallet-base && npm run icons:firefox", - "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:safari", - "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:android", - "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:ios", - "dev:chrome": "(cd ./packages/browser-wallet-base && npm run icons:chrome) && (webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development)", - "dev:firefox": "(cd ./packages/browser-wallet-base && npm run icons:firefox) && webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", - "dev:safari": "(cd ./packages/browser-wallet-base && npm run icons:safari) && webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", + "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production && cd packages/browser-wallet-base && npm run icons:chrome", + "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production && cd packages/browser-wallet-base && npm run icons:firefox", + "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production && cd packages/browser-wallet-base && npm run build:safari", + "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && cd packages/browser-wallet-base && npm run build:android", + "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd packages/browser-wallet-base && npm run build:ios", + "dev:chrome": "(cd packages/browser-wallet-base && npm run icons:chrome) && webpack --config packages/browser-wallet-base/webpack.chrome.cjs --mode development", + "dev:firefox": "(cd packages/browser-wallet-base && npm run icons:firefox) && webpack --config packages/browser-wallet-base/webpack.firefox.cjs --mode development", + "dev:safari": "(cd packages/browser-wallet-base && npm run icons:safari) && webpack --config packages/browser-wallet-base/webpack.safari.cjs --mode development", "dev:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development", - "dev:ios": "(cd ./packages/browser-wallet-base && npm run icons:ios) && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", + "dev:ios": "(cd packages/browser-wallet-base && npm run icons:ios) && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { From e249f8c3b4aff501af64bad6f78191199d90dd3a Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Fri, 8 Mar 2024 01:52:27 +0100 Subject: [PATCH 36/96] package.json script compatability updates and app asset generation icon update --- package.json | 20 +++++++++--------- packages/browser-wallet-base/package.json | 10 ++++----- .../src/app-resources/icon.png | Bin 0 -> 11604 bytes 3 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 packages/browser-wallet-base/src/app-resources/icon.png diff --git a/package.json b/package.json index afb691d..ffc9a74 100644 --- a/package.json +++ b/package.json @@ -23,18 +23,18 @@ "packages/*" ], "scripts": { - "setup": "npm install && cd ./packages/browser-wallet-base && npm run setup", + "setup": "npm install && npm run --prefix ./packages/browser-wallet-base setup", "build": "npm run build:chrome && npm run build:firefox && npm run build:safari && npm run build:android && npm run build:ios", - "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production && cd ./packages/browser-wallet-base && npm run icons:chrome", - "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production && cd ./packages/browser-wallet-base && npm run icons:firefox", - "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:safari", - "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:android", - "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && cd ./packages/browser-wallet-base && npm run build:ios", - "dev:chrome": "(cd ./packages/browser-wallet-base && npm run icons:chrome) && (webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development)", - "dev:firefox": "(cd ./packages/browser-wallet-base && npm run icons:firefox) && webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", - "dev:safari": "(cd ./packages/browser-wallet-base && npm run icons:safari) && webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", + "build:chrome": "webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode production && npm run --prefix ./packages/browser-wallet-base icons:chrome", + "build:firefox": "webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode production && npm run --prefix ./packages/browser-wallet-base icons:firefox", + "build:safari": "webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode production && npm run --prefix ./packages/browser-wallet-base build:safari", + "build:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode production && npm run --prefix ./packages/browser-wallet-base build:android", + "build:ios": "webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode production && npm run --prefix ./packages/browser-wallet-base build:ios", + "dev:chrome": "npm run --prefix ./packages/browser-wallet-base icons:chrome && webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development", + "dev:firefox": "npm run --prefix ./packages/browser-wallet-base icons:firefox && webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", + "dev:safari": "npm run --prefix ./packages/browser-wallet-base icons:safari && webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", "dev:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development", - "dev:ios": "(cd ./packages/browser-wallet-base && npm run icons:ios) && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", + "dev:ios": "npm run --prefix ./packages/browser-wallet-base icons:ios && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 6a7231f..b929509 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -66,12 +66,12 @@ "scripts": { "setup": "rm -Rf ../../build/platforms/android && rm -Rf ../../build/platforms/ios && cap add android && cap add ios && npm run assets", "assets": "npm run assets:android && npm run assets:ios", - "assets:ios": "npx capacitor-assets generate --iconBackgroundColor '#224851' --iconBackgroundColorDark '#224851' --splashBackgroundColor '#224851' --splashBackgroundColorDark '#224851' --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", - "assets:android": "npx capacitor-assets generate --iconBackgroundColor '#224851' --iconBackgroundColorDark '#224851' --splashBackgroundColor '#224851' --splashBackgroundColorDark '#224851' --android --assetPath src/app-resources --androidProject ../../build/platforms/android", + "assets:ios": "npx capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 --splashBackgroundColorDark #224851 --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", + "assets:android": "npx capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 --splashBackgroundColorDark #224851 --android --assetPath src/app-resources --androidProject ../../build/platforms/android", "icons": "npm run icons:chrome && npm run icons:firefox && npm run icons:macos && npm run icons:ios && npm run icons:safari", - "icons:chrome": "node scripts/generate-icons.js --platform 'chrome'", - "icons:firefox": "node scripts/generate-icons.js --platform 'firefox'", - "icons:ios": "node scripts/generate-icons.js --platform 'ios'", + "icons:chrome": "node scripts/generate-icons.js --platform chrome", + "icons:firefox": "node scripts/generate-icons.js --platform firefox", + "icons:ios": "node scripts/generate-icons.js --platform ios", "build": "npm run build:android && npm run build:ios", "build:android": "cap sync android", "build:ios": "cap sync ios && npm run icons:ios", diff --git a/packages/browser-wallet-base/src/app-resources/icon.png b/packages/browser-wallet-base/src/app-resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..434fb650113d1037920bd079b9b35c36b9ec66f2 GIT binary patch literal 11604 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%0D9-h zswYPQcR4Ad9csv!MobDZqz%)uDdFfEz){Hh3sAKo&WLXD(+-97zMvxCQS<^~0dK0) zLieiPZ?R4LDo(l!pd^dyZxbQzJr0QjG+3Rp6%|p)NDStdCRo6Xj*j?PwXT=8z{x$t zxfa^r!Dhs+<|hBFv}m5yp-3bUG*nxicQj0rToo^lZVkCTRvp738jS!gOaI3hRl*Ne zdm+&C^awhvq=?2}eAK|orOZ(omJ?y)H23YP~p`ze{ zAFRP0N9w=+?gcVv(?ex}3=Q6yAH%LI)9N!DKAXT)*DuNlJi(;Vn!3Oe3Mizhg{uHx zn4Y=3h=TnPnySbPu2yab4j4=lA>3O2GC~>FNoJrGx%`9%@&Md0P>s)To^((T`kMEk zod7kl`XhG2JEkc*-BPr8XIdjcD}DN88&*UjNZ(YPtJkQ4<$m;j)eu)Rl5qi8y)=N8 z(Olh8x?og}u#2~Y?=dVctPHIdj77?DpL4(z{GbF!>9iI$^k_fFS7aua4`XGL0dP)K zJ!R-!qf&rA63L+O$#C3Gess-?zi7vh->3oK@=%V|0 zQ;GHFW>IawVmA}sT%gCSzb?j35;b6br80j%YMSj7XFcVCe1;|q%zh^gk5Q z1xfircdc14g8l(tHY&x!B@oR#!I-z`maaBd*za@0L=B{6W?9->SZ5P0&-qvK%i!c14gS)q+N%+V-{qMKv9c<{}ge(+M zU6OqIj)f6>f>>Z-yOc60ZxO?b;M?5gS3Gd;I%t4;NoKm|4!1EJ3*za>|JwdvY*n1Xc`RoU_B!>30B*gt&w(Ed6Z5z zAY&J3!n}9r2$p{u&IyI>1W42Oq&@={Le2P#x5l1di+> zxH=25p}tP)(>apQ6dUAsU!=YS!|FUaUZzewb%HGp5EW24QUCH4L?X7E1!QYoL5#{2 zTt$kA;K-6IKt63B6IoA!kONEM{QvyD!9A?k032Ye5DLmb_AVF9Hw3H$zX27%k=+k# zwyQZB*WecfZ|yk@LiS(?twIXSa1|GQR^mTP^r6E~^1~*w=(C56LfR6pFN*U%oG4$o zy;$^r7GY{9ktzu$MRa^Rv+h2M=kz-@@*Yi{@(*P0eS;PR`c^I-q>;f7~y{iYoZo z-72~Lm$6I#?Fn8?JU&WK1=-}~^X+$1FhLglyk>_sj5o+BNj=aS1|^3r70`X_4TCFu z4Z8Px(7CrQ7Fk%l3IO^1?_h`X6IpW6^?BfpGxT@y97!;Hfhuvr#%MsMYmB;<3*LNf ztaf?g?`UVoJ%MF>d)pIJ;g)!gx4Jfw+4`dDOwe8`&BZ8qZ_8~ukQ`;dijh$(8s~MN z5C4(Y_*AzVG?wj6oE?|de1%rmZ1etG&&bXk2GDev;%B4Y^f9n1AcvZ+-ZS3f-?j&S zVOeCI(%steV#Mx1|1Yt-vVu!5xkc@4_+#wqN7qZHU*69d-gCY!o|d0<@_cOfnudP8 zrMter`qBSev08UY!}5*xC43Y3LEO)OVHEpo^NSpI*Fhn`9vBb zs38u1y950#7YBxix%h>y^$Ftb@B`*^Sm;mwtMyC>CHFVfl8_xCp=)_QzJ9=1<}7Xx zCujUUxfF`HE-+|POiMPDZXV0n!qU{-(!}h}k9PtHtnfGRGRV}~-#^SR92i@$9a8)5 z!fBqAfIqxYGR&V`}PjRG5Sw&e%g1QxvAMNUzd17)L;Gq)g>S#JS503JT%Z( z#1*O??h`K3TVCm~8pLA#1J Date: Fri, 8 Mar 2024 13:23:17 +0100 Subject: [PATCH 37/96] splash screen updates --- package-lock.json | 16 ++++++++++++++++ package.json | 4 ++-- .../browser-wallet-base/capacitor.config.json | 7 ++++++- packages/browser-wallet-base/package.json | 5 +++-- packages/browser-wallet-base/src/app.js | 4 ++++ packages/browser-wallet-base/webpack.shared.cjs | 3 +++ 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c367f6a..5793051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -300,6 +300,14 @@ "@capacitor/core": "^5.0.0" } }, + "node_modules/@capacitor/splash-screen": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-5.0.7.tgz", + "integrity": "sha512-2aAhhZPi7GU8DDs9dhH4OnMJ3rTscPS/TYKzm03fzhBby6ykSXY6HqKgaWdhfCR4TvLsHf0VKpWZu4ZHD0S7iQ==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -12193,6 +12201,7 @@ "@capacitor/core": "^5.7.0", "@capacitor/ios": "^5.7.0", "@capacitor/keyboard": "^5.0.8", + "@capacitor/splash-screen": "^5.0.7", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", @@ -12716,6 +12725,7 @@ "@capacitor/core": "^5.7.0", "@capacitor/ios": "^5.7.0", "@capacitor/keyboard": "^5.0.8", + "@capacitor/splash-screen": "^5.0.7", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", @@ -13253,6 +13263,12 @@ "integrity": "sha512-XYyBzGlzjgLPqyPVdu5McGLYV6+G2efVR4I3l5cF1B27M6U/oFqv9CQU74WNG08nee28bfccboNpv6eWCLYn1A==", "requires": {} }, + "@capacitor/splash-screen": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-5.0.7.tgz", + "integrity": "sha512-2aAhhZPi7GU8DDs9dhH4OnMJ3rTscPS/TYKzm03fzhBby6ykSXY6HqKgaWdhfCR4TvLsHf0VKpWZu4ZHD0S7iQ==", + "requires": {} + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", diff --git a/package.json b/package.json index ffc9a74..90a6e45 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ "dev:chrome": "npm run --prefix ./packages/browser-wallet-base icons:chrome && webpack --config ./packages/browser-wallet-base/webpack.chrome.cjs --mode development", "dev:firefox": "npm run --prefix ./packages/browser-wallet-base icons:firefox && webpack --config ./packages/browser-wallet-base/webpack.firefox.cjs --mode development", "dev:safari": "npm run --prefix ./packages/browser-wallet-base icons:safari && webpack --config ./packages/browser-wallet-base/webpack.safari.cjs --mode development", - "dev:android": "webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development", - "dev:ios": "npm run --prefix ./packages/browser-wallet-base icons:ios && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", + "dev:android": "npm run --prefix ./packages/browser-wallet-base assets:android && webpack --config ./packages/browser-wallet-base/webpack.android.cjs --mode development", + "dev:ios": "npm run --prefix ./packages/browser-wallet-base assets:ios && npm run --prefix ./packages/browser-wallet-base icons:ios && webpack --config ./packages/browser-wallet-base/webpack.ios.cjs --mode development", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { diff --git a/packages/browser-wallet-base/capacitor.config.json b/packages/browser-wallet-base/capacitor.config.json index 3163b05..3cfec4e 100755 --- a/packages/browser-wallet-base/capacitor.config.json +++ b/packages/browser-wallet-base/capacitor.config.json @@ -13,10 +13,15 @@ "scrollEnabled": false, "contentInset": "never" }, - "backgroundColor": "#224851", "plugins": { "Keyboard": { "resize": "none" + }, + "SplashScreen": { + "backgroundColor": "#224851", + "launchAutoHide": false, + "showSpinner": false, + "useDialog": false } } } diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index b929509..1114e47 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -32,6 +32,7 @@ "@capacitor/core": "^5.7.0", "@capacitor/ios": "^5.7.0", "@capacitor/keyboard": "^5.0.8", + "@capacitor/splash-screen": "^5.0.7", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", @@ -73,8 +74,8 @@ "icons:firefox": "node scripts/generate-icons.js --platform firefox", "icons:ios": "node scripts/generate-icons.js --platform ios", "build": "npm run build:android && npm run build:ios", - "build:android": "cap sync android", - "build:ios": "cap sync ios && npm run icons:ios", + "build:android": "npm run assets:android && cap build android", + "build:ios": "npm run assets:android && npm run icons:ios && cap build ios", "build:safari": "node scripts/generate-icons.js --platform 'safari' && xcrun safari-web-extension-converter ../../build/tmp/safari --project-location '../../build/platforms/safari' --app-name 'Bitgreen Wallet' --bundle-identifier 'com.bitgreen.extension' --copy-resources --macos-only --force --no-open --no-prompt && node scripts/generate-icons.js --platform 'macos'" } } diff --git a/packages/browser-wallet-base/src/app.js b/packages/browser-wallet-base/src/app.js index 1917230..49cb35f 100644 --- a/packages/browser-wallet-base/src/app.js +++ b/packages/browser-wallet-base/src/app.js @@ -3,8 +3,12 @@ import userInterface from '@bitgreen/browser-wallet-ui' import { Keyboard } from '@capacitor/keyboard'; import { App } from '@capacitor/app'; +import { SplashScreen } from '@capacitor/splash-screen'; import { isAndroid, isIOs } from "@bitgreen/browser-wallet-utils"; +// Hide the splash (you should do this on app launch) +await SplashScreen.hide(); + const db = new databaseService() const ui = new userInterface() diff --git a/packages/browser-wallet-base/webpack.shared.cjs b/packages/browser-wallet-base/webpack.shared.cjs index a53a709..4c6a2ed 100644 --- a/packages/browser-wallet-base/webpack.shared.cjs +++ b/packages/browser-wallet-base/webpack.shared.cjs @@ -176,6 +176,9 @@ module.exports = ( url: false, }, }, + experiments: { + topLevelAwait: true + }, optimization: {}, watch: mode === 'development', watchOptions: { From 646b83b197ec1b38152733117ffdfd1944946895 Mon Sep 17 00:00:00 2001 From: rappix Date: Fri, 8 Mar 2024 17:45:50 +0100 Subject: [PATCH 38/96] fix: assets command --- packages/browser-wallet-base/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 1114e47..33400cf 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -67,8 +67,8 @@ "scripts": { "setup": "rm -Rf ../../build/platforms/android && rm -Rf ../../build/platforms/ios && cap add android && cap add ios && npm run assets", "assets": "npm run assets:android && npm run assets:ios", - "assets:ios": "npx capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 --splashBackgroundColorDark #224851 --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", - "assets:android": "npx capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 --splashBackgroundColorDark #224851 --android --assetPath src/app-resources --androidProject ../../build/platforms/android", + "assets:ios": "npx capacitor-assets generate --iconBackgroundColor /#224851 --iconBackgroundColorDark /#224851 --splashBackgroundColor /#224851 --splashBackgroundColorDark /#224851 --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", + "assets:android": "npx capacitor-assets generate --iconBackgroundColor /#224851 --iconBackgroundColorDark /#224851 --splashBackgroundColor /#224851 --splashBackgroundColorDark /#224851 --android --assetPath src/app-resources --androidProject ../../build/platforms/android", "icons": "npm run icons:chrome && npm run icons:firefox && npm run icons:macos && npm run icons:ios && npm run icons:safari", "icons:chrome": "node scripts/generate-icons.js --platform chrome", "icons:firefox": "node scripts/generate-icons.js --platform firefox", From 1ef0273fc7ef36645f345cb11d25b9f43dac313f Mon Sep 17 00:00:00 2001 From: rappix Date: Fri, 8 Mar 2024 18:42:29 +0100 Subject: [PATCH 39/96] fix: assets command --- packages/browser-wallet-base/package.json | 8 +++--- .../scripts/generate-assets.sh | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 packages/browser-wallet-base/scripts/generate-assets.sh diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 33400cf..657e1aa 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -67,15 +67,15 @@ "scripts": { "setup": "rm -Rf ../../build/platforms/android && rm -Rf ../../build/platforms/ios && cap add android && cap add ios && npm run assets", "assets": "npm run assets:android && npm run assets:ios", - "assets:ios": "npx capacitor-assets generate --iconBackgroundColor /#224851 --iconBackgroundColorDark /#224851 --splashBackgroundColor /#224851 --splashBackgroundColorDark /#224851 --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", - "assets:android": "npx capacitor-assets generate --iconBackgroundColor /#224851 --iconBackgroundColorDark /#224851 --splashBackgroundColor /#224851 --splashBackgroundColorDark /#224851 --android --assetPath src/app-resources --androidProject ../../build/platforms/android", + "assets:ios": "bash scripts/generate-assets.sh --target=ios", + "assets:android": "bash scripts/generate-assets.sh --target=android", "icons": "npm run icons:chrome && npm run icons:firefox && npm run icons:macos && npm run icons:ios && npm run icons:safari", "icons:chrome": "node scripts/generate-icons.js --platform chrome", "icons:firefox": "node scripts/generate-icons.js --platform firefox", "icons:ios": "node scripts/generate-icons.js --platform ios", "build": "npm run build:android && npm run build:ios", - "build:android": "npm run assets:android && cap build android", - "build:ios": "npm run assets:android && npm run icons:ios && cap build ios", + "build:android": "npm run assets:android && cap sync android", + "build:ios": "npm run assets:ios && npm run icons:ios && cap sync ios", "build:safari": "node scripts/generate-icons.js --platform 'safari' && xcrun safari-web-extension-converter ../../build/tmp/safari --project-location '../../build/platforms/safari' --app-name 'Bitgreen Wallet' --bundle-identifier 'com.bitgreen.extension' --copy-resources --macos-only --force --no-open --no-prompt && node scripts/generate-icons.js --platform 'macos'" } } diff --git a/packages/browser-wallet-base/scripts/generate-assets.sh b/packages/browser-wallet-base/scripts/generate-assets.sh new file mode 100644 index 0000000..542c8cd --- /dev/null +++ b/packages/browser-wallet-base/scripts/generate-assets.sh @@ -0,0 +1,27 @@ +#!/bin/bash +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + --target*) + if [[ $key == "--target="* ]]; then + target="${key#*=}" + else + target="$2" + shift + fi + ;; + *) + echo "Unknown option: $key" + exit 1 + ;; + esac + shift +done + +if [[ "$target" == "ios" ]]; then + path=../../build/platforms/ios/App +else + path=../../build/platforms/${target} +fi + +npx capacitor-assets generate --iconBackgroundColor \#224851 --iconBackgroundColorDark \#224851 --splashBackgroundColor \#224851 --splashBackgroundColorDark \#224851 --${target} --assetPath src/app-resources --${target}Project ${path} \ No newline at end of file From ddc4be15432178100e03a0b4f71dbd892b0c43f0 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Sun, 10 Mar 2024 21:23:29 +0100 Subject: [PATCH 40/96] fixed show footer after login --- packages/browser-wallet-ui/src/screens/index.js | 10 ++++------ packages/browser-wallet-ui/src/screens/signIn.js | 1 - packages/browser-wallet-ui/src/scss/_app.scss | 11 ----------- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index ddb6965..44f3ad8 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -224,10 +224,7 @@ class Screen { } showFooter() { - const current_screen = currentScreen() - if(!logged_in) return false - if(!this.footer_el.classList.contains('visible') && !this.footer_el.classList.contains('disabled')) { anime({ targets: '#main_footer', @@ -238,7 +235,8 @@ class Screen { delay: 400 }); } - + + const current_screen = currentScreen() for(let element of this.footer_el.querySelectorAll('.item')) { element.classList.remove('active') @@ -629,9 +627,9 @@ const reloadScreen = async() => { const current_screen = currentScreen() if(current_screen) { - return await goToScreen(current_screen.name, current_screen.params, false) + return await goToScreen(current_screen.name, current_screen.params, false, true) } else { - return await goToScreen('dashboardScreen') + return await goToScreen('dashboardScreen', {}, false, true) } } diff --git a/packages/browser-wallet-ui/src/screens/signIn.js b/packages/browser-wallet-ui/src/screens/signIn.js index a2ba215..77f052a 100644 --- a/packages/browser-wallet-ui/src/screens/signIn.js +++ b/packages/browser-wallet-ui/src/screens/signIn.js @@ -155,7 +155,6 @@ export default async function signInScreen(params) { }) showProcessingDone() - // window.close() } else { hideProcessing() await showNotification('Password is wrong!', 'error') diff --git a/packages/browser-wallet-ui/src/scss/_app.scss b/packages/browser-wallet-ui/src/scss/_app.scss index dcc7621..db0759e 100644 --- a/packages/browser-wallet-ui/src/scss/_app.scss +++ b/packages/browser-wallet-ui/src/scss/_app.scss @@ -22,19 +22,8 @@ body.app { } #login_screen { - position: absolute !important; width: 100vw; background-color: transparent; - - &:after { - background: linear-gradient(to bottom, #224851, #133948); - content: ""; - height: 100%; - position: fixed; - width: 100%; - top: 0; - z-index: 98; - } } #init_screen { From 324d433d88e42fb73bb01eb0e2a7c8e29f9d1c6d Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Sun, 10 Mar 2024 22:11:40 +0100 Subject: [PATCH 41/96] don't need to set background asset colors --- packages/browser-wallet-base/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 1114e47..2b01409 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -67,8 +67,8 @@ "scripts": { "setup": "rm -Rf ../../build/platforms/android && rm -Rf ../../build/platforms/ios && cap add android && cap add ios && npm run assets", "assets": "npm run assets:android && npm run assets:ios", - "assets:ios": "npx capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 --splashBackgroundColorDark #224851 --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", - "assets:android": "npx capacitor-assets generate --iconBackgroundColor #224851 --iconBackgroundColorDark #224851 --splashBackgroundColor #224851 --splashBackgroundColorDark #224851 --android --assetPath src/app-resources --androidProject ../../build/platforms/android", + "assets:ios": "npx capacitor-assets generate --ios --assetPath src/app-resources --iosProject ../../build/platforms/ios/App", + "assets:android": "npx capacitor-assets generate --android --assetPath src/app-resources --androidProject ../../build/platforms/android", "icons": "npm run icons:chrome && npm run icons:firefox && npm run icons:macos && npm run icons:ios && npm run icons:safari", "icons:chrome": "node scripts/generate-icons.js --platform chrome", "icons:firefox": "node scripts/generate-icons.js --platform firefox", From f551e1e160d578bfd85e679b503a399ba4df2fc9 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Sun, 10 Mar 2024 22:11:55 +0100 Subject: [PATCH 42/96] fixed back button problem --- packages/browser-wallet-ui/src/screens/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index 44f3ad8..9207b83 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -581,7 +581,8 @@ const updateCurrentParams = (params) => { ...active_screen.params, ...params } - screen_history[screen_history.length - 1] = active_screen + let active_screen_index = screen_history.length > 0 ? screen_history.length - 1 : 0 + screen_history[active_screen_index] = active_screen history.replaceState(active_screen, '') } From e8fcad8d783b9c77d6da054ea900e5ad3ab240b1 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Sun, 10 Mar 2024 22:31:00 +0100 Subject: [PATCH 43/96] change build to sync for apps --- packages/browser-wallet-base/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 2b01409..6c4317e 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -74,8 +74,8 @@ "icons:firefox": "node scripts/generate-icons.js --platform firefox", "icons:ios": "node scripts/generate-icons.js --platform ios", "build": "npm run build:android && npm run build:ios", - "build:android": "npm run assets:android && cap build android", - "build:ios": "npm run assets:android && npm run icons:ios && cap build ios", + "build:android": "npm run assets:android && cap sync android", + "build:ios": "npm run assets:android && npm run icons:ios && cap sync ios", "build:safari": "node scripts/generate-icons.js --platform 'safari' && xcrun safari-web-extension-converter ../../build/tmp/safari --project-location '../../build/platforms/safari' --app-name 'Bitgreen Wallet' --bundle-identifier 'com.bitgreen.extension' --copy-resources --macos-only --force --no-open --no-prompt && node scripts/generate-icons.js --platform 'macos'" } } From 2a677cf5f9b8fd1bd48211fa5ba572fb0511cba8 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 09:47:50 +0100 Subject: [PATCH 44/96] use capacitor clipboard --- packages/browser-wallet-ui/src/screens/walletCreate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser-wallet-ui/src/screens/walletCreate.js b/packages/browser-wallet-ui/src/screens/walletCreate.js index 5447270..675f8bb 100644 --- a/packages/browser-wallet-ui/src/screens/walletCreate.js +++ b/packages/browser-wallet-ui/src/screens/walletCreate.js @@ -1,4 +1,4 @@ -import Screen, { expireBrowserTabRequest, goBackScreen, goToScreen, updateCurrentParams } from './index.js' +import Screen, { copyText, expireBrowserTabRequest, goBackScreen, goToScreen, updateCurrentParams } from './index.js' import { WalletStore } from "@bitgreen/browser-wallet-core"; import { showNotification } from "../notifications.js"; import { sendMessage } from "../messaging.js"; @@ -182,7 +182,7 @@ async function regenerateWords(words) { } async function copySeed(mnemonic_array) { - await navigator.clipboard.writeText(mnemonic_array.join(' ')); + await copyText(mnemonic_array.join(' ')); await showNotification('Secret phrase copied to your clipboard! Keep it safe!', 'info') } \ No newline at end of file From c5be6797628f90970e0d61e51b227813ff807acc Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 10:25:12 +0100 Subject: [PATCH 45/96] firefox UI fixes --- packages/browser-wallet-core/src/background/index.js | 3 ++- packages/browser-wallet-ui/src/scss/_dropdown.scss | 2 +- packages/browser-wallet-ui/src/scss/_staking.scss | 2 +- packages/browser-wallet-ui/src/scss/_transactions.scss | 2 +- packages/browser-wallet-ui/src/scss/_wallet-list.scss | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/browser-wallet-core/src/background/index.js b/packages/browser-wallet-core/src/background/index.js index 0457035..1cdc3d5 100644 --- a/packages/browser-wallet-core/src/background/index.js +++ b/packages/browser-wallet-core/src/background/index.js @@ -2,6 +2,7 @@ import Extension from './extension.js' import Tabs from './tabs.js' import { getCurrentBrowser, + isFirefox, isIOs, isIPad, isMacOs, @@ -120,7 +121,7 @@ const showPopup = async(command, params = {}) => { type: 'popup', focused: true, width: 400, - height: 600, + height: isFirefox() ? 650 : 600, // firefox have to add in window title bar left, top }); diff --git a/packages/browser-wallet-ui/src/scss/_dropdown.scss b/packages/browser-wallet-ui/src/scss/_dropdown.scss index 7c7c4b8..b60b060 100644 --- a/packages/browser-wallet-ui/src/scss/_dropdown.scss +++ b/packages/browser-wallet-ui/src/scss/_dropdown.scss @@ -75,7 +75,7 @@ width: 100%; height: 100%; overflow: hidden; - overflow-y: scroll; + overflow-y: auto; padding-right: 8px; } .custom-dropdown-item { diff --git a/packages/browser-wallet-ui/src/scss/_staking.scss b/packages/browser-wallet-ui/src/scss/_staking.scss index 594f022..4382ca9 100644 --- a/packages/browser-wallet-ui/src/scss/_staking.scss +++ b/packages/browser-wallet-ui/src/scss/_staking.scss @@ -173,7 +173,7 @@ .collator-list { height: calc(100% - 106px); overflow: hidden; - overflow-y: scroll; + overflow-y: auto; padding-right: 8px; padding-bottom: 8px; diff --git a/packages/browser-wallet-ui/src/scss/_transactions.scss b/packages/browser-wallet-ui/src/scss/_transactions.scss index 207699c..7242c84 100644 --- a/packages/browser-wallet-ui/src/scss/_transactions.scss +++ b/packages/browser-wallet-ui/src/scss/_transactions.scss @@ -2,7 +2,7 @@ min-height: 300px; height: calc(100% - 5px); overflow: hidden; - overflow-y: scroll; + overflow-y: auto; padding-right: 8px; padding-bottom: 8px; scroll-behavior: smooth; diff --git a/packages/browser-wallet-ui/src/scss/_wallet-list.scss b/packages/browser-wallet-ui/src/scss/_wallet-list.scss index 500782d..650143b 100644 --- a/packages/browser-wallet-ui/src/scss/_wallet-list.scss +++ b/packages/browser-wallet-ui/src/scss/_wallet-list.scss @@ -1,6 +1,6 @@ #wallet_list { height: 100%; - overflow-y: scroll; + overflow-y: auto; padding-right: 8px; padding-bottom: 8px; From e9d0cc3e75f6bc70f3214563b99bed46343f1d41 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 13:08:11 +0100 Subject: [PATCH 46/96] use capacitor preferences api for apps --- package-lock.json | 16 ++ packages/browser-wallet-base/package.json | 1 + packages/browser-wallet-base/src/app.js | 2 +- packages/browser-wallet-base/src/extension.js | 2 +- .../src/background/extension.js | 34 +-- .../src/background/index.js | 2 +- packages/browser-wallet-core/src/cache.js | 12 +- .../browser-wallet-core/src/polkadotApi.js | 2 +- .../src/services/databaseService.js | 3 +- .../browser-wallet-core/src/stores/account.js | 77 +++---- .../browser-wallet-core/src/stores/asset.js | 38 ++-- .../browser-wallet-core/src/stores/base.js | 201 +++++++----------- .../browser-wallet-core/src/stores/cache.js | 2 +- .../browser-wallet-core/src/stores/index.js | 2 - .../browser-wallet-core/src/stores/network.js | 18 +- .../browser-wallet-core/src/stores/session.js | 114 ---------- .../src/stores/settings.js | 2 +- .../browser-wallet-core/src/stores/token.js | 38 ++-- .../src/stores/transaction.js | 6 +- .../browser-wallet-core/src/stores/wallet.js | 4 +- packages/browser-wallet-ui/src/index.js | 2 +- .../src/screens/accountEdit.js | 6 +- .../src/screens/accountManage.js | 4 +- .../src/screens/assetTransactionReview.js | 2 +- .../src/screens/extrinsicSend.js | 2 +- .../browser-wallet-ui/src/screens/index.js | 8 +- .../src/screens/kycAccredited.js | 2 +- .../src/screens/kycAdvanced.js | 2 +- .../browser-wallet-ui/src/screens/kycBasic.js | 2 +- .../browser-wallet-ui/src/screens/kycStart.js | 2 +- .../src/screens/networkCreate.js | 2 +- .../src/screens/networkManage.js | 3 +- .../browser-wallet-ui/src/screens/settings.js | 2 +- .../src/screens/stakingCollator.js | 2 +- .../src/screens/stakingCollators.js | 2 +- .../src/screens/stakingHome.js | 2 +- .../src/screens/stakingIntro.js | 2 +- .../src/screens/transactionDetails.js | 2 +- .../src/screens/walletPassword.js | 2 +- 39 files changed, 220 insertions(+), 407 deletions(-) delete mode 100644 packages/browser-wallet-core/src/stores/session.js diff --git a/package-lock.json b/package-lock.json index 5793051..d6b3bf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -300,6 +300,14 @@ "@capacitor/core": "^5.0.0" } }, + "node_modules/@capacitor/preferences": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/preferences/-/preferences-5.0.7.tgz", + "integrity": "sha512-JvfGP1m8nITWEFdBpKR9HXNeBjLKwO0q1pry7Z5lYrYmCrbyRBLWzaGZGll8py4KmGWL3F5+PZvhrpT4gPoeAQ==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, "node_modules/@capacitor/splash-screen": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-5.0.7.tgz", @@ -12201,6 +12209,7 @@ "@capacitor/core": "^5.7.0", "@capacitor/ios": "^5.7.0", "@capacitor/keyboard": "^5.0.8", + "@capacitor/preferences": "^5.0.7", "@capacitor/splash-screen": "^5.0.7", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", @@ -12725,6 +12734,7 @@ "@capacitor/core": "^5.7.0", "@capacitor/ios": "^5.7.0", "@capacitor/keyboard": "^5.0.8", + "@capacitor/preferences": "^5.0.7", "@capacitor/splash-screen": "^5.0.7", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", @@ -13263,6 +13273,12 @@ "integrity": "sha512-XYyBzGlzjgLPqyPVdu5McGLYV6+G2efVR4I3l5cF1B27M6U/oFqv9CQU74WNG08nee28bfccboNpv6eWCLYn1A==", "requires": {} }, + "@capacitor/preferences": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@capacitor/preferences/-/preferences-5.0.7.tgz", + "integrity": "sha512-JvfGP1m8nITWEFdBpKR9HXNeBjLKwO0q1pry7Z5lYrYmCrbyRBLWzaGZGll8py4KmGWL3F5+PZvhrpT4gPoeAQ==", + "requires": {} + }, "@capacitor/splash-screen": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-5.0.7.tgz", diff --git a/packages/browser-wallet-base/package.json b/packages/browser-wallet-base/package.json index 6c4317e..2db8f0b 100644 --- a/packages/browser-wallet-base/package.json +++ b/packages/browser-wallet-base/package.json @@ -33,6 +33,7 @@ "@capacitor/ios": "^5.7.0", "@capacitor/keyboard": "^5.0.8", "@capacitor/splash-screen": "^5.0.7", + "@capacitor/preferences": "^5.0.7", "@polkadot/api": "^9.7.1", "@polkadot/keyring": "^10.1.11", "@polkadot/types": "^9.7.1", diff --git a/packages/browser-wallet-base/src/app.js b/packages/browser-wallet-base/src/app.js index 49cb35f..5ac7a78 100644 --- a/packages/browser-wallet-base/src/app.js +++ b/packages/browser-wallet-base/src/app.js @@ -19,7 +19,7 @@ async function extension() { // Break if there is no wallet created/imported, and return to welcome screen. if(!await db.stores.wallets.exists()) { - if(await db.stores.settings.asyncGet('skip_intro')) { + if(await db.stores.settings.get('skip_intro')) { return await ui.goToScreen('walletScreen') } else { return await ui.goToScreen('welcomeScreen') diff --git a/packages/browser-wallet-base/src/extension.js b/packages/browser-wallet-base/src/extension.js index 07ddf05..1895d63 100644 --- a/packages/browser-wallet-base/src/extension.js +++ b/packages/browser-wallet-base/src/extension.js @@ -34,7 +34,7 @@ const extension = async() => { // Break if there is no wallet created/imported, and return to welcome screen. if(!await db.stores.wallets.exists()) { - if(await db.stores.settings.asyncGet('skip_intro')) { + if(await db.stores.settings.get('skip_intro')) { if(!params.has('popup')) { await showNotification('You need a wallet to perform this action. Please create or import one.', 'alert', 2000) } diff --git a/packages/browser-wallet-core/src/background/extension.js b/packages/browser-wallet-core/src/background/extension.js index 4366f75..739efd8 100644 --- a/packages/browser-wallet-core/src/background/extension.js +++ b/packages/browser-wallet-core/src/background/extension.js @@ -158,11 +158,11 @@ class Extension { } const encrypted_data = await this.encryptWallet(mnemonic, password) - await this.wallets_store.asyncSet('main', encrypted_data) + await this.wallets_store.set('main', encrypted_data) // create main account & set as default await this.createAccount(name, mnemonic, 'main') - await this.accounts_store.asyncSet('current', 'main') + await this.accounts_store.set('current', 'main') // import accounts with balance > 0 this.importAccountsWithBalance(mnemonic, password).then() @@ -206,7 +206,7 @@ class Extension { return { error: 'Invalid derivation path.' } } - const account_exist = await this.accounts_store.asyncGet(derivation_path) + const account_exist = await this.accounts_store.get(derivation_path) if(account_exist) { return { error: 'Account already exists.' } } @@ -218,7 +218,7 @@ class Extension { if(mnemonic) { const response = this.createAccount(name, mnemonic, derivation_path) - if(response) await this.accounts_store.asyncSet('current', derivation_path) + if(response) await this.accounts_store.set('current', derivation_path) return response } @@ -235,13 +235,13 @@ class Extension { network_id = await this.networks_store.nextId() } - await this.networks_store.asyncSet(network_id, { + await this.networks_store.set(network_id, { name: network_name, url: network_url }) if(switch_network) { - await this.networks_store.asyncSet('current', network_id) + await this.networks_store.set('current', network_id) await polkadotApi(true) // reload polkadot API } } @@ -249,7 +249,7 @@ class Extension { async changeNetwork(params) { const network_id = params?.network_id - await this.networks_store.asyncSet('current', network_id) + await this.networks_store.set('current', network_id) await polkadotApi(true) // reload polkadot API } @@ -404,10 +404,10 @@ class Extension { async getTransactions() { await this.initTransactionsStore() - await this.transactions_store.asyncRemoveAll() + await this.transactions_store.removeAll() await this.transactions_store.fetch() - let transactions = await this.transactions_store.asyncAll() + let transactions = await this.transactions_store.all() // Sort by date by default transactions.sort((a, b) => { @@ -427,10 +427,10 @@ class Extension { async getAssetTransactions() { await this.initAssetsStore() - await this.assets_store.asyncRemoveAll() + await this.assets_store.removeAll() await this.assets_store.fetch() - let assets = await this.assets_store.asyncAll() + let assets = await this.assets_store.all() // Sort by date by default assets.sort((a, b) => { @@ -450,10 +450,10 @@ class Extension { async getTokenTransactions() { await this.initTokensStore() - await this.tokens_store.asyncRemoveAll() + await this.tokens_store.removeAll() await this.tokens_store.fetch() - let tokens = await this.tokens_store.asyncAll() + let tokens = await this.tokens_store.all() // Sort by date by default tokens.sort((a, b) => { @@ -564,7 +564,7 @@ class Extension { return false; } - const wallet_data = await this.wallets_store.asyncGet('main') + const wallet_data = await this.wallets_store.get('main') if(!wallet_data) { return false; } @@ -655,7 +655,7 @@ class Extension { name: '' }, 'sr25519'); - await this.accounts_store.asyncSet(account_id, { + await this.accounts_store.set(account_id, { "address": keypair.address, "name": name }) @@ -674,7 +674,7 @@ class Extension { return false } - const account = await this.accounts_store.asyncGet(account_id) + const account = await this.accounts_store.get(account_id) if(account_id !== 'main' && account_id && (account || temp_load)) { mnemonic += '//' + account_id } @@ -937,7 +937,7 @@ class Extension { async changeSetting(params) { for(const [key, value] of Object.entries(params)) { - await this.settings_store.asyncSet(key, value) + await this.settings_store.set(key, value) } } diff --git a/packages/browser-wallet-core/src/background/index.js b/packages/browser-wallet-core/src/background/index.js index 1cdc3d5..5b7b1e1 100644 --- a/packages/browser-wallet-core/src/background/index.js +++ b/packages/browser-wallet-core/src/background/index.js @@ -79,7 +79,7 @@ const showPopup = async(command, params = {}) => { ...params }).toString(); - if(isSafari() && isMacOs()) { + if(isSafari() && isMacOs()) { // safari extension on desktop only const response = await current_browser.windows.create({ url: url, type: 'popup', diff --git a/packages/browser-wallet-core/src/cache.js b/packages/browser-wallet-core/src/cache.js index 841ab14..a86b271 100644 --- a/packages/browser-wallet-core/src/cache.js +++ b/packages/browser-wallet-core/src/cache.js @@ -1,6 +1,6 @@ const getChainMetaData = async (polkadot_api, db) => { const now = new Date().getTime() - const last_fetch = await db.stores.cache.asyncGet('last_fetch_metadata') || 0 + const last_fetch = await db.stores.cache.get('last_fetch_metadata') || 0 // One call per 24h if(now < (last_fetch + 1000 * 60 * 60 * 24)) return false @@ -30,7 +30,7 @@ const getChainMetaData = async (polkadot_api, db) => { const getInflationAmount = async(polkadot_api, db) => { const now = new Date().getTime() - const last_fetch = await db.stores.cache.asyncGet('last_fetch_inflation') || 0 + const last_fetch = await db.stores.cache.get('last_fetch_inflation') || 0 // One call per 12 hours if(now < (last_fetch + 1000 * 60 * 60 * 12)) return false @@ -46,12 +46,12 @@ const getKycAddresses = async(polkadot_api, db) => { const now = new Date().getTime() - const last_fetch = await db.stores.cache.asyncGet('last_fetch_kyc') || 0 + const last_fetch = await db.stores.cache.get('last_fetch_kyc') || 0 // One call per 10 minutes if(now < (last_fetch + 1000 * 60 * 10)) return false - const all_accounts = await db.stores.accounts.asyncAll() + const all_accounts = await db.stores.accounts.all() for(const account of all_accounts) { try { @@ -63,10 +63,10 @@ const getKycAddresses = async(polkadot_api, db) => { if(kycLevel) { db.stores.cache.set('kyc_' + account.value.address, kycLevel); } else { - db.stores.cache.remove('kyc_' + account.value.address) + db.stores.cache.remove('kyc_' + account.value.address); } } catch { - db.stores.cache.remove('kyc_' + account.value.address) + db.stores.cache.remove('kyc_' + account.value.address); } } diff --git a/packages/browser-wallet-core/src/polkadotApi.js b/packages/browser-wallet-core/src/polkadotApi.js index 2aa1dbc..53d7144 100644 --- a/packages/browser-wallet-core/src/polkadotApi.js +++ b/packages/browser-wallet-core/src/polkadotApi.js @@ -317,7 +317,7 @@ const initPolkadotApi = async(force = false) => { console.warn('Polkadot WS provider error: ', e) if (current_network.id !== 'mainnet' && current_network.id !== 'testnet') { - await networks_store.asyncSet('current', 'mainnet') // reset to mainnet + await networks_store.set('current', 'mainnet') // reset to mainnet } resolve(api) diff --git a/packages/browser-wallet-core/src/services/databaseService.js b/packages/browser-wallet-core/src/services/databaseService.js index 8813335..4363b9a 100644 --- a/packages/browser-wallet-core/src/services/databaseService.js +++ b/packages/browser-wallet-core/src/services/databaseService.js @@ -1,4 +1,4 @@ -import { AccountStore, SessionStore, SettingsStore, CacheStore, WalletStore } from '../stores/index.js' +import { AccountStore, SettingsStore, CacheStore, WalletStore } from '../stores/index.js' import NetworkStore from "../stores/network.js"; class DatabaseService { @@ -15,7 +15,6 @@ class DatabaseService { this.stores = { accounts: new AccountStore(), - session: new SessionStore(), settings: new SettingsStore(), wallets: new WalletStore(), networks: networks_store, diff --git a/packages/browser-wallet-core/src/stores/account.js b/packages/browser-wallet-core/src/stores/account.js index b85e01e..97f02be 100644 --- a/packages/browser-wallet-core/src/stores/account.js +++ b/packages/browser-wallet-core/src/stores/account.js @@ -5,42 +5,22 @@ class AccountStore extends BaseStore { super('account'); } - getByAddress(address, update) { - if(!address) return update(null) - - this.asyncAll().then(all_accounts => { - for(const account of all_accounts) { - if(account.value.address.toLowerCase() === address.toString().toLowerCase()) { - update(this.asyncGet(account.key)) - } - } - - update(null) - }) - } - - async asyncGetByAddress(address) { - return new Promise((resolve) => { - this.getByAddress(address, resolve); - }); - } - async exists() { - return await this.asyncTotal() > 0 + return await this.total() > 0 } async current() { if(!await this.exists()) return false - let current_id = await this.asyncGet('current') - let account = await this.asyncGet(current_id) + let current_id = await this.get('current') + let account = await this.get(current_id) if(!current_id || !account) { current_id = 'main' - await this.asyncSet('current', current_id) + await this.set('current', current_id) } - account = await this.asyncGet(current_id) + account = await this.get(current_id) return { id: current_id, @@ -50,43 +30,36 @@ class AccountStore extends BaseStore { } } - all(update, exclude = []) { - this.allMap((map) => { - let items = [] + async all(exclude = ['current']) { + let map = await this.allMap() + let items = [] - for(const [key, value] of Object.entries(map)) { - if(!exclude.includes(key)) items.push({key, value}) - } + for(const [key, value] of Object.entries(map)) { + if(!exclude.includes(key)) items.push({key, value}) + } - // Sort accounts by key. Keep 'main' at the top. - items.sort((a, b) => { - if(a.key === 'main') { + // Sort accounts by key. Keep 'main' at the top. + items.sort((a, b) => { + if(a.key === 'main') { + return -1 + } else { + if(parseInt(a.key) < parseInt(b.key)) { return -1 - } else { - if(parseInt(a.key) < parseInt(b.key)) { - return -1 - } - - if(parseInt(a.key) > parseInt(b.key)) { - return 1 - } } - return 0 - }) + if(parseInt(a.key) > parseInt(b.key)) { + return 1 + } + } + return + }) - update(items) - }); - } - async asyncAll() { - return new Promise((resolve) => { - this.all(resolve, ['current']); - }); + return items } async nextId() { let next_id = 0 - for(const account of await this.asyncAll()) { + for(const account of await this.all()) { if(parseInt(account?.key) >= next_id) { next_id = parseInt(account?.key) + 1 } diff --git a/packages/browser-wallet-core/src/stores/asset.js b/packages/browser-wallet-core/src/stores/asset.js index 1284b0e..c7b3abd 100644 --- a/packages/browser-wallet-core/src/stores/asset.js +++ b/packages/browser-wallet-core/src/stores/asset.js @@ -2,33 +2,33 @@ import BaseStore from "./base.js"; class AssetStore extends BaseStore { constructor(network, account) { - const network_name = network.name - .toLowerCase() - .trim() - .replace(/[^\w\s-]/g, '') - .replace(/[\s_-]+/g, '_') - .replace(/^-+|-+$/g, '') + const network_name = network.name + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '_') + .replace(/^-+|-+$/g, '') - super('asset_' + network_name + '_' + account.address) + super('asset_' + network_name + '_' + account.address) - this.network = network - this.account = account + this.network = network + this.account = account } async fetch() { - if(!['mainnet', 'testnet'].includes(this.network.id)) return false; + if(!['mainnet', 'testnet'].includes(this.network.id)) return false - const url = this.network.api_endpoint + '/asset/transactions?account=' + this.account.address + '&pageSize=10&page=1'; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = this.network.api_endpoint + '/asset/transactions?account=' + this.account.address + '&pageSize=10&page=1'; + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - for(const asset of result.transactions) { - await this.asyncSet(asset.id, asset) - } + for(const asset of result.transactions) { + await this.set(asset.id, asset) + } - return result + return result } } diff --git a/packages/browser-wallet-core/src/stores/base.js b/packages/browser-wallet-core/src/stores/base.js index 04afbef..4f4ab17 100644 --- a/packages/browser-wallet-core/src/stores/base.js +++ b/packages/browser-wallet-core/src/stores/base.js @@ -1,11 +1,7 @@ -import { - customReviver, - getCurrentBrowser, - isStandaloneApp -} from "@bitgreen/browser-wallet-utils"; -import BigNumber from "bignumber.js"; +import { customReviver, getCurrentBrowser, isStandaloneApp } from '@bitgreen/browser-wallet-utils'; +import { Preferences } from '@capacitor/preferences'; -const current_browser = getCurrentBrowser() +const current_browser = getCurrentBrowser(); class BaseStore { #prefix = ''; @@ -14,154 +10,99 @@ class BaseStore { this.#prefix = prefix ? `${prefix}:` : ''; } - get(_key, update) { - if(!_key) return update(null) - - const key = `${this.#prefix}${_key.toString().toLowerCase()}`; - - if(isStandaloneApp()) { - let value - - try { - value = JSON.parse(localStorage.getItem(key), customReviver) - } catch (e) { - value = localStorage.getItem(key) - } - - update(value) - } else { - current_browser.storage.local.get([key], (result) => { + async get(key) { + let value; + if(key) { + key = `${this.#prefix}${key.toString().toLowerCase()}`; + if(isStandaloneApp()) { + value = await Preferences.get({key}); + if(value) { + try { + value = JSON.parse(value.value, customReviver); + } catch(e){} + } + } else { + value = await current_browser.storage.local.get([key]); lastError('get'); - - update(result[key]); - }); + try { + value = value[key]; + } catch(e){} + } } - } - async asyncGet(_key) { - return new Promise((resolve) => { - this.get(_key, resolve); - }); + return value; } - remove(_key, update) { - const key = `${this.#prefix}${_key.toString().toLowerCase()}`; - + async remove(key) { + key = `${this.#prefix}${key.toString().toLowerCase()}`; if(isStandaloneApp()) { - localStorage.removeItem(key); - - update && update() + return Preferences.remove({key}); } else { - current_browser.storage.local.remove(key, () => { - lastError('remove'); - - update && update(); - }); + await current_browser.storage.local.remove(key); + lastError('remove'); } } - set(_key, value, update) { - const key = `${this.#prefix}${_key.toString().toLowerCase()}`; + async removeAll() { + for(const record of await this.all()) { + this.remove(record.key) + } + } + async set(key, value) { + key = `${this.#prefix}${key.toString().toLowerCase()}`; if(isStandaloneApp()) { - localStorage.setItem(key, JSON.stringify(value)); - - update && update(); + return Preferences.set({ + key, + value: JSON.stringify(value) + }) } else { - current_browser.storage.local.set({ [key]: value }, () => { - lastError('set'); - - update && update(); - }); + await current_browser.storage.local.set({ [key]: value }); + lastError('set'); } } - async asyncSet(_key, value) { - return new Promise((resolve) => { - this.set(_key, value, resolve); - }); - } - - all(update, exclude = []) { - this.allMap((map) => { - let items = [] + async all(exclude = []) { + let map = await this.allMap() + let items = [] - for(const [key, value] of Object.entries(map)) { - if(!exclude.includes(key)) items.push({key, value}) - } - - update(items) - }); - } + for(const [key, value] of Object.entries(map)) { + if(!exclude.includes(key)) items.push({key, value}); + } - async asyncAll() { - return new Promise((resolve) => { - this.all(resolve); - }); + return items; } - allMap(update) { + async allMap() { + let keys; if(isStandaloneApp()) { - const map = {}; - - for(let i = 0; i < localStorage.length; i++) { - const key = localStorage.key(i); - let value - - try { - value = JSON.parse(localStorage.getItem(key), customReviver) - } catch (e) { - value = localStorage.getItem(key) - } - - if(key.startsWith(this.#prefix)) { - map[key.replace(this.#prefix, '')] = value; - } - } - - update(map); + keys = await Preferences.keys(); + keys = keys.keys; } else { - current_browser.storage.local.get(null, (result) => { - lastError('all'); - - const entries = Object.entries(result); - const map = {}; - - for(let i = 0; i < entries.length; i++) { - const [key, value] = entries[i]; - - if(key.startsWith(this.#prefix)) { - map[key.replace(this.#prefix, '')] = value; - } - } - - update(map); - }); + keys = await current_browser.storage.local.get(); + lastError('all'); + try { + keys = Object.keys(keys); + } catch(e){} } - } - - async asyncAllMap() { - return new Promise((resolve) => { - this.allMap(resolve); - }); - } - - async asyncRemoveAll() { - for(const record of await this.asyncAll()) { - this.remove(record.key) + let map = {}; + + if(keys) { + for(const key of keys) { + if(this.#prefix && key.startsWith(this.#prefix)) { + let _key = key.replace(this.#prefix, ''); + let value = await this.get(_key); + map[_key] = value; + } + } } + + return map; } - total(update) { - this.allMap((map) => { - update(Object.keys(map).length) - }); - } - - async asyncTotal() { - return new Promise((resolve) => { - this.total(resolve); - }); + async total() { + let map = await this.allMap(); + return Object.keys(map).length } } @@ -171,6 +112,6 @@ const lastError = (type) => { if(error) { console.error(`BaseStore.${type}:: runtime.lastError:`, error); } -}; +} export default BaseStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/cache.js b/packages/browser-wallet-core/src/stores/cache.js index 10f5963..607c3b3 100644 --- a/packages/browser-wallet-core/src/stores/cache.js +++ b/packages/browser-wallet-core/src/stores/cache.js @@ -12,7 +12,7 @@ class CacheStore extends BaseStore { .replace(/^-+|-+$/g, '') } - super('cache_' + network_name); + super('cache_' + network_name) this.network = network } diff --git a/packages/browser-wallet-core/src/stores/index.js b/packages/browser-wallet-core/src/stores/index.js index c765876..8359294 100644 --- a/packages/browser-wallet-core/src/stores/index.js +++ b/packages/browser-wallet-core/src/stores/index.js @@ -2,9 +2,7 @@ export { default as AccountStore } from './account.js'; export { default as SettingsStore } from './settings.js'; export { default as NetworkStore } from './network.js'; export { default as WalletStore } from './wallet.js'; -export { default as SessionStore } from './session.js'; export { default as TransactionStore } from './transaction.js'; export { default as AssetStore } from './asset.js'; export { default as TokenStore } from './token.js'; export { default as CacheStore } from './cache.js'; - diff --git a/packages/browser-wallet-core/src/stores/network.js b/packages/browser-wallet-core/src/stores/network.js index 7cc787a..78ed200 100644 --- a/packages/browser-wallet-core/src/stores/network.js +++ b/packages/browser-wallet-core/src/stores/network.js @@ -6,16 +6,16 @@ class NetworkStore extends BaseStore { } async exists() { - return await this.asyncTotal() > 0 + return await this.total() > 0 } async current() { - let current_id = await this.asyncGet('current') + let current_id = await this.get('current') let network if(!current_id) { current_id = 'mainnet' - await this.asyncSet('current', current_id) + await this.set('current', current_id) } if(current_id === 'mainnet') { @@ -31,12 +31,12 @@ class NetworkStore extends BaseStore { api_endpoint: 'https://api-testnet.bitgreen.org' } } else { - network = await this.asyncGet(current_id) + network = await this.get(current_id) } if(!network) { current_id = 'mainnet' - await this.asyncSet('current', current_id) + await this.set('current', current_id) } return { @@ -47,15 +47,13 @@ class NetworkStore extends BaseStore { } } - async asyncAll() { - return new Promise((resolve) => { - this.all(resolve, ['current']); - }); + async all() { + return super.all(['current']) } async nextId() { let next_id = 1 - for(const network of await this.asyncAll()) { + for(const network of await this.all()) { if(parseInt(network?.key) >= next_id) { next_id = parseInt(network?.key) + 1 } diff --git a/packages/browser-wallet-core/src/stores/session.js b/packages/browser-wallet-core/src/stores/session.js deleted file mode 100644 index bd1c7a2..0000000 --- a/packages/browser-wallet-core/src/stores/session.js +++ /dev/null @@ -1,114 +0,0 @@ -import BaseStore from "./base.js"; -import { - customReviver, - getCurrentBrowser, - isStandaloneApp -} from "@bitgreen/browser-wallet-utils"; - -const current_browser = getCurrentBrowser() - -class SessionStore extends BaseStore { - constructor() { - super(''); - } - - get(_key, update) { - const key = `${_key}`; - - if(isStandaloneApp()) { - let value - - try { - value = JSON.parse(sessionStorage.getItem(key), customReviver) - } catch (e) { - value = sessionStorage.getItem(key) - } - - update(value) - } else { - current_browser.storage.session.get([key], (result) => { - lastError('get'); - - update(result[key]); - }); - } - } - - remove(_key, update) { - const key = `${_key}`; - - if(isStandaloneApp()) { - sessionStorage.removeItem(key); - - update && update() - } else { - current_browser.storage.session.remove(key, () => { - lastError('remove'); - - update && update(); - }); - } - } - - set(_key, value, update) { - const key = `${_key}`; - - if(isStandaloneApp()) { - sessionStorage.setItem(key, JSON.stringify(value)); - - update && update(); - } else { - current_browser.storage.session.set({ [key]: value }, () => { - lastError('set'); - - update && update(); - }); - } - } - - allMap(update) { - if(isStandaloneApp()) { - const map = {}; - - for(let i = 0; i < sessionStorage.length; i++) { - const key = sessionStorage.key(i); - let value - - try { - value = JSON.parse(localStorage.getItem(key), customReviver) - } catch (e) { - value = localStorage.getItem(key) - } - - map[key] = value; - } - - update(map); - } else { - current_browser.storage.session.get(null, (result) => { - lastError('all'); - - const entries = Object.entries(result); - const map = {}; - - for(let i = 0; i < entries.length; i++) { - const [key, value] = entries[i]; - - map[key] = value; - } - - update(map); - }); - } - } -} - -const lastError = (type) => { - const error = current_browser.runtime.lastError; - - if(error) { - console.error(`SessionStore.${type}:: runtime.lastError:`, error); - } -}; - -export default SessionStore \ No newline at end of file diff --git a/packages/browser-wallet-core/src/stores/settings.js b/packages/browser-wallet-core/src/stores/settings.js index 896039b..2e16a13 100644 --- a/packages/browser-wallet-core/src/stores/settings.js +++ b/packages/browser-wallet-core/src/stores/settings.js @@ -2,7 +2,7 @@ import BaseStore from "./base.js"; class SettingsStore extends BaseStore { constructor() { - super('settings'); + super('settings') } } diff --git a/packages/browser-wallet-core/src/stores/token.js b/packages/browser-wallet-core/src/stores/token.js index 9d5ec7f..a2507fe 100644 --- a/packages/browser-wallet-core/src/stores/token.js +++ b/packages/browser-wallet-core/src/stores/token.js @@ -2,33 +2,33 @@ import BaseStore from "./base.js"; class TokenStore extends BaseStore { constructor(network, account) { - const network_name = network.name - .toLowerCase() - .trim() - .replace(/[^\w\s-]/g, '') - .replace(/[\s_-]+/g, '_') - .replace(/^-+|-+$/g, '') + const network_name = network.name + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '_') + .replace(/^-+|-+$/g, '') - super('token_' + network_name + '_' + account.address) + super('token_' + network_name + '_' + account.address) - this.network = network - this.account = account + this.network = network + this.account = account } async fetch() { - if(!['mainnet', 'testnet'].includes(this.network.id)) return false; + if(!['mainnet', 'testnet'].includes(this.network.id)) return false - const url = this.network.api_endpoint + '/token/transactions?account=' + this.account.address + '&pageSize=10&page=1'; - let result = await fetch(url, { - mode: 'cors' - }) - result = await result.json() + const url = this.network.api_endpoint + '/token/transactions?account=' + this.account.address + '&pageSize=10&page=1' + let result = await fetch(url, { + mode: 'cors' + }) + result = await result.json() - for(const token of result) { - await this.asyncSet(token.id, token) - } + for(const token of result) { + await this.set(token.id, token) + } - return result + return result } } diff --git a/packages/browser-wallet-core/src/stores/transaction.js b/packages/browser-wallet-core/src/stores/transaction.js index 68061e7..aeffccc 100644 --- a/packages/browser-wallet-core/src/stores/transaction.js +++ b/packages/browser-wallet-core/src/stores/transaction.js @@ -16,10 +16,10 @@ class TransactionStore extends BaseStore { } async fetch() { - if(!['mainnet', 'testnet'].includes(this.network.id)) return false; + if(!['mainnet', 'testnet'].includes(this.network.id)) return false const date = new Date(); - const date_end = date.toISOString().slice(0, 19).replace('T', '+'); + const date_end = date.toISOString().slice(0, 19).replace('T', '+') const url = this.network.api_endpoint + '/transactions?account=' + this.account.address; let result = await fetch(url, { mode: 'cors' @@ -27,7 +27,7 @@ class TransactionStore extends BaseStore { result = await result.json() for(const transaction of result.transactions) { - await this.asyncSet(transaction.hash, transaction) + await this.set(transaction.hash, transaction) } return result diff --git a/packages/browser-wallet-core/src/stores/wallet.js b/packages/browser-wallet-core/src/stores/wallet.js index 6f4f1cb..f42a58f 100644 --- a/packages/browser-wallet-core/src/stores/wallet.js +++ b/packages/browser-wallet-core/src/stores/wallet.js @@ -2,11 +2,11 @@ import BaseStore from "./base.js"; class WalletStore extends BaseStore { constructor() { - super('wallet'); + super('wallet') } async exists() { - return await this.asyncTotal() > 0 + return await this.total() > 0 } } diff --git a/packages/browser-wallet-ui/src/index.js b/packages/browser-wallet-ui/src/index.js index 196cd80..dce2ea5 100644 --- a/packages/browser-wallet-ui/src/index.js +++ b/packages/browser-wallet-ui/src/index.js @@ -114,7 +114,7 @@ class userInterface { initAccounts = async() => { const current_account = await this.db.stores.accounts.current() - const kyc_level = await this.db.stores.cache.asyncGet('kyc_' + current_account.address) + const kyc_level = await this.db.stores.cache.get('kyc_' + current_account.address) await updateElement('#accounts_modal', 'accounts/modal', { current_account_name: (current_account?.name && current_account?.name?.length > 14) ? current_account?.name?.substring(0,14)+'...' : current_account?.name, diff --git a/packages/browser-wallet-ui/src/screens/accountEdit.js b/packages/browser-wallet-ui/src/screens/accountEdit.js index c990a41..c953da7 100644 --- a/packages/browser-wallet-ui/src/screens/accountEdit.js +++ b/packages/browser-wallet-ui/src/screens/accountEdit.js @@ -24,14 +24,14 @@ export default async function accountEditScreen(params) { const networks_store = new NetworkStore() const cache_store = new CacheStore(await networks_store.current()) - const account = await accounts_store.asyncGet(account_id) + const account = await accounts_store.get(account_id) await screen.set('#heading', 'accounts/edit/heading', { account_name: account?.name, current_account_address: formatAddress(account?.address, 16, 8) }) - const kyc_level = await cache_store.asyncGet('kyc_' + account.address) + const kyc_level = await cache_store.get('kyc_' + account.address) await screen.set('#bordered_content', 'accounts/edit/content', { account_id, @@ -107,7 +107,7 @@ export default async function accountEditScreen(params) { const name = DOMPurify.sanitize(document.querySelector("#root #wallet_name").value) const switch_account = switch_account_el?.checked === true - await accounts_store.asyncSet(id, { + await accounts_store.set(id, { ...account, name }) diff --git a/packages/browser-wallet-ui/src/screens/accountManage.js b/packages/browser-wallet-ui/src/screens/accountManage.js index 23d9824..2cdbf2a 100644 --- a/packages/browser-wallet-ui/src/screens/accountManage.js +++ b/packages/browser-wallet-ui/src/screens/accountManage.js @@ -20,12 +20,12 @@ export default async function accountManageScreen() { const networks_store = new NetworkStore() const cache_store = new CacheStore(await networks_store.current()) const current_account = await accounts_store.current() - const all_accounts = await accounts_store.asyncAll() + const all_accounts = await accounts_store.all() for(const a of all_accounts) { const account_id = a?.key const account = a.value - const kyc_level = await cache_store.asyncGet('kyc_' + account.address) + const kyc_level = await cache_store.get('kyc_' + account.address) await screen.append('#root #wallet_list', 'accounts/manage/list_item', { account_id, diff --git a/packages/browser-wallet-ui/src/screens/assetTransactionReview.js b/packages/browser-wallet-ui/src/screens/assetTransactionReview.js index 544d1c3..562a96a 100644 --- a/packages/browser-wallet-ui/src/screens/assetTransactionReview.js +++ b/packages/browser-wallet-ui/src/screens/assetTransactionReview.js @@ -24,7 +24,7 @@ export default async function assetTransactionReviewScreen(params) { await screen.init() const accounts_store = new AccountStore() - const account = await accounts_store.asyncGet(params?.account_id) + const account = await accounts_store.get(params?.account_id) const recipient = params?.recipient const asset_amount = params?.amount diff --git a/packages/browser-wallet-ui/src/screens/extrinsicSend.js b/packages/browser-wallet-ui/src/screens/extrinsicSend.js index 9dfeef4..e6c0b53 100644 --- a/packages/browser-wallet-ui/src/screens/extrinsicSend.js +++ b/packages/browser-wallet-ui/src/screens/extrinsicSend.js @@ -71,7 +71,7 @@ export default async function extrinsicSendScreen(params) { // Show all extrinsics for(const extrinsic of extrinsics) { - const docs = await cache_store.asyncGet(`docs_${extrinsic.pallet}:${extrinsic.call}`) + const docs = await cache_store.get(`docs_${extrinsic.pallet}:${extrinsic.call}`) // show request params let raw_request = {} diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index 9207b83..a934ade 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -640,10 +640,10 @@ const updateAccounts = async(current_account_id = null) => { const cache_store = new CacheStore(await networks_store.current()) if(current_account_id) { - await accounts_store.asyncSet('current', current_account_id) + await accounts_store.set('current', current_account_id) } - const accounts = await accounts_store.asyncAll() + const accounts = await accounts_store.all() const current_account = await accounts_store.current() const header_logo_el = document.querySelector("#header #top_logo"); @@ -672,7 +672,7 @@ const updateAccounts = async(current_account_id = null) => { const account_id = a?.key const account_jdenticon = jdenticon.toSvg(account.address,56) const is_current = account_id?.toString() === current_account?.id?.toString() - const is_kyced = await cache_store.asyncGet('kyc_' + account.address) + const is_kyced = await cache_store.get('kyc_' + account.address) if(is_current) { current_account_el.querySelector('.jdenticon .jdenticon-content').innerHTML = account_jdenticon @@ -706,7 +706,7 @@ const updateAccounts = async(current_account_id = null) => { } } - const kyc_level = await cache_store.asyncGet('kyc_' + account.address) + const kyc_level = await cache_store.get('kyc_' + account.address) await updateElement('#accounts_modal #wallet_list', 'accounts/modal_item', { account_id, diff --git a/packages/browser-wallet-ui/src/screens/kycAccredited.js b/packages/browser-wallet-ui/src/screens/kycAccredited.js index 2c44e14..7acfda7 100644 --- a/packages/browser-wallet-ui/src/screens/kycAccredited.js +++ b/packages/browser-wallet-ui/src/screens/kycAccredited.js @@ -19,7 +19,7 @@ export default async function kycAccreditedScreen(params) { const account_id = params?.account_id const accounts_store = new AccountStore() - const account = await accounts_store.asyncGet(account_id) + const account = await accounts_store.get(account_id) await screen.set('#heading', 'kyc/heading', { account_name: account?.name, diff --git a/packages/browser-wallet-ui/src/screens/kycAdvanced.js b/packages/browser-wallet-ui/src/screens/kycAdvanced.js index a521ecd..ea0800e 100644 --- a/packages/browser-wallet-ui/src/screens/kycAdvanced.js +++ b/packages/browser-wallet-ui/src/screens/kycAdvanced.js @@ -21,7 +21,7 @@ export default async function kycAdvancedScreen(params) { const accounts_store = new AccountStore() const networks_store = new NetworkStore() - const account = await accounts_store.asyncGet(account_id) + const account = await accounts_store.get(account_id) const current_network = await networks_store.current() await screen.set('#heading', 'kyc/heading', { diff --git a/packages/browser-wallet-ui/src/screens/kycBasic.js b/packages/browser-wallet-ui/src/screens/kycBasic.js index 4ada5dc..874aa68 100644 --- a/packages/browser-wallet-ui/src/screens/kycBasic.js +++ b/packages/browser-wallet-ui/src/screens/kycBasic.js @@ -20,7 +20,7 @@ export default async function kycBasicScreen(params) { const accounts_store = new AccountStore() const networks_store = new NetworkStore() - const account = await accounts_store.asyncGet(account_id) + const account = await accounts_store.get(account_id) const current_network = await networks_store.current() await screen.set('#heading', 'kyc/heading', { diff --git a/packages/browser-wallet-ui/src/screens/kycStart.js b/packages/browser-wallet-ui/src/screens/kycStart.js index 89a2c86..da97691 100644 --- a/packages/browser-wallet-ui/src/screens/kycStart.js +++ b/packages/browser-wallet-ui/src/screens/kycStart.js @@ -22,7 +22,7 @@ export default async function kycStartScreen(params) { const networks_store = new NetworkStore() const current_network = await networks_store.current() const cache_store = new CacheStore(current_network) - const account = await accounts_store.asyncGet(account_id) + const account = await accounts_store.get(account_id) await screen.set('#heading', 'kyc/heading', { account_name: account?.name, diff --git a/packages/browser-wallet-ui/src/screens/networkCreate.js b/packages/browser-wallet-ui/src/screens/networkCreate.js index cf5822e..186610f 100644 --- a/packages/browser-wallet-ui/src/screens/networkCreate.js +++ b/packages/browser-wallet-ui/src/screens/networkCreate.js @@ -18,7 +18,7 @@ export default async function networkCreateScreen(params) { const network_id = params?.network_id const network_store = new NetworkStore() - const network = await network_store.asyncGet(network_id) + const network = await network_store.get(network_id) await screen.set('.content', 'network/create', { network_id: network_id, diff --git a/packages/browser-wallet-ui/src/screens/networkManage.js b/packages/browser-wallet-ui/src/screens/networkManage.js index 64ba928..ba32970 100644 --- a/packages/browser-wallet-ui/src/screens/networkManage.js +++ b/packages/browser-wallet-ui/src/screens/networkManage.js @@ -14,7 +14,8 @@ export default async function networkManageScreen() { await screen.set('#bordered_content', 'network/manage/content') const network_store = new NetworkStore() - const all_networks = await network_store.asyncAll() + const current_network = await network_store.current() + const all_networks = await network_store.all() if(all_networks?.length < 1) { await screen.append('#root #wallet_list', 'shared/alert', { diff --git a/packages/browser-wallet-ui/src/screens/settings.js b/packages/browser-wallet-ui/src/screens/settings.js index d295723..a740347 100644 --- a/packages/browser-wallet-ui/src/screens/settings.js +++ b/packages/browser-wallet-ui/src/screens/settings.js @@ -31,7 +31,7 @@ export default async function settingsScreen(params) { } const networks_store = new NetworkStore() - const all_networks = await networks_store.asyncAll() + const all_networks = await networks_store.all() const current_network = await networks_store.current() await screen.append('#root #change_network', 'settings/partial/network_select', { diff --git a/packages/browser-wallet-ui/src/screens/stakingCollator.js b/packages/browser-wallet-ui/src/screens/stakingCollator.js index 40ce7f6..0e1de92 100644 --- a/packages/browser-wallet-ui/src/screens/stakingCollator.js +++ b/packages/browser-wallet-ui/src/screens/stakingCollator.js @@ -44,7 +44,7 @@ export default async function stakingCollatorScreen(params) { }) const original_balance = await sendMessage('get_balance') - const inflation_amount = await cache_store.asyncGet('inflation_amount') + const inflation_amount = await cache_store.get('inflation_amount') const collator_apy = calculateCollatorApy(all_collators, collator, inflation_amount) const collator_apy_data = getAmountDecimal(formatAmount(collator_apy.toString(), 2), 2) diff --git a/packages/browser-wallet-ui/src/screens/stakingCollators.js b/packages/browser-wallet-ui/src/screens/stakingCollators.js index 83923e6..646152a 100644 --- a/packages/browser-wallet-ui/src/screens/stakingCollators.js +++ b/packages/browser-wallet-ui/src/screens/stakingCollators.js @@ -38,7 +38,7 @@ export default async function stakingCollatorsScreen(params) { } const balance = await sendMessage('get_balance') - const inflation_amount = await cache_store.asyncGet('inflation_amount') + const inflation_amount = await cache_store.get('inflation_amount') const all_collators = await sendMessage('get_collators') let total_my_nominations = 0 diff --git a/packages/browser-wallet-ui/src/screens/stakingHome.js b/packages/browser-wallet-ui/src/screens/stakingHome.js index 7d1d795..86dfcea 100644 --- a/packages/browser-wallet-ui/src/screens/stakingHome.js +++ b/packages/browser-wallet-ui/src/screens/stakingHome.js @@ -41,7 +41,7 @@ export default async function stakingHomeScreen() { const all_collators = await sendMessage('get_collators') const balance = await sendMessage('get_balance') - const inflation_amount = await cache_store.asyncGet('inflation_amount') + const inflation_amount = await cache_store.get('inflation_amount') const my_total_stake = getTotalStakedByAddress(all_collators, current_account.address) const average_user_apy = getApyByAddress(all_collators, current_account.address, inflation_amount) diff --git a/packages/browser-wallet-ui/src/screens/stakingIntro.js b/packages/browser-wallet-ui/src/screens/stakingIntro.js index d3180a2..11ec0e8 100644 --- a/packages/browser-wallet-ui/src/screens/stakingIntro.js +++ b/packages/browser-wallet-ui/src/screens/stakingIntro.js @@ -152,7 +152,7 @@ export default async function stakingIntroScreen(params) { { element: '#staking_intro #go_nominating', listener: async() => { - await settings_store.asyncSet('staking_intro', 'true') + await settings_store.set('staking_intro', 'true') await goToScreen('stakingCollatorsScreen') } } diff --git a/packages/browser-wallet-ui/src/screens/transactionDetails.js b/packages/browser-wallet-ui/src/screens/transactionDetails.js index df0f7bc..4a9844f 100644 --- a/packages/browser-wallet-ui/src/screens/transactionDetails.js +++ b/packages/browser-wallet-ui/src/screens/transactionDetails.js @@ -18,7 +18,7 @@ export default async function transactionDetailsScreen(params) { const current_account = await accounts_store.current() const transactions_store = new TransactionStore(current_network, current_account) - const transaction = await transactions_store.asyncGet(params?.hash) + const transaction = await transactions_store.get(params?.hash) const asset_info = getAmountDecimal(balanceToHuman(transaction.amount, 2), 2) const usd_info = getAmountDecimal(balanceToHuman(transaction.amount) * bbbTokenPrice, 2) // TODO: update price! diff --git a/packages/browser-wallet-ui/src/screens/walletPassword.js b/packages/browser-wallet-ui/src/screens/walletPassword.js index 5ae5b3d..d12611e 100644 --- a/packages/browser-wallet-ui/src/screens/walletPassword.js +++ b/packages/browser-wallet-ui/src/screens/walletPassword.js @@ -103,7 +103,7 @@ export default async function walletPasswordScreen(params) { }, { element: '#go_to_dashboard', - listener: () => goToScreen('dashboardScreen') + listener: () => goToScreen('dashboardScreen', {}, false, true) }, { element: '#new_account', From 2d76ad839680f4b40b753c2f68659775dea8c5fc Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 14:10:49 +0100 Subject: [PATCH 47/96] fixed modal overlap when hidden --- packages/browser-wallet-ui/src/scss/_modals.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/browser-wallet-ui/src/scss/_modals.scss b/packages/browser-wallet-ui/src/scss/_modals.scss index e02a4da..a7e62aa 100644 --- a/packages/browser-wallet-ui/src/scss/_modals.scss +++ b/packages/browser-wallet-ui/src/scss/_modals.scss @@ -4,7 +4,7 @@ pointer-events: none; z-index: -1; transition: all linear 0.2s; - height: auto; + height: 0; box-shadow: 0 1px 3px rgba(17, 20, 30, 0.1), 0 1px 2px rgba(17, 20, 30, 0.06); &:after { From 46de31dfa1a0ae406bacacf193166f6f65e4879c Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 14:21:02 +0100 Subject: [PATCH 48/96] removed custom network functionality --- .../src/components/network/create.html | 25 ---- .../components/network/manage/content.html | 2 - .../components/network/manage/heading.html | 7 -- .../components/network/manage/list_item.html | 5 - .../src/components/settings/index.html | 5 - .../browser-wallet-ui/src/screens/index.js | 4 - .../src/screens/networkCreate.js | 115 ------------------ .../src/screens/networkManage.js | 63 ---------- .../browser-wallet-ui/src/screens/settings.js | 4 - 9 files changed, 230 deletions(-) delete mode 100644 packages/browser-wallet-ui/src/components/network/create.html delete mode 100644 packages/browser-wallet-ui/src/components/network/manage/content.html delete mode 100644 packages/browser-wallet-ui/src/components/network/manage/heading.html delete mode 100644 packages/browser-wallet-ui/src/components/network/manage/list_item.html delete mode 100644 packages/browser-wallet-ui/src/screens/networkCreate.js delete mode 100644 packages/browser-wallet-ui/src/screens/networkManage.js diff --git a/packages/browser-wallet-ui/src/components/network/create.html b/packages/browser-wallet-ui/src/components/network/create.html deleted file mode 100644 index 0657526..0000000 --- a/packages/browser-wallet-ui/src/components/network/create.html +++ /dev/null @@ -1,25 +0,0 @@ -

Some networks are malicious and may be deceitful about the state of the blockchain, whilst also tracking your activity. Only add networks that you trust.

-
-
-
- - -
- - - \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/components/network/manage/content.html b/packages/browser-wallet-ui/src/components/network/manage/content.html deleted file mode 100644 index 12dda30..0000000 --- a/packages/browser-wallet-ui/src/components/network/manage/content.html +++ /dev/null @@ -1,2 +0,0 @@ -
-
\ No newline at end of file diff --git a/packages/browser-wallet-ui/src/components/network/manage/heading.html b/packages/browser-wallet-ui/src/components/network/manage/heading.html deleted file mode 100644 index 30b7c25..0000000 --- a/packages/browser-wallet-ui/src/components/network/manage/heading.html +++ /dev/null @@ -1,7 +0,0 @@ -
- -
-
-
-

Manage Custom Networks

-
\ No newline at end of file diff --git a/packages/browser-wallet-ui/src/components/network/manage/list_item.html b/packages/browser-wallet-ui/src/components/network/manage/list_item.html deleted file mode 100644 index 3d3f2da..0000000 --- a/packages/browser-wallet-ui/src/components/network/manage/list_item.html +++ /dev/null @@ -1,5 +0,0 @@ -
- -

${network_name}

${network_url}

- -
\ No newline at end of file diff --git a/packages/browser-wallet-ui/src/components/settings/index.html b/packages/browser-wallet-ui/src/components/settings/index.html index 3ff31ff..26840e0 100644 --- a/packages/browser-wallet-ui/src/components/settings/index.html +++ b/packages/browser-wallet-ui/src/components/settings/index.html @@ -11,11 +11,6 @@

_WJ)|O7{G9>dC^nP1cQrE1b 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

-
-

Manage Custom Networks

Add or remove other trusted networks.

- -
-
diff --git a/packages/browser-wallet-ui/src/screens/index.js b/packages/browser-wallet-ui/src/screens/index.js index a934ade..78fa35a 100644 --- a/packages/browser-wallet-ui/src/screens/index.js +++ b/packages/browser-wallet-ui/src/screens/index.js @@ -36,8 +36,6 @@ import accountEditScreen from "./accountEdit.js"; import assetReceiveScreen from "./assetReceive.js"; import assetTransactionReviewScreen from "./assetTransactionReview.js"; import assetTransactionFinishScreen from "./assetTransactionFinish.js"; -import networkManageScreen from "./networkManage.js"; -import networkCreateScreen from "./networkCreate.js"; import extrinsicSendScreen from "./extrinsicSend.js"; import transactionHistoryScreen from "./transactionHistory.js"; import transactionDetailsScreen from "./transactionDetails.js"; @@ -487,8 +485,6 @@ const screens = { transactionHistoryScreen, transactionDetailsScreen, settingsScreen, - networkManageScreen, - networkCreateScreen, extrinsicSendScreen, tokenAllScreen, tokenBBBScreen, diff --git a/packages/browser-wallet-ui/src/screens/networkCreate.js b/packages/browser-wallet-ui/src/screens/networkCreate.js deleted file mode 100644 index 186610f..0000000 --- a/packages/browser-wallet-ui/src/screens/networkCreate.js +++ /dev/null @@ -1,115 +0,0 @@ -import Screen, { goBackScreen, goToScreen } from './index.js' -import { NetworkStore } from "@bitgreen/browser-wallet-core"; -import { sendMessage } from "../messaging.js"; -import { showNotification } from "../notifications.js"; - -import DOMPurify from "dompurify"; - -export default async function networkCreateScreen(params) { - const screen = new Screen({ - template_name: 'layouts/full_page', - template_params: { - title: params?.network_id ? 'Edit Custom Network' : 'Add New Network' - }, - header: false, - footer: false - }) - await screen.init() - - const network_id = params?.network_id - const network_store = new NetworkStore() - const network = await network_store.get(network_id) - - await screen.set('.content', 'network/create', { - network_id: network_id, - network_name: network?.name, - network_url: network?.url, - is_new: params?.network_id ? 'hidden' : '', - hide_delete: !params?.network_id ? 'hidden' : '', - }) - - const delete_modal_el = document.querySelector("#delete_modal") - const network_name_el = document.querySelector("#network_name") - const network_url_el = document.querySelector("#network_url") - const switch_network_el = document.querySelector("#switch_to_this") - - screen.setListeners([ - { - element: '.heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #network_name, #root #network_url', - type: 'input', - listener: () => checkNetwork() - }, - { - element: '#root #save_network', - listener: async(e) => { - const network_name = DOMPurify.sanitize(network_name_el.value) - const network_url = DOMPurify.sanitize(network_url_el.value) - const switch_network = switch_network_el?.checked === true - - await sendMessage('save_network', { - network_id, - network_name, - network_url, - switch_network - }) - - await goToScreen('networkManageScreen', {}, true) - await showNotification('Network saved successfully!', 'success') - } - }, - { - element: '#delete_network', - listener: () => { - delete_modal_el.classList.add('fade') - delete_modal_el.classList.add('show') - } - }, - { - element: '#hide_modal', - listener: () => { - delete_modal_el.classList.remove('fade') - delete_modal_el.classList.remove('show') - } - }, - { - element: '#confirm_delete_network', - listener: async(e) => { - const network_id = e.target.dataset.id; - - network_store.remove(network_id) - - await goToScreen('networkManageScreen', {}, true, true) - await showNotification('Network deleted successfully.', 'info') - } - } - ]) - - const isValidWssUrl = (string) => { - let url; - - try { - url = new URL(string); - } catch (_) { - return false; - } - - return url.protocol === "ws:" || url.protocol === "wss:"; - } - - const checkNetwork = () => { - const save_network_el = document.querySelector("#save_network") - - if(network_name_el?.value?.length === 0 || network_url_el?.value?.length === 0 || !isValidWssUrl(network_url_el?.value)) { - save_network_el.classList.add('disabled') - save_network_el.classList.remove('btn-primary') - } else { - save_network_el.classList.remove('disabled') - save_network_el.classList.add('btn-primary') - } - } - checkNetwork() -} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/networkManage.js b/packages/browser-wallet-ui/src/screens/networkManage.js deleted file mode 100644 index ba32970..0000000 --- a/packages/browser-wallet-ui/src/screens/networkManage.js +++ /dev/null @@ -1,63 +0,0 @@ -import Screen, { goBackScreen, goToScreen } from './index.js' -import { NetworkStore } from "@bitgreen/browser-wallet-core"; -import anime from "animejs"; - -export default async function networkManageScreen() { - const screen = new Screen({ - template_name: 'layouts/default_custom_header', - header: false, - footer: true - }) - await screen.init() - - await screen.set('#heading', 'network/manage/heading') - await screen.set('#bordered_content', 'network/manage/content') - - const network_store = new NetworkStore() - const current_network = await network_store.current() - const all_networks = await network_store.all() - - if(all_networks?.length < 1) { - await screen.append('#root #wallet_list', 'shared/alert', { - message: 'No custom networks added.', - alert_type: 'alert-info' - }) - } - - for(const n of all_networks) { - const network_id = n?.key - const network = n.value - await screen.append('#root #wallet_list', 'network/manage/list_item', { - network_id, - network_name: network.name, - network_url: network.url - }) - } - - anime({ - targets: '#bordered_content', - opacity: [0, 1], - translateY: [20, 0], - easing: 'easeInOutSine', - duration: 400 - }); - - screen.setListeners([ - { - element: '#heading #new_network', - listener: () => goToScreen('networkCreateScreen') - }, - { - element: '#heading #go_back', - listener: () => goBackScreen() - }, - { - element: '#root #wallet_list .button-item', - listener: (e) => { - return goToScreen('networkCreateScreen', { - network_id: e.target.dataset?.id - }) - } - } - ]) -} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/screens/settings.js b/packages/browser-wallet-ui/src/screens/settings.js index a740347..9a7eafb 100644 --- a/packages/browser-wallet-ui/src/screens/settings.js +++ b/packages/browser-wallet-ui/src/screens/settings.js @@ -92,10 +92,6 @@ export default async function settingsScreen(params) { }, 800) } }, - { - element: '#manage_networks', - listener: () => goToScreen('networkManageScreen') - }, { element: '#manage_accounts', listener: () => goToScreen('accountManageScreen') From 42ec42c8fc754de2a85488856775f4ba99d32df5 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 14:22:37 +0100 Subject: [PATCH 49/96] removed commented-out HTML --- .../browser-wallet-ui/src/components/settings/index.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/browser-wallet-ui/src/components/settings/index.html b/packages/browser-wallet-ui/src/components/settings/index.html index 26840e0..32009f5 100644 --- a/packages/browser-wallet-ui/src/components/settings/index.html +++ b/packages/browser-wallet-ui/src/components/settings/index.html @@ -28,9 +28,3 @@

About

Bitgreen Wallet v${version}

- - - - - - \ No newline at end of file From a989a37a041c1858f98948ad62f17e577f65b70e Mon Sep 17 00:00:00 2001 From: rappix Date: Mon, 11 Mar 2024 16:00:19 +0100 Subject: [PATCH 50/96] fix: various fixes --- .../browser-wallet-base/capacitor.config.json | 2 +- packages/browser-wallet-base/src/app.js | 35 +++++++++++++------ packages/browser-wallet-ui/src/index.js | 34 +++++++++--------- .../browser-wallet-ui/src/scss/_global.scss | 16 +++++++++ .../browser-wallet-ui/src/scss/_login.scss | 6 ---- packages/browser-wallet-utils/src/index.js | 6 ++-- 6 files changed, 62 insertions(+), 37 deletions(-) diff --git a/packages/browser-wallet-base/capacitor.config.json b/packages/browser-wallet-base/capacitor.config.json index 3cfec4e..a730306 100755 --- a/packages/browser-wallet-base/capacitor.config.json +++ b/packages/browser-wallet-base/capacitor.config.json @@ -15,7 +15,7 @@ }, "plugins": { "Keyboard": { - "resize": "none" + "resize": "body" }, "SplashScreen": { "backgroundColor": "#224851", diff --git a/packages/browser-wallet-base/src/app.js b/packages/browser-wallet-base/src/app.js index 5ac7a78..3937c0d 100644 --- a/packages/browser-wallet-base/src/app.js +++ b/packages/browser-wallet-base/src/app.js @@ -43,38 +43,53 @@ document.addEventListener('deviceready', async() => { } if(isAndroid()) { - setTimeout(() => { - ui.hideInit(true) - }, 600) + await SplashScreen.hide() } else { ui.hideInit(true) } } else { - ui.showInit(true) - await Keyboard.hide() + if(isAndroid()) { + await SplashScreen.show({ + autoHide: false, + }); + } else { + ui.showInit(true) + } // reset body - document.body.style.height = ''; document.body.classList.remove('keyboard-opened') + + await Keyboard.hide() } }); Keyboard.addListener('keyboardWillShow', info => { const bodyHeight = window.innerHeight - info.keyboardHeight - // update body height and add class - if(isIOs()) document.body.style.height = bodyHeight + 'px'; document.body.classList.add('keyboard-opened') + if(isIOs()) { + const footers = document.querySelectorAll('#login_screen .footer, #root .footer') + for(const footer of footers) { + footer.style.paddingBottom = info.keyboardHeight + 'px' + } + } + ui.disableFooter() }); Keyboard.addListener('keyboardWillHide', info => { - // reset body - if(isIOs()) document.body.style.height = ''; document.body.classList.remove('keyboard-opened') + // reset elements + if(isIOs()) { + const footers = document.querySelectorAll('#login_screen .footer, #root .footer') + for(const footer of footers) { + footer.style.paddingBottom = '' + } + } + ui.enableFooter() }); }, false) diff --git a/packages/browser-wallet-ui/src/index.js b/packages/browser-wallet-ui/src/index.js index dce2ea5..3f6c36c 100644 --- a/packages/browser-wallet-ui/src/index.js +++ b/packages/browser-wallet-ui/src/index.js @@ -298,26 +298,26 @@ class userInterface { status_message.classList.add('active') input_form.classList.add('inactive') - const result = await doLogin(password) - - if(result) { - hideNotification() - await hideLogin() - if(current_screen.name === 'dashboardScreen') await reloadScreen() - } else { - await showNotification('Password is wrong!', 'error', 1800, isStandaloneApp() ? 60 : 0) - input_form.classList.remove('inactive') - } + setTimeout(async() => { + const result = await doLogin(password) + + if(result) { + hideNotification() + await hideLogin() + if(current_screen.name === 'dashboardScreen') await reloadScreen() + } else { + await showNotification('Password is wrong!', 'error', 1800, isStandaloneApp() ? 60 : 0) + input_form.classList.remove('inactive') + } - setTimeout(() => { input_form.classList.remove('inactive') - }, 1000) - // reset to init screen - show_password.innerHTML = '' - input_field.type = 'password' - status_message.classList.remove('active') - unFreezeRoot() + // reset to init screen + show_password.innerHTML = '' + input_field.type = 'password' + status_message.classList.remove('active') + unFreezeRoot() + }, 500) } goToScreen = async(name, params = {}, force = false) => { diff --git a/packages/browser-wallet-ui/src/scss/_global.scss b/packages/browser-wallet-ui/src/scss/_global.scss index 138f20a..daaef2a 100644 --- a/packages/browser-wallet-ui/src/scss/_global.scss +++ b/packages/browser-wallet-ui/src/scss/_global.scss @@ -34,6 +34,12 @@ body { line-height: 14px; overflow: hidden; background: linear-gradient(to bottom, $colorTealLight, $colorTealDark); + + &.app { + .footer { + transition: padding-bottom ease-out 0.222s; + } + } } h1 { font-weight: 500; @@ -178,3 +184,13 @@ p { } } } +.separator-line { + margin: 0 auto 8px; + width: 100%; + height: 1px; + background-color: $colorLightGray; +} +.blank-space { + width: 100%; + height: 60px; +} \ No newline at end of file diff --git a/packages/browser-wallet-ui/src/scss/_login.scss b/packages/browser-wallet-ui/src/scss/_login.scss index 725d3f2..6e75efb 100644 --- a/packages/browser-wallet-ui/src/scss/_login.scss +++ b/packages/browser-wallet-ui/src/scss/_login.scss @@ -75,12 +75,6 @@ background: $colorWhite; z-index: 99; } -.separator-line { - margin: 0 auto 8px; - width: 100%; - height: 1px; - background-color: $colorLightGray; -} .browser-wallet { position: fixed; top: 260px; diff --git a/packages/browser-wallet-utils/src/index.js b/packages/browser-wallet-utils/src/index.js index 924e94f..6f6321e 100644 --- a/packages/browser-wallet-utils/src/index.js +++ b/packages/browser-wallet-utils/src/index.js @@ -164,8 +164,6 @@ const getOperatingSystem = () => { if (userAgent.match(/Windows/i)) { osName = "windows"; - } else if (userAgent.match(/Linux/i)) { - osName = "linux"; } else if (userAgent.match(/Android/i)) { osName = "android"; } else if (userAgent.match(/iPad/i) || navigator.platform === 'iPad' || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) { @@ -174,6 +172,8 @@ const getOperatingSystem = () => { osName = "ios"; } else if (userAgent.match(/Macintosh/i)) { osName = "macos"; + } else if (userAgent.match(/Linux/i)) { + osName = "linux"; } return osName; @@ -196,7 +196,7 @@ const isIPad = () => { } const isAndroid = () => { - return process.env.PLATFORM === 'android' + return getOperatingSystem() === 'android' } const isStandaloneApp = () => { From 8008f55ae7c7f76931bd649ff868353c016fec44 Mon Sep 17 00:00:00 2001 From: Mike Burns Date: Mon, 11 Mar 2024 23:06:03 +0100 Subject: [PATCH 51/96] fixed mnemonic interface for apps --- .../src/screens/walletConfirm.js | 25 ++--------- .../src/screens/walletImport.js | 28 +++---------- packages/browser-wallet-utils/src/index.js | 41 ++++++++++++++++++- 3 files changed, 50 insertions(+), 44 deletions(-) diff --git a/packages/browser-wallet-ui/src/screens/walletConfirm.js b/packages/browser-wallet-ui/src/screens/walletConfirm.js index a5376a1..8006f77 100644 --- a/packages/browser-wallet-ui/src/screens/walletConfirm.js +++ b/packages/browser-wallet-ui/src/screens/walletConfirm.js @@ -2,7 +2,6 @@ import Screen, { goBackScreen, goToScreen } from './index.js' import { shuffleArray } from '@bitgreen/browser-wallet-utils' import anime from 'animejs'; -import Sortable from 'sortablejs'; let mnemonic_array = [] let shuffled_mnemonic_array = [] @@ -34,26 +33,10 @@ export default async function walletConfirmScreen(params) { } } - const user_mnemonics_el = document.querySelector("#user_mnemonics"); - user_mnemonic_sortable = Sortable.create(user_mnemonics_el, { - dataIdAttr: 'data-id', - easing: "cubic-bezier(1, 0, 0, 1)", - animation: 150, - invertSwap: true, - emptyInsertThreshold: 100, - onUpdate: function(evt) { - refreshUserMnemonics() - checkWords() - }, - onChoose: function(evt) { - evt.item.classList.add('selected') - document.querySelector("#user_mnemonics").classList.add('dragging') - }, - onUnchoose: function(evt) { - evt.item.classList.remove('selected') - document.querySelector("#user_mnemonics").classList.remove('dragging') - } - }); + user_mnemonic_sortable = createMnemonicSortable('#user_mnemonics', (evt) => { + refreshUserMnemonics() + checkWords() + }, removeWord); anime({ targets: '#shuffled_mnemonics .word', diff --git a/packages/browser-wallet-ui/src/screens/walletImport.js b/packages/browser-wallet-ui/src/screens/walletImport.js index 8c630c7..047fb1a 100644 --- a/packages/browser-wallet-ui/src/screens/walletImport.js +++ b/packages/browser-wallet-ui/src/screens/walletImport.js @@ -3,8 +3,8 @@ import Screen, { goBackScreen, goToScreen, updateCurrentParams } from './index.j import { mnemonicValidate } from "@polkadot/util-crypto"; import anime from 'animejs'; -import Sortable from 'sortablejs'; import DOMPurify from 'dompurify'; +import { createMnemonicSortable } from '@bitgreen/browser-wallet-utils'; let import_mnemonic_array = []; let import_mnemonic_sortable = []; @@ -27,26 +27,10 @@ export default async function walletImportScreen(params = {}) { importWord(false, params.mnemonic.join(' ')) } - let import_mnemonics_el = document.querySelector("#import_mnemonics"); - import_mnemonic_sortable = Sortable.create(import_mnemonics_el, { - dataIdAttr: 'data-id', - easing: "cubic-bezier(1, 0, 0, 1)", - animation: 150, - invertSwap: true, - emptyInsertThreshold: 100, - onUpdate: (evt) => { - refreshImportedMnemonics(); - checkMnemonics() - }, - onChoose: (evt) => { - evt.item.classList.add('selected') - document.querySelector("#import_mnemonics").classList.add('dragging') - }, - onUnchoose: (evt) => { - evt.item.classList.remove('selected') - document.querySelector("#import_mnemonics").classList.remove('dragging') - } - }); + import_mnemonic_sortable = createMnemonicSortable('#import_mnemonics', (evt) => { + refreshImportedMnemonics(); + checkMnemonics() + }, removeWord); await refreshImportedMnemonics() checkMnemonics() @@ -119,7 +103,7 @@ function importWord(e, input = false) { return false; } // maximum word length is 8 - refreshImportedMnemonics(word.trim().substring(0, 8)); + refreshImportedMnemonics(word.trim().toLowerCase().substring(0, 8)); } refreshImportedMnemonics() } diff --git a/packages/browser-wallet-utils/src/index.js b/packages/browser-wallet-utils/src/index.js index 6f6321e..2be86db 100644 --- a/packages/browser-wallet-utils/src/index.js +++ b/packages/browser-wallet-utils/src/index.js @@ -1,6 +1,7 @@ import { decodeAddress, encodeAddress } from "@polkadot/util-crypto"; import { hexToU8a, isHex } from "@polkadot/util"; import BigNumber from "bignumber.js"; +import Sortable from 'sortablejs'; const getBrowser = () => { let userAgent = navigator.userAgent; @@ -324,6 +325,43 @@ const customReviver = (key, value) => { return value; } +// create sortable +const createMnemonicSortable = (cssQuerySelector, updateFunction, removeFunction) => { + const sortableOuterElement = document.querySelector(cssQuerySelector); + const sortable = Sortable.create(sortableOuterElement, { + dataIdAttr: 'data-id', + easing: "cubic-bezier(1, 0, 0, 1)", + animation: 150, + invertSwap: true, + delay: 100, + delayOnTouchOnly: true, + emptyInsertThreshold: 100, + onUpdate: updateFunction, + onChoose: (evt) => { + evt.item.classList.add('selected') + document.querySelector(cssQuerySelector).classList.add('dragging') + }, + onUnchoose: (evt) => { + evt.item.classList.remove('selected') + document.querySelector(cssQuerySelector).classList.remove('dragging') + } + }); + + // for the app, just remove when "clicked" (touchstart -> touchend without actually moving) + if(isStandaloneApp()) { + sortableOuterElement.addEventListener('click', (e) => { + for (let elem = e.target; elem && elem !== this; elem = elem.parentNode) { + if (elem.matches && elem.matches(cssQuerySelector + ' > .word')) { + removeFunction({target: elem.querySelector('.remove')}) + return; + } + } + }) + } + + return sortable; +} + export { getBrowser, isChrome, @@ -354,5 +392,6 @@ export { calculateUserApy, calculateUserRewardPerBlock, getCurrentBrowser, - customReviver + customReviver, + createMnemonicSortable } \ No newline at end of file From 564f1f7fcaf5b9e5ca7b7e40a6587298075c18c1 Mon Sep 17 00:00:00 2001 From: rappix Date: Tue, 12 Mar 2024 19:04:45 +0100 Subject: [PATCH 52/96] fix welcome screen --- packages/browser-wallet-ui/src/screens/welcome.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/browser-wallet-ui/src/screens/welcome.js b/packages/browser-wallet-ui/src/screens/welcome.js index f9a0346..3133cdb 100644 --- a/packages/browser-wallet-ui/src/screens/welcome.js +++ b/packages/browser-wallet-ui/src/screens/welcome.js @@ -30,7 +30,7 @@ export default async function welcomeScreen() { delay: 600, easing: 'linear', keyframes: [ - { translateY: isStandaloneApp() ? -163 : -100, scale: 0.323232, duration: 800 }, + { translateY: isStandaloneApp() ? -163 : -36, scale: 0.323232, duration: 800 }, { translateX: isStandaloneApp() ? -288 : -290, duration: 600 }, ] }); From 5eb92438d22c7ad427d2315b65bcc35cefcd0bac Mon Sep 17 00:00:00 2001 From: rappix Date: Tue, 12 Mar 2024 19:05:48 +0100 Subject: [PATCH 53/96] add missing import --- packages/browser-wallet-ui/src/screens/walletConfirm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/browser-wallet-ui/src/screens/walletConfirm.js b/packages/browser-wallet-ui/src/screens/walletConfirm.js index 8006f77..5360def 100644 --- a/packages/browser-wallet-ui/src/screens/walletConfirm.js +++ b/packages/browser-wallet-ui/src/screens/walletConfirm.js @@ -1,5 +1,5 @@ import Screen, { goBackScreen, goToScreen } from './index.js' -import { shuffleArray } from '@bitgreen/browser-wallet-utils' +import {createMnemonicSortable, shuffleArray} from '@bitgreen/browser-wallet-utils' import anime from 'animejs'; From 43ef248262e686b6d2415385f6b41ad08c54c68e Mon Sep 17 00:00:00 2001 From: rappix Date: Wed, 13 Mar 2024 05:04:48 +0100 Subject: [PATCH 54/96] fix: ui fixes & keyboard issues on ios --- .../src/components/accounts/edit/content.html | 2 + .../src/screens/accountEdit.js | 6 ++- .../src/screens/assetSend.js | 15 ++++++- .../browser-wallet-ui/src/screens/index.js | 40 +++++++++++++++++++ .../src/screens/walletImport.js | 6 ++- .../src/screens/walletPassword.js | 14 ++++++- packages/browser-wallet-ui/src/scss/_app.scss | 24 ++++++++--- packages/browser-wallet-ui/src/scss/_ios.scss | 5 +++ .../browser-wallet-ui/src/scss/_staking.scss | 5 ++- 9 files changed, 105 insertions(+), 12 deletions(-) diff --git a/packages/browser-wallet-ui/src/components/accounts/edit/content.html b/packages/browser-wallet-ui/src/components/accounts/edit/content.html index 099e244..7f75eb3 100644 --- a/packages/browser-wallet-ui/src/components/accounts/edit/content.html +++ b/packages/browser-wallet-ui/src/components/accounts/edit/content.html @@ -17,6 +17,8 @@
+
+
-