diff --git a/.vscode/settings.json b/.vscode/settings.json
index e70c45bce..a73ba2544 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,5 +9,6 @@
"prettier.bracketSameLine": true,
"prettier.arrowParens": "avoid",
"javascript.updateImportsOnFileMove.enabled": "always",
- "typescript.updateImportsOnFileMove.enabled": "always"
+ "typescript.updateImportsOnFileMove.enabled": "always",
+ "java.configuration.updateBuildConfiguration": "disabled"
}
diff --git a/App.tsx b/App.tsx
index f038b929d..ee7376c61 100644
--- a/App.tsx
+++ b/App.tsx
@@ -1,4 +1,3 @@
-import * as Sentry from '@sentry/react-native';
import { LogBox, Platform, UIManager } from 'react-native';
import React, { ReactElement, useEffect } from 'react';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
@@ -16,6 +15,7 @@ import { customTheme } from './src/navigation/themes';
import Navigator from './src/navigation/Navigator';
import { persistor, store } from './src/store/store';
import NotificationHandler from 'src/hooks/useNotificationHandler';
+import { SentryWrapper } from 'src/services/sentry';
LogBox.ignoreLogs([
"[react-native-gesture-handler] Seems like you're using an old API with gesture components, check out new Gestures system!",
@@ -74,6 +74,6 @@ function AppWrapper() {
);
}
-const SentryApp = Sentry.wrap(AppWrapper);
+const SentryApp = SentryWrapper(AppWrapper);
export default withIAPContext(SentryApp);
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 94c1977e8..6787c2242 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -86,8 +86,8 @@ android {
applicationId "io.hexawallet.keeper"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 421
- versionName "1.2.20"
+ versionCode 428
+ versionName "1.3.0"
missingDimensionStrategy 'react-native-camera', 'general'
missingDimensionStrategy 'store', 'play'
multiDexEnabled true
diff --git a/android/app/src/development/res/values/strings.xml b/android/app/src/development/res/values/strings.xml
index f5f603995..129863658 100644
--- a/android/app/src/development/res/values/strings.xml
+++ b/android/app/src/development/res/values/strings.xml
@@ -1,4 +1,5 @@
Keeper
keeperdev
+ /app/dev
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index ca4b197f2..a5aff960c 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -64,7 +64,7 @@
-
+
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 2531426ef..605276a5e 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -3,4 +3,5 @@
keeper
Backup with Keeper
aiddescription
+ /app/prod
diff --git a/index.js b/index.js
index ffe148ea8..3fd5bc308 100644
--- a/index.js
+++ b/index.js
@@ -10,7 +10,9 @@ import { Text, Input } from 'native-base';
import App from './App';
import { name as appName } from './app.json';
import { enableAndroidFontFix } from './AndroidFontFix';
+import { initSentrySDK } from 'src/services/sentry';
+initSentrySDK();
enableAndroidFontFix();
Text.defaultProps = Text.defaultProps || {};
diff --git a/ios/hexa_keeper.xcodeproj/project.pbxproj b/ios/hexa_keeper.xcodeproj/project.pbxproj
index 9662128d7..48aa4ad4d 100644
--- a/ios/hexa_keeper.xcodeproj/project.pbxproj
+++ b/ios/hexa_keeper.xcodeproj/project.pbxproj
@@ -791,7 +791,7 @@
CODE_SIGN_ENTITLEMENTS = hexa_keeper/hexa_keeper.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 421;
+ CURRENT_PROJECT_VERSION = 428;
DEVELOPMENT_TEAM = Y5TCB759QL;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -892,7 +892,7 @@
"$(inherited)",
"\"$(SRCROOT)\"",
);
- MARKETING_VERSION = 1.2.20;
+ MARKETING_VERSION = 1.3.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -916,7 +916,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = hexa_keeper/hexa_keeper.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution: Bithyve UK Ltd (Y5TCB759QL)";
- CURRENT_PROJECT_VERSION = 421;
+ CURRENT_PROJECT_VERSION = 428;
DEVELOPMENT_TEAM = Y5TCB759QL;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = Y5TCB759QL;
HEADER_SEARCH_PATHS = (
@@ -1017,7 +1017,7 @@
"$(inherited)",
"\"$(SRCROOT)\"",
);
- MARKETING_VERSION = 1.2.20;
+ MARKETING_VERSION = 1.3.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -1172,7 +1172,7 @@
CODE_SIGN_ENTITLEMENTS = hexa_keeper_dev.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 421;
+ CURRENT_PROJECT_VERSION = 428;
DEVELOPMENT_TEAM = Y5TCB759QL;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -1274,7 +1274,7 @@
"$(PROJECT_DIR)",
"\"$(SRCROOT)\"",
);
- MARKETING_VERSION = 1.2.20;
+ MARKETING_VERSION = 1.3.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -1300,7 +1300,7 @@
CODE_SIGN_ENTITLEMENTS = hexa_keeper_dev.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
- CURRENT_PROJECT_VERSION = 421;
+ CURRENT_PROJECT_VERSION = 428;
DEVELOPMENT_TEAM = Y5TCB759QL;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = Y5TCB759QL;
HEADER_SEARCH_PATHS = (
@@ -1402,7 +1402,7 @@
"$(PROJECT_DIR)",
"\"$(SRCROOT)\"",
);
- MARKETING_VERSION = 1.2.20;
+ MARKETING_VERSION = 1.3.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
diff --git a/ios/hexa_keeper/Info.plist b/ios/hexa_keeper/Info.plist
index b65cded97..158536b82 100644
--- a/ios/hexa_keeper/Info.plist
+++ b/ios/hexa_keeper/Info.plist
@@ -36,7 +36,7 @@
CFBundleVersion
- 421
+ 428
LSRequiresIPhoneOS
NFCReaderUsageDescription
diff --git a/ios/hexa_keeperTests/Info.plist b/ios/hexa_keeperTests/Info.plist
index 4dbcab613..5b06d92b3 100644
--- a/ios/hexa_keeperTests/Info.plist
+++ b/ios/hexa_keeperTests/Info.plist
@@ -19,6 +19,6 @@
CFBundleSignature
????
CFBundleVersion
- 421
+ 428
diff --git a/ios/hexa_keeper_dev-Info.plist b/ios/hexa_keeper_dev-Info.plist
index 02a7dfc4c..3b3e74b19 100644
--- a/ios/hexa_keeper_dev-Info.plist
+++ b/ios/hexa_keeper_dev-Info.plist
@@ -36,7 +36,7 @@
CFBundleVersion
- 421
+ 428
LSRequiresIPhoneOS
NFCReaderUsageDescription
diff --git a/package.json b/package.json
index 0c4c63705..86a804368 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "hexa_keeper",
- "version": "1.2.20",
+ "version": "1.3.0",
"private": true,
"scripts": {
"ios": "react-native run-ios",
@@ -24,27 +24,23 @@
"release ios prod": "cd ios && ENVFILE=.env.production bundle exec fastlane live --env production"
},
"dependencies": {
+ "@bitcoinerlab/miniscript": "1.4.0",
"@ngraveio/bc-ur": "1.1.6",
"@noble/secp256k1": "1.6.3",
"@react-native-community/clipboard": "1.5.1",
"@react-native-firebase/app": "14.11.1",
"@react-native-firebase/messaging": "14.11.1",
- "@react-navigation/bottom-tabs": "6.5.7",
- "@react-navigation/drawer": "6.6.6",
"@react-navigation/native": "6.0.8",
"@react-navigation/native-stack": "6.5.0",
"@realm/react": "0.5.2",
- "@redux-devtools/extension": "3.2.2",
"@reduxjs/toolkit": "1.8.2",
"@sentry/react-native": "5.33.1",
- "@shipt/segmented-arc-for-react-native": "^1.0.1",
+ "@shipt/segmented-arc-for-react-native": "1.2.1",
"@testing-library/react-native": "11.0.0",
- "@types/crypto-js": "4.1.1",
"assert": "2.0.0",
"axios": "1.6.8",
- "base58check": "^2.0.0",
+ "base58check": "2.0.0",
"bip21": "2.0.3",
- "bip32-path": "0.4.2",
"bip39": "3.0.4",
"bitcoinjs-lib": "6.1.5",
"bitcoinjs-message": "2.2.0",
@@ -57,7 +53,7 @@
"crypto-js": "4.2.0",
"deprecated-react-native-prop-types": "4.2.1",
"ecpair": "2.0.1",
- "electrum-client": "git+https://github.com/bithyve/rn-electrum-client.git",
+ "electrum-client": "git+https://github.com/bithyve/rn-electrum-client.git#76c0ea35e1a50c47f3a7f818d529ebd100161496",
"events": "1.0.0",
"idx": "2.5.6",
"lodash": "4.17.21",
@@ -75,20 +71,20 @@
"react-native-blob-util": "0.18.3",
"react-native-camera": "4.2.1",
"react-native-config": "1.4.6",
- "react-native-contacts": "^7.0.8",
+ "react-native-contacts": "7.0.8",
"react-native-crypto": "2.2.0",
"react-native-device-info": "10.0.2",
"react-native-document-picker": "8.2.2",
"react-native-fs": "2.20.0",
"react-native-gesture-handler": "2.14.0",
"react-native-get-random-values": "1.8.0",
- "react-native-gifted-charts": "^1.4.7",
+ "react-native-gifted-charts": "1.4.15",
"react-native-hce": "0.2.0",
"react-native-html-to-pdf": "0.12.0",
"react-native-iap": "12.15.2",
"react-native-image-picker": "4.10.3",
"react-native-keychain": "8.1.2",
- "react-native-linear-gradient": "^2.8.3",
+ "react-native-linear-gradient": "2.8.3",
"react-native-localize": "2.2.2",
"react-native-mmkv": "2.11.0",
"react-native-modal": "13.0.1",
@@ -99,7 +95,7 @@
"react-native-randombytes": "3.6.1",
"react-native-reanimated": "3.6.1",
"react-native-responsive-screen": "1.4.2",
- "react-native-rsa-native": "^2.0.5",
+ "react-native-rsa-native": "2.0.5",
"react-native-safe-area-context": "4.7.2",
"react-native-screens": "3.25.0",
"react-native-send-intent": "1.3.0",
@@ -124,45 +120,45 @@
"libportal-react-native": "git+https://github.com/bithyve/libportal-react-native.git#3f9373785265f3e18218eefb8958109feec8f7c3"
},
"devDependencies": {
- "@babel/core": "^7.20.0",
- "@babel/preset-env": "^7.20.0",
- "@babel/runtime": "^7.20.0",
- "@react-native/eslint-config": "^0.72.2",
- "@react-native/metro-config": "^0.72.0",
- "@testing-library/jest-native": "^5.3.0",
- "@tsconfig/react-native": "^3.0.0",
- "@types/jest": "^29.2.1",
- "@types/react": "^18.0.24",
- "@types/react-native": "^0.66.15",
- "@types/react-test-renderer": "^18.0.0",
- "@typescript-eslint/eslint-plugin": "^5.15.0",
- "@typescript-eslint/parser": "^5.15.0",
- "babel-jest": "^29.2.1",
- "babel-plugin-module-resolver": "^4.1.0",
- "babel-plugin-transform-remove-console": "^6.9.4",
- "eslint": "^8.19.0",
- "eslint-config-airbnb": "^19.0.4",
- "eslint-config-prettier": "^8.5.0",
- "eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.25.4",
- "eslint-plugin-jsx-a11y": "^6.5.1",
- "eslint-plugin-react": "^7.29.4",
- "eslint-plugin-react-hooks": "^4.3.0",
- "eslint-plugin-react-native": "^4.0.0",
- "husky": "^8.0.2",
- "jest": "^29.2.1",
- "lint-staged": "^13.0.4",
- "metro-react-native-babel-preset": "^0.76.5",
- "prettier": "^2.4.1",
- "react-native-codegen": "^0.70.7",
- "react-native-svg-transformer": "^1.1.0",
- "react-test-renderer": "18.2.0",
- "redux-mock-store": "^1.5.4",
- "rn-nodeify": "github:tradle/rn-nodeify",
+ "@babel/core": "7.26.0",
+ "@babel/preset-env": "7.26.0",
+ "@babel/runtime": "7.26.0",
+ "@react-native/eslint-config": "0.72.2",
+ "@react-native/metro-config": "0.72.12",
+ "@testing-library/jest-native": "5.4.3",
+ "@tsconfig/react-native": "3.0.5",
+ "@types/jest": "29.5.14",
+ "@types/react": "18.3.12",
+ "@types/react-native": "0.66.34",
+ "@types/react-test-renderer": "18.3.0",
+ "@typescript-eslint/eslint-plugin": "5.62.0",
+ "@typescript-eslint/parser": "5.62.0",
+ "babel-jest": "29.7.0",
+ "babel-plugin-module-resolver": "4.1.0",
+ "babel-plugin-transform-remove-console": "6.9.4",
+ "eslint": "8.57.1",
+ "eslint-config-airbnb": "19.0.4",
+ "eslint-config-prettier": "8.10.0",
+ "eslint-import-resolver-typescript": "3.6.3",
+ "eslint-plugin-import": "2.31.0",
+ "eslint-plugin-jsx-a11y": "6.10.2",
+ "eslint-plugin-react": "7.37.2",
+ "eslint-plugin-react-hooks": "4.6.2",
+ "eslint-plugin-react-native": "4.1.0",
+ "husky": "8.0.3",
+ "jest": "29.7.0",
+ "lint-staged": "13.3.0",
+ "metro-react-native-babel-preset": "0.76.9",
+ "prettier": "2.8.8",
+ "react-native-codegen": "0.70.7",
+ "react-native-svg-transformer": "1.5.0",
+ "react-test-renderer": "18.3.0",
+ "redux-mock-store": "1.5.5",
+ "rn-nodeify": "github:tradle/rn-nodeify#338d8d6ba8438403093e9409e9a9d88ad884926f",
"typescript": "4.8.4"
},
"resolutions": {
- "@types/react": "^17"
+ "@types/react": "18.3.12"
},
"react-native": {
"crypto": "react-native-crypto",
diff --git a/src/assets/images/add-circle-light.svg b/src/assets/images/add-circle-light.svg
new file mode 100644
index 000000000..bcb98a3b7
--- /dev/null
+++ b/src/assets/images/add-circle-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/assisted-vault-disabled-icon.svg b/src/assets/images/assisted-vault-disabled-icon.svg
new file mode 100644
index 000000000..adb954389
--- /dev/null
+++ b/src/assets/images/assisted-vault-disabled-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/assets/images/assisted-vault-hexa.svg b/src/assets/images/assisted-vault-hexa.svg
new file mode 100644
index 000000000..4c1ef171a
--- /dev/null
+++ b/src/assets/images/assisted-vault-hexa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/assisted-vault-icon.svg b/src/assets/images/assisted-vault-icon.svg
new file mode 100644
index 000000000..49dc74220
--- /dev/null
+++ b/src/assets/images/assisted-vault-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/assets/images/assisted-vault-white-icon.svg b/src/assets/images/assisted-vault-white-icon.svg
new file mode 100644
index 000000000..13616bb6b
--- /dev/null
+++ b/src/assets/images/assisted-vault-white-icon.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/bell-white-icon.svg b/src/assets/images/bell-white-icon.svg
new file mode 100644
index 000000000..178dd51c7
--- /dev/null
+++ b/src/assets/images/bell-white-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/images/calendar-disabled.svg b/src/assets/images/calendar-disabled.svg
new file mode 100644
index 000000000..5c36d55ea
--- /dev/null
+++ b/src/assets/images/calendar-disabled.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/change-arrow-light.svg b/src/assets/images/change-arrow-light.svg
new file mode 100644
index 000000000..0a36c0eb4
--- /dev/null
+++ b/src/assets/images/change-arrow-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/configure-circle.svg b/src/assets/images/configure-circle.svg
new file mode 100644
index 000000000..1d4cc7187
--- /dev/null
+++ b/src/assets/images/configure-circle.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/dashed-arrow-center.svg b/src/assets/images/dashed-arrow-center.svg
new file mode 100644
index 000000000..0080baaf7
--- /dev/null
+++ b/src/assets/images/dashed-arrow-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/dashed-arrow-left.svg b/src/assets/images/dashed-arrow-left.svg
new file mode 100644
index 000000000..669bdeea7
--- /dev/null
+++ b/src/assets/images/dashed-arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/dashed-arrow-right.svg b/src/assets/images/dashed-arrow-right.svg
new file mode 100644
index 000000000..fc6a2dd08
--- /dev/null
+++ b/src/assets/images/dashed-arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/iks-horizontal-dark.svg b/src/assets/images/iks-horizontal-dark.svg
new file mode 100644
index 000000000..6ec0150f2
--- /dev/null
+++ b/src/assets/images/iks-horizontal-dark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/iks-horizontal-light.svg b/src/assets/images/iks-horizontal-light.svg
new file mode 100644
index 000000000..80c1baed9
--- /dev/null
+++ b/src/assets/images/iks-horizontal-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/iks-timer.svg b/src/assets/images/iks-timer.svg
new file mode 100644
index 000000000..3b191fcd8
--- /dev/null
+++ b/src/assets/images/iks-timer.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/images/info-icon.svg b/src/assets/images/info-icon.svg
new file mode 100644
index 000000000..d0843d210
--- /dev/null
+++ b/src/assets/images/info-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/inheritance-key-circle.svg b/src/assets/images/inheritance-key-circle.svg
new file mode 100644
index 000000000..a3a276b2e
--- /dev/null
+++ b/src/assets/images/inheritance-key-circle.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/keeper-name-icon-dark.svg b/src/assets/images/keeper-name-icon-dark.svg
new file mode 100644
index 000000000..51f08f0fa
--- /dev/null
+++ b/src/assets/images/keeper-name-icon-dark.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/personalize-circle.svg b/src/assets/images/personalize-circle.svg
new file mode 100644
index 000000000..23410f79e
--- /dev/null
+++ b/src/assets/images/personalize-circle.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/remote-share-icon.svg b/src/assets/images/remote-share-icon.svg
new file mode 100644
index 000000000..b51f668d9
--- /dev/null
+++ b/src/assets/images/remote-share-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/reserve-key-illustration-light.svg b/src/assets/images/reserve-key-illustration-light.svg
new file mode 100644
index 000000000..353d6ddbd
--- /dev/null
+++ b/src/assets/images/reserve-key-illustration-light.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/signer-empty.svg b/src/assets/images/signer-empty.svg
new file mode 100644
index 000000000..421473b9a
--- /dev/null
+++ b/src/assets/images/signer-empty.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/single-key-white-icon.svg b/src/assets/images/single-key-white-icon.svg
new file mode 100644
index 000000000..b25dddb5b
--- /dev/null
+++ b/src/assets/images/single-key-white-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/timer-icon.svg b/src/assets/images/timer-icon.svg
new file mode 100644
index 000000000..2cd08c028
--- /dev/null
+++ b/src/assets/images/timer-icon.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/timer-outline.svg b/src/assets/images/timer-outline.svg
new file mode 100644
index 000000000..920f5aa55
--- /dev/null
+++ b/src/assets/images/timer-outline.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/images/upload-icon.svg b/src/assets/images/upload-icon.svg
new file mode 100644
index 000000000..02df60838
--- /dev/null
+++ b/src/assets/images/upload-icon.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/images/wallet-white-icon.svg b/src/assets/images/wallet-white-icon.svg
new file mode 100644
index 000000000..66491b891
--- /dev/null
+++ b/src/assets/images/wallet-white-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/components/Carousel/ChoosePlanCarouselItem.tsx b/src/components/Carousel/ChoosePlanCarouselItem.tsx
index 89d4946b7..841ca65f7 100644
--- a/src/components/Carousel/ChoosePlanCarouselItem.tsx
+++ b/src/components/Carousel/ChoosePlanCarouselItem.tsx
@@ -9,6 +9,7 @@ import PlebIcon from 'src/assets/images/pleb_white.svg';
import HodlerIcon from 'src/assets/images/hodler.svg';
import DiamondIcon from 'src/assets/images/diamond_hands.svg';
import PlanCheckMarkSelected from 'src/assets/images/planCheckMarkSelected.svg';
+import { calculateMonthlyCost } from 'src/utils/utilities';
const styles = StyleSheet.create({
wrapperView: {
@@ -67,7 +68,8 @@ function ChoosePlanCarouselItem({
const getAmt = useMemo(() => {
try {
if (item.productType === 'free') return 'Free';
- return item.monthlyPlanDetails.price;
+ if (isMonthly) return item.monthlyPlanDetails.price;
+ else return calculateMonthlyCost(item.yearlyPlanDetails.price);
} catch (error) {
return '';
}
diff --git a/src/components/Dropdown.tsx b/src/components/Dropdown.tsx
index 846d99410..ba2703177 100644
--- a/src/components/Dropdown.tsx
+++ b/src/components/Dropdown.tsx
@@ -1,32 +1,53 @@
-import { Box, useColorMode } from 'native-base';
+import { Box, useColorMode, Pressable } from 'native-base';
import { StyleSheet, TouchableOpacity } from 'react-native';
import Text from './KeeperText';
import RightArrowIcon from 'src/assets/images/icon_arrow.svg';
+import TickIcon from 'src/assets/images/icon_check.svg';
import { hp } from 'src/constants/responsive';
-import { useState } from 'react';
+import { useState, useEffect } from 'react';
type Props = {
label: string;
options: string[];
- onOptionSelect: any;
+ selectedOption: string | null;
+ onOptionSelect: (option: string) => void;
};
-function Dropdown({ label, options, onOptionSelect }: Props) {
+function Dropdown({ label, options, selectedOption, onOptionSelect }: Props) {
const { colorMode } = useColorMode();
-
const [isOpen, setIsOpen] = useState(false);
+ const [internalSelectedOption, setInternalSelectedOption] = useState(
+ selectedOption
+ );
const handlePress = () => {
setIsOpen(!isOpen);
};
+ const handleOptionSelect = (option: string) => {
+ setInternalSelectedOption(option);
+ onOptionSelect(option);
+ setIsOpen(false);
+ };
+
+ useEffect(() => {
+ if (selectedOption) {
+ setInternalSelectedOption(selectedOption);
+ }
+ }, [selectedOption]);
+
return (
-
+
-
- {label}
+
+ {internalSelectedOption || label}
+
-
-
- {isOpen && (
-
- {options.map((option) => (
- {
- onOptionSelect(option);
- setIsOpen(false);
- }}
+
+ {isOpen && (
+
+ {options.map((option, index) => (
+ handleOptionSelect(option)}>
+
- {option}
-
- ))}
-
- )}
-
+
+ {option}
+
+ {internalSelectedOption === option && }
+
+
+ ))}
+
+ )}
);
}
@@ -81,8 +109,15 @@ const styles = StyleSheet.create({
gap: 20,
},
labelText: {
+ fontSize: 14,
+ lineHeight: 24,
+ letterSpacing: 0.39,
+ },
+ optionText: {
fontSize: 13,
letterSpacing: 0.39,
+ paddingBottom: 10,
+ paddingTop: 5,
},
emptyView: {
height: hp(23),
@@ -95,13 +130,19 @@ const styles = StyleSheet.create({
},
optionsContainer: {
width: '95%',
- position: 'absolute',
alignSelf: 'center',
- top: 10,
zIndex: 999,
- borderRadius: 10,
+ marginTop: 10,
+ borderBottomLeftRadius: 10,
+ borderBottomRightRadius: 10,
paddingHorizontal: 20,
paddingVertical: 10,
gap: 10,
},
+ optionContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ borderColor: 'rgba(0, 0, 0, 0.1)',
+ },
});
diff --git a/src/components/HorizontalAddCard.tsx b/src/components/HorizontalAddCard.tsx
new file mode 100644
index 000000000..7089a487c
--- /dev/null
+++ b/src/components/HorizontalAddCard.tsx
@@ -0,0 +1,93 @@
+import React from 'react';
+import { Box, useColorMode } from 'native-base';
+import { ActivityIndicator, StyleSheet, TouchableOpacity, ViewStyle } from 'react-native';
+import AddCardIcon from 'src/assets/images/add_white.svg';
+import Colors from 'src/theme/Colors';
+import { hp, wp } from 'src/constants/responsive';
+import Text from './KeeperText';
+import HexagonIcon from './HexagonIcon';
+
+type AddSignerCardProps = {
+ name: string;
+ callback?: (param: any) => void;
+ cardStyles?: ViewStyle;
+ iconWidth?: number;
+ iconHeight?: number;
+ loading?: boolean;
+ borderColor?: string;
+ nameColor?: string;
+ icon?: any;
+ KeyIcon?: any;
+ isAddWallet?: boolean;
+};
+
+function HorizontalAddCard({
+ name,
+ callback,
+ cardStyles,
+ iconWidth = 40,
+ iconHeight = 34,
+ loading = false,
+ borderColor,
+ nameColor,
+ isAddWallet,
+ KeyIcon,
+ icon = ,
+}: AddSignerCardProps) {
+ const { colorMode } = useColorMode();
+ return (
+ callback(name)}
+ >
+
+
+
+ {KeyIcon ? : null}
+
+ {name}
+
+
+ {loading ? : null}
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ AddCardContainer: {
+ width: '100%',
+ padding: wp(20),
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ borderRadius: 10,
+ borderWidth: 1.5,
+ borderStyle: 'dashed',
+ },
+ nameStyle: {
+ fontSize: 14,
+ lineHeight: 20,
+ textAlign: 'left',
+ },
+ detailContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ width: '100%',
+ },
+});
+
+export default HorizontalAddCard;
diff --git a/src/components/KeeperHeader.tsx b/src/components/KeeperHeader.tsx
index 5c9255faf..6278b9dc3 100644
--- a/src/components/KeeperHeader.tsx
+++ b/src/components/KeeperHeader.tsx
@@ -35,15 +35,17 @@ type Props = {
topRightComponent?: Element;
};
-const BackButton = ({ onPress, colorMode, contrastScreen, styles }: any) => (
-
-
- {colorMode === 'light' && !contrastScreen ? : }
-
-
-);
+function BackButton({ onPress, colorMode, contrastScreen, styles }: any) {
+ return (
+
+
+ {colorMode === 'light' && !contrastScreen ? : }
+
+
+ );
+}
-const LearnMoreButton = ({
+function LearnMoreButton({
onPress,
learnBackgroundColor,
learnTextColor,
@@ -51,32 +53,37 @@ const LearnMoreButton = ({
colorMode,
common,
styles,
-}: any) => (
-
-
-
-
- {common.learnMore}
-
-
-
-
-);
+}: any) {
+ return (
+
+
+
+
+ {common.learnMore}
+
+
+
+
+ );
+}
-const HeaderInfo = ({
+function HeaderInfo({
title,
subtitle,
titleColor,
@@ -86,36 +93,38 @@ const HeaderInfo = ({
icon,
colorMode,
styles,
-}: any) => (
-
- {icon && icon}
-
- {title && (
-
- {title}
-
- )}
- {subtitle ? (
-
- {subtitle}
-
- ) : (
-
- )}
+}: any) {
+ return (
+
+ {icon && icon}
+
+ {title && (
+
+ {title}
+
+ )}
+ {subtitle ? (
+
+ {subtitle}
+
+ ) : (
+
+ )}
+
-
-);
+ );
+}
-const KeeperHeader = ({
+function KeeperHeader({
title = '',
subtitle = '',
titleColor,
@@ -139,7 +148,7 @@ const KeeperHeader = ({
headerInfoPadding = 8,
simple = false,
topRightComponent = null,
-}: Props) => {
+}: Props) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
const { translations } = useContext(LocalizationContext);
@@ -182,7 +191,7 @@ const KeeperHeader = ({
{rightComponent ? (
{rightComponent}
) : (
-
+
)}
);
@@ -229,7 +238,7 @@ const KeeperHeader = ({
{availableBalance && {availableBalance} }
);
-};
+}
const getStyles = (
rightComponentPadding: number | `${number}%`,
diff --git a/src/components/KeeperTextInput.tsx b/src/components/KeeperTextInput.tsx
index a0fd16e49..9e93625c2 100644
--- a/src/components/KeeperTextInput.tsx
+++ b/src/components/KeeperTextInput.tsx
@@ -1,8 +1,8 @@
import { StyleSheet } from 'react-native';
import React from 'react';
import { Input, useColorMode, Box } from 'native-base';
-import KeeperText from './KeeperText';
import Colors from 'src/theme/Colors';
+import KeeperText from './KeeperText';
function KeeperTextInput({
placeholder,
@@ -30,7 +30,7 @@ function KeeperTextInput({
borderColor={inpuBorderColor || `${colorMode}.greyBorder`}
>
{
+function KeyAddedModal({ visible, close, signer }) {
const navigation = useNavigation();
const { colorMode } = useColorMode();
@@ -30,27 +31,33 @@ const KeyAddedModal = ({ visible, close, signer }) => {
const { buttonText, buttonCallback, secondaryButtonText, content } = defaultConfig;
return (
- (
-
-
- {content}
-
- )}
- />
+ signer && (
+ (
+
+
+ {content}
+
+ )}
+ />
+ )
);
-};
+}
const styles = StyleSheet.create({
externalKeyModal: {
diff --git a/src/components/MessagePreview.tsx b/src/components/MessagePreview.tsx
index bed9aa7b6..3934a5a14 100644
--- a/src/components/MessagePreview.tsx
+++ b/src/components/MessagePreview.tsx
@@ -4,6 +4,7 @@ import { Box, useColorMode } from 'native-base';
import Text from 'src/components/KeeperText';
import KeeperIcon from 'src/assets/images/keeper-icon.svg';
import KeeperNameIcon from 'src/assets/images/keeper-name-icon.svg';
+import KeeperNameIconDark from 'src/assets/images/keeper-name-icon-dark.svg';
import { hp, wp } from 'src/constants/responsive';
type MessagePreviewProps = {
@@ -25,7 +26,7 @@ function MessagePreview({ title, description, link }: MessagePreviewProps) {
-
+ {colorMode === 'light' ? : }
{link}
diff --git a/src/components/OptionDropdown.tsx b/src/components/OptionDropdown.tsx
new file mode 100644
index 000000000..e90d848aa
--- /dev/null
+++ b/src/components/OptionDropdown.tsx
@@ -0,0 +1,169 @@
+import { Box, Pressable, useColorMode } from 'native-base';
+import { StyleSheet, TouchableOpacity } from 'react-native';
+import RightArrowIcon from 'src/assets/images/icon_arrow.svg';
+import { hp, wp } from 'src/constants/responsive';
+import { useEffect, useState } from 'react';
+import Text from 'src/components/KeeperText';
+import TickIcon from 'src/assets/images/icon_check.svg';
+
+type Option = {
+ label: string;
+ value: string | number;
+};
+
+type Props = {
+ label: string;
+ options: Option[];
+ selectedOption: Option | null;
+ onOptionSelect: (option: Option) => void;
+};
+
+function OptionDropdown({ label, options, selectedOption, onOptionSelect }: Props) {
+ const { colorMode } = useColorMode();
+ const [isOpen, setIsOpen] = useState(false);
+ const [internalSelectedOption, setInternalSelectedOption] = useState(
+ selectedOption
+ );
+
+ const handlePress = () => {
+ setIsOpen(!isOpen);
+ };
+
+ const handleOptionSelect = (option: Option) => {
+ setInternalSelectedOption(option);
+ onOptionSelect(option);
+ setIsOpen(false);
+ };
+
+ useEffect(() => {
+ if (selectedOption) {
+ setInternalSelectedOption(selectedOption);
+ }
+ }, [selectedOption]);
+
+ return (
+
+
+
+
+ {selectedOption ? `${selectedOption.label}` : label}
+
+
+
+
+
+
+
+
+
+
+ {isOpen && (
+
+ {options.map((option, index) => (
+ handleOptionSelect(option)}
+ >
+
+
+ {`${option.label}`}
+
+ {internalSelectedOption?.value === option.value && }
+
+ {index !== options.length - 1 && (
+
+ )}
+
+ ))}
+
+ )}
+
+ );
+}
+
+export default OptionDropdown;
+
+const styles = StyleSheet.create({
+ dropdownContainer: {
+ borderRadius: 10,
+ height: hp(50),
+ paddingRight: wp(20),
+ paddingLeft: wp(10),
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ borderWidth: 1,
+ },
+ arrowContainer: {
+ flexDirection: 'row',
+ height: '100%',
+ gap: wp(20),
+ },
+ labelText: {
+ fontSize: 12,
+ },
+ optionText: {
+ fontSize: 13,
+ },
+ emptyView: {
+ height: hp(23),
+ alignSelf: 'center',
+ width: 2,
+ opacity: 0.23,
+ },
+ icArrow: {
+ alignSelf: 'center',
+ },
+ optionsContainer: {
+ paddingTop: hp(10),
+ flexDirection: 'column',
+ justifyContent: 'flex-start',
+ gap: hp(10),
+ zIndex: 999,
+ marginTop: hp(5),
+ borderBottomLeftRadius: 10,
+ borderBottomRightRadius: 10,
+ },
+ optionContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingTop: hp(10),
+ paddingBottom: hp(15),
+ paddingHorizontal: wp(20),
+ },
+ separator: {
+ height: 1,
+ alignSelf: 'center',
+ width: '90%',
+ },
+});
diff --git a/src/components/OptionPicker.tsx b/src/components/OptionPicker.tsx
new file mode 100644
index 000000000..9339598d1
--- /dev/null
+++ b/src/components/OptionPicker.tsx
@@ -0,0 +1,161 @@
+import { Box, Pressable, useColorMode } from 'native-base';
+import { StyleSheet } from 'react-native';
+import RightArrowIcon from 'src/assets/images/icon_arrow.svg';
+import { hp, wp } from 'src/constants/responsive';
+import { useEffect, useState } from 'react';
+import Text from 'src/components/KeeperText';
+import TickIcon from 'src/assets/images/icon_check.svg';
+import KeeperModal from './KeeperModal';
+
+type Option = {
+ label: string;
+ value: number | String;
+};
+
+type Props = {
+ label: string;
+ options: Option[];
+ selectedOption: Option | null;
+ onOptionSelect: (option: Option) => void;
+};
+
+function SelectableDropdown({ label, options, selectedOption, onOptionSelect }: Props) {
+ const { colorMode } = useColorMode();
+ const [isOpen, setIsOpen] = useState(false);
+ const [internalSelectedOption, setInternalSelectedOption] = useState (
+ selectedOption
+ );
+
+ const handlePress = () => {
+ setIsOpen(!isOpen);
+ };
+
+ const handleOptionSelect = (option: Option) => {
+ setInternalSelectedOption(option);
+ onOptionSelect(option);
+ setIsOpen(false);
+ };
+
+ useEffect(() => {
+ if (selectedOption) {
+ setInternalSelectedOption(selectedOption);
+ }
+ }, [selectedOption]);
+
+ const optionsContent = (
+
+ {options.map((option, index) => (
+ handleOptionSelect(option)}>
+
+
+ {option.label}
+
+ {internalSelectedOption?.value === option?.value && }
+
+ {index !== options.length - 1 && (
+
+ )}
+
+ ))}
+
+ );
+
+ return (
+
+
+
+
+ {selectedOption ? `${selectedOption.label}` : label}
+
+
+
+
+
+
+
+
+
+
+
+ setIsOpen(false)}
+ showCloseIcon={false}
+ Content={() => optionsContent}
+ />
+
+ );
+}
+
+export default SelectableDropdown;
+
+const styles = StyleSheet.create({
+ dropdownContainer: {
+ borderRadius: 10,
+ height: hp(50),
+ paddingHorizontal: wp(20),
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ borderWidth: 1,
+ },
+ arrowContainer: {
+ flexDirection: 'row',
+ height: '100%',
+ gap: wp(20),
+ },
+ labelText: {
+ fontSize: 12,
+ },
+ optionText: {
+ fontSize: 14,
+ },
+ emptyView: {
+ height: hp(23),
+ alignSelf: 'center',
+ width: 2,
+ opacity: 0.23,
+ },
+ icArrow: {
+ alignSelf: 'center',
+ },
+ optionsContainer: {
+ paddingVertical: hp(10),
+ flexDirection: 'column',
+ justifyContent: 'flex-start',
+ gap: hp(10),
+ },
+ optionContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingTop: hp(10),
+ paddingBottom: hp(15),
+ },
+ separator: {
+ height: 1,
+ },
+});
diff --git a/src/components/PendingHealthCheckModal.tsx b/src/components/PendingHealthCheckModal.tsx
index 10650e8f3..1ced670c9 100644
--- a/src/components/PendingHealthCheckModal.tsx
+++ b/src/components/PendingHealthCheckModal.tsx
@@ -13,6 +13,7 @@ import { wp, hp } from 'src/constants/responsive';
import SignerCard from 'src/screens/AddSigner/SignerCard';
import { SDIcons } from 'src/screens/Vault/SigningDeviceIcons';
import { LocalizationContext } from 'src/context/Localization/LocContext';
+import { getKeyUID } from 'src/utils/utilities';
const PendingHealthCheckModal = ({
selectedItem,
@@ -37,7 +38,7 @@ const PendingHealthCheckModal = ({
const countPendingHealthChecks = () => {
let count = 0;
keys.forEach((item) => {
- const signer = vaultKeys?.length ? signerMap[item.masterFingerprint] : item;
+ const signer = vaultKeys?.length ? signerMap[getKeyUID(item)] : item;
if (isHealthCheckPending(signer, vaultKeys, selectedItem)) {
count++;
}
@@ -76,7 +77,7 @@ const PendingHealthCheckModal = ({
const pendingSigners = keys
.map((item) => {
- const signer = vaultKeys?.length ? signerMap[item.masterFingerprint] : item;
+ const signer = vaultKeys?.length ? signerMap[getKeyUID(item)] : item;
return { item, signer };
})
.filter(({ signer }) => isHealthCheckPending(signer, vaultKeys, vault));
@@ -86,7 +87,7 @@ const PendingHealthCheckModal = ({
{pendingSigners.map(({ item, signer }) => {
return (
{
const serializedPSBTEnvelop = {
@@ -37,8 +43,9 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
const [keystoneModal, setKeystoneModal] = useState(false);
const [jadeModal, setJadeModal] = useState(false);
const [specterModal, setSpecterModal] = useState(false);
- const [tapSignerModal, setTapSignerModal] = useState(false);
+ const [tapsignerModal, setTapsignerModal] = useState(false);
const [confirmPassVisible, setConfirmPassVisible] = useState(false);
+ const [portalModal, setPortalModal] = useState(false);
const card = useRef(new CKTapCard()).current;
const { withModal, nfcVisible: TSNfcVisible } = useTapsignerModal(card);
@@ -89,11 +96,14 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
setSpecterModal(true);
break;
case SignerType.TAPSIGNER:
- setTapSignerModal(true);
+ setTapsignerModal(true);
break;
case SignerType.MY_KEEPER:
setConfirmPassVisible(true);
break;
+ case SignerType.PORTAL:
+ setPortalModal(true);
+ break;
case SignerType.SEED_WORDS:
navigation.dispatch(
CommonActions.navigate({
@@ -110,7 +120,7 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
}
};
- const navigateToShowPSBT = (signedSerializedPSBT) => {
+ const navigateToShowPSBT = (signedSerializedPSBT: string) => {
navigation.dispatch(
CommonActions.navigate({
name: 'ShowPSBT',
@@ -125,7 +135,7 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
);
};
- const signTransaction = async ({ seedBasedSingerMnemonic }) => {
+ const signTransaction = async ({ seedBasedSingerMnemonic, tapsignerCVC, portalCVC }) => {
try {
if (SignerType.SEED_WORDS === signerType) {
const { signedSerializedPSBT } = await signTransactionWithSeedWords({
@@ -151,10 +161,78 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
} else if (SignerType.MY_KEEPER === signerType) {
let signedSerializedPSBT: string;
const key = signer.signerXpubs[XpubTypes.P2WSH][0];
- signedSerializedPSBT = signCosignerPSBT(key.xpriv, serializedPSBTEnvelop.serializedPSBT);
+ signedSerializedPSBT = signCosignerPSBT(
+ signer.masterFingerprint,
+ key.xpriv,
+ serializedPSBTEnvelop.serializedPSBT
+ );
if (signedSerializedPSBT) {
navigateToShowPSBT(signedSerializedPSBT);
}
+ } else if (SignerType.TAPSIGNER === signerType) {
+ const currentKey = {
+ derivationPath: signer.signerXpubs[XpubTypes.P2WSH][0].derivationPath,
+ };
+ const inputs = getInputsFromPSBT(serializedPSBTEnvelop.serializedPSBT);
+ const inputsToSign = getInputsToSignFromPSBT(serializedPSBTEnvelop.serializedPSBT, signer);
+ const signingPayload = [
+ {
+ payloadTarget: signer.type,
+ inputsToSign,
+ inputs,
+ },
+ ];
+
+ const { signingPayload: signedPayload } = await signTransactionWithTapsigner({
+ setTapsignerModal,
+ signingPayload,
+ currentKey,
+ withModal,
+ defaultVault: {},
+ serializedPSBT: serializedPSBTEnvelop.serializedPSBT,
+ card,
+ cvc: tapsignerCVC,
+ signer,
+ });
+ const psbt = bitcoin.Psbt.fromBase64(serializedPSBTEnvelop.serializedPSBT);
+ signedPayload[0].inputsToSign.forEach(
+ ({ inputIndex, signature, publicKey, sighashType }) => {
+ psbt.addSignedDigest(
+ inputIndex,
+ Buffer.from(publicKey, 'hex'),
+ Buffer.from(signature, 'hex'),
+ sighashType
+ );
+ }
+ );
+ const signedPSBT = psbt.toBase64();
+ dispatch(
+ healthCheckStatusUpdate([
+ {
+ signerId: signer.masterFingerprint,
+ status: hcStatusType.HEALTH_CHECK_SIGNING,
+ },
+ ])
+ );
+ return signedPSBT;
+ } else if (SignerType.PORTAL === signerType) {
+ const { signedSerializedPSBT } = await signTransactionWithPortal({
+ setPortalModal,
+ withNfcModal,
+ serializedPSBTEnvelop,
+ closeNfc,
+ vault: {},
+ portalCVC,
+ });
+ dispatch(
+ healthCheckStatusUpdate([
+ {
+ signerId: signer.masterFingerprint,
+ status: hcStatusType.HEALTH_CHECK_SIGNING,
+ },
+ ])
+ );
+ return signedSerializedPSBT;
}
} catch (error) {
console.log('🚀 ~ signTransaction ~ error:', error);
@@ -178,6 +256,7 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
},
])
);
+ navigateToShowPSBT(signedSerializedPSBT);
};
const vaultKeys = {
@@ -215,7 +294,7 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
vaultKeys={[vaultKeys]}
activeXfp={vaultKeys.masterFingerprint}
coldCardModal={coldCardModal}
- tapsignerModal={tapSignerModal}
+ tapsignerModal={tapsignerModal}
ledgerModal={ledgerModal}
otpModal={false}
passwordModal={false}
@@ -228,6 +307,7 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
bitbox02Modal={bitbox02modal}
otherSDModal={false}
specterModal={specterModal}
+ portalModal={portalModal}
setSpecterModal={setSpecterModal}
setOtherSDModal={() => {}}
setTrezorModal={setTrezorModal}
@@ -240,8 +320,9 @@ const RKSignersModal = ({ signer, psbt }, ref) => {
setColdCardModal={setColdCardModal}
setLedgerModal={setLedgerModal}
setPasswordModal={() => {}}
- setTapsignerModal={setTapSignerModal}
+ setTapsignerModal={setTapsignerModal}
showOTPModal={() => {}}
+ setPortalModal={setPortalModal}
signTransaction={signTransaction}
textRef={textRef}
isMultisig={isMultisig}
diff --git a/src/components/TransactionElement.tsx b/src/components/TransactionElement.tsx
index 7d94a1caf..a367eea55 100644
--- a/src/components/TransactionElement.tsx
+++ b/src/components/TransactionElement.tsx
@@ -95,17 +95,13 @@ function TransactionElement({
hideAmounts={false}
amount={transaction?.amount}
fontSize={16}
- color={`${colorMode}.dateText`}
+ color={`${colorMode}.primaryText`}
balanceMaxWidth={transaction?.amount < 10000000 ? wp(75) : wp(90)}
- variation={colorMode === 'light' ? 'dark' : 'light'}
+ variation={colorMode === 'light' ? 'richBlack' : 'light'}
/>
{transaction?.amount < 10000000 && (
- {colorMode === 'dark' ? (
-
- ) : (
-
- )}
+ {colorMode === 'dark' ? : }
)}
@@ -118,7 +114,7 @@ const styles = StyleSheet.create({
container: {
flexDirection: 'row',
borderRadius: 10,
- height: hp(80),
+ height: hp(76),
justifyContent: 'space-between',
alignItems: 'center',
borderBottomWidth: 1,
diff --git a/src/components/UploadImage.tsx b/src/components/UploadImage.tsx
index feabafd54..ba00807f8 100644
--- a/src/components/UploadImage.tsx
+++ b/src/components/UploadImage.tsx
@@ -4,7 +4,7 @@ import { Box, useColorMode } from 'native-base';
import Text from 'src/components/KeeperText';
import { StyleSheet, TouchableOpacity } from 'react-native';
-import ImageIcon from 'src/assets/images/image.svg';
+import UploadIcon from 'src/assets/images/upload-icon.svg';
import { LocalizationContext } from 'src/context/Localization/LocContext';
type Props = {
@@ -29,7 +29,7 @@ function UploadImage({ onPress = () => {}, backgroundColor }: Props) {
}}
>
-
+
{importWallet.uploadFromGallery}
diff --git a/src/constants/Bitcoin.tsx b/src/constants/Bitcoin.tsx
index d2fb7c4eb..36fdca67f 100644
--- a/src/constants/Bitcoin.tsx
+++ b/src/constants/Bitcoin.tsx
@@ -184,7 +184,7 @@ export function CurrencyIcon({ symbol, styles = {} }) {
export const getCurrencyImageByRegion = (
currencyCode: string,
- type: 'light' | 'green' | 'dark' | 'grey' | 'slateGreen',
+ type: 'light' | 'green' | 'dark' | 'grey' | 'slateGreen' | 'richBlack',
currentCurrency: CurrencyKind,
BTCIcon: any
) => {
@@ -206,6 +206,9 @@ export const getCurrencyImageByRegion = (
case 'slateGreen':
styles.color = Colors.SlateGreen;
break;
+ case 'richBlack':
+ styles.color = Colors.RichBlack;
+ break;
default:
styles.color = Colors.White;
}
diff --git a/src/context/Localization/language/en.json b/src/context/Localization/language/en.json
index c8873e191..892c850da 100644
--- a/src/context/Localization/language/en.json
+++ b/src/context/Localization/language/en.json
@@ -82,7 +82,7 @@
"unconfirmed": "Unconfirmed",
"availableBalance": "Available Balance",
"transferPolicySet": "Transfer Policy is set at",
- "transactions": "Transactions",
+ "recentTransactions": "Recent Transactions",
"viewAll": "View All",
"addNewWalletOrImport": "Add a new wallet or import one",
"noTransYet": "You have no transactions yet",
@@ -109,7 +109,7 @@
"COLLABORATIVE": "COLLABORATIVE",
"VAULT": "VAULT",
"CANARY": "CANARY",
- "ARCHIVED": "ARCHIVED",
+ "ARCHIVED": "Archived",
"buyBitCoin": "Buy Bitcoin",
"inToThisWallet": "into this wallet",
"viewAllCoins": "View All Coins",
@@ -126,6 +126,10 @@
"dontShowAgain": "Don’t show me this message again",
"for": "For",
"goToBackup": "Go to Backup",
+ "Advisor": "Advisor",
+ "AssistedWallet": "Assisted Wallet",
+ "ASSISTED": "ASSISTED",
+ "TIMELOCKED": "TIMELOCKED",
"Receipt": "Receipt",
"Later": "Later",
"importing": "Importing",
@@ -143,7 +147,8 @@
"time": "time",
"times": "times",
"shareDetails": "Share Details",
- "upgrade": "Upgrade"
+ "upgrade": "Upgrade",
+ "Inheritancekey": "Inheritance Key"
},
"noInternet": {
"no": "No Internet",
@@ -329,7 +334,9 @@
"inputs": "Inputs",
"outputs": "Outputs",
"updateLabelSubTitle": "Optionally you can add a short note to the transactions",
- "advancedDetails": "Advanced Details"
+ "advancedDetails": "Advanced Details",
+ "transactionHistory": "Transaction History",
+ "viewAllRecords": "View all your records"
},
"DiscountCodes": {
"DiscountCodesTitle": "Buy new Hardware Signers",
@@ -560,9 +567,14 @@
"highCustom": "Network fee is more than 10% of the amount being sent. Consider using custom fee option.",
"highWait": "Network fee is 10% higher than usual. If not urgent, consider waiting for the fee to go down.",
"lowFee": "Network fee is less than 10% of the amount being sent.",
+ "toAssistedWallet": "To Assisted Wallet",
+ "assistedVaultHeaderSubtitle": "Creating a time-locked Assisted Wallet",
+ "addUserKeyTitle": "Add your key to the wallet",
+ "addAdvisorKeyTitle": "Add two advisor keys to your wallet",
"discardTnxTitle": "Invalid UTXO set",
"discardTnxSubTitle": "This transaction's UTXO has already been used.",
"discardTnxDesc": "Please discard this transaction and initiate a new one",
+ "AssistedVaultSubtitle": "An assisted vault with three App Keys on three separate devices.",
"transactionDetailsTitle": "Transaction Details",
"remoteSigningMessage": "Please sign the transaction with your Key before the timer runs out",
"ReviewTransaction": "Review the Transaction",
@@ -688,6 +700,14 @@
"archivedVaultsTitle": "Archived Vaults",
"archivedVaultsNote": "These are previous versions of this vault for reference or withdrawn if funds remaining.",
"archivedVaultEmptyTitle": "View Archived Vaults",
+ "timeLockSetupTitle": "Setup a Time-Lock Wallet",
+ "timeLockSetupNote": "Be mindful of the timelock duration. Setting an excessively long lockout period could lead to unforeseen difficulties in accessing funds.",
+ "timeLockCreatedTitle": "Time-lock Wallet Created Successfully!",
+ "timeLockCreatedSubtitle": "Degrading multi-key wallet for long term stacking",
+ "timeLockCautionTitle": "Caution: Time-Lock Wallet",
+ "timeLockCautionSubtitle": "Once the timelock is set, funds cannot be accessed until the specified time period has elapsed. In case of an urgent need for funds, there is no way to bypass the timelock.",
+ "timeLockDurationTitle": "Choose Unlock Time",
+ "timeLockDurationSubtitle": "A recovery path provides even more protection against losing coins. It automatically lowers the amount of signatures required if you don’t spend from your wallet for a long time.",
"archivedVaultEmptySubtitle": "All archived vaults for this vault will be available here.",
"verifyAddDesc": "Please download the Bitcoin Keeper desktop app from our website to connect",
"transactionToastMessage": "Transaction sent successfully! If the transaction isn’t visible, wait a moment and refresh.",
@@ -695,7 +715,46 @@
"selectTheTotalNumberOfKeys": "Select the total number of keys",
"requiredKeys": "Required Keys",
"minimumNumberOfKeysToSignATransaction": "Minimum number of keys to sign a transaction",
- "pleaseEnterVaultName": "Please enter a name for your vault"
+ "pleaseEnterVaultName": "Please enter a name for your vault",
+ "resetIKTitle": "Resetting Inheritance Key",
+ "resetIKDesc": "Re-vault to start the timer again on the Inheritance Key",
+ "revaultNow": "Revault Now",
+ "yourCurrentTimeline": "Your Current Timeline",
+ "changeTimeline": "Change Timeline",
+ "changeTimelineDesc": "You can re-vault it anytime for x months starting now or choose to change the timeline before proceeding",
+ "setTimelock": "Set time-lock",
+ "revaultTimelineChanged": "Revault Timeline Changed",
+ "revaultTimelineChangedDesc": "The activation timeline of Inheritance key has been reset to initial",
+ "timelockInfo": "This ensures your funds remain protected under the vault settings",
+ "timeLockOptionTitle": "Time-lock",
+ "timeLockOptionDesc": "View/reset when Inheritance Key unlocks",
+ "revaultYourVault": "Revault your vault",
+ "eligibleForRevault": "Your vault is eligible for revaulting, allowing you to secure your funds back into the vault and reset the timeline",
+ "unlockIKS": "Please upgrade to Diamond Hands to add an Inheritance Key to your vault.",
+ "addInheritanceKey": "Add Inheritance Key",
+ "addInheritanceKeyAfterKeys": "Add Inheritance Key after adding the usual keys (early access)",
+ "inheritanceKeyDesc": "Set an Inheritance key for your vault. This will act as a reserve key and will be activated if one of your key gets misplaced",
+ "setIKSForVault": "Set an Inheritance key for your vault",
+ "chooseAKey": "Choose a Key",
+ "IKSModalDesc": "This will be activated if one of your key gets misplaced",
+ "addReserveKey": "Add Reserve Key",
+ "availableAfterDelay": "Key will be available after time-delay",
+ "setTimeLock": "Set time-lock",
+ "reserveKeyNote": "A transaction will have to be made to reset the time-lock once key becomes available.",
+ "inheritanceKeyActivation": "Inheritance Key Activation",
+ "changeKey": "Change Key",
+ "reserveKeyUpgradeDesc": "Please upgrade to Diamond Hands to add an Inheritance Key to your vault.",
+ "setupNewVault": "Setup a new vault",
+ "setupVaultOption1Title": "Configure the vault",
+ "setupVaultOption1Description": "Define the total number of keys (n) and the minimum required to authorize transactions (m).",
+ "setupVaultOption2Title": "Personalize the vault",
+ "setupVaultOption2Description": "Name your vault and optionally add a description to make it easier to manage and identify.",
+ "setupVaultOption3Title": "Add Optional Inheritance Key",
+ "setupVaultOption3Description": "Setup a time-locked Inheritance Key as an additional key to help you give away your bitcoin to heirs.",
+ "selectActivationTime": "Select activation time",
+ "chooseNewActivationTimeTitle": "Choose New Activation Time",
+ "chooseNewActivationTimeDesc": "Please choose the new time for your Inheritance Key to become active",
+ "IKAlreadyActive": "Inheritance Key is already active"
},
"seed": {
"EnterSeed": "Enter Seeds",
@@ -1102,19 +1161,25 @@
"keyDeletedSuccessfully": "Key Deleted Successfully",
"keyDeletedSuccessMessage": "Your Key has been deleted successfully. You will have to add the Key again",
"manageKeys": "Manage Keys",
- "deleteVaultWarning": "Key is being used for Vault",
- "vaultWarningSubtitle": "The Key you are trying to hide is used in one of the visible vaults.",
- "deleteVaultInstruction": "Please delete the vault to perform this operation.",
+ "deleteVaultWarning": "Key Used in Hidden Vault",
+ "vaultWarningSubtitle": "The key you're trying to delete is being used in the hidden vault mentioned below.",
+ "deleteVaultInstruction": "Please change the key in the hidden vault, or delete the hidden vault, to delete this key.",
+ "deleteMultipleVaultWarning": "Key Used in Multiple Hidden Vaults",
+ "multipleVaultWarningSubtitle": "The key you're trying to delete is being used in the hidden vaults mentioned below.",
+ "deleteMultipleVaultInstruction": "Please change the key in the hidden vaults, or delete the hidden vaults, to delete this key",
"viewVault": "View Vault",
"back": "Back",
+ "continue": "Continue",
"enterPasscode": "Enter Passcode",
"confirmPasscodeToDeleteKey": "Confirm passcode to delete key",
"thisStepTakesTime": "This step will take a few seconds.",
"forgot2FA": "Forgot 2FA",
"forgot2FANote": "If you have lost your 2FA app, it is recommended that you remove SS and add a different key or SS again",
+ "noKeyAvailable": "No key available",
+ "pleaseAddKey": "Please add an external key to proceed forward",
"keyReceived": "Key Received",
- "keyReceiveMessage": "You have received an",
- "remoteKeyReceiveNote": "Please accept the key before the timer expires. If not accepted in time, you will have to request the key again.",
+ "keyReceiveMessage": "You have received an External Key",
+ "remoteKeyReceiveNote": "You can access this Key from Manage Keys on the home screen. This key can be used like any other key you add.",
"keyExpired": "Key Expired",
"keyExpireMessage": "You had received a Key from your contact. Unfortunately, the timer has run out.",
"signingRequestExpired": "Signing Request Expired",
@@ -1155,7 +1220,7 @@
"addKeyHardware": "Add key from a hardware",
"connectHardware": "Connect your hardware device",
"hardwareKeysHeader": "Hardware Keys",
- "connectHardwareDevices": "Connect your Hardware devices",
+ "connectHardwareDevices": "Connect your hardware devices",
"addSoftwareKey": "Add a software key",
"keysInApp": "In-app or external software signers",
"softwareKeysHeader": "Software Keys",
@@ -1169,7 +1234,9 @@
"subscriptionTierL1": "You can add all hardware devices from the",
"subscriptionTierL2": "Tier. Signing Server is unlocked at the",
"subscriptionTierL3": "Tier and Inheritance Key at",
- "notSupportedText": "If a particular signer is not supported, it will be indicated."
+ "notSupportedText": "If a particular signer is not supported, it will be indicated.",
+ "inheritanceKey": "Inheritance Key",
+ "designateAsInheritanceKey": "Designate a key as the Inheritance Key"
},
"inheritancePlanning": {
"BuyNewHardwareSigner": "Buy new Hardware Signers",
@@ -1191,10 +1258,11 @@
"signingServerCtaDescp": "Added on Hodler Tier",
"signingServerNotes": "Signing Server is a hot key. Please decide the amount you’d like to use Signing Server for, carefully.",
"inheritanceKey": "Inheritance Key",
- "inheritanceKeyDescp": "To be considered while inheritance planning",
- "inheritanceKeyParagraph2": "When a request is made to use this key for signing or recovery, there is a 30 day delay. This gives time to the user to decline the request if they don’t identify it. The request alerts are sent on the app and can also be sent on email or via sms.",
- "inheritanceKeyParagraph1": "Inheritance Key is an additional key available to increase the security of the vault without having to buy a hardware signer. It is available to all Diamond Hands subscribers.",
- "inheritanceKeyCtaTitle": "View Inheritance Key",
+ "inheritanceKeyOptionDesc": "Create a vault with Inheritance Key",
+ "inheritanceKeyDescp": "Add to any vault",
+ "inheritanceKeyParagraph2": "When the Inheritance Key is added to the vault a period to activate it is chosen. Until such a time it remains inactive. You can restart the timer anytime by performing re-vaulting.",
+ "inheritanceKeyParagraph1": "While creating a vault, you can assign any applicable key as Inheritance Key. This key can then be kept with the heir or a trusted party. It will become active only after a given period.",
+ "inheritanceKeyCtaTitle": "Create vault with Inheritance Key",
"inheritanceKeyCtaDescp": "Added on Diamond Hands Tier",
"inheritanceKeyCtaNotes": "Please provide detailed explanations and support to your heir via the inheritance document templates",
"secureUsageTips": "Secure Usage Tips",
@@ -1202,7 +1270,7 @@
"safeKeepingTips": "Key Safekeeping Tips",
"safeKeepingTipsDesp": "Key storage best practices",
"thoroughVeirifcationTitle": "Thorough Verification of Transaction Details",
- "thoroughParagraph1": "Carefully review all transaction details, particularly the recipient’s address, within your multi-key setup. This careful attention is essential to avoid errors and secure your transactions, ensuring the safety of your bitcoin.",
+ "thoroughParagraph1": "Carefully review all transaction details, particularly the recipient's address while sending sats. When receiving, your own address can be checked on multiple sources like the app itself and another hardware wallet.",
"thoroughParagraph2": "It is recommended to use atleast one hardware device with a screen. This allows to register your multi-key quorum on the device and thoroughly check transactions.",
"preliminaryTitle": "Preliminary Test Transactions",
"preliminaryParagraph1": "Before making significant transfers, conduct a small test transaction. This step verifies the transaction’s accuracy and confirms the smooth functioning of your multi-key setup, adding a protective layer to your bitcoin transactions.",
diff --git a/src/context/Localization/language/es.json b/src/context/Localization/language/es.json
index 8379cf65c..56c3d5529 100644
--- a/src/context/Localization/language/es.json
+++ b/src/context/Localization/language/es.json
@@ -82,7 +82,7 @@
"unconfirmed": "Unconfirmed",
"availableBalance": "Available Balance",
"transferPolicySet": "Transfer Policy is set at",
- "transactions": "Transactions",
+ "recentTransactions": "Recent Transactions",
"viewAll": "View All",
"addNewWalletOrImport": "Add a new wallet or import one",
"noTransYet": "You have no transactions yet",
@@ -109,7 +109,7 @@
"COLLABORATIVE": "COLLABORATIVE",
"VAULT": "VAULT",
"CANARY": "CANARY",
- "ARCHIVED": "ARCHIVED",
+ "ARCHIVED": "Archived",
"buyBitCoin": "Buy Bitcoin",
"inToThisWallet": "into this wallet",
"viewAllCoins": "View All Coins",
@@ -126,6 +126,10 @@
"dontShowAgain": "Don’t show me this message again",
"for": "For",
"goToBackup": "Go to Backup",
+ "Advisor": "Advisor",
+ "AssistedWallet": "Assisted Wallet",
+ "ASSISTED": "ASSISTED",
+ "TIMELOCKED": "TIMELOCKED",
"Receipt": "Receipt",
"Later": "Later",
"importing": "Importing",
@@ -143,7 +147,8 @@
"time": "time",
"times": "times",
"shareDetails": "Share Details",
- "upgrade": "Upgrade"
+ "upgrade": "Upgrade",
+ "Inheritancekey": "Inheritance Key"
},
"noInternet": {
"no": "No Internet",
@@ -330,7 +335,9 @@
"inputs": "Inputs",
"outputs": "Outputs",
"updateLabelSubTitle": "Optionally you can add a short note to the transactions",
- "advancedDetails": "Advanced Details"
+ "advancedDetails": "Advanced Details",
+ "transactionHistory": "Transaction History",
+ "viewAllRecords": "View all your records"
},
"DiscountCodes": {
"DiscountCodesTitle": "Buy new Hardware Signers",
@@ -560,9 +567,14 @@
"highCustom": "Network fee is more than 10% of the amount being sent. Consider using custom fee option.",
"highWait": "Network fee is 10% higher than usual. If not urgent, consider waiting for the fee to go down.",
"lowFee": "Network fee is less than 10% of the amount being sent.",
+ "toAssistedWallet": "To Assisted Wallet",
+ "assistedVaultHeaderSubtitle": "Creating a time-locked Assisted Wallet",
+ "addUserKeyTitle": "Add your key to the wallet",
+ "addAdvisorKeyTitle": "Add two advisor keys to your wallet",
"discardTnxTitle": "Invalid UTXO set",
"discardTnxSubTitle": "This transaction's UTXO has already been used.",
"discardTnxDesc": "Please discard this transaction and initiate a new one",
+ "AssistedVaultSubtitle": "An assisted vault with three App Keys on three separate devices.",
"transactionDetailsTitle": "Transaction Details",
"remoteSigningMessage": "Please sign the transaction with your Key before the timer runs out",
"ReviewTransaction": "Review the Transaction",
@@ -688,14 +700,61 @@
"archivedVaultsTitle": "Archived Vaults",
"archivedVaultsNote": "These are previous versions of this vault for reference or withdrawn if funds remaining.",
"archivedVaultEmptyTitle": "View Archived Vaults",
- "archivedVaultEmptySubtitle": "All archived vaults for this vault will be available here.",
+ "archivedVaultEmptySubtitle": "All archived vaults for this vault would be available here.",
+ "timeLockSetupTitle": "Setup a Time-Lock Wallet",
+ "timeLockSetupNote": "Be mindful of the timelock duration. Setting an excessively long lockout period could lead to unforeseen difficulties in accessing funds.",
+ "timeLockCreatedTitle": "Time-lock Wallet Created Successfully!",
+ "timeLockCreatedSubtitle": "Degrading multi-key wallet for long term stacking",
+ "timeLockCautionTitle": "Caution: Time-Lock Wallet",
+ "timeLockCautionSubtitle": "Once the timelock is set, funds cannot be accessed until the specified time period has elapsed. In case of an urgent need for funds, there is no way to bypass the timelock.",
+ "timeLockDurationTitle": "Choose Unlock Time",
+ "timeLockDurationSubtitle": "A recovery path provides even more protection against losing coins. It automatically lowers the amount of signatures required if you don’t spend from your wallet for a long time.",
"verifyAddDesc": "Please download the Bitcoin Keeper desktop app from our website to connect",
"transactionToastMessage": "Transaction sent successfully! If the transaction isn’t visible, wait a moment and refresh.",
"totalKeysForVaultConfiguration": "Total Keys for Vault Configuration",
"selectTheTotalNumberOfKeys": "Select the total number of keys",
"requiredKeys": "Required Keys",
"minimumNumberOfKeysToSignATransaction": "Minimum number of keys to sign a transaction",
- "pleaseEnterVaultName": "Please enter a name for your vault"
+ "pleaseEnterVaultName": "Please enter a name for your vault",
+ "resetIKTitle": "Resetting Inheritance Key",
+ "resetIKDesc": "Re-vault to start the timer again on the Inheritance Key",
+ "revaultNow": "Revault Now",
+ "yourCurrentTimeline": "Your Current Timeline",
+ "changeTimeline": "Change Timeline",
+ "changeTimelineDesc": "You can re-vault it anytime for x months starting now or choose to change the timeline before proceeding",
+ "setTimelock": "Set time-lock",
+ "revaultTimelineChanged": "Revault Timeline Changed",
+ "revaultTimelineChangedDesc": "The activation timeline of Inheritance key has been reset to initial",
+ "timelockInfo": "This ensures your funds remain protected under the vault settings",
+ "timeLockOptionTitle": "Time-lock",
+ "timeLockOptionDesc": "View/reset when Inheritance Key unlocks",
+ "revaultYourVault": "Revault your vault",
+ "eligibleForRevault": "Your vault is eligible for revaulting, allowing you to secure your funds back into the vault and reset the timeline",
+ "unlockIKS": "Please upgrade to Diamond Hands to add an Inheritance Key to your vault.",
+ "addInheritanceKey": "Add Inheritance Key",
+ "addInheritanceKeyAfterKeys": "Add Inheritance Key after adding the usual keys (early access)",
+ "inheritanceKeyDesc": "Set an Inheritance key for your vault. This will act as a reserve key and will be activated if one of your key gets misplaced",
+ "setIKSForVault": "Set an Inheritance key for your vault",
+ "chooseAKey": "Choose a Key",
+ "IKSModalDesc": "This will be activated if one of your key gets misplaced",
+ "addReserveKey": "Add Reserve Key",
+ "availableAfterDelay": "Key will be available after time-delay",
+ "setTimeLock": "Set time-lock",
+ "reserveKeyNote": "A transaction will have to be made to reset the time-lock once key becomes available.",
+ "inheritanceKeyActivation": "Inheritance Key Activation",
+ "changeKey": "Change Key",
+ "reserveKeyUpgradeDesc": "Please upgrade to Diamond Hands to add an Inheritance Key to your vault.",
+ "setupNewVault": "Setup a new vault",
+ "setupVaultOption1Title": "Configure the vault",
+ "setupVaultOption1Description": "Define the total number of keys (n) and the minimum required to authorize transactions (m).",
+ "setupVaultOption2Title": "Personalize the vault",
+ "setupVaultOption2Description": "Name your vault and optionally add a description to make it easier to manage and identify.",
+ "setupVaultOption3Title": "Add Optional Inheritance Key",
+ "setupVaultOption3Description": "Setup a time-locked Inheritance Key as an additional key to help you give away your bitcoin to heirs.",
+ "selectActivationTime": "Select activation time",
+ "chooseNewActivationTimeTitle": "Choose New Activation Time",
+ "chooseNewActivationTimeDesc": "Please choose the new time for your Inheritance Key to become active",
+ "IKAlreadyActive": "Inheritance Key is already active"
},
"seed": {
"EnterSeed": "Enter Seeds",
@@ -1099,19 +1158,25 @@
"keyDeletedSuccessfully": "Key Deleted Successfully",
"keyDeletedSuccessMessage": "Your Key has been deleted successfully. You will have to add the Key again",
"manageKeys": "Manage Keys",
- "deleteVaultWarning": "Key is being used for Vault",
- "vaultWarningSubtitle": "The Key you are trying to hide is used in one of the visible vaults.",
- "deleteVaultInstruction": "Please delete the vault to perform this operation.",
+ "deleteVaultWarning": "Key Used in Hidden Vault",
+ "vaultWarningSubtitle": "The key you're trying to delete is being used in the hidden vault mentioned below.",
+ "deleteVaultInstruction": "Please change the key in the hidden vault, or delete the hidden vault, to delete this key.",
+ "deleteMultipleVaultWarning": "Key Used in Multiple Hidden Vaults",
+ "multipleVaultWarningSubtitle": "The key you're trying to delete is being used in the hidden vaults mentioned below.",
+ "deleteMultipleVaultInstruction": "Please change the key in the hidden vaults, or delete the hidden vaults, to delete this key",
"viewVault": "View Vault",
"back": "Back",
+ "continue": "Continue",
"enterPasscode": "Enter Passcode",
"confirmPasscodeToDeleteKey": "Confirm passcode to delete key",
"thisStepTakesTime": "This step will take a few seconds.",
"forgot2FA": "Forgot 2FA",
"forgot2FANote": "If you have lost your 2FA app, it is recommended that you remove SS and add a different key or SS again",
+ "noKeyAvailable": "No key available",
+ "pleaseAddKey": "Please add an external key to proceed forward",
"keyReceived": "Key Received",
- "keyReceiveMessage": "You have received an",
- "remoteKeyReceiveNote": "Please accept the key before the timer expires. If not accepted in time, you will have to request the key again.",
+ "keyReceiveMessage": "You have received an External Key",
+ "remoteKeyReceiveNote": "You can access this Key from Manage Keys on the home screen. This key can be used like any other key you add.",
"keyExpired": "Key Expired",
"keyExpireMessage": "You had received a Key from your contact. Unfortunately, the timer has run out.",
"signingRequestExpired": "Signing Request Expired",
@@ -1152,7 +1217,7 @@
"addKeyHardware": "Add key from a hardware",
"connectHardware": "Connect your hardware device",
"hardwareKeysHeader": "Hardware Keys",
- "connectHardwareDevices": "Connect your Hardware devices",
+ "connectHardwareDevices": "Connect your hardware devices",
"addSoftwareKey": "Add a software key",
"keysInApp": "In-app or external software signers",
"softwareKeysHeader": "Software Keys",
@@ -1166,7 +1231,9 @@
"subscriptionTierL1": "You can add all hardware devices from the",
"subscriptionTierL2": "Tier. Signing Server is unlocked at the",
"subscriptionTierL3": "Tier and Inheritance Key at",
- "notSupportedText": "If a particular signer is not supported, it will be indicated."
+ "notSupportedText": "If a particular signer is not supported, it will be indicated.",
+ "inheritanceKey": "Inheritance Key",
+ "designateAsInheritanceKey": "Designate a key as the Inheritance Key"
},
"inheritancePlanning": {
"BuyNewHardwareSigner": "Buy new Hardware Signers",
@@ -1188,10 +1255,11 @@
"signingServerCtaDescp": "Added on Hodler Tier",
"signingServerNotes": "Signing Server is a hot key. Please decide the amount you’d like to use Signing Server for, carefully.",
"inheritanceKey": "Inheritance Key",
- "inheritanceKeyDescp": "To be considered while inheritance planning",
- "inheritanceKeyParagraph2": "When a request is made to use this key for signing or recovery, there is a 30 day delay. This gives time to the user to decline the request if they don’t identify it. The request alerts are sent on the app and can also be sent on email or via sms.",
- "inheritanceKeyParagraph1": "Inheritance Key is an additional key available to increase the security of the vault without having to buy a hardware signer. It is available to all Diamond Hands subscribers.",
- "inheritanceKeyCtaTitle": "View Inheritance Key",
+ "inheritanceKeyOptionDesc": "Create a vault with Inheritance Key",
+ "inheritanceKeyDescp": "Add to any vault",
+ "inheritanceKeyParagraph2": "When the Inheritance Key is added to the vault a period to activate it is chosen. Until such a time it remains inactive. You can restart the timer anytime by performing re-vaulting.",
+ "inheritanceKeyParagraph1": "While creating a vault, you can assign any applicable key as Inheritance Key. This key can then be kept with the heir or a trusted party. It will become active only after a given period.",
+ "inheritanceKeyCtaTitle": "Create vault with Inheritance Key",
"inheritanceKeyCtaDescp": "Added on Diamond Hands Tier",
"inheritanceKeyCtaNotes": "Please provide detailed explanations and support to your heir via the inheritance document templates",
"secureUsageTips": "Secure Usage Tips",
@@ -1199,7 +1267,7 @@
"safeKeepingTips": "Key Safekeeping Tips",
"safeKeepingTipsDesp": "Key storage best practices",
"thoroughVeirifcationTitle": "Thorough Verification of Transaction Details",
- "thoroughParagraph1": "Carefully review all transaction details, particularly the recipient’s address, within your multi-key setup. This careful attention is essential to avoid errors and secure your transactions, ensuring the safety of your bitcoin.",
+ "thoroughParagraph1": "Carefully review all transaction details, particularly the recipient's address while sending sats. When receiving, your own address can be checked on multiple sources like the app itself and another hardware wallet.",
"thoroughParagraph2": "It is recommended to use atleast one hardware device with a screen. This allows to register your multi-key quorum on the device and thoroughly check transactions.",
"preliminaryTitle": "Preliminary Test Transactions",
"preliminaryParagraph1": "Before making significant transfers, conduct a small test transaction. This step verifies the transaction’s accuracy and confirms the smooth functioning of your multi-key setup, adding a protective layer to your bitcoin transactions.",
diff --git a/src/hardware/bitbox/index.ts b/src/hardware/bitbox/index.ts
index f99bbc165..52e8fd136 100644
--- a/src/hardware/bitbox/index.ts
+++ b/src/hardware/bitbox/index.ts
@@ -1,15 +1,14 @@
/* eslint-disable no-await-in-loop */
import { SignerType } from 'src/services/wallets/enums';
import { Signer, Vault } from 'src/services/wallets/interfaces/vault';
+import { getKeyUID } from 'src/utils/utilities';
export const getWalletConfigForBitBox02 = ({ vault, signer }: { vault: Vault; signer: Signer }) => {
const ourXPubIndex = vault.signers.findIndex(
- (vaultKey) =>
- signer.type === SignerType.BITBOX02 && signer.masterFingerprint === vaultKey.masterFingerprint
+ (vaultKey) => signer.type === SignerType.BITBOX02 && getKeyUID(signer) === getKeyUID(vaultKey)
);
const keypathAccountDerivation = vault.signers.find(
- (vaultKey) =>
- signer.type === SignerType.BITBOX02 && signer.masterFingerprint === vaultKey.masterFingerprint
+ (vaultKey) => signer.type === SignerType.BITBOX02 && getKeyUID(signer) === getKeyUID(vaultKey)
).derivationPath;
return {
ourXPubIndex,
diff --git a/src/hardware/index.ts b/src/hardware/index.ts
index 3d7c4e210..ff9eef2a2 100644
--- a/src/hardware/index.ts
+++ b/src/hardware/index.ts
@@ -115,26 +115,6 @@ export const generateSignerFromMetaData = ({
return { signer, key };
};
-export const getSignerFromRemoteData = (signer) => {
- return {
- ...signer,
- addedOn: new Date(),
- archived: false,
- healthCheckDetails: [
- {
- type: hcStatusType.HEALTH_CHECK_SD_ADDITION,
- actionDate: new Date(),
- },
- ],
- hidden: false,
- isMock: false,
- lastHealthCheck: new Date(),
- signerDescription: null,
- signerName: 'External Key',
- storageType: SignerStorage.COLD,
- type: SignerType.KEEPER,
- };
-};
export const getSignerDescription = (signer?: Signer) => {
const fullName = `${signer?.extraData?.givenName || ''} ${
diff --git a/src/hardware/portal/index.ts b/src/hardware/portal/index.ts
index 6741f7069..fe0341509 100644
--- a/src/hardware/portal/index.ts
+++ b/src/hardware/portal/index.ts
@@ -194,14 +194,14 @@ export const signPSBT = (psbt: string) => {
return sdk.signPsbt(psbt);
};
-export const getXpub = ({ isMultisig = true }) => {
+export const getXpub = ({ accountNumber, isMultisig = true }) => {
const derivationPath = isMultisig
? isTestnet()
- ? 'm/48h/1h/0h/2h'
- : 'm/48h/0h/0h/2h'
+ ? `m/48h/1h/${accountNumber}h/2h`
+ : `m/48h/0h/${accountNumber}h/2h`
: isTestnet()
- ? 'm/84h/1h/0h'
- : 'm/84h/0h/0h';
+ ? `m/84h/1h/${accountNumber}h`
+ : `m/84h/0h/${accountNumber}h`;
return sdk.getXpub(derivationPath);
};
@@ -227,4 +227,4 @@ export const PORTAL_ERRORS = {
PORTAL_NOT_INITIALIZED: 'Portal not initialized',
CVC_MISMATCH: 'CVC does not match',
UNVERIFIED_MNEMONIC: 'Unverified mnemonic',
-};
\ No newline at end of file
+};
diff --git a/src/hardware/tapsigner/index.ts b/src/hardware/tapsigner/index.ts
index 4d37277f5..ec5bc2c24 100644
--- a/src/hardware/tapsigner/index.ts
+++ b/src/hardware/tapsigner/index.ts
@@ -9,10 +9,10 @@ import NFC from 'src/services/nfc';
import { CommonActions } from '@react-navigation/native';
import { xpubToTpub } from 'src/hardware';
-const getScriptSpecificDetails = async (card, cvc, isTestnet, isMultisig) => {
+const getScriptSpecificDetails = async (card, cvc, isTestnet, isMultisig, account) => {
const xpubDetails: XpubDetailsType = {};
// fetch P2WPKH details
- const singleSigPath = WalletUtilities.getDerivationForScriptType(ScriptTypes.P2WPKH);
+ const singleSigPath = WalletUtilities.getDerivationForScriptType(ScriptTypes.P2WPKH, account);
await card.set_derivation(singleSigPath.split("'").join('h'), cvc);
let singleSigXpub = await card.get_xpub(cvc);
if (isTestnet) {
@@ -20,7 +20,7 @@ const getScriptSpecificDetails = async (card, cvc, isTestnet, isMultisig) => {
}
xpubDetails[XpubTypes.P2WPKH] = { xpub: singleSigXpub, derivationPath: singleSigPath };
// fetch P2WSH details
- const multiSigPath = WalletUtilities.getDerivationForScriptType(ScriptTypes.P2WSH);
+ const multiSigPath = WalletUtilities.getDerivationForScriptType(ScriptTypes.P2WSH, account);
await card.set_derivation(multiSigPath.split("'").join('h'), cvc);
let multiSigXpub = await card.get_xpub(cvc);
if (isTestnet) {
@@ -43,7 +43,8 @@ export const getTapsignerDetails = async (
card: CKTapCard,
cvc: string,
isTestnet: boolean,
- isMultisig: boolean
+ isMultisig: boolean,
+ account: number
) => {
const status = await card.first_look();
const isLegit = await card.certificate_check();
@@ -53,7 +54,7 @@ export const getTapsignerDetails = async (
}
if (status.path) {
const { xpub, masterFingerprint, derivationPath, xpubDetails } =
- await getScriptSpecificDetails(card, cvc, isTestnet, isMultisig);
+ await getScriptSpecificDetails(card, cvc, isTestnet, isMultisig, account);
// reset to original path
await card.set_derivation(status.path, cvc);
return { xpub, masterFingerprint, derivationPath, xpubDetails };
@@ -69,7 +70,8 @@ export const getTapsignerDetails = async (
newCard,
cvc,
isTestnet,
- isMultisig
+ isMultisig,
+ account
);
await card.set_derivation(newCard.path, cvc);
return { xpub, masterFingerprint, derivationPath, xpubDetails };
diff --git a/src/hardware/usbSigner/index.ts b/src/hardware/usbSigner/index.ts
index c727b9ae1..2bf1fcee8 100644
--- a/src/hardware/usbSigner/index.ts
+++ b/src/hardware/usbSigner/index.ts
@@ -4,11 +4,21 @@ import { HWErrorType } from 'src/models/enums/Hardware';
import HWError from '../HWErrorState';
export const getUSBSignerDetails = (data, isMultisig) => {
try {
- const { multiSigPath, multiSigXpub, singleSigPath, singleSigXpub, mfp } = data;
+ const {
+ multiSigPath,
+ multiSigXpub,
+ singleSigPath,
+ singleSigXpub,
+ taprootPath,
+ taprootXpub,
+ mfp,
+ } = data;
const xpubDetails: XpubDetailsType = {};
xpubDetails[XpubTypes.P2WPKH] = { xpub: singleSigXpub, derivationPath: singleSigPath };
xpubDetails[XpubTypes.P2WSH] = { xpub: multiSigXpub, derivationPath: multiSigPath };
+ xpubDetails[XpubTypes.P2TR] = { xpub: taprootXpub, derivationPath: taprootPath };
const xpub = isMultisig ? multiSigXpub : singleSigXpub;
+ // TODO: Not actually used for USB signer, should eventually remove
const derivationPath = isMultisig ? multiSigPath : singleSigPath;
return {
xpub,
diff --git a/src/hooks/useAssistedWallet.ts b/src/hooks/useAssistedWallet.ts
new file mode 100644
index 000000000..abda51256
--- /dev/null
+++ b/src/hooks/useAssistedWallet.ts
@@ -0,0 +1,21 @@
+import { RealmSchema } from 'src/storage/realm/enum';
+import { Vault } from 'src/services/wallets/interfaces/vault';
+import { getJSONFromRealmObject } from 'src/storage/realm/utils';
+import { VaultType } from 'src/services/wallets/enums';
+import { useQuery } from '@realm/react';
+
+const useAssistedWallet = () => {
+ const queryFilter = `type == "${VaultType.ASSISTED}"`;
+
+ const assistedWallets: Vault[] = useQuery(RealmSchema.Vault).filtered(queryFilter);
+
+ if (!assistedWallets || !assistedWallets.length) {
+ return { assistedWallets: [] };
+ }
+
+ return {
+ assistedWallets: assistedWallets.map(getJSONFromRealmObject) as Vault[],
+ };
+};
+
+export default useAssistedWallet;
diff --git a/src/hooks/useBalance.tsx b/src/hooks/useBalance.tsx
index ee14e83c0..9eca1d0c6 100644
--- a/src/hooks/useBalance.tsx
+++ b/src/hooks/useBalance.tsx
@@ -33,7 +33,7 @@ const useBalance = () => {
const getCurrencyIcon = (
Icon: any,
- variation: 'light' | 'green' | 'dark' | 'grey' | 'slateGreen'
+ variation: 'light' | 'green' | 'dark' | 'grey' | 'slateGreen' | 'richBlack'
) => getCurrencyImageByRegion(currencyCode, variation, currentCurrency, Icon);
const getFiatCurrencyIcon = (variation: 'light' | 'green' | 'dark' | 'grey') =>
diff --git a/src/hooks/useConfigReocvery.tsx b/src/hooks/useConfigReocvery.tsx
index 39e612e5e..8cf167cef 100644
--- a/src/hooks/useConfigReocvery.tsx
+++ b/src/hooks/useConfigReocvery.tsx
@@ -7,7 +7,12 @@ import { NewVaultInfo } from 'src/store/sagas/wallets';
import { useDispatch } from 'react-redux';
import { addNewVault, addSigningDevice } from 'src/store/sagaActions/vaults';
import { captureError } from 'src/services/sentry';
-import { Signer, VaultScheme, VaultSigner } from 'src/services/wallets/interfaces/vault';
+import {
+ MiniscriptElements,
+ Signer,
+ VaultScheme,
+ VaultSigner,
+} from 'src/services/wallets/interfaces/vault';
import { CommonActions, useNavigation } from '@react-navigation/native';
import { resetRealyVaultState } from 'src/store/reducers/bhr';
import { generateVaultId } from 'src/services/wallets/factories/VaultFactory';
@@ -22,6 +27,7 @@ const useConfigRecovery = () => {
const [recoveryLoading, setRecoveryLoading] = useState(false);
const [scheme, setScheme] = useState();
const [vaultSignersList, setVaultSignersList] = useState([]);
+ const [miniscriptElements, setMiniscriptElements] = useState(null);
const { showToast } = useToastMessage();
const [signersList, setSignersList] = useState([]);
const navigation = useNavigation();
@@ -45,13 +51,14 @@ const useConfigRecovery = () => {
try {
dispatch(addSigningDevice(signersList));
const vaultInfo: NewVaultInfo = {
- vaultType: VaultType.DEFAULT,
+ vaultType: miniscriptElements ? VaultType.INHERITANCE : VaultType.DEFAULT,
vaultScheme: scheme,
vaultSigners: vaultSignersList,
vaultDetails: {
name: 'Imported Vault',
description: 'Secure your sats',
},
+ miniscriptElements,
};
dispatch(addNewVault({ newVaultInfo: vaultInfo }));
setTimeout(() => {}, 3000);
@@ -101,6 +108,7 @@ const useConfigRecovery = () => {
setSignersList(signers);
setVaultSignersList(vaultSigners);
setScheme(parsedText.scheme);
+ setMiniscriptElements(parsedText.miniscriptElements);
}
} catch (err) {
setRecoveryLoading(false);
diff --git a/src/hooks/useSignerFromKey.ts b/src/hooks/useSignerFromKey.ts
index b68469724..d8c1f93a5 100644
--- a/src/hooks/useSignerFromKey.ts
+++ b/src/hooks/useSignerFromKey.ts
@@ -2,13 +2,15 @@ import { Signer, VaultSigner } from 'src/services/wallets/interfaces/vault';
import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
+import { getKeyUID } from 'src/utils/utilities';
const useSignerFromKey = (key: VaultSigner) => {
const signerQuery = useQuery(RealmSchema.Signer);
if (!key) return { signer: null };
const signer: Signer = signerQuery
.filtered(`masterFingerprint == "${key.masterFingerprint}"`)
- .map(getJSONFromRealmObject)[0];
+ .map(getJSONFromRealmObject)
+ .find((s) => getKeyUID(s as Signer) === getKeyUID(key));
return { signer };
};
diff --git a/src/hooks/useSignerIntel.tsx b/src/hooks/useSignerIntel.tsx
index 5fccf6e06..d2f3afdd3 100644
--- a/src/hooks/useSignerIntel.tsx
+++ b/src/hooks/useSignerIntel.tsx
@@ -4,6 +4,7 @@ import { SubscriptionTier } from 'src/models/enums/SubscriptionTier';
import { VaultScheme, VaultSigner } from 'src/services/wallets/interfaces/vault';
import useSignerMap from './useSignerMap';
import usePlan from './usePlan';
+import { getKeyUID } from 'src/utils/utilities';
const areSignersSame = ({ existingKeys, vaultKeys }) => {
if (!existingKeys.length || !vaultKeys.length) {
@@ -31,8 +32,8 @@ const useSignerIntel = ({
const isOnL3 = plan === SubscriptionTier.L3.toUpperCase();
const amfSigners = [];
- for (const mfp of selectedSigners.keys()) {
- const signer = signerMap[mfp];
+ for (const signerIdentifier of selectedSigners.keys()) {
+ const signer = signerMap[signerIdentifier];
if (isSignerAMF(signer)) amfSigners.push(signer.type);
}
@@ -42,9 +43,9 @@ const useSignerIntel = ({
vaultKeys.forEach((key) => {
if (key) {
- const isIKS = signerMap[key.masterFingerprint].type === SignerType.INHERITANCEKEY;
- const isSS = signerMap[key.masterFingerprint].type === SignerType.POLICY_SERVER;
- const signerName = getSignerNameFromType(signerMap[key.masterFingerprint].type);
+ const isIKS = signerMap[getKeyUID(key)].type === SignerType.INHERITANCEKEY;
+ const isSS = signerMap[getKeyUID(key)].type === SignerType.POLICY_SERVER;
+ const signerName = getSignerNameFromType(signerMap[getKeyUID(key)].type);
if (isSS) {
if (isOnL1) {
invalidSS = true;
diff --git a/src/hooks/useSignerMap.ts b/src/hooks/useSignerMap.ts
index e524672d1..1e56ebcfa 100644
--- a/src/hooks/useSignerMap.ts
+++ b/src/hooks/useSignerMap.ts
@@ -2,12 +2,13 @@ import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
import { Signer } from 'src/services/wallets/interfaces/vault';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
+import { getKeyUID } from 'src/utils/utilities';
const useSignerMap = () => {
const signerMap = {};
const signerQuery = useQuery(RealmSchema.Signer);
signerQuery.forEach(
- (signer) => (signerMap[(signer as Signer).masterFingerprint] = getJSONFromRealmObject(signer))
+ (signer) => (signerMap[getKeyUID(signer as Signer)] = getJSONFromRealmObject(signer))
);
return { signerMap };
};
diff --git a/src/hooks/useSigners.tsx b/src/hooks/useSigners.tsx
index 9bcc2ec5b..1e329b1cf 100644
--- a/src/hooks/useSigners.tsx
+++ b/src/hooks/useSigners.tsx
@@ -2,6 +2,7 @@ import { Signer, Vault } from 'src/services/wallets/interfaces/vault';
import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
+import { getKeyUID } from 'src/utils/utilities';
const useSigners = (vaultId = ''): { vaultSigners: Signer[]; signers: Signer[] } => {
const vaults = useQuery(RealmSchema.Vault);
@@ -12,7 +13,9 @@ const useSigners = (vaultId = ''): { vaultSigners: Signer[]; signers: Signer[] }
currentVault = vaults.filtered(`id == "${vaultId}"`)[0];
const vaultKeys = (currentVault as Vault)?.signers;
vaultKeys?.forEach((key) => {
- const signer = signers.filtered(`masterFingerprint == "${key.masterFingerprint}"`)[0];
+ const signer = signers
+ .filtered(`masterFingerprint == "${key.masterFingerprint}"`)
+ .find((s) => getKeyUID(s as Signer) === getKeyUID(key));
if (signer) {
vaultSigners.push(signer.toJSON());
}
diff --git a/src/navigation/Navigator.tsx b/src/navigation/Navigator.tsx
index 8ae38e07d..896b345fe 100644
--- a/src/navigation/Navigator.tsx
+++ b/src/navigation/Navigator.tsx
@@ -1,7 +1,7 @@
import { DefaultTheme, NavigationContainer } from '@react-navigation/native';
import React, { useContext, useRef } from 'react';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
-import { routingInstrumentation } from 'src/services/sentry';
+import { getRoutingInstrumentation } from 'src/services/sentry';
import AddDescription from 'src/screens/Vault/AddDescription';
import AddSendAmount from 'src/screens/Send/AddSendAmount';
import AddSigningDevice from 'src/screens/Vault/AddSigningDevice';
@@ -48,6 +48,7 @@ import TorSettings from 'src/screens/AppSettings/TorSettings';
import ManageWallets from 'src/screens/AppSettings/ManageWallets';
import TransactionDetails from 'src/screens/ViewTransactions/TransactionDetails';
import TransactionAdvancedDetails from 'src/screens/ViewTransactions/TransactionAdvancedDetails';
+import TransactionHistory from 'src/screens/ViewTransactions/TransactionHistory';
import VaultDetails from 'src/screens/Vault/VaultDetails';
import VaultSettings from 'src/screens/Vault/VaultSettings';
import AllTransactions from 'src/screens/Vault/AllTransactions';
@@ -120,11 +121,10 @@ import HandleFileScreen from 'src/screens/SigningDevices/HandleFileScreen';
import ZendeskOnboardingModal from 'src/components/Modal/ConciergeOnboardingModal';
import PassportConfigRecovery from 'src/screens/SigningDevices/PassportConfigRecovery';
import { useAppSelector } from 'src/store/hooks';
-import { AppStackParams } from './types';
-import Login from '../screens/LoginScreen/Login';
-import SignerSelectionListScreen from 'src/screens/Recieve/SignerSelectionListScreen';
-import AdditionalDetails from 'src/screens/Vault/AdditionalDetails';
import RemoteSharing from 'src/screens/SigningDevices/RemoteSharing';
+import AssistedWalletTimeline from 'src/screens/AssistedVault/AssistedWalletTimeline';
+import SetupAssistedVault from 'src/screens/SigningDevices/SetupAssistedVault';
+import SignerSelectionListScreen from 'src/screens/Recieve/SignerSelectionListScreen';
import AssociateContact from 'src/screens/Contact/AssociateContact';
import AddContact from 'src/screens/Contact/AddContact';
import ContactProfile from 'src/screens/Contact/ContactProfile';
@@ -133,14 +133,13 @@ import ManageTapsignerSettings from 'src/screens/Vault/ManageTapsignerSettings';
import SetupPortal from 'src/screens/SigningDevices/SetupPortal';
import SelectWalletScreen from 'src/screens/Send/SelectWallet';
import PSBTSendConfirmation from 'src/screens/Send/PSBTSendConfirmation';
-
-const defaultTheme = {
- ...DefaultTheme,
- colors: {
- ...DefaultTheme.colors,
- background: Colors.Isabelline,
- },
-};
+import ResetInheritanceKey from 'src/screens/Vault/ResetInheritanceKey';
+import AdditionalDetails from 'src/screens/Vault/AdditionalDetails';
+import AddReserveKey from 'src/screens/Vault/AddReserveKey';
+import { useColorMode } from 'native-base';
+import Login from '../screens/LoginScreen/Login';
+import { AppStackParams } from './types';
+import config from 'src/utils/service-utilities/config';
function LoginStack() {
const Stack = createNativeStackNavigator();
@@ -262,6 +261,7 @@ function AppStack() {
+
@@ -306,11 +306,15 @@ function AppStack() {
+
+
+
+
);
@@ -319,10 +323,20 @@ function Navigator() {
const Stack = createNativeStackNavigator();
const navigation = useRef();
const { appLoading, loadingContent } = useContext(AppContext);
+ const { colorMode } = useColorMode();
+ const defaultTheme = {
+ ...DefaultTheme,
+ colors: {
+ ...DefaultTheme.colors,
+ background: colorMode === 'light' ? Colors.LightYellow : Colors.PrimaryBlack,
+ },
+ };
// Register the navigation container with the instrumentation
const onReady = () => {
- routingInstrumentation.registerNavigationContainer(navigation);
+ if (config.isDevMode()) {
+ getRoutingInstrumentation().registerNavigationContainer(navigation);
+ }
};
const { onboardingModal } = useAppSelector((state) => state.concierge);
diff --git a/src/navigation/contants.ts b/src/navigation/contants.ts
index bc7f232ea..d2fd898f8 100644
--- a/src/navigation/contants.ts
+++ b/src/navigation/contants.ts
@@ -2,5 +2,8 @@ export const MANAGEWALLETS = 'ManageWallets';
export const VAULTSETTINGS = 'VaultSettings';
export const WALLETSETTINGS = 'WalletSettings';
export const SETUPCOLLABORATIVEWALLET = 'SetupCollaborativeWallet';
+export const SETUPASSISTEDVAULT = 'SetupAssistedVault';
export const SIGNTRANSACTION = 'SignTransactionScreen';
export const PRIVACYANDDISPLAY = 'PrivacyAndDisplay';
+export const VAULTDETAILS = 'VaultDetails';
+export const ADDRESERVEKEY = 'AddReserveKey';
diff --git a/src/navigation/themes.js b/src/navigation/themes.js
index 96200b562..251dfb2e7 100644
--- a/src/navigation/themes.js
+++ b/src/navigation/themes.js
@@ -101,6 +101,7 @@ export const customTheme = extendTheme({
textInputBackground: Colors.ChampagneBliss,
thirdBackground: Colors.Warmbeige,
GreyText: Colors.Feldgrau,
+ DarkGreyText: Colors.FeldgrauDark,
dateText: Colors.HookerGreen,
Border: Colors.CastletonGreen,
textColor: Colors.LightGray,
@@ -209,6 +210,7 @@ export const customTheme = extendTheme({
tagColor9: Colors.TagLight9,
tagColor10: Colors.TagLight10,
boxBackground: Colors.BoxGolden,
+ boxSecondaryBackground: Colors.ChampagneBliss,
borderBrown: Colors.brownColor,
separator: Colors.separator,
alertRed: Colors.AlertRed,
@@ -236,6 +238,8 @@ export const customTheme = extendTheme({
dashedButtonBorder: Colors.SeaweedGreen,
newDashedButtonBackground: Colors.DashedButtonBackground,
btcPillText: Colors.MidNightBlack,
+ DarkGreyText: Colors.Feldgrau,
+ greyBackground: Colors.lightGrey,
},
dark: {
navButtonText: Colors.SecondaryWhite,
@@ -371,10 +375,9 @@ export const customTheme = extendTheme({
greyBorderTranslucent: Colors.SilverMistTranslucent,
border: Colors.SilverMistTransparent,
placeHolderTextColor: Colors.Graphite,
- linkPreviewBackground: Colors.Graphite,
dullGreyBorder: Colors.separator,
placeHolderTextColor: Colors.GraphiteLight,
- linkPreviewBackground: Colors.GraphiteLight,
+ linkPreviewBackground: Colors.ModalBlack,
limeText: Colors.LimeYellow,
greenText: Colors.SecondaryWhite,
greenTextDisabled: Colors.SlateGreen,
@@ -401,6 +404,7 @@ export const customTheme = extendTheme({
tagColor9: Colors.TagDark9,
tagColor10: Colors.TagDark10,
boxBackground: Colors.SecondaryBackgroundDark,
+ boxSecondaryBackground: Colors.SecondaryBlack,
borderBrown: Colors.SilverMistTransparent,
separator: Colors.separator,
alertRed: Colors.AlertRedDark,
@@ -409,7 +413,6 @@ export const customTheme = extendTheme({
textWhite: Colors.SecondaryWhite,
textGreenGrey: Colors.SecondaryWhite,
seedCard: Colors.SeashellDark,
- secondaryBackground: Colors.SecondaryBlack,
thirdBackground: Colors.SecondaryBlack,
errorToastBackground: Colors.ErrorToastDark,
transactionDeatilInfo: Colors.GraphiteLight,
@@ -429,6 +432,8 @@ export const customTheme = extendTheme({
dashedButtonBorder: Colors.separator,
newDashedButtonBackground: Colors.DashedButtonBackgroundDark,
btcPillText: Colors.White,
+ DarkGreyText: Colors.RichBlackDark,
+ greyBackground: Colors.darkGrey,
},
},
config: {
diff --git a/src/navigation/types.ts b/src/navigation/types.ts
index 580ad7d68..783923819 100644
--- a/src/navigation/types.ts
+++ b/src/navigation/types.ts
@@ -80,6 +80,7 @@ export type AppStackParams = {
AddDescription: undefined;
AllTransactions: undefined;
TransactionDetails: undefined;
+ TransactionHistory: undefined;
TransactionAdvancedDetails: undefined;
TimelockScreen: undefined;
SignerAdvanceSettings: undefined;
@@ -104,12 +105,7 @@ export type AppStackParams = {
isPSBTSharing?: boolean;
psbt?: string;
mode: RKInteractionMode;
- vaultKey?: VaultSigner;
- vaultId?: string;
- serializedPSBTEnvelop: any;
- isMultisig?: boolean;
- sendConfirmationRouteParams?: SendConfirmationRouteParams;
- tnxDetails?: tnxDetailsProps;
+ xfp?: string;
};
GenerateVaultDescriptor: undefined;
SetupCollaborativeWallet: undefined;
@@ -120,7 +116,13 @@ export type AppStackParams = {
VaultCreationOptions: undefined;
VaultConfigurationCreation: undefined;
ScanQRFileRecovery: undefined;
- VaultSetup: { isRecreation: Boolean; scheme: VaultScheme; vaultId?: string };
+ VaultSetup: {
+ isRecreation: Boolean;
+ scheme: VaultScheme;
+ vaultId?: string;
+ isTimeLock?: boolean;
+ isAddInheritanceKeyFromParams?: boolean;
+ };
SigningDeviceConfigRecovery: undefined;
MixProgress: undefined;
AssignSignerType: undefined;
@@ -146,12 +148,9 @@ export type AppStackParams = {
addedSigner: Signer;
addSignerFlow: boolean;
showModal?: boolean;
- receivedExternalSigner?: {
- timeLeft: string;
- data: {
- fcmToken: string;
- signer: Signer;
- };
+ remoteData?: {
+ key: string;
+ fcm: string;
};
};
AppBackupSettings: undefined;
@@ -160,12 +159,17 @@ export type AppStackParams = {
EnterWalletPath: undefined;
DeleteKeys: undefined;
HandleFile: undefined;
+ AssistedWalletTimeline: {
+ parentScreen: string;
+ };
AssociateContact: undefined;
AddContact: undefined;
ContactProfile: undefined;
EditContact: undefined;
ManageTapsignerSettings: undefined;
SetupPortal: undefined;
+ AddReserveKey: undefined;
+ ResetInheritanceKey: undefined;
};
// Usage:
diff --git a/src/screens/AddSigner/HorizontalSignerCard.tsx b/src/screens/AddSigner/HorizontalSignerCard.tsx
new file mode 100644
index 000000000..2cfe8de4c
--- /dev/null
+++ b/src/screens/AddSigner/HorizontalSignerCard.tsx
@@ -0,0 +1,168 @@
+import React, { useContext } from 'react';
+import { Box, Pressable } from 'native-base';
+import { StyleSheet, ViewStyle } from 'react-native';
+import Text from 'src/components/KeeperText';
+import Checked from 'src/assets/images/tick_icon.svg';
+import ArrowRightIcon from 'src/assets/images/icon_arrow_grey.svg';
+import { hp, wp } from 'src/constants/responsive';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+
+type HorizontalSignerCardProps = {
+ name: string;
+ subtitle?: string;
+ description?: string;
+ icon: Element;
+ isSelected?: boolean;
+ onCardSelect?: (selected: any) => void;
+ showSelection?: boolean;
+ colorVarient?: string;
+ disabled?: boolean;
+ showDot?: boolean;
+ customStyle?: ViewStyle;
+ StaticIcon?: any;
+ colorMode: string;
+ changeKey: () => void;
+};
+
+function HorizontalSignerCard({
+ name,
+ subtitle = '',
+ description = '',
+ icon,
+ colorVarient = 'brown',
+ showDot = false,
+ customStyle,
+ colorMode,
+ changeKey,
+}: HorizontalSignerCardProps) {
+ const { translations } = useContext(LocalizationContext);
+ const { vault: vaultTranslations } = translations;
+ const backgroundColor =
+ colorVarient === 'brown'
+ ? `${colorMode}.BrownNeedHelp`
+ : colorVarient === 'transparent'
+ ? 'transparent'
+ : `${colorMode}.pantoneGreen`;
+
+ return (
+
+
+
+ {icon}
+ {showDot ? : null}
+
+
+
+ {name}
+
+ {description ? (
+
+ {description}
+
+ ) : null}
+
+
+
+
+
+
+
+
+ {vaultTranslations.changeKey}
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ horizontalContainer: {
+ width: '100%',
+ flexDirection: 'row',
+ alignItems: 'center',
+ borderRadius: 10,
+ position: 'relative',
+ justifyContent: 'space-between',
+ borderWidth: 1,
+ paddingVertical: hp(15),
+ paddingHorizontal: wp(15),
+ },
+ infoContainer: {
+ gap: 5,
+ },
+ iconWrapper: {
+ width: 35,
+ height: 35,
+ borderRadius: 20,
+ justifyContent: 'center',
+ alignItems: 'center',
+ marginRight: wp(10),
+ marginBottom: hp(5),
+ },
+ walletName: {
+ fontSize: 14,
+ letterSpacing: 0.12,
+ opacity: 0.8,
+ },
+ walletSubtTitle: {
+ fontSize: 12,
+ letterSpacing: 0.11,
+ },
+ circle: {
+ width: 20,
+ height: 20,
+ borderRadius: 20 / 2,
+ borderWidth: 1,
+ },
+ selectionIcon: {
+ alignSelf: 'flex-end',
+ },
+ redDot: {
+ width: 10,
+ height: 10,
+ borderRadius: 10 / 2,
+ backgroundColor: 'red',
+ position: 'absolute',
+ top: 0,
+ right: 0,
+ borderWidth: 1,
+ borderColor: 'white',
+ },
+ textContainer: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ rightContainer: {
+ alignSelf: 'center',
+ gap: hp(35),
+ },
+ changeKeyContainer: {
+ alignSelf: 'flex-end',
+ flexDirection: 'row',
+ gap: 5,
+ alignItems: 'center',
+ },
+ changeKeyText: {
+ fontSize: 13,
+ marginRight: wp(5),
+ },
+});
+
+export default HorizontalSignerCard;
diff --git a/src/screens/AddSigner/SignerCard.tsx b/src/screens/AddSigner/SignerCard.tsx
index 083027a9f..4bd462fb7 100644
--- a/src/screens/AddSigner/SignerCard.tsx
+++ b/src/screens/AddSigner/SignerCard.tsx
@@ -6,6 +6,7 @@ import Text from 'src/components/KeeperText';
import Checked from 'src/assets/images/tick_icon.svg';
import { getPersistedDocument } from 'src/services/documents';
import Colors from 'src/theme/Colors';
+import IKSTimer from 'src/assets/images/iks-timer.svg';
type SignerCardProps = {
name: string;
@@ -27,6 +28,7 @@ type SignerCardProps = {
isFeePriority?: boolean;
boldDesc?: boolean;
image?: string;
+ showTimer?: boolean;
};
function SignerCard({
@@ -49,6 +51,7 @@ function SignerCard({
isFeePriority = false,
boldDesc = false,
image = null,
+ showTimer,
}: SignerCardProps) {
const backgroundColor =
colorVarient === 'brown'
@@ -68,6 +71,11 @@ function SignerCard({
}}
testID={`btn_${name}`}
>
+ {showTimer && (
+
+
+
+ )}
{showSelection &&
(isSelected ? : StaticIcon ? : )}
@@ -190,6 +198,12 @@ const styles = StyleSheet.create({
alignSelf: 'center',
justifyContent: 'center',
},
+ timer: {
+ position: 'absolute',
+ top: 10,
+ right: 10,
+ alignSelf: 'flex-end',
+ },
});
export default SignerCard;
diff --git a/src/screens/AddWalletScreen/AdvancedWallets.tsx b/src/screens/AddWalletScreen/AdvancedWallets.tsx
index 50e9bb5c4..450c4cb3f 100644
--- a/src/screens/AddWalletScreen/AdvancedWallets.tsx
+++ b/src/screens/AddWalletScreen/AdvancedWallets.tsx
@@ -1,8 +1,10 @@
import { Box, useColorMode } from 'native-base';
import React, { useContext } from 'react';
import OptionCard from 'src/components/OptionCard';
-import TimeLockIcon from 'src/assets/images/calendar_disabled.svg';
-import MultiSigIcon from 'src/assets/images/degrading_multisig_disabled.svg';
+import TimeLockIcon from 'src/assets/images/calendar.svg';
+import AssistedVaultIcon from 'src/assets/images/assisted-vault-icon.svg';
+import TimeLockDisabledIcon from 'src/assets/images/calendar-disabled.svg';
+import AssistedVaultDisabledIcon from 'src/assets/images/assisted-vault-disabled-icon.svg';
import VaultGreenIcon from 'src/assets/images/vault_green.svg';
import { CommonActions } from '@react-navigation/native';
import CardPill from 'src/components/CardPill';
@@ -13,18 +15,23 @@ function AdvancedWallets({ navigation }) {
const { colorMode } = useColorMode();
const { translations } = useContext(LocalizationContext);
const { importWallet } = translations;
- const navigateToVaultSetup = (scheme?) => {
- navigation.dispatch(CommonActions.navigate({ name: 'VaultSetup', params: { scheme } }));
+ const isDisbaled = true;
+ const navigateToVaultSetup = (scheme?, isTimeLock = false) => {
+ navigation.dispatch(
+ CommonActions.navigate({ name: 'VaultSetup', params: { scheme, isTimeLock } })
+ );
};
return (
}
+ LeftIcon={isDisbaled ? : }
titleColor={`${colorMode}.primaryText`}
descriptionColor={`${colorMode}.secondaryText`}
+ callback={() => navigateToVaultSetup({ m: 2, n: 3 }, true)}
CardPill={
}
- callback={() => {}}
- disabled
/>
}
+ disabled={isDisbaled}
+ title="Assisted Wallet"
+ description={`Create degrading mulit-key\nwallet with friends or advisors`}
+ LeftIcon={isDisbaled ? : }
titleColor={`${colorMode}.primaryText`}
descriptionColor={`${colorMode}.secondaryText`}
+ callback={() => {
+ navigation.navigate('AssistedWalletTimeline');
+ }}
CardPill={
}
- callback={() => {}}
- disabled
/>
state.bhr);
+
const { isOnL2Above } = usePlan();
const navigation = useNavigation();
const dispatch = useDispatch();
@@ -135,6 +140,18 @@ function ManageWallets() {
calculateBalanceAfterVisblityChange();
}, [wallets]);
+ useEffect(() => {
+ if (selectedWallet?.id) {
+ if (relayVaultUpdate) {
+ showToast('Vault deleted successfully', );
+ }
+ if (relayVaultError) {
+ showToast('Failed to delete vault', );
+ }
+ dispatch(resetRealyVaultState());
+ }
+ }, [relayVaultUpdate, relayVaultError]);
+
const isWallet = selectedWallet?.entityKind === EntityKind.WALLET;
const calculateBalanceAfterVisblityChange = () => {
@@ -170,7 +187,6 @@ function ManageWallets() {
const deleteSelectedEntity = () => {
if (selectedWallet && selectedWallet.entityKind === EntityKind.VAULT) {
dispatch(deleteVault(selectedWallet.id));
- showToast('Vault deleted successfully', );
}
if (selectedWallet && selectedWallet.entityKind === EntityKind.WALLET) {
dispatch(deleteAppImageEntity({ walletIds: [selectedWallet.id] }));
diff --git a/src/screens/AppSettings/PrivacyAndDisplay.tsx b/src/screens/AppSettings/PrivacyAndDisplay.tsx
index 4b11386b7..0eea26998 100644
--- a/src/screens/AppSettings/PrivacyAndDisplay.tsx
+++ b/src/screens/AppSettings/PrivacyAndDisplay.tsx
@@ -1,4 +1,3 @@
-import * as Sentry from '@sentry/react-native';
import React, { useContext, useEffect, useState } from 'react';
import { Box, ScrollView, useColorMode } from 'native-base';
import ReactNativeBiometrics from 'react-native-biometrics';
@@ -17,12 +16,9 @@ import ThemeMode from 'src/models/enums/ThemeMode';
import { Linking, StyleSheet, TouchableOpacity } from 'react-native';
import { hp, wp } from 'src/constants/responsive';
import Note from 'src/components/Note/Note';
-import { sentryConfig } from 'src/services/sentry';
-import useAsync from 'src/hooks/useAsync';
import { KeeperApp } from 'src/models/interfaces/KeeperApp';
import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
-import dbManager from 'src/storage/realm/dbManager';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
import PasscodeVerifyModal from 'src/components/Modal/PasscodeVerify';
import KeeperModal from 'src/components/KeeperModal';
@@ -208,11 +204,8 @@ function PrivacyAndDisplay({ route }) {
getJSONFromRealmObject
)[0];
const { loginMethod }: { loginMethod: LoginMethod } = useAppSelector((state) => state.settings);
- const { inProgress, start } = useAsync();
const data = useQuery(RealmSchema.BackupHistory);
const app: KeeperApp = useQuery(RealmSchema.KeeperApp).map(getJSONFromRealmObject)[0];
- const [isToggling, setIsToggling] = useState(false);
- const [analyticsEnabled, setAnalyticsEnabled] = useState(app.enableAnalytics);
const [credsChanged, setCredsChanged] = useState('');
useEffect(() => {
@@ -223,45 +216,6 @@ function PrivacyAndDisplay({ route }) {
}
}, [credsChanged]);
- const toggleSentryReports = (newValue) => {
- setAnalyticsEnabled(newValue);
- runAsyncAnalyticsToggle(newValue);
- };
-
- const runAsyncAnalyticsToggle = async (newValue) => {
- const lastAction = newValue;
-
- if (isToggling) return;
- setIsToggling(true);
-
- try {
- await new Promise((resolve) => setTimeout(resolve, 500));
-
- if (lastAction !== newValue) {
- setIsToggling(false);
- return;
- }
-
- await dbManager.updateObjectById(RealmSchema.KeeperApp, app.id, {
- enableAnalytics: newValue,
- });
-
- if (newValue) {
- await start(() => Sentry.init(sentryConfig));
- } else {
- await start(() => Sentry.init({ ...sentryConfig, enabled: false }));
- }
- } catch (error) {
- setAnalyticsEnabled(!newValue);
- dbManager.updateObjectById(RealmSchema.KeeperApp, app.id, {
- enableAnalytics: !newValue,
- });
- console.error('Failed to toggle Sentry analytics:', error);
- } finally {
- setIsToggling(false);
- }
- };
-
useEffect(() => {
init();
}, []);
@@ -372,17 +326,6 @@ function PrivacyAndDisplay({ route }) {
)
}
/>
- toggleSentryReports(value)}
- value={analyticsEnabled}
- testID="switch_darkmode"
- />
- }
- />
,
+ title: 'Wallet Creation',
+ description: 'One User Key, two Advisor Keys',
+ phaseInfo: { duration: '~ 2 years', phase: 'Standard Phase' },
+ },
+ {
+ icon: ,
+ title: 'Start receiving notifications',
+ description: 'Receive weekly renew notification',
+ phaseInfo: { duration: '~ 3 months', phase: 'Renew Phase' },
+ },
+ {
+ icon: ,
+ title: 'Downgrade to single-key',
+ description: 'User Key can renew or transfer funds',
+ phaseInfo: { duration: '~ 1 month', phase: 'Emergency Window' },
+ },
+ {
+ icon: ,
+ title: 'Assisted Keys can sign',
+ description: '2 Assisted Keys can also transfer funds',
+ phaseInfo: { duration: 'Till renewed or transferred', phase: 'Inheritance Phase' },
+ },
+ ];
+
+ return (
+
+
+
+ {timelineData.map((item, index) => (
+
+ ))}
+ {!isVaultDetails && (
+ <>
+
+ For FAQs please visit our website
+
+
+ {
+ navigation.navigate('SetupAssistedVault');
+ }}
+ >
+
+
+ Create Wallet
+
+
+
+
+ >
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ marginHorizontal: wp(10),
+ marginTop: hp(10),
+ flexGrow: 1,
+ paddingBottom: hp(50),
+ },
+ faqText: {
+ marginTop: hp(60),
+ marginBottom: hp(27),
+ fontSize: 14,
+ },
+ createWalletButton: {
+ alignSelf: 'flex-end',
+ },
+ cta: {
+ borderRadius: 10,
+ width: wp(142),
+ height: hp(42),
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ ctaText: {
+ fontSize: 13,
+ letterSpacing: 1,
+ },
+});
+
+export default AssistedWalletTimeline;
diff --git a/src/screens/AssistedVault/components/TimeLineItem.tsx b/src/screens/AssistedVault/components/TimeLineItem.tsx
new file mode 100644
index 000000000..b5522b9d6
--- /dev/null
+++ b/src/screens/AssistedVault/components/TimeLineItem.tsx
@@ -0,0 +1,167 @@
+import React from 'react';
+import { Box, HStack, VStack, useColorMode } from 'native-base';
+import { StyleSheet } from 'react-native';
+import { hp, wp } from 'src/constants/responsive';
+import Text from 'src/components/KeeperText';
+import TimerIcon from 'src/assets/images/timer-icon.svg';
+import DashedLeft from 'src/assets/images/dashed-arrow-left.svg';
+import DashedRight from 'src/assets/images/dashed-arrow-right.svg';
+import DashedCenter from 'src/assets/images/dashed-arrow-center.svg';
+
+const TimelineItem = ({ icon, title, description, phaseInfo, index, isLast }) => {
+ const { colorMode } = useColorMode();
+
+ const getArrowIcon = () => {
+ if (isLast) {
+ return ;
+ }
+ return index % 2 === 0 ? : ;
+ };
+
+ const getAlignment = () => {
+ if (isLast) {
+ return 'center';
+ }
+ return index % 2 === 0 ? 'flex-start' : 'flex-end';
+ };
+
+ const isLeftAligned = index % 2 === 0;
+
+ return (
+
+
+
+ {icon}
+
+
+ {title}
+
+
+ {description}
+
+
+
+
+
+ {isLeftAligned ? (
+ <>
+
+
+ {phaseInfo.duration}
+
+ {getArrowIcon()}
+
+ {phaseInfo.phase}
+
+ >
+ ) : !isLast ? (
+ <>
+
+ {phaseInfo.phase}
+
+ {getArrowIcon()}
+
+
+ {phaseInfo.duration}
+
+ >
+ ) : (
+ <>
+
+ {phaseInfo.phase}
+
+ {getArrowIcon()}
+
+
+ {phaseInfo.duration}
+
+ >
+ )}
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ mainContainer: {
+ width: '100%',
+ },
+ container: {
+ width: '100%',
+ paddingHorizontal: wp(20),
+ paddingVertical: hp(20),
+ borderRadius: 10,
+ borderWidth: 1,
+ shadowColor: '#000000',
+ shadowOffset: { width: 0, height: hp(4) },
+ shadowOpacity: 0.15,
+ elevation: 5,
+ },
+ infoContainer: {
+ alignItems: 'center',
+ },
+ title: {
+ fontSize: 15,
+ lineHeight: 24,
+ },
+ subtitle: {
+ fontSize: 13,
+ lineHeight: 20,
+ },
+ durationPill: {
+ position: 'absolute',
+ borderWidth: 1,
+ flexDirection: 'row',
+ alignItems: 'center',
+ paddingHorizontal: wp(10),
+ paddingVertical: hp(5),
+ borderRadius: 30,
+ gap: 5,
+ zIndex: 1,
+ },
+ leftPill: {
+ left: '10%',
+ },
+ rightPill: {
+ right: '30%',
+ },
+ centerPill: {
+ top: '102%',
+ },
+ phaseContainer: {
+ position: 'relative',
+ width: '100%',
+ },
+ phaseLeft: {
+ marginLeft: wp(42),
+ },
+ phaseRight: {
+ marginRight: wp(42),
+ },
+ phaseCenter: {
+ marginLeft: wp(40),
+ },
+});
+
+export default TimelineItem;
diff --git a/src/screens/Channel/ConnectChannel.tsx b/src/screens/Channel/ConnectChannel.tsx
index 0cde2cbee..923f3d36e 100644
--- a/src/screens/Channel/ConnectChannel.tsx
+++ b/src/screens/Channel/ConnectChannel.tsx
@@ -81,6 +81,7 @@ function ConnectChannel() {
isMultisig,
addSignerFlow = false,
vaultId,
+ accountNumber = null,
} = route.params as any;
const [channel] = useState(io(config.CHANNEL_URL));
@@ -108,20 +109,6 @@ function ConnectChannel() {
receivingAddress = resp.receivingAddress;
}
- const requestBody: RequestBody = {
- action:
- mode === InteracationMode.ADDRESS_VERIFICATION
- ? EMIT_MODES.VERIFY_ADDRESS
- : mode == EMIT_MODES.HEALTH_CHECK
- ? EMIT_MODES.HEALTH_CHECK
- : EMIT_MODES.ADD_DEVICE,
- signerType,
- };
- if (mode === InteracationMode.ADDRESS_VERIFICATION) {
- requestBody.descriptorString = descriptorString ?? null;
- requestBody.receivingAddress = receivingAddress ?? null;
- }
-
const onBarCodeRead = (data) => {
decryptionKey.current = data;
const sha = crypto.createHash('sha256');
@@ -136,9 +123,11 @@ function ConnectChannel() {
: EMIT_MODES.ADD_DEVICE,
signerType,
};
- if (InteracationMode.ADDRESS_VERIFICATION) {
+ if (mode === InteracationMode.ADDRESS_VERIFICATION) {
requestBody.descriptorString = descriptorString;
requestBody.receivingAddress = receivingAddress;
+ } else {
+ requestBody.accountNumber = accountNumber;
}
const requestData = createCipherGcm(JSON.stringify(requestBody), decryptionKey.current);
channel.emit(JOIN_CHANNEL, { room, network: config.NETWORK_TYPE, requestData });
@@ -185,6 +174,8 @@ function ConnectChannel() {
navigation.goBack();
showToast(`Address verified successfully`, );
} else {
+ console.log('responseData');
+ console.log(responseData);
signerSetup(signerType, responseData);
}
} catch (error) {
@@ -321,6 +312,7 @@ type RequestBody = {
signerType: string;
descriptorString?: string;
receivingAddress?: string;
+ accountNumber?: number;
};
const styles = StyleSheet.create({
diff --git a/src/screens/ChoosePlanScreen/ChoosePlan.tsx b/src/screens/ChoosePlanScreen/ChoosePlan.tsx
index 2ab35583b..2b50a531a 100644
--- a/src/screens/ChoosePlanScreen/ChoosePlan.tsx
+++ b/src/screens/ChoosePlanScreen/ChoosePlan.tsx
@@ -449,7 +449,12 @@ function ChoosePlan() {
subscription.productId.toLowerCase()
);
if (isSubscribed) return 'Subscribed';
- return 'Continue - ' + (items[currentPosition]?.monthlyPlanDetails.price ?? 'Free');
+ return `Continue - ${
+ (isMonthly
+ ? items[currentPosition]?.monthlyPlanDetails
+ : items[currentPosition]?.yearlyPlanDetails
+ )?.price || 'Free'
+ }`;
};
return (
diff --git a/src/screens/Contact/AddContact.tsx b/src/screens/Contact/AddContact.tsx
index d24402297..1232f653a 100644
--- a/src/screens/Contact/AddContact.tsx
+++ b/src/screens/Contact/AddContact.tsx
@@ -16,7 +16,7 @@ import { updateSignerDetails } from 'src/store/sagaActions/wallets';
import { useDispatch } from 'react-redux';
import { persistDocument } from 'src/services/documents';
-const AddContact = ({ route }) => {
+function AddContact({ route }) {
const { signer } = route.params;
const { colorMode } = useColorMode();
const navigation = useNavigation();
@@ -104,7 +104,7 @@ const AddContact = ({ route }) => {
);
-};
+}
const styles = StyleSheet.create({
container: {
diff --git a/src/screens/Contact/AssociateContact.tsx b/src/screens/Contact/AssociateContact.tsx
index 84993f3f6..a48fd1017 100644
--- a/src/screens/Contact/AssociateContact.tsx
+++ b/src/screens/Contact/AssociateContact.tsx
@@ -31,7 +31,7 @@ import ToastErrorIcon from 'src/assets/images/toast_error.svg';
import useToastMessage from 'src/hooks/useToastMessage';
import { captureError } from 'src/services/sentry';
-const AssociateContact = ({ route }) => {
+function AssociateContact({ route }) {
const { signer }: { signer: Signer } = route.params;
const { colorMode } = useColorMode();
const navigation = useNavigation();
@@ -206,7 +206,7 @@ const AssociateContact = ({ route }) => {
)}
);
-};
+}
const styles = StyleSheet.create({
container: {
diff --git a/src/screens/Contact/ContactProfile.tsx b/src/screens/Contact/ContactProfile.tsx
index fcf39b8d7..d12bd1115 100644
--- a/src/screens/Contact/ContactProfile.tsx
+++ b/src/screens/Contact/ContactProfile.tsx
@@ -11,7 +11,7 @@ import Buttons from 'src/components/Buttons';
import { hp, wp } from 'src/constants/responsive';
import { getPersistedDocument } from 'src/services/documents';
-const ContactProfile = ({ route }) => {
+function ContactProfile({ route }) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
const { contact } = route.params;
@@ -47,7 +47,7 @@ const ContactProfile = ({ route }) => {
);
-};
+}
const styles = StyleSheet.create({
container: {
diff --git a/src/screens/Contact/EditContact.tsx b/src/screens/Contact/EditContact.tsx
index efde7a38f..ddc71aaae 100644
--- a/src/screens/Contact/EditContact.tsx
+++ b/src/screens/Contact/EditContact.tsx
@@ -16,7 +16,7 @@ import { useDispatch } from 'react-redux';
import { updateSignerDetails } from 'src/store/sagaActions/wallets';
import { getPersistedDocument, persistDocument } from 'src/services/documents';
-const EditContact = ({ route }) => {
+function EditContact({ route }) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
const { signer } = route.params;
@@ -111,7 +111,7 @@ const EditContact = ({ route }) => {
);
-};
+}
const styles = StyleSheet.create({
container: {
@@ -164,7 +164,7 @@ const styles = StyleSheet.create({
const generateFullName = (signer) => {
let fullName = '';
if (signer.extraData.givenName) fullName += signer.extraData.givenName;
- if (signer.extraData.familyName) fullName += ' ' + signer.extraData.familyName;
+ if (signer.extraData.familyName) fullName += ` ${signer.extraData.familyName}`;
return fullName;
};
export default EditContact;
diff --git a/src/screens/ErrorHandler.tsx b/src/screens/ErrorHandler.tsx
index d196dd5c2..9e258176c 100644
--- a/src/screens/ErrorHandler.tsx
+++ b/src/screens/ErrorHandler.tsx
@@ -1,31 +1,10 @@
import React from 'react';
-import * as Sentry from '@sentry/react-native';
import { captureError } from 'src/services/sentry';
import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
import dbManager from 'src/storage/realm/dbManager';
-const ErrorHandler = ({ children }) => {
- const versionHistory = useQuery(RealmSchema.VersionHistory).map(getJSONFromRealmObject);
-
- const onScreenCrash = (error) => {
- captureError(error);
- };
- const beforeCapture = (scope) => {
- scope.addBreadcrumb({
- level: 'debug',
- data: { versionHistory },
- });
- };
-
- return (
-
- {children}
-
- );
-};
-
export const errorBourndaryOptions = {
onError: (error) => {
captureError(error);
@@ -39,5 +18,3 @@ export const errorBourndaryOptions = {
});
},
};
-
-export default ErrorHandler;
diff --git a/src/screens/Home/HomeScreen.tsx b/src/screens/Home/HomeScreen.tsx
index 4001490a9..4b581bddb 100644
--- a/src/screens/Home/HomeScreen.tsx
+++ b/src/screens/Home/HomeScreen.tsx
@@ -24,12 +24,11 @@ import { HomeModals } from './components/HomeModals';
import { TopSection } from './components/TopSection';
import { WalletsList } from './components/WalletList';
import InititalAppController from './InititalAppController';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import { useIndicatorHook } from 'src/hooks/useIndicatorHook';
import { uaiType } from 'src/models/interfaces/Uai';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import { goToConcierge } from 'src/store/sagaActions/concierge';
+import { SentryErrorBoundary } from 'src/services/sentry';
const calculateBalancesForVaults = (vaults) => {
let totalUnconfirmedBalance = 0;
@@ -149,7 +148,7 @@ function NewHomeScreen({ navigation }) {
);
}
-export default Sentry.withErrorBoundary(NewHomeScreen, errorBourndaryOptions);
+export default SentryErrorBoundary(NewHomeScreen);
const styles = StyleSheet.create({
container: {
diff --git a/src/screens/Home/InititalAppController.tsx b/src/screens/Home/InititalAppController.tsx
index 2bc0c25be..a320a1fb0 100644
--- a/src/screens/Home/InititalAppController.tsx
+++ b/src/screens/Home/InititalAppController.tsx
@@ -1,4 +1,3 @@
-import * as Sentry from '@sentry/react-native';
import { InteractionManager, Linking } from 'react-native';
import React, { useEffect } from 'react';
import {
@@ -10,7 +9,7 @@ import {
} from 'src/services/wallets/enums';
import TickIcon from 'src/assets/images/icon_tick.svg';
import { resetElectrumNotConnectedErr, setIsInitialLogin } from 'src/store/reducers/login';
-import { createDecipheriv, urlParamsToObj } from 'src/utils/service-utilities/utils';
+import { urlParamsToObj } from 'src/utils/service-utilities/utils';
import { useAppSelector } from 'src/store/hooks';
import useToastMessage from 'src/hooks/useToastMessage';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
@@ -22,18 +21,21 @@ import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
import { generateSignerFromMetaData } from 'src/hardware';
import { addSigningDevice, refreshCanaryWallets } from 'src/store/sagaActions/vaults';
-import { resetVaultMigration } from 'src/store/reducers/vaults';
+import { resetVaultMigration, setRemoteLinkDetails } from 'src/store/reducers/vaults';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
import dbManager from 'src/storage/realm/dbManager';
import useAsync from 'src/hooks/useAsync';
-import { sentryConfig } from 'src/services/sentry';
+import { initializeSentry } from 'src/services/sentry';
import Relay from 'src/services/backend/Relay';
-import { calculateTimeLeft } from 'src/utils/utilities';
-
-import { Psbt } from 'bitcoinjs-lib';
+import { generateDataFromPSBT, getTnxDetailsPSBT } from 'src/utils/utilities';
+import { getKeyUID } from 'src/utils/utilities';
import { updatePSBTEnvelops } from 'src/store/reducers/send_and_receive';
-import { updateKeyDetails } from 'src/store/sagaActions/wallets';
-import { decrypt } from 'src/utils/service-utilities/encryption';
+import { decrypt, getHashFromKey } from 'src/utils/service-utilities/encryption';
+import { CommonActions, useNavigationState } from '@react-navigation/native';
+import { updateCachedPsbtEnvelope } from 'src/store/reducers/cachedTxn';
+import { store } from 'src/store/store';
+import config from 'src/utils/service-utilities/config';
+import { SubscriptionTier } from 'src/models/enums/SubscriptionTier';
function InititalAppController({ navigation, electrumErrorVisible, setElectrumErrorVisible }) {
const electrumClientConnectionStatus = useAppSelector(
@@ -43,10 +45,17 @@ function InititalAppController({ navigation, electrumErrorVisible, setElectrumEr
const dispatch = useDispatch();
const { isInitialLogin } = useAppSelector((state) => state.login);
const { enableAnalyticsLogin } = useAppSelector((state) => state.settings);
- const app: KeeperApp = useQuery(RealmSchema.KeeperApp).map(getJSONFromRealmObject)[0];
+ const averageTxFees = useAppSelector((state) => state.network.averageTxFees);
+ const appData = useQuery(RealmSchema.KeeperApp);
+
+ const getAppData = (): { isPleb: boolean; appId: string } => {
+ const tempApp = appData.map(getJSONFromRealmObject)[0];
+ const isPleb = tempApp.subscription.name.toUpperCase() === SubscriptionTier.L1.toUpperCase();
+ const appId = tempApp.id.toString();
+ return { isPleb, appId };
+ };
function handleDeepLinkEvent(event) {
- console.log('🚀 ~ handleDeepLinkEvent ~ event:', event);
const { url } = event;
if (url) {
if (url.includes('backup')) {
@@ -70,109 +79,125 @@ function InititalAppController({ navigation, electrumErrorVisible, setElectrumEr
showToast('Invalid deeplink');
}
}
- if (url.includes('shareKey/')) {
+ if (url.includes('remote/')) {
handleRemoteKeyDeepLink(url);
}
}
}
+ const activeRoute = useNavigationState((state) => {
+ const route = state.routes[state.index]; // Get the active route
+ return route.name;
+ });
+
const { inProgress, start } = useAsync();
const handleRemoteKeyDeepLink = async (initialUrl: string) => {
- const [externalKeyId, encryptionKey] = initialUrl.split('shareKey/')[1].split('/');
- if (externalKeyId) {
+ const { isPleb } = getAppData();
+ if (isPleb) {
+ showToast('Upgrade to Hodler to use Remote Key Sharing');
+ return false;
+ }
+
+ const encryptionKey = initialUrl.split('remote/')[1];
+ const hash = getHashFromKey(encryptionKey);
+ if (encryptionKey && hash) {
try {
- const res = await Relay.getRemoteKey(externalKeyId);
+ const res = await Relay.getRemoteKey(hash);
if (!res) {
showToast('Remote Key link expired');
return;
}
- const { createdAt, data: response } = res;
+ const { data: response } = res;
const tempData = JSON.parse(decrypt(encryptionKey, response));
switch (tempData.type) {
case RKInteractionMode.SHARE_REMOTE_KEY:
navigation.navigate('ManageSigners', {
- receivedExternalSigner: {
- timeLeft: calculateTimeLeft(createdAt),
- data: tempData,
- },
+ remoteData: tempData,
});
break;
case RKInteractionMode.SHARE_PSBT:
- const { sendConfirmationRouteParams, signingDetails, tnxDetails, type } = tempData;
- if (signingDetails?.serializedPSBTEnvelop) {
+ const { psbt, keyUID, xfp, cachedTxid } = tempData;
+
+ if (psbt) {
try {
try {
- const signer = signers.find((s) => signingDetails.signer == s.masterFingerprint);
+ const signer = signers.find((s) => keyUID == getKeyUID(s));
if (!signer) throw { message: 'Signer not found' };
- switch (signer.type) {
- case SignerType.SEED_WORDS:
- case SignerType.BITBOX02:
- case SignerType.LEDGER:
- case SignerType.TREZOR:
- case SignerType.COLDCARD:
- case SignerType.PASSPORT:
- case SignerType.SPECTER:
- case SignerType.TAPSIGNER:
- case SignerType.JADE:
- case SignerType.MY_KEEPER:
- // TODO: Navigate to PSBTSendConfirmation with psbt details
- break;
- default:
- console.log('Signer Type Unknown', signer.type); // TODO: remove this
- break;
+ const {
+ senderAddresses,
+ receiverAddresses,
+ fees,
+ signerMatched,
+ sendAmount,
+ feeRate,
+ } = generateDataFromPSBT(psbt, signer);
+ const tnxDetails = getTnxDetailsPSBT(averageTxFees, feeRate);
+
+ if (!signerMatched) {
+ showToast(`Invalid signer selection. Please try again!`, );
+ navigation.goBack();
+ return;
}
+ dispatch(setRemoteLinkDetails({ xfp, cachedTxid }));
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'PSBTSendConfirmation',
+ params: {
+ sender: senderAddresses,
+ recipient: receiverAddresses,
+ amount: sendAmount,
+ data: psbt,
+ fees: fees,
+ estimatedBlocksBeforeConfirmation:
+ tnxDetails.estimatedBlocksBeforeConfirmation,
+ tnxPriority: tnxDetails.tnxPriority,
+ signer,
+ psbt: psbt,
+ feeRate,
+ },
+ })
+ );
} catch (e) {
showToast(e.message);
}
} catch (e) {
console.log('🚀 ~ handleRemoteKeyDeepLink ~ e:', e);
- showToast('Please scan a valid PSBT');
+ showToast('Something went wrong. Please try again!', );
}
} else {
- showToast('Invalid deeplink');
+ showToast('Invalid link. Please try again!', );
}
break;
case RKInteractionMode.SHARE_SIGNED_PSBT:
try {
- Psbt.fromBase64(tempData?.psbt); // will throw if not a psbt
- if (!tempData.isMultisig) {
- const signer = signers.find(
- (s) => tempData.vaultKey.masterFingerprint == s.masterFingerprint
+ const { psbt, xfp, cachedTxid } = tempData;
+ var state = store.getState();
+
+ if (
+ state.sendAndReceive.sendPhaseTwo.cachedTxid === cachedTxid &&
+ state.sendAndReceive.sendPhaseTwo.serializedPSBTEnvelops.length &&
+ activeRoute != 'Home'
+ ) {
+ dispatch(updatePSBTEnvelops({ xfp, signedSerializedPSBT: psbt }));
+ const navState = navigation.getState();
+ const routeIndex = navState.routes.findIndex(
+ (route) => route.name === 'SignTransactionScreen'
);
- if (signer.type === SignerType.KEYSTONE) {
- dispatch(
- updatePSBTEnvelops({ xfp: tempData.vaultKey.xfp, txHex: tempData.psbt })
- );
- } else {
- dispatch(
- updatePSBTEnvelops({
- xfp: tempData.vaultKey.xfp,
- signedSerializedPSBT: tempData.psbt,
- })
- );
+ if (routeIndex !== -1) {
+ navigation.pop(navState.index - routeIndex);
+ showToast('Remote Transaction signed successfully', );
}
} else {
- dispatch(
- updatePSBTEnvelops({
- signedSerializedPSBT: tempData?.psbt,
- xfp: tempData.vaultKey.xfp,
- })
- );
- console.log('Vault ID is :', tempData.vaultId);
- dispatch(
- updateKeyDetails(tempData.vaultKey, 'registered', {
- registered: true,
- vaultId: tempData.vaultId,
- })
- );
+ dispatch(updateCachedPsbtEnvelope({ xfp, signedSerializedPSBT: psbt, cachedTxid }));
+ showToast('Remote Transaction signed successfully', );
}
} catch (err) {
+ if (err.message) showToast(err.message, );
console.log('🚀 ~ handleRemoteKeyDeepLink ~ err:', err);
}
-
break;
default:
break;
@@ -190,12 +215,10 @@ function InititalAppController({ navigation, electrumErrorVisible, setElectrumEr
if (inProgress) {
return;
}
- if (enableAnalyticsLogin) {
- await start(() => Sentry.init(sentryConfig));
- } else {
- await start(() => Sentry.init({ ...sentryConfig, enabled: false }));
+ if (enableAnalyticsLogin && config.isDevMode()) {
+ await start(() => initializeSentry());
}
- dbManager.updateObjectById(RealmSchema.KeeperApp, app.id, {
+ dbManager.updateObjectById(RealmSchema.KeeperApp, getAppData().appId, {
enableAnalytics: enableAnalyticsLogin,
});
};
@@ -233,7 +256,7 @@ function InititalAppController({ navigation, electrumErrorVisible, setElectrumEr
showToast('Invalid deeplink');
}
} else if (initialUrl.includes('create/')) {
- } else if (initialUrl.includes('shareKey/')) {
+ } else if (initialUrl.includes('remote/')) {
handleRemoteKeyDeepLink(initialUrl);
}
}
diff --git a/src/screens/Home/components/CurrencyInfo.tsx b/src/screens/Home/components/CurrencyInfo.tsx
index 6f9e54ad2..8ac9e8b85 100644
--- a/src/screens/Home/components/CurrencyInfo.tsx
+++ b/src/screens/Home/components/CurrencyInfo.tsx
@@ -15,7 +15,7 @@ interface ICurrencyInfo {
bold?: boolean;
color?: string;
balanceMaxWidth?: number;
- variation?: 'light' | 'green' | 'dark' | 'grey';
+ variation?: 'light' | 'green' | 'dark' | 'grey' | 'slateGreen' | 'richBlack';
}
function CurrencyInfo({
hideAmounts,
diff --git a/src/screens/Home/components/HeaderDetails/components/CurrentPlanView.tsx b/src/screens/Home/components/HeaderDetails/components/CurrentPlanView.tsx
index 0f9a105df..e3cf7003a 100644
--- a/src/screens/Home/components/HeaderDetails/components/CurrentPlanView.tsx
+++ b/src/screens/Home/components/HeaderDetails/components/CurrentPlanView.tsx
@@ -23,8 +23,6 @@ import { hp, wp } from 'src/constants/responsive';
import TickIcon from 'src/assets/images/icon_tick.svg';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
import { capitalizeEachWord } from 'src/utils/utilities';
-import { SubscriptionTier } from 'src/models/enums/SubscriptionTier';
-import UpgradePill from './UpgradePill';
function CurrentPlanView({ plan }) {
const navigation = useNavigation();
@@ -35,7 +33,6 @@ function CurrentPlanView({ plan }) {
const { login } = translations;
const [showModal, setShowModal] = useState(false);
const { statusMessage, isOffline, isLoading } = useAppSelector((state) => state?.login);
- const isDiamondHands = plan === SubscriptionTier.L3.toUpperCase();
useEffect(() => {
if (statusMessage.message) {
@@ -72,7 +69,6 @@ function CurrentPlanView({ plan }) {
)}
- {!isOffline && !isDiamondHands && }
{
const getWalletTags = (wallet) => {
if (wallet.entityKind === EntityKind.VAULT) {
if (wallet.type === VaultType.SINGE_SIG) {
- return ['SINGLE-KEY', 'COLD'];
- } else
- return [
- `${wallet.type === VaultType.COLLABORATIVE ? 'COLLABORATIVE' : 'VAULT'}`,
- `${(wallet as Vault).scheme.m} of ${(wallet as Vault).scheme.n}`,
- ];
+ return ['Single Key', 'Cold'];
+ } else if (wallet.type === VaultType.COLLABORATIVE) {
+ return ['Collaborative', `${(wallet as Vault).scheme.m} of ${(wallet as Vault).scheme.n}`];
+ } else if (wallet.type === VaultType.ASSISTED) {
+ return ['Assisted', `${(wallet as Vault).scheme.m} of ${(wallet as Vault).scheme.n}`];
+ } else if (wallet.type === VaultType.TIMELOCKED) {
+ return ['Timelocked', `${(wallet as Vault).scheme.m} of ${(wallet as Vault).scheme.n}`];
+ } else if (wallet.type === VaultType.INHERITANCE) {
+ return ['Inheritance Key', `${(wallet as Vault).scheme.m} of ${(wallet as Vault).scheme.n}`];
+ } else {
+ return ['Vault', `${(wallet as Vault).scheme.m} of ${(wallet as Vault).scheme.n}`];
+ }
} else {
let walletKind;
- if (wallet.type === WalletType.DEFAULT) walletKind = 'HOT WALLET';
+ if (wallet.type === WalletType.DEFAULT) walletKind = 'Hot Wallet';
else if (wallet.type === WalletType.IMPORTED) {
const isWatchOnly = !idx(wallet as Wallet, (_) => _.specs.xpriv);
- if (isWatchOnly) walletKind = 'WATCH ONLY';
- else walletKind = 'IMPORTED WALLET';
+ if (isWatchOnly) walletKind = 'Watch Only';
+ else walletKind = 'Imported Wallet';
}
let isTaprootWallet = false;
const derivationPath = idx(wallet, (_) => _.derivationDetails.xDerivationPath);
if (derivationPath && WalletUtilities.getPurpose(derivationPath) === DerivationPurpose.BIP86) {
isTaprootWallet = true;
}
- if (isTaprootWallet) return ['TAPROOT', walletKind];
- else return ['SINGLE-KEY', walletKind];
+ if (isTaprootWallet) return ['Taproot', walletKind];
+ else return ['Single Key', walletKind];
}
};
const getWalletIcon = (wallet) => {
if (wallet.entityKind === EntityKind.VAULT) {
- if (wallet.type === VaultType.SINGE_SIG) return ;
- else return wallet.type === VaultType.COLLABORATIVE ? : ;
+ if (wallet.type === VaultType.SINGE_SIG) {
+ return ;
+ } else if (wallet.type === VaultType.COLLABORATIVE) {
+ return ;
+ } else if (wallet.type === VaultType.ASSISTED) {
+ return ;
+ } else {
+ return ;
+ }
} else {
return ;
}
diff --git a/src/screens/Inheritance/IKSAddEmailPhone.tsx b/src/screens/Inheritance/IKSAddEmailPhone.tsx
index ac2a8cd6a..b2f2a4ad7 100644
--- a/src/screens/Inheritance/IKSAddEmailPhone.tsx
+++ b/src/screens/Inheritance/IKSAddEmailPhone.tsx
@@ -17,7 +17,7 @@ import TickIcon from 'src/assets/images/icon_tick.svg';
import useSignerMap from 'src/hooks/useSignerMap';
import { useDispatch } from 'react-redux';
import { updateSignerDetails } from 'src/store/sagaActions/wallets';
-import { emailCheck } from 'src/utils/utilities';
+import { emailCheck, getKeyUID } from 'src/utils/utilities';
import Note from 'src/components/Note/Note';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import { useAppSelector } from 'src/store/hooks';
@@ -33,7 +33,7 @@ function IKSAddEmailPhone({ route }) {
const { signerMap } = useSignerMap() as { signerMap: { [key: string]: Signer } };
const dispatch = useDispatch();
const [ikVaultKey] = vault.signers.filter(
- (vaultKey) => signerMap[vaultKey.masterFingerprint].type === SignerType.INHERITANCEKEY
+ (vaultKey) => signerMap[getKeyUID(vaultKey)].type === SignerType.INHERITANCEKEY
);
const { colorMode } = useColorMode();
const navigation = useNavigation();
@@ -43,7 +43,7 @@ function IKSAddEmailPhone({ route }) {
const updateIKSPolicy = async (email: string) => {
try {
- const IKSigner = signerMap[ikVaultKey.masterFingerprint];
+ const IKSigner = signerMap[getKeyUID(ikVaultKey)];
if (IKSigner.inheritanceKeyInfo === undefined) {
showToast(vaultTranslation.IKSconfMissToast, );
}
diff --git a/src/screens/Inheritance/InheritanceStatus.tsx b/src/screens/Inheritance/InheritanceStatus.tsx
index f5d816610..5ab592d66 100644
--- a/src/screens/Inheritance/InheritanceStatus.tsx
+++ b/src/screens/Inheritance/InheritanceStatus.tsx
@@ -32,6 +32,7 @@ import { Signer } from 'src/services/wallets/interfaces/vault';
import IKSetupSuccessModal from './components/IKSetupSuccessModal';
import InheritanceDownloadView from './components/InheritanceDownloadView';
import InheritanceSupportView from './components/InheritanceSupportView';
+import { getKeyUID } from 'src/utils/utilities';
function InheritanceStatus({ route }) {
const { vaultId } = route.params;
@@ -55,7 +56,7 @@ function InheritanceStatus({ route }) {
useEffect(() => {
if (activeVault && activeVault.signers) {
const [ikVaultKey] = activeVault.signers.filter(
- (vaultKey) => signerMap[vaultKey.masterFingerprint].type === SignerType.INHERITANCEKEY
+ (vaultKey) => signerMap[getKeyUID(vaultKey)].type === SignerType.INHERITANCEKEY
);
if (ikVaultKey) setIsSetupDone(true);
else setIsSetupDone(false);
diff --git a/src/screens/InheritanceToolsAndTips/AssistedKeysSlider.tsx b/src/screens/InheritanceToolsAndTips/AssistedKeysSlider.tsx
index 551090ddb..ff76140b2 100644
--- a/src/screens/InheritanceToolsAndTips/AssistedKeysSlider.tsx
+++ b/src/screens/InheritanceToolsAndTips/AssistedKeysSlider.tsx
@@ -1,7 +1,6 @@
import React, { useState, useEffect, useRef } from 'react';
import { StyleSheet, SafeAreaView, FlatList, Dimensions, BackHandler } from 'react-native';
import { Box, useColorMode } from 'native-base';
-import TipsSliderContentComponent from './components/TipsSliderContentComponent';
import AssistedKeysContentSlider from './components/AssistedKeysSliderContent';
import { wp } from 'src/constants/responsive';
@@ -11,6 +10,7 @@ function AssistedKeysSlider({ items }) {
const onboardingSlideRef = useRef(null);
const [currentPosition, setCurrentPosition] = useState(0);
const { colorMode } = useColorMode();
+ const showSliderIndicator = false;
useEffect(() => {
const backAction = () => true;
@@ -69,14 +69,16 @@ function AssistedKeysSlider({ items }) {
)}
/>
-
- {items.map((item, index) => (
-
- ))}
-
+ {showSliderIndicator && (
+
+ {items.map((item, index) => (
+
+ ))}
+
+ )}
);
diff --git a/src/screens/InheritanceToolsAndTips/KeySecurity.tsx b/src/screens/InheritanceToolsAndTips/KeySecurity.tsx
index f90c6f752..31f75049a 100644
--- a/src/screens/InheritanceToolsAndTips/KeySecurity.tsx
+++ b/src/screens/InheritanceToolsAndTips/KeySecurity.tsx
@@ -65,8 +65,8 @@ function KeySecurity({ navigation }) {
/>
: }
callback={() => navigate('AssistedKeys', ASSISTED_KEYS)}
/>
diff --git a/src/screens/InheritanceToolsAndTips/components/AssistedKeys.tsx b/src/screens/InheritanceToolsAndTips/components/AssistedKeys.tsx
index 476ffdeb9..f51c0d8f2 100644
--- a/src/screens/InheritanceToolsAndTips/components/AssistedKeys.tsx
+++ b/src/screens/InheritanceToolsAndTips/components/AssistedKeys.tsx
@@ -2,10 +2,8 @@ import React, { useContext } from 'react';
import { useColorMode } from 'native-base';
import ScreenWrapper from 'src/components/ScreenWrapper';
import InheritanceHeader from '../InheritanceHeader';
-import SigningServer from 'src/assets/images/ss-green.svg';
import InheritanceKey from 'src/assets/images/iks-green.svg';
-import AssistedKeysIcon from 'src/assets/images/assisted-key.svg';
import InheritanceKeyIcon from 'src/assets/images/inheritance-key.svg';
import AssistedKeysSlider from '../AssistedKeysSlider';
import { CommonActions, useNavigation } from '@react-navigation/native';
@@ -17,29 +15,22 @@ function InheritanceTips({}) {
const { translations } = useContext(LocalizationContext);
const { inheritancePlanning } = translations;
const tips = [
- {
- title: inheritancePlanning.signingServerHeading,
- description: inheritancePlanning.signingServerDescp,
- icon: ,
- paragraph2: inheritancePlanning.signingServerParagraph2,
- paragraph: inheritancePlanning.signingServerParagraph1,
- callback: () => navigation.dispatch(CommonActions.navigate({ name: 'ManageSigners' })),
- buttonIcon: ,
- buttonTitle: inheritancePlanning.signingServerCtaTitle,
- buttonDescription: inheritancePlanning.signingServerCtaDescp,
- note: inheritancePlanning.signingServerNotes,
- },
{
title: inheritancePlanning.inheritanceKey,
description: inheritancePlanning.inheritanceKeyDescp,
icon: ,
paragraph2: inheritancePlanning.inheritanceKeyParagraph2,
paragraph: inheritancePlanning.inheritanceKeyParagraph1,
- callback: () => navigation.dispatch(CommonActions.navigate({ name: 'ManageSigners' })),
+ callback: () =>
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'VaultSetup',
+ params: { isAddInheritanceKeyFromParams: true, scheme: { m: 2, n: 3 } },
+ })
+ ),
buttonIcon: ,
buttonTitle: inheritancePlanning.inheritanceKeyCtaTitle,
- buttonDescription: inheritancePlanning.inheritanceKeyCtaDescp,
note: inheritancePlanning.inheritanceKeyCtaNotes,
},
];
diff --git a/src/screens/InheritanceToolsAndTips/components/AssistedKeysSliderContent.tsx b/src/screens/InheritanceToolsAndTips/components/AssistedKeysSliderContent.tsx
index 873e72038..08841ae34 100644
--- a/src/screens/InheritanceToolsAndTips/components/AssistedKeysSliderContent.tsx
+++ b/src/screens/InheritanceToolsAndTips/components/AssistedKeysSliderContent.tsx
@@ -30,13 +30,13 @@ function AssistedKeysContentSlider(props) {
>
{props.description}
-
+
{props.paragraph}
{props.icon}
-
+
{props.paragraph2}
diff --git a/src/screens/InheritanceToolsAndTips/components/LetterOfAttorney.tsx b/src/screens/InheritanceToolsAndTips/components/LetterOfAttorney.tsx
index 79c5b00ab..3451ee4fd 100644
--- a/src/screens/InheritanceToolsAndTips/components/LetterOfAttorney.tsx
+++ b/src/screens/InheritanceToolsAndTips/components/LetterOfAttorney.tsx
@@ -1,4 +1,4 @@
-import React, { useContext } from 'react';
+import React, { useContext, useState } from 'react';
import { Box, ScrollView, useColorMode } from 'native-base';
import { StyleSheet } from 'react-native';
import { useNavigation } from '@react-navigation/native';
@@ -15,19 +15,21 @@ import DashedButton from 'src/components/DashedButton';
import GenerateLetterToAtternyPDFInheritanceTool from 'src/utils/GenerateLetterToAtternyPDFInheritanceTool';
import DownArrow from 'src/assets/images/down_arrow.svg';
import { LocalizationContext } from 'src/context/Localization/LocContext';
+import useSigners from 'src/hooks/useSigners';
+import PasscodeVerifyModal from 'src/components/Modal/PasscodeVerify';
+import KeeperModal from 'src/components/KeeperModal';
function LetterOfAttorney() {
- const { allVaults } = useVault({
- includeArchived: false,
- getFirst: true,
- getHiddenWallets: false,
- });
- const fingerPrints = allVaults[0]?.signers.map((signer) => signer.masterFingerprint);
+ const { signers } = useSigners();
+ const fingerPrints = signers
+ .filter((signer) => !signer.isBIP85)
+ .map((signer) => signer.masterFingerprint);
const { colorMode } = useColorMode();
const navigation = useNavigation();
const { showToast } = useToastMessage();
const { translations } = useContext(LocalizationContext);
const { inheritancePlanning } = translations;
+ const [confirmPassVisible, setConfirmPassVisible] = useState(false);
return (
@@ -53,15 +55,7 @@ function LetterOfAttorney() {
icon={ }
description={inheritancePlanning.letterOfAttorneyCtaDescp}
callback={() => {
- if (fingerPrints) {
- GenerateLetterToAtternyPDFInheritanceTool(fingerPrints).then((res) => {
- if (res) {
- navigation.navigate('PreviewPDF', { source: res });
- }
- });
- } else {
- showToast('No vaults found');
- }
+ setConfirmPassVisible(true);
}}
name={inheritancePlanning.letterOfAttorneyCtaTitle}
/>
@@ -76,6 +70,37 @@ function LetterOfAttorney() {
+ setConfirmPassVisible(false)}
+ title="Confirm Passcode"
+ subTitleWidth={wp(240)}
+ subTitle="To backup app Recovery Key"
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ subTitleColor={`${colorMode}.secondaryText`}
+ textColor={`${colorMode}.primaryText`}
+ Content={() => (
+ {
+ setConfirmPassVisible(false);
+ }}
+ onSuccess={() => {
+ setConfirmPassVisible(false);
+ if (fingerPrints) {
+ GenerateLetterToAtternyPDFInheritanceTool(fingerPrints).then((res) => {
+ if (res) {
+ navigation.navigate('PreviewPDF', { source: res });
+ }
+ });
+ } else {
+ showToast('No vaults found');
+ }
+ }}
+ />
+ )}
+ />
);
}
diff --git a/src/screens/InheritanceToolsAndTips/components/TipsSliderContentComponent.tsx b/src/screens/InheritanceToolsAndTips/components/TipsSliderContentComponent.tsx
index dafba2e8d..c10243798 100644
--- a/src/screens/InheritanceToolsAndTips/components/TipsSliderContentComponent.tsx
+++ b/src/screens/InheritanceToolsAndTips/components/TipsSliderContentComponent.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import Text from 'src/components/KeeperText';
import { Box, ScrollView, useColorMode } from 'native-base';
import { Dimensions, StyleSheet } from 'react-native';
-import { hp } from 'src/constants/responsive';
+import { hp, wp } from 'src/constants/responsive';
const { width } = Dimensions.get('window');
function OnboardingSlideComponent(props) {
@@ -41,6 +41,7 @@ const styles = StyleSheet.create({
},
icon: {
marginVertical: hp(20),
+ marginRight: wp(30),
alignItems: 'center',
},
});
diff --git a/src/screens/LoginScreen/CreatePin.tsx b/src/screens/LoginScreen/CreatePin.tsx
index a3791eb93..256d59cae 100644
--- a/src/screens/LoginScreen/CreatePin.tsx
+++ b/src/screens/LoginScreen/CreatePin.tsx
@@ -12,34 +12,40 @@ import { useAppDispatch, useAppSelector } from 'src/store/hooks';
import KeyPadView from 'src/components/AppNumPad/KeyPadView';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import DeleteIcon from 'src/assets/images/deleteLight.svg';
-import DowngradeToPleb from 'src/assets/images/downgradetopleb.svg';
import Passwordlock from 'src/assets/images/passwordlock.svg';
-import AnalyticsIllustration from 'src/assets/images/analytics-illustration.svg';
import { storeCreds, switchCredsChanged } from 'src/store/sagaActions/login';
import KeeperModal from 'src/components/KeeperModal';
-import { setEnableAnalyticsLogin } from 'src/store/reducers/settings';
import { setIsInitialLogin } from 'src/store/reducers/login';
import { throttle } from 'src/utils/utilities';
import Buttons from 'src/components/Buttons';
import PinDotView from 'src/components/AppPinInput/PinDotView';
+import { setEnableAnalyticsLogin } from 'src/store/reducers/settings';
+import config from 'src/utils/service-utilities/config';
+
+enum PasscodeStages {
+ CREATE = 'CREATE',
+ CONFIRM = 'CONFIRM',
+}
export default function CreatePin(props) {
const { colorMode } = useColorMode();
- const [passcode, setPasscode] = useState('');
- const [confirmPasscode, setConfirmPasscode] = useState('');
- const [passcodeFlag, setPasscodeFlag] = useState(true);
+ const [pinState, setPinState] = useState({
+ value: '',
+ stage: PasscodeStages.CREATE,
+ });
const [createPassword, setCreatePassword] = useState(false);
- const [confirmPasscodeFlag, setConfirmPasscodeFlag] = useState(0);
- const [shareAnalyticsModal, setShareAnalyticsModal] = useState(false);
const { oldPasscode } = props.route.params || {};
const dispatch = useAppDispatch();
const { credsChanged, hasCreds } = useAppSelector((state) => state.login);
- const [isDisabled, setIsDisabled] = useState(true);
const { translations } = useContext(LocalizationContext);
- const { login } = translations;
- const { common } = translations;
- const analyticsEnabled = useAppSelector((state) => state.settings.enableAnalytics);
+ const { login, common } = translations;
+
+ const createPin = pinState.value.slice(0, 4);
+ const confirmPin = pinState.value.slice(4, 8);
+ const isCreateComplete = createPin.length === 4;
+ const isConfirmComplete = confirmPin.length === 4;
+ const isPinMatch = isConfirmComplete && createPin === confirmPin;
useEffect(() => {
if (hasCreds) {
@@ -47,63 +53,12 @@ export default function CreatePin(props) {
}
}, [hasCreds]);
- const onPressNumber = throttle((text) => {
- let tmpPasscode = passcode;
- let tmpConfirmPasscode = confirmPasscode;
-
- if (passcodeFlag) {
- if (passcode.length < 4 && text !== 'x') {
- tmpPasscode += text;
- setPasscode(tmpPasscode);
- } else if (text === 'x') {
- setPasscode(passcode.slice(0, -1));
- }
- } else if (confirmPasscodeFlag) {
- if (confirmPasscode.length < 4 && text !== 'x') {
- tmpConfirmPasscode += text;
- setConfirmPasscode(tmpConfirmPasscode);
- } else if (text === 'x') {
- setConfirmPasscode(confirmPasscode.slice(0, -1));
- }
- }
- }, 300);
-
- const onDeletePressed = (text) => {
- if (passcodeFlag) {
- setPasscode(passcode.slice(0, -1));
- } else {
- setConfirmPasscode(confirmPasscode.slice(0, confirmPasscode.length - 1));
- }
- };
-
- useEffect(() => {
- if (confirmPasscode.length <= 4 && confirmPasscode.length > 0 && passcode.length === 4) {
- setPasscodeFlag(false);
- setConfirmPasscodeFlag(2);
- } else if (passcode.length === 4 && confirmPasscodeFlag !== 2) {
- setPasscodeFlag(false);
- setConfirmPasscodeFlag(1);
- } else if (
- !confirmPasscode &&
- passcode.length > 0 &&
- passcode.length <= 4 &&
- confirmPasscodeFlag === 2
- ) {
- setPasscodeFlag(true);
- setConfirmPasscodeFlag(0);
- } else if (!confirmPasscode && passcode.length > 0 && passcode.length <= 4) {
- setPasscodeFlag(true);
- setConfirmPasscodeFlag(0);
- }
- }, [passcode, confirmPasscode]);
-
useEffect(() => {
if (credsChanged === 'changed') {
- setIsDisabled(false);
if (oldPasscode === '') {
dispatch(switchCredsChanged());
props.navigation.goBack();
- if (props.navigation.state.params.onPasscodeReset) {
+ if (props.navigation.state.params?.onPasscodeReset) {
props.navigation.state.params.onPasscodeReset();
}
} else {
@@ -112,29 +67,55 @@ export default function CreatePin(props) {
}
}, [credsChanged]);
- useEffect(() => {
- if (passcode === confirmPasscode && passcode.length === 4) {
- setIsDisabled(false);
- } else {
- setIsDisabled(true);
- }
- }, [passcode, confirmPasscode]);
+ const onPressNumber = throttle((text) => {
+ setPinState((currentState) => {
+ const currentLength = currentState.value.length;
+
+ if (currentLength === 4) {
+ return {
+ value: currentState.value + text,
+ stage: PasscodeStages.CONFIRM,
+ };
+ }
+
+ if (currentLength < 8) {
+ return {
+ ...currentState,
+ value: currentState.value + text,
+ stage: currentLength < 4 ? PasscodeStages.CREATE : PasscodeStages.CONFIRM,
+ };
+ }
+
+ return currentState;
+ });
+ }, 300);
+
+ const onDeletePressed = throttle(() => {
+ setPinState((currentState) => {
+ const currentLength = currentState.value.length;
+
+ if (currentLength === 0) return currentState;
+ if (currentLength === 5) {
+ return {
+ value: currentState.value.slice(0, 4),
+ stage: PasscodeStages.CREATE,
+ };
+ }
+ return {
+ ...currentState,
+ value: currentState.value.slice(0, -1),
+ stage: currentLength <= 5 ? PasscodeStages.CREATE : PasscodeStages.CONFIRM,
+ };
+ });
+ }, 300);
+
+ const handleNext = () => {
+ dispatch(setIsInitialLogin(true));
+ dispatch(setEnableAnalyticsLogin(config.isDevMode()));
+ dispatch(storeCreds(createPin));
+ setCreatePassword(false);
+ };
- function ElectrumErrorContent() {
- const { colorMode } = useColorMode();
- return (
-
-
-
-
-
-
- Please try again later
-
-
-
- );
- }
function CreatePassModalContent() {
return (
@@ -148,26 +129,6 @@ export default function CreatePin(props) {
);
}
- function ShareAnalyticsModalContent() {
- return (
-
-
-
-
-
- {login.shareAnalyticsDesc}
-
-
- );
- }
-
- const handleShareAnalytics = (enable) => {
- dispatch(setIsInitialLogin(true));
- dispatch(setEnableAnalyticsLogin(enable));
- dispatch(storeCreds(passcode));
- setShareAnalyticsModal(false);
- };
-
return (
{login.Createpasscode}
-
+
- {passcode.length === 4 ? (
+ {isCreateComplete && (
{login.Confirmyourpasscode}
-
- {passcode !== confirmPasscode && confirmPasscode.length === 4 && (
+
+ {isConfirmComplete && !isPinMatch && (
{login.MismatchPasscode}
)}
- ) : null}
+ )}
{
- setCreatePassword(true);
- }}
+ primaryCallback={() => setCreatePassword(true)}
primaryText={common.create}
- primaryDisable={isDisabled}
+ primaryDisable={!isPinMatch}
primaryBackgroundColor={`${colorMode}.buttonText`}
primaryTextColor={`${colorMode}.pantoneGreen`}
fullWidth
@@ -240,36 +199,13 @@ export default function CreatePin(props) {
showCloseIcon={false}
buttonText="Continue"
secondaryButtonText="Back"
- buttonCallback={() => {
- setCreatePassword(false);
- setShareAnalyticsModal(true);
- }}
+ buttonCallback={handleNext}
secondaryCallback={() => {
setCreatePassword(false);
}}
Content={CreatePassModalContent}
subTitleWidth={wp(80)}
/>
- {}}
- title={login.shareAnalyticsTitle}
- subTitle={login.shareAnalyticsSubTitle}
- modalBackground={`${colorMode}.primaryBackground`}
- subTitleColor={`${colorMode}.secondaryText`}
- textColor={`${colorMode}.modalGreenTitle`}
- showCloseIcon={false}
- buttonText={common.share}
- secondaryButtonText={common.dontShare}
- buttonCallback={() => {
- handleShareAnalytics(true);
- }}
- secondaryCallback={() => {
- handleShareAnalytics(false);
- }}
- Content={ShareAnalyticsModalContent}
- subTitleWidth={wp(80)}
- />
);
}
@@ -313,12 +249,6 @@ const styles = StyleSheet.create({
textAlign: 'center',
marginTop: 18,
},
- bitcoinTestnetText: {
- fontWeight: '400',
- paddingHorizontal: 16,
- fontSize: 13,
- letterSpacing: 1,
- },
modalMessageText: {
fontSize: 13,
letterSpacing: 0.13,
diff --git a/src/screens/NFCChannel/NFCOption.tsx b/src/screens/NFCChannel/NFCOption.tsx
index 7eb8b97eb..5562211cf 100644
--- a/src/screens/NFCChannel/NFCOption.tsx
+++ b/src/screens/NFCChannel/NFCOption.tsx
@@ -113,14 +113,11 @@ function NFCOption({ nfcVisible, closeNfc, withNfcModal, setData, signerType, is
};
}, [session]);
- if (signerType !== SignerType.KEEPER) {
- return null;
- }
return (
<>
} title="NFC on Tap" callback={readFromNFC} />
- } title={`Upload File`} callback={selectFile} />
+ } title="Upload File" callback={selectFile} />
{/* // ! Hide Remote Key */}
{/* ();
@@ -100,11 +99,11 @@ function ShareWithNfc({
};
const shareWithAirdrop = async () => {
- const shareFileName = fileName
- ? fileName
- : isPSBTSharing
- ? `${vaultId}-${vaultKey?.xfp}-${Date.now()}.psbt`
- : `cosigner-${signer?.masterFingerprint}.txt`;
+ const shareFileName =
+ fileName ||
+ (isPSBTSharing
+ ? `${vaultId}-${vaultKey?.xfp}-${Date.now()}.psbt`
+ : `cosigner-${signer?.masterFingerprint}.txt`);
try {
await exportFile(
data,
@@ -126,25 +125,20 @@ function ShareWithNfc({
title={`${isIos ? 'Airdrop / ' : ''}File Export`}
callback={shareWithAirdrop}
/>
- {/* // ! Hide Remote Key */}
- {/* {remoteShare && ( */}
- {false && (
+ {remoteShare && (
}
title={!isPSBTSharing ? 'Remote share' : 'Share PSBT Link'}
callback={() =>
navigation.navigate('RemoteSharing', {
- isPSBTSharing,
- signer,
- psbt,
+ psbt: data,
mode: isPSBTSharing
- ? RKInteractionMode.SHARE_PSBT
+ ? isSignedPSBT
+ ? RKInteractionMode.SHARE_SIGNED_PSBT
+ : RKInteractionMode.SHARE_PSBT
: RKInteractionMode.SHARE_REMOTE_KEY,
- vaultKey,
- vaultId,
- serializedPSBTEnvelop,
- sendConfirmationRouteParams,
- tnxDetails,
+ signer,
+ xfp,
})
}
/>
diff --git a/src/screens/QRScreens/DisplayQR.tsx b/src/screens/QRScreens/DisplayQR.tsx
index 3e7ddaf75..7b3618fd2 100644
--- a/src/screens/QRScreens/DisplayQR.tsx
+++ b/src/screens/QRScreens/DisplayQR.tsx
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
import useDynamicQrContent from 'src/hooks/useDynamicQrContent';
import { BufferEncoding } from 'src/models/enums/BufferEncoding';
import { VStack, Slider, useColorMode } from 'native-base';
-import { windowWidth } from 'src/constants/responsive';
+import { windowWidth, wp } from 'src/constants/responsive';
import Text from 'src/components/KeeperText';
import KeeperQRCode from 'src/components/KeeperQRCode';
diff --git a/src/screens/QRScreens/ScanQR.tsx b/src/screens/QRScreens/ScanQR.tsx
index a056e2c4c..e880af78b 100644
--- a/src/screens/QRScreens/ScanQR.tsx
+++ b/src/screens/QRScreens/ScanQR.tsx
@@ -13,7 +13,6 @@ import { hp, windowWidth } from 'src/constants/responsive';
import useNfcModal from 'src/hooks/useNfcModal';
import MockWrapper from 'src/screens/Vault/MockWrapper';
-import NFCOption from '../NFCChannel/NFCOption';
import KeeperModal from 'src/components/KeeperModal';
import { useDispatch } from 'react-redux';
import { goToConcierge } from 'src/store/sagaActions/concierge';
@@ -21,8 +20,9 @@ import { ConciergeTag } from 'src/models/enums/ConciergeTag';
import { Colors } from 'react-native/Libraries/NewAppScreen';
import QRScanner from 'src/components/QRScanner';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import NFCOption from '../NFCChannel/NFCOption';
-let decoder = new URRegistryDecoder();
+const decoder = new URRegistryDecoder();
function ScanQR() {
const { colorMode } = useColorMode();
@@ -150,8 +150,8 @@ function ScanQR() {
close={() => {
setVisibleModal(false);
}}
- title={'Add a co-signer'}
- subTitle={''}
+ title="Add a co-signer"
+ subTitle=""
modalBackground={`${colorMode}.modalGreenBackground`}
textColor={`${colorMode}.modalGreenContent`}
Content={learnMoreContent}
diff --git a/src/screens/QRScreens/ShowPSBT.tsx b/src/screens/QRScreens/ShowPSBT.tsx
index 7792edd73..90cfe924c 100644
--- a/src/screens/QRScreens/ShowPSBT.tsx
+++ b/src/screens/QRScreens/ShowPSBT.tsx
@@ -34,7 +34,7 @@ function ShowPSBT() {
{[SignerType.KEEPER, SignerType.MY_KEEPER].includes(type) ? (
-
+
) : null}
@@ -44,7 +44,7 @@ function ShowPSBT() {
primaryCallback={() => {
navigation.dispatch((state) => {
const index = state.routes.findIndex(
- (route) => route.name === 'SignerAdvanceSettings'
+ (route) => route.name === 'SignerAdvanceSettings' || route.name === 'Home'
);
if (index === -1) {
return StackActions.pop(1);
diff --git a/src/screens/Recieve/ReceiveScreen.tsx b/src/screens/Recieve/ReceiveScreen.tsx
index 3df3edd91..acd826328 100644
--- a/src/screens/Recieve/ReceiveScreen.tsx
+++ b/src/screens/Recieve/ReceiveScreen.tsx
@@ -49,6 +49,7 @@ import { InteracationMode } from '../Vault/HardwareModalMap';
import { Vault } from 'src/services/wallets/interfaces/vault';
import KeyPadView from 'src/components/AppNumPad/KeyPadView';
import AmountDetailsInput from '../Send/AmountDetailsInput';
+import { getAccountFromSigner } from 'src/utils/utilities';
const AddressVerifiableSigners = [
SignerType.BITBOX02,
@@ -124,7 +125,7 @@ function ReceiveScreen({ route }: { route }) {
setTotalAddressesCount(wallet.specs.totalExternalAddresses);
setCurrentAddressIdx(wallet.specs.nextFreeAddressIndex + 1);
} else {
- const receivingAddress = WalletOperations.getExternalAddressAtIdx(
+ const receivingAddress = WalletOperations.getExternalInternalAddressAtIdx(
wallet,
currentAddressIdx - 1
);
@@ -271,6 +272,7 @@ function ReceiveScreen({ route }: { route }) {
CommonActions.navigate('SetupPortal', {
vaultId: wallet.id,
mode: InteracationMode.ADDRESS_VERIFICATION,
+ accountNumber: getAccountFromSigner(signer),
})
);
} else {
@@ -310,6 +312,7 @@ function ReceiveScreen({ route }: { route }) {
vaultKey,
vaultId: wallet.id,
mode: InteracationMode.VAULT_REGISTER,
+ accountNumber: getAccountFromSigner(signer),
})
);
} else {
diff --git a/src/screens/Recieve/SignerSelectionListScreen.tsx b/src/screens/Recieve/SignerSelectionListScreen.tsx
index b3f0c5ff3..5002baee8 100644
--- a/src/screens/Recieve/SignerSelectionListScreen.tsx
+++ b/src/screens/Recieve/SignerSelectionListScreen.tsx
@@ -6,12 +6,12 @@ import Next from 'src/assets/images/icon_arrow.svg';
import KeeperHeader from 'src/components/KeeperHeader';
import ScreenWrapper from 'src/components/ScreenWrapper';
import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import { SDIcons } from '../Vault/SigningDeviceIcons';
import { getSignerNameFromType } from 'src/hardware';
import moment from 'moment';
import useSigners from 'src/hooks/useSigners';
+import { getKeyUID } from 'src/utils/utilities';
+import { SentryErrorBoundary } from 'src/services/sentry';
const { width } = Dimensions.get('screen');
@@ -38,7 +38,7 @@ function SignerSelectionListScreen() {
item.masterFingerprint}
+ keyExtractor={(item) => getKeyUID(item)}
renderItem={({ item }) => (
{
@@ -52,7 +52,7 @@ function SignerSelectionListScreen() {
);
}
-export default Sentry.withErrorBoundary(SignerSelectionListScreen, errorBourndaryOptions);
+export default SentryErrorBoundary(SignerSelectionListScreen);
const styles = StyleSheet.create({
inheritenceView: {
diff --git a/src/screens/SeedScreens/ExportSeedScreen.tsx b/src/screens/SeedScreens/ExportSeedScreen.tsx
index b153d1f89..2ae61c944 100644
--- a/src/screens/SeedScreens/ExportSeedScreen.tsx
+++ b/src/screens/SeedScreens/ExportSeedScreen.tsx
@@ -30,6 +30,7 @@ import { setOTBStatusIKS, setOTBStatusSS } from 'src/store/reducers/settings';
import { PRIVACYANDDISPLAY } from 'src/navigation/contants';
import ScreenWrapper from 'src/components/ScreenWrapper';
import Buttons from 'src/components/Buttons';
+import { getKeyUID } from 'src/utils/utilities';
function ExportSeedScreen({ route, navigation }) {
const { colorMode } = useColorMode();
@@ -283,7 +284,7 @@ function ExportSeedScreen({ route, navigation }) {
showToast(BackupWallet.OTBSuccessMessage, );
navigation.dispatch(
CommonActions.navigate('SigningDeviceDetails', {
- signerId: signer.masterFingerprint,
+ signerId: getKeyUID(signer),
vaultId,
vaultKey,
})
diff --git a/src/screens/Send/AddSendAmount.tsx b/src/screens/Send/AddSendAmount.tsx
index c19fd6841..629986405 100644
--- a/src/screens/Send/AddSendAmount.tsx
+++ b/src/screens/Send/AddSendAmount.tsx
@@ -36,25 +36,33 @@ import CollaborativeSmallIcon from 'src/assets/images/collaborative-icon-small.s
import DeleteDarkIcon from 'src/assets/images/delete.svg';
import DeleteIcon from 'src/assets/images/deleteLight.svg';
import CollaborativeIcon from 'src/assets/images/collaborative_vault_white.svg';
+import AssistedIcon from 'src/assets/images/assisted-vault-white-icon.svg';
import WalletIcon from 'src/assets/images/daily_wallet.svg';
import VaultIcon from 'src/assets/images/vault_icon.svg';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
import { UTXO } from 'src/services/wallets/interfaces';
import config from 'src/utils/service-utilities/config';
-import { EntityKind, NetworkType, TxPriority, VaultType } from 'src/services/wallets/enums';
+import {
+ EntityKind,
+ MultisigScriptType,
+ NetworkType,
+ TxPriority,
+ VaultType,
+} from 'src/services/wallets/enums';
import idx from 'idx';
import useLabelsNew from 'src/hooks/useLabelsNew';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import HexagonIcon from 'src/components/HexagonIcon';
-import CurrencyInfo from '../Home/components/CurrencyInfo';
import { MANAGEWALLETS, VAULTSETTINGS, WALLETSETTINGS } from 'src/navigation/contants';
import KeyPadView from 'src/components/AppNumPad/KeyPadView';
-import AmountDetailsInput from './AmountDetailsInput';
import KeeperModal from 'src/components/KeeperModal';
import ArrowIcon from 'src/assets/images/icon_arrow.svg';
import ArrowIconWhite from 'src/assets/images/icon_arrow_white.svg';
import ReceiptIcon from 'src/assets/images/receipt.svg';
import ReceiptIconDark from 'src/assets/images/receipt-white.svg';
+import WalletUtilities from 'src/services/wallets/operations/utils';
+import AmountDetailsInput from './AmountDetailsInput';
+import CurrencyInfo from '../Home/components/CurrencyInfo';
import CustomPriorityModal from './CustomPriorityModal';
import PriorityModal from './PriorityModal';
@@ -102,6 +110,8 @@ function AddSendAmount({ route }) {
const sendMaxFee = useAppSelector((state) => state.sendAndReceive.sendMaxFee);
const sendPhaseOneState = useAppSelector((state) => state.sendAndReceive.sendPhaseOne);
const { averageTxFees } = useAppSelector((state) => state.network);
+ const [currentBlockHeight, setCurrentBlockHeight] = useState(null);
+
const exchangeRates = useExchangeRates();
const currencyCode = useCurrencyCode();
const currentCurrency = useAppSelector((state) => state.settings.currencyKind);
@@ -115,10 +125,7 @@ function AddSendAmount({ route }) {
parentScreen === MANAGEWALLETS ||
parentScreen === VAULTSETTINGS ||
parentScreen === WALLETSETTINGS;
- const availableBalance =
- sender.networkType === NetworkType.MAINNET
- ? sender.specs.balances.confirmed
- : sender.specs.balances.confirmed + sender.specs.balances.unconfirmed;
+ const availableBalance = sender.specs.balances.confirmed + sender.specs.balances.unconfirmed;
const isDarkMode = colorMode === 'dark';
const [localCurrencyKind, setLocalCurrencyKind] = useState(currentCurrency);
@@ -131,10 +138,7 @@ function AddSendAmount({ route }) {
const [customEstBlocks, setCustomEstBlocks] = useState(0);
const [estimationSign, setEstimationSign] = useState('≈');
const balance = idx(sender, (_) => _.specs.balances);
- let availableToSpend =
- sender.networkType === NetworkType.MAINNET
- ? balance.confirmed
- : balance.confirmed + balance.unconfirmed;
+ let availableToSpend = balance.confirmed + balance.unconfirmed;
const haveSelectedUTXOs = selectedUTXOs && selectedUTXOs.length;
if (haveSelectedUTXOs) availableToSpend = selectedUTXOs.reduce((a, c) => a + c.value, 0);
@@ -308,7 +312,29 @@ function AddSendAmount({ route }) {
}
};
+ useEffect(() => {
+ // should bind with a refresher in case the auto fetch for block-height fails
+ if (sender.entityKind === EntityKind.VAULT) {
+ if (sender.scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ WalletUtilities.fetchCurrentBlockHeight()
+ .then(({ currentBlockHeight }) => {
+ setCurrentBlockHeight(currentBlockHeight);
+ })
+ .catch((err) => showToast(err));
+ }
+ }
+ }, []);
+
const navigateToNext = () => {
+ if (sender.entityKind === EntityKind.VAULT) {
+ if (sender.scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ if (!currentBlockHeight) {
+ showToast('Unable to sync current block height');
+ return;
+ }
+ }
+ }
+
if (transactionPriority === TxPriority.CUSTOM) {
const recipients = [];
recipients.push({
@@ -332,6 +358,7 @@ function AddSendAmount({ route }) {
address,
amount: parseInt(amountToSend, 10), // in sats
transferType,
+ currentBlockHeight,
note,
selectedUTXOs,
parentScreen,
@@ -455,7 +482,7 @@ function AddSendAmount({ route }) {
setAmount('0.');
return;
}
- setAmount(currentAmount + '.');
+ setAmount(`${currentAmount}.`);
return;
}
const maxDecimalPlaces = localCurrencyKind === CurrencyKind.BITCOIN && !satsEnabled ? 8 : 2;
@@ -463,7 +490,7 @@ function AddSendAmount({ route }) {
setAmount(text);
return;
}
- let newAmount = currentAmount + text;
+ const newAmount = currentAmount + text;
const parts = newAmount.split('.');
if (parts[1] && parts[1].length > maxDecimalPlaces) {
return;
@@ -484,7 +511,13 @@ function AddSendAmount({ route }) {
const getWalletIcon = (wallet) => {
if (wallet?.entityKind === EntityKind.VAULT) {
- return wallet.type === VaultType.COLLABORATIVE ? : ;
+ if (wallet.type === VaultType.COLLABORATIVE) {
+ return ;
+ } else if (wallet.type === VaultType.ASSISTED) {
+ return ;
+ } else {
+ return ;
+ }
} else {
return ;
}
diff --git a/src/screens/Send/KeyDropdown.tsx b/src/screens/Send/KeyDropdown.tsx
new file mode 100644
index 000000000..8fc9eea2c
--- /dev/null
+++ b/src/screens/Send/KeyDropdown.tsx
@@ -0,0 +1,153 @@
+import { Box, Pressable, useColorMode } from 'native-base';
+import { StyleSheet, TouchableOpacity } from 'react-native';
+import RightArrowIcon from 'src/assets/images/icon_arrow.svg';
+import { hp } from 'src/constants/responsive';
+import { useEffect, useState } from 'react';
+import Colors from 'src/theme/Colors';
+import Text from 'src/components/KeeperText';
+import TickIcon from 'src/assets/images/icon_check.svg';
+import { Signer, VaultSigner } from 'src/services/wallets/interfaces/vault';
+import { getKeyUID } from 'src/utils/utilities';
+
+type Props = {
+ label: string;
+ options: VaultSigner[];
+ selectedOption: VaultSigner | null;
+ onOptionSelect: (option: VaultSigner) => void;
+};
+
+function KeyDropdown({ label, options, selectedOption, onOptionSelect }: Props) {
+ const { colorMode } = useColorMode();
+ const [isOpen, setIsOpen] = useState(false);
+ const [internalSelectedOption, setInternalSelectedOption] = useState(
+ selectedOption
+ );
+
+ const handlePress = () => {
+ setIsOpen(!isOpen);
+ };
+
+ const handleOptionSelect = (option: VaultSigner) => {
+ setInternalSelectedOption(option);
+ onOptionSelect(option);
+ setIsOpen(false);
+ };
+
+ useEffect(() => {
+ if (selectedOption) {
+ setInternalSelectedOption(selectedOption);
+ }
+ }, [selectedOption]);
+
+ return (
+
+
+
+
+ {selectedOption
+ ? `${selectedOption.signerName} - ${selectedOption.masterFingerprint}`
+ : label}
+
+
+
+
+
+
+
+
+
+
+ {isOpen && (
+
+ {options.map((option, index) => (
+ handleOptionSelect(option)}>
+
+
+ {`${`${option?.signerName} - ${option.masterFingerprint}`}`}
+
+ {getKeyUID(internalSelectedOption) === getKeyUID(option) && }
+
+
+ ))}
+
+ )}
+
+ );
+}
+
+export default KeyDropdown;
+
+const styles = StyleSheet.create({
+ dropdownContainer: {
+ borderRadius: 10,
+ height: hp(50),
+ marginHorizontal: 10,
+ paddingHorizontal: 20,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ arrowContainer: {
+ flexDirection: 'row',
+ height: '100%',
+ gap: 20,
+ },
+ labelText: {
+ fontSize: 14,
+ lineHeight: 24,
+ letterSpacing: 0.39,
+ },
+ optionText: {
+ fontSize: 13,
+ letterSpacing: 0.39,
+ paddingBottom: 10,
+ paddingTop: 5,
+ },
+ emptyView: {
+ height: hp(23),
+ alignSelf: 'center',
+ width: 2,
+ opacity: 0.23,
+ },
+ icArrow: {
+ alignSelf: 'center',
+ },
+ optionsContainer: {
+ width: '95%',
+ alignSelf: 'center',
+ zIndex: 999,
+ marginTop: 10,
+ borderBottomLeftRadius: 10,
+ borderBottomRightRadius: 10,
+ paddingHorizontal: 20,
+ paddingVertical: 10,
+ gap: 10,
+ },
+ optionContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ borderColor: Colors.SilverMist,
+ },
+});
diff --git a/src/screens/Send/PSBTSendConfirmation.tsx b/src/screens/Send/PSBTSendConfirmation.tsx
index 3382c0c99..fa7add610 100644
--- a/src/screens/Send/PSBTSendConfirmation.tsx
+++ b/src/screens/Send/PSBTSendConfirmation.tsx
@@ -9,14 +9,12 @@ import { LocalizationContext } from 'src/context/Localization/LocContext';
import ScreenWrapper from 'src/components/ScreenWrapper';
import { TransactionType, TxPriority } from 'src/services/wallets/enums';
import { Signer } from 'src/services/wallets/interfaces/vault';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
-
import RKSignersModal from '../../components/RKSignersModal';
import ReceiptWrapper from './ReceiptWrapper';
import TransferCard from './TransferCard';
import AmountDetails from './AmountDetails';
import CurrencyTypeSwitch from 'src/components/Switch/CurrencyTypeSwitch';
+import { SentryErrorBoundary } from 'src/services/sentry';
export interface PSBTSendConfirmationParams {
sender: { address: string; amount: number }[];
@@ -161,7 +159,7 @@ function PSBTSendConfirmation({ route }) {
);
}
-export default Sentry.withErrorBoundary(PSBTSendConfirmation, errorBourndaryOptions);
+export default SentryErrorBoundary(PSBTSendConfirmation);
const styles = StyleSheet.create({
horizontalLineStyle: {
diff --git a/src/screens/Send/SendConfirmation.tsx b/src/screens/Send/SendConfirmation.tsx
index a5a159544..86bf89725 100644
--- a/src/screens/Send/SendConfirmation.tsx
+++ b/src/screens/Send/SendConfirmation.tsx
@@ -1,17 +1,23 @@
import { StyleSheet, TouchableOpacity, ScrollView } from 'react-native';
import Text from 'src/components/KeeperText';
-import { Box, useColorMode } from 'native-base';
+import { Box, useColorMode, Pressable } from 'native-base';
import { CommonActions, useNavigation } from '@react-navigation/native';
-import React, { useContext, useEffect, useState } from 'react';
-import Share from 'react-native-share';
+import React, { useCallback, useContext, useEffect, useState } from 'react';
import { sendPhaseTwo } from 'src/store/sagaActions/send_and_receive';
import { hp, wp } from 'src/constants/responsive';
+import Share from 'react-native-share';
import Buttons from 'src/components/Buttons';
import KeeperHeader from 'src/components/KeeperHeader';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import ScreenWrapper from 'src/components/ScreenWrapper';
-import { NetworkType, TxPriority } from 'src/services/wallets/enums';
-import { Signer, Vault } from 'src/services/wallets/interfaces/vault';
+import {
+ EntityKind,
+ MultisigScriptType,
+ NetworkType,
+ TxPriority,
+ VaultType,
+} from 'src/services/wallets/enums';
+import { Vault, VaultSigner } from 'src/services/wallets/interfaces/vault';
import { Wallet } from 'src/services/wallets/interfaces/wallet';
import {
customPrioritySendPhaseOneStatusReset,
@@ -28,11 +34,14 @@ import useVault from 'src/hooks/useVault';
import PasscodeVerifyModal from 'src/components/Modal/PasscodeVerify';
import { InputUTXOs, UTXO } from 'src/services/wallets/interfaces';
import CurrencyTypeSwitch from 'src/components/Switch/CurrencyTypeSwitch';
-import CustomPriorityModal from './CustomPriorityModal';
import FeeInsights from 'src/screens/FeeInsights/FeeInsightsContent';
import useOneDayInsight from 'src/hooks/useOneDayInsight';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
+import InfoIcon from 'src/assets/images/info-icon.svg';
+import RightArrowIcon from 'src/assets/images/icon_arrow.svg';
+import HexagonIcon from 'src/components/HexagonIcon';
+import useSignerMap from 'src/hooks/useSignerMap';
+import { getAvailableMiniscriptPhase } from 'src/services/wallets/factories/VaultFactory';
+
import InvalidUTXO from 'src/assets/images/invalidUTXO.svg';
import TickIcon from 'src/assets/images/icon_tick.svg';
import ShareGreen from 'src/assets/images/share-arrow-green.svg';
@@ -42,6 +51,10 @@ import { MANAGEWALLETS, VAULTSETTINGS, WALLETSETTINGS } from 'src/navigation/con
import { refreshWallets } from 'src/store/sagaActions/wallets';
import idx from 'idx';
import { cachedTxSnapshot, dropTransactionSnapshot } from 'src/store/reducers/cachedTxn';
+import config from 'src/utils/service-utilities/config';
+import AmountChangedWarningIllustration from 'src/assets/images/amount-changed-warning-illustration.svg';
+import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import Colors from 'src/theme/Colors';
import ReceiptWrapper from './ReceiptWrapper';
import TransferCard from './TransferCard';
import TransactionPriorityDetails from './TransactionPriorityDetails';
@@ -49,10 +62,11 @@ import HighFeeAlert from './HighFeeAlert';
import FeeRateStatementCard from '../FeeInsights/FeeRateStatementCard';
import AmountDetails from './AmountDetails';
import SendSuccessfulContent from './SendSuccessfulContent';
-import config from 'src/utils/service-utilities/config';
-import AmountChangedWarningIllustration from 'src/assets/images/amount-changed-warning-illustration.svg';
import PriorityModal from './PriorityModal';
-import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import KeyDropdown from './KeyDropdown';
+import CustomPriorityModal from './CustomPriorityModal';
+import { getKeyUID } from 'src/utils/utilities';
+import { SentryErrorBoundary } from 'src/services/sentry';
const vaultTransfers = [TransferType.WALLET_TO_VAULT];
const walletTransfers = [TransferType.VAULT_TO_WALLET, TransferType.WALLET_TO_WALLET];
@@ -77,6 +91,7 @@ export interface SendConfirmationRouteParams {
parentScreen: string;
transactionPriority: TxPriority;
customFeePerByte: number;
+ currentBlockHeight: number;
}
export interface tnxDetailsProps {
@@ -84,6 +99,49 @@ export interface tnxDetailsProps {
txFeeInfo: any;
}
+export enum ASSISTED_VAULT_ENTITIES {
+ UK = 'UK',
+ AK1 = 'AK1',
+ AK2 = 'AK2',
+}
+
+const enum SigningPath {
+ UK_PLUS_AK1 = 1,
+ UK_PLUS_AK2 = 2,
+ UK_ONLY = 3,
+ AK_ONLY = 4,
+}
+
+const getSigningPathInfoText = (signingPath: SigningPath) => {
+ if (signingPath === SigningPath.UK_PLUS_AK1 || signingPath === SigningPath.UK_PLUS_AK2) {
+ return 'Both Assisted Keys and User Key can sign.';
+ } else if (signingPath === SigningPath.UK_ONLY) return 'User Key can sign.';
+ else if (signingPath === SigningPath.AK_ONLY) return 'Both Assisted Keys can sign.';
+ else return 'Invalid signing path.';
+};
+
+const getSigningPath = (availableSigners) => {
+ let signingPath;
+ if (availableSigners[ASSISTED_VAULT_ENTITIES.UK]) {
+ signingPath = SigningPath.UK_ONLY;
+ if (
+ availableSigners[ASSISTED_VAULT_ENTITIES.AK1] &&
+ availableSigners[ASSISTED_VAULT_ENTITIES.AK2]
+ ) {
+ signingPath = SigningPath.UK_PLUS_AK1; // singing default w/ AK1
+ }
+ } else {
+ if (
+ availableSigners[ASSISTED_VAULT_ENTITIES.AK1] &&
+ availableSigners[ASSISTED_VAULT_ENTITIES.AK2]
+ ) {
+ signingPath = SigningPath.AK_ONLY;
+ }
+ }
+
+ return signingPath;
+};
+
function SendConfirmation({ route }) {
const { colorMode } = useColorMode();
const { showToast } = useToastMessage();
@@ -100,6 +158,7 @@ function SendConfirmation({ route }) {
label,
selectedUTXOs,
parentScreen,
+ currentBlockHeight,
transactionPriority: initialTransactionPriority,
customFeePerByte: initialCustomFeePerByte,
}: SendConfirmationRouteParams = route.params;
@@ -130,6 +189,8 @@ function SendConfirmation({ route }) {
const isDarkMode = colorMode === 'dark';
const [visibleModal, setVisibleModal] = useState(false);
+ const [externalKeySelectionModal, setExternalKeySelectionModal] = useState(false);
+ const [visibleTransVaultModal, setVisibleTransVaultModal] = useState(false);
const [title, setTitle] = useState('Sending to address');
const [subTitle, setSubTitle] = useState('Review the transaction setup');
const [confirmPassVisible, setConfirmPassVisible] = useState(false);
@@ -141,6 +202,127 @@ function SendConfirmation({ route }) {
const [discardUTXOVisible, setDiscardUTXOVisible] = useState(false);
const [feePercentage, setFeePercentage] = useState(0);
const OneDayHistoricalFee = useOneDayInsight();
+ const [selectedExternalSigner, setSelectedExternalSigner] = useState(null);
+ const [availablePaths, setAvailablePaths] = useState(null);
+ const [selectedPhase, setSelectedPhase] = useState(null);
+ const [selectedPaths, setSelectedPaths] = useState(null);
+ const [availableSigners, setAvailableSigners] = useState({});
+ const [externalSigners, setExternalSigners] = useState([]);
+ const { signerMap } = useSignerMap();
+
+ function SigningInfo({ onPress, availableSigners }) {
+ const { colorMode } = useColorMode();
+
+ const signingPath = getSigningPath(availableSigners);
+ const disableSelection =
+ signingPath === SigningPath.UK_ONLY || signingPath === SigningPath.AK_ONLY;
+ return (
+
+
+ }
+ backgroundColor={Colors.pantoneGreen}
+ />
+ {getSigningPathInfoText(signingPath)}
+
+
+
+ );
+ }
+
+ const initialiseMiniscriptMultisigPaths = () => {
+ // specifically initialises phases/paths for miniscript Vaults(to be generalised w/ the UI)
+ if (!currentBlockHeight) {
+ showToast('Failed to sync current block height');
+ navigation.goBack();
+ return;
+ }
+
+ const { phases: availablePhases, signers: availableSigners } = getAvailableMiniscriptPhase(
+ sender as Vault,
+ currentBlockHeight
+ ); // provides available phases/signers(generic)
+
+ // upon generalisation of the UI we should be able to show/set paths
+ // in the available phases as the options which are available for the user to choose from
+
+ // currently for Advisor Vault only the latest phase and path are considered and the signers from
+ // the latest phase are only available for signing
+ if (!availablePhases || availablePhases.length === 0) {
+ showToast('No spending paths available; timelock is active');
+ navigation.goBack();
+ }
+
+ const latestPhase = availablePhases[availablePhases.length - 1];
+ const latestSigners = {};
+
+ const pathsAvailable = [];
+ latestPhase.paths.forEach((path) => {
+ pathsAvailable.push(path);
+ path.keys.forEach((key) => {
+ latestSigners[key.identifier] = availableSigners[key.identifier];
+ });
+ });
+
+ setSelectedPhase(latestPhase.id);
+ setAvailablePaths(pathsAvailable);
+ setAvailableSigners(latestSigners);
+
+ if (sender.type === VaultType.ASSISTED) {
+ const latestExtSigners = [];
+ for (const key in latestSigners) {
+ if (key === ASSISTED_VAULT_ENTITIES.AK1 || key === ASSISTED_VAULT_ENTITIES.AK2) {
+ latestExtSigners.push(signerMap[getKeyUID(availableSigners[key])]);
+ }
+ }
+ if (latestExtSigners.length === 2) {
+ // case: UK + AK1/AK2
+ // set: AK1 as default option
+ if (!selectedExternalSigner) setSelectedExternalSigner(latestExtSigners[0]);
+ }
+ setExternalSigners(latestExtSigners);
+ }
+ };
+
+ useEffect(() => {
+ if (
+ sender.entityKind === EntityKind.VAULT &&
+ (sender as Vault).scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG
+ ) {
+ // to be generalised once the generic UI is available
+ initialiseMiniscriptMultisigPaths();
+ }
+ }, []);
+
+ useEffect(() => {
+ // Assisted Vault: remapping selected path based on selected signer
+ // upon generalising the UI, user should be able to directly select the path from available paths
+ // and the additional steps of mapping the available paths to external signers and
+ // then remapping the selected signer to the available paths in order to get the selected path can be avoided
+
+ if (!availablePaths) return;
+
+ if (!selectedExternalSigner) {
+ if (availablePaths.length === 1) {
+ // case: UK only or AK1 + AK2 only
+ setSelectedPaths([availablePaths[0].id]);
+ } else setSelectedPaths(null); // error case: path is not selected b/w 1.UK + AK1 and 2.UK + AK2
+ } else {
+ // case: UK + AK1/AK2
+ const pathSelected = [];
+ availablePaths.forEach((path) => {
+ path.keys.forEach((key) => {
+ if (getKeyUID(availableSigners[key.identifier]) === getKeyUID(selectedExternalSigner)) {
+ pathSelected.push(path.id);
+ }
+ });
+ });
+ setSelectedPaths(pathSelected);
+ }
+ }, [selectedExternalSigner, availablePaths]);
+
const isMoveAllFunds =
parentScreen === MANAGEWALLETS ||
parentScreen === VAULTSETTINGS ||
@@ -270,6 +452,17 @@ function SendConfirmation({ route }) {
setProgress(true);
};
+ const handleOptionSelect = useCallback(
+ (option: VaultSigner) => {
+ if (selectedExternalSigner && getKeyUID(selectedExternalSigner) !== getKeyUID(option)) {
+ if (serializedPSBTEnvelops) dispatch(sendPhaseTwoReset()); // reset, existing send phase two vars, upon change of signer
+ }
+ setSelectedExternalSigner(option);
+ setExternalKeySelectionModal(false);
+ },
+ [selectedExternalSigner, serializedPSBTEnvelops]
+ );
+
// useEffect(
// () => () => {
// dispatch(sendPhaseTwoReset());
@@ -283,13 +476,28 @@ function SendConfirmation({ route }) {
// case: cached transaction; do not reset sendPhase as we already have phase two set via cache
} else {
// case: new transaction
+
if (inProgress) {
+ if (
+ sender.entityKind === EntityKind.VAULT &&
+ (sender as Vault).scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG
+ ) {
+ if (!selectedPhase || !selectedPaths) {
+ showToast('Invalid phase/path selection', );
+ return;
+ }
+ }
+
setTimeout(() => {
dispatch(sendPhaseTwoReset());
dispatch(
sendPhaseTwo({
wallet: sender,
txnPriority: transactionPriority,
+ miniscriptTxElements: {
+ selectedPhase,
+ selectedPaths,
+ },
note,
label,
transferType,
@@ -298,7 +506,7 @@ function SendConfirmation({ route }) {
}, 200);
}
}
- }, [inProgress]);
+ }, [inProgress, selectedPhase, selectedPaths]);
const { activeVault: currentSender } = useVault({ vaultId: sender?.id }); // current state of vault
@@ -317,10 +525,7 @@ function SendConfirmation({ route }) {
const unconfirmedUTXOs: InputUTXOs[] =
idx(currentSender, (_) => _.specs.unconfirmedUTXOs) || [];
- const currentUTXOSet =
- currentSender.networkType === NetworkType.MAINNET
- ? confirmedUTXOs
- : [...confirmedUTXOs, ...unconfirmedUTXOs];
+ const currentUTXOSet = [...confirmedUTXOs, ...unconfirmedUTXOs];
for (const cachedUTXO of cachedInputUTXOs) {
let found = false;
@@ -365,8 +570,12 @@ function SendConfirmation({ route }) {
note,
label,
vaultId: sender?.id,
- sender: sender,
+ sender,
sendConfirmationRouteParams: route.params,
+ miniscriptTxElements: {
+ selectedPhase,
+ selectedPaths,
+ },
tnxDetails: {
txFeeInfo,
transactionPriority,
@@ -375,7 +584,7 @@ function SendConfirmation({ route }) {
);
setProgress(false);
}
- }, [serializedPSBTEnvelops, inProgress]);
+ }, [serializedPSBTEnvelops, selectedPhase, selectedPaths, inProgress]);
useEffect(
() => () => {
@@ -453,7 +662,7 @@ function SendConfirmation({ route }) {
try {
await Share.open({
message: 'The transaction has been successfully sent. You can track its status here:',
- url: url,
+ url,
title: 'Transaction Details',
});
} catch (err) {
@@ -642,6 +851,29 @@ function SendConfirmation({ route }) {
/>
)}
/>
+ setExternalKeySelectionModal(false)}
+ title="External Key Selection"
+ subTitle="Whose key should be used to sign the transaction along with yours?"
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ subTitleColor={`${colorMode}.secondaryText`}
+ textColor={`${colorMode}.primaryText`}
+ buttonTextColor={`${colorMode}.white`}
+ showCloseIcon={false}
+ buttonText={common.confirm}
+ secondaryButtonText={common.cancel}
+ Content={() => (
+
+
+
+ )}
+ />
setConfirmPassVisible(false)}
@@ -736,10 +968,10 @@ function SendConfirmation({ route }) {
Content={() => (
)}
/>
- {/*Fee insight Modal */}
+ {/* Fee insight Modal */}
{
setProgress(false);
setDiscardUTXOVisible(false);
@@ -817,7 +1049,7 @@ function SendConfirmation({ route }) {
);
}
-export default Sentry.withErrorBoundary(SendConfirmation, errorBourndaryOptions);
+export default SentryErrorBoundary(SendConfirmation);
const styles = StyleSheet.create({
horizontalLineStyle: {
@@ -837,6 +1069,97 @@ const styles = StyleSheet.create({
contentContainer: {
paddingBottom: hp(30),
},
+ sendSuccessfullNote: {
+ marginTop: hp(5),
+ },
+ TransferCardPreTitle: {
+ marginLeft: wp(5),
+ fontSize: 14,
+ letterSpacing: 0.14,
+ },
+ transferCardTitle: {
+ fontSize: 11,
+ letterSpacing: 0.14,
+ },
+ transferCardSubtitle: {
+ fontSize: 14,
+ letterSpacing: 0.72,
+ },
+ transferCardContainer: {
+ alignItems: 'center',
+ borderRadius: 10,
+
+ paddingHorizontal: 10,
+ paddingVertical: 15,
+ minHeight: hp(70),
+ },
+ preTitleContainer: {
+ width: '100%',
+ alignItems: 'center',
+ flexDirection: 'row',
+ marginLeft: 10,
+ },
+ transferText: {
+ fontWeight: 500,
+ fontSize: 12,
+ marginBottom: 5,
+ marginLeft: 3,
+ marginTop: 15,
+ },
+ cardTransferPreTitle: {
+ marginLeft: wp(5),
+ fontSize: 14,
+ letterSpacing: 0.14,
+ },
+ subTitleContainer: {
+ justifyContent: 'center',
+ width: '100%',
+ marginTop: 10,
+ marginLeft: 10,
+ },
+ sendingPriorityText: {
+ fontSize: 15,
+ letterSpacing: 0.15,
+ marginBottom: hp(5),
+ },
+ satsStyle: {
+ height: hp(500),
+ },
+ dollarsStyle: {},
+ marginBottom: {
+ marginBottom: hp(20),
+ },
+ externalKeyModal: {
+ width: '100%',
+ },
+ signingInfoWrapper: {
+ alignItems: 'center',
+ alignSelf: 'center',
+ width: '85%',
+ },
+ signingInfoContainer: {
+ alignSelf: 'center',
+ width: '100%',
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ borderRadius: 10,
+ paddingVertical: hp(20),
+ paddingHorizontal: wp(18),
+ marginTop: hp(5),
+ marginBottom: hp(20),
+ },
+ infoText: {
+ width: '68%',
+ fontSize: 14,
+ },
+ arrowIcon: {
+ marginRight: wp(10),
+ },
+ signingInfoText: {
+ marginTop: hp(5),
+ paddingHorizontal: wp(25),
+ },
imgCtr: {
alignItems: 'center',
paddingVertical: 20,
diff --git a/src/screens/Send/SendScreen.tsx b/src/screens/Send/SendScreen.tsx
index b759a6a49..6ee86fa41 100644
--- a/src/screens/Send/SendScreen.tsx
+++ b/src/screens/Send/SendScreen.tsx
@@ -16,6 +16,7 @@ import KeeperHeader from 'src/components/KeeperHeader';
import WalletIcon from 'src/assets/images/daily_wallet.svg';
import WalletSmallIcon from 'src/assets/images/daily-wallet-small.svg';
import CollaborativeIcon from 'src/assets/images/collaborative_vault_white.svg';
+import AssistedIcon from 'src/assets/images/assisted-vault-white-icon.svg';
import CollaborativeSmallIcon from 'src/assets/images/collaborative-icon-small.svg';
import VaultIcon from 'src/assets/images/vault_icon.svg';
import VaultSmallIcon from 'src/assets/images/vault-icon-small.svg';
@@ -47,8 +48,6 @@ import HexagonIcon from 'src/components/HexagonIcon';
import idx from 'idx';
import Buttons from 'src/components/Buttons';
import LoginMethod from 'src/models/enums/LoginMethod';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import CurrencyInfo from '../Home/components/CurrencyInfo';
import useIsSmallDevices from 'src/hooks/useSmallDevices';
import useSignerMap from 'src/hooks/useSignerMap';
@@ -59,6 +58,8 @@ import ScannerIcon from 'src/assets/images/scanner-icon.svg';
import ScannerIconDark from 'src/assets/images/scanner-icon-white.svg';
import useWallets from 'src/hooks/useWallets';
import useVault from 'src/hooks/useVault';
+import { SentryErrorBoundary } from 'src/services/sentry';
+
function SendScreen({ route }) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
@@ -95,10 +96,7 @@ function SendScreen({ route }) {
);
const [pendingHealthCheckCount, setPendingHealthCheckCount] = useState(0);
const isDarkMode = colorMode === 'dark';
- const availableBalance =
- sender.networkType === NetworkType.MAINNET
- ? sender.specs.balances.confirmed
- : sender.specs.balances.confirmed + sender.specs.balances.unconfirmed;
+ const availableBalance = sender.specs.balances.confirmed + sender.specs.balances.unconfirmed;
const avgFees = useAppSelector((state) => state.network.averageTxFees);
const visibleWallets = useMemo(
@@ -224,7 +222,13 @@ function SendScreen({ route }) {
};
const getWalletIcon = (wallet) => {
if (wallet.entityKind === EntityKind.VAULT) {
- return wallet.type === VaultType.COLLABORATIVE ? : ;
+ if (wallet.type === VaultType.COLLABORATIVE) {
+ return ;
+ } else if (wallet.type === VaultType.ASSISTED) {
+ return ;
+ } else {
+ return ;
+ }
} else {
return ;
}
@@ -407,9 +411,9 @@ function SendScreen({ route }) {
@@ -542,4 +546,4 @@ const styles = StyleSheet.create({
opacity: 0.5,
},
});
-export default Sentry.withErrorBoundary(SendScreen, errorBourndaryOptions);
+export default SentryErrorBoundary(SendScreen);
diff --git a/src/screens/SignTransaction/SignTransactionScreen.tsx b/src/screens/SignTransaction/SignTransactionScreen.tsx
index ea1f5a15f..02aab3c5b 100644
--- a/src/screens/SignTransaction/SignTransactionScreen.tsx
+++ b/src/screens/SignTransaction/SignTransactionScreen.tsx
@@ -1,7 +1,13 @@
import { FlatList } from 'react-native';
import { CommonActions, useNavigation, useRoute } from '@react-navigation/native';
import React, { useCallback, useContext, useEffect, useRef, useState } from 'react';
-import { NetworkType, SignerType, TxPriority } from 'src/services/wallets/enums';
+import {
+ MultisigScriptType,
+ SignerType,
+ TxPriority,
+ VaultType,
+ NetworkType,
+} from 'src/services/wallets/enums';
import { Signer, Vault, VaultSigner } from 'src/services/wallets/interfaces/vault';
import { sendPhaseThree } from 'src/store/sagaActions/send_and_receive';
import { Box, useColorMode } from 'native-base';
@@ -20,7 +26,11 @@ import SuccessDarkIllustration from 'src/assets/images/upgrade-dark-illustration
import ShareGreen from 'src/assets/images/share-arrow-green.svg';
import ShareWhite from 'src/assets/images/share-arrow-white.svg';
import idx from 'idx';
-import { sendPhaseThreeReset, updatePSBTEnvelops } from 'src/store/reducers/send_and_receive';
+import {
+ sendPhaseThreeReset,
+ updatePSBTEnvelops,
+ setInheritanceSigningRequestId,
+} from 'src/store/reducers/send_and_receive';
import { useAppSelector } from 'src/store/hooks';
import { useDispatch } from 'react-redux';
import useNfcModal from 'src/hooks/useNfcModal';
@@ -35,26 +45,11 @@ import KeeperModal from 'src/components/KeeperModal';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import useSignerMap from 'src/hooks/useSignerMap';
import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
-import {
- signTransactionWithColdCard,
- signTransactionWithInheritanceKey,
- signTransactionWithMobileKey,
- signTransactionWithPortal,
- signTransactionWithSeedWords,
- signTransactionWithSigningServer,
- signTransactionWithTapsigner,
-} from './signWithSD';
-import SignerList from './SignerList';
-import SignerModals from './SignerModals';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import { getTxHexFromKeystonePSBT } from 'src/hardware/keystone';
import PasscodeVerifyModal from 'src/components/Modal/PasscodeVerify';
import { resetKeyHealthState } from 'src/store/reducers/vaults';
import { InheritanceConfiguration } from 'src/models/interfaces/AssistedKeys';
import { generateKey } from 'src/utils/service-utilities/encryption';
-import { formatDuration } from '../Vault/HardwareModalMap';
-import { setInheritanceSigningRequestId } from 'src/store/reducers/send_and_receive';
import TickIcon from 'src/assets/images/tick_icon.svg';
import { hcStatusType } from 'src/models/interfaces/HeathCheckTypes';
import { refreshWallets } from 'src/store/sagaActions/wallets';
@@ -63,34 +58,60 @@ import {
dropTransactionSnapshot,
setTransactionSnapshot,
} from 'src/store/reducers/cachedTxn';
-import { SendConfirmationRouteParams, tnxDetailsProps } from '../Send/SendConfirmation';
import { SIGNTRANSACTION } from 'src/navigation/contants';
import config from 'src/utils/service-utilities/config';
import { isReading, stopReading } from 'src/hardware/portal';
import { wp } from 'src/constants/responsive';
+import { SendConfirmationRouteParams, tnxDetailsProps } from '../Send/SendConfirmation';
+import { formatDuration } from '../Vault/HardwareModalMap';
+import SignerModals from './SignerModals';
+import SignerList from './SignerList';
+import {
+ signTransactionWithColdCard,
+ signTransactionWithInheritanceKey,
+ signTransactionWithMobileKey,
+ signTransactionWithPortal,
+ signTransactionWithSeedWords,
+ signTransactionWithSigningServer,
+ signTransactionWithTapsigner,
+} from './signWithSD';
+import { getKeyUID } from 'src/utils/utilities';
+import { SentryErrorBoundary } from 'src/services/sentry';
function SignTransactionScreen() {
const route = useRoute();
const { colorMode } = useColorMode();
const isDarkMode = colorMode === 'dark';
- const { note, label, vaultId, sendConfirmationRouteParams, isMoveAllFunds, tnxDetails } =
- (route.params || {
- note: '',
- label: [],
- vaultId: '',
- sendConfirmationRouteParams: null,
- isMoveAllFunds: false,
- sender: {},
- }) as {
- note: string;
- label: { name: string; isSystem: boolean }[];
- vaultId: string;
- isMoveAllFunds: boolean;
- sender: Vault;
- sendConfirmationRouteParams: SendConfirmationRouteParams;
- tnxDetails: tnxDetailsProps;
+ const {
+ note,
+ label,
+ vaultId,
+ sendConfirmationRouteParams,
+ isMoveAllFunds,
+ tnxDetails,
+ miniscriptTxElements,
+ } = (route.params || {
+ note: '',
+ label: [],
+ vaultId: '',
+ sendConfirmationRouteParams: null,
+ isMoveAllFunds: false,
+ sender: {},
+ miniscriptTxElements: null,
+ }) as {
+ note: string;
+ label: { name: string; isSystem: boolean }[];
+ vaultId: string;
+ isMoveAllFunds: boolean;
+ sender: Vault;
+ sendConfirmationRouteParams: SendConfirmationRouteParams;
+ tnxDetails: tnxDetailsProps;
+ miniscriptTxElements: {
+ selectedPhase: number;
+ selectedPaths: number[];
};
+ };
const { activeVault: defaultVault } = useVault({
vaultId,
@@ -169,13 +190,13 @@ function SignTransactionScreen() {
let iksKey;
for (let i = 0; i < vaultKeys.length; i++) {
const key = vaultKeys[i];
- if (signerMap[key.masterFingerprint].type === SignerType.INHERITANCEKEY) {
+ if (signerMap[getKeyUID(key)].type === SignerType.INHERITANCEKEY) {
iksKey = key;
break;
}
}
if (iksKey && approveOnce) {
- callbackForSigners(iksKey, signerMap[iksKey.masterFingerprint]);
+ callbackForSigners(iksKey, signerMap[getKeyUID(iksKey)]);
setApproveOnce(false);
}
clearInterval(interval);
@@ -264,20 +285,20 @@ function SignTransactionScreen() {
const areSignaturesSufficient = () => {
let signedTxCount = 0;
serializedPSBTEnvelops.forEach((envelop) => {
- if (envelop.isSigned) {
- signedTxCount += 1;
- }
+ if (envelop.isSigned) signedTxCount += 1;
});
- // modify this in dev builds for mock signers
- if (signedTxCount >= defaultVault.scheme.m) {
- return true;
- }
- return false;
+
+ const hasThresholdSignatures = signedTxCount >= defaultVault.scheme.m;
+ if (defaultVault.scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ const vaultsWithTimelock = [VaultType.TIMELOCKED, VaultType.INHERITANCE]; // m-of-n style miniscript vaults w/ timelock
+ if (vaultsWithTimelock.includes(defaultVault.type)) return hasThresholdSignatures;
+ else if (signedTxCount === serializedPSBTEnvelops.length) return true;
+ } else return hasThresholdSignatures;
};
useEffect(() => {
vaultKeys.forEach((vaultKey) => {
- const signer = signerMap[vaultKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(vaultKey)];
if (signer.type === SignerType.MY_KEEPER && !vaultKey.xpriv) {
dispatch(refillMobileKey(vaultKey));
}
@@ -313,7 +334,7 @@ function SignTransactionScreen() {
} = {}) => {
const activeId = xfp || activeXfp;
const currentKey = vaultKeys.filter((vaultKey) => vaultKey.xfp === activeId)[0];
- const signer = signerMap[currentKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(currentKey)];
if (serializedPSBTEnvelops && serializedPSBTEnvelops.length) {
const serializedPSBTEnvelop = serializedPSBTEnvelops.filter(
(envelop) => envelop.xfp === activeId
@@ -444,7 +465,11 @@ function SignTransactionScreen() {
])
);
} else if (SignerType.MY_KEEPER === signerType) {
- const signedSerializedPSBT = signCosignerPSBT(currentKey.xpriv, serializedPSBT);
+ const signedSerializedPSBT = signCosignerPSBT(
+ currentKey.masterFingerprint,
+ currentKey.xpriv,
+ serializedPSBT
+ );
dispatch(updatePSBTEnvelops({ signedSerializedPSBT, xfp }));
dispatch(
healthCheckStatusUpdate([
@@ -481,7 +506,7 @@ function SignTransactionScreen() {
const onFileSign = (signedSerializedPSBT: string) => {
const currentKey = vaultKeys.filter((vaultKey) => vaultKey.xfp === activeXfp)[0];
- const signer = signerMap[currentKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(currentKey)];
if (signer.type === SignerType.KEYSTONE) {
const serializedPSBTEnvelop = serializedPSBTEnvelops.filter(
(envelop) => envelop.xfp === activeXfp
@@ -697,7 +722,7 @@ function SignTransactionScreen() {
try {
await Share.open({
message: 'The transaction has been successfully sent. You can track its status here:',
- url: url,
+ url,
title: 'Transaction Details',
});
} catch (err) {
@@ -715,20 +740,32 @@ function SignTransactionScreen() {
item.xfp}
- renderItem={({ item, index }) => (
- callbackForSigners(item, signerMap[item.masterFingerprint])}
- envelops={serializedPSBTEnvelops}
- signerMap={signerMap}
- isFirst={index === 0}
- isLast={index === vaultKeys.length - 1}
- />
- )}
+ renderItem={({ item, index }) => {
+ let isPayloadAvailable = false; // case: payloads are only available for signers on the redeem path of a given miniscript vault
+ for (const psbtEnvelop of serializedPSBTEnvelops) {
+ if (item.masterFingerprint === psbtEnvelop.mfp) {
+ isPayloadAvailable = true;
+ break;
+ }
+ }
+ if (isPayloadAvailable) {
+ return (
+ callbackForSigners(item, signerMap[getKeyUID(item)])}
+ envelops={serializedPSBTEnvelops}
+ signerMap={signerMap}
+ isFirst={index === 0}
+ isLast={index === vaultKeys.length - 1}
+ />
+ );
+ }
+ }}
/>
setConfirmPassVisible(false)}
title="Enter Passcode"
- subTitle={'Confirm passcode to sign with mobile key'}
+ subTitle="Confirm passcode to sign with mobile key"
modalBackground={`${colorMode}.modalWhiteBackground`}
subTitleColor={`${colorMode}.secondaryText`}
textColor={`${colorMode}.primaryText`}
@@ -848,4 +886,4 @@ function SignTransactionScreen() {
);
}
-export default Sentry.withErrorBoundary(SignTransactionScreen, errorBourndaryOptions);
+export default SentryErrorBoundary(SignTransactionScreen);
diff --git a/src/screens/SignTransaction/SignWithColdCard.tsx b/src/screens/SignTransaction/SignWithColdCard.tsx
index f4551628d..023eaafff 100644
--- a/src/screens/SignTransaction/SignWithColdCard.tsx
+++ b/src/screens/SignTransaction/SignWithColdCard.tsx
@@ -19,7 +19,7 @@ import useVault from 'src/hooks/useVault';
import useSignerFromKey from 'src/hooks/useSignerFromKey';
import { hcStatusType } from 'src/models/interfaces/HeathCheckTypes';
import { CommonActions, useNavigation } from '@react-navigation/native';
-import { RKInteractionMode } from 'src/services/wallets/enums';
+import { SignerType } from 'src/services/wallets/enums';
function Card({ title, message, buttonText, buttonCallBack }) {
const { colorMode } = useColorMode();
@@ -89,19 +89,34 @@ function SignWithColdCard({ route }: { route }) {
const receiveFromColdCard = async () =>
withNfcModal(async () => {
- dispatch(
- healthCheckStatusUpdate([
- {
- signerId: signer.masterFingerprint,
- status: hcStatusType.HEALTH_CHECK_SIGNING,
- },
- ])
- );
if (!isMultisig) {
const { txn } = await receiveTxHexFromColdCard();
dispatch(updatePSBTEnvelops({ xfp: vaultKey.xfp, txHex: txn }));
} else {
const { psbt } = await receivePSBTFromColdCard();
+ if (isRemoteKey) {
+ dispatch(
+ healthCheckStatusUpdate([
+ {
+ signerId: signer.masterFingerprint,
+ status: hcStatusType.HEALTH_CHECK_SIGNING,
+ },
+ ])
+ );
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'ShowPSBT',
+ params: {
+ data: psbt,
+ encodeToBytes: false,
+ title: 'Signed PSBT',
+ subtitle: 'Please scan until all the QR data has been retrieved',
+ type: SignerType.KEEPER,
+ },
+ })
+ );
+ return;
+ }
dispatch(updatePSBTEnvelops({ signedSerializedPSBT: psbt, xfp: vaultKey.xfp }));
dispatch(
updateKeyDetails(vaultKey, 'registered', {
diff --git a/src/screens/SignTransaction/SignWithQR.tsx b/src/screens/SignTransaction/SignWithQR.tsx
index cb31be41e..ea85458fa 100644
--- a/src/screens/SignTransaction/SignWithQR.tsx
+++ b/src/screens/SignTransaction/SignWithQR.tsx
@@ -5,7 +5,7 @@ import Buttons from 'src/components/Buttons';
import KeeperHeader from 'src/components/KeeperHeader';
import React, { useEffect } from 'react';
import ScreenWrapper from 'src/components/ScreenWrapper';
-import { RKInteractionMode, SignerType, XpubTypes } from 'src/services/wallets/enums';
+import { SignerType, XpubTypes, RKInteractionMode } from 'src/services/wallets/enums';
import { Alert, ScrollView, StyleSheet } from 'react-native';
import { VaultSigner } from 'src/services/wallets/interfaces/vault';
import { useAppSelector } from 'src/store/hooks';
@@ -19,8 +19,6 @@ import { getTxHexFromKeystonePSBT } from 'src/hardware/keystone';
import { updateKeyDetails } from 'src/store/sagaActions/wallets';
import { healthCheckSigner, healthCheckStatusUpdate } from 'src/store/sagaActions/bhr';
import useSignerFromKey from 'src/hooks/useSignerFromKey';
-import DisplayQR from '../QRScreens/DisplayQR';
-import ShareWithNfc from '../NFCChannel/ShareWithNfc';
import { hcStatusType } from 'src/models/interfaces/HeathCheckTypes';
import WalletCopiableData from 'src/components/WalletCopiableData';
import idx from 'idx';
@@ -28,7 +26,10 @@ import { getKeyExpression } from 'src/utils/service-utilities/utils';
import useToastMessage from 'src/hooks/useToastMessage';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
import useSignerMap from 'src/hooks/useSignerMap';
+import ShareWithNfc from '../NFCChannel/ShareWithNfc';
+import DisplayQR from '../QRScreens/DisplayQR';
import { SendConfirmationRouteParams, tnxDetailsProps } from '../Send/SendConfirmation';
+import { getKeyUID } from 'src/utils/utilities';
function SignWithQR() {
const { colorMode } = useColorMode();
@@ -45,8 +46,6 @@ function SignWithQR() {
isRemoteKey,
serializedPSBTEnvelopFromProps,
isMultisig,
- sendConfirmationRouteParams,
- tnxDetails,
}: {
vaultKey: VaultSigner;
vaultId: string;
@@ -64,7 +63,7 @@ function SignWithQR() {
const { activeVault } = useVault({ vaultId });
const isSingleSig = isRemoteKey ? !isMultisig : activeVault.scheme.n === 1;
const { signer } = isRemoteKey
- ? { signer: signerMap[vaultKey.masterFingerprint] }
+ ? { signer: signerMap[getKeyUID(vaultKey)] }
: useSignerFromKey(vaultKey);
const [details, setDetails] = React.useState('');
const { showToast } = useToastMessage();
@@ -100,7 +99,7 @@ function SignWithQR() {
setDetails(keyDescriptor);
} catch (error) {
showToast(
- `We're sorry, but we have trouble retrieving the key information`,
+ "We're sorry, but we have trouble retrieving the key information",
);
}
@@ -193,25 +192,15 @@ function SignWithQR() {
- {
-
- }
+
{[SignerType.KEEPER, SignerType.MY_KEEPER].includes(signer.type) || true ? (
) : null}
@@ -220,7 +209,7 @@ function SignWithQR() {
@@ -247,4 +236,4 @@ const styles = StyleSheet.create({
alignItems: 'center',
marginHorizontal: '7%',
},
-});
\ No newline at end of file
+});
diff --git a/src/screens/SignTransaction/SignerList.tsx b/src/screens/SignTransaction/SignerList.tsx
index de0c0f088..ba1d55d5b 100644
--- a/src/screens/SignTransaction/SignerList.tsx
+++ b/src/screens/SignTransaction/SignerList.tsx
@@ -15,6 +15,7 @@ import { SDIcons } from '../Vault/SigningDeviceIcons';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
import { getPersistedDocument } from 'src/services/documents';
import Colors from 'src/theme/Colors';
+import { getKeyUID } from 'src/utils/utilities';
const { width } = Dimensions.get('screen');
@@ -43,7 +44,7 @@ function SignerList({
const hasSignerSigned = !!envelops.filter(
(envelop) => envelop.xfp === vaultKey.xfp && envelop.isSigned
).length;
- const signer = signerMap[vaultKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(vaultKey)];
const isIKS = signer.type === SignerType.INHERITANCEKEY;
const [showIcon, setShowIcon] = useState(null);
diff --git a/src/screens/SignTransaction/SignerModals.tsx b/src/screens/SignTransaction/SignerModals.tsx
index e5636b17e..158d894e2 100644
--- a/src/screens/SignTransaction/SignerModals.tsx
+++ b/src/screens/SignTransaction/SignerModals.tsx
@@ -44,6 +44,7 @@ import SignerCard from '../AddSigner/SignerCard';
import { SerializedPSBTEnvelop } from 'src/services/wallets/interfaces';
import { InteracationMode } from '../Vault/HardwareModalMap';
import { SendConfirmationRouteParams, tnxDetailsProps } from '../Send/SendConfirmation';
+import { getAccountFromSigner, getKeyUID } from 'src/utils/utilities';
const RNBiometrics = new ReactNativeBiometrics();
@@ -801,7 +802,7 @@ function SignerModals({
return (
<>
{vaultKeys.map((vaultKey) => {
- const signer = signerMap[vaultKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(vaultKey)];
const currentSigner = vaultKey.xfp === activeXfp;
const { supportedSigningOptions } = getSupportedSigningOptions(signer.type, colorMode);
const [signingMode, setSigningMode] = useState(
@@ -817,7 +818,9 @@ function SignerModals({
mode: InteracationMode.SIGN_TRANSACTION,
signer,
isMultisig,
+ accountNumber: getAccountFromSigner(signer),
signTransaction,
+ isRemoteKey,
})
);
};
@@ -1227,6 +1230,8 @@ function SignerModals({
signer,
isMultisig,
signTransaction,
+ isRemoteKey,
+ accountNumber: getAccountFromSigner(signer),
})
);
};
@@ -1249,6 +1254,7 @@ function SignerModals({
vaultKey,
vaultId,
mode: InteracationMode.VAULT_REGISTER,
+ accountNumber: getAccountFromSigner(vaultKey),
})
);
}}
diff --git a/src/screens/SignTransaction/signWithSD.ts b/src/screens/SignTransaction/signWithSD.ts
index baf5ae99d..46766931b 100644
--- a/src/screens/SignTransaction/signWithSD.ts
+++ b/src/screens/SignTransaction/signWithSD.ts
@@ -12,8 +12,8 @@ import InheritanceKeyServer from 'src/services/backend/InheritanceKey';
import SigningServer from 'src/services/backend/SigningServer';
import { isTestnet } from 'src/constants/Bitcoin';
import * as PORTAL from 'src/hardware/portal';
-import { checkAndUnlock } from '../SigningDevices/SetupPortal';
import { getInputsFromPSBT } from 'src/utils/utilities';
+import { checkAndUnlock } from '../SigningDevices/SetupPortal';
export const signTransactionWithTapsigner = async ({
setTapsignerModal,
@@ -36,9 +36,8 @@ export const signTransactionWithTapsigner = async ({
if (!inputs) throw new Error('Invalid signing payload, inputs missing');
const { signedSerializedPSBT } = WalletOperations.internallySignVaultPSBT(
defaultVault,
- inputs,
serializedPSBT,
- xpriv
+ { ...signer, xpriv }
);
return { signedSerializedPSBT, signingPayload: null };
}
@@ -90,9 +89,8 @@ export const signTransactionWithMobileKey = async ({
const [signer] = defaultVault.signers.filter((signer) => signer.xfp === xfp);
const { signedSerializedPSBT } = WalletOperations.internallySignVaultPSBT(
defaultVault,
- inputs,
serializedPSBT,
- signer.xpriv
+ signer
);
return { signedSerializedPSBT };
};
@@ -183,10 +181,8 @@ export const signTransactionWithSeedWords = async ({
if (signerXpub !== xpub) throw new Error('Invalid mnemonic; xpub mismatch');
const { signedSerializedPSBT } = WalletOperations.internallySignVaultPSBT(
defaultVault,
- inputs,
serializedPSBT,
- xpriv,
- isRemoteKey
+ { ...signer, xpriv }
);
return { signedSerializedPSBT };
} catch (err) {
diff --git a/src/screens/SigningDevices/DeleteKeys.tsx b/src/screens/SigningDevices/DeleteKeys.tsx
index c6ee4dbde..72dc79998 100644
--- a/src/screens/SigningDevices/DeleteKeys.tsx
+++ b/src/screens/SigningDevices/DeleteKeys.tsx
@@ -34,6 +34,7 @@ import { hideDeletingKeyModal, hideKeyDeletedSuccessModal } from 'src/store/redu
import BounceLoader from 'src/components/BounceLoader';
import TorAsset from 'src/components/Loader';
import moment from 'moment';
+import { getKeyUID } from 'src/utils/utilities';
function DeleteKeys({ route }) {
const { colorMode } = useColorMode();
@@ -47,11 +48,12 @@ function DeleteKeys({ route }) {
);
const dispatch = useDispatch();
const navigation = useNavigation();
- const [unhidingMfp, setUnhidingMfp] = useState('');
+ const [unhidingKeyUID, setUnhidingKeyUID] = useState('');
+ const [multipleHidden, setMultipleHidden] = useState(false);
const { allVaults } = useVault({ includeArchived: true });
const { archivedVaults } = useArchivedVault();
const [warningEnabled, setHideWarning] = useState(false);
- const [vaultUsed, setVaultUsed] = useState();
+ const [vaultsUsed, setVaultsUsed] = useState();
const [signerToDelete, setSignerToDelete] = useState();
const [deletedSigner, setDeletedSigner] = useState();
const deletingKeyModalVisible = useAppSelector((state) => state.bhr.deletingKeyModalVisible);
@@ -62,7 +64,7 @@ function DeleteKeys({ route }) {
const onSuccess = () => {
if (signerToDelete) {
const involvedArchivedVaults = archivedVaults.filter((vault) =>
- vault.signers.find((s) => s.masterFingerprint === signerToDelete.masterFingerprint)
+ vault.signers.find((s) => getKeyUID(s) === getKeyUID(signerToDelete))
);
if (involvedArchivedVaults.length) {
dispatch(archiveSigningDevice([signerToDelete]));
@@ -75,18 +77,19 @@ function DeleteKeys({ route }) {
};
const unhide = (signer: Signer) => {
- setUnhidingMfp(signer.masterFingerprint);
+ setUnhidingKeyUID(getKeyUID(signer));
dispatch(updateSignerDetails(signer, 'hidden', false));
};
const handleDelete = (signer: Signer) => {
+ setMultipleHidden(false);
const vaultsInvolved = allVaults.filter(
- (vault) =>
- !vault.archived &&
- vault.signers.find((s) => s.masterFingerprint === signer.masterFingerprint)
+ (vault) => !vault.archived && vault.signers.find((s) => getKeyUID(s) === getKeyUID(signer))
);
if (vaultsInvolved.length > 0) {
- setVaultUsed(vaultsInvolved[0]);
+ if (vaultsInvolved.length > 1) setMultipleHidden(true);
+ setHideWarning(true);
+ setVaultsUsed(vaultsInvolved);
setConfirmPassVisible(false);
return;
}
@@ -95,8 +98,8 @@ function DeleteKeys({ route }) {
};
useEffect(() => {
- if (unhidingMfp && !hiddenSigners.find((signer) => signer.masterFingerprint === unhidingMfp)) {
- setUnhidingMfp('');
+ if (unhidingKeyUID && !hiddenSigners.find((signer) => getKeyUID(signer) === unhidingKeyUID)) {
+ setUnhidingKeyUID('');
}
}, [hiddenSigners]);
@@ -137,18 +140,31 @@ function DeleteKeys({ route }) {
);
}
- function Content({ colorMode, vaultUsed }) {
+ function Content({ colorMode, vaultsUsed }) {
return (
- }
- callback={() => {}}
- />
+
+ {vaultsUsed.map((vault) => (
+
+ }
+ callback={() => {}}
+ />
+
+ ))}
+
+
- {signerText.deleteVaultInstruction}
+ {multipleHidden
+ ? signerText.deleteMultipleVaultInstruction
+ : signerText.deleteVaultInstruction}
@@ -191,8 +207,8 @@ function DeleteKeys({ route }) {
return (
handleDelete(signer) : null}
secondaryAction={() => unhide(signer)}
primaryText={showDelete ? signerText.delete : null}
@@ -210,10 +226,14 @@ function DeleteKeys({ route }) {
)}
setHideWarning(false)}
- title={signerText.deleteVaultWarning}
- subTitle={signerText.vaultWarningSubtitle}
+ title={
+ multipleHidden ? signerText.deleteMultipleVaultWarning : signerText.deleteVaultWarning
+ }
+ subTitle={
+ multipleHidden ? signerText.multipleVaultWarningSubtitle : signerText.vaultWarningSubtitle
+ }
buttonText={signerText.viewVault}
secondaryButtonText={signerText.back}
secondaryCallback={() => setHideWarning(false)}
@@ -223,10 +243,10 @@ function DeleteKeys({ route }) {
buttonTextColor={`${colorMode}.buttonText`}
buttonCallback={() => {
setHideWarning(false);
- navigation.dispatch(CommonActions.navigate('VaultDetails', { vaultId: vaultUsed.id }));
+ navigation.dispatch(CommonActions.navigate('ManageWallets'));
}}
textColor={`${colorMode}.primaryText`}
- Content={() => }
+ Content={() => }
/>
{
dispatch(hideKeyDeletedSuccessModal());
- navigation.dispatch(CommonActions.navigate('ManageSigners'));
}}
Content={DeletedSuccessContent}
/>
diff --git a/src/screens/SigningDevices/ManageSigners.tsx b/src/screens/SigningDevices/ManageSigners.tsx
index 85300d07e..3109bcdeb 100644
--- a/src/screens/SigningDevices/ManageSigners.tsx
+++ b/src/screens/SigningDevices/ManageSigners.tsx
@@ -11,12 +11,7 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { AppStackParams } from 'src/navigation/types';
import SignerIcon from 'src/assets/images/signer-icon-brown.svg';
import HardwareIllustration from 'src/assets/images/diversify-hardware.svg';
-import {
- UNVERIFYING_SIGNERS,
- getSignerDescription,
- getSignerFromRemoteData,
- getSignerNameFromType,
-} from 'src/hardware';
+import { UNVERIFYING_SIGNERS, getSignerDescription, getSignerNameFromType } from 'src/hardware';
import useVault from 'src/hooks/useVault';
import { Signer, Vault, VaultSigner } from 'src/services/wallets/interfaces/vault';
import { useAppSelector } from 'src/store/hooks';
@@ -25,8 +20,6 @@ import { resetSignersUpdateState } from 'src/store/reducers/bhr';
import { useDispatch } from 'react-redux';
import { SignerStorage, SignerType } from 'src/services/wallets/enums';
import CircleIconWrapper from 'src/components/CircleIconWrapper';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import SettingIcon from 'src/assets/images/settings-gear.svg';
import { useIndicatorHook } from 'src/hooks/useIndicatorHook';
import { uaiType } from 'src/models/interfaces/Uai';
@@ -37,8 +30,6 @@ import SignerCard from '../AddSigner/SignerCard';
import KeyAddedModal from 'src/components/KeyAddedModal';
import KeeperModal from 'src/components/KeeperModal';
import Note from 'src/components/Note/Note';
-import CountdownTimer from 'src/components/Timer/CountDownTimer';
-import Buttons from 'src/components/Buttons';
import Text from 'src/components/KeeperText';
import { ConciergeTag, goToConcierge } from 'src/store/sagaActions/concierge';
import Relay from 'src/services/backend/Relay';
@@ -52,13 +43,16 @@ import { getJSONFromRealmObject } from 'src/storage/realm/utils';
import { RealmSchema } from 'src/storage/realm/enum';
import { useQuery } from '@realm/react';
import { KeeperApp } from 'src/models/interfaces/KeeperApp';
+import { setupKeeperSigner } from 'src/hardware/signerSetup';
+import { getKeyUID } from 'src/utils/utilities';
+import { SentryErrorBoundary } from 'src/services/sentry';
type ScreenProps = NativeStackScreenProps;
function ManageSigners({ route }: ScreenProps) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
- const { vaultId = '', addedSigner, receivedExternalSigner } = route.params || {};
+ const { vaultId = '', addedSigner, remoteData } = route.params || {};
const { activeVault } = useVault({ vaultId });
const { signers: vaultKeys } = activeVault || { signers: [] };
const { signerMap } = useSignerMap();
@@ -72,14 +66,9 @@ function ManageSigners({ route }: ScreenProps) {
const { showToast } = useToastMessage();
const dispatch = useDispatch();
const [keyAddedModalVisible, setKeyAddedModalVisible] = useState(false);
- const [timerModal, setTimerModal] = useState(
- receivedExternalSigner && receivedExternalSigner.timeLeft != '0' ? true : false
- );
- const [timerExpiredModal, setTimerExpiredModal] = useState(
- receivedExternalSigner && receivedExternalSigner.timeLeft == '0' ? true : false
- );
- const [isTimerActive, setIsTimerActive] = useState(true);
+ const [timerModal, setTimerModal] = useState(false);
const [showLearnMoreModal, setShowLearnMoreModal] = useState(false);
+ const [newSigner, setNewSigner] = useState(null);
const { translations } = useContext(LocalizationContext);
const { signer: signerTranslation, common } = translations;
@@ -90,6 +79,10 @@ function ManageSigners({ route }: ScreenProps) {
const [inProgress, setInProgress] = useState(false);
+ useEffect(() => {
+ if (remoteData?.key && !timerModal) setTimerModal(true);
+ }, [remoteData]);
+
useEffect(() => {
setInProgress(relaySignersUpdateLoading);
}, [relaySignersUpdateLoading]);
@@ -122,14 +115,10 @@ function ManageSigners({ route }: ScreenProps) {
}, [relaySignersUpdate])
);
- const handleTimerEnd = () => {
- setIsTimerActive(false);
- };
-
const handleCardSelect = (signer, item) => {
navigation.dispatch(
CommonActions.navigate('SigningDeviceDetails', {
- signerId: signer.masterFingerprint,
+ signerId: getKeyUID(signer),
vaultId,
vaultKey: vaultKeys.length ? item : undefined,
vaultSigners: vaultKeys,
@@ -151,13 +140,12 @@ function ManageSigners({ route }: ScreenProps) {
const acceptRemoteKey = async () => {
try {
- const remoteSigner = getSignerFromRemoteData(receivedExternalSigner?.data?.signer);
- dispatch(addSigningDevice([remoteSigner]));
- // * Send Notification on success
setTimerModal(false);
- showToast('External Key added Successfully');
+ const hw = setupKeeperSigner(remoteData.key);
+ dispatch(addSigningDevice([hw.signer]));
+ setNewSigner(hw.signer);
await Relay.sendSingleNotification({
- fcm: receivedExternalSigner.data.fcmToken,
+ fcm: remoteData.fcm,
notification: {
title: 'Remote key accepted',
body: 'The remote key that you shared has been accepted by the user',
@@ -175,7 +163,7 @@ function ManageSigners({ route }: ScreenProps) {
const rejectRemoteKey = async () => {
setTimerModal(false);
await Relay.sendSingleNotification({
- fcm: receivedExternalSigner.data.fcmToken,
+ fcm: remoteData.fcm,
notification: {
title: 'Remote key rejected',
body: 'The remote key that you shared has been rejected by the user',
@@ -245,35 +233,15 @@ function ManageSigners({ route }: ScreenProps) {
secondaryCallback={rejectRemoteKey}
Content={() => (
-
-
-
)}
/>
- setTimerExpiredModal(false)}
- visible={timerExpiredModal}
- textColor={`${colorMode}.primaryText`}
- subTitleColor={`${colorMode}.secondaryText`}
- modalBackground={`${colorMode}.modalWhiteBackground`}
- buttonTextColor={`${colorMode}.buttonText`}
- Content={() => (
-
-
-
-
-
-
- )}
+
-
{
setShowLearnMoreModal(false);
@@ -352,37 +320,29 @@ function SignersList({
});
let hasSigningServer = false; // actual signing server present?
- let hasInheritanceKey = false; // actual inheritance key present?
let isSigningServerShellCreated = false;
- let isInheritanceKeyShellCreated = false;
- if (shellKeys.filter((signer) => signer.type === SignerType.POLICY_SERVER).length > 0)
+ if (shellKeys.filter((signer) => signer.type === SignerType.POLICY_SERVER).length > 0) {
isSigningServerShellCreated = true;
-
- if (shellKeys.filter((signer) => signer.type === SignerType.INHERITANCEKEY).length > 0)
- isInheritanceKeyShellCreated = true;
+ }
for (const signer of signers) {
if (signer.type === SignerType.POLICY_SERVER) hasSigningServer = true;
- else if (signer.type === SignerType.INHERITANCEKEY) hasInheritanceKey = true;
}
if (!isSigningServerShellCreated && !hasSigningServer && level >= AppSubscriptionLevel.L2) {
shellKeys.push(generateShellAssistedKey(SignerType.POLICY_SERVER));
}
- if (!isInheritanceKeyShellCreated && !hasInheritanceKey && level >= AppSubscriptionLevel.L3) {
- shellKeys.push(generateShellAssistedKey(SignerType.INHERITANCEKEY));
- }
-
- return shellKeys;
- }, []);
+ const addedSignersTypes = signers.map((signer) => signer.type);
+ return shellKeys.filter((shellSigner) => !addedSignersTypes.includes(shellSigner.type));
+ }, [signers]);
const renderAssistedKeysShell = () => {
return shellAssistedKeys.map((shellSigner) => {
return (
{
showToast('Please add the key to a Vault in order to use it');
}}
@@ -411,7 +371,7 @@ function SignersList({
)}
{list.map((item) => {
- const signer = vaultKeys.length ? signerMap[item.masterFingerprint] : item;
+ const signer = vaultKeys.length ? signerMap[getKeyUID(item)] : item;
if (!signer || signer.archived) {
return null;
}
@@ -434,7 +394,7 @@ function SignersList({
return (
{
handleCardSelect(signer, item);
}}
@@ -529,4 +489,4 @@ const styles = StyleSheet.create({
},
});
-export default Sentry.withErrorBoundary(ManageSigners, errorBourndaryOptions);
+export default SentryErrorBoundary(ManageSigners);
diff --git a/src/screens/SigningDevices/RemoteSharing.tsx b/src/screens/SigningDevices/RemoteSharing.tsx
index 46367f0a2..52ab87b7d 100644
--- a/src/screens/SigningDevices/RemoteSharing.tsx
+++ b/src/screens/SigningDevices/RemoteSharing.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useState } from 'react';
import { StyleSheet, Share } from 'react-native';
import ScreenWrapper from 'src/components/ScreenWrapper';
import KeeperHeader from 'src/components/KeeperHeader';
@@ -6,7 +6,6 @@ import { Box, ScrollView, useColorMode, VStack } from 'native-base';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { AppStackParams } from 'src/navigation/types';
import Text from 'src/components/KeeperText';
-import useSignerMap from 'src/hooks/useSignerMap';
import RemoteShareIllustration from 'src/assets/images/remote-share-illustration.svg';
import Buttons from 'src/components/Buttons';
import { hp, windowWidth, wp } from 'src/constants/responsive';
@@ -15,144 +14,107 @@ import { useNavigation } from '@react-navigation/native';
import { useAppSelector } from 'src/store/hooks';
import { RKInteractionMode } from 'src/services/wallets/enums';
import Relay from 'src/services/backend/Relay';
-import useVault from 'src/hooks/useVault';
-import { encrypt, getRandomBytes } from 'src/utils/service-utilities/encryption';
-import { SendConfirmationRouteParams, tnxDetailsProps } from '../Send/SendConfirmation';
+import { encrypt, getKeyAndHash } from 'src/utils/service-utilities/encryption';
import config, { APP_STAGE } from 'src/utils/service-utilities/config';
+import usePlan from 'src/hooks/usePlan';
+import { getKeyUID } from 'src/utils/utilities';
type ScreenProps = NativeStackScreenProps;
const RemoteShareText = {
[RKInteractionMode.SHARE_REMOTE_KEY]: {
title: 'Remote Key Sharing',
- desc: 'Please share this Key-Link with your contact using a secure and private communication medium. The link will be valid for 5 minutes.',
+ desc: 'Please share the key using this link with your contact using a secure and private communication medium.',
cta: 'Share Key',
msgTitle: 'Remote Key Sharing',
- msgDesc: 'Hey, I’m sharing a bitcoin key with you. Please click the link to accept it.',
+ msgDesc:
+ "Hey, I'm sharing a bitcoin key with you. Please click the link to accept it on the Bitcoin Keeper app and keep it safe.",
},
[RKInteractionMode.SHARE_PSBT]: {
title: 'Sign Transaction Remotely',
- desc: 'Please share the PSBT Link with the key holder for transaction signing. Once generated, the link will be valid for 5 minutes.',
+ desc: 'Please share this unsigned transaction (PSBT) using the link with the key holder for transaction signing. Use a secure and private communication medium.',
cta: 'Share Link',
msgTitle: 'Transaction Signing Request Received',
msgDesc:
- 'Hey, your friend is requesting for your Key to make a transaction. Please click the link to view details',
+ 'Hey, I need you to sign a transaction with the key you have shared previously. Please click the link to view details and sign the transaction in the Bitcoin Keeper app',
},
[RKInteractionMode.SHARE_SIGNED_PSBT]: {
title: 'Sign Transaction Remotely',
- desc: 'Please share back the PSBT link with the transaction creator to complete the signing. Once generated, the link will be valid for 5 minutes.',
+ desc: 'Please share back this signed transaction (PSBT) using the link with the transaction creator. Use a secure and private communication medium.',
cta: 'Share Link',
msgTitle: 'Signed Transaction Received',
- msgDesc: 'Hey, your friend has signed your transaction. Please click the link to accept it.',
+ msgDesc:
+ 'Hey, I have signed the transaction you had requested. Please click the link to accept it.',
},
};
const DeepLinkIdentifier = {
- [APP_STAGE.DEVELOPMENT]: 'dev',
- [APP_STAGE.PRODUCTION]: 'prod',
+ [APP_STAGE.DEVELOPMENT]: 'app/dev',
+ [APP_STAGE.PRODUCTION]: 'app/prod',
};
type dataProps = {
type: RKInteractionMode;
fcm?: string;
- signer?: any;
- isMultisig?: boolean;
psbt?: string;
- vaultKey?: any;
- vaultId?: string;
- serializedPSBTEnvelop?: any;
- vault: any;
- sendConfirmationRouteParams?: SendConfirmationRouteParams;
- tnxDetails: tnxDetailsProps;
- signingDetails?: any;
+ key?: string;
+ keyUID?: string;
+ xfp?: string;
+ cachedTxid?: string; // for recovering the cached tnx from store on receiving the signed psbt
};
function RemoteSharing({ route }: ScreenProps) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
const fcmToken = useAppSelector((state) => state.notifications.fcmToken);
- const {
- signer: signerFromParam,
- isPSBTSharing = false,
- psbt,
- mode,
- vaultKey,
- vaultId,
- serializedPSBTEnvelop,
- isMultisig,
- sendConfirmationRouteParams,
- tnxDetails,
- } = route.params;
- const { signerMap } = useSignerMap();
- const signer = signerMap[signerFromParam?.masterFingerprint];
- const { activeVault } = useVault({ vaultId });
+ const { isPSBTSharing = false, psbt, mode, signer = null, xfp = '' } = route.params;
+ const { remoteLinkDetails } = useAppSelector((state) => state.vault);
+ const cachedTxid = useAppSelector((state) => state.sendAndReceive.sendPhaseTwo.cachedTxid);
+ const [primaryLoading, setPrimaryLoading] = useState(false);
+ const { isOnL2Above } = usePlan();
const handleShare = async () => {
+ setPrimaryLoading(true);
try {
const data: dataProps = {
type: mode,
};
if (mode === RKInteractionMode.SHARE_REMOTE_KEY) {
+ data.key = psbt;
data.fcm = fcmToken;
- data.signer = {
- extraData: { originalType: signer.type },
- inheritanceKeyInfo: signer.inheritanceKeyInfo,
- isBIP85: signer.isBIP85,
- masterFingerprint: signer.masterFingerprint,
- signerPolicy: signer.signerPolicy,
- signerXpubs: signer.signerXpubs,
- };
}
if (mode === RKInteractionMode.SHARE_PSBT) {
- data.sendConfirmationRouteParams = sendConfirmationRouteParams;
- data.tnxDetails = tnxDetails;
- data.signingDetails = {
- signer: signer.masterFingerprint,
- isMultisig: findIsMultisig(activeVault),
- serializedPSBTEnvelop: serializedPSBTEnvelop,
- vaultKey: vaultKey,
- vaultId: vaultId,
- vault: activeVault
- ? {
- networkType: activeVault.networkType,
- specs: activeVault.specs,
- signers: activeVault.signers,
- }
- : null,
- };
+ data.psbt = psbt;
+ data.keyUID = getKeyUID(signer);
+ data.xfp = xfp;
+ data.cachedTxid = cachedTxid;
}
if (mode === RKInteractionMode.SHARE_SIGNED_PSBT) {
- data.isMultisig = isMultisig;
- data.vaultKey = vaultKey;
- data.vaultId = vaultId;
data.psbt = psbt;
+ data.xfp = remoteLinkDetails.xfp;
+ data.cachedTxid = remoteLinkDetails.cachedTxid;
}
- console.log('🚀 ~ handleShare ~ data:', data);
- const encryptionKey = getRandomBytes(12);
+ const { encryptionKey, hash } = getKeyAndHash(12);
const encryptedData = encrypt(encryptionKey, JSON.stringify(data));
- const res = await Relay.createRemoteKey(encryptedData);
+ const res = await Relay.createRemoteKey(encryptedData, hash);
if (res?.id) {
const result = await Share.share({
title: RemoteShareText[mode].msgTitle,
message: `${RemoteShareText[mode].msgDesc}\nhttps://bitcoinkeeper.app/${
DeepLinkIdentifier[config.ENVIRONMENT]
- }/shareKey/${res.id}/${encryptionKey}`,
+ }/remote/${encryptionKey}`,
});
if (result.action === Share.sharedAction) {
- if (result.activityType) {
- // Add any specific logic if needed for the activity type
- } else {
- // Shared successfully
- }
- } else if (result.action === Share.dismissedAction) {
- // Dismissed by user
+ if (result.activityType) navigation.goBack();
}
}
} catch (error) {
console.log('🚀 ~ handleShare ~ error:', error);
+ } finally {
+ setPrimaryLoading(false);
}
};
@@ -186,6 +148,8 @@ function RemoteSharing({ route }: ScreenProps) {
primaryText={RemoteShareText[mode].cta}
primaryCallback={handleShare}
width={windowWidth * 0.82}
+ primaryLoading={primaryLoading}
+ primaryDisable={!isOnL2Above}
/>
(vault.signers.length > 1 ? true : false);
diff --git a/src/screens/SigningDevices/SetupAssistedVault.tsx b/src/screens/SigningDevices/SetupAssistedVault.tsx
new file mode 100644
index 000000000..931e70fe4
--- /dev/null
+++ b/src/screens/SigningDevices/SetupAssistedVault.tsx
@@ -0,0 +1,456 @@
+import { StyleSheet } from 'react-native';
+import { Box, FlatList, useColorMode } from 'native-base';
+import { CommonActions, useNavigation } from '@react-navigation/native';
+import React, { useCallback, useContext, useEffect, useState } from 'react';
+import { Signer, VaultScheme, VaultSigner } from 'src/services/wallets/interfaces/vault';
+import KeeperHeader from 'src/components/KeeperHeader';
+import ScreenWrapper from 'src/components/ScreenWrapper';
+import { hp, windowHeight, wp } from 'src/constants/responsive';
+import moment from 'moment';
+import { useDispatch } from 'react-redux';
+import { getSignerDescription, getSignerNameFromType } from 'src/hardware';
+import { MultisigScriptType, NetworkType, SignerType, VaultType } from 'src/services/wallets/enums';
+import useToastMessage from 'src/hooks/useToastMessage';
+import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import { NewVaultInfo } from 'src/store/sagas/wallets';
+import { addNewVault } from 'src/store/sagaActions/vaults';
+import { captureError } from 'src/services/sentry';
+import { useAppSelector } from 'src/store/hooks';
+import { resetVaultFlags } from 'src/store/reducers/vaults';
+import { resetRealyVaultState } from 'src/store/reducers/bhr';
+import useSignerMap from 'src/hooks/useSignerMap';
+import { generateVaultId } from 'src/services/wallets/factories/VaultFactory';
+import WalletVaultCreationModal from 'src/components/Modal/WalletVaultCreationModal';
+import useVault from 'src/hooks/useVault';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+import { SETUPASSISTEDVAULT } from 'src/navigation/contants';
+import AssistedVaultIcon from 'src/assets/images/assisted-vault-white-icon.svg';
+import HexagonIcon from 'src/components/HexagonIcon';
+import Colors from 'src/theme/Colors';
+import useAssistedWallet from 'src/hooks/useAssistedWallet';
+import HorizontalAddCard from 'src/components/HorizontalAddCard';
+import Text from 'src/components/KeeperText';
+import Buttons from 'src/components/Buttons';
+import {
+ ASSISTED_VAULT_TIMELOCKS,
+ ASSISTED_VAULT_TIMELOCKS_TESTNET,
+ generateAssistedVaultElements,
+} from 'src/services/wallets/operations/miniscript/default/AssistedVault';
+import config from 'src/utils/service-utilities/config';
+import WalletUtilities from 'src/services/wallets/operations/utils';
+import HorizontalSignerCard from '../AddSigner/HorizontalSignerCard';
+import { SDIcons } from '../Vault/SigningDeviceIcons';
+import { getKeyUID } from 'src/utils/utilities';
+
+function SignerItem({
+ vaultKey,
+ index,
+ signerMap,
+ setSelectedSigner,
+ assistedVaultScheme,
+ coSigners,
+}: {
+ vaultKey: VaultSigner | undefined;
+ index: number;
+ signerMap: { [key: string]: Signer };
+ setSelectedSigner: (vaultKeys: VaultSigner[], index: number) => void;
+ assistedVaultScheme: object;
+ coSigners: any;
+}) {
+ const { colorMode } = useColorMode();
+ const navigation = useNavigation();
+ const signer = vaultKey ? signerMap[getKeyUID(vaultKey)] : null;
+
+ const { translations } = useContext(LocalizationContext);
+ const { wallet, common } = translations;
+
+ const advisorKeyCallback = () => {
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'AddSigningDevice',
+ params: {
+ parentScreen: SETUPASSISTEDVAULT,
+ scheme: assistedVaultScheme,
+ signerFilters: [SignerType.KEEPER],
+ coSigners,
+ onGoBack: (vaultKeys) => setSelectedSigner(vaultKeys, index),
+ },
+ })
+ );
+ };
+
+ const userKeyCallback = () => {
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'AddSigningDevice',
+ params: {
+ parentScreen: SETUPASSISTEDVAULT,
+ scheme: assistedVaultScheme,
+ signerFilters: [SignerType.MY_KEEPER],
+ coSigners,
+ onGoBack: (vaultKeys) => setSelectedSigner(vaultKeys, index),
+ },
+ })
+ );
+ };
+
+ if (!signer || !vaultKey) {
+ const cardName = index === 0 ? 'Add User Key' : `${common.add} ${common.Advisor} ${index}`;
+ const cardCallback = index === 0 ? userKeyCallback : advisorKeyCallback;
+
+ return (
+
+ {index === 0 && (
+
+ {wallet.addUserKeyTitle}
+
+ )}
+ {index === 1 && (
+
+ {wallet.addAdvisorKeyTitle}
+
+ )}
+
+
+
+ );
+ }
+
+ return (
+
+ {index === 0 && (
+
+ Add your key to the wallet
+
+ )}
+ {index === 1 && (
+
+ Add two advisor keys to your wallet
+
+ )}
+
+
+
+
+
+ );
+}
+
+function SetupAssistedVault() {
+ const { colorMode } = useColorMode();
+ const navigation = useNavigation();
+ const dispatch = useDispatch();
+ const { allVaults } = useVault({ includeArchived: false });
+ const { hasNewVaultGenerationSucceeded, hasNewVaultGenerationFailed, error } = useAppSelector(
+ (state) => state.vault
+ );
+
+ const [assistedVaultScheme, setAssistedVaultScheme] = useState({
+ m: 2,
+ n: 3,
+ });
+ const [userKey, setUserKey] = useState(null);
+ const [advisorKeys, setAdvisorKeys] = useState(
+ new Array(assistedVaultScheme.n - 1).fill(null)
+ );
+ const [isCreating, setIsCreating] = useState(false);
+ const [walletCreatedModal, setWalletCreatedModal] = useState(false);
+ const [walletType, setWalletType] = useState('');
+ const [walletName, setWalletName] = useState('');
+ const [walletDescription, setWalletDescription] = useState('');
+ const [currentBlockHeight, setCurrentBlockHeight] = useState(null);
+ const { showToast } = useToastMessage();
+ const { assistedWallets } = useAssistedWallet();
+ const { signerMap } = useSignerMap();
+ const { translations } = useContext(LocalizationContext);
+ const { common, wallet, signer } = translations;
+
+ const handleSignerSelected = (vaultKeys, index) => {
+ if (index === 0) {
+ const newKey = vaultKeys[0];
+ if (userKey && getKeyUID(userKey) === getKeyUID(newKey)) {
+ showToast(signer.coSignerAlreadyAdded, );
+ } else {
+ setUserKey(newKey);
+ }
+ } else {
+ setAdvisorKeys((prevAdvisorKeys) => {
+ const newSigners = [...prevAdvisorKeys];
+ const newKey = vaultKeys[0];
+ const existingIndex = newSigners.findIndex(
+ (signer) => signer && getKeyUID(signer) === getKeyUID(newKey)
+ );
+ if (existingIndex !== -1) {
+ showToast(signer.coSignerAlreadyAdded, );
+ return prevAdvisorKeys;
+ } else {
+ newSigners[index - 1] = newKey;
+ }
+ return newSigners;
+ });
+ }
+ };
+
+ useEffect(() => {
+ // should bind with a refresher in case the auto fetch for block-height fails
+ WalletUtilities.fetchCurrentBlockHeight()
+ .then(({ currentBlockHeight }) => {
+ setCurrentBlockHeight(currentBlockHeight);
+ })
+ .catch((err) => showToast(err));
+ }, []);
+
+ const createVault = useCallback(() => {
+ try {
+ setIsCreating(true);
+
+ const multisigScriptType = MultisigScriptType.MINISCRIPT_MULTISIG;
+ if (!currentBlockHeight) {
+ showToast('Failed to sync current block height');
+ return;
+ }
+ const assistedVaultSigners = [userKey, advisorKeys[0], advisorKeys[1]];
+
+ const T1 =
+ config.NETWORK_TYPE === NetworkType.MAINNET
+ ? ASSISTED_VAULT_TIMELOCKS.T1
+ : ASSISTED_VAULT_TIMELOCKS_TESTNET.T1;
+ const T2 =
+ config.NETWORK_TYPE === NetworkType.MAINNET
+ ? ASSISTED_VAULT_TIMELOCKS.T2
+ : ASSISTED_VAULT_TIMELOCKS_TESTNET.T2;
+ const timelocks = [currentBlockHeight + T1, currentBlockHeight + T2];
+ const miniscriptElements = generateAssistedVaultElements(assistedVaultSigners, timelocks);
+ const vaultScheme: VaultScheme = {
+ ...assistedVaultScheme,
+ multisigScriptType,
+ };
+
+ const vaultInfo: NewVaultInfo = {
+ vaultType: VaultType.ASSISTED,
+ vaultScheme,
+ vaultSigners: assistedVaultSigners,
+ miniscriptElements,
+ vaultDetails: {
+ name: `${common.AssistedWallet} ${assistedWallets.length + 1}`,
+ description: '',
+ },
+ };
+
+ dispatch(addNewVault({ newVaultInfo: vaultInfo }));
+ setAssistedVaultScheme(vaultScheme);
+
+ return vaultInfo;
+ } catch (err) {
+ captureError(err);
+ return false;
+ }
+ }, [userKey, advisorKeys, currentBlockHeight]);
+
+ useEffect(() => {
+ if (
+ hasNewVaultGenerationSucceeded &&
+ [userKey, ...advisorKeys.filter((item) => !!item)].length === assistedVaultScheme.n &&
+ advisorKeys.filter((item) => item)?.length > 1
+ ) {
+ const combinedSigners = [userKey, ...advisorKeys.filter((item) => !!item)];
+ const generatedVaultId = generateVaultId(combinedSigners, assistedVaultScheme);
+ const collabWallet = allVaults.find((vault) => vault.id === generatedVaultId);
+ setWalletType(collabWallet && collabWallet.type);
+ setWalletName(collabWallet && collabWallet.presentationData.name);
+ setWalletDescription(collabWallet && collabWallet.presentationData.description);
+ setWalletCreatedModal(true);
+ setIsCreating(false);
+ }
+ }, [
+ hasNewVaultGenerationSucceeded,
+ hasNewVaultGenerationFailed,
+ userKey,
+ advisorKeys,
+ assistedVaultScheme,
+ ]);
+
+ const navigateToNextScreen = () => {
+ if (
+ hasNewVaultGenerationSucceeded &&
+ [userKey || null, ...advisorKeys.filter((item) => !!item)].length === assistedVaultScheme.n
+ ) {
+ setIsCreating(false);
+ const combinedSigners = [
+ ...(userKey ? [userKey] : []),
+ ...advisorKeys.filter((item) => !!item),
+ ];
+ const generatedVaultId = generateVaultId(combinedSigners, assistedVaultScheme);
+ const navigationState = generatedVaultId
+ ? {
+ index: 1,
+ routes: [
+ { name: 'Home' },
+ { name: 'VaultDetails', params: { vaultId: generatedVaultId } },
+ ],
+ }
+ : {
+ index: 1,
+ routes: [{ name: 'Home' }],
+ };
+ navigation.dispatch(CommonActions.reset(navigationState));
+ setWalletCreatedModal(false);
+ dispatch(resetVaultFlags());
+ dispatch(resetRealyVaultState());
+ }
+ if (hasNewVaultGenerationFailed) {
+ setIsCreating(false);
+ showToast(wallet.CollabWalletError, );
+ captureError(error);
+ }
+ };
+
+ const renderSigner = ({ item, index }) => (
+
+ );
+
+ return (
+
+ }
+ />
+ }
+ title={signer.addKeys}
+ subtitle={wallet.assistedVaultHeaderSubtitle}
+ />
+ item?.xfp ?? index.toString()}
+ renderItem={renderSigner}
+ contentContainerStyle={{
+ paddingHorizontal: wp(10),
+ }}
+ style={{
+ marginTop: hp(52),
+ }}
+ />
+
+
+ !!item)].length < 3}
+ paddingHorizontal={wp(136)}
+ />
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ itemContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ marginHorizontal: 10,
+ marginBottom: hp(windowHeight < 700 ? 5 : 25),
+ },
+ signerItemContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ marginHorizontal: 10,
+ marginBottom: hp(25),
+ },
+ signerItem: {
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ width: '100%',
+ },
+ remove: {
+ height: 26,
+ paddingHorizontal: 12,
+ borderRadius: 5,
+ backgroundColor: '#FAC48B',
+ justifyContent: 'center',
+ },
+ bottomContainer: {
+ bottom: 5,
+ padding: 20,
+ },
+ descriptionBox: {
+ height: 24,
+ borderRadius: 8,
+ paddingHorizontal: 10,
+ justifyContent: 'center',
+ },
+ backArrow: {
+ width: '15%',
+ alignItems: 'center',
+ },
+ space: {
+ marginVertical: 10,
+ },
+ addCard: {
+ height: hp(100),
+ alignItems: 'center',
+ marginBottom: hp(10),
+ },
+ signerCard: {
+ alignItems: 'center',
+ marginBottom: hp(15),
+ },
+ bitcoinIllustration: {
+ alignSelf: 'center',
+ },
+ addCoSigner: {
+ letterSpacing: 0.13,
+ lineHeight: 18,
+ width: wp(295),
+ },
+ title: {
+ marginBottom: hp(15),
+ marginTop: hp(10),
+ lineHeight: 24,
+ fontSize: 15,
+ },
+ buttonContainer: {
+ alignItems: 'center',
+ },
+});
+
+export default SetupAssistedVault;
diff --git a/src/screens/SigningDevices/SetupCollaborativeWallet.tsx b/src/screens/SigningDevices/SetupCollaborativeWallet.tsx
index ac4a8ceec..23ba0f6e4 100644
--- a/src/screens/SigningDevices/SetupCollaborativeWallet.tsx
+++ b/src/screens/SigningDevices/SetupCollaborativeWallet.tsx
@@ -7,7 +7,7 @@ import KeeperHeader from 'src/components/KeeperHeader';
import ScreenWrapper from 'src/components/ScreenWrapper';
import { hp, windowHeight, windowWidth, wp } from 'src/constants/responsive';
import { useDispatch } from 'react-redux';
-import { getPlaceholder } from 'src/utils/utilities';
+import { getKeyUID, getPlaceholder } from 'src/utils/utilities';
import { getSignerDescription, getSignerNameFromType } from 'src/hardware';
import { SignerType, VaultType, XpubTypes } from 'src/services/wallets/enums';
import useToastMessage from 'src/hooks/useToastMessage';
@@ -76,7 +76,7 @@ function SignerItem({
}) {
const { colorMode } = useColorMode();
const navigation = useNavigation();
- const signer = vaultKey ? signerMap[vaultKey.masterFingerprint] : null;
+ const signer = vaultKey ? signerMap[getKeyUID(vaultKey)] : null;
const { translations } = useContext(LocalizationContext);
const { wallet, common } = translations;
@@ -87,8 +87,9 @@ function SignerItem({
params: {
parentScreen: SETUPCOLLABORATIVEWALLET,
scheme: COLLABORATIVE_SCHEME,
+ signerFilters: [SignerType.KEEPER],
coSigners,
- onGoBack: (vaultKeys) => setSelectedSigner(vaultKeys),
+ onGoBack: (vaultKeys) => setSelectedSigner(vaultKeys, index),
},
})
);
@@ -111,7 +112,7 @@ function SignerItem({
return (
{
+ const handleSelectedSigners = (vaultKeys, index) => {
setCoSigners((prevCoSigners) => {
let newSigners = [...prevCoSigners];
const newKey = vaultKeys[0];
const existingIndex = newSigners.findIndex(
- (signer) => signer && signer.masterFingerprint === newKey.masterFingerprint
+ (signer) => signer && getKeyUID(signer) === getKeyUID(newKey)
);
if (existingIndex !== -1) {
showToast(signer.coSignerAlreadyAdded, );
diff --git a/src/screens/SigningDevices/SetupPortal.tsx b/src/screens/SigningDevices/SetupPortal.tsx
index 3683099bc..efbacc6b0 100644
--- a/src/screens/SigningDevices/SetupPortal.tsx
+++ b/src/screens/SigningDevices/SetupPortal.tsx
@@ -53,16 +53,20 @@ function SetupPortal({ route }) {
mode,
signer,
isMultisig,
+ accountNumber,
signTransaction,
addSignerFlow = false,
vaultId,
+ isRemoteKey,
}: {
mode: InteracationMode;
signer: Signer;
isMultisig: boolean;
+ accountNumber: number;
signTransaction?: (options: { portalCVC?: string }) => {};
addSignerFlow?: boolean;
vaultId?: string;
+ isRemoteKey?: boolean;
} = route.params;
const { colorMode } = useColorMode();
const [cvc, setCvc] = React.useState('');
@@ -178,7 +182,7 @@ function SetupPortal({ route }) {
// call register then check the value of it
await PORTAL.startReading();
await checkAndUnlock(cvc, setPortalStatus);
- const res = await PORTAL.getXpub({ isMultisig: true });
+ const res = await PORTAL.getXpub({ accountNumber, isMultisig: true });
if (res) {
dispatch(
healthCheckStatusUpdate([
@@ -233,7 +237,7 @@ function SetupPortal({ route }) {
const getPortalDetails = async () => {
await PORTAL.startReading();
await checkAndUnlock(cvc, setPortalStatus);
- const descriptor = await PORTAL.getXpub({ isMultisig: true });
+ const descriptor = await PORTAL.getXpub({ accountNumber, isMultisig: true });
const signer = PORTAL.getPortalDetailsFromDescriptor(descriptor.xpub);
return signer;
};
@@ -285,9 +289,24 @@ function SetupPortal({ route }) {
const signWithPortal = React.useCallback(async () => {
try {
- await signTransaction({ portalCVC: cvc });
+ const signedSerializedPSBT = await signTransaction({ portalCVC: cvc });
if (Platform.OS === 'ios') NFC.showiOSMessage(`Portal signed successfully!`);
- navigation.goBack();
+ if (isRemoteKey && signedSerializedPSBT) {
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'ShowPSBT',
+ params: {
+ data: signedSerializedPSBT,
+ encodeToBytes: false,
+ title: 'Signed PSBT',
+ subtitle: 'Please scan until all the QR data has been retrieved',
+ type: SignerType.KEEPER,
+ },
+ })
+ );
+ } else {
+ navigation.goBack();
+ }
} catch (error) {
PORTAL.stopReading();
showToast(
diff --git a/src/screens/SigningDevices/SetupTapsigner.tsx b/src/screens/SigningDevices/SetupTapsigner.tsx
index e7d401e83..9c090201d 100644
--- a/src/screens/SigningDevices/SetupTapsigner.tsx
+++ b/src/screens/SigningDevices/SetupTapsigner.tsx
@@ -66,14 +66,18 @@ function SetupTapsigner({ route }) {
mode,
signer,
isMultisig,
+ accountNumber,
signTransaction,
addSignerFlow = false,
+ isRemoteKey = false,
}: {
mode: InteracationMode;
signer: Signer;
isMultisig: boolean;
+ accountNumber: number;
signTransaction?: (options: { tapsignerCVC?: string }) => {};
addSignerFlow?: boolean;
+ isRemoteKey?: boolean;
} = route.params;
const { mapUnknownSigner } = useUnkownSigners();
const [statusModalVisible, setStatusModalVisible] = useState(false);
@@ -113,7 +117,7 @@ function SetupTapsigner({ route }) {
const addTapsigner = useCallback(async () => {
try {
const { xpub, derivationPath, masterFingerprint, xpubDetails } = await withModal(async () =>
- getTapsignerDetails(card, cvc, isTestnet(), isMultisig)
+ getTapsignerDetails(card, cvc, isTestnet(), isMultisig, accountNumber)
)();
let tapsigner: Signer;
let vaultKey: VaultSigner;
@@ -217,12 +221,12 @@ function SetupTapsigner({ route }) {
closeNfc();
card.endNfcSession();
}
- }, [cvc]);
+ }, [cvc, accountNumber]);
const verifyTapsginer = useCallback(async () => {
try {
const { masterFingerprint } = await withModal(async () =>
- getTapsignerDetails(card, cvc, isTestnet(), isMultisig)
+ getTapsignerDetails(card, cvc, isTestnet(), isMultisig, accountNumber)
)();
const handleSuccess = () => {
dispatch(
@@ -267,13 +271,28 @@ function SetupTapsigner({ route }) {
closeNfc();
card.endNfcSession();
}
- }, [cvc]);
+ }, [cvc, accountNumber]);
const signWithTapsigner = useCallback(async () => {
try {
- await signTransaction({ tapsignerCVC: cvc });
+ const signedSerializedPSBT = await signTransaction({ tapsignerCVC: cvc });
if (Platform.OS === 'ios') NFC.showiOSMessage(`TAPSIGNER signed successfully!`);
- navigation.goBack();
+ if (isRemoteKey && signedSerializedPSBT) {
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'ShowPSBT',
+ params: {
+ data: signedSerializedPSBT,
+ encodeToBytes: false,
+ title: 'Signed PSBT',
+ subtitle: 'Please scan until all the QR data has been retrieved',
+ type: SignerType.KEEPER,
+ },
+ })
+ );
+ } else {
+ navigation.goBack();
+ }
} catch (error) {
const errorMessage = handleTapsignerError(error, navigation);
if (errorMessage) {
diff --git a/src/screens/Vault/AddReserveKey.tsx b/src/screens/Vault/AddReserveKey.tsx
new file mode 100644
index 000000000..b0d4b67b3
--- /dev/null
+++ b/src/screens/Vault/AddReserveKey.tsx
@@ -0,0 +1,161 @@
+import { Box, useColorMode } from 'native-base';
+import React, { useContext, useState } from 'react';
+import { StyleSheet } from 'react-native';
+import HorizontalAddCard from 'src/components/HorizontalAddCard';
+import KeeperHeader from 'src/components/KeeperHeader';
+import Text from 'src/components/KeeperText';
+import ScreenWrapper from 'src/components/ScreenWrapper';
+import { hp, wp } from 'src/constants/responsive';
+import OptionPicker from 'src/components/OptionPicker';
+import { useNavigation } from '@react-navigation/native';
+import { ADDRESERVEKEY } from 'src/navigation/contants';
+import useSignerMap from 'src/hooks/useSignerMap';
+import { getSignerDescription, getSignerNameFromType } from 'src/hardware';
+import moment from 'moment';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+import KEEPERAPP from 'src/assets/images/KeeperIcon.svg';
+import KEEPERAPPLIGHT from 'src/assets/images/KeeperIconLight.svg';
+import Buttons from 'src/components/Buttons';
+import { SDIcons } from './SigningDeviceIcons';
+import HorizontalSignerCard from '../AddSigner/HorizontalSignerCard';
+import CreateReserveKeyVault from './CreateReserveKeyVault';
+import { MONTHS_12, MONTHS_24, MONTHS_18 } from './constants';
+import { getKeyUID } from 'src/utils/utilities';
+
+const DEFAULT_INHERITANCE_TIMELOCK = { label: MONTHS_12, value: 12 * 30 * 24 * 60 * 60 * 1000 };
+const INHERITANCE_TIMELOCK_DURATIONS = [
+ DEFAULT_INHERITANCE_TIMELOCK,
+ { label: MONTHS_18, value: 18 * 30 * 24 * 60 * 60 * 1000 },
+ { label: MONTHS_24, value: 24 * 30 * 24 * 60 * 60 * 1000 },
+];
+
+function AddReserveKey({ route }) {
+ const { vaultKeys, name, scheme, description, vaultId, isAddInheritanceKey, currentBlockHeight } =
+ route.params;
+ const { colorMode } = useColorMode();
+ const navigation = useNavigation();
+ const { signerMap } = useSignerMap();
+ const { translations } = useContext(LocalizationContext);
+ const { common, vault: vaultTranslations } = translations;
+ const [selectedOption, setSelectedOption] = useState(DEFAULT_INHERITANCE_TIMELOCK);
+ const [selectedSigner, setSelectedSigner] = useState(null);
+ const [vaultCreating, setCreating] = useState(false);
+
+ const reservedKey = selectedSigner ? signerMap[getKeyUID(selectedSigner[0])] : null;
+ const isDarkMode = colorMode === 'dark';
+
+ const userKeyCallback = () => {
+ navigation.push('AddSigningDevice', {
+ parentScreen: ADDRESERVEKEY,
+ selectedSignersFromParams: vaultKeys,
+ selectedReserveKey: selectedSigner,
+ scheme,
+ isAddInheritanceKey,
+ currentBlockHeight,
+ onGoBack: (signer) => setSelectedSigner(signer),
+ });
+ };
+
+ return (
+
+
+
+
+
+
+ {!reservedKey ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ {vaultTranslations.inheritanceKeyActivation}
+
+
+ {vaultTranslations.availableAfterDelay}
+
+
+
+ setSelectedOption(option)}
+ />
+
+
+
+
+ setCreating(true)}
+ />
+
+
+
+
+ );
+}
+
+export default AddReserveKey;
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: hp(20),
+ paddingHorizontal: wp(10),
+ justifyContent: 'space-between',
+ },
+ textContainer: {
+ gap: hp(5),
+ },
+ cardContainer: {
+ marginTop: hp(5),
+ },
+ contentContainer: {
+ gap: hp(25),
+ },
+ dropDownContainer: {
+ marginTop: hp(20),
+ },
+ bottomContainer: {
+ gap: hp(20),
+ },
+});
diff --git a/src/screens/Vault/AddSigningDevice.tsx b/src/screens/Vault/AddSigningDevice.tsx
index 4bf4baa1a..a2f85b887 100644
--- a/src/screens/Vault/AddSigningDevice.tsx
+++ b/src/screens/Vault/AddSigningDevice.tsx
@@ -1,6 +1,6 @@
import { ScrollView, StyleSheet } from 'react-native';
import { Box, useColorMode } from 'native-base';
-import { CommonActions, useNavigation, useRoute } from '@react-navigation/native';
+import { CommonActions, useFocusEffect, useNavigation, useRoute } from '@react-navigation/native';
import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';
import {
Signer,
@@ -23,14 +23,13 @@ import useSignerMap from 'src/hooks/useSignerMap';
import WalletUtilities from 'src/services/wallets/operations/utils';
import useVault from 'src/hooks/useVault';
import VaultIcon from 'src/assets/images/vault_icon.svg';
+import AssistedVaultIcon from 'src/assets/images/assisted-vault-white-icon.svg';
import HexagonIcon from 'src/components/HexagonIcon';
import Colors from 'src/theme/Colors';
import { useDispatch } from 'react-redux';
import { resetRealyVaultState, resetSignersUpdateState } from 'src/store/reducers/bhr';
import { getSignerDescription, getSignerNameFromType } from 'src/hardware';
import Text from 'src/components/KeeperText';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
-import * as Sentry from '@sentry/react-native';
import idx from 'idx';
import useSubscriptionLevel from 'src/hooks/useSubscriptionLevel';
import { AppSubscriptionLevel } from 'src/models/enums/SubscriptionTier';
@@ -38,25 +37,35 @@ import SuccessIllustration from 'src/assets/images/Success.svg';
import TickIcon from 'src/assets/images/tick_icon.svg';
import KeeperModal from 'src/components/KeeperModal';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import SignerEmptyStateIcon from 'src/assets/images/signer-empty.svg';
+import KEEPERAPPLIGHT from 'src/assets/images/KeeperIconLight.svg';
import CardPill from 'src/components/CardPill';
import { KeeperApp } from 'src/models/interfaces/KeeperApp';
import { RealmSchema } from 'src/storage/realm/enum';
import { useQuery } from '@realm/react';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
-import { SDIcons } from './SigningDeviceIcons';
-import VaultMigrationController from './VaultMigrationController';
-import SignerCard from '../AddSigner/SignerCard';
-import HardwareModalMap, { InteracationMode } from './HardwareModalMap';
-import { SETUPCOLLABORATIVEWALLET } from 'src/navigation/contants';
+import {
+ SETUPASSISTEDVAULT,
+ SETUPCOLLABORATIVEWALLET,
+ ADDRESERVEKEY,
+} from 'src/navigation/contants';
import { setupKeeperSigner } from 'src/hardware/signerSetup';
import { addSigningDevice } from 'src/store/sagaActions/vaults';
-import { captureError } from 'src/services/sentry';
+import { captureError, SentryErrorBoundary } from 'src/services/sentry';
import HWError from 'src/hardware/HWErrorState';
import KeyAddedModal from 'src/components/KeyAddedModal';
-import AddKeyButton from '../SigningDevices/components/AddKeyButton';
+import CautionIllustration from 'src/assets/images/downgradetopleb.svg';
+import Dropdown from 'src/components/Dropdown';
import { SafeAreaView } from 'react-native-safe-area-context';
-import EmptyListIllustration from '../../components/EmptyListIllustration';
import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
+import HardwareModalMap, { InteracationMode } from './HardwareModalMap';
+import SignerCard from '../AddSigner/SignerCard';
+import VaultMigrationController from './VaultMigrationController';
+import { SDIcons } from './SigningDeviceIcons';
+import { TIMELOCK_DURATIONS } from './constants';
+import AddKeyButton from '../SigningDevices/components/AddKeyButton';
+import EmptyListIllustration from '../../components/EmptyListIllustration';
+import { getKeyUID } from 'src/utils/utilities';
const onSignerSelect = (
selected,
@@ -77,7 +86,7 @@ const onSignerSelect = (
const isMultisig = msXpub && scheme.n > 1;
if (selected) {
- const updated = selectedSigners.delete(signer.masterFingerprint);
+ const updated = selectedSigners.delete(getKeyUID(signer));
if (updated) {
if (isMock) {
const updatedKeys = vaultKeys.filter((key) => msXpub && key.xpub !== msXpub.xpub);
@@ -102,11 +111,26 @@ const onSignerSelect = (
const scriptKey = WalletUtilities.getKeyForScheme(isMultisig, signer, msXpub, ssXpub, amfXpub);
vaultKeys.push(scriptKey);
setVaultKeys(vaultKeys);
- const updatedSignerMap = selectedSigners.set(signer.masterFingerprint, true);
+ const updatedSignerMap = selectedSigners.set(getKeyUID(signer), true);
setSelectedSigners(new Map(updatedSignerMap));
}
};
+const getVaultType = ({
+ isCollaborativeWallet,
+ isSSAddition,
+ isAssistedWallet,
+ isTimeLock,
+ isInheritance,
+}) => {
+ if (isCollaborativeWallet) return VaultType.COLLABORATIVE;
+ if (isSSAddition) return VaultType.SINGE_SIG;
+ if (isAssistedWallet) return VaultType.ASSISTED;
+ if (isTimeLock) return VaultType.TIMELOCKED;
+ if (isInheritance) return VaultType.INHERITANCE;
+ return VaultType.DEFAULT;
+};
+
const isAssistedKeyValidForScheme = (
signer: Signer,
scheme,
@@ -121,10 +145,10 @@ const isAssistedKeyValidForScheme = (
// case 2: count based restrictions for assisted keys
const currentAssistedKey = 1; // the assisted key for which the conditions are being checked
let existingAssistedKeys = 0;
- for (const mfp of selectedSigners.keys()) {
+ for (const keyUID of selectedSigners.keys()) {
if (
- signerMap[mfp].type === SignerType.POLICY_SERVER ||
- signerMap[mfp].type === SignerType.INHERITANCEKEY
+ signerMap[keyUID].type === SignerType.POLICY_SERVER ||
+ signerMap[keyUID].type === SignerType.INHERITANCEKEY
) {
existingAssistedKeys++;
}
@@ -188,16 +212,16 @@ const setInitialKeys = (
if (activeVault) {
// setting initital keys (update if scheme has changed)
const vaultKeys = activeVault.signers.filter(
- (key) => keyToRotate && key.masterFingerprint !== keyToRotate?.masterFingerprint
+ (key) => keyToRotate && getKeyUID(key) !== getKeyUID(keyToRotate)
);
const isMultisig = scheme.n > 1;
const modifiedVaultKeysForScriptType = [];
const updatedSignerMap = new Map();
vaultKeys.forEach((key) => {
- const signer = signerMap[key.masterFingerprint];
+ const signer = signerMap[getKeyUID(key)];
if (isSignerValidForScheme(signer, scheme, signerMap, selectedSigners).isValid) {
if (modifiedVaultKeysForScriptType.length < scheme.n) {
- updatedSignerMap.set(key.masterFingerprint, true);
+ updatedSignerMap.set(getKeyUID(key), true);
const msXpub: signerXpubs[XpubTypes][0] = signer.signerXpubs[XpubTypes.P2WSH][0];
const ssXpub: signerXpubs[XpubTypes][0] = signer.signerXpubs[XpubTypes.P2WPKH][0];
const amfXpub: signerXpubs[XpubTypes][0] = signer.signerXpubs[XpubTypes.AMF][0];
@@ -220,7 +244,7 @@ const setInitialKeys = (
};
const getSelectedKeysByType = (vaultKeys, signerMap, type) => {
- return vaultKeys.filter((key) => signerMap[key.masterFingerprint].type === type);
+ return vaultKeys.filter((key) => signerMap[getKeyUID(key)].type === type);
};
function Footer({
@@ -230,15 +254,26 @@ function Footer({
invalidMessage,
areSignersValid,
relayVaultUpdateLoading,
- common,
colorMode,
setCreating,
isCollaborativeFlow,
+ isAssistedWalletFlow,
+ isTimeLock,
+ setTimelockCautionModal,
+ isReserveKeyFlow,
+ isAddInheritanceKey,
+ currentBlockHeight,
vaultKeys,
onGoBack,
selectedSigners,
+ name,
+ description,
+ vaultId,
+ scheme,
}) {
const navigation = useNavigation();
+ const { translations } = useContext(LocalizationContext);
+ const { common } = translations;
const renderNotes = () => {
const notes = [];
if (amfSigners.length) {
@@ -278,23 +313,49 @@ function Footer({
navigation.goBack();
};
- const isProceedDisabled = isCollaborativeFlow && selectedSigners.size === 0;
+ const isProceedDisabled =
+ (isCollaborativeFlow || isAssistedWalletFlow) && selectedSigners.size === 0;
+ const isConfirmDisabled = isReserveKeyFlow && selectedSigners.size === 0;
+
return (
- {!isCollaborativeFlow && renderNotes()}
- {!isCollaborativeFlow ? (
+ {!(isCollaborativeFlow || isAssistedWalletFlow) && renderNotes()}
+ {!(isCollaborativeFlow || isAssistedWalletFlow) && !isReserveKeyFlow ? (
setCreating(true)}
+ primaryText={common.proceed}
+ primaryCallback={
+ !isAddInheritanceKey
+ ? () => setCreating(true)
+ : () =>
+ navigation.dispatch(
+ CommonActions.navigate('AddReserveKey', {
+ vaultKeys,
+ vaultId,
+ scheme,
+ name,
+ description,
+ isAddInheritanceKey,
+ currentBlockHeight,
+ })
+ )
+ }
+ fullWidth
+ />
+ ) : isReserveKeyFlow ? (
+
) : (
handleProceedButtonClick()}
fullWidth
/>
@@ -303,6 +364,23 @@ function Footer({
);
}
+function SignerEmptyState() {
+ const { colorMode } = useColorMode();
+ const { translations } = useContext(LocalizationContext);
+ const { signer: SignerTranlations } = translations;
+ return (
+
+
+ {SignerTranlations.noKeyAvailable}
+
+
+ {SignerTranlations.pleaseAddKey}
+
+
+
+ );
+}
+
function Signers({
signers,
selectedSigners,
@@ -319,9 +397,13 @@ function Signers({
keyToRotate,
setCreating,
isCollaborativeFlow,
+ isAssistedWalletFlow,
+ isReserveKeyFlow,
+ signerFilters,
coSigners,
setExternalKeyAddedModal,
setAddedKey,
+ selectedSignersFromParams,
}) {
const { level } = useSubscriptionLevel();
const dispatch = useDispatch();
@@ -357,26 +439,19 @@ function Signers({
});
let hasSigningServer = false; // actual signing server present?
- let hasInheritanceKey = false; // actual inheritance key present?
let isSigningServerShellCreated = false;
- let isInheritanceKeyShellCreated = false;
- if (shellKeys.filter((signer) => signer.type === SignerType.POLICY_SERVER).length > 0)
+ if (shellKeys.filter((signer) => signer.type === SignerType.POLICY_SERVER).length > 0) {
isSigningServerShellCreated = true;
-
- if (shellKeys.filter((signer) => signer.type === SignerType.INHERITANCEKEY).length > 0)
- isInheritanceKeyShellCreated = true;
+ }
for (const signer of signers) {
if (signer.type === SignerType.POLICY_SERVER) hasSigningServer = true;
- else if (signer.type === SignerType.INHERITANCEKEY) hasInheritanceKey = true;
}
- if (!isSigningServerShellCreated && !hasSigningServer && level >= AppSubscriptionLevel.L2)
+ if (!isSigningServerShellCreated && !hasSigningServer && level >= AppSubscriptionLevel.L2) {
shellKeys.push(generateShellAssistedKey(SignerType.POLICY_SERVER));
-
- if (!isInheritanceKeyShellCreated && !hasInheritanceKey && level >= AppSubscriptionLevel.L3)
- shellKeys.push(generateShellAssistedKey(SignerType.INHERITANCEKEY));
+ }
const addedSignersTypes = signers.map((signer) => signer.type);
return shellKeys.filter((shellSigner) => !addedSignersTypes.includes(shellSigner.type));
@@ -387,10 +462,9 @@ function Signers({
const isAMF = false;
return (
{
if (shellSigner.type === SignerType.POLICY_SERVER) setupSignigngServer();
- else if (shellSigner.type === SignerType.INHERITANCEKEY) setupInheritanceKey();
}}
name={getSignerNameFromType(shellSigner.type, shellSigner.isMock, isAMF)}
description="Setup required"
@@ -404,74 +478,95 @@ function Signers({
});
};
- const renderSigners = useCallback(() => {
- const myAppKeys = getSelectedKeysByType(vaultKeys, signerMap, SignerType.MY_KEEPER);
- const signerCards = signers.map((signer) => {
- if (signer.archived) return null;
- const { isValid, err } = isSignerValidForScheme(signer, scheme, signerMap, selectedSigners);
- const disabled =
- !isValid ||
- (signer.type === SignerType.MY_KEEPER &&
- myAppKeys.length >= 1 &&
- myAppKeys[0].masterFingerprint !== signer.masterFingerprint) ||
- // disabled selection during change key flow
- (keyToRotate &&
- (keyToRotate.masterFingerprint === signer.masterFingerprint ||
- selectedSigners.get(signer.masterFingerprint)));
- return (
- {
- onSignerSelect(
- selected,
- signer,
- scheme,
- vaultKeys,
- setVaultKeys,
- selectedSigners,
- setSelectedSigners,
- showToast
- );
- if (keyToRotate && vaultKeys.length === scheme.n) {
- showToast('Updating vault keys and archiving the old vault', );
- setCreating(true);
+ const renderSigners = useCallback(
+ (signerFilters = []) => {
+ const myAppKeys = getSelectedKeysByType(vaultKeys, signerMap, SignerType.MY_KEEPER);
+
+ const filteredSigners =
+ signerFilters.length > 0
+ ? signers.filter((signer) => signerFilters.includes(signer.type))
+ : signers;
+
+ const signerCards = filteredSigners.map((signer) => {
+ if (signer.archived) return null;
+ const { isValid, err } = isSignerValidForScheme(signer, scheme, signerMap, selectedSigners);
+ const disabled =
+ !isValid ||
+ (signer.type === SignerType.MY_KEEPER &&
+ myAppKeys.length >= 1 &&
+ getKeyUID(myAppKeys[0]) !== getKeyUID(signer)) ||
+ vaultKeys.some(
+ (key) =>
+ key.masterFingerprint === signer.masterFingerprint &&
+ getKeyUID(key) !== getKeyUID(signer)
+ ) ||
+ // disabled selection during change key flow
+ (keyToRotate &&
+ (getKeyUID(keyToRotate) === getKeyUID(signer) ||
+ selectedSigners.get(getKeyUID(signer))));
+
+ return (
+
- );
- });
- return signerCards;
- }, [signers]);
+ description={getSignerDescription(signer)}
+ icon={SDIcons(signer.type).Icon}
+ image={signer?.extraData?.thumbnailPath}
+ isSelected={!!selectedSigners.get(getKeyUID(signer))}
+ onCardSelect={(selected) => {
+ onSignerSelect(
+ selected,
+ signer,
+ scheme,
+ vaultKeys,
+ setVaultKeys,
+ selectedSigners,
+ setSelectedSigners,
+ showToast
+ );
+ if (keyToRotate && vaultKeys.length === scheme.n) {
+ showToast('Updating vault keys and archiving the old vault', );
+ setCreating(true);
+ }
+ }}
+ colorMode={colorMode}
+ />
+ );
+ });
+
+ return signerCards;
+ },
+ [signers, signerFilters]
+ );
const renderCollaborativeSigners = useCallback(() => {
const myAppKeys = getSelectedKeysByType(vaultKeys, signerMap, SignerType.MY_KEEPER);
const anySignerSelected = [...selectedSigners.values()].some((selected) => selected);
const validCoSigners = coSigners.filter((signer) => signer);
- const coSignersMap = new Map(validCoSigners.map((signer) => [signer.masterFingerprint, true]));
+ const coSignersMap = new Map(validCoSigners.map((signer) => [getKeyUID(signer), true]));
const signerCards = signers
.filter((signer) => signer.type === SignerType.KEEPER && !signer.archived)
.map((signer) => {
const { isValid, err } = isSignerValidForScheme(signer, scheme, signerMap, selectedSigners);
- const isCoSigner = coSignersMap.has(signer.masterFingerprint);
+ const isCoSigner = coSignersMap.has(getKeyUID(signer));
const disabled =
!isValid ||
(signer.type === SignerType.MY_KEEPER &&
myAppKeys.length >= 1 &&
- myAppKeys[0].masterFingerprint !== signer.masterFingerprint) ||
- (anySignerSelected && !selectedSigners.get(signer.masterFingerprint)) ||
+ getKeyUID(myAppKeys[0]) !== getKeyUID(signer)) ||
+ vaultKeys.some(
+ (key) =>
+ key.masterFingerprint === signer.masterFingerprint &&
+ getKeyUID(key) !== getKeyUID(signer)
+ ) ||
+ (anySignerSelected && !selectedSigners.get(getKeyUID(signer))) ||
isCoSigner;
const handleCardSelect = (selected) => {
@@ -494,7 +589,7 @@ function Signers({
showSelection={showSelection}
disabled={disabled}
isFromSiginingList={true}
- key={signer.masterFingerprint}
+ key={getKeyUID(signer)}
name={
!signer.isBIP85
? getSignerNameFromType(signer.type, signer.isMock)
@@ -503,7 +598,7 @@ function Signers({
description={getSignerDescription(signer)}
icon={SDIcons(signer.type).Icon}
image={signer?.extraData?.thumbnailPath}
- isSelected={!!selectedSigners.get(signer.masterFingerprint) || isCoSigner}
+ isSelected={!!selectedSigners.get(getKeyUID(signer)) || isCoSigner}
onCardSelect={handleCardSelect}
colorMode={colorMode}
/>
@@ -527,7 +622,84 @@ function Signers({
coSigners,
]);
- const signer: Signer = keyToRotate ? signerMap[keyToRotate.masterFingerprint] : null;
+ const renderReservedKeys = useCallback(() => {
+ const myAppKeys = getSelectedKeysByType(vaultKeys, signerMap, SignerType.MY_KEEPER);
+ const anySignerSelected = [...selectedSigners.values()].some((selected) => selected);
+
+ const selectedFingerprintsSet = new Set(
+ selectedSignersFromParams.map((signer) => signer.masterFingerprint)
+ );
+
+ const signerCards = signers
+ .filter((signer) => !signer.archived)
+ .filter(
+ (signer) =>
+ [SignerType.MY_KEEPER, SignerType.TAPSIGNER, SignerType.SEED_WORDS].includes(signer.type) // Filter by desired signer types
+ )
+ .filter((signer) => !selectedFingerprintsSet.has(signer.masterFingerprint)) // Avoid selected signers from params
+ .map((signer) => {
+ const { isValid, err } = isSignerValidForScheme(signer, scheme, signerMap, selectedSigners);
+ const disabled =
+ !isValid ||
+ (signer.type === SignerType.MY_KEEPER &&
+ myAppKeys.length >= 1 &&
+ myAppKeys[0].masterFingerprint !== signer.masterFingerprint) ||
+ (anySignerSelected && !selectedSigners.get(getKeyUID(signer)));
+
+ const handleCardSelect = (selected) => {
+ if (disabled) return;
+
+ onSignerSelect(
+ selected,
+ signer,
+ scheme,
+ vaultKeys,
+ setVaultKeys,
+ selectedSigners,
+ setSelectedSigners,
+ showToast
+ );
+ };
+
+ return (
+
+ );
+ });
+
+ return signerCards;
+ }, [
+ signers,
+ selectedSigners,
+ selectedSignersFromParams,
+ scheme,
+ signerMap,
+ vaultKeys,
+ keyToRotate,
+ showSelection,
+ colorMode,
+ setSelectedSigners,
+ setVaultKeys,
+ showToast,
+ setCreating,
+ ]);
+
+ const signer: Signer = keyToRotate ? signerMap[getKeyUID(keyToRotate)] : null;
const onQrScan = async (qrData) => {
try {
@@ -608,11 +780,13 @@ function Signers({
{signers.length ? (
- {!isCollaborativeFlow ? (
+ {!isCollaborativeFlow && !isReserveKeyFlow ? (
<>
- {renderSigners()}
- {renderAssistedKeysShell()}
+ {renderSigners(signerFilters)}
+ {signerFilters.length <= 0 && renderAssistedKeysShell()}
>
+ ) : isReserveKeyFlow ? (
+ <>{renderReservedKeys()}>
) : signers.filter(
(signer) => signer.type === SignerType.KEEPER && !signer.archived
).length ? (
@@ -625,6 +799,7 @@ function Signers({
) : (
)}
+
;
};
};
const {
@@ -686,12 +866,18 @@ function AddSigningDevice() {
coSigners,
isSSAddition = false,
addedSigner,
+ selectedSignersFromParams,
+ isTimeLock = false,
+ isAddInheritanceKey = false,
+ currentBlockHeight,
+ signerFilters = [],
} = route.params;
const { showToast } = useToastMessage();
const { relayVaultUpdateLoading } = useAppSelector((state) => state.bhr);
const { translations } = useContext(LocalizationContext);
- const { vault: vaultTranslation, common, signer } = translations;
+ const { vault: vaultTranslation, common, signer, wallet: walletTranslation } = translations;
const [keyAddedModalVisible, setKeyAddedModalVisible] = useState(false);
+ const [selectedDuration, setSelectedDuration] = useState('');
const { signers } = useSigners();
// filter out archived & hidden signers
@@ -702,6 +888,13 @@ function AddSigningDevice() {
const { activeVault, allVaults } = useVault({ vaultId });
const isCollaborativeWallet = activeVault?.type == VaultType.COLLABORATIVE;
const isCollaborativeFlow = parentScreen === SETUPCOLLABORATIVEWALLET;
+ const isAssistedWallet = activeVault?.type == VaultType.ASSISTED;
+ const isAssistedWalletFlow = parentScreen === SETUPASSISTEDVAULT;
+ const [timeLockCautionModal, setTimelockCautionModal] = useState(false);
+ const [selectDurationModal, setSelectDurationModal] = useState(false);
+ const [timeLockWalletCreatedModal, setTimeLockWalletCreatedModal] = useState(false);
+
+ const isReserveKeyFlow = parentScreen === ADDRESERVEKEY;
const [externalKeyAddedModal, setExternalKeyAddedModal] = useState(false);
const [addedKey, setAddedKey] = useState(null);
@@ -731,6 +924,9 @@ function AddSigningDevice() {
const { vaultSigners: keys } = useSigners(newVault?.id);
const inheritanceSigner = keys.filter((signer) => signer?.type === SignerType.INHERITANCEKEY)[0];
+ const handleOptionSelect = useCallback((option) => {
+ setSelectedDuration(option);
+ }, []);
const [inProgress, setInProgress] = useState(false);
const handleModalClose = () => {
@@ -772,23 +968,25 @@ function AddSigningDevice() {
};
}, [relaySignersUpdate]);
- useEffect(() => {
- if (relayVaultUpdate && newVault) {
- dispatch(resetRealyVaultState());
- setCreating(false);
- setVaultCreatedModalVisible(true);
- } else if (relayVaultUpdate) {
- navigation.dispatch(CommonActions.reset({ index: 1, routes: [{ name: 'Home' }] }));
- dispatch(resetRealyVaultState());
- setCreating(false);
- }
+ useFocusEffect(
+ useCallback(() => {
+ if (relayVaultUpdate && newVault) {
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ setVaultCreatedModalVisible(true);
+ } else if (relayVaultUpdate) {
+ navigation.dispatch(CommonActions.reset({ index: 1, routes: [{ name: 'Home' }] }));
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ }
- if (relayVaultError) {
- showToast(realyVaultErrorMessage, );
- dispatch(resetRealyVaultState());
- setCreating(false);
- }
- }, [relayVaultUpdate, relayVaultError]);
+ if (relayVaultError) {
+ showToast(realyVaultErrorMessage, );
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ }
+ }, [relayVaultUpdate, relayVaultError, newVault, navigation, dispatch])
+ );
useEffect(() => {
setInitialKeys(
@@ -882,6 +1080,48 @@ function AddSigningDevice() {
);
}
+ function TimeLockWalletCreatedContent(vault: Vault) {
+ return (
+
+
+
+
+ }
+ />
+
+
+ {vault.presentationData.description ? (
+
+ {vault.presentationData.description}
+
+ ) : null}
+
+ {vault.presentationData.name}
+
+
+
+
+
+
+ {vaultTranslation.VaultCreatedModalDesc}
+
+
+
+ );
+ }
+ function TimeLockInfoModalContent() {
+ return (
+
+
+
+
+ );
+ }
+
function SingleSigWallet(vault: Vault) {
const tags = ['SINGLE-KEY', 'COLD'];
return (
@@ -955,14 +1195,14 @@ function AddSigningDevice() {
}
+ icon={!isReserveKeyFlow ? : }
/>
}
// To-Do-Learn-More
@@ -976,13 +1216,16 @@ function AddSigningDevice() {
description={description}
vaultId={vaultId}
setGeneratedVaultId={setGeneratedVaultId}
- vaultType={
- isCollaborativeWallet
- ? VaultType.COLLABORATIVE
- : isSSAddition
- ? VaultType.SINGE_SIG
- : VaultType.DEFAULT
- }
+ vaultType={getVaultType({
+ isCollaborativeWallet,
+ isSSAddition,
+ isAssistedWallet,
+ isTimeLock,
+ isInheritance: isAddInheritanceKey,
+ })}
+ isTimeLock={route.params.isTimeLock}
+ isAddInheritanceKey={isAddInheritanceKey}
+ currentBlockHeight={currentBlockHeight}
/>
+ {
+ setTimeLockWalletCreatedModal(false);
+ }}
+ visible={timeLockWalletCreatedModal}
+ title={vaultTranslation.timeLockCreatedTitle}
+ subTitle={vaultTranslation.timeLockCreatedSubtitle}
+ buttonText={walletTranslation.ViewWallet}
+ showButtons
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ textColor={`${colorMode}.primaryText`}
+ buttonTextColor={`${colorMode}.buttonText`}
+ buttonBackground={`${colorMode}.greenButtonBackground`}
+ subTitleColor={`${colorMode}.secondaryText`}
+ subTitleWidth={wp(280)}
+ showCloseIcon={false}
+ Content={() => TimeLockWalletCreatedContent(newVault)}
+ />
+ {
+ setTimelockCautionModal(false);
+ }}
+ visible={timeLockCautionModal}
+ title={vaultTranslation.timeLockCautionTitle}
+ subTitle={vaultTranslation.timeLockCautionSubtitle}
+ buttonText={common.continue}
+ secondaryButtonText={common.cancel}
+ buttonCallback={() => {
+ setTimelockCautionModal(false);
+ setSelectDurationModal(true);
+ }}
+ secondaryCallback={() => setTimelockCautionModal(false)}
+ showButtons
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ textColor={`${colorMode}.primaryText`}
+ buttonTextColor={`${colorMode}.buttonText`}
+ buttonBackground={`${colorMode}.greenButtonBackground`}
+ subTitleColor={`${colorMode}.secondaryText`}
+ subTitleWidth={wp(280)}
+ showCloseIcon={false}
+ Content={TimeLockInfoModalContent}
+ />
+ {
+ setSelectDurationModal(false);
+ }}
+ visible={selectDurationModal}
+ title={vaultTranslation.timeLockDurationTitle}
+ subTitle={vaultTranslation.timeLockDurationSubtitle}
+ showButtons
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ textColor={`${colorMode}.primaryText`}
+ buttonTextColor={`${colorMode}.buttonText`}
+ buttonBackground={`${colorMode}.greenButtonBackground`}
+ secondaryCallback={() => setSelectDurationModal(false)}
+ subTitleColor={`${colorMode}.secondaryText`}
+ subTitleWidth={wp(280)}
+ showCloseIcon={false}
+ Content={() => (
+
+
+
+ {
+ setCreating(true);
+ setSelectDurationModal(false);
+ }}
+ secondaryText={common.cancel}
+ secondaryCallback={() => setSelectDurationModal(false)}
+ primaryDisable={!selectedDuration}
+ />
+
+
+ )}
+ />
{
@@ -1157,6 +1494,44 @@ const styles = StyleSheet.create({
desc: {
marginBottom: hp(18),
},
+ externalKeyModal: {
+ alignItems: 'center',
+ },
+ externalKeyIllustration: {
+ marginBottom: hp(20),
+ },
+ externalKeyText: {
+ marginBottom: hp(20),
+ },
+ cautionIllustration: {
+ alignSelf: 'center',
+ marginBottom: hp(30),
+ },
+ timelockContent: {
+ marginBottom: hp(10),
+ },
+ buttonContainer: {
+ marginTop: hp(30),
+ },
+ emptyWrapper: {
+ alignSelf: 'center',
+ width: '90%',
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingTop: hp(35),
+ },
+ emptyText: {
+ fontSize: 15,
+ lineHeight: 20,
+ marginBottom: hp(3),
+ },
+ emptySubText: {
+ fontSize: 14,
+ lineHeight: 20,
+ width: wp(206),
+ textAlign: 'center',
+ marginBottom: hp(30),
+ },
addKeyBtnWrapper: {
flex: 1,
minWidth: wp(110),
@@ -1166,4 +1541,4 @@ const styles = StyleSheet.create({
},
});
-export default Sentry.withErrorBoundary(AddSigningDevice, errorBourndaryOptions);
+export default SentryErrorBoundary(AddSigningDevice);
diff --git a/src/screens/Vault/AdditionalDetails.tsx b/src/screens/Vault/AdditionalDetails.tsx
index 46224a5bf..f61c7d2bb 100644
--- a/src/screens/Vault/AdditionalDetails.tsx
+++ b/src/screens/Vault/AdditionalDetails.tsx
@@ -23,6 +23,7 @@ import Text from 'src/components/KeeperText';
import { getPersistedDocument } from 'src/services/documents';
import { useAppSelector } from 'src/store/hooks';
import { resetSignersUpdateState } from 'src/store/reducers/bhr';
+import { getKeyUID } from 'src/utils/utilities';
type ScreenProps = NativeStackScreenProps;
@@ -33,7 +34,7 @@ function AdditionalDetails({ route }: ScreenProps) {
const dispatch = useDispatch();
const { signer: signerFromParam } = route.params;
const { signerMap } = useSignerMap();
- const signer = signerMap[signerFromParam?.masterFingerprint];
+ const signer = signerMap[getKeyUID(signerFromParam)];
const [description, setDescription] = useState(signer?.signerDescription || '');
const [editContactModal, setEditContactModal] = useState(false);
const { thumbnailPath, givenName, familyName } = signer.extraData;
diff --git a/src/screens/Vault/ArchivedVault.tsx b/src/screens/Vault/ArchivedVault.tsx
index 61e852d8d..d6d8de047 100644
--- a/src/screens/Vault/ArchivedVault.tsx
+++ b/src/screens/Vault/ArchivedVault.tsx
@@ -5,7 +5,6 @@ import { hp, wp } from 'src/constants/responsive';
import KeeperHeader from 'src/components/KeeperHeader';
import EmptyState from 'src/assets/images/empty-state-illustration.svg';
import { StyleSheet } from 'react-native';
-import { CommonActions } from '@react-navigation/native';
import useVault from 'src/hooks/useVault';
import VaultIcon from 'src/assets/images/vault_icon.svg';
import ActionCard from 'src/components/ActionCard';
@@ -33,15 +32,7 @@ function ArchivedVault({ navigation, route }) {
description={item.presentationData.description}
icon={ }
customStyle={!isSmallDevice ? { height: hp(125) } : { height: hp(150) }}
- callback={() =>
- navigation.dispatch(
- CommonActions.navigate({
- name: 'VaultDetails',
- params: { vaultId: item?.id },
- merge: true,
- })
- )
- }
+ callback={() => navigation.push('VaultDetails', { vaultId: item?.id })}
/>
);
diff --git a/src/screens/Vault/ChoosePolicyNew.tsx b/src/screens/Vault/ChoosePolicyNew.tsx
index cccd7eb69..6307e6923 100644
--- a/src/screens/Vault/ChoosePolicyNew.tsx
+++ b/src/screens/Vault/ChoosePolicyNew.tsx
@@ -32,7 +32,6 @@ import TickIcon from 'src/assets/images/tick_icon.svg';
import { useAppSelector } from 'src/store/hooks';
import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
import { setSignerPolicyError } from 'src/store/reducers/wallets';
-import useSigners from 'src/hooks/useSigners';
function ChoosePolicyNew({ navigation, route }) {
const { colorMode } = useColorMode();
@@ -44,9 +43,7 @@ function ChoosePolicyNew({ navigation, route }) {
const [validationModal, showValidationModal] = useState(false);
const [otp, setOtp] = useState('');
- const { isUpdate, addSignerFlow, vaultId, signerId } = route.params;
- const { signers } = useSigners();
- const currentSigner = signers.find((signer) => signer.masterFingerprint === signerId);
+ const { isUpdate, addSignerFlow, vaultId, signer: currentSigner } = route.params;
const existingRestrictions = idx(currentSigner, (_) => _.signerPolicy.restrictions);
const existingExceptions = idx(currentSigner, (_) => _.signerPolicy.exceptions);
diff --git a/src/screens/Vault/CreateReserveKeyVault.tsx b/src/screens/Vault/CreateReserveKeyVault.tsx
new file mode 100644
index 000000000..3586a2cac
--- /dev/null
+++ b/src/screens/Vault/CreateReserveKeyVault.tsx
@@ -0,0 +1,203 @@
+import React, { useCallback, useContext, useEffect, useState } from 'react';
+import { Box, useColorMode } from 'native-base';
+import { useDispatch } from 'react-redux';
+import { useFocusEffect, useNavigation, CommonActions } from '@react-navigation/native';
+import useToastMessage from 'src/hooks/useToastMessage';
+import { VaultType } from 'src/services/wallets/enums';
+import { resetRealyVaultState } from 'src/store/reducers/bhr';
+import { useAppSelector } from 'src/store/hooks';
+import KeeperModal from 'src/components/KeeperModal';
+import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import { Vault } from 'src/services/wallets/interfaces/vault';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+import { wp, hp } from 'src/constants/responsive';
+import Text from 'src/components/KeeperText';
+import CardPill from 'src/components/CardPill';
+import HexagonIcon from 'src/components/HexagonIcon';
+import VaultIcon from 'src/assets/images/vault_icon.svg';
+import { StyleSheet } from 'react-native';
+import useVault from 'src/hooks/useVault';
+import Colors from 'src/theme/Colors';
+import VaultMigrationController from './VaultMigrationController';
+
+function CreateReserveKeyVault({
+ vaultCreating,
+ setCreating,
+ vaultKeys,
+ reservedKey,
+ scheme,
+ name,
+ description,
+ vaultId,
+ isAddInheritanceKey,
+ currentBlockHeight,
+ selectedDuration,
+}) {
+ const { showToast } = useToastMessage();
+
+ const dispatch = useDispatch();
+ const navigation = useNavigation();
+ const { colorMode } = useColorMode();
+ const { translations } = useContext(LocalizationContext);
+ const { vault: vaultTranslation, common } = translations;
+ const isDarkMode = colorMode === 'dark';
+
+ const [vaultCreatedModalVisible, setVaultCreatedModalVisible] = useState(false);
+ const { relayVaultUpdate, relayVaultError, realyVaultErrorMessage } = useAppSelector(
+ (state) => state.bhr
+ );
+ const [generatedVaultId, setGeneratedVaultId] = useState('');
+
+ const { allVaults } = useVault({ vaultId });
+ const newVault = allVaults.filter((v) => v.id === generatedVaultId)[0];
+
+ useFocusEffect(
+ useCallback(() => {
+ if (relayVaultUpdate && newVault) {
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ setVaultCreatedModalVisible(true);
+ } else if (relayVaultUpdate) {
+ navigation.dispatch(CommonActions.reset({ index: 1, routes: [{ name: 'Home' }] }));
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ }
+
+ if (relayVaultError) {
+ showToast(realyVaultErrorMessage, );
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ }
+ }, [relayVaultUpdate, relayVaultError, newVault, navigation, dispatch])
+ );
+
+ const viewVault = () => {
+ setVaultCreatedModalVisible(false);
+ navigation.dispatch(
+ CommonActions.reset({
+ index: 1,
+ routes: [
+ { name: 'Home' },
+ {
+ name: 'VaultDetails',
+ params: { vaultId: generatedVaultId, vaultTransferSuccessful: true },
+ },
+ ],
+ })
+ );
+ };
+
+ function VaultCreatedModalContent(vault: Vault) {
+ const tags = ['Inheritance Key', `${vault.scheme.m}-of-${vault.scheme.n}`];
+ return (
+
+
+
+ {tags?.map((tag, index) => {
+ return (
+
+ );
+ })}
+
+
+
+ }
+ />
+
+
+ {vault.presentationData.description ? (
+
+ {vault.presentationData.description}
+
+ ) : null}
+
+ {vault.presentationData.name}
+
+
+
+
+
+
+ {vaultTranslation.VaultCreatedModalDesc}
+
+
+
+ );
+ }
+
+ return (
+ <>
+
+ {}}
+ visible={vaultCreatedModalVisible}
+ title={vaultTranslation.vaultCreatedSuccessTitle}
+ subTitle={`Your ${newVault?.scheme?.m}-of-${newVault?.scheme?.n} vault has been created successfully. Please test the setup before putting in significant amounts.`}
+ Content={() => VaultCreatedModalContent(newVault)}
+ buttonText={vaultTranslation.ViewVault}
+ buttonCallback={viewVault}
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ textColor={`${colorMode}.primaryText`}
+ buttonTextColor={`${colorMode}.buttonText`}
+ buttonBackground={`${colorMode}.greenButtonBackground`}
+ subTitleColor={`${colorMode}.secondaryText`}
+ subTitleWidth={wp(280)}
+ showCloseIcon={false}
+ />
+ >
+ );
+}
+
+export default CreateReserveKeyVault;
+const styles = StyleSheet.create({
+ walletVaultInfoContainer: {
+ paddingHorizontal: 15,
+ paddingVertical: 20,
+ marginVertical: 20,
+ borderRadius: 10,
+ },
+ pillsContainer: {
+ flexDirection: 'row',
+ gap: 5,
+ justifyContent: 'flex-end',
+ marginBottom: 10,
+ },
+ walletVaultInfoWrapper: {
+ flexDirection: 'row',
+ },
+ iconWrapper: {
+ marginRight: 10,
+ },
+ titleText: {
+ fontSize: 14,
+ },
+ descText: {
+ fontSize: 14,
+ width: wp(300),
+ marginBottom: hp(18),
+ },
+});
diff --git a/src/screens/Vault/HardwareModalMap.tsx b/src/screens/Vault/HardwareModalMap.tsx
index 72192fe77..c62bb30a4 100644
--- a/src/screens/Vault/HardwareModalMap.tsx
+++ b/src/screens/Vault/HardwareModalMap.tsx
@@ -70,7 +70,7 @@ import useToastMessage, { IToastCategory } from 'src/hooks/useToastMessage';
import LoginMethod from 'src/models/enums/LoginMethod';
import HWError from 'src/hardware/HWErrorState';
import ReactNativeBiometrics from 'react-native-biometrics';
-import { crossInteractionHandler } from 'src/utils/utilities';
+import { crossInteractionHandler, getAccountFromSigner } from 'src/utils/utilities';
import { isTestnet } from 'src/constants/Bitcoin';
import Buttons from 'src/components/Buttons';
import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
@@ -109,14 +109,14 @@ import {
import { extractColdCardExport } from 'src/hardware/coldcard';
import PasscodeVerifyModal from 'src/components/Modal/PasscodeVerify';
import useCanaryWalletSetup from 'src/hooks/UseCanaryWalletSetup';
-import SignerCard from '../AddSigner/SignerCard';
import { hcStatusType } from 'src/models/interfaces/HeathCheckTypes';
import NFC from 'src/services/nfc';
import { useQuery } from '@realm/react';
import { RealmSchema } from 'src/storage/realm/enum';
-import BackupModalContent from '../AppSettings/BackupModal';
import idx from 'idx';
import { setLastUsedOption } from 'src/store/reducers/signer';
+import BackupModalContent from '../AppSettings/BackupModal';
+import SignerCard from '../AddSigner/SignerCard';
const RNBiometrics = new ReactNativeBiometrics();
@@ -201,9 +201,9 @@ const getSignerContent = (
isMultisig ? 'MultiSig' : 'SingleSig'
}.`;
- let usbInstructions = `To use Jade via USB, please download the Bitcoin Keeper desktop app from our website: ${KEEPER_WEBSITE_BASE_URL}/desktop and connect your Jade to the computer.`;
+ const usbInstructions = `To use Jade via USB, please download the Bitcoin Keeper desktop app from our website: ${KEEPER_WEBSITE_BASE_URL}/desktop and connect your Jade to the computer.`;
- let instructions =
+ const instructions =
keyGenerationMode === KeyGenerationMode.USB
? [usbInstructions]
: [jadeUnlockInstructions, jadeInstructions];
@@ -420,7 +420,7 @@ const getSignerContent = (
case SignerType.SEEDSIGNER:
const seedSignerInstructions = (
- {`Make sure the seed is loaded (`}
+ Make sure the seed is loaded (
+
{
diff --git a/src/screens/Vault/ManageTapsignerSettings.tsx b/src/screens/Vault/ManageTapsignerSettings.tsx
index 02ddbc484..6bf2ca18f 100644
--- a/src/screens/Vault/ManageTapsignerSettings.tsx
+++ b/src/screens/Vault/ManageTapsignerSettings.tsx
@@ -24,6 +24,7 @@ import NFC from 'src/services/nfc';
import { getCardInfo, handleTapsignerError } from 'src/hardware/tapsigner';
import useToastMessage, { IToastCategory } from 'src/hooks/useToastMessage';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import { getAccountFromSigner } from 'src/utils/utilities';
function ManageTapsignerSettings({ route }: any) {
const { colorMode } = useColorMode();
@@ -72,6 +73,7 @@ function ManageTapsignerSettings({ route }: any) {
params: {
mode: InteracationMode.BACKUP_SIGNER,
signer: signer,
+ accountNumber: getAccountFromSigner(signer),
},
})
);
diff --git a/src/screens/Vault/MockWrapper.tsx b/src/screens/Vault/MockWrapper.tsx
index b140a7aac..86b5fa93b 100644
--- a/src/screens/Vault/MockWrapper.tsx
+++ b/src/screens/Vault/MockWrapper.tsx
@@ -98,7 +98,6 @@ function MockWrapper({
}
} else {
if (signerXfp === data.signer.masterFingerprint) {
- console.log('here');
handleSuccess();
} else {
handleFailure();
diff --git a/src/screens/Vault/ResetInheritanceKey.tsx b/src/screens/Vault/ResetInheritanceKey.tsx
new file mode 100644
index 000000000..d1e9da130
--- /dev/null
+++ b/src/screens/Vault/ResetInheritanceKey.tsx
@@ -0,0 +1,227 @@
+import { Box, useColorMode } from 'native-base';
+import React, { useContext, useState, useEffect, useCallback } from 'react';
+import KeeperHeader from 'src/components/KeeperHeader';
+import ScreenWrapper from 'src/components/ScreenWrapper';
+import { StyleSheet } from 'react-native';
+import { hp, wp } from 'src/constants/responsive';
+import Text from 'src/components/KeeperText';
+import { CommonActions, useFocusEffect, useNavigation } from '@react-navigation/native';
+import Buttons from 'src/components/Buttons';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+import useSignerMap from 'src/hooks/useSignerMap';
+import { Signer, Vault } from 'src/services/wallets/interfaces/vault';
+import moment from 'moment';
+import useToastMessage, { IToastCategory } from 'src/hooks/useToastMessage';
+import ToastErrorIcon from 'src/assets/images/toast_error.svg';
+import { useDispatch } from 'react-redux';
+import WalletUtilities from 'src/services/wallets/operations/utils';
+import useVault from 'src/hooks/useVault';
+import { useAppSelector } from 'src/store/hooks';
+import { resetRealyVaultState } from 'src/store/reducers/bhr';
+import IKSInfocard from './components/IKSInfoCard';
+import { SDIcons } from './SigningDeviceIcons';
+import VaultMigrationController from './VaultMigrationController';
+import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
+import { getKeyUID } from 'src/utils/utilities';
+import OptionDropdown from 'src/components/OptionDropdown';
+import { MONTHS_12, MONTHS_18, MONTHS_24 } from './constants';
+import { getSignerDescription } from 'src/hardware';
+
+const DEFAULT_INHERITANCE_TIMELOCK = { label: MONTHS_12, value: 12 * 30 * 24 * 60 * 60 * 1000 };
+const INHERITANCE_TIMELOCK_DURATIONS = [
+ DEFAULT_INHERITANCE_TIMELOCK,
+ { label: MONTHS_18, value: 18 * 30 * 24 * 60 * 60 * 1000 },
+ { label: MONTHS_24, value: 24 * 30 * 24 * 60 * 60 * 1000 },
+];
+
+function ResetInheritanceKey({ route }) {
+ const { signerId, vault }: { signerId: string; vault: Vault } = route.params;
+ const { colorMode } = useColorMode();
+ const navigation = useNavigation();
+ const { signerMap } = useSignerMap();
+ const { translations } = useContext(LocalizationContext);
+ const [selectedOption, setSelectedOption] = useState(null);
+ const signer: Signer = signerMap[signerId];
+ const inheritanceSigner = vault.signers.find((signer) => getKeyUID(signer) === signerId);
+ const otherSigners = vault.signers.filter((signer) => getKeyUID(signer) !== signerId);
+ const { vault: vaultText, common } = translations;
+ const { showToast } = useToastMessage();
+ const [generatedVaultId, setGeneratedVaultId] = useState('');
+ const { allVaults } = useVault({ includeArchived: false });
+ const newVault = allVaults.filter((v) => v.id === generatedVaultId)[0];
+ const [vaultCreating, setCreating] = useState(false);
+ const [currentBlockHeight, setCurrentBlockHeight] = useState(null);
+ const [currentTimeUntilActivation, setCurrentTimeUntilActivation] = useState('');
+
+ const { relayVaultUpdate, relayVaultError, realyVaultErrorMessage } = useAppSelector(
+ (state) => state.bhr
+ );
+
+ const dispatch = useDispatch();
+
+ const handleResetInheritanceKey = () => {
+ if (!selectedOption) {
+ showToast('Please select activation time', );
+ return;
+ }
+ if (!currentBlockHeight) {
+ showToast('Failed to sync current block height', );
+ return;
+ }
+ setCreating(true);
+ };
+
+ useEffect(() => {
+ // should bind with a refresher in case the auto fetch for block-height fails
+ WalletUtilities.fetchCurrentBlockHeight()
+ .then(({ currentBlockHeight }) => {
+ setCurrentBlockHeight(currentBlockHeight);
+ })
+ .catch((err) => showToast(err));
+ }, []);
+
+ useEffect(() => {
+ if (route.params?.selectedOption) {
+ setSelectedOption(route.params.selectedOption);
+ }
+ }, [route.params]);
+
+ useEffect(() => {
+ try {
+ const blocksUntilActivation =
+ vault.scheme.miniscriptScheme.miniscriptElements.timelocks[0] - currentBlockHeight;
+ if (blocksUntilActivation > 0) {
+ const seconds = blocksUntilActivation * 10 * 60;
+ const days = Math.floor(seconds / (24 * 60 * 60));
+ const months = Math.floor(days / 30);
+
+ let timeString = '';
+ if (months > 0) {
+ timeString = `${months} month${months > 1 ? 's' : ''}`;
+ } else if (days > 0) {
+ timeString = `${days} day${days > 1 ? 's' : ''}`;
+ } else {
+ const hours = Math.floor(seconds / 3600);
+ const minutes = Math.floor((seconds % 3600) / 60);
+ timeString = `${hours} hour${hours > 1 ? 's' : ''} ${minutes} minute${
+ minutes > 1 ? 's' : ''
+ }`;
+ }
+
+ setCurrentTimeUntilActivation('Activates in ' + timeString);
+ } else {
+ setCurrentTimeUntilActivation(vaultText.IKAlreadyActive);
+ }
+ } catch {
+ showToast(
+ 'Failed to check current activation time for Inheritance Key',
+ null,
+ IToastCategory.DEFAULT,
+ 3000,
+ true
+ );
+ }
+ }, [currentBlockHeight, vault]);
+
+ useFocusEffect(
+ useCallback(() => {
+ if (relayVaultUpdate && newVault) {
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ const navigationState = {
+ index: 1,
+ routes: [
+ { name: 'Home' },
+ {
+ name: 'VaultDetails',
+ params: { vaultId: generatedVaultId, vaultTransferSuccessful: true },
+ },
+ ],
+ };
+ navigation.dispatch(CommonActions.reset(navigationState));
+ } else if (relayVaultUpdate) {
+ navigation.dispatch(CommonActions.reset({ index: 1, routes: [{ name: 'Home' }] }));
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ }
+
+ if (relayVaultError) {
+ showToast(realyVaultErrorMessage, );
+ dispatch(resetRealyVaultState());
+ setCreating(false);
+ }
+ }, [relayVaultUpdate, relayVaultError, newVault, navigation, dispatch])
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+ {vaultText.chooseNewActivationTimeTitle}
+
+
+ {vaultText.chooseNewActivationTimeDesc}
+
+
+ setSelectedOption(option)}
+ />
+
+
+
+
+
+
+
+
+ );
+}
+
+export default ResetInheritanceKey;
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: hp(40),
+ paddingHorizontal: wp(10),
+ },
+ contentContainer: {
+ flex: 1,
+ gap: hp(30),
+ },
+ dropdownContainer: {
+ gap: hp(15),
+ },
+});
diff --git a/src/screens/Vault/SignerAdvanceSettings.tsx b/src/screens/Vault/SignerAdvanceSettings.tsx
index 330441756..f3945eac1 100644
--- a/src/screens/Vault/SignerAdvanceSettings.tsx
+++ b/src/screens/Vault/SignerAdvanceSettings.tsx
@@ -43,13 +43,19 @@ import {
} from 'src/models/interfaces/AssistedKeys';
import InheritanceKeyServer from 'src/services/backend/InheritanceKey';
import { captureError } from 'src/services/sentry';
-import { emailCheck, generateDataFromPSBT, getTnxDetailsPSBT } from 'src/utils/utilities';
+import {
+ emailCheck,
+ generateDataFromPSBT,
+ getAccountFromSigner,
+ getKeyUID,
+ getTnxDetailsPSBT,
+ isOdd
+} from 'src/utils/utilities';
import CircleIconWrapper from 'src/components/CircleIconWrapper';
import WalletCopiableData from 'src/components/WalletCopiableData';
import useSignerMap from 'src/hooks/useSignerMap';
-import { getSignerNameFromType } from 'src/hardware';
+import { getPsbtForHwi, getSignerNameFromType } from 'src/hardware';
import config from 'src/utils/service-utilities/config';
-import { signCosignerPSBT } from 'src/services/wallets/factories/WalletFactory';
import PasscodeVerifyModal from 'src/components/Modal/PasscodeVerify';
import { NewVaultInfo } from 'src/store/sagas/wallets';
import { addNewVault, refillMobileKey } from 'src/store/sagaActions/vaults';
@@ -71,23 +77,43 @@ import CustomGreenButton from 'src/components/CustomButton/CustomGreenButton';
import SigningServer from 'src/services/backend/SigningServer';
import { generateKey } from 'src/utils/service-utilities/encryption';
import { setInheritanceOTBRequestId } from 'src/store/reducers/storage';
-import { SDIcons } from './SigningDeviceIcons';
import InhertanceKeyIcon from 'src/assets/images/icon_ik.svg';
import { resetKeyHealthState } from 'src/store/reducers/vaults';
import moment from 'moment';
import useIsSmallDevices from 'src/hooks/useSmallDevices';
-import HardwareModalMap, { formatDuration, InteracationMode } from './HardwareModalMap';
import Note from 'src/components/Note/Note';
import useSigners from 'src/hooks/useSigners';
-import SignerCard from '../AddSigner/SignerCard';
import { getJSONFromRealmObject } from 'src/storage/realm/utils';
import { generateMobileKeySeeds } from 'src/hardware/signerSeeds';
import { getPersistedDocument } from 'src/services/documents';
-import { TransferType } from 'src/models/enums/TransferType';
+import WalletOperations from 'src/services/wallets/operations';
+import SignerCard from '../AddSigner/SignerCard';
+import HardwareModalMap, { formatDuration, InteracationMode } from './HardwareModalMap';
+import { SDIcons } from './SigningDeviceIcons';
const { width } = Dimensions.get('screen');
-const SignersWithRKSupport = [SignerType.MY_KEEPER, SignerType.JADE, SignerType.SEED_WORDS];
+const SignersWithRKSupport = [
+ SignerType.MY_KEEPER,
+ SignerType.JADE,
+ SignerType.SEED_WORDS,
+ SignerType.TAPSIGNER,
+ SignerType.SEEDSIGNER,
+ SignerType.SPECTER,
+ SignerType.LEDGER,
+ SignerType.TREZOR,
+ SignerType.BITBOX02,
+ SignerType.COLDCARD,
+ SignerType.PASSPORT,
+ SignerType.PORTAL,
+];
+
+const SignersReqVault = [
+ SignerType.LEDGER,
+ SignerType.TREZOR,
+ SignerType.BITBOX02,
+ SignerType.PORTAL,
+];
function Content({ colorMode, vaultUsed }: { colorMode: string; vaultUsed: Vault }) {
return (
@@ -115,19 +141,17 @@ function SignerAdvanceSettings({ route }: any) {
vaultKey,
vaultId,
signer: signerFromParam,
- signerId,
}: {
signer: Signer;
vaultKey: VaultSigner;
vaultId: string;
- signerId: string;
} = route.params;
const { signerMap } = useSignerMap();
const { signers } = useSigners();
const signer: Signer = signerFromParam
- ? signers.find((signer) => signer.masterFingerprint === signerFromParam.masterFingerprint) // to reflect associated contact image in real time
- : signerMap[vaultKey.masterFingerprint];
+ ? signers.find((signer) => getKeyUID(signer) === getKeyUID(signerFromParam)) // to reflect associated contact image in real time
+ : signerMap[getKeyUID(vaultKey)];
const { showToast } = useToastMessage();
const { translations } = useContext(LocalizationContext);
@@ -208,7 +232,7 @@ function SignerAdvanceSettings({ route }: any) {
allUnhiddenVaults.forEach((vault) => {
const keys = vault.signers;
for (const key of keys) {
- if (signer.masterFingerprint === key.masterFingerprint) {
+ if (getKeyUID(signer) === getKeyUID(key)) {
signerVaults.push(vault);
break;
}
@@ -375,6 +399,7 @@ function SignerAdvanceSettings({ route }: any) {
vaultKey,
vaultId,
mode: InteracationMode.VAULT_REGISTER,
+ accountNumber: getAccountFromSigner(signer),
})
);
break;
@@ -397,7 +422,6 @@ function SignerAdvanceSettings({ route }: any) {
params: {
isUpdate: true,
signer,
- signerId,
vaultId,
vaultKey,
},
@@ -527,12 +551,28 @@ function SignerAdvanceSettings({ route }: any) {
CommonActions.navigate({
name: 'ManageTapsignerSettings',
params: {
- signer: signer,
+ signer,
},
})
);
};
+ // const signPSBTForExternalKeeperKey = async (serializedPSBT, resetQR) => {
+ // try {
+ // let signedSerialisedPSBT;
+ // try {
+ // const key = signer.signerXpubs[XpubTypes.P2WSH][0];
+ // signedSerialisedPSBT = signCosignerPSBT(
+ // signer.masterFingerprint,
+ // key.xpriv,
+ // serializedPSBT
+ // );
+ // } catch (e) {
+ // showToast(e.message);
+ // captureError(e);
+ // }
+ // }}};
+
const signPSBT = async (serializedPSBT) => {
try {
const { senderAddresses, receiverAddresses, fees, signerMatched, sendAmount, feeRate } =
@@ -540,10 +580,41 @@ function SignerAdvanceSettings({ route }: any) {
const tnxDetails = getTnxDetailsPSBT(averageTxFees, feeRate);
if (!signerMatched) {
- showToast(`Current signer is not available in the PSBT`, );
+ showToast('Current signer is not available in the PSBT', );
navigation.goBack();
return;
}
+ if (SignersReqVault.includes(signer.type)) {
+ let activeVault = null;
+ allVaults.forEach(async (vault) => {
+ let addressMatched = true;
+ for (let i = 0; i < senderAddresses.length; i++) {
+ const _ = senderAddresses[i].path.split('/');
+ const [isChange, index] = _.splice(_.length - 2);
+ // 0/even - Receive(External) | 1/odd - change(internal)
+ let generatedAddress: string;
+ generatedAddress = WalletOperations.getExternalInternalAddressAtIdx(
+ vault,
+ parseInt(index),
+ isOdd(parseInt(isChange))
+ );
+ if (senderAddresses[i].address != generatedAddress) {
+ addressMatched = false;
+ break;
+ }
+ }
+ if (addressMatched) {
+ activeVault = vault;
+ }
+ });
+
+ if (!activeVault) {
+ navigation.goBack();
+ throw new Error('Please import the vault before signing');
+ }
+ const psbtWithGlobalXpub = await getPsbtForHwi(serializedPSBT, activeVault);
+ serializedPSBT = psbtWithGlobalXpub.serializedPSBT;
+ }
navigation.dispatch(
CommonActions.navigate({
@@ -553,7 +624,7 @@ function SignerAdvanceSettings({ route }: any) {
recipient: receiverAddresses,
amount: sendAmount,
data: serializedPSBT,
- fees: fees,
+ fees,
estimatedBlocksBeforeConfirmation: tnxDetails.estimatedBlocksBeforeConfirmation,
tnxPriority: tnxDetails.tnxPriority,
signer,
@@ -975,9 +1046,7 @@ function SignerAdvanceSettings({ route }: any) {
description="Hide this key from the list"
callback={() => {
for (const vaultItem of allUnhiddenVaults) {
- if (
- vaultItem.signers.find((s) => s.masterFingerprint === signer.masterFingerprint)
- ) {
+ if (vaultItem.signers.find((s) => getKeyUID(s) === getKeyUID(signer))) {
setVaultUsed(vaultItem);
setHideWarning(true);
return;
diff --git a/src/screens/Vault/SigningDeviceDetails.tsx b/src/screens/Vault/SigningDeviceDetails.tsx
index 83a38af3e..34f0c6468 100644
--- a/src/screens/Vault/SigningDeviceDetails.tsx
+++ b/src/screens/Vault/SigningDeviceDetails.tsx
@@ -65,6 +65,7 @@ import DotView from 'src/components/DotView';
import Note from 'src/components/Note/Note';
import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
import { getPersistedDocument } from 'src/services/documents';
+import { getAccountFromSigner, getKeyUID } from 'src/utils/utilities';
const getSignerContent = (type: SignerType) => {
switch (type) {
@@ -233,9 +234,11 @@ function SigningDeviceDetails({ route }) {
const dispatch = useDispatch();
const { vaultKey, vaultId, signerId, vaultSigners, isUaiFlow } = route.params;
const { signers } = useSigners();
- const currentSigner = signers.find((signer) => signer.masterFingerprint === signerId);
+ const currentSigner =
+ signers.find((signer) => getKeyUID(signer) === signerId) ||
+ signers.find((signer) => signer.masterFingerprint === signerId);
const { signerMap } = useSignerMap();
- const signer: Signer = currentSigner || signerMap[vaultKey.masterFingerprint];
+ const signer: Signer = currentSigner || signerMap[getKeyUID(vaultKey)];
const [detailModal, setDetailModal] = useState(false);
const [skipHealthCheckModalVisible, setSkipHealthCheckModalVisible] = useState(false);
const [visible, setVisible] = useState(isUaiFlow);
@@ -246,7 +249,7 @@ function SigningDeviceDetails({ route }) {
getJSONFromRealmObject
)[0];
const { keyHeathCheckSuccess, keyHeathCheckError } = useAppSelector((state) => state.vault);
- const { entityBasedIndicator } = useIndicatorHook({ entityId: signerId });
+ const { entityBasedIndicator } = useIndicatorHook({ entityId: signer.masterFingerprint });
const { typeBasedIndicator } = useIndicatorHook({
types: [uaiType.RECOVERY_PHRASE_HEALTH_CHECK],
});
@@ -340,7 +343,6 @@ function SigningDeviceDetails({ route }) {
}
const identifySigner = signer.type === SignerType.OTHER_SD;
-
const footerItems = [
{
text: 'Health Check',
@@ -349,7 +351,9 @@ function SigningDeviceDetails({ route }) {
Icon={HealthCheck}
showDot={
(signer.type !== SignerType.MY_KEEPER &&
- entityBasedIndicator?.[signerId]?.[uaiType.SIGNING_DEVICES_HEALTH_CHECK]) ||
+ entityBasedIndicator?.[signer.masterFingerprint]?.[
+ uaiType.SIGNING_DEVICES_HEALTH_CHECK
+ ]) ||
(signer.type === SignerType.MY_KEEPER &&
typeBasedIndicator?.[uaiType.RECOVERY_PHRASE_HEALTH_CHECK]?.[appRecoveryKeyId])
}
@@ -379,7 +383,7 @@ function SigningDeviceDetails({ route }) {
Icon: () => ,
onPress: () => {
navigation.dispatch(
- CommonActions.navigate('SignerAdvanceSettings', { signer, vaultKey, vaultId, signerId })
+ CommonActions.navigate('SignerAdvanceSettings', { signer, vaultKey, vaultId })
);
},
},
@@ -513,6 +517,7 @@ function SigningDeviceDetails({ route }) {
vaultId={vaultId}
addSignerFlow={false}
vaultSigners={vaultSigners}
+ accountNumber={getAccountFromSigner(signer)}
/>
{
const route = useRoute();
@@ -57,6 +63,10 @@ const SigningDeviceList = () => {
const { primaryMnemonic }: KeeperApp = useQuery(RealmSchema.KeeperApp).map(
getJSONFromRealmObject
)[0];
+ const [showAdvancedSettingsModal, setShowAdvancedSettingsModal] = useState(false);
+ const [accountNumber, setAccountNumber] = useState(0);
+ const [accountNumberText, setAccountNumberText] = useState('');
+ const { showToast } = useToastMessage();
const sortedSigners = {
[SignerCategory.HARDWARE]: [
@@ -78,7 +88,7 @@ const SigningDeviceList = () => {
SignerType.SEED_WORDS,
SignerType.OTHER_SD,
],
- [SignerCategory.ASSISTED]: [SignerType.POLICY_SERVER, SignerType.INHERITANCEKEY],
+ [SignerCategory.ASSISTED]: [SignerType.POLICY_SERVER],
};
const getNfcSupport = async () => {
@@ -103,6 +113,47 @@ const SigningDeviceList = () => {
);
}
+ const onPressNumber = (digit) => {
+ let temp = accountNumberText;
+ if (digit !== 'x') {
+ temp += digit;
+ setAccountNumberText(temp);
+ }
+ if (accountNumberText && digit === 'x') {
+ setAccountNumberText(accountNumberText.slice(0, -1));
+ }
+ };
+ const onDeletePressed = () => {
+ setAccountNumberText(accountNumberText.slice(0, accountNumberText.length - 1));
+ };
+
+ function AdvancedSettingsContent() {
+ return (
+
+ Account Number (Optional):
+
+
+
+
+
+ );
+ }
+
return (
{
learnMorePressed={() => {
dispatch(setSdIntroModal(true));
}}
+ rightComponent={
+ signerCategory === SignerCategory.HARDWARE && (
+ setShowAdvancedSettingsModal(true)}>
+ {colorMode === 'light' ? : }
+
+ )
+ }
+ rightComponentPadding={wp(10)}
+ rightComponentBottomPadding={hp(40)}
/>
{
primaryMnemonic={primaryMnemonic}
disabled={disabled}
message={message}
+ accountNumber={accountNumber}
/>
);
})}
@@ -189,6 +250,30 @@ const SigningDeviceList = () => {
dispatch(setSdIntroModal(false));
}}
/>
+ setShowAdvancedSettingsModal(false)}
+ buttonText={common.save}
+ buttonCallback={() => {
+ if (parseInt(accountNumberText).toString() === accountNumberText) {
+ setAccountNumber(parseInt(accountNumberText));
+ setShowAdvancedSettingsModal(false);
+ } else if (!accountNumberText) {
+ setAccountNumber(0);
+ setShowAdvancedSettingsModal(false);
+ } else {
+ showToast('Account number invalid', null, IToastCategory.DEFAULT, 3000, true);
+ }
+ }}
+ secondaryButtonText={common.cancel}
+ secondaryCallback={() => {
+ setAccountNumberText(accountNumber.toString());
+ setShowAdvancedSettingsModal(false);
+ }}
+ Content={AdvancedSettingsContent}
+ />
);
};
@@ -214,6 +299,15 @@ const styles = StyleSheet.create({
alignCenter: {
alignSelf: 'center',
},
+ input: {
+ marginVertical: hp(15),
+ paddingHorizontal: wp(10),
+ width: '100%',
+ height: hp(50),
+ borderRadius: 10,
+ justifyContent: 'center',
+ borderWidth: 1,
+ },
});
export default SigningDeviceList;
diff --git a/src/screens/Vault/VaultDetails.tsx b/src/screens/Vault/VaultDetails.tsx
index 1a15e53ea..dbed0f381 100644
--- a/src/screens/Vault/VaultDetails.tsx
+++ b/src/screens/Vault/VaultDetails.tsx
@@ -1,9 +1,9 @@
import Text from 'src/components/KeeperText';
import { Box, HStack, VStack, View, useColorMode, StatusBar } from 'native-base';
import { CommonActions, useNavigation } from '@react-navigation/native';
-import { FlatList, RefreshControl, StyleSheet } from 'react-native';
-import React, { useCallback, useContext, useEffect, useState } from 'react';
-import { hp, windowHeight, windowWidth, wp } from 'src/constants/responsive';
+import { FlatList, Pressable, RefreshControl, StyleSheet } from 'react-native';
+import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';
+import { hp, windowWidth, wp } from 'src/constants/responsive';
import CoinIcon from 'src/assets/images/coins.svg';
import SignerIcon from 'src/assets/images/signer_white.svg';
import KeeperModal from 'src/components/KeeperModal';
@@ -35,10 +35,7 @@ import ActionCard from 'src/components/ActionCard';
import HexagonIcon from 'src/components/HexagonIcon';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { AppStackParams } from 'src/navigation/types';
-import CurrencyInfo from '../Home/components/CurrencyInfo';
import BTC from 'src/assets/images/icon_bitcoin_white.svg';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import ImportIcon from 'src/assets/images/import.svg';
import { reinstateVault } from 'src/store/sagaActions/vaults';
import useToastMessage, { IToastCategory } from 'src/hooks/useToastMessage';
@@ -50,6 +47,10 @@ import { setStateFromSnapshot } from 'src/store/reducers/send_and_receive';
import PendingHealthCheckModal from 'src/components/PendingHealthCheckModal';
import { TouchableOpacity } from 'react-native-gesture-handler';
import BTCAmountPill from 'src/components/BTCAmountPill';
+import CurrencyInfo from '../Home/components/CurrencyInfo';
+import { SentryErrorBoundary } from 'src/services/sentry';
+import ActivityIndicatorView from 'src/components/AppActivityIndicator/ActivityIndicatorView';
+import CircleIconWrapper from 'src/components/CircleIconWrapper';
function Footer({
vault,
@@ -69,10 +70,18 @@ function Footer({
const { common } = translations;
const { colorMode } = useColorMode();
+ const ReInstateIcon = () => (
+ }
+ backgroundColor={`${colorMode}.brownBackground`}
+ width={wp(38)}
+ />
+ );
+
const footerItems = vault.archived
? [
{
- Icon: ImportIcon,
+ Icon: ReInstateIcon,
text: common.reinstate,
onPress: () => {
dispatch(reinstateVault(vault.id));
@@ -114,35 +123,45 @@ function VaultInfo({ vault }: { vault: Vault }) {
} = vault;
return (
-
+
- {vault.scheme.n > 1 && (
-
- )}
- {vault.type === VaultType.SINGE_SIG && }
+ {vault.scheme.n > 1 && (
+
+ )}
+ {vault.type === VaultType.SINGE_SIG && }
{vault.type === VaultType.CANARY && }
- {vault.archived ? : null}
+ {vault.archived ? (
+
+ ) : null}
-
-
+
+
+
+
);
}
@@ -185,17 +204,25 @@ function TransactionList({
);
return (
<>
-
- {transactions?.length ? (
-
- {common.transactions}
+ {transactions?.length ? (
+
+
+ {common.recentTransactions}
- ) : null}
-
+
+ navigation.dispatch(
+ CommonActions.navigate({ name: 'TransactionHistory', params: { wallet: vault } })
+ )
+ }
+ >
+
+ {common.viewAll}
+
+
+
+ ) : null}
}
@@ -230,20 +257,34 @@ function VaultDetails({ navigation, route }: ScreenProps) {
const { activeVault: vault } = useVault({ vaultId });
const [pullRefresh, setPullRefresh] = useState(false);
const { vaultSigners: keys } = useSigners(vault.id);
- const transactions =
- vault?.specs?.transactions.sort((a, b) => {
- if (!a.blockTime && !b.blockTime) return 0;
- if (!a.blockTime) return -1;
- if (!b.blockTime) return 1;
- return b.blockTime - a.blockTime;
- }) || [];
+ const transactions = useMemo(
+ () =>
+ [...(vault?.specs?.transactions || [])]
+ .sort((a, b) => {
+ // Sort unconfirmed transactions first
+ if (a.confirmations === 0 && b.confirmations !== 0) return -1;
+ if (a.confirmations !== 0 && b.confirmations === 0) return 1;
+
+ // Then sort by date
+ if (!a.date && !b.date) return 0;
+ if (!a.date) return -1;
+ if (!b.date) return 1;
+ return new Date(b.date).getTime() - new Date(a.date).getTime();
+ })
+ .slice(0, 5),
+ [vault?.specs?.transactions]
+ );
const isCollaborativeWallet = vault.type === VaultType.COLLABORATIVE;
+ const isAssistedWallet = vault.type === VaultType.ASSISTED;
const isCanaryWallet = vault.type === VaultType.CANARY;
const { signerMap } = useSignerMap();
const { signers: vaultKeys } = vault || { signers: [] };
const [pendingHealthCheckCount, setPendingHealthCheckCount] = useState(0);
const [cachedTransactions, setCachedTransactions] = useState([]);
const snapshots = useAppSelector((state) => state.cachedTxn.snapshots);
+ const { walletSyncing } = useAppSelector((state) => state.wallet);
+ const [syncingCompleted, setSyncingCompleted] = useState(false);
+ const syncing = walletSyncing && vault ? !!walletSyncing[vault.id] : false;
const disableBuy = false;
const cardProps = {
@@ -292,7 +333,7 @@ function VaultDetails({ navigation, route }: ScreenProps) {
}, [autoRefresh]);
useEffect(() => {
- if (transactionToast) {
+ if (!syncing && syncingCompleted && transactionToast) {
showToast(
vaultTranslation.transactionToastMessage,
,
@@ -301,7 +342,15 @@ function VaultDetails({ navigation, route }: ScreenProps) {
);
navigation.dispatch(CommonActions.setParams({ transactionToast: false }));
}
- }, [transactionToast]);
+ }, [syncingCompleted, transactionToast]);
+
+ useEffect(() => {
+ if (!syncing) {
+ setSyncingCompleted(true);
+ } else {
+ setSyncingCompleted(false);
+ }
+ }, [syncing]);
const syncVault = () => {
setPullRefresh(true);
@@ -346,6 +395,7 @@ function VaultDetails({ navigation, route }: ScreenProps) {
isCollaborativeWallet ? `${colorMode}.greenText2` : `${colorMode}.pantoneGreen`
}
>
+
@@ -373,14 +423,21 @@ function VaultDetails({ navigation, route }: ScreenProps) {
subtitle={vault.presentationData?.description}
learnMore
learnTextColor={`${colorMode}.buttonText`}
- learnBackgroundColor="rgba(0,0,0,.2)"
+ learnBackgroundColor={`${colorMode}.pantoneGreen`}
learnMorePressed={() => dispatch(setIntroModal(true))}
contrastScreen={true}
rightComponent={
- navigation.dispatch(CommonActions.navigate('VaultSettings', { vaultId: vault.id }))
+ onPress={
+ !vault.archived
+ ? () =>
+ navigation.dispatch(
+ CommonActions.navigate('VaultSettings', { vaultId: vault.id })
+ )
+ : () => {
+ navigation.push('VaultSettings', { vaultId: vault.id });
+ }
}
>
@@ -525,8 +582,10 @@ const styles = StyleSheet.create({
flex: 1,
},
vaultInfoContainer: {
+ flexDirection: 'row',
paddingLeft: '3%',
- marginVertical: 20,
+ marginTop: 20,
+ marginBottom: 10,
justifyContent: 'space-between',
},
pillsContainer: {
@@ -545,9 +604,10 @@ const styles = StyleSheet.create({
paddingTop: hp(15),
},
bottomSection: {
+ paddingTop: wp(65),
+ paddingBottom: 20,
flex: 1,
justifyContent: 'space-between',
- paddingBottom: 20,
},
transactionsContainer: {
paddingHorizontal: wp(22),
@@ -556,13 +616,16 @@ const styles = StyleSheet.create({
paddingHorizontal: wp(28),
},
transTitleWrapper: {
- paddingTop: windowHeight * 0.1,
- marginLeft: wp(15),
+ marginLeft: wp(2),
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingBottom: 10,
+ paddingLeft: 10,
},
- transactionHeading: {
- fontSize: 16,
- letterSpacing: 0.16,
- paddingBottom: 16,
+ viewAllBtn: {
+ width: wp(80),
+ alignItems: 'center',
+ justifyContent: 'center',
},
IconText: {
justifyContent: 'center',
@@ -717,6 +780,10 @@ const styles = StyleSheet.create({
paddingHorizontal: 22,
paddingVertical: 22,
},
+ archivedBalance: {
+ alignItems: 'flex-end',
+ marginTop: hp(25),
+ },
});
-export default Sentry.withErrorBoundary(VaultDetails, errorBourndaryOptions);
+export default SentryErrorBoundary(VaultDetails);
diff --git a/src/screens/Vault/VaultMigrationController.tsx b/src/screens/Vault/VaultMigrationController.tsx
index e8b53d250..04171b3fd 100644
--- a/src/screens/Vault/VaultMigrationController.tsx
+++ b/src/screens/Vault/VaultMigrationController.tsx
@@ -1,7 +1,12 @@
import { CommonActions, useNavigation } from '@react-navigation/native';
import React, { useCallback, useEffect, useState } from 'react';
-import { TxPriority, VaultType } from 'src/services/wallets/enums';
-import { VaultScheme, VaultSigner } from 'src/services/wallets/interfaces/vault';
+import { MultisigScriptType, NetworkType, TxPriority, VaultType } from 'src/services/wallets/enums';
+import {
+ MiniscriptElements,
+ MiniscriptScheme,
+ VaultScheme,
+ VaultSigner,
+} from 'src/services/wallets/interfaces/vault';
import { addNewVault, finaliseVaultMigration, migrateVault } from 'src/store/sagaActions/vaults';
import { useAppSelector } from 'src/store/hooks';
import { TransferType } from 'src/models/enums/TransferType';
@@ -16,9 +21,24 @@ import { AverageTxFeesByNetwork } from 'src/services/wallets/interfaces';
import WalletUtilities from 'src/services/wallets/operations/utils';
import { sendPhasesReset } from 'src/store/reducers/send_and_receive';
import { sendPhaseOne } from 'src/store/sagaActions/send_and_receive';
-import { generateVaultId } from 'src/services/wallets/factories/VaultFactory';
+import {
+ generateMiniscriptScheme,
+ generateVaultId,
+} from 'src/services/wallets/factories/VaultFactory';
import { Alert } from 'react-native';
import useArchivedVaults from 'src/hooks/useArchivedVaults';
+import {
+ TIMELOCKED_VAULT_TIMELOCKS_MAINNET,
+ TIMELOCKED_VAULT_TIMELOCKS_TESTNET,
+ generateTimelockedVaultElements,
+} from 'src/services/wallets/operations/miniscript/default/TimelockedVault';
+import config from 'src/utils/service-utilities/config';
+import {
+ generateInheritanceVaultElements,
+ INHERITANCE_VAULT_TIMELOCKS_MAINNET,
+ INHERITANCE_VAULT_TIMELOCKS_TESTNET,
+} from 'src/services/wallets/operations/miniscript/default/InheritanceVault';
+import { MONTHS_12, MONTHS_3, MONTHS_6, MONTHS_18, MONTHS_24 } from './constants';
function VaultMigrationController({
vaultCreating,
@@ -27,8 +47,14 @@ function VaultMigrationController({
name,
description,
vaultId,
+ setCreating,
setGeneratedVaultId,
vaultType = VaultType.DEFAULT,
+ isTimeLock = false,
+ inheritanceKey = null,
+ isAddInheritanceKey = false,
+ currentBlockHeight = null,
+ selectedDuration = null,
}) {
const navigation = useNavigation();
const dispatch = useDispatch();
@@ -73,15 +99,39 @@ function VaultMigrationController({
useEffect(() => {
if (sendPhaseOneState.isSuccessful && temporaryVault) {
- navigation.dispatch(
- CommonActions.navigate('SendConfirmation', {
- sender: activeVault,
- recipient: temporaryVault,
- address: recipients[0].address,
- amount: parseInt(recipients[0].amount, 10),
- transferType: TransferType.VAULT_TO_VAULT,
- })
- );
+ if (
+ activeVault.scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG &&
+ activeVault.type === VaultType.INHERITANCE
+ ) {
+ WalletUtilities.fetchCurrentBlockHeight()
+ .then(({ currentBlockHeight }) => {
+ setCreating(false);
+ navigation.dispatch(
+ CommonActions.navigate('SendConfirmation', {
+ sender: activeVault,
+ recipient: temporaryVault,
+ address: recipients[0].address,
+ amount: parseInt(recipients[0].amount, 10),
+ transferType: TransferType.VAULT_TO_VAULT,
+ currentBlockHeight,
+ })
+ );
+ })
+ .catch((err) => {
+ captureError(err);
+ showToast('Failed to fetch current block height', );
+ });
+ } else {
+ navigation.dispatch(
+ CommonActions.navigate('SendConfirmation', {
+ sender: activeVault,
+ recipient: temporaryVault,
+ address: recipients[0].address,
+ amount: parseInt(recipients[0].amount, 10),
+ transferType: TransferType.VAULT_TO_VAULT,
+ })
+ );
+ }
} else if (sendPhaseOneState.hasFailed) {
if (sendPhaseOneState.failedErrorMessage === 'Insufficient balance') {
showToast('You have insufficient balance at this time.', );
@@ -90,29 +140,25 @@ function VaultMigrationController({
}, [sendPhaseOneState]);
const initiateSweep = () => {
- if (!unconfirmed) {
- const averageTxFeeByNetwork = averageTxFees[activeVault.networkType];
- const { feePerByte } = averageTxFeeByNetwork[TxPriority.LOW];
- const receivingAddress = WalletOperations.getNextFreeAddress(temporaryVault);
-
- const { fee: sendMaxFee } = WalletOperations.calculateSendMaxFee(
- activeVault,
- [{ address: receivingAddress, amount: 0 }],
- feePerByte
+ const averageTxFeeByNetwork = averageTxFees[activeVault.networkType];
+ const { feePerByte } = averageTxFeeByNetwork[TxPriority.LOW];
+ const receivingAddress = WalletOperations.getNextFreeAddress(temporaryVault);
+
+ const { fee: sendMaxFee } = WalletOperations.calculateSendMaxFee(
+ activeVault,
+ [{ address: receivingAddress, amount: 0 }],
+ feePerByte
+ );
+ if (sendMaxFee && temporaryVault) {
+ const maxBalance = confirmed + unconfirmed - sendMaxFee;
+
+ setRecepients([{ address: receivingAddress, amount: maxBalance }]);
+ dispatch(
+ sendPhaseOne({
+ wallet: activeVault,
+ recipients: [{ address: receivingAddress, amount: maxBalance }],
+ })
);
- if (sendMaxFee && temporaryVault) {
- const maxBalance = confirmed - sendMaxFee;
-
- setRecepients([{ address: receivingAddress, amount: maxBalance }]);
- dispatch(
- sendPhaseOne({
- wallet: activeVault,
- recipients: [{ address: receivingAddress, amount: maxBalance }],
- })
- );
- }
- } else {
- showToast('You have unconfirmed balance, please try again in some time', );
}
};
@@ -125,57 +171,148 @@ function VaultMigrationController({
}
};
- const createVault = useCallback((signers: VaultSigner[], scheme: VaultScheme, vaultType) => {
- try {
- const vaultInfo: NewVaultInfo = {
- vaultType,
- vaultScheme: scheme,
- vaultSigners: signers,
- vaultDetails: {
- name,
- description,
- },
- };
- const allVaultIds = allVaults.map((vault) => vault.id);
- const generatedVaultId = generateVaultId(signers, scheme);
- const deletedVaultIds = archivedVaults.map((vault) => vault.id);
- if (allVaultIds.includes(generatedVaultId) && !deletedVaultIds.includes(generatedVaultId)) {
- Alert.alert('Vault with this configuration already exists.');
- } else {
- setGeneratedVaultId(generatedVaultId);
- dispatch(addNewVault({ newVaultInfo: vaultInfo }));
- return vaultInfo;
- }
- } catch (err) {
- captureError(err);
- return false;
+ const vaultAlreadyExists = (vaultInfo: NewVaultInfo) => {
+ const allVaultIds = allVaults.map((vault) => vault.id);
+ const deletedVaultIds = archivedVaults.map((vault) => vault.id);
+
+ const generatedVaultId = generateVaultId(vaultInfo.vaultSigners, vaultInfo.vaultScheme);
+ return allVaultIds.includes(generatedVaultId) && !deletedVaultIds.includes(generatedVaultId);
+ };
+
+ const getTimelockDuration = (vaultType, selectedDuration, networkType) => {
+ const durationIdentifier =
+ selectedDuration === MONTHS_3
+ ? 'MONTHS_3'
+ : selectedDuration === MONTHS_6
+ ? 'MONTHS_6'
+ : selectedDuration === MONTHS_12
+ ? 'MONTHS_12'
+ : selectedDuration === MONTHS_18
+ ? 'MONTHS_18'
+ : selectedDuration === MONTHS_24
+ ? 'MONTHS_24'
+ : null;
+
+ if (!durationIdentifier) {
+ showToast('Invalid duration selected', );
+ return;
}
- }, []);
- const initiateNewVault = () => {
- if (activeVault) {
- if (unconfirmed) {
- showToast(
- 'You have unconfirmed balance, please try again in some time',
-
- );
- navigation.dispatch(
- CommonActions.reset({
- index: 1,
- routes: [
- { name: 'Home' },
- {
- name: 'VaultDetails',
- params: { autoRefresh: true, vaultId: activeVault.id },
- },
- ],
- })
- );
- return;
+ if (vaultType === VaultType.INHERITANCE) {
+ return networkType === NetworkType.MAINNET
+ ? INHERITANCE_VAULT_TIMELOCKS_MAINNET[durationIdentifier]
+ : INHERITANCE_VAULT_TIMELOCKS_TESTNET[durationIdentifier];
+ } else if (vaultType === VaultType.TIMELOCKED) {
+ return networkType === NetworkType.MAINNET
+ ? TIMELOCKED_VAULT_TIMELOCKS_MAINNET[durationIdentifier]
+ : TIMELOCKED_VAULT_TIMELOCKS_TESTNET[durationIdentifier];
+ }
+ };
+
+ const prepareMiniscriptScheme = (vaultInfo: NewVaultInfo, inheritanceSigner?: VaultSigner) => {
+ if (![VaultType.TIMELOCKED, VaultType.INHERITANCE].includes(vaultInfo.vaultType)) {
+ throw new Error('Invalid vault type - supported only for timelocked and inheritance');
+ }
+
+ const multisigScriptType = MultisigScriptType.MINISCRIPT_MULTISIG;
+ if (!currentBlockHeight) {
+ showToast('Failed to sync current block height');
+ return;
+ }
+
+ if (!selectedDuration) {
+ showToast('Please select the duration for timelock');
+ return;
+ }
+
+ const timelockDuration = getTimelockDuration(
+ vaultInfo.vaultType,
+ selectedDuration,
+ config.NETWORK_TYPE
+ );
+ if (!timelockDuration) {
+ showToast('Failed to determine timelock duration', );
+ return;
+ }
+
+ const timelocks = [currentBlockHeight + timelockDuration];
+
+ let miniscriptElements: MiniscriptElements;
+ if (vaultInfo.vaultType === VaultType.TIMELOCKED) {
+ miniscriptElements = generateTimelockedVaultElements(
+ vaultInfo.vaultSigners,
+ vaultInfo.vaultScheme,
+ timelocks
+ );
+ } else if (vaultType === VaultType.INHERITANCE) {
+ miniscriptElements = generateInheritanceVaultElements(
+ vaultInfo.vaultSigners,
+ inheritanceSigner,
+ vaultInfo.vaultScheme,
+ timelocks
+ );
+ }
+
+ if (!miniscriptElements) {
+ showToast('Failed to generate miniscript elements');
+ return;
+ }
+ vaultInfo.miniscriptElements = miniscriptElements;
+
+ const miniscriptScheme: MiniscriptScheme = generateMiniscriptScheme(miniscriptElements);
+ const vaultScheme: VaultScheme = {
+ ...vaultInfo.vaultScheme,
+ multisigScriptType,
+ miniscriptScheme,
+ };
+ vaultInfo.vaultScheme = vaultScheme;
+
+ if (vaultType == VaultType.INHERITANCE) {
+ vaultInfo.vaultSigners = [...vaultInfo.vaultSigners, inheritanceSigner];
+ }
+
+ return vaultInfo;
+ };
+
+ const createVault = useCallback(
+ (signers: VaultSigner[], scheme: VaultScheme, vaultType, inheritanceSigner?: VaultSigner) => {
+ try {
+ let vaultInfo: NewVaultInfo = {
+ vaultType,
+ vaultScheme: scheme,
+ vaultSigners: signers,
+ vaultDetails: {
+ name,
+ description,
+ },
+ };
+
+ const isTimelockedInheritanceKey = isAddInheritanceKey;
+ if (isTimeLock || isTimelockedInheritanceKey) {
+ vaultInfo = prepareMiniscriptScheme(vaultInfo, inheritanceSigner);
+ }
+
+ if (vaultAlreadyExists(vaultInfo)) {
+ Alert.alert('Vault with this configuration already exists.');
+ navigation.goBack();
+ } else {
+ const generatedVaultId = generateVaultId(vaultInfo.vaultSigners, vaultInfo.vaultScheme);
+ setGeneratedVaultId(generatedVaultId);
+ dispatch(addNewVault({ newVaultInfo: vaultInfo }));
+ return vaultInfo;
+ }
+ } catch (err) {
+ captureError(err);
+ return false;
}
+ },
+ [isTimeLock, isAddInheritanceKey, selectedDuration, currentBlockHeight]
+ );
- const vaultInfo: NewVaultInfo = {
- vaultType: vaultType,
+ const initiateNewVault = () => {
+ if (activeVault) {
+ let vaultInfo: NewVaultInfo = {
+ vaultType,
vaultScheme: scheme,
vaultSigners: vaultKeys,
vaultDetails: {
@@ -183,9 +320,19 @@ function VaultMigrationController({
description,
},
};
- dispatch(migrateVault(vaultInfo, activeVault.shellId));
+ const isTimelockedInheritanceKey = isAddInheritanceKey;
+ if (isTimeLock || isTimelockedInheritanceKey) {
+ vaultInfo = prepareMiniscriptScheme(vaultInfo, inheritanceKey);
+ }
+
+ if (vaultAlreadyExists(vaultInfo)) {
+ Alert.alert('Vault with this configuration already exists.');
+ navigation.goBack();
+ } else {
+ dispatch(migrateVault(vaultInfo, activeVault.shellId));
+ }
} else {
- createVault(vaultKeys, scheme, vaultType);
+ createVault(vaultKeys, scheme, vaultType, inheritanceKey);
}
};
diff --git a/src/screens/Vault/VaultSettings.tsx b/src/screens/Vault/VaultSettings.tsx
index f0b491f14..bc58e94f8 100644
--- a/src/screens/Vault/VaultSettings.tsx
+++ b/src/screens/Vault/VaultSettings.tsx
@@ -13,15 +13,18 @@ import VaultIcon from 'src/assets/images/vault_icon.svg';
import HexagonIcon from 'src/components/HexagonIcon';
import useTestSats from 'src/hooks/useTestSats';
import KeeperModal from 'src/components/KeeperModal';
-import EditWalletDetailsModal from '../WalletDetails/EditWalletDetailsModal';
import TickIcon from 'src/assets/images/icon_tick.svg';
+import AssistedIcon from 'src/assets/images/assisted-vault-white-icon.svg';
+import WalletIcon from 'src/assets/images/daily_wallet.svg';
import dbManager from 'src/storage/realm/dbManager';
import { RealmSchema } from 'src/storage/realm/enum';
-import { VaultType, VisibilityType } from 'src/services/wallets/enums';
+import { EntityKind, VaultType, VisibilityType } from 'src/services/wallets/enums';
import useToastMessage, { IToastCategory } from 'src/hooks/useToastMessage';
import { LocalizationContext } from 'src/context/Localization/LocContext';
import CollaborativeIcon from 'src/assets/images/collaborative_vault_white.svg';
-import { trimCWDefaultName } from 'src/utils/utilities';
+import { getKeyUID, trimCWDefaultName } from 'src/utils/utilities';
+import { INHERITANCE_KEY1_IDENTIFIER } from 'src/services/wallets/operations/miniscript/default/InheritanceVault';
+import EditWalletDetailsModal from '../WalletDetails/EditWalletDetailsModal';
function VaultSettings({ route }) {
const { colorMode } = useColorMode();
@@ -36,7 +39,15 @@ function VaultSettings({ route }) {
const isCanaryWalletType = vault.type === VaultType.CANARY;
const isCollaborativeWallet = vault.type === VaultType.COLLABORATIVE;
const { showToast } = useToastMessage();
-
+ const isInheritanceVault =
+ vault?.type === VaultType.INHERITANCE && vault?.scheme?.miniscriptScheme;
+ const inheritanceKey = vault?.signers?.find(
+ (signer) =>
+ signer.masterFingerprint ===
+ vault?.scheme?.miniscriptScheme?.miniscriptElements?.signerFingerprints[
+ INHERITANCE_KEY1_IDENTIFIER
+ ]
+ );
const hasArchivedVaults = getArchivedVaults(allVaults, vault).length > 0;
const updateWalletVisibility = () => {
@@ -56,6 +67,20 @@ function VaultSettings({ route }) {
}
};
+ const getWalletIcon = (wallet) => {
+ if (wallet?.entityKind === EntityKind.VAULT) {
+ if (wallet.type === VaultType.COLLABORATIVE) {
+ return ;
+ } else if (wallet.type === VaultType.ASSISTED) {
+ return ;
+ } else {
+ return ;
+ }
+ } else {
+ return ;
+ }
+ };
+
return (
: }
+ icon={getWalletIcon(vault)}
/>
}
/>
@@ -107,10 +132,30 @@ function VaultSettings({ route }) {
visible={!isCanaryWalletType}
callback={() => {
navigation.dispatch(
- CommonActions.navigate({ name: 'VaultSetup', params: { vaultId } })
+ CommonActions.navigate({
+ name: 'VaultSetup',
+ params: {
+ vaultId,
+ isAddInheritanceKeyFromParams: vault.type === VaultType.INHERITANCE,
+ },
+ })
);
}}
/>
+ {isInheritanceVault && (
+ {
+ navigation.dispatch(
+ CommonActions.navigate({
+ name: 'ResetInheritanceKey',
+ params: { signerId: getKeyUID(inheritanceKey), vault },
+ })
+ );
+ }}
+ />
+ )}
{TestSatsComponent}
+ {walletOptions.map((option, index) => (
+
+
+
+
+
+
+ {option.title}
+
+
+ {option.desc}
+
+
+
+ ))}
+
+ );
+}
function NumberInput({ value, onDecrease, onIncrease }) {
const { colorMode } = useColorMode();
@@ -48,10 +109,18 @@ function NumberInput({ value, onDecrease, onIncrease }) {
type ScreenProps = NativeStackScreenProps;
function VaultSetup({ route }: ScreenProps) {
+ const { plan } = usePlan();
const { colorMode } = useColorMode();
const navigation = useNavigation();
const { showToast } = useToastMessage();
- const { isRecreation, scheme: preDefinedScheme, vaultId } = route.params || {};
+ const {
+ isRecreation,
+ scheme: preDefinedScheme,
+ vaultId,
+ isTimeLock = false,
+ isAddInheritanceKeyFromParams = false,
+ } = route.params || {};
+ const isDiamondHand = plan === SubscriptionTier.L3.toUpperCase();
const dispatch = useDispatch();
const { activeVault } = useVault({ vaultId });
const [vaultName, setVaultName] = useState(
@@ -59,12 +128,39 @@ function VaultSetup({ route }: ScreenProps) {
? 'Vault'
: ''
);
- const [vaultDescription, setVaultDescription] = useState(
- activeVault?.presentationData?.description || ''
+ const descriptionInputRef = useRef(activeVault?.presentationData?.description || '');
+ const initialDescription = useRef(descriptionInputRef.current);
+ const [isAddInheritanceKey, setIsAddInheritanceKey] = useState(
+ isAddInheritanceKeyFromParams && isDiamondHand
);
+ const [showDescriptionModal, setShowDescriptionModal] = useState(false);
+ const [showModal, setShowModal] = useState(false);
const [scheme, setScheme] = useState(activeVault?.scheme || preDefinedScheme || { m: 3, n: 4 });
const { translations } = useContext(LocalizationContext);
- const { vault: vaultTranslations } = translations;
+ const [currentBlockHeight, setCurrentBlockHeight] = useState(null);
+
+ useEffect(() => {
+ // should bind with a refresher in case the auto fetch for block-height fails
+ if (isTimeLock) {
+ WalletUtilities.fetchCurrentBlockHeight()
+ .then(({ currentBlockHeight }) => {
+ setCurrentBlockHeight(currentBlockHeight);
+ })
+ .catch((err) => showToast(err));
+ }
+ }, [isTimeLock]);
+
+ useEffect(() => {
+ if (isAddInheritanceKey && !currentBlockHeight) {
+ WalletUtilities.fetchCurrentBlockHeight()
+ .then(({ currentBlockHeight }) => {
+ setCurrentBlockHeight(currentBlockHeight);
+ })
+ .catch((err) => showToast(err));
+ }
+ }, [isAddInheritanceKey]);
+
+ const { vault: vaultTranslations, common } = translations;
const onDecreaseM = () => {
if (scheme.m > 1) {
@@ -90,7 +186,12 @@ function VaultSetup({ route }: ScreenProps) {
setScheme({ ...scheme, n: scheme.n + 1 });
}
};
+
+ const onDescriptionChange = (value) => {
+ descriptionInputRef.current = value;
+ };
const OnProceed = () => {
+ const vaultDescription = descriptionInputRef.current;
if (vaultName !== '') {
if (isRecreation) {
dispatch(
@@ -102,6 +203,11 @@ function VaultSetup({ route }: ScreenProps) {
);
navigation.navigate('LoginStack', { screen: 'VaultRecoveryAddSigner' });
} else {
+ if (isTimeLock && !currentBlockHeight) {
+ showToast('Block height not synched');
+ return;
+ }
+
navigation.dispatch(
CommonActions.navigate({
name: 'AddSigningDevice',
@@ -110,6 +216,12 @@ function VaultSetup({ route }: ScreenProps) {
name: vaultName,
description: vaultDescription,
vaultId,
+ isTimeLock,
+ currentBlockHeight,
+ isAddInheritanceKey,
+ ...(isAddInheritanceKey && {
+ signerFilters: [SignerType.MY_KEEPER, SignerType.TAPSIGNER, SignerType.SEED_WORDS],
+ }),
},
})
);
@@ -119,14 +231,46 @@ function VaultSetup({ route }: ScreenProps) {
}
};
+ function ModalContent() {
+ return (
+
+
+
+
+ {vaultTranslations.reserveKeyUpgradeDesc}
+
+ {
+ setShowModal(false);
+ navigation.dispatch(CommonActions.navigate('ChoosePlan'));
+ }}
+ fullWidth
+ />
+
+
+ );
+ }
+
// TODO: add learn more modal
return (
{
+ setShowModal(true);
+ }}
// To-Do-Learn-More
/>
@@ -140,13 +284,17 @@ function VaultSetup({ route }: ScreenProps) {
testID="vault_name"
maxLength={18}
/>
-
+ {
+ setShowDescriptionModal(true);
+ initialDescription.current = descriptionInputRef.current;
+ }}
+ >
+
+ Add Description
+
+
+
+
+ {!isDiamondHand && (
+
+
+
+
+ )}
+
+ setIsAddInheritanceKey(!isAddInheritanceKey)}
+ isDisabled={!isDiamondHand}
+ >
+
+ {vaultTranslations.addInheritanceKeyAfterKeys}
+
+
+
+
+ setShowDescriptionModal(false)}
+ title="Add Description"
+ subTitle="This will reflect on the home screen"
+ modalBackground={`${colorMode}.modalWhiteBackground`}
+ subTitleColor={`${colorMode}.secondaryText`}
+ textColor={`${colorMode}.primaryText`}
+ showCloseIcon={false}
+ Content={() => (
+
+ {
+ descriptionInputRef.current = input ? input.value : '';
+ }}
+ placeholder="Add a description (Optional)"
+ defaultValue={descriptionInputRef.current}
+ onChangeText={onDescriptionChange}
+ testID="vault_description"
+ maxLength={20}
+ />
+
+ )}
+ buttonText="Save Changes"
+ buttonCallback={() => {
+ setShowDescriptionModal(false);
+ showToast('Description added successfully!', );
+ }}
+ secondaryButtonText="Cancel"
+ secondaryCallback={() => {
+ descriptionInputRef.current = initialDescription.current;
+ setShowDescriptionModal(false);
+ }}
+ />
+ {
+ setShowModal(false);
+ }}
+ title={vaultTranslations.setupNewVault}
+ subTitle={''}
+ modalBackground={`${colorMode}.modalGreenBackground`}
+ textColor={`${colorMode}.modalGreenContent`}
+ Content={SetupVaultContent}
+ showCloseIcon={true}
+ DarkCloseIcon
+ secondaryButtonText={common.needHelp}
+ secondaryCallback={() => {
+ setShowModal(false);
+ dispatch(goToConcierge([ConciergeTag.VAULT], 'vault-setup'));
+ }}
+ buttonText={common.Okay}
+ buttonCallback={() => setShowModal(false)}
+ buttonTextColor={`${colorMode}.modalWhiteButtonText`}
+ buttonBackground={`${colorMode}.modalWhiteButton`}
+ secButtonTextColor={`${colorMode}.modalGreenSecButtonText`}
+ />
);
}
@@ -222,10 +464,63 @@ const styles = StyleSheet.create({
borderWidth: 1,
},
thresholdContainer: {
- marginTop: hp(35),
+ marginTop: hp(20),
},
title: {
fontSize: 14,
marginBottom: hp(5),
},
+ descriptionContainer: {
+ width: '100%',
+ height: hp(30),
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: wp(5),
+ },
+ descriptionInput: {
+ marginBottom: hp(10),
+ },
+ modalContainer: {
+ flex: 1,
+ gap: hp(30),
+ },
+ reserveKeyIllustration: {
+ alignSelf: 'center',
+ paddingRight: wp(20),
+ },
+ modalButtonContainer: {
+ marginTop: hp(10),
+ },
+ addInheritanceContainer: {
+ gap: hp(20),
+ },
+ separator: {
+ borderTopWidth: 1,
+ marginVertical: hp(10),
+ },
+ upgradeButtonCustomStyles: {
+ container: {
+ borderTopWidth: 0,
+ justifyContent: 'space-between',
+ },
+ },
+ setupVaultContainer: {
+ width: '100%',
+ gap: 10,
+ },
+ setupVaultIconWrapper: {
+ width: '15%',
+ },
+ setupVaultContentWrapper: {
+ width: '97%',
+ },
+ setupVaultDescText: {
+ fontSize: 13,
+ padding: 1,
+ marginBottom: 25,
+ },
+ setupVaultTitleText: {
+ fontSize: 15,
+ padding: 1,
+ },
});
diff --git a/src/screens/Vault/components/AdditionalDetails.tsx b/src/screens/Vault/components/AdditionalDetails.tsx
new file mode 100644
index 000000000..1ca810e2f
--- /dev/null
+++ b/src/screens/Vault/components/AdditionalDetails.tsx
@@ -0,0 +1,97 @@
+import { StyleSheet } from 'react-native';
+import React, { useState } from 'react';
+import ScreenWrapper from 'src/components/ScreenWrapper';
+import KeeperHeader from 'src/components/KeeperHeader';
+import { Box, useColorMode, VStack } from 'native-base';
+import useToastMessage from 'src/hooks/useToastMessage';
+import { NativeStackScreenProps } from '@react-navigation/native-stack';
+import { AppStackParams } from 'src/navigation/types';
+import Text from 'src/components/KeeperText';
+import Colors from 'src/theme/Colors';
+import { hp, wp } from 'src/constants/responsive';
+import Fonts from 'src/constants/Fonts';
+import { TextInput } from 'react-native-gesture-handler';
+import { updateSignerDetails } from 'src/store/sagaActions/wallets';
+import { useDispatch } from 'react-redux';
+import useSignerMap from 'src/hooks/useSignerMap';
+import TickIcon from 'src/assets/images/tick_icon.svg';
+import { getKeyUID } from 'src/utils/utilities';
+
+type ScreenProps = NativeStackScreenProps;
+
+function AdditionalDetails({ route }: ScreenProps) {
+ const { colorMode } = useColorMode();
+ const { showToast } = useToastMessage();
+ const dispatch = useDispatch();
+ const { signer: signerFromParam } = route.params;
+ const { signerMap } = useSignerMap();
+ const signer = signerMap[getKeyUID(signerFromParam)];
+ const [description, setDescription] = useState(signer?.signerDescription || '');
+
+ return (
+
+
+
+
+ setDescription(text)}
+ style={[
+ styles.descriptionEdit,
+ {
+ borderColor: Colors.SilverMist,
+ backgroundColor: colorMode === 'dark' ? Colors.SeashellDark : Colors.Seashell,
+ color: colorMode === 'dark' ? Colors.GraniteGrayDark : Colors.GraniteGray,
+ },
+ ]}
+ placeholder="Add a Description (Optional)"
+ placeholderTextColor={Colors.Graphite}
+ value={description}
+ maxLength={20}
+ onSubmitEditing={() => {
+ dispatch(updateSignerDetails(signer, 'signerDescription', description));
+ showToast('Description updated successfully', );
+ }}
+ />
+
+ {description.length}/20
+
+
+
+
+ );
+}
+
+export default AdditionalDetails;
+
+const styles = StyleSheet.create({
+ descriptionEdit: {
+ height: hp(50),
+ borderWidth: 1,
+ alignItems: 'center',
+ paddingLeft: wp(20),
+ marginVertical: hp(10),
+ borderRadius: 10,
+ fontFamily: Fonts.FiraSansRegular,
+ fontSize: 12,
+ letterSpacing: 0.5,
+ },
+ descriptionContainer: {
+ marginTop: hp(20),
+ marginHorizontal: '5%',
+ },
+ inputWrapper: {
+ position: 'relative',
+ width: '100%',
+ },
+ limitText: {
+ position: 'absolute',
+ right: wp(12),
+ bottom: hp(25),
+ fontSize: 12,
+ letterSpacing: 0.6,
+ },
+});
diff --git a/src/screens/Vault/components/IKSInfoCard.tsx b/src/screens/Vault/components/IKSInfoCard.tsx
new file mode 100644
index 000000000..25bc5463c
--- /dev/null
+++ b/src/screens/Vault/components/IKSInfoCard.tsx
@@ -0,0 +1,91 @@
+import { Box, useColorMode } from 'native-base';
+import { StyleSheet } from 'react-native';
+import Text from 'src/components/KeeperText';
+import { hp, wp } from 'src/constants/responsive';
+import HexagonIcon from 'src/components/HexagonIcon';
+import Colors from 'src/theme/Colors';
+import TimerOutlineLight from 'src/assets/images/timer-outline.svg';
+import { useContext } from 'react';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+
+interface IKSInfocardProps {
+ name: string;
+ description?: string;
+ Icon: Element;
+ duration?: string;
+}
+
+const IKSInfocard: React.FC = ({ name, description, Icon, duration }) => {
+ const { colorMode } = useColorMode();
+ const isDarkMode = colorMode === 'dark';
+ const { translations } = useContext(LocalizationContext);
+ const { vault: vaultText } = translations;
+
+ return (
+
+
+
+
+
+
+ {name}
+
+ {description ? (
+
+ {description}
+
+ ) : null}
+ {duration ? (
+
+ {duration !== vaultText.IKAlreadyActive && }
+
+ {duration}
+
+
+ ) : null}
+
+
+ );
+};
+
+export default IKSInfocard;
+
+const styles = StyleSheet.create({
+ infoCard: {
+ flexDirection: 'row',
+ paddingHorizontal: wp(17),
+ paddingTop: hp(20),
+ paddingBottom: hp(10),
+ minHeight: hp(80),
+ borderRadius: 10,
+ borderWidth: 1,
+ },
+ infoWrapper: {
+ flex: 1,
+ },
+ buttonContainer: {
+ marginTop: 20,
+ },
+ iconWrapper: {
+ marginRight: 10,
+ },
+ titleText: {
+ fontSize: 14,
+ },
+ durationContainer: {
+ marginTop: hp(10),
+ flexDirection: 'row',
+ alignItems: 'center',
+ width: '100%',
+ gap: wp(5),
+ },
+});
diff --git a/src/screens/Vault/components/SigningDeviceCard.tsx b/src/screens/Vault/components/SigningDeviceCard.tsx
index 7231c2484..ada678e35 100644
--- a/src/screens/Vault/components/SigningDeviceCard.tsx
+++ b/src/screens/Vault/components/SigningDeviceCard.tsx
@@ -26,6 +26,7 @@ type SigningDeviceCardProps = {
vaultSigners?: VaultSigner[];
isMultisig: boolean;
primaryMnemonic: string;
+ accountNumber: number;
};
const SigningDeviceCard = ({
@@ -41,6 +42,7 @@ const SigningDeviceCard = ({
vaultSigners,
isMultisig,
primaryMnemonic,
+ accountNumber,
}: SigningDeviceCardProps) => {
const [visible, setVisible] = useState(false);
const navigation = useNavigation();
@@ -126,6 +128,7 @@ const SigningDeviceCard = ({
addSignerFlow={addSignerFlow}
vaultId={vaultId}
vaultSigners={vaultSigners}
+ accountNumber={accountNumber}
/>
>
);
diff --git a/src/screens/Vault/components/TimeLockModalContent.tsx b/src/screens/Vault/components/TimeLockModalContent.tsx
new file mode 100644
index 000000000..aaecb0ac9
--- /dev/null
+++ b/src/screens/Vault/components/TimeLockModalContent.tsx
@@ -0,0 +1,51 @@
+import { Box, useColorMode } from 'native-base';
+import { StyleSheet } from 'react-native';
+import Buttons from 'src/components/Buttons';
+import Text from 'src/components/KeeperText';
+import { hp } from 'src/constants/responsive';
+import IKSInfocard from './IKSInfoCard';
+import { useContext } from 'react';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+
+interface TimeLockModalContentProps {
+ name?: string;
+ description?: string;
+ duration?: string;
+ Icon: Element;
+ callback: () => void;
+}
+
+const TimeLockModalContent: React.FC = ({
+ name,
+ description,
+ duration,
+ Icon,
+ callback,
+}) => {
+ const { colorMode } = useColorMode();
+ const { translations } = useContext(LocalizationContext);
+ const { vault: vaultText, common } = translations;
+
+ return (
+
+
+
+ {vaultText.timelockInfo}
+
+
+
+
+
+ );
+};
+
+export default TimeLockModalContent;
+
+const styles = StyleSheet.create({
+ infoContainer: {
+ gap: hp(25),
+ },
+ buttonContainer: {
+ marginTop: 20,
+ },
+});
diff --git a/src/screens/Vault/constants.ts b/src/screens/Vault/constants.ts
new file mode 100644
index 000000000..2e8fd6b88
--- /dev/null
+++ b/src/screens/Vault/constants.ts
@@ -0,0 +1,7 @@
+export const MONTHS_3 = '3 months';
+export const MONTHS_6 = '6 months';
+export const MONTHS_12 = '1 year';
+export const MONTHS_18 = '1.5 years';
+export const MONTHS_24 = '2 years';
+
+export const TIMELOCK_DURATIONS = [MONTHS_3, MONTHS_6, MONTHS_12, MONTHS_24];
diff --git a/src/screens/ViewTransactions/TransactionAdvancedDetails.tsx b/src/screens/ViewTransactions/TransactionAdvancedDetails.tsx
index 67f78cc8d..00a62c643 100644
--- a/src/screens/ViewTransactions/TransactionAdvancedDetails.tsx
+++ b/src/screens/ViewTransactions/TransactionAdvancedDetails.tsx
@@ -207,7 +207,8 @@ const styles = StyleSheet.create({
flex: 1,
},
topSection: {
- height: '27%',
+ height: '30%',
+ paddingTop: hp(17),
paddingHorizontal: 20,
},
bottomSection: {
diff --git a/src/screens/ViewTransactions/TransactionDetails.tsx b/src/screens/ViewTransactions/TransactionDetails.tsx
index bc1463298..953cea43e 100644
--- a/src/screens/ViewTransactions/TransactionDetails.tsx
+++ b/src/screens/ViewTransactions/TransactionDetails.tsx
@@ -201,7 +201,7 @@ function TransactionDetails({ route }) {
-
+
diff --git a/src/screens/ViewTransactions/TransactionHistory.tsx b/src/screens/ViewTransactions/TransactionHistory.tsx
new file mode 100644
index 000000000..c7f217bc8
--- /dev/null
+++ b/src/screens/ViewTransactions/TransactionHistory.tsx
@@ -0,0 +1,127 @@
+import { FlatList, RefreshControl, StatusBar, StyleSheet } from 'react-native';
+import { Box, useColorMode } from 'native-base';
+import React, { useContext, useMemo, useState } from 'react';
+import { hp, wp } from 'src/constants/responsive';
+import KeeperHeader from 'src/components/KeeperHeader';
+import { LocalizationContext } from 'src/context/Localization/LocContext';
+
+import { Wallet } from 'src/services/wallets/interfaces/wallet';
+import { CommonActions, useNavigation } from '@react-navigation/native';
+import TransactionElement from 'src/components/TransactionElement';
+import EmptyStateView from 'src/components/EmptyView/EmptyStateView';
+import NoTransactionIcon from 'src/assets/images/noTransaction.svg';
+import { refreshWallets } from 'src/store/sagaActions/wallets';
+import { useDispatch } from 'react-redux';
+import { setStateFromSnapshot } from 'src/store/reducers/send_and_receive';
+
+function TransactionHistory({ route }) {
+ const { colorMode } = useColorMode();
+ const navigation = useNavigation();
+ const { translations } = useContext(LocalizationContext);
+ const { common, transactions: transactionsText } = translations;
+ const { wallet }: { wallet: Wallet } = route.params;
+ const [pullRefresh, setPullRefresh] = useState(false);
+ const dispatch = useDispatch();
+ const transactions = useMemo(
+ () =>
+ [...(wallet?.specs?.transactions || [])].sort((a, b) => {
+ // Sort unconfirmed transactions first
+ if (a.confirmations === 0 && b.confirmations !== 0) return -1;
+ if (a.confirmations !== 0 && b.confirmations === 0) return 1;
+
+ // Then sort by date
+ if (!a.date && !b.date) return 0;
+ if (!a.date) return -1;
+ if (!b.date) return 1;
+ return new Date(b.date).getTime() - new Date(a.date).getTime();
+ }),
+ [wallet?.specs?.transactions]
+ );
+
+ const renderTransactionElement = ({ item }) => (
+ {
+ if (item?.isCached) {
+ dispatch(setStateFromSnapshot(item.snapshot.state));
+ navigation.dispatch(
+ CommonActions.navigate('SendConfirmation', {
+ ...item.snapshot.routeParams,
+ })
+ );
+ } else {
+ navigation.dispatch(
+ CommonActions.navigate('TransactionDetails', {
+ transaction: item,
+ wallet: wallet,
+ })
+ );
+ }
+ }}
+ />
+ );
+
+ const pullDownRefresh = () => {
+ setPullRefresh(true);
+ dispatch(refreshWallets([wallet], { hardRefresh: true }));
+ setPullRefresh(false);
+ };
+
+ return (
+
+
+
+
+
+
+
+ }
+ data={transactions}
+ renderItem={renderTransactionElement}
+ keyExtractor={(item) => item.txid}
+ showsVerticalScrollIndicator={false}
+ contentContainerStyle={styles.contentContainerStyle}
+ ListEmptyComponent={
+
+ }
+ />
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ wrapper: {
+ flex: 1,
+ },
+ topSection: {
+ paddingTop: hp(17),
+ paddingHorizontal: 20,
+ paddingBottom: 25,
+ },
+ bottomSection: {
+ borderTopLeftRadius: 40,
+ borderTopRightRadius: 40,
+ flex: 1,
+ paddingTop: hp(10),
+ },
+ transactionList: {
+ paddingLeft: wp(22),
+ paddingRight: wp(26),
+ },
+ contentContainerStyle: {
+ paddingBottom: hp(100),
+ },
+});
+export default TransactionHistory;
diff --git a/src/screens/WalletDetails/CosignerDetails.tsx b/src/screens/WalletDetails/CosignerDetails.tsx
index b7df1acf8..29a830b99 100644
--- a/src/screens/WalletDetails/CosignerDetails.tsx
+++ b/src/screens/WalletDetails/CosignerDetails.tsx
@@ -10,10 +10,10 @@ import { getKeyExpression } from 'src/utils/service-utilities/utils';
import { XpubTypes } from 'src/services/wallets/enums';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { AppStackParams } from 'src/navigation/types';
-import ShareWithNfc from '../NFCChannel/ShareWithNfc';
import idx from 'idx';
import ToastErrorIcon from 'src/assets/images/toast_error.svg';
import { captureError } from 'src/services/sentry';
+import ShareWithNfc from '../NFCChannel/ShareWithNfc';
type ScreenProps = NativeStackScreenProps;
function CosignerDetails({ route }: ScreenProps) {
@@ -53,7 +53,7 @@ function CosignerDetails({ route }: ScreenProps) {
setDetails(keyDescriptor);
} catch (error) {
showToast(
- `We're sorry, but we have trouble retrieving the key information`,
+ "We're sorry, but we have trouble retrieving the key information",
);
}
@@ -83,7 +83,7 @@ function CosignerDetails({ route }: ScreenProps) {
{details ? (
-
+
) : null}
diff --git a/src/screens/WalletDetails/WalletDetails.tsx b/src/screens/WalletDetails/WalletDetails.tsx
index 7c134121a..5996a1337 100644
--- a/src/screens/WalletDetails/WalletDetails.tsx
+++ b/src/screens/WalletDetails/WalletDetails.tsx
@@ -1,4 +1,4 @@
-import { StyleSheet } from 'react-native';
+import { Pressable, StyleSheet } from 'react-native';
import { Box, HStack, StatusBar, useColorMode, VStack } from 'native-base';
import React, { useContext, useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';
@@ -31,8 +31,6 @@ import CardPill from 'src/components/CardPill';
import ActionCard from 'src/components/ActionCard';
import { AppStackParams } from 'src/navigation/types';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
-import * as Sentry from '@sentry/react-native';
-import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import Colors from 'src/theme/Colors';
import HexagonIcon from 'src/components/HexagonIcon';
import WalletUtilities from 'src/services/wallets/operations/utils';
@@ -43,6 +41,7 @@ import Transactions from './components/Transactions';
import useToastMessage, { IToastCategory } from 'src/hooks/useToastMessage';
import { TouchableOpacity } from 'react-native-gesture-handler';
import BTCAmountPill from 'src/components/BTCAmountPill';
+import { SentryErrorBoundary } from 'src/services/sentry';
export const allowedSendTypes = [
WalletType.DEFAULT,
@@ -248,9 +247,21 @@ function WalletDetails({ route }: ScreenProps) {
<>
{wallet?.specs?.transactions?.length ? (
-
- {common.transactions}
+
+ {common.recentTransactions}
+
+ navigation.dispatch(
+ CommonActions.navigate({ name: 'TransactionHistory', params: { wallet } })
+ )
+ }
+ >
+
+ {common.viewAll}
+
+
) : null}
- [...transactions].sort((a, b) => {
- if (!a.blockTime && !b.blockTime) return 0;
- if (!a.blockTime) return -1;
- if (!b.blockTime) return 1;
- return b.blockTime - a.blockTime;
- }) || [],
+ [...transactions]
+ .sort((a, b) => {
+ // Sort unconfirmed transactions first
+ if (a.confirmations === 0 && b.confirmations !== 0) return -1;
+ if (a.confirmations !== 0 && b.confirmations === 0) return 1;
+
+ // Then sort by date
+ if (!a.date && !b.date) return 0;
+ if (!a.date) return -1;
+ if (!b.date) return 1;
+ return new Date(b.date).getTime() - new Date(a.date).getTime();
+ })
+ .slice(0, 5) || [],
[transactions]
);
diff --git a/src/services/backend/Relay.ts b/src/services/backend/Relay.ts
index 1cca542a8..3ad2f0e6c 100644
--- a/src/services/backend/Relay.ts
+++ b/src/services/backend/Relay.ts
@@ -660,9 +660,9 @@ export default class Relay {
}
};
- public static createRemoteKey = async (data: string) => {
+ public static createRemoteKey = async (data: string, hash: string) => {
try {
- const response = await RestClient.post(`${RELAY}createRemoteKey`, { data });
+ const response = await RestClient.post(`${RELAY}createRemoteKey`, { data, hash });
const res = (response as AxiosResponse).data || (response as any).json;
if (res) {
return res;
@@ -674,9 +674,9 @@ export default class Relay {
}
};
- public static getRemoteKey = async (id: string) => {
+ public static getRemoteKey = async (hash: string) => {
try {
- const response = await RestClient.get(`${RELAY}getRemoteKey?id=${id}`);
+ const response = await RestClient.get(`${RELAY}getRemoteKey?hash=${hash}`);
const res = (response as AxiosResponse).data || (response as any).json;
if (res) {
return res;
diff --git a/src/services/qr/index.ts b/src/services/qr/index.ts
index 9edd1bc1c..b0843182a 100644
--- a/src/services/qr/index.ts
+++ b/src/services/qr/index.ts
@@ -45,6 +45,9 @@ export const decodeURBytes = (decoder: URRegistryDecoder, bytes) => {
const decodedString = decoded.toString();
if (decodedString.includes('BSMS')) {
return { data: decodedString, percentage: scanPercentage };
+ } else if (decodedString.startsWith('psbt') || decodedString.startsWith('PSBT')) {
+ const cryptoPsbt = CryptoPSBT.fromCBOR(ur.cbor);
+ return { data: cryptoPsbt.getPSBT().toString('base64'), percentage: scanPercentage };
}
}
diff --git a/src/services/sentry/index.ts b/src/services/sentry/index.ts
index c7b041f7b..b39befb20 100644
--- a/src/services/sentry/index.ts
+++ b/src/services/sentry/index.ts
@@ -1,41 +1,76 @@
-import * as Sentry from '@sentry/react-native';
-
-import { CaptureContext, SeverityLevel, User } from '@sentry/types';
+import { errorBourndaryOptions } from 'src/screens/ErrorHandler';
import config from 'src/utils/service-utilities/config';
-// Construct a new instrumentation instance. This is needed to communicate between the integration and React
-const routingInstrumentation = new Sentry.ReactNavigationInstrumentation();
-
-export const sentryConfig: Sentry.ReactNativeOptions = {
- maxBreadcrumbs: 50,
- tracesSampleRate: 1.0,
- dsn: config.SENTRY_DNS,
- environment: __DEV__ ? 'LOCAL' : config.ENVIRONMENT,
- integrations: [
- new Sentry.ReactNativeTracing({
- routingInstrumentation,
- }),
- ],
+let Sentry: any = null;
+let routingInstrumentation: any = null;
+let sentryConfig: any = null;
+
+export const initSentrySDK = () => {
+ if (!config.isDevMode()) return;
+
+ if (!Sentry) {
+ import('@sentry/react-native')
+ .then((module) => {
+ Sentry = module;
+ })
+ .catch((error) => {
+ console.error('Failed to load Sentry:', error);
+ });
+ }
};
-export const identifyUser = (id: string) => {
- const user: User = { id };
- return Sentry.setUser(user);
+// Construct a new instrumentation instance. This is needed to communicate between the integration and React
+// const routingInstrumentation = new Sentry.ReactNavigationInstrumentation();
+
+const getSentryConfig = () => {
+ sentryConfig = {
+ maxBreadcrumbs: 50,
+ tracesSampleRate: 1.0,
+ dsn: config.SENTRY_DNS,
+ environment: 'LOCAL',
+ integrations: [
+ new Sentry.ReactNativeTracing({
+ routingInstrumentation,
+ }),
+ ],
+ };
};
-export const captureError = (error: Error, context?: CaptureContext) => {
+export const captureError = (error: Error, context?: any) => {
try {
- if (__DEV__) {
- console.log('@captureError: ', error);
- }
+ if (!config.isDevMode()) return null;
+ console.log('@captureError: ', error);
return Sentry.captureException(error, context);
} catch (err) {
console.log(err);
}
};
-export const logMessage = (message: string, captureContext?: CaptureContext | SeverityLevel) =>
- Sentry.captureMessage(message, captureContext);
+export const logMessage = (message: string, captureContext?: any) => {
+ config.isDevMode() && Sentry.captureMessage(message, captureContext);
+};
+
+export const SentryWrapper = (App) => {
+ if (Sentry) return Sentry.wrap(App);
+ else return App;
+};
+
+export const SentryErrorBoundary = (component) => {
+ if (Sentry) {
+ return Sentry.withErrorBoundary(component, errorBourndaryOptions);
+ } else {
+ return component;
+ }
+};
+
+export const initializeSentry = () => {
+ if (config.isDevMode()) {
+ if (!sentryConfig) getSentryConfig();
+ return Sentry.init({ ...sentryConfig, enabled: true });
+ }
+ return null;
+};
-export { routingInstrumentation };
+export const getRoutingInstrumentation = () =>
+ Sentry ? new Sentry.ReactNavigationInstrumentation() : null;
diff --git a/src/services/wallets/enums/index.ts b/src/services/wallets/enums/index.ts
index 9660e88c9..80bee1582 100644
--- a/src/services/wallets/enums/index.ts
+++ b/src/services/wallets/enums/index.ts
@@ -79,6 +79,9 @@ export enum WalletType {
export enum VaultType {
DEFAULT = 'DEFAULT',
COLLABORATIVE = 'COLLABORATIVE',
+ ASSISTED = 'ASSISTED',
+ TIMELOCKED = 'TIMELOCKED',
+ INHERITANCE = 'INHERITANCE',
CANARY = 'CANARY',
SINGE_SIG = 'SINGE_SIG',
}
@@ -108,6 +111,7 @@ export enum SignerType {
INHERITANCEKEY = 'INHERITANCEKEY',
UNKOWN_SIGNER = 'UNKNOWN_SIGNER',
SPECTER = 'SPECTER',
+ ADVISOR_KEY = 'ADVISOR_KEY',
PORTAL = 'PORTAL',
}
@@ -208,3 +212,8 @@ export enum RKInteractionMode {
SHARE_PSBT = 'SHARE_PSBT',
SHARE_SIGNED_PSBT = 'SHARE_SIGNED_PSBT',
}
+
+export enum MultisigScriptType {
+ DEFAULT_MULTISIG = 'DEFAULT_MULTISIG',
+ MINISCRIPT_MULTISIG = 'MINISCRIPT_MULTISIG',
+}
diff --git a/src/services/wallets/factories/VaultFactory.ts b/src/services/wallets/factories/VaultFactory.ts
index 578c922f1..73045a487 100644
--- a/src/services/wallets/factories/VaultFactory.ts
+++ b/src/services/wallets/factories/VaultFactory.ts
@@ -17,8 +17,10 @@ import {
} from 'src/models/interfaces/AssistedKeys';
import SigningServer from 'src/services/backend/SigningServer';
import InheritanceKeyServer from 'src/services/backend/InheritanceKey';
+import idx from 'idx';
import {
EntityKind,
+ MultisigScriptType,
NetworkType,
ScriptTypes,
SignerType,
@@ -26,6 +28,8 @@ import {
VisibilityType,
} from '../enums';
import {
+ MiniscriptElements,
+ MiniscriptScheme,
Signer,
Vault,
VaultPresentationData,
@@ -36,6 +40,9 @@ import {
import WalletUtilities from '../operations/utils';
import WalletOperations from '../operations';
+import { generateMiniscript } from '../operations/miniscript/miniscript';
+import { generateMiniscriptPolicy } from '../operations/miniscript/policy-generator';
+import { getKeyUID } from 'src/utils/utilities';
const crypto = require('crypto');
@@ -45,7 +52,7 @@ const STANDARD_VAULT_SCHEME = [
{ m: 3, n: 5 },
];
-export const generateVaultId = (signers: VaultSigner[], scheme) => {
+export const generateVaultId = (signers: VaultSigner[], scheme: VaultScheme) => {
const xpubs = signers.map((signer) => signer.xpub).sort();
const xpubMap = {};
signers.forEach((signer) => {
@@ -55,11 +62,17 @@ export const generateVaultId = (signers: VaultSigner[], scheme) => {
const signer = xpubMap[xpub];
return signer.xfp;
});
- STANDARD_VAULT_SCHEME.forEach((s) => {
- if (s.m !== scheme.m || s.n !== scheme.n) {
- fingerprints.push(JSON.stringify(scheme));
- }
- });
+
+ if (scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ fingerprints.push(JSON.stringify(scheme));
+ } else {
+ STANDARD_VAULT_SCHEME.forEach((s) => {
+ if (s.m !== scheme.m || s.n !== scheme.n) {
+ fingerprints.push(JSON.stringify(scheme));
+ }
+ });
+ }
+
const hashedFingerprints = hash256(fingerprints.join(''));
const id = hashedFingerprints.slice(hashedFingerprints.length - fingerprints[0].length);
return id;
@@ -88,6 +101,13 @@ export const generateVault = async ({
const xpubs = signers.map((signer) => signer.xpub);
const shellId = vaultShellId || generateKey(12);
const defaultShell = 1;
+
+ if (scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ if (!scheme.miniscriptScheme) throw new Error('Input missing: miniscriptScheme');
+ } else {
+ if (scheme.m > scheme.n) throw new Error(`scheme error: m:${scheme.m} > n:${scheme.n}`);
+ }
+
const presentationData: VaultPresentationData = {
name: vaultName,
description: vaultDescription,
@@ -95,8 +115,6 @@ export const generateVault = async ({
shell: defaultShell,
};
- if (scheme.m > scheme.n) throw new Error(`scheme error: m:${scheme.m} > n:${scheme.n}`);
-
const isMultiSig = scheme.n !== 1; // single key Vault is BIP-84 P2WPKH single-sig and not 1-of-1 BIP-48 P2WSH multi-sig
const scriptType = isMultiSig ? ScriptTypes.P2WSH : ScriptTypes.P2WPKH;
@@ -248,7 +266,7 @@ export const generateCosignerMapIds = (
// generates cosigners map ids using sorted and hashed cosigner ids
const cosignerIds = [];
keys.forEach((signer) => {
- if (signerMap[signer.masterFingerprint].type !== except) cosignerIds.push(signer.xfp);
+ if (signerMap[getKeyUID(signer)].type !== except) cosignerIds.push(signer.xfp);
});
cosignerIds.sort();
@@ -270,7 +288,7 @@ export const generateCosignerMapUpdates = (
keys: VaultSigner[],
assistedKey: VaultSigner
): IKSCosignersMapUpdate[] | CosignersMapUpdate[] => {
- const assistedKeyType = signerMap[assistedKey.masterFingerprint].type;
+ const assistedKeyType = signerMap[getKeyUID(assistedKey)].type;
const cosignersMapIds = generateCosignerMapIds(signerMap, keys, assistedKeyType);
if (assistedKeyType === SignerType.POLICY_SERVER) {
@@ -300,7 +318,7 @@ export const generateCosignerMapUpdates = (
const updateCosignersMapForAssistedKeys = async (keys: VaultSigner[], signerMap) => {
for (const key of keys) {
- const assistedKeyType = signerMap[key.masterFingerprint]?.type;
+ const assistedKeyType = signerMap[getKeyUID(key)]?.type;
if (
assistedKeyType === SignerType.POLICY_SERVER ||
assistedKeyType === SignerType.INHERITANCEKEY
@@ -383,3 +401,58 @@ export const generateKeyFromXpub = (
);
return generateEncryptionKey(child);
};
+
+export const generateMiniscriptScheme = (
+ miniscriptElements: MiniscriptElements
+): MiniscriptScheme => {
+ const {
+ miniscriptPhases,
+ policy: miniscriptPolicy,
+ keyInfoMap,
+ } = generateMiniscriptPolicy(miniscriptElements.phases);
+ const { miniscript } = generateMiniscript(miniscriptPolicy);
+ const miniscriptScheme: MiniscriptScheme = {
+ miniscriptElements: {
+ ...miniscriptElements,
+ phases: miniscriptPhases, // w/ unique key identifiers
+ },
+ keyInfoMap,
+ miniscriptPolicy,
+ miniscript,
+ };
+
+ return miniscriptScheme;
+};
+
+export const getAvailableMiniscriptPhase = (vault: Vault, currentBlockHeight: number) => {
+ const miniscriptScheme = idx(vault, (_) => _.scheme.miniscriptScheme);
+ if (!miniscriptScheme) return {};
+
+ const { miniscriptElements } = miniscriptScheme;
+ const { signerFingerprints, phases } = miniscriptElements;
+
+ const availablePhases = [];
+ const availableSignerFingerprints = {};
+
+ for (const phase of phases) {
+ if (phase.timelock <= currentBlockHeight) {
+ availablePhases.push(phase);
+ phase.paths.forEach((path) => {
+ path.keys.forEach((key) => {
+ availableSignerFingerprints[key.identifier] = signerFingerprints[key.identifier];
+ });
+ });
+ }
+ }
+
+ const availableSigners = {};
+ for (const [id, fingerprint] of Object.entries(availableSignerFingerprints)) {
+ const signer = vault.signers.find((s) => s.masterFingerprint === fingerprint);
+ if (signer) availableSigners[id] = signer;
+ }
+
+ return {
+ phases: availablePhases,
+ signers: availableSigners,
+ };
+};
diff --git a/src/services/wallets/factories/WalletFactory.ts b/src/services/wallets/factories/WalletFactory.ts
index 462af25b4..9d5dc0848 100644
--- a/src/services/wallets/factories/WalletFactory.ts
+++ b/src/services/wallets/factories/WalletFactory.ts
@@ -280,20 +280,35 @@ export const getCosignerDetails = async (
};
};
-export const signCosignerPSBT = (xpriv: string, serializedPSBT: string) => {
+export const signCosignerPSBT = (fingerprint: string, xpriv: string, serializedPSBT: string) => {
+ // utilized by SignerType.MY_KEEPER and SignerType.KEEPER(External Keeper App)
const PSBT = bitcoinJS.Psbt.fromBase64(serializedPSBT, { network: config.NETWORK });
let vin = 0;
+ // w/ input.bip32Derivation[0] the sub-path(incorrect especially in case of miniscript-multipath),
+ // from whatever was the first key, was getting consumed
+
PSBT.data.inputs.forEach((input) => {
if (!input.bip32Derivation) return 'signing failed: bip32Derivation missing';
- const { path } = input.bip32Derivation[0];
- const pathLevels = path.split('/');
-
- const internal = parseInt(pathLevels[pathLevels.length - 2], 10) === 1;
- const childIndex = parseInt(pathLevels[pathLevels.length - 1], 10);
-
- const keyPair = WalletUtilities.getKeyPairByIndex(xpriv, internal, childIndex, config.NETWORK);
+ let subPath;
+ for (const { masterFingerprint, path } of input.bip32Derivation) {
+ if (masterFingerprint.toString('hex').toUpperCase() === fingerprint) {
+ const pathFragments = path.split('/');
+ const chainIndex = parseInt(pathFragments[pathFragments.length - 2], 10); // multipath external/internal chain index
+ const childIndex = parseInt(pathFragments[pathFragments.length - 1], 10);
+ subPath = [chainIndex, childIndex];
+ break;
+ }
+ }
+ if (!subPath) throw new Error('Failed to sign internally - missing subpath');
+
+ const keyPair = WalletUtilities.getKeyPairByIndex(
+ xpriv,
+ subPath[0],
+ subPath[1],
+ config.NETWORK
+ );
PSBT.signInput(vin, keyPair);
vin += 1;
});
diff --git a/src/services/wallets/interfaces/index.ts b/src/services/wallets/interfaces/index.ts
index 81d12ec4a..050647bea 100644
--- a/src/services/wallets/interfaces/index.ts
+++ b/src/services/wallets/interfaces/index.ts
@@ -188,6 +188,7 @@ export interface SigningPayload {
}
export interface SerializedPSBTEnvelop {
+ mfp: string;
xfp: string;
signerType: SignerType;
serializedPSBT: string;
diff --git a/src/services/wallets/interfaces/vault.ts b/src/services/wallets/interfaces/vault.ts
index 9d9afb5f9..c92b17a05 100644
--- a/src/services/wallets/interfaces/vault.ts
+++ b/src/services/wallets/interfaces/vault.ts
@@ -2,6 +2,7 @@ import { InheritanceKeyInfo, SignerPolicy } from 'src/models/interfaces/Assisted
import { BIP85Config, Balances, Transaction, UTXO } from '.';
import {
EntityKind,
+ MultisigScriptType,
NetworkType,
ScriptTypes,
SignerStorage,
@@ -11,6 +12,7 @@ import {
} from '../enums';
import { AddressCache, AddressPubs, WalletPresentationData } from './wallet';
+import { KeyInfo, KeyInfoMap, Path, Phase } from '../operations/miniscript/policy-generator';
export interface VaultPresentationData extends WalletPresentationData {}
@@ -31,9 +33,35 @@ export interface VaultSpecs {
lastSynched: number; // vault's last sync timestamp
}
+export interface MiniscriptElements {
+ keysInfo: KeyInfo[]; // identifier and key descriptor
+ timelocks: number[]; // timelocks
+ phases: Phase[]; // structure for generating miniscript policy
+ signerFingerprints: { [identifier: string]: string }; // miniscript signer key_identifier <> MFP
+}
+
+export interface MiniscriptTxSelectedSatisfier {
+ selectedPhase: Phase;
+ selectedPaths: Path[];
+ selectedScriptWitness: {
+ asm: string;
+ nLockTime?: number;
+ nSequence?: number;
+ };
+}
+
+export interface MiniscriptScheme {
+ miniscriptElements: MiniscriptElements;
+ keyInfoMap: KeyInfoMap;
+ miniscriptPolicy: string; // miniscript policy
+ miniscript: string; // miniscript
+}
+
export interface VaultScheme {
m: number; // threshold number of signatures required
n: number; // total number of xpubs
+ multisigScriptType?: MultisigScriptType; // multisig script type(allows for more complex and flexible vaults)
+ miniscriptScheme?: MiniscriptScheme;
}
export type XpubDetailsType = {
@@ -62,6 +90,7 @@ export interface Signer {
// Represents a h/w or s/w wallet(Signer)
// Rel: Signer hosts multiple VaultSigners(key), diff derivation paths
// Note: Assisted Keys(IKS and SS) can only have one key(VaultSigner) per Signer
+ id: string;
type: SignerType;
storageType: SignerStorage;
isMock?: boolean;
@@ -117,3 +146,11 @@ export interface Vault {
scriptType: ScriptTypes;
receivingAddress?: string;
}
+
+export interface MultisigConfig {
+ multisigScriptType: MultisigScriptType;
+ childIndex: number;
+ internal: boolean;
+ required?: number;
+ miniscriptScheme?: MiniscriptScheme;
+}
diff --git a/src/services/wallets/operations/descriptors/checksum.ts b/src/services/wallets/operations/descriptors/checksum.ts
new file mode 100644
index 000000000..3f79be42f
--- /dev/null
+++ b/src/services/wallets/operations/descriptors/checksum.ts
@@ -0,0 +1,53 @@
+/* eslint-disable no-bitwise */
+// Converted to Javascript by Jose-Luis Landabaso, 2023 - https://bitcoinerlab.com
+// Source: https://github.com/bitcoin/bitcoin/blob/master/src/script/descriptor.cpp
+// Distributed under the MIT software license
+const PolyMod = (c: bigint, val: bigint): bigint => {
+ const c0: bigint = c >> 35n;
+ c = ((c & 0x7ffffffffn) << 5n) ^ val;
+ if (c0 & 1n) c ^= 0xf5dee51989n;
+ if (c0 & 2n) c ^= 0xa9fdca3312n;
+ if (c0 & 4n) c ^= 0x1bab10e32dn;
+ if (c0 & 8n) c ^= 0x3706b1677an;
+ if (c0 & 16n) c ^= 0x644d626ffdn;
+ return c;
+};
+
+export const CHECKSUM_CHARSET: string = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
+
+/**
+ * Implements the Bitcoin descriptor's checksum algorithm described in
+ * {@link https://github.com/bitcoin/bitcoin/blob/master/src/script/descriptor.cpp}
+ */
+export const DescriptorChecksum = (span: string): string => {
+ const INPUT_CHARSET =
+ '0123456789()[],\'/*abcdefgh@:$%{}IJKLMNOPQRSTUVWXYZ&+-.;<=>?!^_|~ijklmnopqrstuvwxyzABCDEFGH`#"\\ ';
+
+ let c: bigint = 1n;
+ let cls: bigint = 0n;
+ let clscount: bigint = 0n;
+ for (const ch of span as string) {
+ const pos: bigint = BigInt(INPUT_CHARSET.indexOf(ch));
+ if (pos === -1n) return '';
+ c = PolyMod(c, pos & 31n);
+ cls = cls * 3n + (pos >> 5n);
+ if (++clscount === 3n) {
+ c = PolyMod(c, cls);
+ cls = 0n;
+ clscount = 0n;
+ }
+ }
+ if (clscount > 0n) c = PolyMod(c, cls);
+ for (let j: number = 0; j < 8; ++j) c = PolyMod(c, 0n);
+ c ^= 1n;
+
+ let ret: string = '';
+ for (let j = 0; j < 8; ++j) {
+ const index = (c >> (5n * (7n - BigInt(j)))) & 31n;
+ if (index < 0 || index > Number.MAX_SAFE_INTEGER) {
+ throw new Error(`Error: could not compute checksum, invalid index ${index}`);
+ }
+ ret += CHECKSUM_CHARSET[Number(index)];
+ }
+ return ret;
+};
diff --git a/src/services/wallets/operations/index.ts b/src/services/wallets/operations/index.ts
index 4e39ab792..8357f75f5 100644
--- a/src/services/wallets/operations/index.ts
+++ b/src/services/wallets/operations/index.ts
@@ -38,15 +38,27 @@ import {
BIP48ScriptTypes,
DerivationPurpose,
EntityKind,
+ MultisigScriptType,
NetworkType,
ScriptTypes,
SignerType,
TransactionType,
TxPriority,
+ VaultType,
} from '../enums';
-import { Signer, Vault, VaultSigner, VaultSpecs } from '../interfaces/vault';
+import {
+ MiniscriptScheme,
+ MiniscriptTxSelectedSatisfier,
+ Signer,
+ Vault,
+ VaultSigner,
+ VaultSpecs,
+} from '../interfaces/vault';
import { AddressCache, AddressPubs, Wallet, WalletSpecs } from '../interfaces/wallet';
import WalletUtilities from './utils';
+import { generateScriptWitnesses } from './miniscript/miniscript';
+import { Phase } from './miniscript/policy-generator';
+import { getKeyUID } from 'src/utils/utilities';
bitcoinJS.initEccLib(ecc);
const ECPair = ECPairFactory(ecc);
@@ -126,17 +138,23 @@ const updateOutputsForFeeCalculation = (outputs, network) => {
};
export default class WalletOperations {
- public static getExternalAddressAtIdx = (wallet: Wallet | Vault, index: number): string => {
+ public static getExternalInternalAddressAtIdx = (
+ wallet: Wallet | Vault,
+ index: number,
+ isInternal: boolean = false
+ ): string => {
let receivingAddress;
const { entityKind, specs, networkType } = wallet;
const network = WalletUtilities.getNetworkByType(networkType);
- const cached = idx(specs, (_) => _.addresses.external[index]); // address cache hit
+ const cached = isInternal
+ ? idx(specs, (_) => _.addresses.internal[index])
+ : idx(specs, (_) => _.addresses.external[index]); // address cache hit
if (cached) return cached;
if ((wallet as Vault).isMultiSig) {
// case: multi-sig vault
- receivingAddress = WalletUtilities.createMultiSig(wallet as Vault, index, false).address;
+ receivingAddress = WalletUtilities.createMultiSig(wallet as Vault, index, isInternal).address;
} else {
// case: single-sig vault/wallet
const xpub =
@@ -152,7 +170,13 @@ export default class WalletOperations {
else if (wallet.scriptType === ScriptTypes.P2WSH) purpose = DerivationPurpose.BIP48;
}
- receivingAddress = WalletUtilities.getAddressByIndex(xpub, false, index, network, purpose);
+ receivingAddress = WalletUtilities.getAddressByIndex(
+ xpub,
+ isInternal,
+ index,
+ network,
+ purpose
+ );
}
return receivingAddress;
@@ -162,7 +186,7 @@ export default class WalletOperations {
wallet: Wallet | Vault
): { receivingAddress: string } => {
return {
- receivingAddress: WalletOperations.getExternalAddressAtIdx(
+ receivingAddress: WalletOperations.getExternalInternalAddressAtIdx(
wallet,
wallet.specs.nextFreeAddressIndex
),
@@ -362,7 +386,7 @@ export default class WalletOperations {
if ((wallet as Vault).isMultiSig) {
const multisig = WalletUtilities.createMultiSig(wallet as Vault, itr, false);
address = multisig.address;
- pubsToCache = multisig.orderPreservedPubkeys;
+ pubsToCache = multisig.orderPreservedPubkeys; // optional(currently not available for miniscript based vaults)
} else {
let xpub = null;
if (wallet.entityKind === EntityKind.VAULT) xpub = (wallet as Vault).specs.xpubs[0];
@@ -380,7 +404,7 @@ export default class WalletOperations {
}
addressCache.external[itr] = address;
- addressPubs[address] = pubsToCache.join('/');
+ if (pubsToCache) addressPubs[address] = pubsToCache.join('/');
}
externalAddresses[address] = itr;
@@ -399,7 +423,7 @@ export default class WalletOperations {
if ((wallet as Vault).isMultiSig) {
const multisig = WalletUtilities.createMultiSig(wallet as Vault, itr, true);
address = multisig.address;
- pubsToCache = multisig.orderPreservedPubkeys;
+ pubsToCache = multisig.orderPreservedPubkeys; // optional(currently not available for miniscript based vaults)
} else {
let xpub = null;
if (wallet.entityKind === EntityKind.VAULT) xpub = (wallet as Vault).specs.xpubs[0];
@@ -417,7 +441,7 @@ export default class WalletOperations {
}
addressCache.internal[itr] = address;
- addressPubs[address] = pubsToCache.join('/');
+ if (pubsToCache) addressPubs[address] = pubsToCache.join('/');
}
internalAddresses[address] = itr;
@@ -698,10 +722,7 @@ export default class WalletOperations {
if (selectedUTXOs && selectedUTXOs.length) {
inputUTXOs = selectedUTXOs;
} else {
- inputUTXOs =
- wallet.networkType === NetworkType.MAINNET
- ? wallet.specs.confirmedUTXOs
- : [...wallet.specs.confirmedUTXOs, ...wallet.specs.unconfirmedUTXOs];
+ inputUTXOs = [...wallet.specs.confirmedUTXOs, ...wallet.specs.unconfirmedUTXOs];
}
inputUTXOs = updateInputsForFeeCalculation(wallet, inputUTXOs);
@@ -776,10 +797,7 @@ export default class WalletOperations {
if (selectedUTXOs && selectedUTXOs.length) {
inputUTXOs = selectedUTXOs;
} else {
- inputUTXOs =
- wallet.networkType === NetworkType.MAINNET
- ? wallet.specs.confirmedUTXOs
- : [...wallet.specs.confirmedUTXOs, ...wallet.specs.unconfirmedUTXOs];
+ inputUTXOs = [...wallet.specs.confirmedUTXOs, ...wallet.specs.unconfirmedUTXOs];
}
inputUTXOs = updateInputsForFeeCalculation(wallet, inputUTXOs);
@@ -936,10 +954,7 @@ export default class WalletOperations {
if (selectedUTXOs && selectedUTXOs.length) {
inputUTXOs = selectedUTXOs;
} else {
- inputUTXOs =
- wallet.networkType === NetworkType.MAINNET
- ? wallet.specs.confirmedUTXOs
- : [...wallet.specs.confirmedUTXOs, ...wallet.specs.unconfirmedUTXOs];
+ inputUTXOs = [...wallet.specs.confirmedUTXOs, ...wallet.specs.unconfirmedUTXOs];
}
inputUTXOs = updateInputsForFeeCalculation(wallet, inputUTXOs);
@@ -1005,11 +1020,74 @@ export default class WalletOperations {
};
};
+ static getSelectedSatisfier = (
+ miniscriptScheme: MiniscriptScheme,
+ miniscriptTxElements: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ }
+ ): MiniscriptTxSelectedSatisfier => {
+ const { selectedPhase: selectedPhaseId, selectedPaths: selectedPathsId } = miniscriptTxElements;
+
+ let selectedPhase: Phase;
+ for (let phase of miniscriptScheme.miniscriptElements.phases) {
+ if (phase.id === selectedPhaseId) {
+ selectedPhase = phase;
+ break;
+ }
+ }
+ if (selectedPathsId.length < selectedPhase.requiredPaths) {
+ throw new Error('Insufficient paths selected for the given phase');
+ }
+
+ const { scriptWitnesses } = generateScriptWitnesses(miniscriptScheme.miniscriptPolicy);
+
+ const hasTimelock = !!selectedPhase.timelock;
+ let witnessesInSelectedPhase: {
+ asm: string;
+ nLockTime?: number;
+ nSequence?: number;
+ }[] = [];
+ for (let scriptWitness of scriptWitnesses) {
+ if (hasTimelock) {
+ if (scriptWitness.nLockTime === selectedPhase.timelock) {
+ witnessesInSelectedPhase.push(scriptWitness);
+ }
+ } else {
+ if (!scriptWitness.nLockTime) {
+ witnessesInSelectedPhase.push(scriptWitness);
+ }
+ }
+ }
+
+ // Generate selectedPaths array based on selectedPathsId
+ const selectedPaths = selectedPathsId
+ .map((pathId) => selectedPhase.paths.find((path) => path.id === pathId))
+ .filter((path) => path !== undefined);
+
+ // Generate the script witness based on selected paths
+ const selectedScriptWitness = witnessesInSelectedPhase.find((witness) => {
+ return selectedPaths.every((path) => {
+ const presentKeys = path.keys.filter((key) =>
+ witness.asm.includes(key.uniqueKeyIdentifier)
+ );
+ return presentKeys.length >= path.threshold;
+ });
+ });
+
+ if (!selectedScriptWitness) {
+ throw new Error('No matching script witness found for the selected paths');
+ }
+
+ return { selectedPhase, selectedPaths, selectedScriptWitness };
+ };
+
static addInputToPSBT = (
PSBT: bitcoinJS.Psbt,
wallet: Wallet | Vault,
input: InputUTXOs,
network: bitcoinJS.networks.Network,
+ miniscriptSelectedSatisfier?: MiniscriptTxSelectedSatisfier,
derivationPurpose: DerivationPurpose = DerivationPurpose.BIP84,
scriptType: BIP48ScriptTypes = BIP48ScriptTypes.NATIVE_SEGWIT
) => {
@@ -1084,20 +1162,53 @@ export default class WalletOperations {
}
}
} else {
- const { p2ms, p2wsh, p2sh, subPath, signerPubkeyMap } = WalletUtilities.addressToMultiSig(
+ const { p2wsh, p2sh, subPaths, signerPubkeyMap } = WalletUtilities.addressToMultiSig(
input.address,
wallet as Vault
);
+ let hasTimelock = false;
const bip32Derivation = [];
- for (const signer of (wallet as Vault).signers) {
- const masterFingerprint = Buffer.from(signer.masterFingerprint, 'hex');
- const path = `${signer.derivationPath}/${subPath.join('/')}`;
- bip32Derivation.push({
- masterFingerprint,
- path: path.replaceAll('h', "'"),
- pubkey: signerPubkeyMap.get(signer.xpub),
- });
+ const multisigScriptType =
+ (wallet as Vault).scheme.multisigScriptType || MultisigScriptType.DEFAULT_MULTISIG;
+
+ if (multisigScriptType === MultisigScriptType.DEFAULT_MULTISIG) {
+ for (const signer of (wallet as Vault).signers) {
+ const masterFingerprint = Buffer.from(signer.masterFingerprint, 'hex');
+ const path = `${signer.derivationPath}/${subPaths[signer.xpub].join('/')}`;
+ bip32Derivation.push({
+ masterFingerprint,
+ path: path.replaceAll('h', "'"),
+ pubkey: signerPubkeyMap.get(signer.xpub),
+ });
+ }
+ } else if (multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ const { miniscriptScheme } = (wallet as Vault).scheme;
+ if (!miniscriptScheme) throw new Error('Miniscript scheme is missing');
+ if (!miniscriptSelectedSatisfier) throw new Error('Miniscript satisfier missing');
+
+ const { keyInfoMap } = miniscriptScheme;
+ const { selectedPhase, selectedPaths } = miniscriptSelectedSatisfier;
+ hasTimelock = !!selectedPhase;
+
+ for (const path of selectedPaths) {
+ for (const key of path.keys) {
+ const keyDescriptor = keyInfoMap[key.uniqueKeyIdentifier];
+
+ const fragments = keyDescriptor.split('/');
+ const masterFingerprint = fragments[0].slice(1);
+ const multipathIndex = fragments[5];
+ const [script_type, xpub] = fragments[4].split(']');
+
+ const xpubPath = `m/${fragments[1]}/${fragments[2]}/${fragments[3]}/${script_type}`;
+ const path = `${xpubPath}/${subPaths[xpub + multipathIndex].join('/')}`;
+ bip32Derivation.push({
+ masterFingerprint: Buffer.from(masterFingerprint, 'hex'),
+ path: path.replaceAll('h', "'"),
+ pubkey: signerPubkeyMap.get(xpub + multipathIndex),
+ });
+ }
+ }
}
if (scriptType === BIP48ScriptTypes.NATIVE_SEGWIT) {
@@ -1109,7 +1220,8 @@ export default class WalletOperations {
script: p2wsh.output,
value: input.value,
},
- witnessScript: p2ms.output,
+ witnessScript: p2wsh.redeem.output,
+ sequence: hasTimelock ? 4294967294 : null, // to enable nLockTime the value should be less than 4294967295
});
} else if (scriptType === BIP48ScriptTypes.WRAPPED_SEGWIT) {
PSBT.addInput({
@@ -1121,7 +1233,8 @@ export default class WalletOperations {
value: input.value,
},
redeemScript: p2wsh.output,
- witnessScript: p2ms.output,
+ witnessScript: p2wsh.redeem.output,
+ sequence: hasTimelock ? 4294967294 : null, // to enable nLockTime the value should be less than 4294967295
});
}
}
@@ -1130,12 +1243,11 @@ export default class WalletOperations {
static getPSBTDataForChangeOutput = (
wallet: Vault,
changeMultiSig: {
- p2ms: bitcoinJS.payments.Payment;
p2wsh: bitcoinJS.payments.Payment;
p2sh: bitcoinJS.payments.Payment;
pubkeys: Buffer[];
address: string;
- subPath: number[];
+ subPaths: { [xpub: string]: number[] };
signerPubkeyMap: Map;
}
): {
@@ -1144,17 +1256,43 @@ export default class WalletOperations {
witnessScript: Buffer;
} => {
const bip32Derivation = []; // array per each pubkey thats gona be used
- const { subPath, p2wsh, p2ms, signerPubkeyMap } = changeMultiSig;
- for (const signer of wallet.signers) {
- const masterFingerprint = Buffer.from(signer.masterFingerprint, 'hex');
- const path = `${signer.derivationPath}/${subPath.join('/')}`;
- bip32Derivation.push({
- masterFingerprint,
- path,
- pubkey: signerPubkeyMap.get(signer.xpub),
- });
+ const { subPaths, p2wsh, signerPubkeyMap } = changeMultiSig;
+
+ const multisigScriptType =
+ (wallet as Vault).scheme.multisigScriptType || MultisigScriptType.DEFAULT_MULTISIG;
+ if (multisigScriptType === MultisigScriptType.DEFAULT_MULTISIG) {
+ for (const signer of (wallet as Vault).signers) {
+ const masterFingerprint = Buffer.from(signer.masterFingerprint, 'hex');
+ const path = `${signer.derivationPath}/${subPaths[signer.xpub].join('/')}`;
+ bip32Derivation.push({
+ masterFingerprint,
+ path: path.replaceAll('h', "'"),
+ pubkey: signerPubkeyMap.get(signer.xpub),
+ });
+ }
+ } else if (multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ const { miniscriptScheme } = (wallet as Vault).scheme;
+ if (!miniscriptScheme) throw new Error('Miniscript scheme is missing');
+
+ const { keyInfoMap } = miniscriptScheme;
+
+ for (let keyIdentifier in keyInfoMap) {
+ const fragments = keyInfoMap[keyIdentifier].split('/');
+ const masterFingerprint = fragments[0].slice(1);
+ const multipathIndex = fragments[5];
+ const [script_type, xpub] = fragments[4].split(']');
+
+ const xpubPath = `m/${fragments[1]}/${fragments[2]}/${fragments[3]}/${script_type}`;
+ const path = `${xpubPath}/${subPaths[xpub + multipathIndex].join('/')}`;
+ bip32Derivation.push({
+ masterFingerprint: Buffer.from(masterFingerprint, 'hex'),
+ path: path.replaceAll('h', "'"),
+ pubkey: signerPubkeyMap.get(xpub + multipathIndex),
+ });
+ }
}
- return { bip32Derivation, redeemScript: p2wsh.output, witnessScript: p2ms.output };
+
+ return { bip32Derivation, redeemScript: p2wsh.output, witnessScript: p2wsh.redeem.output };
};
static createTransaction = async (
@@ -1162,12 +1300,16 @@ export default class WalletOperations {
txPrerequisites: TransactionPrerequisite,
txnPriority: string,
customTxPrerequisites?: TransactionPrerequisite,
- scriptType?: BIP48ScriptTypes
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ }
): Promise<{
PSBT: bitcoinJS.Psbt;
inputs: InputUTXOs[];
outputs: OutputUTXOs[];
change: string;
+ miniscriptSelectedSatisfier?: MiniscriptTxSelectedSatisfier;
}> => {
try {
let inputs;
@@ -1193,8 +1335,27 @@ export default class WalletOperations {
);
}
+ let miniscriptSelectedSatisfier: MiniscriptTxSelectedSatisfier;
+ if (wallet.entityKind === EntityKind.VAULT) {
+ const { miniscriptScheme } = (wallet as Vault).scheme;
+ if (miniscriptScheme) {
+ miniscriptSelectedSatisfier = WalletOperations.getSelectedSatisfier(
+ // note: for Timelocked vault the selectedScriptWitness(which defaults to first) remains irrelevant and the witness script selection happens during input finalisation
+ miniscriptScheme,
+ miniscriptTxElements
+ );
+ }
+ }
+
for (const input of inputs) {
- this.addInputToPSBT(PSBT, wallet, input, network, derivationPurpose, scriptType);
+ this.addInputToPSBT(
+ PSBT,
+ wallet,
+ input,
+ network,
+ miniscriptSelectedSatisfier,
+ derivationPurpose
+ );
}
const {
@@ -1247,11 +1408,20 @@ export default class WalletOperations {
} else PSBT.addOutput(output);
}
+ // set locktime
+ if (wallet.entityKind === EntityKind.VAULT && miniscriptSelectedSatisfier) {
+ const { selectedScriptWitness } = miniscriptSelectedSatisfier;
+ if (selectedScriptWitness.nLockTime) {
+ PSBT.setLocktime(selectedScriptWitness.nLockTime);
+ }
+ }
+
return {
PSBT,
inputs,
outputs,
change,
+ miniscriptSelectedSatisfier,
};
} catch (err) {
throw new Error(`Transaction creation failed: ${err.message}`);
@@ -1294,34 +1464,37 @@ export default class WalletOperations {
static internallySignVaultPSBT = (
wallet: Vault,
- inputs: any,
serializedPSBT: string,
- xpriv: string,
- isRemoteKey?: boolean
+ signer: VaultSigner
): { signedSerializedPSBT: string } => {
try {
const network = WalletUtilities.getNetworkByType(wallet.networkType);
const PSBT = bitcoinJS.Psbt.fromBase64(serializedPSBT, { network: config.NETWORK });
let vin = 0;
- for (const input of inputs) {
- let internal;
- let index;
- if (isRemoteKey) {
- // getting internal and index from psbt inputs
- const res = input.bip32Derivation[0].path.split('/');
- internal = parseInt(res[res.length - 2]);
- index = parseInt(res[res.length - 1]);
- } else if (input.subPath) {
- const [, j, k] = input.subPath.split('/');
- internal = parseInt(j);
- index = parseInt(k);
- } else {
- const { subPath } = WalletUtilities.getSubPathForAddress(input.address, wallet);
- [internal, index] = subPath;
+ for (const { bip32Derivation } of PSBT.data.inputs) {
+ if (!bip32Derivation) {
+ throw new Error('Failed to sign internally - missing bip32 derivation');
}
+ let subPath;
- const keyPair = WalletUtilities.getKeyPairByIndex(xpriv, !!internal, index, network);
+ for (let { masterFingerprint, path } of bip32Derivation) {
+ if (masterFingerprint.toString('hex').toUpperCase() === signer.masterFingerprint) {
+ const pathFragments = path.split('/');
+ const chainIndex = parseInt(pathFragments[pathFragments.length - 2], 10); // multipath external/internal chain index
+ const childIndex = parseInt(pathFragments[pathFragments.length - 1], 10);
+ subPath = [chainIndex, childIndex];
+ break;
+ }
+ }
+ if (!subPath) throw new Error('Failed to sign internally - missing subpath');
+
+ const keyPair = WalletUtilities.getKeyPairByIndex(
+ signer.xpriv,
+ subPath[0],
+ subPath[1],
+ network
+ );
PSBT.signInput(vin, keyPair);
vin++;
}
@@ -1351,16 +1524,15 @@ export default class WalletOperations {
serializedPSBTEnvelop: SerializedPSBTEnvelop;
} => {
const signingPayload: SigningPayload[] = [];
- const signer = signerMap[vaultKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(vaultKey)];
const payloadTarget = signer.type;
let isSigned = false;
if (signer.isMock && vaultKey.xpriv) {
// case: if the signer is mock and has an xpriv attached to it, we'll sign the PSBT right away
const { signedSerializedPSBT } = WalletOperations.internallySignVaultPSBT(
wallet,
- inputs,
PSBT.toBase64(),
- vaultKey.xpriv
+ vaultKey
);
PSBT = bitcoinJS.Psbt.fromBase64(signedSerializedPSBT, { network: config.NETWORK });
isSigned = true;
@@ -1375,21 +1547,48 @@ export default class WalletOperations {
for (let inputIndex = 0; inputIndex < inputs.length; inputIndex++) {
let publicKey;
let subPath;
- if (wallet.isMultiSig) {
- const multisigAddress = WalletUtilities.addressToMultiSig(
- inputs[inputIndex].address,
- wallet
- );
- publicKey = multisigAddress.signerPubkeyMap.get(vaultKey.xpub);
- subPath = multisigAddress.subPath;
- } else {
- const singlesigAddress = WalletUtilities.addressToPublicKey(
- inputs[inputIndex].address,
- wallet
- );
- publicKey = singlesigAddress.publicKey;
- subPath = singlesigAddress.subPath;
+
+ const multisigScriptType =
+ (wallet as Vault).scheme.multisigScriptType || MultisigScriptType.DEFAULT_MULTISIG;
+
+ if (multisigScriptType === MultisigScriptType.DEFAULT_MULTISIG) {
+ if (wallet.isMultiSig) {
+ const multisigAddress = WalletUtilities.addressToMultiSig(
+ inputs[inputIndex].address,
+ wallet
+ );
+
+ publicKey = multisigAddress.signerPubkeyMap.get(vaultKey.xpub);
+ subPath = multisigAddress.subPaths[vaultKey.xpub];
+ } else {
+ const singlesigAddress = WalletUtilities.addressToPublicKey(
+ inputs[inputIndex].address,
+ wallet
+ );
+ publicKey = singlesigAddress.publicKey;
+ subPath = singlesigAddress.subPath;
+ }
+ } else if (multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ const { miniscriptScheme } = (wallet as Vault).scheme;
+ if (!miniscriptScheme) throw new Error('Miniscript scheme is missing');
+
+ for (const { bip32Derivation } of PSBT.data.inputs) {
+ for (let { masterFingerprint, path, pubkey } of bip32Derivation) {
+ if (masterFingerprint.toString('hex').toUpperCase() === signer.masterFingerprint) {
+ const pathFragments = path.split('/');
+ const chainIndex = parseInt(pathFragments[pathFragments.length - 2], 10); // multipath external/internal chain index
+ const childIndex = parseInt(pathFragments[pathFragments.length - 1], 10);
+ subPath = [chainIndex, childIndex];
+ publicKey = pubkey;
+ break;
+ }
+ }
+ if (publicKey) break;
+ }
}
+
+ if (!publicKey) throw new Error('Failed to generate payload, missing pubkey');
+
const { hash, sighashType } = PSBT.getDigestToSign(inputIndex, publicKey);
inputsToSign.push({
digest: hash.toString('hex'),
@@ -1431,6 +1630,7 @@ export default class WalletOperations {
const serializedPSBT = PSBT.toBase64();
const serializedPSBTEnvelop: SerializedPSBTEnvelop = {
+ mfp: vaultKey.masterFingerprint,
xfp: vaultKey.xfp,
signerType: signer.type,
serializedPSBT,
@@ -1489,8 +1689,9 @@ export default class WalletOperations {
);
if (balance < outgoingAmount + fee) throw new Error('Insufficient balance');
- if (txPrerequisites && Object.keys(txPrerequisites).length)
+ if (txPrerequisites && Object.keys(txPrerequisites).length) {
return { txRecipients, txPrerequisites };
+ }
throw new Error('Unable to create transaction: inputs failed at coinselect');
};
@@ -1504,7 +1705,11 @@ export default class WalletOperations {
amount: number;
}[],
customTxPrerequisites?: TransactionPrerequisite,
- signerMap?: { [key: string]: Signer }
+ signerMap?: { [key: string]: Signer },
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ }
): Promise<
| {
serializedPSBTEnvelops: SerializedPSBTEnvelop[];
@@ -1519,12 +1724,14 @@ export default class WalletOperations {
finalOutputs: bitcoinJS.TxOutput[];
}
> => {
- const { PSBT, inputs, outputs, change } = await WalletOperations.createTransaction(
- wallet,
- txPrerequisites,
- txnPriority,
- customTxPrerequisites
- );
+ const { PSBT, inputs, outputs, change, miniscriptSelectedSatisfier } =
+ await WalletOperations.createTransaction(
+ wallet,
+ txPrerequisites,
+ txnPriority,
+ customTxPrerequisites,
+ miniscriptTxElements
+ );
if (wallet.entityKind === EntityKind.VAULT) {
// case: vault(single/multi-sig)
@@ -1536,6 +1743,31 @@ export default class WalletOperations {
});
for (const vaultKey of vaultKeys) {
+ // generate signing payload
+
+ if (
+ (wallet as Vault).scheme.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG &&
+ miniscriptSelectedSatisfier
+ ) {
+ // only generate signing payload for the signers in the selected path
+ const { selectedPaths } = miniscriptSelectedSatisfier;
+ const { miniscriptElements } = (wallet as Vault).scheme.miniscriptScheme;
+ const { signerFingerprints } = miniscriptElements;
+
+ let pathSigner = false;
+ for (let path of selectedPaths) {
+ for (let key of path.keys) {
+ if (vaultKey.masterFingerprint === signerFingerprints[key.identifier]) {
+ pathSigner = true;
+ break;
+ }
+ }
+ if (pathSigner) break;
+ }
+
+ if (!pathSigner) continue; // skip generating payload for this signer
+ }
+
const { serializedPSBTEnvelop } = WalletOperations.signVaultTransaction(
wallet as Vault,
inputs,
@@ -1578,7 +1810,11 @@ export default class WalletOperations {
txPrerequisites: TransactionPrerequisite,
txnPriority: TxPriority,
customTxPrerequisites?: TransactionPrerequisite,
- txHex?: string
+ txHex?: string,
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ }
): Promise<{
txid: string;
finalOutputs: bitcoinJS.TxOutput[];
@@ -1621,7 +1857,43 @@ export default class WalletOperations {
// if (!areSignaturesValid) throw new Error('Failed to broadcast: invalid signatures');
// finalise and construct the txHex
- const tx = combinedPSBT.finalizeAllInputs();
+ let tx;
+ if (wallet.entityKind === EntityKind.VAULT) {
+ const { multisigScriptType, miniscriptScheme } = (wallet as Vault).scheme;
+ if (multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ if (!miniscriptScheme) throw new Error('miniscriptScheme missing for vault');
+
+ const { scriptWitnesses } = generateScriptWitnesses(miniscriptScheme.miniscriptPolicy);
+ let selectedScriptWitness: {
+ asm: string;
+ nLockTime?: number;
+ nSequence?: number;
+ };
+
+ const vaultsWithTimelock = [VaultType.TIMELOCKED, VaultType.INHERITANCE]; // m-of-n style miniscript vaults w/ timelock
+ if (!vaultsWithTimelock.includes((wallet as Vault).type)) {
+ // scriptwitness selection for TIMELOCKED/INHERITANCE vault is done using the available partial signatures(simplifies UX)
+ const miniscriptSelectedSatisfier = WalletOperations.getSelectedSatisfier(
+ miniscriptScheme,
+ miniscriptTxElements
+ );
+ selectedScriptWitness = miniscriptSelectedSatisfier.selectedScriptWitness;
+ }
+
+ for (let index = 0; index < combinedPSBT.txInputs.length; index++) {
+ combinedPSBT.finalizeInput(
+ index,
+ WalletUtilities.getFinalScriptsForMyCustomScript(
+ scriptWitnesses,
+ selectedScriptWitness,
+ miniscriptScheme.keyInfoMap
+ )
+ );
+ }
+ tx = combinedPSBT;
+ } else tx = combinedPSBT.finalizeAllInputs();
+ } else tx = combinedPSBT.finalizeAllInputs();
+
finalOutputs = tx.txOutputs;
txHex = tx.extractTransaction().toHex();
}
diff --git a/src/services/wallets/operations/miniscript/default/AssistedVault.ts b/src/services/wallets/operations/miniscript/default/AssistedVault.ts
new file mode 100644
index 000000000..9c46813cc
--- /dev/null
+++ b/src/services/wallets/operations/miniscript/default/AssistedVault.ts
@@ -0,0 +1,119 @@
+import { getDerivationPath } from 'src/utils/service-utilities/utils';
+import { MiniscriptElements, VaultSigner } from '../../../interfaces/vault';
+import { KeyInfo, Phase } from '../policy-generator';
+
+export const ASSISTED_VAULT_TIMELOCKS_TESTNET = {
+ T1: 15,
+ T2: 15 + 10,
+};
+
+export const ASSISTED_VAULT_TIMELOCKS = {
+ T1: 118080,
+ T2: 118080 + 4320,
+};
+
+// contains the defaults for the Assisted Vault
+// these elements are to be provided by the generic user-interface for the miniscript based vaults
+export function generateAssistedVaultElements(
+ signers: VaultSigner[],
+ timelocks: number[]
+): MiniscriptElements {
+ if (signers.length !== 3) throw new Error('Invalid singer count for the Advisor Vault(default)');
+
+ enum Identifiers { // these key identifiers/alias should be provided by the user via the interface
+ UK = 'UK',
+ AK1 = 'AK1',
+ AK2 = 'AK2',
+ }
+ const [user, advisor1, advisor2] = signers;
+
+ const keysInfo: KeyInfo[] = [
+ {
+ identifier: Identifiers.UK,
+ descriptor: `[${user.masterFingerprint}/${getDerivationPath(user.derivationPath)}]${
+ user.xpub
+ }`,
+ },
+ {
+ identifier: Identifiers.AK1,
+ descriptor: `[${advisor1.masterFingerprint}/${getDerivationPath(advisor1.derivationPath)}]${
+ advisor1.xpub
+ }`,
+ },
+ {
+ identifier: Identifiers.AK2,
+ descriptor: `[${advisor2.masterFingerprint}/${getDerivationPath(advisor2.derivationPath)}]${
+ advisor2.xpub
+ }`,
+ },
+ ];
+
+ const signerFingerprints = {
+ [Identifiers.UK]: user.masterFingerprint,
+ [Identifiers.AK1]: advisor1.masterFingerprint,
+ [Identifiers.AK2]: advisor2.masterFingerprint,
+ };
+
+ const [timelock1, timelock2] = timelocks;
+ const { userKey, advisorKey1, advisorKey2 } = keysInfo.reduce(
+ (acc: Record, key) => {
+ switch (key.identifier) {
+ case Identifiers.UK:
+ acc.userKey = key;
+ break;
+ case Identifiers.AK1:
+ acc.advisorKey1 = key;
+ break;
+ case Identifiers.AK2:
+ acc.advisorKey2 = key;
+ break;
+ default:
+ throw new Error(`Unknown key identifier: ${key.identifier}`);
+ }
+ return acc;
+ },
+ {}
+ );
+
+ const phases: Phase[] = [
+ {
+ id: 1,
+ timelock: 0,
+ paths: [
+ { id: 1, threshold: 2, keys: [userKey, advisorKey1] },
+ { id: 2, threshold: 2, keys: [userKey, advisorKey2] },
+ ],
+ requiredPaths: 1,
+ },
+ // {
+ // id: 1, // phase1: alternate(optimized) arrangement, to be tested post generalized flow
+ // timelock: 0,
+ // paths: [
+ // { id: 1, threshold: 1, keys: [userKey] },
+ // { id: 2, threshold: 1, keys: [advisorKey1, advisorKey2] },
+ // ],
+ // requiredPaths: 2,
+ // },
+ {
+ id: 2,
+ timelock: timelock1,
+ paths: [{ id: 1, threshold: 1, keys: [userKey] }],
+ requiredPaths: 1,
+ },
+ {
+ id: 3,
+ timelock: timelock2,
+ paths: [{ id: 1, threshold: 2, keys: [advisorKey1, advisorKey2] }],
+ requiredPaths: 1,
+ },
+ ];
+
+ const miniscriptElements = {
+ keysInfo,
+ timelocks,
+ phases,
+ signerFingerprints,
+ };
+
+ return miniscriptElements;
+}
diff --git a/src/services/wallets/operations/miniscript/default/InheritanceVault.ts b/src/services/wallets/operations/miniscript/default/InheritanceVault.ts
new file mode 100644
index 000000000..cc1a69010
--- /dev/null
+++ b/src/services/wallets/operations/miniscript/default/InheritanceVault.ts
@@ -0,0 +1,102 @@
+import { getDerivationPath } from 'src/utils/service-utilities/utils';
+import { MiniscriptElements, VaultScheme, VaultSigner } from '../../../interfaces/vault';
+import { KeyInfo, Phase } from '../policy-generator';
+
+export const INHERITANCE_VAULT_TIMELOCKS_TESTNET = {
+ MONTHS_3: 3,
+ MONTHS_6: 6,
+ MONTHS_12: 12,
+ MONTHS_18: 18,
+ MONTHS_24: 24,
+};
+
+export const INHERITANCE_VAULT_TIMELOCKS_MAINNET = {
+ MONTHS_3: 13140,
+ MONTHS_6: 26280,
+ MONTHS_12: 52560,
+ MONTHS_18: 78840,
+ MONTHS_24: 105120,
+};
+
+export const INHERITANCE_KEY1_IDENTIFIER = 'IK1';
+
+/**
+ * Generates the miniscript elements for the Inheritance Vault
+ *
+ * Miniscript Analysis(produced by the policy-lang generator based on the miniscript elements from the function below)
+ *
+ * or_d
+ * * multi(m of n)
+ * and_v
+ * * v: multi(m of n+1)
+ * * after(3493966)
+ *
+ * Resulting script structure(sample: 2 of 3 multisig w/ Inheritance)
+ *
+ * 2 > > > 3 OP_CHECKMULTISIG OP_IFDUP OP_NOTIF
+ * 2 > > > > 4 OP_CHECKMULTISIGVERIFY <4e5035>
+ * OP_CHECKLOCKTIMEVERIFY
+ * OP_ENDIF
+ */
+export function generateInheritanceVaultElements(
+ signers: VaultSigner[],
+ inheritanceSigner: VaultSigner,
+ scheme: VaultScheme,
+ timelocks: number[]
+): MiniscriptElements {
+ if (signers.length < 2) throw new Error('At least 2 signers are required for the Vault');
+ if (scheme.m > signers.length) {
+ throw new Error('Threshold (m) cannot be greater than the number of signers (n)');
+ }
+
+ const keysInfo: KeyInfo[] = signers.map((signer, index) => ({
+ identifier: `K${index + 1}`,
+ descriptor: `[${signer.masterFingerprint}/${getDerivationPath(signer.derivationPath)}]${
+ signer.xpub
+ }`,
+ }));
+
+ const inheritanceKeyInfo: KeyInfo = {
+ identifier: INHERITANCE_KEY1_IDENTIFIER,
+ descriptor: `[${inheritanceSigner.masterFingerprint}/${getDerivationPath(
+ inheritanceSigner.derivationPath
+ )}]${inheritanceSigner.xpub}`,
+ };
+
+ if (keysInfo.length !== scheme.n) throw new Error('Invalid inputs; scheme mismatch');
+
+ const signerFingerprints = Object.fromEntries(
+ [...signers, inheritanceSigner].map((signer, index) => [
+ index < signers.length ? `K${index + 1}` : INHERITANCE_KEY1_IDENTIFIER,
+ signer.masterFingerprint,
+ ])
+ );
+
+ const [timelock] = timelocks;
+
+ const phases: Phase[] = [
+ {
+ id: 1,
+ timelock: 0,
+ paths: [{ id: 1, threshold: scheme.m, keys: keysInfo }],
+ requiredPaths: 1,
+ probability: 9,
+ },
+ {
+ id: 2,
+ timelock,
+ paths: [{ id: 1, threshold: scheme.m, keys: [...keysInfo, inheritanceKeyInfo] }],
+ requiredPaths: 1,
+ probability: 1,
+ },
+ ];
+
+ const miniscriptElements = {
+ keysInfo: [...keysInfo, inheritanceKeyInfo],
+ timelocks,
+ phases,
+ signerFingerprints,
+ };
+
+ return miniscriptElements;
+}
diff --git a/src/services/wallets/operations/miniscript/default/TimelockedVault.ts b/src/services/wallets/operations/miniscript/default/TimelockedVault.ts
new file mode 100644
index 000000000..2cd096084
--- /dev/null
+++ b/src/services/wallets/operations/miniscript/default/TimelockedVault.ts
@@ -0,0 +1,61 @@
+import { getDerivationPath } from 'src/utils/service-utilities/utils';
+import { MiniscriptElements, VaultScheme, VaultSigner } from '../../../interfaces/vault';
+import { KeyInfo, Phase } from '../policy-generator';
+
+export const TIMELOCKED_VAULT_TIMELOCKS_TESTNET = {
+ MONTHS_3: 3,
+ MONTHS_6: 6,
+ MONTHS_12: 12,
+};
+
+export const TIMELOCKED_VAULT_TIMELOCKS_MAINNET = {
+ MONTHS_3: 13140,
+ MONTHS_6: 26280,
+ MONTHS_12: 52560,
+};
+
+// contains the defaults for the Timelocked Vault
+// these elements are to be provided by the generic user-interface for the miniscript based vaults
+export function generateTimelockedVaultElements(
+ signers: VaultSigner[],
+ scheme: VaultScheme,
+ timelocks: number[]
+): MiniscriptElements {
+ if (signers.length < 2) throw new Error('At least 2 signers are required for the Vault');
+ if (scheme.m > signers.length) {
+ throw new Error('Threshold (m) cannot be greater than the number of signers (n)');
+ }
+
+ const keysInfo: KeyInfo[] = signers.map((signer, index) => ({
+ identifier: `K${index + 1}`,
+ descriptor: `[${signer.masterFingerprint}/${getDerivationPath(signer.derivationPath)}]${
+ signer.xpub
+ }`,
+ }));
+
+ if (keysInfo.length !== scheme.n) throw new Error('Invalid inputs; scheme mismatch');
+
+ const signerFingerprints = Object.fromEntries(
+ signers.map((signer, index) => [`K${index + 1}`, signer.masterFingerprint])
+ );
+
+ const [timelock] = timelocks;
+
+ const phases: Phase[] = [
+ {
+ id: 1,
+ timelock,
+ paths: [{ id: 1, threshold: scheme.m, keys: keysInfo }],
+ requiredPaths: 1,
+ },
+ ];
+
+ const miniscriptElements = {
+ keysInfo,
+ timelocks,
+ phases,
+ signerFingerprints,
+ };
+
+ return miniscriptElements;
+}
diff --git a/src/services/wallets/operations/miniscript/miniscript.ts b/src/services/wallets/operations/miniscript/miniscript.ts
new file mode 100644
index 000000000..fbfb55aad
--- /dev/null
+++ b/src/services/wallets/operations/miniscript/miniscript.ts
@@ -0,0 +1,24 @@
+import { compilePolicy, compileMiniscript, satisfier } from '@bitcoinerlab/miniscript';
+
+export const generateMiniscript = (policy: string) => {
+ const { miniscript, asm, issane } = compilePolicy(policy);
+ if (!issane) throw new Error('Miniscript is not sane');
+ return { miniscript, asm, issane };
+};
+
+/*
+issane is a boolean that indicates whether the Miniscript is valid and follows the consensus
+and standardness rules for Bitcoin scripts. A sane Miniscript should have non-malleable solutions,
+not mix different timelock units on a single branch of the script, and not contain duplicate keys.
+In other words, it should be a well-formed and standards-compliant script that can be safely used in transactions.
+*/
+export const generateBitcoinScript = (miniscript: string) => {
+ const { asm, issane } = compileMiniscript(miniscript);
+ return { asm, issane };
+};
+
+export const generateScriptWitnesses = (policy: string) => {
+ const { miniscript } = compilePolicy(policy);
+ const { nonMalleableSats } = satisfier(miniscript);
+ return { scriptWitnesses: nonMalleableSats };
+};
diff --git a/src/services/wallets/operations/miniscript/policy-generator.ts b/src/services/wallets/operations/miniscript/policy-generator.ts
new file mode 100644
index 000000000..d58c2e80d
--- /dev/null
+++ b/src/services/wallets/operations/miniscript/policy-generator.ts
@@ -0,0 +1,151 @@
+import { generateScriptWitnesses } from './miniscript';
+
+export interface KeyInfo {
+ identifier: string;
+ descriptor: string;
+ uniqueKeyIdentifier?: string;
+}
+
+export interface KeyInfoMap {
+ [uniqueIdentifier: string]: string; // maps unique key identifiers to unique descriptors
+}
+
+export interface Path {
+ id: number;
+ keys: KeyInfo[];
+ threshold: number;
+}
+
+export interface Phase {
+ id: number;
+ timelock: number;
+ paths: Path[];
+ requiredPaths: number; // Number of paths required to satisfy the phase's threshold
+ probability?: number; // relative probability of the phase being executed
+ // Note: probability difference between phases needs to be of a certain threshold for script optimization by the compiler. For ex(MS-IK): or(4@POL1, 1@POL2) -> optimization while or(3@POL1, 1@POL2) -> no optimization
+}
+
+function combinations(array: T[], r: number): T[][] {
+ if (r > array.length) return [];
+ if (r === array.length) return [array];
+ if (r === 1) return array.map((el) => [el]);
+
+ return array.reduce((acc, el, i) => {
+ const subarrays = combinations(array.slice(i + 1), r - 1);
+ return acc.concat(subarrays.map((subarray) => [el, ...subarray]));
+ }, [] as T[][]);
+}
+
+// generates a unique identifier based on frequency of the keys
+// miniscript policy restriction: no two paths can have the same public key(and therefore the identifiers need to be distinct for successful policy compilation)
+function generateUniqueKeyIdentifier(
+ key: KeyInfo,
+ keyUsageCounts: Record,
+ keyInfoMap: KeyInfoMap
+): string {
+ keyUsageCounts[key.identifier] = (keyUsageCounts[key.identifier] || 0) + 1;
+ const externalIndex = (keyUsageCounts[key.identifier] - 1) * 2;
+ const changeIndex = externalIndex + 1;
+ const suffix = `${externalIndex};${changeIndex}`;
+ const uniqueIdentifier = `${key.identifier}<${suffix}>`;
+ keyInfoMap[uniqueIdentifier] = `${key.descriptor}/<${suffix}>/*`;
+ return uniqueIdentifier;
+}
+
+const isGeneratedPolicyValid = (policy: string, miniscriptPhases: Phase[]): boolean => {
+ const { scriptWitnesses } = generateScriptWitnesses(policy);
+
+ for (const phase of miniscriptPhases) {
+ if (phase.paths.length < phase.requiredPaths) {
+ throw new Error('Invalid path to threshold ratio');
+ }
+
+ const witnessesInPhase = scriptWitnesses.filter((witness) =>
+ phase.timelock ? witness.nLockTime === phase.timelock : !witness.nLockTime
+ );
+
+ const pathCombinations = combinations(phase.paths, phase.requiredPaths);
+
+ const allCombinationsValid = pathCombinations.every((pathCombination) => {
+ return witnessesInPhase.some((witness) =>
+ pathCombination.every((path) => {
+ const presentKeys = path.keys.filter((key) =>
+ witness.asm.includes(key.uniqueKeyIdentifier)
+ );
+ return presentKeys.length >= path.threshold;
+ })
+ );
+ });
+
+ if (!allCombinationsValid) return false;
+ }
+ return true;
+};
+
+function nestOrFragments(policies: string[], probabilities: number[]): string {
+ if (policies.length === 1) return policies[0];
+ if (policies.length === 2) {
+ return `or(${probabilities[0]}@${policies[0]}, ${probabilities[1]}@${policies[1]})`;
+ }
+
+ const [firstPolicy, ...restPolicies] = policies;
+ const [firstProbability, ...restProbabilities] = probabilities;
+
+ return `or(${firstProbability}@${firstPolicy}, ${nestOrFragments(
+ restPolicies,
+ restProbabilities
+ )})`;
+}
+
+export const generateMiniscriptPolicy = (
+ miniscriptPhases: Phase[]
+): { miniscriptPhases: Phase[]; policy: string; keyInfoMap: KeyInfoMap } => {
+ const keyUsageCounts: Record = {};
+ const keyInfoMap: KeyInfoMap = {};
+
+ const policyParts: string[] = miniscriptPhases.map((phase, phaseIndex) => {
+ const pathPolicies: string[] = phase.paths.map((path) => {
+ const uniqueKeys = path.keys.map((key) =>
+ generateUniqueKeyIdentifier(key, keyUsageCounts, keyInfoMap)
+ );
+
+ for (let index = 0; index < path.keys.length; index++) {
+ path.keys[index] = {
+ ...path.keys[index],
+ uniqueKeyIdentifier: uniqueKeys[index],
+ };
+ }
+ return path.keys.length > 1
+ ? `thresh(${path.threshold}, ${uniqueKeys.map((key) => `pk(${key})`).join(', ')})`
+ : `pk(${uniqueKeys[0]})`;
+ });
+
+ // combine paths within the phase using the phase's requiredPaths threshold
+ let phasePolicyPart =
+ pathPolicies.length > 1
+ ? `thresh(${phase.requiredPaths}, ${pathPolicies.join(', ')})`
+ : pathPolicies[0];
+
+ if (phase.timelock) {
+ phasePolicyPart = `thresh(2, after(${phase.timelock}), ${phasePolicyPart})`;
+ }
+
+ return phasePolicyPart;
+ });
+
+ // combine all phases, starting with the first one
+ let policy;
+ const hasProbability = miniscriptPhases.some((phase) => phase.probability !== undefined);
+ if (hasProbability) {
+ const probabilities = miniscriptPhases.map((phase) => phase.probability || 1);
+ policy = nestOrFragments(policyParts, probabilities);
+ } else {
+ policy = policyParts.length > 1 ? `thresh(1, ${policyParts.join(', ')})` : policyParts[0];
+ }
+
+ if (!isGeneratedPolicyValid(policy, miniscriptPhases)) {
+ throw new Error('All paths of the generated policy are not valid');
+ }
+
+ return { miniscriptPhases, policy, keyInfoMap }; // miniscriptPhases w/ unique key identifier
+};
diff --git a/src/services/wallets/operations/utils.ts b/src/services/wallets/operations/utils.ts
index bdcc697dd..b307d287a 100644
--- a/src/services/wallets/operations/utils.ts
+++ b/src/services/wallets/operations/utils.ts
@@ -3,6 +3,8 @@
import * as bip39 from 'bip39';
import * as bitcoinJS from 'bitcoinjs-lib';
import bitcoinMessage from 'bitcoinjs-message';
+import varuint from 'varuint-bitcoin';
+import { PsbtInput } from 'bip174/src/lib/interfaces';
import { CryptoAccount, CryptoHDKey } from 'src/services/qr/bc-ur-registry';
import ECPairFactory, { ECPairInterface } from 'ecpair';
@@ -13,10 +15,12 @@ import { isTestnet } from 'src/constants/Bitcoin';
import idx from 'idx';
import config from 'src/utils/service-utilities/config';
import BIP32Factory, { BIP32Interface } from 'bip32';
+import RestClient from 'src/services/rest/RestClient';
import { AddressCache, AddressPubs, Wallet } from '../interfaces/wallet';
-import { Signer, Vault } from '../interfaces/vault';
+import { MiniscriptScheme, MultisigConfig, Signer, Vault } from '../interfaces/vault';
import {
BIP48ScriptTypes,
+ MultisigScriptType,
DerivationPurpose,
EntityKind,
ImportedKeyType,
@@ -28,6 +32,8 @@ import {
import { OutputUTXOs } from '../interfaces';
import { whirlPoolWalletTypes } from '../factories/WalletFactory';
import ecc from './taproot-utils/noble_ecc';
+import { generateBitcoinScript } from './miniscript/miniscript';
+import ElectrumClient from 'src/services/electrum/client';
bitcoinJS.initEccLib(ecc);
const bip32 = BIP32Factory(ecc);
@@ -182,36 +188,407 @@ export default class WalletUtilities {
throw new Error("Unsupported derivation purpose, can't derive address");
};
+ static fetchCurrentBlockHeight = async () => {
+ try {
+ let height = (await ElectrumClient.getBlockchainHeaders()).height;
+ if (height) {
+ return { currentBlockHeight: height };
+ } else {
+ throw new Error('Failed to fetch current block height');
+ }
+ } catch {
+ try {
+ const endpoint =
+ config.NETWORK_TYPE === NetworkType.MAINNET
+ ? 'https://mempool.space/api/blocks/tip/height'
+ : 'https://mempool.space/testnet/api/blocks/tip/height';
+
+ const res = await RestClient.get(endpoint);
+ const currentBlockHeight = res.data;
+
+ return { currentBlockHeight };
+ } catch (error) {
+ throw new Error('Failed to fetch current block height');
+ }
+ }
+ };
+
+ static generateCustomScript = (
+ miniscriptScheme: MiniscriptScheme,
+ isInternal: boolean,
+ childIndex: number,
+ network: bitcoinJS.networks.Network
+ ): {
+ script: Buffer;
+ subPaths: {
+ [xpub: string]: number[];
+ };
+ signerPubkeyMap: Map;
+ } => {
+ const subPaths = {};
+ const signerPubkeyMap = new Map();
+
+ const { miniscript, miniscriptElements, keyInfoMap } = miniscriptScheme;
+ const { timelocks } = miniscriptElements;
+
+ // generate asm from miniscript
+ // eslint-disable-next-line prefer-const
+ let { asm, issane } = generateBitcoinScript(miniscript);
+ if (!issane) throw new Error('ASM is not sane - incorrect miniscript');
+
+ // generate public keys to replace the key identifiers
+ const identifiersToPublicKey = {};
+ for (const keyIdentifier in keyInfoMap) {
+ const fragments = keyInfoMap[keyIdentifier].split('/');
+ const multipathIndex = fragments[5];
+ const [_, xpub] = fragments[4].split(']');
+ const multipathFragments = multipathIndex.split(';');
+ const externalChainIndex = multipathFragments[0].slice(1);
+ const internalChainIndex = multipathFragments[1].slice(0, -1);
+ const subPath = [
+ parseInt(isInternal ? internalChainIndex : externalChainIndex, 10),
+ childIndex,
+ ];
+ const xKey = bip32.fromBase58(xpub, network);
+ const childXKey = xKey.derive(subPath[0]).derive(subPath[1]);
+ identifiersToPublicKey[keyIdentifier] = childXKey.publicKey;
+ subPaths[xpub + multipathIndex] = subPath;
+ signerPubkeyMap.set(xpub + multipathIndex, childXKey.publicKey);
+ }
+
+ // replace identifiers in the asm with actual public keys
+ for (const keyIdentifier in identifiersToPublicKey) {
+ const publicKey = identifiersToPublicKey[keyIdentifier];
+ asm = asm.replace(`<${keyIdentifier}>`, publicKey.toString('hex'));
+ asm = asm.replace(
+ ``,
+ bitcoinJS.crypto.hash160(publicKey).toString('hex')
+ );
+ }
+
+ // prepare and enrich the time locks
+ for (const tl of timelocks) {
+ const encodedTL = bitcoinJS.script.number.encode(tl).toString('hex');
+ asm = asm.replace(`<${encodedTL}>`, encodedTL);
+ }
+
+ // Convert small integers to OP codes
+ asm = asm
+ .split(' ')
+ .map((token) => {
+ if (token.length <= 2) {
+ // prevents the code from attempting to parse longer strings(like public keys) as integers
+ const num = parseInt(token);
+ if (!isNaN(num) && num >= 0 && num <= 16) {
+ return `OP_${num}`;
+ }
+ }
+ return token;
+ })
+ .join(' ');
+
+ const script = bitcoinJS.script.fromASM(asm);
+ return { script, subPaths, signerPubkeyMap };
+ };
+
+ static getFinalScriptsForMyCustomScript(
+ scriptWitnesses: {
+ asm: string;
+ nLockTime?: number;
+ nSequence?: number;
+ }[],
+ selectedWitness?: {
+ asm: string;
+ nLockTime?: number;
+ nSequence?: number;
+ },
+ keysInfoMap: { [uniqueIdentifier: string]: string }
+ ): any {
+ const finalScriptsFunc = (
+ inputIndex: number,
+ input: PsbtInput,
+ script: Buffer,
+ isSegwit: boolean,
+ isP2SH: boolean,
+ isP2WSH: boolean
+ ): {
+ finalScriptSig: Buffer | undefined;
+ finalScriptWitness: Buffer | undefined;
+ } => {
+ // Step 1: Check to make sure the meaningful script matches what you expect.
+ const decompiled = bitcoinJS.script.decompile(script);
+ if (!decompiled) throw new Error(`Can not finalize input #${inputIndex}`);
+
+ // const isMiniscriptBasedScript =
+ // decompiled[1] === bitcoinJS.opcodes.OP_CHECKSIG &&
+ // decompiled[2] === bitcoinJS.opcodes.OP_NOTIF &&
+ // decompiled[decompiled.length - 1] === bitcoinJS.opcodes.OP_ENDIF;
+ // if (!isMiniscriptBasedScript) {
+ // throw new Error(`Can not finalize input #${inputIndex}, invalid script`);
+ // }
+
+ // Step 2: Map signatures and generate the witness stack for the given satisfier
+ const keyInfo = {};
+ for (const partialSig of input.partialSig) {
+ const partialSigPubkey = partialSig.pubkey.toString('hex');
+ for (const bip32Derivation of input.bip32Derivation) {
+ const pubkeyHex = bip32Derivation.pubkey.toString('hex');
+ if (!keyInfo[pubkeyHex]) keyInfo[pubkeyHex] = bip32Derivation;
+
+ if (partialSigPubkey === pubkeyHex) {
+ keyInfo[pubkeyHex] = {
+ ...keyInfo[pubkeyHex],
+ ...partialSig,
+ hasPartialSig: true,
+ };
+ }
+ }
+ }
+
+ const signatureIdentifier = {};
+ const pubKeyIdentifier = {};
+ for (const keyIdentifier in keysInfoMap) {
+ const fragments = keysInfoMap[keyIdentifier].split('/');
+ const masterFingerprint = fragments[0].slice(1);
+ const multipathIndex = fragments[5]; // ex: <2;3>
+ const externalChainIndex = multipathIndex[1];
+ const internalChainIndex = multipathIndex[3];
+ /* Note: for a stricter check, we can also derive pubkey from xpub to match w/ partial sig pub
+ const [script_type, xpub] = fragments[4].split(']');
+ const xpubPath = `m/${fragments[1]}/${fragments[2]}/${fragments[3]}/${script_type}`;
+ */
+
+ for (const key in keyInfo) {
+ const info = keyInfo[key];
+ if (info.masterFingerprint.toString('hex').toUpperCase() === masterFingerprint) {
+ // signer identified (note: a signer can have multiple keys(multipath))
+ const inputPath = info.path.split('/'); // external/internal chain index
+ const chainIndex = inputPath[inputPath.length - 2];
+ if (chainIndex === externalChainIndex || chainIndex === internalChainIndex) {
+ if (info.hasPartialSig) signatureIdentifier[``] = info;
+ else pubKeyIdentifier[`<${keyIdentifier}>`] = info;
+ break;
+ }
+ }
+ }
+ }
+
+ // if selectedWitness is empty, find the appropriate witness(case: Timelock vault)
+ if (!selectedWitness) {
+ selectedWitness = scriptWitnesses.find((witness) => {
+ const requiredSignatures = witness.asm.match(//g) || [];
+ return requiredSignatures.every((sig) => signatureIdentifier[sig]);
+ });
+
+ if (!selectedWitness) {
+ throw new Error('No suitable witness found for the available signatures');
+ }
+ }
+
+ const witnessScriptStack = [];
+ for (const fragment of selectedWitness.asm.split(' ')) {
+ if (fragment === '0') witnessScriptStack.push(bitcoinJS.opcodes.OP_0);
+ else if (fragment === '1') witnessScriptStack.push(bitcoinJS.opcodes.OP_1);
+ else {
+ let found = false;
+ for (const identifier in keysInfoMap) {
+ if (fragment === ``) {
+ witnessScriptStack.push(signatureIdentifier[``].signature);
+ found = true;
+ break;
+ }
+
+ if (fragment === `<${identifier}>`) {
+ witnessScriptStack.push(
+ (signatureIdentifier[``] || pubKeyIdentifier[`<${identifier}>`])
+ .pubkey
+ );
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) throw new Error(`Invalid asm fragment ${fragment}`);
+ }
+ }
+
+ // Step 3: Create final scripts
+ const network = config.NETWORK;
+ let payment: bitcoinJS.Payment = {
+ network,
+ output: script,
+ // This logic should be more strict and make sure the pubkeys in the
+ // meaningful script are the ones signing in the PSBT etc.
+ input: bitcoinJS.script.compile(witnessScriptStack),
+ };
+ if (isP2WSH && isSegwit) {
+ payment = bitcoinJS.payments.p2wsh({
+ network,
+ redeem: payment,
+ });
+ }
+ if (isP2SH) {
+ payment = bitcoinJS.payments.p2sh({
+ network,
+ redeem: payment,
+ });
+ }
+
+ function witnessStackToScriptWitness(witness: Buffer[]): Buffer {
+ let buffer = Buffer.allocUnsafe(0);
+
+ function writeSlice(slice: Buffer): void {
+ buffer = Buffer.concat([buffer, Buffer.from(slice)]);
+ }
+
+ function writeVarInt(i: number): void {
+ const currentLen = buffer.length;
+ const varintLen = varuint.encodingLength(i);
+
+ buffer = Buffer.concat([buffer, Buffer.allocUnsafe(varintLen)]);
+ varuint.encode(i, buffer, currentLen);
+ }
+
+ function writeVarSlice(slice: Buffer): void {
+ writeVarInt(slice.length);
+ writeSlice(slice);
+ }
+
+ function writeVector(vector: Buffer[]): void {
+ writeVarInt(vector.length);
+ vector.forEach(writeVarSlice);
+ }
+
+ writeVector(witness);
+
+ return buffer;
+ }
+
+ return {
+ finalScriptSig: payment.input,
+ finalScriptWitness:
+ payment.witness && payment.witness.length > 0
+ ? witnessStackToScriptWitness(payment.witness)
+ : undefined,
+ };
+ };
+
+ return finalScriptsFunc;
+ }
+
static deriveMultiSig = (
- required: number,
- pubkeys: Buffer[],
+ wallet: Vault,
+ multisigConfig: MultisigConfig,
network: bitcoinJS.Network,
scriptType: BIP48ScriptTypes = BIP48ScriptTypes.NATIVE_SEGWIT
): {
- p2ms: bitcoinJS.payments.Payment;
p2wsh: bitcoinJS.payments.Payment;
p2sh: bitcoinJS.payments.Payment | undefined;
+ subPaths: { [xpub: string]: number[] };
+ signerPubkeyMap: Map;
+ orderPreservedPubkeys?: string[];
} => {
- const p2ms = bitcoinJS.payments.p2ms({
- m: required,
- pubkeys,
- network,
- });
- const p2wsh = bitcoinJS.payments.p2wsh({
- redeem: p2ms,
- network,
- });
+ if (multisigConfig.multisigScriptType === MultisigScriptType.DEFAULT_MULTISIG) {
+ if (!multisigConfig.required) {
+ throw new Error('Invalid multisig config');
+ }
- let p2sh;
- if (scriptType === BIP48ScriptTypes.WRAPPED_SEGWIT) {
- // wrap native segwit
- p2sh = bitcoinJS.payments.p2sh({
- redeem: p2wsh,
+ const subPaths = {};
+ const signerPubkeyMap = new Map();
+ const { internal, childIndex } = multisigConfig;
+
+ let orderPreservedPubkeys: string[] = []; // non-bip-67(original order)
+ let pubkeys: Buffer[] = []; // bip-67 ordered
+
+ const { xpubs } = wallet.specs;
+ xpubs.forEach(
+ (xpub) => (subPaths[xpub] = [internal ? 1 : 0, childIndex]) // same for all xpubs in default multisig
+ );
+
+ const addressCache: AddressCache = wallet.specs.addresses || { external: {}, internal: {} };
+ const addressPubs: AddressPubs = wallet.specs.addressPubs || {};
+
+ const correspondingAddress = internal
+ ? addressCache.internal[childIndex]
+ : addressCache.external[childIndex];
+
+ if (addressPubs[correspondingAddress]) {
+ // using cached pubkeys to prepare multisig assets
+ const cachedPubs = addressPubs[correspondingAddress].split('/'); // non bip-67 compatible(maintains xpub/signer order)
+ orderPreservedPubkeys = cachedPubs;
+ xpubs.forEach((xpub, i) => {
+ signerPubkeyMap.set(xpub, Buffer.from(cachedPubs[i], 'hex'));
+ });
+ pubkeys = cachedPubs.sort((a, b) => (a > b ? 1 : -1)).map((pub) => Buffer.from(pub, 'hex')); // bip-67 compatible(cached ones are in hex)
+ } else {
+ // generating pubkeys to prepare multisig assets
+ for (let i = 0; i < xpubs.length; i++) {
+ const childExtendedKey = WalletUtilities.generateChildFromExtendedKey(
+ xpubs[i],
+ network,
+ childIndex,
+ internal
+ );
+ const xKey = bip32.fromBase58(childExtendedKey, network);
+ orderPreservedPubkeys[i] = xKey.publicKey.toString('hex');
+ pubkeys[i] = xKey.publicKey;
+ signerPubkeyMap.set(xpubs[i], pubkeys[i]); // the order is currently preserved for pubkeys array(non bip-67)
+ }
+ pubkeys = pubkeys.sort((a, b) => (a.toString('hex') > b.toString('hex') ? 1 : -1)); // bip-67 compatible
+ }
+
+ const p2ms = bitcoinJS.payments.p2ms({
+ m: multisigConfig.required,
+ pubkeys,
network,
});
- }
- return { p2ms, p2wsh, p2sh };
+ const p2wsh = bitcoinJS.payments.p2wsh({
+ redeem: p2ms,
+ network,
+ });
+
+ let p2sh;
+ if (scriptType === BIP48ScriptTypes.WRAPPED_SEGWIT) {
+ // wrap native segwit
+ p2sh = bitcoinJS.payments.p2sh({
+ redeem: p2wsh,
+ network,
+ });
+ }
+
+ return { p2wsh, p2sh, subPaths, signerPubkeyMap, orderPreservedPubkeys };
+ } else if (multisigConfig.multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ if (!multisigConfig.miniscriptScheme) {
+ throw new Error('Invalid multisig config - miniscript scheme missing');
+ }
+
+ const { internal, childIndex } = multisigConfig;
+ const { script, subPaths, signerPubkeyMap } = this.generateCustomScript(
+ multisigConfig.miniscriptScheme,
+ internal,
+ childIndex,
+ network
+ );
+
+ const p2wsh = bitcoinJS.payments.p2wsh({
+ redeem: {
+ output: script,
+ network,
+ },
+ });
+
+ let p2sh;
+ if (scriptType === BIP48ScriptTypes.WRAPPED_SEGWIT) {
+ // wrap native segwit
+ p2sh = bitcoinJS.payments.p2sh({
+ redeem: p2wsh,
+ network,
+ });
+ }
+
+ return { p2wsh, p2sh, subPaths, signerPubkeyMap };
+ } else throw new Error('Invalid multisig type');
};
static isValidAddress = (address: string, network: bitcoinJS.Network): boolean => {
@@ -225,27 +602,25 @@ export default class WalletUtilities {
static getKeyPairByIndex = (
xpriv: string,
- internal: boolean,
- index: number,
+ chainIndex: number,
+ childIndex: number,
network: bitcoinJS.networks.Network
): BIP32Interface => {
const node = bip32.fromBase58(xpriv, network);
- const chain = internal ? 1 : 0;
- const keyPair: BIP32Interface = node.derive(chain).derive(index);
+ const keyPair: BIP32Interface = node.derive(chainIndex).derive(childIndex);
return keyPair;
};
static getPublicKeyByIndex = (
xpub: string,
- internal: boolean,
- index: number,
+ chainIndex: number,
+ childIndex: number,
network: bitcoinJS.networks.Network
): { publicKey: Buffer; subPath: number[] } => {
const node = bip32.fromBase58(xpub, network);
- const chain = internal ? 1 : 0;
- const keyPair = node.derive(chain).derive(index);
+ const keyPair: BIP32Interface = node.derive(chainIndex).derive(childIndex);
const { publicKey } = keyPair;
- return { publicKey, subPath: [chain, index] };
+ return { publicKey, subPath: [chainIndex, childIndex] };
};
static getAddressByIndex = (
@@ -391,7 +766,9 @@ export default class WalletUtilities {
static addressToPublicKey = (
address: string,
- wallet: Wallet | Vault
+ wallet: Wallet | Vault,
+ externalChainIndex: number = 0,
+ internalChainIndex: number = 1
): {
publicKey: Buffer;
subPath: number[];
@@ -419,7 +796,7 @@ export default class WalletUtilities {
publicKey: Buffer.from(addressPubs[address], 'hex'),
subPath: [0, itr],
};
- } else return WalletUtilities.getPublicKeyByIndex(xpub, false, itr, network);
+ } else return WalletUtilities.getPublicKeyByIndex(xpub, externalChainIndex, itr, network);
}
}
@@ -431,7 +808,7 @@ export default class WalletUtilities {
publicKey: Buffer.from(addressPubs[address], 'hex'),
subPath: [1, itr],
};
- } else return WalletUtilities.getPublicKeyByIndex(xpub, true, itr, network);
+ } else return WalletUtilities.getPublicKeyByIndex(xpub, internalChainIndex, itr, network);
}
}
@@ -440,7 +817,9 @@ export default class WalletUtilities {
static addressToKeyPair = (
address: string,
- wallet: Wallet | Vault
+ wallet: Wallet | Vault,
+ externalChainIndex: number = 0,
+ internalChainIndex: number = 1
): {
keyPair: BIP32Interface;
} => {
@@ -454,14 +833,18 @@ export default class WalletUtilities {
const closingExtIndex = totalExternalAddresses - 1 + config.GAP_LIMIT;
for (let itr = 0; itr <= totalExternalAddresses - 1 + closingExtIndex; itr++) {
if (addressCache.external[itr] === address) {
- return { keyPair: WalletUtilities.getKeyPairByIndex(xpriv, false, itr, network) };
+ return {
+ keyPair: WalletUtilities.getKeyPairByIndex(xpriv, externalChainIndex, itr, network),
+ };
}
}
const closingIntIndex = nextFreeChangeAddressIndex + config.GAP_LIMIT;
for (let itr = 0; itr <= closingIntIndex; itr++) {
if (addressCache.internal[itr] === address) {
- return { keyPair: WalletUtilities.getKeyPairByIndex(xpriv, true, itr, network) };
+ return {
+ keyPair: WalletUtilities.getKeyPairByIndex(xpriv, internalChainIndex, itr, network),
+ };
}
}
@@ -474,88 +857,51 @@ export default class WalletUtilities {
internal: boolean,
scriptType: BIP48ScriptTypes = BIP48ScriptTypes.NATIVE_SEGWIT
): {
- p2ms: bitcoinJS.payments.Payment;
p2wsh: bitcoinJS.payments.Payment;
p2sh: bitcoinJS.payments.Payment;
- pubkeys: Buffer[];
- orderPreservedPubkeys: string[];
address: string;
- subPath: number[];
+ subPaths: { [xpub: string]: number[] };
signerPubkeyMap: Map;
+ orderPreservedPubkeys?: string[];
} => {
- const subPath = [internal ? 1 : 0, childIndex];
- const signerPubkeyMap = new Map();
-
- let orderPreservedPubkeys: string[] = []; // non-bip-67(original order)
- let pubkeys: Buffer[] = []; // bip-67 ordered
-
+ let config: MultisigConfig;
const network = WalletUtilities.getNetworkByType(wallet.networkType);
- const { xpubs } = wallet.specs;
-
- const addressCache: AddressCache = wallet.specs.addresses || { external: {}, internal: {} };
- const addressPubs: AddressPubs = wallet.specs.addressPubs || {};
-
- const correspondingAddress = internal
- ? addressCache.internal[childIndex]
- : addressCache.external[childIndex];
-
- if (addressPubs[correspondingAddress]) {
- // using cached pubkeys to prepare multisig assets
- const cachedPubs = addressPubs[correspondingAddress].split('/'); // non bip-67 compatible(maintains xpub/signer order)
- orderPreservedPubkeys = cachedPubs;
- xpubs.forEach((xpub, i) => {
- signerPubkeyMap.set(xpub, Buffer.from(cachedPubs[i], 'hex'));
- });
- pubkeys = cachedPubs.sort((a, b) => (a > b ? 1 : -1)).map((pub) => Buffer.from(pub, 'hex')); // bip-67 compatible(cached ones are in hex)
- } else {
- // generating pubkeys to prepare multisig assets
- for (let i = 0; i < xpubs.length; i++) {
- const childExtendedKey = WalletUtilities.generateChildFromExtendedKey(
- xpubs[i],
- network,
- childIndex,
- internal
- );
- const xKey = bip32.fromBase58(childExtendedKey, network);
- orderPreservedPubkeys[i] = xKey.publicKey.toString('hex');
- pubkeys[i] = xKey.publicKey;
- signerPubkeyMap.set(xpubs[i], pubkeys[i]);
- }
- pubkeys = pubkeys.sort((a, b) => (a.toString('hex') > b.toString('hex') ? 1 : -1)); // bip-67 compatible
- }
+ const multisigScriptType =
+ wallet.scheme.multisigScriptType || MultisigScriptType.DEFAULT_MULTISIG;
+
+ if (multisigScriptType === MultisigScriptType.DEFAULT_MULTISIG) {
+ config = {
+ multisigScriptType,
+ required: wallet.scheme.m,
+ childIndex,
+ internal,
+ };
+ } else if (multisigScriptType === MultisigScriptType.MINISCRIPT_MULTISIG) {
+ const { miniscriptScheme } = wallet.scheme;
+ if (!miniscriptScheme) throw new Error('Miniscript scheme missing');
+ config = {
+ multisigScriptType,
+ miniscriptScheme,
+ childIndex,
+ internal,
+ };
+ } else throw new Error('Unsupported multisig script type');
- const { p2ms, p2wsh, p2sh } = WalletUtilities.deriveMultiSig(
- wallet.scheme.m,
- pubkeys,
- network,
- scriptType
- );
+ const { p2wsh, p2sh, subPaths, signerPubkeyMap, orderPreservedPubkeys } =
+ WalletUtilities.deriveMultiSig(wallet, config, network, scriptType);
const address = p2sh ? p2sh.address : p2wsh.address;
return {
- p2ms,
p2wsh,
p2sh,
- pubkeys,
- orderPreservedPubkeys,
address,
- subPath,
+ subPaths,
signerPubkeyMap,
+ orderPreservedPubkeys,
};
};
- static addressToMultiSig = (
- address: string,
- wallet: Vault
- ): {
- p2ms: bitcoinJS.payments.Payment;
- p2wsh: bitcoinJS.payments.Payment;
- p2sh: bitcoinJS.payments.Payment;
- pubkeys: Buffer[];
- address: string;
- subPath: number[];
- signerPubkeyMap: Map;
- } => {
+ static addressToMultiSig = (address: string, wallet: Vault) => {
const { totalExternalAddresses, nextFreeChangeAddressIndex } = wallet.specs;
const addressCache: AddressCache = wallet.specs.addresses || { external: {}, internal: {} };
@@ -664,12 +1010,12 @@ export default class WalletUtilities {
| {
outputs: OutputUTXOs[];
changeMultisig: {
- p2ms: bitcoinJS.payments.Payment;
p2wsh: bitcoinJS.payments.Payment;
p2sh: bitcoinJS.payments.Payment;
- pubkeys: Buffer[];
address: string;
- subPath: number[];
+ subPaths: {
+ [xpub: string]: number[];
+ };
signerPubkeyMap: Map;
};
changeAddress?: string;
@@ -681,12 +1027,10 @@ export default class WalletUtilities {
} => {
const changeAddress: string = '';
let changeMultisig: {
- p2ms: bitcoinJS.payments.Payment;
p2wsh: bitcoinJS.payments.Payment;
p2sh: bitcoinJS.payments.Payment;
- pubkeys: Buffer[];
address: string;
- subPath: number[];
+ subPaths: { [xpub: string]: number[] };
signerPubkeyMap: Map;
};
if ((wallet as Vault).isMultiSig) {
diff --git a/src/storage/realm/RealmProvider.tsx b/src/storage/realm/RealmProvider.tsx
index ff6674466..98af80249 100644
--- a/src/storage/realm/RealmProvider.tsx
+++ b/src/storage/realm/RealmProvider.tsx
@@ -1,11 +1,10 @@
import React, { useEffect } from 'react';
-import * as Sentry from '@sentry/react-native';
import { KeeperApp } from 'src/models/interfaces/KeeperApp';
import config from 'src/utils/service-utilities/config';
import { RealmProvider as Provider, useQuery } from '@realm/react';
import { stringToArrayBuffer } from 'src/store/sagas/login';
import { useAppSelector } from 'src/store/hooks';
-import { sentryConfig } from 'src/services/sentry';
+import { initializeSentry } from 'src/services/sentry';
import { RealmDatabase } from './realm';
import { RealmSchema } from './enum';
import { getJSONFromRealmObject } from './utils';
@@ -19,18 +18,12 @@ export const realmConfig = (key) => ({
});
const AppWithNetwork = ({ children }) => {
- const { networkType, id, enableAnalytics }: KeeperApp = useQuery(RealmSchema.KeeperApp).map(
- getJSONFromRealmObject
- )[0];
+ const { networkType }: KeeperApp = useQuery(RealmSchema.KeeperApp).map(getJSONFromRealmObject)[0];
config.setNetwork(networkType);
useEffect(() => {
- if (enableAnalytics) {
- Sentry.init(sentryConfig);
- } else {
- Sentry.init({ ...sentryConfig, enabled: false });
- }
- }, [enableAnalytics]);
+ initializeSentry();
+ }, []);
return children;
};
diff --git a/src/storage/realm/dbManager.ts b/src/storage/realm/dbManager.ts
index 8e4b458b9..8ae66dbd0 100644
--- a/src/storage/realm/dbManager.ts
+++ b/src/storage/realm/dbManager.ts
@@ -199,6 +199,58 @@ const deleteObjectByPrimaryKey = (schema: RealmSchema, key: string, value: any)
}
};
+/**
+ * generic :: updates the object corresponding to provided schema and query function
+ * @param {RealmSchema} schema
+ * @param {Function} queryFn
+ * @param {any} updateProps
+ */
+const updateObjectByQuery = (
+ schema: RealmSchema,
+ queryFn: (obj: any) => boolean,
+ updateProps: any
+) => {
+ try {
+ const objects = realm.get(schema);
+ const object = objects.find(queryFn);
+ if (object) {
+ for (const [key, value] of Object.entries(updateProps)) {
+ realm.write(() => {
+ object[key] = value;
+ });
+ }
+ return true;
+ }
+ return false;
+ } catch (err) {
+ console.error({ err });
+ return false;
+ }
+};
+
+/**
+ * generic :: fetches an object corresponding to provided schema and query function
+ * @param {RealmSchema} schema
+ * @param {Function} queryFn
+ * @param {boolean} all whether to return all matching objects or just the first one
+ */
+const getObjectByQuery = (
+ schema: RealmSchema,
+ queryFn: (obj: any) => boolean,
+ all: boolean = false
+) => {
+ try {
+ const objects = realm.get(schema);
+ if (all) {
+ return objects.filter(queryFn);
+ }
+ return objects.find(queryFn);
+ } catch (err) {
+ console.error({ err });
+ return null;
+ }
+};
+
export default {
initializeRealm,
deleteRealm,
@@ -213,4 +265,6 @@ export default {
updateObjectByPrimaryId,
getCollection,
getObjectByField,
+ updateObjectByQuery,
+ getObjectByQuery,
};
diff --git a/src/storage/realm/enum.ts b/src/storage/realm/enum.ts
index 62d27eef0..161ac90b6 100644
--- a/src/storage/realm/enum.ts
+++ b/src/storage/realm/enum.ts
@@ -22,6 +22,12 @@ export enum RealmSchema {
HealthCheckDetails = 'HealthCheckDetails',
KeySpecs = 'KeySpecs',
VaultPresentationData = 'VaultPresentationData',
+ MiniscriptKeyInfo = 'MiniscriptKeyInfo',
+ MiniscriptPath = 'MiniscriptPath',
+ MiniscriptPhase = 'MiniscriptPhase',
+ MiniscriptElements = 'MiniscriptElements',
+ MiniscriptScheme = 'MiniscriptScheme',
+ VaultScheme = 'VaultScheme',
SignerPolicy = 'SignerPolicy',
InheritanceKeyInfo = 'InheritanceKeyInfo',
InheritanceConfiguration = 'InheritanceConfiguration',
diff --git a/src/storage/realm/migrations.ts b/src/storage/realm/migrations.ts
index 470071a4c..8b6dd8189 100644
--- a/src/storage/realm/migrations.ts
+++ b/src/storage/realm/migrations.ts
@@ -3,9 +3,10 @@ import { SignerType } from 'src/services/wallets/enums';
import { InheritanceKeyInfo } from 'src/models/interfaces/AssistedKeys';
import { UAI } from 'src/models/interfaces/Uai';
import { getSignerNameFromType } from 'src/hardware';
+import _ from 'lodash';
import { getJSONFromRealmObject } from './utils';
import { RealmSchema } from './enum';
-import _ from 'lodash';
+import { getKeyUID } from 'src/utils/utilities';
export const runRealmMigrations = ({
oldRealm,
@@ -213,4 +214,34 @@ export const runRealmMigrations = ({
}
});
}
+
+ if (oldRealm.schemaVersion < 80) {
+ const oldVaults = oldRealm.objects(RealmSchema.Vault) as any;
+ const newVaults = newRealm.objects(RealmSchema.Vault) as any;
+
+ for (let i = 0; i < oldVaults.length; i++) {
+ const oldVault = oldVaults[i];
+ const newVault = newVaults[i];
+
+ newVault.scheme = {
+ // Preserve existing m and n values
+ m: oldVault.scheme.m,
+ n: oldVault.scheme.n,
+
+ // Add new fields with default or null values
+ multisigScriptType: null,
+ miniscriptScheme: null,
+ };
+ }
+ }
+
+ // Add migration for Signer primary key change
+ if (oldRealm.schemaVersion < 81) {
+ const oldSigners = oldRealm.objects(RealmSchema.Signer) as any;
+ const newSigners = newRealm.objects(RealmSchema.Signer) as Signer[];
+
+ for (const objectIndex in newSigners) {
+ newSigners[objectIndex].id = getKeyUID(oldSigners[objectIndex]);
+ }
+ }
};
diff --git a/src/storage/realm/realm.ts b/src/storage/realm/realm.ts
index 20566352d..97b6b10ae 100644
--- a/src/storage/realm/realm.ts
+++ b/src/storage/realm/realm.ts
@@ -9,7 +9,7 @@ export class RealmDatabase {
public static file = 'keeper.realm';
- public static schemaVersion = 79;
+ public static schemaVersion = 81;
/**
* initializes/opens realm w/ appropriate configuration
diff --git a/src/storage/realm/schema/index.ts b/src/storage/realm/schema/index.ts
index 9b3069c77..0c81510b3 100644
--- a/src/storage/realm/schema/index.ts
+++ b/src/storage/realm/schema/index.ts
@@ -31,6 +31,12 @@ import {
InheritancePolicyNotificationSchema,
InheritancePolicyAlertSchema,
HealthCheckDetails,
+ MiniscriptElementsSchema,
+ MiniscriptSchemeSchema,
+ VaultSchemeSchema,
+ MiniscriptKeyInfoSchema,
+ MiniscriptPathSchema,
+ MiniscriptPhaseSchema,
} from './vault';
import { KeeperAppSchema } from './app';
import { UAIDetailsSchema, UAISchema } from './uai';
@@ -70,6 +76,12 @@ export default [
InheritancePolicyAlertSchema,
InheritancePolicySchema,
InheritanceKeyInfoSchema,
+ MiniscriptKeyInfoSchema,
+ MiniscriptPathSchema,
+ MiniscriptPhaseSchema,
+ MiniscriptElementsSchema,
+ MiniscriptSchemeSchema,
+ VaultSchemeSchema,
VaultSpecsSchema,
BackupSchema,
UAISchema,
diff --git a/src/storage/realm/schema/vault.ts b/src/storage/realm/schema/vault.ts
index 2a153a376..55cb8c8c2 100644
--- a/src/storage/realm/schema/vault.ts
+++ b/src/storage/realm/schema/vault.ts
@@ -3,14 +3,6 @@ import { XpubTypes } from 'src/services/wallets/enums';
import { Balances } from './wallet';
import { RealmSchema } from '../enum';
-const Scheme = {
- type: '{}',
- properties: {
- m: 'int',
- n: 'int',
- },
-};
-
export const SignerPolicy: ObjectSchema = {
name: RealmSchema.SignerPolicy,
embedded: true,
@@ -143,8 +135,9 @@ export const HealthCheckDetails: ObjectSchema = {
export const SignerSchema: ObjectSchema = {
name: RealmSchema.Signer,
- primaryKey: 'masterFingerprint',
+ primaryKey: 'id',
properties: {
+ id: 'string',
masterFingerprint: 'string',
type: 'string',
signerXpubs: `${RealmSchema.SignerXpubs}`,
@@ -175,6 +168,70 @@ export const VaultPresentationDataSchema: ObjectSchema = {
},
};
+export const MiniscriptKeyInfoSchema: ObjectSchema = {
+ name: RealmSchema.MiniscriptKeyInfo,
+ embedded: true,
+ properties: {
+ identifier: 'string',
+ descriptor: 'string',
+ uniqueKeyIdentifier: 'string?',
+ },
+};
+
+export const MiniscriptPathSchema: ObjectSchema = {
+ name: RealmSchema.MiniscriptPath,
+ embedded: true,
+ properties: {
+ id: 'int',
+ keys: `${RealmSchema.MiniscriptKeyInfo}[]`,
+ threshold: 'int',
+ },
+};
+
+export const MiniscriptPhaseSchema: ObjectSchema = {
+ name: RealmSchema.MiniscriptPhase,
+ embedded: true,
+ properties: {
+ id: 'int',
+ timelock: 'int',
+ paths: `${RealmSchema.MiniscriptPath}[]`,
+ requiredPaths: 'int',
+ },
+};
+
+export const MiniscriptElementsSchema: ObjectSchema = {
+ name: RealmSchema.MiniscriptElements,
+ embedded: true,
+ properties: {
+ keysInfo: `${RealmSchema.MiniscriptKeyInfo}[]`,
+ timelocks: 'int[]',
+ phases: `${RealmSchema.MiniscriptPhase}[]`,
+ signerFingerprints: '{}',
+ },
+};
+
+export const MiniscriptSchemeSchema: ObjectSchema = {
+ name: RealmSchema.MiniscriptScheme,
+ embedded: true,
+ properties: {
+ miniscriptElements: RealmSchema.MiniscriptElements,
+ keyInfoMap: '{}',
+ miniscriptPolicy: 'string',
+ miniscript: 'string',
+ },
+};
+
+export const VaultSchemeSchema: ObjectSchema = {
+ name: RealmSchema.VaultScheme,
+ embedded: true,
+ properties: {
+ m: 'int',
+ n: 'int',
+ multisigScriptType: 'string?',
+ miniscriptScheme: `${RealmSchema.MiniscriptScheme}?`,
+ },
+};
+
export const VaultSpecsSchema: ObjectSchema = {
name: RealmSchema.VaultSpecs,
embedded: true,
@@ -206,7 +263,7 @@ export const VaultSchema: ObjectSchema = {
networkType: 'string',
isUsable: 'bool',
isMultiSig: 'bool',
- scheme: Scheme,
+ scheme: `${RealmSchema.VaultScheme}`,
signers: `${RealmSchema.VaultSigner}[]`,
presentationData: RealmSchema.VaultPresentationData,
specs: RealmSchema.VaultSpecs,
diff --git a/src/store/reducers/bhr.ts b/src/store/reducers/bhr.ts
index 4abd4cd32..9876170c7 100644
--- a/src/store/reducers/bhr.ts
+++ b/src/store/reducers/bhr.ts
@@ -5,6 +5,7 @@ import { reduxStorage } from 'src/storage';
import { persistReducer } from 'redux-persist';
import { VaultSigner } from 'src/services/wallets/interfaces/vault';
import { seedWordItem } from 'src/screens/Recovery/constants';
+import { getKeyUID } from 'src/utils/utilities';
const initialState: {
backupMethod: BackupType | null;
@@ -139,7 +140,7 @@ const bhrSlice = createSlice({
const signerToRemove = action.payload;
if (signerToRemove) {
state.signingDevices = state.signingDevices.filter(
- (signer) => signer.masterFingerprint !== signerToRemove.masterFingerprint
+ (signer) => getKeyUID(signer) !== getKeyUID(signerToRemove)
);
}
},
diff --git a/src/store/reducers/cachedTxn.ts b/src/store/reducers/cachedTxn.ts
index 667f16fff..76817674d 100644
--- a/src/store/reducers/cachedTxn.ts
+++ b/src/store/reducers/cachedTxn.ts
@@ -39,9 +39,38 @@ const cachedTxSlice = createSlice({
dropTransactionSnapshot: (state, action: PayloadAction<{ cachedTxid: string }>) => {
delete state.snapshots[action.payload.cachedTxid];
},
+ updateCachedPsbtEnvelope: (state, action) => {
+ const { xfp, cachedTxid, signedSerializedPSBT } = action.payload;
+ const snapshot = state.snapshots[cachedTxid];
+ if (!snapshot) throw new Error('Invalid Transaction.');
+ const updatedEnvelops = snapshot.state.sendPhaseTwo.serializedPSBTEnvelops.map((envelope) => {
+ if (envelope.xfp == xfp) {
+ return {
+ ...envelope,
+ isSigned: true,
+ serializedPSBT: signedSerializedPSBT,
+ };
+ } else return envelope;
+ });
+ const updatedSnapShot = {
+ ...snapshot,
+ state: {
+ ...snapshot.state,
+ sendPhaseTwo: {
+ ...snapshot.state.sendPhaseTwo,
+ serializedPSBTEnvelops: updatedEnvelops,
+ },
+ },
+ };
+ state.snapshots = {
+ ...state.snapshots,
+ [cachedTxid]: updatedSnapShot,
+ };
+ },
},
});
-export const { setTransactionSnapshot, dropTransactionSnapshot } = cachedTxSlice.actions;
+export const { setTransactionSnapshot, dropTransactionSnapshot, updateCachedPsbtEnvelope } =
+ cachedTxSlice.actions;
export default cachedTxSlice.reducer;
diff --git a/src/store/reducers/vaults.ts b/src/store/reducers/vaults.ts
index f194f75b2..c6996bb98 100644
--- a/src/store/reducers/vaults.ts
+++ b/src/store/reducers/vaults.ts
@@ -23,6 +23,11 @@ export interface VaultMigrationCompletionPayload {
error?: string;
}
+export interface RemoteLinkDetails {
+ xfp: string;
+ cachedTxid: string;
+}
+
export type VaultState = {
isGeneratingNewVault: boolean;
hasNewVaultGenerationSucceeded: boolean;
@@ -40,6 +45,7 @@ export type VaultState = {
keyHeathCheckSuccess: boolean;
keyHeathCheckError: string;
keyHeathCheckLoading: boolean;
+ remoteLinkDetails: RemoteLinkDetails;
};
export type SignerUpdatePayload = {
@@ -64,6 +70,7 @@ const initialState: VaultState = {
keyHeathCheckSuccess: false,
keyHeathCheckError: null,
keyHeathCheckLoading: false,
+ remoteLinkDetails: null,
};
const vaultSlice = createSlice({
@@ -138,6 +145,9 @@ const vaultSlice = createSlice({
state.keyHeathCheckSuccess = false;
state.keyHeathCheckError = null;
},
+ setRemoteLinkDetails: (state, action: PayloadAction) => {
+ state.remoteLinkDetails = action.payload;
+ },
},
extraReducers: (builder) => {
builder.addCase(ADD_NEW_VAULT, (state) => {
@@ -161,6 +171,7 @@ export const {
setKeyHealthCheckError,
setKeyHealthCheckLoading,
resetKeyHealthState,
+ setRemoteLinkDetails,
} = vaultSlice.actions;
const vaultPersistConfig = {
@@ -177,6 +188,7 @@ const vaultPersistConfig = {
'keyHeathCheckSuccess',
'keyHeathCheckError',
'keyHeathCheckLoading',
+ 'setRemoteLinkDetails',
],
};
diff --git a/src/store/sagaActions/send_and_receive.ts b/src/store/sagaActions/send_and_receive.ts
index d2d48e010..a8adef0ca 100644
--- a/src/store/sagaActions/send_and_receive.ts
+++ b/src/store/sagaActions/send_and_receive.ts
@@ -168,6 +168,10 @@ export interface SendPhaseTwoAction extends Action {
wallet: Wallet | Vault;
txnPriority: TxPriority;
transferType: TransferType;
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ };
note?: string;
label?: { name: string; isSystem: boolean }[];
};
@@ -177,6 +181,10 @@ export const sendPhaseTwo = (payload: {
wallet: Wallet | Vault;
txnPriority: TxPriority;
transferType: TransferType;
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ };
token?: number;
note?: string;
label?: { name: string; isSystem: boolean }[];
@@ -190,6 +198,10 @@ export interface SendPhaseThreeAction extends Action {
payload: {
wallet: Wallet | Vault;
txnPriority: TxPriority;
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ };
note?: string;
label?: { name: string; isSystem: boolean }[];
};
@@ -198,6 +210,10 @@ export interface SendPhaseThreeAction extends Action {
export const sendPhaseThree = (payload: {
wallet: Wallet | Vault;
txnPriority: TxPriority;
+ miniscriptTxElements?: {
+ selectedPhase: number;
+ selectedPaths: number[];
+ };
note: string;
label: { name: string; isSystem: boolean }[];
}): SendPhaseThreeAction => ({
diff --git a/src/store/sagas/bhr.ts b/src/store/sagas/bhr.ts
index 178201a47..731e49ce6 100644
--- a/src/store/sagas/bhr.ts
+++ b/src/store/sagas/bhr.ts
@@ -79,6 +79,7 @@ import { KEY_MANAGEMENT_VERSION } from './upgrade';
import { RootState } from '../store';
import { setupRecoveryKeySigningKey } from 'src/hardware/signerSetup';
import { addSigningDeviceWorker } from './wallets';
+import { getKeyUID } from 'src/utils/utilities';
export function* updateAppImageWorker({
payload,
@@ -104,7 +105,7 @@ export function* updateAppImageWorker({
} else if (signers) {
for (const signer of signers) {
const encrytedSigner = encrypt(encryptionKey, JSON.stringify(signer));
- signersObjects[signer.masterFingerprint] = encrytedSigner;
+ signersObjects[getKeyUID(signer)] = encrytedSigner;
}
} else {
// update all wallets and signers
@@ -118,7 +119,7 @@ export function* updateAppImageWorker({
for (const index in signers) {
const signer = signers[index];
const encrytedSigner = encrypt(encryptionKey, JSON.stringify(signer));
- signersObjects[signer.masterFingerprint] = encrytedSigner;
+ signersObjects[getKeyUID(signer)] = encrytedSigner;
}
}
@@ -186,7 +187,8 @@ export function* updateVaultImageWorker({
}> = [];
for (const signer of vault.signers) {
signersData.push({
- signerId: signer.xfp,
+ // TODO: Upate relay to use KeyUID
+ signerId: getKeyUID(signer),
xfpHash: hash256(signer.masterFingerprint),
});
}
@@ -246,12 +248,7 @@ export function* deleteAppImageEntityWorker({
}
if (signerIds?.length > 0) {
for (const signerId of signerIds) {
- yield call(
- dbManager.deleteObjectByPrimaryKey,
- RealmSchema.Signer,
- 'masterFingerprint',
- signerId
- );
+ yield call(dbManager.deleteObjectByPrimaryKey, RealmSchema.Signer, 'id', signerId);
}
}
return response;
@@ -466,6 +463,9 @@ function* recoverApp(
for (const [key, value] of Object.entries(appImage.signers)) {
try {
const decrytpedSigner: Signer = JSON.parse(decrypt(encryptionKey, value));
+ if (!decrytpedSigner?.id) {
+ decrytpedSigner.id = getKeyUID(decrytpedSigner);
+ }
yield call(dbManager.createObject, RealmSchema.Signer, decrytpedSigner);
} catch (err) {
console.log('Error recovering a signer: ', err);
@@ -517,6 +517,7 @@ function* recoverApp(
}
});
const signerObject = {
+ id: getKeyUID(signer),
masterFingerprint: signer.masterFingerprint,
type: signer.type,
signerName: getSignerNameFromType(signer.type, signer.isMock, false),
@@ -626,28 +627,30 @@ function* healthCheckSatutsUpdateWorker({
];
const { signerUpdates } = payload;
for (const signerUpdate of signerUpdates) {
- const signerRealm: Signer = dbManager.getObjectByPrimaryId(
+ const signersRealm: Signer[] = dbManager.getObjectByField(
RealmSchema.Signer,
- 'masterFingerprint',
- signerUpdate.signerId
+ signerUpdate.signerId,
+ 'masterFingerprint'
);
- const signer: Signer = getJSONFromRealmObject(signerRealm);
- if (signer) {
- const date = new Date();
- const newHealthCheckDetails: HealthCheckDetails = {
- type: signerUpdate.status,
- actionDate: date,
- };
-
- const oldDetialsArray = [...signer.healthCheckDetails];
- const oldDetails = oldDetialsArray.map((details) => {
- return { ...details, date: new Date(details.actionDate) };
- });
+ for (const signerRealm of signersRealm) {
+ const signer: Signer = getJSONFromRealmObject(signerRealm);
+ if (signer) {
+ const date = new Date();
+ const newHealthCheckDetails: HealthCheckDetails = {
+ type: signerUpdate.status,
+ actionDate: date,
+ };
+
+ const oldDetialsArray = [...signer.healthCheckDetails];
+ const oldDetails = oldDetialsArray.map((details) => {
+ return { ...details, date: new Date(details.actionDate) };
+ });
- const updatedDetailsArray: HealthCheckDetails[] = [...oldDetails, newHealthCheckDetails];
+ const updatedDetailsArray: HealthCheckDetails[] = [...oldDetails, newHealthCheckDetails];
- yield put(updateSignerDetails(signer, 'healthCheckDetails', updatedDetailsArray));
- if (HcSuccessTypes.includes(signerUpdate.status)) yield put(healthCheckSigner([signer]));
+ yield put(updateSignerDetails(signer, 'healthCheckDetails', updatedDetailsArray));
+ if (HcSuccessTypes.includes(signerUpdate.status)) yield put(healthCheckSigner([signer]));
+ }
}
}
} catch (err) {
diff --git a/src/store/sagas/concierge.ts b/src/store/sagas/concierge.ts
index f9781a417..68bffdac0 100644
--- a/src/store/sagas/concierge.ts
+++ b/src/store/sagas/concierge.ts
@@ -2,7 +2,7 @@ import { call, put, select } from 'redux-saga/effects';
import { createWatcher } from '../utilities';
import { GO_TO_CONCEIERGE, OPEN_CONCEIERGE } from '../sagaActions/concierge';
import * as Zendesk from 'react-native-zendesk-messaging';
-import { Platform } from 'react-native';
+import { Linking, Platform } from 'react-native';
import DeviceInfo from 'react-native-device-info';
import { KeeperApp } from 'src/models/interfaces/KeeperApp';
import { RealmSchema } from 'src/storage/realm/enum';
@@ -40,10 +40,12 @@ function* openConceirge({
}) {
const { dontShow } = payload;
if (dontShow) yield put(setDontShowConceirgeOnboarding());
- const { publicId, subscription }: KeeperApp = yield call(
- dbManager.getObjectByIndex,
- RealmSchema.KeeperApp
- );
+ const res = yield call(dbManager.getObjectByIndex, RealmSchema.KeeperApp);
+ if (!res?.publicId || !res?.subscription) {
+ Linking.openURL('https://help.bitcoinkeeper.app/hc/en-us');
+ return;
+ }
+ const { publicId, subscription }: KeeperApp = res;
const { tags } = yield select((state: RootState) => state.concierge);
const versionHistory = yield call(dbManager.getObjectByIndex, RealmSchema.VersionHistory);
yield call(Zendesk.clearConversationFields);
diff --git a/src/store/sagas/send_and_receive.ts b/src/store/sagas/send_and_receive.ts
index e785aee0f..e2ce12141 100644
--- a/src/store/sagas/send_and_receive.ts
+++ b/src/store/sagas/send_and_receive.ts
@@ -4,7 +4,7 @@ import { call, put, select } from 'redux-saga/effects';
import { RealmSchema } from 'src/storage/realm/enum';
import Relay from 'src/services/backend/Relay';
-import { Vault } from 'src/services/wallets/interfaces/vault';
+import { Signer, Vault } from 'src/services/wallets/interfaces/vault';
import WalletOperations from 'src/services/wallets/operations';
import WalletUtilities from 'src/services/wallets/operations/utils';
import _ from 'lodash';
@@ -50,6 +50,7 @@ import {
import { addLabelsWorker } from './utxos';
import { setElectrumNotConnectedErr } from '../reducers/login';
import { connectToNodeWorker } from './network';
+import { getKeyUID } from 'src/utils/utilities';
export function* fetchFeeRatesWorker() {
try {
@@ -150,7 +151,7 @@ function* sendPhaseTwoWorker({ payload }: SendPhaseTwoAction) {
(state) => state.sendAndReceive.customPrioritySendPhaseOne
);
- const { wallet, txnPriority, note, label, transferType } = payload;
+ const { wallet, txnPriority, miniscriptTxElements, note, label, transferType } = payload;
const txPrerequisites = _.cloneDeep(idx(sendPhaseOneResults, (_) => _.outputs.txPrerequisites)); // cloning object(mutable) as reducer states are immutable
const customTxPrerequisites = _.cloneDeep(
idx(customSendPhaseOneResults, (_) => _.outputs.customTxPrerequisites)
@@ -161,7 +162,7 @@ function* sendPhaseTwoWorker({ payload }: SendPhaseTwoAction) {
if (wallet.entityKind === EntityKind.VAULT) {
dbManager
.getCollection(RealmSchema.Signer)
- .forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ .forEach((signer) => (signerMap[getKeyUID(signer as Signer)] = signer));
}
try {
const { txid, serializedPSBTEnvelops, cachedTxid, finalOutputs } = yield call(
@@ -171,7 +172,8 @@ function* sendPhaseTwoWorker({ payload }: SendPhaseTwoAction) {
txnPriority,
recipients,
customTxPrerequisites,
- signerMap
+ signerMap,
+ miniscriptTxElements
);
switch (wallet.entityKind) {
@@ -262,25 +264,15 @@ function* sendPhaseThreeWorker({ payload }: SendPhaseThreeAction) {
idx(customSendPhaseOneResults, (_) => _.outputs.customTxPrerequisites)
);
- const { wallet, txnPriority, note, label } = payload;
+ const { wallet, txnPriority, miniscriptTxElements, note, label } = payload;
const recipients = idx(sendPhaseOneResults, (_) => _.outputs.txRecipients[txnPriority]);
try {
- const threshold = (wallet as Vault).scheme.m;
- let availableSignatures = 0;
let txHex;
for (const serializedPSBTEnvelop of serializedPSBTEnvelops) {
- if (serializedPSBTEnvelop.isSigned) {
- availableSignatures++;
- }
if (serializedPSBTEnvelop.txHex) {
txHex = serializedPSBTEnvelop.txHex; // txHex is given out by COLDCARD, KEYSTONE and TREZOR post signing
}
}
- if (availableSignatures < threshold) {
- throw new Error(
- `Insufficient signatures, required:${threshold} provided:${availableSignatures}`
- );
- }
const { txid, finalOutputs } = yield call(
WalletOperations.transferST3,
@@ -289,7 +281,8 @@ function* sendPhaseThreeWorker({ payload }: SendPhaseThreeAction) {
txPrerequisites,
txnPriority,
customTxPrerequisites,
- txHex
+ txHex,
+ miniscriptTxElements
);
if (!txid) throw new Error('Send failed: unable to generate txid using the signed PSBT');
yield put(
@@ -452,15 +445,16 @@ function* calculateCustomFee({ payload }: CalculateCustomFeeAction) {
}
outputs = outputsArray;
} else {
- if (txPrerequisites)
+ if (txPrerequisites) {
outputs = txPrerequisites[TxPriority.LOW].outputs.filter((output) => output.address);
+ }
}
if (!outputs) {
yield put(
customFeeCalculated({
successful: false,
- err: `Transaction recipients not provided`,
+ err: 'Transaction recipients not provided',
})
);
}
@@ -497,7 +491,7 @@ function* calculateCustomFee({ payload }: CalculateCustomFeeAction) {
yield put(
customFeeCalculated({
successful: false,
- err: `Fee is too high for your balance, please select another option`,
+ err: 'Fee is too high for your balance, please select another option',
})
);
}
@@ -505,7 +499,7 @@ function* calculateCustomFee({ payload }: CalculateCustomFeeAction) {
yield put(
customFeeCalculated({
successful: false,
- err: err,
+ err,
})
);
}
diff --git a/src/store/sagas/uai.ts b/src/store/sagas/uai.ts
index 1ae8ca07e..f60b18cc3 100644
--- a/src/store/sagas/uai.ts
+++ b/src/store/sagas/uai.ts
@@ -156,7 +156,7 @@ function* uaiChecksWorker({ payload }) {
if (
wallet.entityKind === EntityKind.WALLET &&
wallet?.transferPolicy?.threshold > 0 &&
- wallet.specs.balances.confirmed + (isTestnet() ? wallet.specs.balances.unconfirmed : 0) >=
+ wallet.specs.balances.confirmed + wallet.specs.balances.unconfirmed >=
Number(wallet?.transferPolicy?.threshold)
) {
if (!uai) {
@@ -225,26 +225,27 @@ function* uaiChecksWorker({ payload }) {
if (uaiCollectionHC.length > 0) {
for (const uai of uaiCollectionHC) {
- const signer: Signer = dbManager.getObjectByPrimaryId(
+ const signers: Signer[] = dbManager.getObjectByField(
RealmSchema.Signer,
'masterFingerprint',
uai.entityId
);
-
- if (signer) {
- const lastHealthCheck = isTestnet()
- ? healthCheckReminderHours(signer.lastHealthCheck)
- : healthCheckReminderDays(signer.lastHealthCheck);
- if (
- lastHealthCheck < healthCheckReminderThreshold ||
- signer.hidden ||
- signer.type === SignerType.MY_KEEPER
- ) {
+ for (const signer of signers) {
+ if (signer) {
+ const lastHealthCheck = isTestnet()
+ ? healthCheckReminderHours(signer.lastHealthCheck)
+ : healthCheckReminderDays(signer.lastHealthCheck);
+ if (
+ lastHealthCheck < healthCheckReminderThreshold ||
+ signer.hidden ||
+ signer.type === SignerType.MY_KEEPER
+ ) {
+ yield put(uaiActioned({ uaiId: uai.id, action: true }));
+ }
+ } //no signer for the UAI that alreay exisists
+ else {
yield put(uaiActioned({ uaiId: uai.id, action: true }));
}
- } //no signer for the UAI that alreay exisists
- else {
- yield put(uaiActioned({ uaiId: uai.id, action: true }));
}
}
}
diff --git a/src/store/sagas/upgrade.ts b/src/store/sagas/upgrade.ts
index 3f9ac7383..a06c85fbf 100644
--- a/src/store/sagas/upgrade.ts
+++ b/src/store/sagas/upgrade.ts
@@ -36,6 +36,7 @@ import { createWatcher } from '../utilities';
import { setAppVersion } from '../reducers/storage';
import { addWhirlpoolWalletsWorker } from './wallets';
import { hcStatusType } from 'src/models/interfaces/HeathCheckTypes';
+import { getKeyUID } from 'src/utils/utilities';
export const LABELS_INTRODUCTION_VERSION = '1.0.4';
export const BIP329_INTRODUCTION_VERSION = '1.0.7';
@@ -191,10 +192,10 @@ function* migrateAssistedKeys() {
const signerMap = {};
dbManager
.getCollection(RealmSchema.Signer)
- .forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ .forEach((signer) => (signerMap[getKeyUID(signer as Signer)] = signer));
for (const signer of signers) {
- const signerType = signerMap[signer.masterFingerprint].type;
+ const signerType = signerMap[getKeyUID(signer)].type;
if (signerType === SignerType.POLICY_SERVER) {
const cosignersMapUpdates: CosignersMapUpdate[] = yield call(
@@ -238,14 +239,14 @@ function* assistedKeysCosignersEnrichment() {
const signerMap = {};
dbManager
.getCollection(RealmSchema.Signer)
- .forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ .forEach((signer) => (signerMap[getKeyUID(signer as Signer)] = signer));
for (const vault of vaults) {
const { signers: keys } = vault;
// identical logic to VaultFactory's updateCosignersMapForAssistedKeys, different API calls(enrichment) tho
for (const key of keys) {
- const assistedKeyType = signerMap[key.masterFingerprint]?.type;
+ const assistedKeyType = signerMap[getKeyUID(key)]?.type;
if (
assistedKeyType === SignerType.POLICY_SERVER ||
assistedKeyType === SignerType.INHERITANCEKEY
@@ -357,10 +358,10 @@ function generateExtendedKeysForSigners(signers, appKeyWalletMap) {
function updateVaultSigners(extendedKeyMap, signers) {
const signerMap = {};
- signers.forEach((signer) => (signerMap[signer.masterFingerprint] = signer));
+ signers.forEach((signer) => (signerMap[getKeyUID(signer)] = signer));
const vaultKeys: VaultSigner[] = dbManager.getCollection(RealmSchema.VaultSigner);
for (const vaultKey of vaultKeys) {
- const signer = signerMap[vaultKey.masterFingerprint];
+ const signer = signerMap[getKeyUID(vaultKey)];
if (signer && signer.type === SignerType.KEEPER && extendedKeyMap[vaultKey.masterFingerprint]) {
dbManager.updateObjectByPrimaryId(RealmSchema.VaultSigner, 'xpub', vaultKey.xpub, {
xpriv: extendedKeyMap[vaultKey.masterFingerprint].xpriv,
diff --git a/src/store/sagas/wallets.ts b/src/store/sagas/wallets.ts
index 22e40bd3a..f9af25eb8 100644
--- a/src/store/sagas/wallets.ts
+++ b/src/store/sagas/wallets.ts
@@ -4,6 +4,7 @@
import {
DerivationPurpose,
EntityKind,
+ MultisigScriptType,
SignerType,
VaultType,
VisibilityType,
@@ -18,6 +19,8 @@ import {
SignerRestriction,
} from 'src/models/interfaces/AssistedKeys';
import {
+ MiniscriptElements,
+ MiniscriptScheme,
Signer,
Vault,
VaultPresentationData,
@@ -53,7 +56,10 @@ import WalletUtilities from 'src/services/wallets/operations/utils';
import config from 'src/utils/service-utilities/config';
import { createWatcher } from 'src/store/utilities';
import dbManager from 'src/storage/realm/dbManager';
-import { generateVault } from 'src/services/wallets/factories/VaultFactory';
+import {
+ generateMiniscriptScheme,
+ generateVault,
+} from 'src/services/wallets/factories/VaultFactory';
import {
generateWallet,
generateWalletSpecsFromMnemonic,
@@ -76,6 +82,8 @@ import ElectrumClient, {
import InheritanceKeyServer from 'src/services/backend/InheritanceKey';
import idx from 'idx';
import _ from 'lodash';
+import { getSignerDescription } from 'src/hardware';
+import { SyncedWallet } from 'src/services/wallets/interfaces';
import { RootState } from '../store';
import {
initiateVaultMigration,
@@ -146,7 +154,7 @@ import { setElectrumNotConnectedErr } from '../reducers/login';
import { connectToNodeWorker } from './network';
import { backupBsmsOnCloud } from '../sagaActions/bhr';
import { bulkUpdateLabelsWorker } from './utxos';
-import { SyncedWallet } from 'src/services/wallets/interfaces';
+import { checkSignerAccountsMatch, getAccountFromSigner, getKeyUID } from 'src/utils/utilities';
export interface NewVaultDetails {
name?: string;
@@ -332,12 +340,12 @@ export function* addWhirlpoolWalletsWorker({
],
};
- //update whirlpool config in parent walletId
+ // update whirlpool config in parent walletId
yield call(updateWalletsPropertyWorker, {
payload: { walletId: depositWallet.id, key: 'whirlpoolConfig', value: whirlpoolConfig },
});
- //create premix,postmix,badbank wallets
+ // create premix,postmix,badbank wallets
const newWalletsInfo: NewWalletInfo[] = [
preMixWalletInfo,
postMixWalletInfo,
@@ -504,6 +512,7 @@ export interface NewVaultInfo {
vaultType: VaultType;
vaultScheme: VaultScheme;
vaultSigners: VaultSigner[];
+ miniscriptElements?: MiniscriptElements;
vaultDetails?: NewVaultDetails;
}
@@ -523,10 +532,9 @@ export function* addNewVaultWorker({
let { vault } = payload;
const signerMap = {};
const signingDevices: Signer[] = yield call(dbManager.getCollection, RealmSchema.Signer);
- signingDevices.forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ signingDevices.forEach((signer) => (signerMap[getKeyUID(signer)] = signer));
- let isNewVault = false;
- // When the vault is passed directly during upgrade/downgrade process
+ let isNewVault = false; // When the vault is passed directly during upgrade/downgrade process
if (!vault) {
const {
vaultType = VaultType.DEFAULT,
@@ -535,8 +543,10 @@ export function* addNewVaultWorker({
vaultDetails,
} = newVaultInfo;
- if (vaultScheme.n !== vaultSigners.length) {
- throw new Error('Vault schema(n) and signers mismatch');
+ if (vaultScheme.multisigScriptType !== MultisigScriptType.MINISCRIPT_MULTISIG) {
+ if (vaultScheme.n !== vaultSigners.length) {
+ throw new Error('Vault schema(n) and signers mismatch');
+ }
}
const tempShellId = yield select((state: RootState) => state.vault.tempShellId);
@@ -559,23 +569,21 @@ export function* addNewVaultWorker({
if (isNewVault || isMigrated) {
// update IKS, if inheritance key has been added(new Vault) or needs an update(vault migration)
const [ikVaultKey] = vault.signers.filter(
- (vaultKey) => signerMap[vaultKey.masterFingerprint]?.type === SignerType.INHERITANCEKEY
+ (vaultKey) => signerMap[getKeyUID(vaultKey)]?.type === SignerType.INHERITANCEKEY
);
if (ikVaultKey) {
- const ikSigner: Signer = signerMap[ikVaultKey.masterFingerprint];
+ const ikSigner: Signer = signerMap[getKeyUID(ikVaultKey)];
yield call(finaliseIKSetupWorker, { payload: { ikSigner, ikVaultKey, vault } });
}
}
-
yield put(setRelayVaultUpdateLoading(true));
const newVaultResponse = yield call(updateVaultImageWorker, { payload: { vault } });
-
if (newVaultResponse.updated) {
yield call(dbManager.createObject, RealmSchema.Vault, vault);
yield put(uaiChecks([uaiType.SECURE_VAULT]));
if (isMigrated) {
- let oldVault = dbManager.getObjectById(RealmSchema.Vault, oldVaultId).toJSON() as Vault;
+ const oldVault = dbManager.getObjectById(RealmSchema.Vault, oldVaultId).toJSON() as Vault;
const updatedParams = {
archived: true,
archivedId: oldVault.archivedId ? oldVault.archivedId : oldVault.id,
@@ -634,7 +642,7 @@ export function* addSigningDeviceWorker({
const existingSigners: Signer[] = yield call(dbManager.getCollection, RealmSchema.Signer);
const filteredSigners = existingSigners.filter((s) => !s.archived);
const signerMap = Object.fromEntries(
- filteredSigners.map((signer) => [signer.masterFingerprint, signer])
+ filteredSigners.map((signer) => [getKeyUID(signer), signer])
);
let signersToUpdate = [];
@@ -666,8 +674,20 @@ export function* addSigningDeviceWorker({
newSigner.signerXpubs[type][0].xpub !== existingSigner.signerXpubs[type][0].xpub;
for (const newSigner of signers) {
- const existingSigner = signerMap[newSigner.masterFingerprint];
+ if (!checkSignerAccountsMatch(newSigner)) {
+ yield put(
+ relaySignersUpdateFail(
+ `Cannot add multiple accounts in the same signer, please import each account separately`
+ )
+ );
+ continue;
+ }
+ const existingSigner = signerMap[getKeyUID(newSigner)];
if (!existingSigner) {
+ const signerAccount = getAccountFromSigner(newSigner);
+ if (signerAccount !== 0 && !newSigner.signerDescription) {
+ newSigner.signerDescription = 'Account #' + signerAccount;
+ }
signersToUpdate.push(newSigner);
continue;
}
@@ -675,13 +695,22 @@ export function* addSigningDeviceWorker({
const existingSsKey = idx(existingSigner, (_) => _.signerXpubs[XpubTypes.P2WPKH][0].xpub);
const newMsKey = idx(newSigner, (_) => _.signerXpubs[XpubTypes.P2WSH][0].xpub);
const existingMsKey = idx(existingSigner, (_) => _.signerXpubs[XpubTypes.P2WSH][0].xpub);
- const missingMsKey = existingSsKey && !existingMsKey;
- const missingSsKey = !existingSsKey && existingMsKey;
+ const newTrKey = idx(newSigner, (_) => _.signerXpubs[XpubTypes.P2TR][0].xpub);
+ const existingTrKey = idx(existingSigner, (_) => _.signerXpubs[XpubTypes.P2TR][0].xpub);
+ const missingMsKey = (existingSsKey || existingTrKey) && !existingMsKey;
+ const missingSsKey = (existingMsKey || existingTrKey) && !existingSsKey;
+ const missingTrKey = (existingSsKey || existingMsKey) && !existingTrKey;
const singleSigMatch = keysMatch(XpubTypes.P2WPKH, newSigner, existingSigner);
const multiSigMatch = keysMatch(XpubTypes.P2WSH, newSigner, existingSigner);
+ const taprootMatch = keysMatch(XpubTypes.P2TR, newSigner, existingSigner);
const signerMergeCondition = // if the new signer has one of the keys missing or has the same xpubs as the existing signer, then update the type and xpubs
- (missingMsKey && newMsKey) || (missingSsKey && newSsKey) || singleSigMatch || multiSigMatch;
+ (missingMsKey && newMsKey) ||
+ (missingSsKey && newSsKey) ||
+ (missingTrKey && newTrKey) ||
+ singleSigMatch ||
+ multiSigMatch ||
+ taprootMatch;
if (signerMergeCondition) {
signersToUpdate.push({
@@ -696,12 +725,13 @@ export function* addSigningDeviceWorker({
const singleSigDifferent = keysDifferent(XpubTypes.P2WPKH, newSigner, existingSigner);
const multiSigDifferent = keysDifferent(XpubTypes.P2WSH, newSigner, existingSigner);
+ const taprootDifferent = keysDifferent(XpubTypes.P2TR, newSigner, existingSigner);
// if the new signer has multiple accounts of the same type, then let the user know and skip the update
- if (singleSigDifferent || multiSigDifferent) {
+ if (singleSigDifferent || multiSigDifferent || taprootDifferent) {
yield put(
relaySignersUpdateFail(
- `A different account has already been added. Please use the existing key for the signer ${newSigner.masterFingerprint}`
+ `Signer with the same account and fingerprint (${newSigner.masterFingerprint}) already exists with different xpubs. Please check your device and verify the keys are correct.`
)
);
continue;
@@ -709,12 +739,16 @@ export function* addSigningDeviceWorker({
}
if (signersToUpdate.length) {
const signerMap = Object.fromEntries(
- existingSigners.map((signer) => [signer.masterFingerprint, signer])
+ existingSigners.map((signer) => [getKeyUID(signer), signer])
);
signersToUpdate = signersToUpdate.map((s) => {
- const isSignerArchived = signerMap[s.masterFingerprint]?.archived || false;
+ const isSignerArchived = signerMap[getKeyUID(s)]?.archived || false;
return isSignerArchived ? { ...s, archived: false, hidden: false } : s;
});
+ signersToUpdate = signersToUpdate.map((signer) => ({
+ ...signer,
+ id: getKeyUID(signer),
+ }));
yield put(setRelaySignersUpdateLoading(true));
const response = yield call(updateAppImageWorker, { payload: { signers: signersToUpdate } });
if (response.updated) {
@@ -752,9 +786,9 @@ function* deleteSigningDeviceWorker({ payload: { signers } }: { payload: { signe
try {
if (signers.length) {
yield put(showDeletingKeyModal());
- let signersToDeleteIds = [];
+ const signersToDeleteIds = [];
for (const signer of signers) {
- signersToDeleteIds.push(signer.masterFingerprint);
+ signersToDeleteIds.push(getKeyUID(signer));
}
for (let i = 0; i < signers.length; i++) {
yield call(deleteAppImageEntityWorker, {
@@ -781,9 +815,9 @@ export const deleteSigningDeviceWatcher = createWatcher(
function* archiveSigningDeviceWorker({ payload: { signers } }: { payload: { signers: Signer[] } }) {
try {
- let signersToArchiveIds = [];
+ const signersToArchiveIds = [];
for (const signer of signers) {
- signersToArchiveIds.push(signer.masterFingerprint);
+ signersToArchiveIds.push(getKeyUID(signer));
}
if (signers.length) {
for (let i = 0; i < signers.length; i++) {
@@ -822,15 +856,17 @@ function* migrateVaultWorker({
} = payload.newVaultData;
const { vaultShellId } = payload;
- if (vaultScheme.n !== vaultSigners.length) {
- throw new Error('Vault schema(n) and signers mismatch');
+ if (vaultScheme.multisigScriptType !== MultisigScriptType.MINISCRIPT_MULTISIG) {
+ if (vaultScheme.n !== vaultSigners.length) {
+ throw new Error('Vault schema(n) and signers mismatch');
+ }
}
const networkType = config.NETWORK_TYPE;
const signerMap = {};
const signingDevices: Signer[] = yield call(dbManager.getCollection, RealmSchema.Signer);
- signingDevices.forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ signingDevices.forEach((signer) => (signerMap[getKeyUID(signer)] = signer));
const vault: Vault = yield call(generateVault, {
type: vaultType,
@@ -1005,11 +1041,11 @@ function* finaliseIKSetupWorker({
if (updatedInheritanceKeyInfo) {
// send updates to realm
+ const signerKeyUID = getKeyUID(ikSigner);
yield call(
- dbManager.updateObjectByPrimaryId,
+ dbManager.updateObjectByQuery,
RealmSchema.Signer,
- 'masterFingerprint',
- ikSigner.masterFingerprint,
+ (realmSigner) => getKeyUID(realmSigner) === signerKeyUID,
{
inheritanceKeyInfo: updatedInheritanceKeyInfo,
}
@@ -1072,7 +1108,7 @@ function* refreshWalletsWorker({
labels = yield call(dbManager.getCollection, RealmSchema.Tags);
}
for (const synchedWalletWithUTXOs of synchedWallets) {
- const synchedWallet = synchedWalletWithUTXOs.synchedWallet;
+ const { synchedWallet } = synchedWalletWithUTXOs;
// if (!synchedWallet.specs.hasNewUpdates) continue; // no new updates found
for (const utxo of synchedWalletWithUTXOs.newUTXOs) {
@@ -1301,11 +1337,11 @@ export function* updateSignerPolicyWorker({
};
yield put(setSignerPolicyError('success'));
+ const signerKeyUID = getKeyUID(signer);
yield call(
- dbManager.updateObjectByPrimaryId,
+ dbManager.updateObjectByQuery,
RealmSchema.Signer,
- 'masterFingerprint',
- signer.masterFingerprint,
+ (realmSigner) => getKeyUID(realmSigner) === signerKeyUID,
{
signerPolicy: updatedSignerPolicy,
}
@@ -1491,11 +1527,11 @@ export function* updateSignerDetailsWorker({ payload }) {
try {
const response = yield call(updateAppImageWorker, { payload: { signers: [signer] } });
if (response.updated) {
+ const signerKeyUID = getKeyUID(signer);
yield call(
- dbManager.updateObjectByPrimaryId,
+ dbManager.updateObjectByQuery,
RealmSchema.Signer,
- 'masterFingerprint',
- signer.masterFingerprint,
+ (realmSigner) => getKeyUID(realmSigner) === signerKeyUID,
{
[key]: value,
}
@@ -1642,14 +1678,14 @@ function* reinstateVaultWorker({ payload }) {
});
const signerMap = {};
const signingDevices: Signer[] = yield call(dbManager.getCollection, RealmSchema.Signer);
- signingDevices.forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ signingDevices.forEach((signer) => (signerMap[getKeyUID(signer)] = signer));
if (response.updated) {
yield call(dbManager.updateObjectById, RealmSchema.Vault, vaultId, updatedParams);
for (let i = 0; i < vault.signers.length; i++) {
yield call(updateSignerDetailsWorker, {
payload: {
- signer: signerMap[vault.signers[i].masterFingerprint],
+ signer: signerMap[getKeyUID(vault.signers[i])],
key: 'archived',
value: false,
},
@@ -1673,14 +1709,14 @@ function* refillMobileKeyWorker({ payload }) {
const { vaultKey } = payload;
try {
yield put(setKeyHealthCheckLoading(true));
- const { masterFingerprint, xpriv } = vaultKey;
+ const { xpriv } = vaultKey;
if (!xpriv) {
const signerMap = {};
const signingDevices: Signer[] = yield call(dbManager.getCollection, RealmSchema.Signer);
- signingDevices.forEach((signer) => (signerMap[signer.masterFingerprint as string] = signer));
+ signingDevices.forEach((signer) => (signerMap[getKeyUID(signer)] = signer));
const keeper: KeeperApp = dbManager.getCollection(RealmSchema.KeeperApp)[0];
const { primaryMnemonic } = keeper;
- const signer = signerMap[masterFingerprint];
+ const signer = signerMap[getKeyUID(vaultKey)];
const details = yield call(
getCosignerDetails,
primaryMnemonic,
@@ -1750,21 +1786,21 @@ function* mergeSimilarKeysWorker({ payload }: { payload: { signer: Signer } }) {
p2wsh === signerp2wsh &&
s.masterFingerprint !== signer.masterFingerprint
) {
+ const signerKeyUID = getKeyUID(s);
yield call(
- dbManager.updateObjectByPrimaryId,
+ dbManager.updateObjectByQuery,
RealmSchema.Signer,
- 'masterFingerprint',
- s.masterFingerprint,
+ (realmSigner) => getKeyUID(realmSigner) === signerKeyUID,
{
masterFingerprint: signer.masterFingerprint,
}
);
// get all keys that have the same masterFingerprint
const keys = yield call(
- dbManager.getObjectByField,
+ dbManager.getObjectByQuery,
RealmSchema.VaultSigner,
- s.masterFingerprint,
- 'masterFingerprint'
+ (obj) => getKeyUID(obj) === getKeyUID(s),
+ true // get all matching objects
);
for (let i = 0; i < keys.length; i++) {
yield call(
diff --git a/src/theme/Colors.ts b/src/theme/Colors.ts
index e8b955d0e..b33513f59 100644
--- a/src/theme/Colors.ts
+++ b/src/theme/Colors.ts
@@ -17,6 +17,7 @@ const Colors = {
DimGray: 'rgba(108,108,108,1)',
GraniteGray: 'rgba(36,49,46,1)',
Feldgrau: 'rgba(79,89,85,1)',
+ FeldgrauDark: 'rgba(79, 89, 85, 1)',
DeepSpaceSparkle: 'rgba(78,92,106,1)',
Black: 'rgba(0,0,0,1)',
PrimaryBlack: 'rgba(18, 18, 18, 1)',
@@ -60,6 +61,9 @@ const Colors = {
pantoneGreen: 'rgba(45,103,89,1)',
pantoneGreenLight: 'rgba(45,103,89,0.08)',
lightGreen: 'rgb(65, 117, 104)',
+ pastelGreen: 'rgba(229, 234, 226, 1)',
+ // Champagne: 'rgba(247,242,236,1)',
+ // Warmbeige: 'rgba(247, 242, 236, 1)',
Warmbeige: 'rgba(247, 242, 236, 1)',
WarmBeigeTranslucent: 'rgba(247, 242, 236, 0.3)',
RussetBrown: 'rgba(145, 120, 93, 1)',
@@ -112,16 +116,18 @@ const Colors = {
Periwinkle: 'rgba(184, 182, 208, 1)',
PeriwinkleDark: 'rgba(132, 131, 153, 1)',
Purple: 'rgba(204, 184, 214, 1)',
+ SilverMistTransparent: 'rgba(212, 212, 212, 0.1)',
+ LimeYellow: 'rgba(248, 241, 178, 1)',
+ // ChampagneBliss: 'rgba(253, 247, 240, 1)',
ChampagneBliss: 'rgba(253, 247, 240, 1)',
SilverMistSolid: 'rgba(212, 212, 212, 1)',
SilverMist: 'rgba(212, 212, 212, 0.6)',
- SilverMistTransparent: 'rgba(212, 212, 212, 0.1)',
SilverMistTranslucent: 'rgba(212, 212, 212, 0.6)',
Graphite: 'rgba(135, 135, 135, 1)',
GraphiteLight: 'rgba(165, 165, 165, 1)',
SeaShellBeige: 'rgba(242, 237, 230, 1)',
- LimeYellow: 'rgba(248, 241, 178, 1)',
SeaweedGreen: 'rgba(45, 103, 89, 1)',
+ pastelGreen: 'rgba(229, 234, 226, 1)',
LightCrimson: 'rgba(229, 69, 69, 1)',
CoralRed: 'rgba(248, 107, 80, 1)',
MediumGrey: 'rgba(142, 142, 142, 1)',
@@ -162,5 +168,7 @@ const Colors = {
ErrorToastDark: 'rgba(58, 41, 41, 1)',
DashedButtonBackground: 'rgba(45, 103, 89, 0.04)',
DashedButtonBackgroundDark: 'rgba(65, 89, 76, 0.05)',
+ lightGrey: 'rgba(228, 226, 223, 1)',
+ darkGrey: 'rgba(165, 165, 165, 1)',
};
export default Colors;
diff --git a/src/utils/GenerateLetterToAtternyPDFInheritanceTool.ts b/src/utils/GenerateLetterToAtternyPDFInheritanceTool.ts
index 2ad018c90..44b584432 100644
--- a/src/utils/GenerateLetterToAtternyPDFInheritanceTool.ts
+++ b/src/utils/GenerateLetterToAtternyPDFInheritanceTool.ts
@@ -51,38 +51,44 @@ const GenerateLetterToAtternyPDFInheritanceTool = async (fingerPrints) => {
is held in bitcoin, it is crucial to ensure that the legal transfer of these assets is
appropriately addressed.
- Below, I have outlined the specific details regarding my bitcoin holdings:
- 1. Bitcoin Key Information:
+ Below, I have outlined the specific details regarding the keys controlling my bitcoin holdings:
+ Bitcoin Key Information:
${fingerPrints.map((keys, index) => `Key ${index + 1} Fingerprint: ${keys} `).join('')}
- These master fingerprints act as unique identifiers for the respective keys without revealing
- any sensitive details. Following the BIP32 (Bitcoin Improvement Proposal 32) standard, each
- fingerprint helps identify the associated extended public key (xPub). The xPub serves as
- a distinct identifier that can be utilized by a digital asset expert or software, adhering to
- standard BIP32 derivation paths, to locate and validate the keys during the transfer process.
+ These master fingerprints represent the private keys that control the funds, not the funds
+ themselves. Master fingerprints uniquely identify the associated private keys, which can
+ generate derived keys as per the BIP32 (Bitcoin Improvement Proposal 32) standard or other
+ derivation paths.
- It is my explicit intention that the legal title to my bitcoin holdings be transferred to the
- designated heir or intended beneficiary. However, it is important to note that access to the
- actual keys and, consequently, the bitcoin will be provided separately to the intended
- beneficiary. This letter solely addresses the transfer of legal title and the inclusion of my
- bitcoin assets in my will.
+ The derived or original keys can hold funds directly or be used in combination with other keys
+ to control wallets. In certain cases, the keys may incorporate time-based conditions, meaning
+ they may not be active immediately or may only be used under specific circumstances.
- Please ensure that these master fingerprints and the accompanying explanation of their
- usage are accurately recorded in my will. Further details regarding the designated
- beneficiary, executor, and any supplementary instructions will be provided separately
- during the will creation.
+ The private keys represented by these fingerprints control access to the bitcoin wallets and,
+ ultimately, the funds. It is my explicit intention that the legal title to my bitcoin
+ holdings—including all wallets controlled by these keys, derived or otherwise—be transferred
+ to the designated heir or intended beneficiary. Access to the actual keys and, consequently,
+ the bitcoin will be provided separately to the intended beneficiary. This letter solely
+ addresses the transfer of legal title and the inclusion of my bitcoin assets in my will.
+
+
+ Please ensure that the above master fingerprints, along with the explanation of their
+ role in controlling the funds, are accurately recorded in my will. Additional details
+ regarding the designated beneficiary, executor, and any supplementary instructions
+ will be provided separately during the will creation.
I have confidence in your expertise to handle this confidential information securely. Should
you require additional documentation or information from me, please do not hesitate to
- contact me. Your support and meticulous attention to detail in facilitating the transfer of
+ contact me. Your support and meticulous attention to detail in facilitating the transfer of
the legal title to my bitcoin holdings are greatly appreciated.
- Thank you for your professional assistance in preparing my will and ensuring the proper
+
+ Thank you for your professional assistance in preparing my will and ensuring the proper
transfer of the legal title to my bitcoin assets according to my wishes.
Sincerely,
diff --git a/src/utils/service-utilities/config.ts b/src/utils/service-utilities/config.ts
index 473fe665a..f3581b142 100644
--- a/src/utils/service-utilities/config.ts
+++ b/src/utils/service-utilities/config.ts
@@ -134,6 +134,10 @@ class Configuration {
this.NETWORK_TYPE = network;
this.NETWORK = isTestnet ? bitcoinJS.networks.testnet : bitcoinJS.networks.bitcoin;
};
+
+ public isDevMode = () => {
+ return this.ENVIRONMENT === APP_STAGE.DEVELOPMENT;
+ };
}
export default new Configuration();
diff --git a/src/utils/service-utilities/encryption.ts b/src/utils/service-utilities/encryption.ts
index 59520fa13..1813a7ce4 100644
--- a/src/utils/service-utilities/encryption.ts
+++ b/src/utils/service-utilities/encryption.ts
@@ -8,6 +8,16 @@ export const hash512 = (data: string) => cryptoJS.SHA512(data).toString(cryptoJS
export const getRandomBytes = (size: number = 32) => randomBytes(size).toString('hex');
+export const getKeyAndHash = (size: number) => {
+ const encryptionKey = getRandomBytes(size);
+ const hash = getHashFromKey(encryptionKey);
+ return { encryptionKey, hash };
+};
+
+export const getHashFromKey = (encryptionKey: string) => {
+ return cryptoJS.SHA256(encryptionKey).toString(cryptoJS.enc.Hex);
+};
+
export const generateEncryptionKey = (entropy?: string, randomBytesSize?: number): string =>
entropy ? hash256(entropy) : hash256(getRandomBytes(randomBytesSize));
diff --git a/src/utils/service-utilities/utils.ts b/src/utils/service-utilities/utils.ts
index ffdd651e2..c89e5af1e 100644
--- a/src/utils/service-utilities/utils.ts
+++ b/src/utils/service-utilities/utils.ts
@@ -1,7 +1,18 @@
-import { EntityKind } from '../../services/wallets/enums';
-import { Vault, VaultScheme, VaultSigner } from '../../services/wallets/interfaces/vault';
+import idx from 'idx';
+import { DescriptorChecksum } from 'src/services/wallets/operations/descriptors/checksum';
+import { EntityKind, MultisigScriptType } from '../../services/wallets/enums';
+import {
+ MiniscriptElements,
+ Vault,
+ VaultScheme,
+ VaultSigner,
+} from '../../services/wallets/interfaces/vault';
import { Wallet } from '../../services/wallets/interfaces/wallet';
import WalletOperations from '../../services/wallets/operations';
+import { generateInheritanceVaultElements } from 'src/services/wallets/operations/miniscript/default/InheritanceVault';
+import WalletUtilities from 'src/services/wallets/operations/utils';
+import config from './config';
+import { generateMiniscriptScheme } from 'src/services/wallets/factories/VaultFactory';
const crypto = require('crypto');
@@ -38,15 +49,16 @@ export const getKeyExpression = (
forDescriptor: boolean = false,
abbreviated: boolean = false
) => {
- if (nextFreeAddressIndex != undefined)
+ if (nextFreeAddressIndex != undefined) {
return `[${masterFingerprint}/${getDerivationPath(
derivationPath
)}]${xpub}/0/${nextFreeAddressIndex}`;
- else if (abbreviated) return `[${masterFingerprint}/${getDerivationPath(derivationPath)}]`;
- else
+ } else if (abbreviated) return `[${masterFingerprint}/${getDerivationPath(derivationPath)}]`;
+ else {
return `[${masterFingerprint}/${getDerivationPath(derivationPath)}]${xpub}${
withPathRestrictions ? '/**' : forDescriptor ? '/<0;1>/*' : ''
}`;
+ }
};
export const generateAbbreviatedOutputDescriptors = (wallet: Vault | Wallet) => {
@@ -65,36 +77,56 @@ export const generateAbbreviatedOutputDescriptors = (wallet: Vault | Wallet) =>
true
)})`;
return des;
- }
- const { signers, scheme, isMultiSig } = wallet as Vault;
- if (!isMultiSig) {
- const signer: VaultSigner = signers[0];
+ } else if (wallet.entityKind === EntityKind.VAULT) {
+ const miniscriptScheme = idx(wallet as Vault, (_) => _.scheme.miniscriptScheme);
+ if (miniscriptScheme) {
+ const { miniscript, keyInfoMap } = miniscriptScheme;
+ let walletPolicyDescriptor = miniscript;
+ for (const keyId in keyInfoMap) {
+ walletPolicyDescriptor = walletPolicyDescriptor.replace(
+ `(${keyId}`,
+ `(${keyInfoMap[keyId]}`
+ );
+ walletPolicyDescriptor = walletPolicyDescriptor.replace(
+ `,${keyId}`,
+ `,${keyInfoMap[keyId]}`
+ );
+ }
+ const desc = `wsh(${walletPolicyDescriptor})`;
+ return `${desc}#${DescriptorChecksum(desc)}`;
+ }
- const des = `wpkh(${getKeyExpression(
- signer.masterFingerprint,
- signer.derivationPath,
- signer.xpub,
- false,
- undefined,
- false,
- true
- )})`;
- return des;
+ const { signers, scheme, isMultiSig } = wallet as Vault;
+ if (isMultiSig) {
+ return `wsh(sortedmulti(${scheme.m},${getMultiKeyExpressions(
+ signers,
+ false,
+ undefined,
+ false,
+ true
+ )}))`;
+ } else {
+ const signer: VaultSigner = signers[0];
+
+ const des = `wpkh(${getKeyExpression(
+ signer.masterFingerprint,
+ signer.derivationPath,
+ signer.xpub,
+ false,
+ undefined,
+ false,
+ true
+ )})`;
+ return des;
+ }
}
- return `wsh(sortedmulti(${scheme.m},${getMultiKeyExpressions(
- signers,
- false,
- undefined,
- false,
- true
- )}))`;
};
export const generateOutputDescriptors = (
wallet: Vault | Wallet,
includePatchRestrictions: boolean = false
) => {
- const receivingAddress = WalletOperations.getExternalAddressAtIdx(wallet, 0);
+ const receivingAddress = WalletOperations.getExternalInternalAddressAtIdx(wallet, 0);
if (wallet.entityKind === EntityKind.WALLET) {
const {
derivationDetails: { xDerivationPath },
@@ -109,27 +141,47 @@ export const generateOutputDescriptors = (
true
)})${includePatchRestrictions ? `\n/0/*,/1/*\n${receivingAddress}` : ''}`;
return des;
- }
- const { signers, scheme, isMultiSig } = wallet as Vault;
- if (!isMultiSig) {
- const signer: VaultSigner = signers[0];
+ } else if (wallet.entityKind === EntityKind.VAULT) {
+ const miniscriptScheme = idx(wallet as Vault, (_) => _.scheme.miniscriptScheme);
+ if (miniscriptScheme) {
+ const { miniscript, keyInfoMap } = miniscriptScheme;
+ let walletPolicyDescriptor = miniscript;
+ for (const keyId in keyInfoMap) {
+ walletPolicyDescriptor = walletPolicyDescriptor.replace(
+ `(${keyId}`,
+ `(${keyInfoMap[keyId]}`
+ );
+ walletPolicyDescriptor = walletPolicyDescriptor.replace(
+ `,${keyId}`,
+ `,${keyInfoMap[keyId]}`
+ );
+ }
+ const desc = `wsh(${walletPolicyDescriptor})`;
+ return `${desc}#${DescriptorChecksum(desc)}`;
+ }
- const des = `wpkh(${getKeyExpression(
- signer.masterFingerprint,
- signer.derivationPath,
- signer.xpub,
- includePatchRestrictions,
- undefined,
- true
- )})${includePatchRestrictions ? `\n/0/*,/1/*\n${receivingAddress}` : ''}`;
- return des;
+ const { signers, scheme, isMultiSig } = wallet as Vault;
+ if (isMultiSig) {
+ return `wsh(sortedmulti(${scheme.m},${getMultiKeyExpressions(
+ signers,
+ includePatchRestrictions,
+ undefined,
+ true
+ )}))${includePatchRestrictions ? `\n/0/*,/1/*\n${receivingAddress}` : ''}`;
+ } else {
+ const signer: VaultSigner = signers[0];
+
+ const des = `wpkh(${getKeyExpression(
+ signer.masterFingerprint,
+ signer.derivationPath,
+ signer.xpub,
+ includePatchRestrictions,
+ undefined,
+ true
+ )})${includePatchRestrictions ? `\n/0/*,/1/*\n${receivingAddress}` : ''}`;
+ return des;
+ }
}
- return `wsh(sortedmulti(${scheme.m},${getMultiKeyExpressions(
- signers,
- includePatchRestrictions,
- undefined,
- true
- )}))${includePatchRestrictions ? `\n/0/*,/1/*\n${receivingAddress}` : ''}`;
};
export const generateVaultAddressDescriptors = (wallet: Vault | Wallet) => {
@@ -190,6 +242,7 @@ export interface ParsedVauleText {
signersDetails: ParsedSignersDetails[] | null;
isMultisig: Boolean | null;
scheme: VaultScheme;
+ miniscriptElements?: MiniscriptElements;
}
const isAllowedScheme = (m, n) => {
@@ -225,18 +278,16 @@ const parseKeyExpression = (keyExpression) => {
if (bracketMatch) {
const insideBracket = bracketMatch[1];
masterFingerprint = insideBracket.substring(0, 8).toUpperCase();
- path =
- 'm' +
- insideBracket
- .substring(8)
- .replace(/(\d+)h/g, "$1'")
- .replace(/'/g, "'");
+ path = `m${insideBracket
+ .substring(8)
+ .replace(/(\d+)h/g, "$1'")
+ .replace(/'/g, "'")}`;
xpub = bracketMatch[2].replace(/[^\w\s]+$/, '').split(/[^\w]+/)[0];
} else {
// Case 2: If the keyExpression is not enclosed in square brackets
const parts = keyExpression.split("'");
masterFingerprint = parts[0].substring(0, 8).toUpperCase();
- path = 'm' + keyExpression.substring(8, keyExpression.lastIndexOf("'") + 1).replace(/'/g, "'");
+ path = `m${keyExpression.substring(8, keyExpression.lastIndexOf("'") + 1).replace(/'/g, "'")}`;
xpub = keyExpression
.substring(keyExpression.lastIndexOf("'") + 1)
.replace(/[^\w\s]+$/, '')
@@ -344,9 +395,110 @@ export const parseTextforVaultConfig = (secret: string) => {
};
return parsedResponse;
}
+ if (secret.includes('after(')) {
+ const { signers, inheritanceKey, timelock } = parseInheritanceKeyMiniscript(secret);
+
+ const multiMatch = secret.match(/thresh\((\d+),/);
+ const m = multiMatch ? parseInt(multiMatch[1]) : 1;
+
+ const miniscriptElements = generateInheritanceVaultElements(
+ signers,
+ inheritanceKey,
+ { m, n: signers.length },
+ [timelock]
+ );
+
+ const miniscriptScheme = generateMiniscriptScheme(miniscriptElements);
+
+ // Verify the miniscript generated matches the input
+ const { miniscript, keyInfoMap } = miniscriptScheme;
+ let walletPolicyDescriptor = miniscript;
+ for (const keyId in keyInfoMap) {
+ walletPolicyDescriptor = walletPolicyDescriptor.replace(`(${keyId}`, `(${keyInfoMap[keyId]}`);
+ walletPolicyDescriptor = walletPolicyDescriptor.replace(`,${keyId}`, `,${keyInfoMap[keyId]}`);
+ }
+ const desc = `wsh(${walletPolicyDescriptor})`;
+ if (secret.includes('#')) {
+ secret = secret.replace(/#.*$/, '');
+ }
+ if (desc !== secret) {
+ throw Error('Unsupported Miniscript configuration detected!');
+ }
+
+ const parsedResponse: ParsedVauleText = {
+ signersDetails: [...signers, inheritanceKey].filter(Boolean).map((key) => ({
+ xpub: key.xpub,
+ masterFingerprint: key.masterFingerprint,
+ path: key.derivationPath,
+ isMultisig: true,
+ })),
+ isMultisig: true,
+ scheme: {
+ m,
+ n: signers.length,
+ multisigScriptType: MultisigScriptType.MINISCRIPT_MULTISIG,
+ miniscriptScheme,
+ },
+ miniscriptElements,
+ };
+ return parsedResponse;
+ }
throw Error('Unsupported format!');
};
+function parseInheritanceKeyMiniscript(miniscript: string): {
+ signers: VaultSigner[];
+ inheritanceKey: VaultSigner | null;
+ timelock: number | null;
+} {
+ // Remove wsh() wrapper and checksum
+ const innerScript = miniscript.replace('wsh(', '').replace(/\)#.*$/, '');
+
+ // Extract all key expressions with derivation path
+ const keyRegex = /\[([A-F0-9]{8})(\/[0-9h'/]+)\]([a-zA-Z0-9]+)/g;
+ const matches = [...innerScript.matchAll(keyRegex)];
+
+ const fingerprintCounts = new Map();
+ const keys = matches.map((match) => {
+ const fingerprint = match[1];
+ fingerprintCounts.set(fingerprint, (fingerprintCounts.get(fingerprint) || 0) + 1);
+ return {
+ masterFingerprint: fingerprint,
+ derivationPath: 'm' + match[2],
+ xpub: match[3],
+ xfp: WalletUtilities.getFingerprintFromExtendedKey(
+ match[3],
+ WalletUtilities.getNetworkByType(config.NETWORK_TYPE)
+ ),
+ } as VaultSigner;
+ });
+
+ // Find fingerprint that appears only once and remove it from keys array
+ const inheritanceKeyFingerprint = Array.from(fingerprintCounts.entries()).find(
+ ([_, count]) => count === 1
+ )?.[0];
+ const inheritanceKey = keys.find((key) => key.masterFingerprint === inheritanceKeyFingerprint);
+
+ // Filter out duplicate keys by xpub and the IK
+ const signers = keys.filter(
+ (key, index, self) =>
+ index ===
+ self.findIndex(
+ (k) => k.xpub === key.xpub && key.masterFingerprint !== inheritanceKeyFingerprint
+ )
+ );
+
+ // Extract timelock value
+ const afterMatch = innerScript.match(/after\((\d+)\)/);
+ const timelock = afterMatch ? parseInt(afterMatch[1]) : null;
+
+ return {
+ signers,
+ inheritanceKey,
+ timelock,
+ };
+}
+
export const urlParamsToObj = (url: string): any => {
try {
const regex = /[?&]([^=#]+)=([^]*)/g;
@@ -420,7 +572,7 @@ export const createDecipherGcm = (data: DecryptData, password: string) => {
try {
decrypted = Buffer.concat([decipher.update(encryptedText), decipher.final()]);
} catch (err) {
- throw new Error('Failed to decrypt data: ' + err.message);
+ throw new Error(`Failed to decrypt data: ${err.message}`);
}
return JSON.parse(decrypted.toString('utf-8'));
};
diff --git a/src/utils/utilities.ts b/src/utils/utilities.ts
index c89fcf362..07dfee354 100644
--- a/src/utils/utilities.ts
+++ b/src/utils/utilities.ts
@@ -6,7 +6,7 @@ import idx from 'idx';
import { TxPriority, VaultType, WalletType, XpubTypes } from 'src/services/wallets/enums';
import { Wallet } from 'src/services/wallets/interfaces/wallet';
-import { Signer } from 'src/services/wallets/interfaces/vault';
+import { Signer, VaultSigner } from 'src/services/wallets/interfaces/vault';
import * as bitcoin from 'bitcoinjs-lib';
import { isTestnet } from 'src/constants/Bitcoin';
@@ -180,11 +180,27 @@ export function numberToOrdinal(cardinal) {
return ordinals[cardinal];
}
+export function calculateMonthlyCost(yearlyPrice) {
+ const numericValue = parseFloat(yearlyPrice.replace(/[^0-9.]/g, ''));
+ if (isNaN(numericValue)) {
+ throw new Error('Invalid yearly price format');
+ }
+ const monthlyCost = numericValue / 12;
+ const currencySymbol = yearlyPrice.match(/^\D+/)?.[0]?.trim() || '';
+ const formattedMonthlyCost = `${currencySymbol} ${monthlyCost.toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`;
+ return formattedMonthlyCost;
+}
+
// Format number with comma
// Example: 1000000 => 1,000,000
export const formatNumber = (value: string) =>
value.replace(/\D/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+export const isOdd = (num: number) => num % 2 !== 0;
+
export const getTimeDifferenceInWords = (pastTime) => {
const timeDifference = moment(pastTime).fromNow();
if (timeDifference === 'Invalid date' || pastTime === undefined) {
@@ -197,6 +213,8 @@ export const getTimeDifferenceInWords = (pastTime) => {
export const getWalletTags = (walletType) => {
if (walletType === VaultType.COLLABORATIVE) {
return [`${walletType === VaultType.COLLABORATIVE ? 'COLLABORATIVE' : 'VAULT'}`, `2 of 3`];
+ } else if (walletType === VaultType.ASSISTED) {
+ return [`${walletType === VaultType.ASSISTED ? 'ASSISTED' : 'VAULT'}`, `2 of 3`];
} else {
let walletKind;
if (walletType === WalletType.DEFAULT) walletKind = 'HOT WALLET';
@@ -259,7 +277,7 @@ export const generateDataFromPSBT = (base64Str: string, signer: Signer) => {
try {
const psbt = bitcoin.Psbt.fromBase64(base64Str);
const vBytes = estimateVByteFromPSBT(base64Str);
-
+ const signersList = [];
let signerMatched = false;
psbt.data.inputs.forEach((input) => {
@@ -271,16 +289,11 @@ export const generateDataFromPSBT = (base64Str: string, signer: Signer) => {
masterFingerprint: derivation.masterFingerprint.toString('hex'),
pubKey: derivation.pubkey.toString('hex'),
};
+ signersList.push(data);
if (data.masterFingerprint.toLowerCase() === signer.masterFingerprint.toLowerCase()) {
// validating further by matching public key
const xPub = signer.signerXpubs[XpubTypes.P2WSH][0].xpub; // to enable for taproot in future
- const node = bip32.fromBase58(
- xPub,
- isTestnet() ? bitcoin.networks.testnet : bitcoin.networks.bitcoin
- );
- const receiveAddPath = data.derivationPath.split('/').slice(-2).join('/');
- const childNode = node.derivePath(receiveAddPath);
- const pubkey = childNode.publicKey.toString('hex');
+ const pubkey = getPubKeyFromXpub(xPub, data.derivationPath);
if (data.pubKey == pubkey) signerMatched = true;
}
});
@@ -294,6 +307,7 @@ export const generateDataFromPSBT = (base64Str: string, signer: Signer) => {
return {
address: p2wsh.address,
amount: input.witnessUtxo.value,
+ path: input.bip32Derivation[0].path,
};
});
@@ -337,6 +351,7 @@ export const generateDataFromPSBT = (base64Str: string, signer: Signer) => {
signerMatched,
feeRate,
vBytes,
+ signersList,
};
} catch (error) {
console.log('🚀 ~ dataFromPSBT ~ error:', error);
@@ -344,6 +359,17 @@ export const generateDataFromPSBT = (base64Str: string, signer: Signer) => {
}
};
+export const getPubKeyFromXpub = (xPub: string, derivationPath: string) => {
+ const node = bip32.fromBase58(
+ xPub,
+ isTestnet() ? bitcoin.networks.testnet : bitcoin.networks.bitcoin
+ );
+ const receiveAddPath = derivationPath.split('/').slice(-2).join('/');
+ const childNode = node.derivePath(receiveAddPath);
+ const pubkey = childNode.publicKey.toString('hex');
+ return pubkey;
+};
+
export const estimateVByteFromPSBT = (base64Str: string) => {
const psbt = bitcoin.Psbt.fromBase64(base64Str);
const unsignedTxHex =
@@ -397,6 +423,29 @@ export const getInputsFromPSBT = (base64Str: string) => {
}
};
+export const getInputsToSignFromPSBT = (base64Str: string, signer: Signer) => {
+ const psbtObject = bitcoin.Psbt.fromBase64(base64Str);
+ const ips = psbtObject.data.inputs;
+ const inputsToSign = [];
+ ips.forEach((input, inputIndex) => {
+ input.bip32Derivation.forEach((derivation) => {
+ const masterFingerprint = derivation.masterFingerprint.toString('hex');
+ if (masterFingerprint.toLowerCase() === signer.masterFingerprint.toLowerCase()) {
+ const publicKey = derivation.pubkey;
+ const subPath = derivation.path.split('/').slice(-2).join('/');
+ const { hash, sighashType } = psbtObject.getDigestToSign(inputIndex, publicKey);
+ inputsToSign.push({
+ digest: hash.toString('hex'),
+ subPath,
+ inputIndex,
+ sighashType,
+ publicKey: publicKey.toString('hex'),
+ });
+ }
+ });
+ });
+ return inputsToSign;
+};
export const getTnxDetailsPSBT = (averageTxFees, feeRate: string) => {
let estimatedBlocksBeforeConfirmation = 0;
@@ -416,3 +465,38 @@ export const getTnxDetailsPSBT = (averageTxFees, feeRate: string) => {
}
return { estimatedBlocksBeforeConfirmation, tnxPriority };
};
+
+export const getAccountFromSigner = (signer: Signer | VaultSigner): number | null => {
+ if ('derivationPath' in signer) {
+ // VaultSigner case
+ return parseInt(signer.derivationPath.replace(/[h']/g, '').split('/')[3]) ?? null;
+ }
+
+ // Regular Signer case
+ for (const type of Object.values(XpubTypes)) {
+ const xpubs = signer.signerXpubs[type];
+ if (xpubs?.[0]?.derivationPath) {
+ return parseInt(xpubs[0].derivationPath.replace(/[h']/g, '').split('/')[3]) ?? null;
+ }
+ }
+
+ return null;
+};
+
+export const getKeyUID = (signer: Signer | VaultSigner | null): string => {
+ if (!signer) {
+ return '';
+ }
+ return signer.masterFingerprint + (getAccountFromSigner(signer) ?? '');
+};
+
+export const checkSignerAccountsMatch = (signer: Signer): boolean => {
+ const accountNumbers = Object.values(signer.signerXpubs).flatMap((xpubs) =>
+ xpubs.map((x) => parseInt(x.derivationPath.replace(/[h']/g, '').split('/')[3]))
+ );
+
+ if (!accountNumbers.length) return true;
+
+ const firstAccount = accountNumbers[0];
+ return accountNumbers.every((num) => num === firstAccount);
+};
diff --git a/yarn.lock b/yarn.lock
index fdb2b4e4e..cf1729324 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15,12 +15,13 @@
resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08"
integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA==
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
- integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
+ integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
dependencies:
- "@babel/highlight" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ js-tokens "^4.0.0"
picocolors "^1.0.0"
"@babel/code-frame@~7.10.4":
@@ -30,26 +31,26 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed"
- integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e"
+ integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==
-"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.18.13", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.23.9":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4"
- integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==
+"@babel/core@7.26.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.18.13", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40"
+ integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==
dependencies:
"@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helpers" "^7.24.7"
- "@babel/parser" "^7.24.7"
- "@babel/template" "^7.24.7"
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/code-frame" "^7.26.0"
+ "@babel/generator" "^7.26.0"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-module-transforms" "^7.26.0"
+ "@babel/helpers" "^7.26.0"
+ "@babel/parser" "^7.26.0"
+ "@babel/template" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.26.0"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@@ -57,78 +58,77 @@
semver "^6.3.1"
"@babel/eslint-parser@^7.20.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7"
- integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c"
+ integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==
dependencies:
"@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
eslint-visitor-keys "^2.1.0"
semver "^6.3.1"
-"@babel/generator@^7.20.0", "@babel/generator@^7.24.7", "@babel/generator@^7.7.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d"
- integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==
+"@babel/generator@^7.20.0", "@babel/generator@^7.25.0", "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f"
+ integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==
dependencies:
- "@babel/types" "^7.24.7"
+ "@babel/parser" "^7.26.2"
+ "@babel/types" "^7.26.0"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
- jsesc "^2.5.1"
+ jsesc "^3.0.2"
-"@babel/helper-annotate-as-pure@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab"
- integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==
+"@babel/helper-annotate-as-pure@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4"
+ integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==
dependencies:
- "@babel/types" "^7.24.7"
+ "@babel/types" "^7.25.9"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3"
- integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9"
+ integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==
dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
-"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9"
- integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==
+"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
+ integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==
dependencies:
- "@babel/compat-data" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- browserslist "^4.22.2"
+ "@babel/compat-data" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ browserslist "^4.24.0"
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b"
- integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-member-expression-to-functions" "^7.24.7"
- "@babel/helper-optimise-call-expression" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83"
+ integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-member-expression-to-functions" "^7.25.9"
+ "@babel/helper-optimise-call-expression" "^7.25.9"
+ "@babel/helper-replace-supers" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
semver "^6.3.1"
-"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da"
- integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26"
+ integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- regexpu-core "^5.3.1"
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ regexpu-core "^6.1.1"
semver "^6.3.1"
-"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2":
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
- integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
+"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3":
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21"
+ integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==
dependencies:
"@babel/helper-compilation-targets" "^7.22.6"
"@babel/helper-plugin-utils" "^7.22.5"
@@ -136,187 +136,171 @@
lodash.debounce "^4.0.8"
resolve "^1.14.2"
-"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.24.7":
+"@babel/helper-environment-visitor@^7.18.9":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9"
integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==
dependencies:
"@babel/types" "^7.24.7"
-"@babel/helper-function-name@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2"
- integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==
- dependencies:
- "@babel/template" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-hoist-variables@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee"
- integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==
- dependencies:
- "@babel/types" "^7.24.7"
-
-"@babel/helper-member-expression-to-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f"
- integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-module-imports@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
- integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-module-transforms@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8"
- integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==
- dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-simple-access" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
-
-"@babel/helper-optimise-call-expression@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f"
- integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==
- dependencies:
- "@babel/types" "^7.24.7"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0"
- integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==
-
-"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7"
- integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-wrap-function" "^7.24.7"
-
-"@babel/helper-replace-supers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765"
- integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==
- dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-member-expression-to-functions" "^7.24.7"
- "@babel/helper-optimise-call-expression" "^7.24.7"
-
-"@babel/helper-simple-access@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
- integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9"
- integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-split-export-declaration@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856"
- integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==
- dependencies:
- "@babel/types" "^7.24.7"
-
-"@babel/helper-string-parser@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2"
- integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==
-
-"@babel/helper-validator-identifier@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
- integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
-
-"@babel/helper-validator-option@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6"
- integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==
-
-"@babel/helper-wrap-function@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f"
- integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==
- dependencies:
- "@babel/helper-function-name" "^7.24.7"
- "@babel/template" "^7.24.7"
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helpers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416"
- integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==
- dependencies:
- "@babel/template" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
- integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.24.7"
+"@babel/helper-member-expression-to-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3"
+ integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-imports@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+ integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+ integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-optimise-call-expression@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e"
+ integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==
+ dependencies:
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46"
+ integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==
+
+"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92"
+ integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-wrap-function" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-replace-supers@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5"
+ integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.25.9"
+ "@babel/helper-optimise-call-expression" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-simple-access@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739"
+ integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9"
+ integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-string-parser@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
+ integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+
+"@babel/helper-validator-identifier@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
+ integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+
+"@babel/helper-validator-option@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
+ integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+
+"@babel/helper-wrap-function@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0"
+ integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==
+ dependencies:
+ "@babel/template" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helpers@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4"
+ integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==
+ dependencies:
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.26.0"
+
+"@babel/highlight@^7.10.4":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6"
+ integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.9"
chalk "^2.4.2"
js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85"
- integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==
+"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11"
+ integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==
+ dependencies:
+ "@babel/types" "^7.26.0"
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055"
- integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe"
+ integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107"
- integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30"
+ integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89"
- integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137"
+ integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-transform-optional-chaining" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec"
- integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1"
+ integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+ "@babel/plugin-transform-optional-chaining" "^7.25.9"
+
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e"
+ integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
"@babel/plugin-proposal-async-generator-functions@^7.0.0":
version "7.20.7"
@@ -336,21 +320,12 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-export-default-from@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6"
- integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-export-default-from" "^7.24.7"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.18.0":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83"
- integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==
+"@babel/plugin-proposal-export-default-from@^7.0.0", "@babel/plugin-proposal-export-default-from@^7.24.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c"
+ integrity sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0":
version "7.18.6"
@@ -415,7 +390,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3":
+"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
@@ -437,41 +412,34 @@
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac"
- integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz#86614767a9ff140366f0c3766ef218beb32a730a"
+ integrity sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
- integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz#96507595c21b45fccfc2bc758d5c45452e6164fa"
+ integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7"
- integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==
+"@babel/plugin-syntax-import-assertions@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f"
+ integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-import-assertions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
- integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
+"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7"
+ integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-import-attributes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
- integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
+"@babel/plugin-syntax-import-meta@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
@@ -485,14 +453,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d"
- integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==
+"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290"
+ integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
@@ -506,7 +474,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
@@ -541,19 +509,19 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+"@babel/plugin-syntax-top-level-await@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c"
- integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==
+"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399"
+ integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
@@ -563,557 +531,548 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514"
- integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==
+"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.24.7", "@babel/plugin-transform-arrow-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845"
+ integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-async-generator-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd"
- integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==
+"@babel/plugin-transform-async-generator-functions@^7.25.4", "@babel/plugin-transform-async-generator-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2"
+ integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-remap-async-to-generator" "^7.24.7"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-remap-async-to-generator" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc"
- integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==
+"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.24.7", "@babel/plugin-transform-async-to-generator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71"
+ integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==
dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-remap-async-to-generator" "^7.24.7"
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-remap-async-to-generator" "^7.25.9"
-"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f"
- integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==
+"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458"
+ integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02"
- integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==
+"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.25.0", "@babel/plugin-transform-block-scoping@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1"
+ integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-class-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834"
- integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==
+"@babel/plugin-transform-class-properties@^7.25.4", "@babel/plugin-transform-class-properties@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f"
+ integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-class-static-block@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d"
- integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==
+"@babel/plugin-transform-class-static-block@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0"
+ integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf"
- integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
+"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.25.4", "@babel/plugin-transform-classes@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52"
+ integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-replace-supers" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707"
- integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==
+"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.7", "@babel/plugin-transform-computed-properties@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b"
+ integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/template" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/template" "^7.25.9"
-"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e"
- integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==
+"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1"
+ integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-dotall-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0"
- integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==
+"@babel/plugin-transform-dotall-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a"
+ integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-duplicate-keys@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee"
- integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==
+"@babel/plugin-transform-duplicate-keys@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d"
+ integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-dynamic-import@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4"
- integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31"
+ integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-exponentiation-operator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d"
- integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==
+"@babel/plugin-transform-dynamic-import@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8"
+ integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-export-namespace-from@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197"
- integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==
+"@babel/plugin-transform-exponentiation-operator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f"
+ integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz#ae454e62219288fbb734541ab00389bfb13c063e"
- integrity sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==
+"@babel/plugin-transform-export-namespace-from@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2"
+ integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-flow" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70"
- integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==
+"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.25.2", "@babel/plugin-transform-flow-strip-types@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1"
+ integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/plugin-syntax-flow" "^7.25.9"
-"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6"
- integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==
+"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.24.7", "@babel/plugin-transform-for-of@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755"
+ integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==
dependencies:
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
-"@babel/plugin-transform-json-strings@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a"
- integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==
+"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.25.1", "@babel/plugin-transform-function-name@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97"
+ integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c"
- integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==
+"@babel/plugin-transform-json-strings@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660"
+ integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0"
- integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==
+"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.25.2", "@babel/plugin-transform-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de"
+ integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df"
- integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==
+"@babel/plugin-transform-logical-assignment-operators@^7.24.7", "@babel/plugin-transform-logical-assignment-operators@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7"
+ integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-modules-amd@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7"
- integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==
+"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de"
+ integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==
dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab"
- integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==
+"@babel/plugin-transform-modules-amd@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5"
+ integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==
dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-modules-systemjs@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7"
- integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==
+"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.8", "@babel/plugin-transform-modules-commonjs@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686"
+ integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==
dependencies:
- "@babel/helper-hoist-variables" "^7.24.7"
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-simple-access" "^7.25.9"
-"@babel/plugin-transform-modules-umd@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8"
- integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==
+"@babel/plugin-transform-modules-systemjs@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8"
+ integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==
dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923"
- integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==
+"@babel/plugin-transform-modules-umd@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9"
+ integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-new-target@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00"
- integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a"
+ integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120"
- integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==
+"@babel/plugin-transform-new-target@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd"
+ integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-numeric-separator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63"
- integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949"
+ integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-numeric-separator@^7.24.7", "@babel/plugin-transform-numeric-separator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1"
+ integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-transform-object-assign@^7.16.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.24.7.tgz#9d2cc7ee1482bd208fcc51974ca4f7649662c899"
- integrity sha512-DOzAi77P9jSyPijHS7Z8vH0wLRcZH6wWxuIZgLAiy8FWOkcKMJmnyHjy2JM94k6A0QxlA/hlLh+R9T3GEryjNQ==
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.25.9.tgz#686203d53ee688d1642bf3a8c751dfb3981021c8"
+ integrity sha512-I/Vl1aQnPsrrn837oLbo+VQtkNcjuuiATqwmuweg4fTauwHHQoxyjmjjOVKyO8OaTxgqYTKW3LuQsykXjDf5Ag==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-object-rest-spread@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6"
- integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==
+"@babel/plugin-transform-object-rest-spread@^7.24.7", "@babel/plugin-transform-object-rest-spread@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18"
+ integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==
dependencies:
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/plugin-transform-parameters" "^7.25.9"
-"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be"
- integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==
+"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03"
+ integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-replace-supers" "^7.25.9"
-"@babel/plugin-transform-optional-catch-binding@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4"
- integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==
+"@babel/plugin-transform-optional-catch-binding@^7.24.7", "@babel/plugin-transform-optional-catch-binding@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3"
+ integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-optional-chaining@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454"
- integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==
+"@babel/plugin-transform-optional-chaining@^7.24.8", "@babel/plugin-transform-optional-chaining@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd"
+ integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
-"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68"
- integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==
+"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257"
+ integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e"
- integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==
+"@babel/plugin-transform-private-methods@^7.24.7", "@babel/plugin-transform-private-methods@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57"
+ integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061"
- integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==
+"@babel/plugin-transform-private-property-in-object@^7.24.7", "@babel/plugin-transform-private-property-in-object@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33"
+ integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc"
- integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==
+"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f"
+ integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-display-name@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b"
- integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==
+"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.24.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d"
+ integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-jsx-self@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab"
- integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==
+"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.24.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858"
+ integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-jsx-source@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3"
- integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==
+"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.24.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503"
+ integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-react-jsx@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4"
- integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==
+"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.25.2":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166"
+ integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-jsx" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/plugin-syntax-jsx" "^7.25.9"
+ "@babel/types" "^7.25.9"
-"@babel/plugin-transform-regenerator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8"
- integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==
+"@babel/plugin-transform-regenerator@^7.24.7", "@babel/plugin-transform-regenerator@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b"
+ integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
regenerator-transform "^0.15.2"
-"@babel/plugin-transform-reserved-words@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4"
- integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==
+"@babel/plugin-transform-regexp-modifiers@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850"
+ integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
-"@babel/plugin-transform-runtime@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca"
- integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==
+"@babel/plugin-transform-reserved-words@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce"
+ integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==
dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.24.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea"
+ integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
babel-plugin-polyfill-corejs2 "^0.4.10"
- babel-plugin-polyfill-corejs3 "^0.10.1"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
babel-plugin-polyfill-regenerator "^0.6.1"
semver "^6.3.1"
-"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73"
- integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3"
- integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
-
-"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb"
- integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8"
- integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-typeof-symbol@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0"
- integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-typescript@^7.24.7", "@babel/plugin-transform-typescript@^7.5.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz#b006b3e0094bf0813d505e0c5485679eeaf4a881"
- integrity sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-typescript" "^7.24.7"
-
-"@babel/plugin-transform-unicode-escapes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e"
- integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-unicode-property-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd"
- integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f"
- integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9"
- integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37"
- integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==
- dependencies:
- "@babel/compat-data" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7"
+"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.24.7", "@babel/plugin-transform-shorthand-properties@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2"
+ integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.7", "@babel/plugin-transform-spread@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9"
+ integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+
+"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.7", "@babel/plugin-transform-sticky-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32"
+ integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1"
+ integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-typeof-symbol@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b"
+ integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-typescript@^7.25.2", "@babel/plugin-transform-typescript@^7.25.9", "@babel/plugin-transform-typescript@^7.5.0":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849"
+ integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.9"
+ "@babel/helper-create-class-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+ "@babel/plugin-syntax-typescript" "^7.25.9"
+
+"@babel/plugin-transform-unicode-escapes@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82"
+ integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-unicode-property-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3"
+ integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.24.7", "@babel/plugin-transform-unicode-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1"
+ integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe"
+ integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/preset-env@7.26.0", "@babel/preset-env@^7.1.6":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1"
+ integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==
+ dependencies:
+ "@babel/compat-data" "^7.26.0"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9"
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9"
"@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.24.7"
- "@babel/plugin-syntax-import-attributes" "^7.24.7"
- "@babel/plugin-syntax-import-meta" "^7.10.4"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-import-assertions" "^7.26.0"
+ "@babel/plugin-syntax-import-attributes" "^7.26.0"
"@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
- "@babel/plugin-transform-arrow-functions" "^7.24.7"
- "@babel/plugin-transform-async-generator-functions" "^7.24.7"
- "@babel/plugin-transform-async-to-generator" "^7.24.7"
- "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
- "@babel/plugin-transform-block-scoping" "^7.24.7"
- "@babel/plugin-transform-class-properties" "^7.24.7"
- "@babel/plugin-transform-class-static-block" "^7.24.7"
- "@babel/plugin-transform-classes" "^7.24.7"
- "@babel/plugin-transform-computed-properties" "^7.24.7"
- "@babel/plugin-transform-destructuring" "^7.24.7"
- "@babel/plugin-transform-dotall-regex" "^7.24.7"
- "@babel/plugin-transform-duplicate-keys" "^7.24.7"
- "@babel/plugin-transform-dynamic-import" "^7.24.7"
- "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
- "@babel/plugin-transform-export-namespace-from" "^7.24.7"
- "@babel/plugin-transform-for-of" "^7.24.7"
- "@babel/plugin-transform-function-name" "^7.24.7"
- "@babel/plugin-transform-json-strings" "^7.24.7"
- "@babel/plugin-transform-literals" "^7.24.7"
- "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
- "@babel/plugin-transform-member-expression-literals" "^7.24.7"
- "@babel/plugin-transform-modules-amd" "^7.24.7"
- "@babel/plugin-transform-modules-commonjs" "^7.24.7"
- "@babel/plugin-transform-modules-systemjs" "^7.24.7"
- "@babel/plugin-transform-modules-umd" "^7.24.7"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
- "@babel/plugin-transform-new-target" "^7.24.7"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
- "@babel/plugin-transform-numeric-separator" "^7.24.7"
- "@babel/plugin-transform-object-rest-spread" "^7.24.7"
- "@babel/plugin-transform-object-super" "^7.24.7"
- "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
- "@babel/plugin-transform-optional-chaining" "^7.24.7"
- "@babel/plugin-transform-parameters" "^7.24.7"
- "@babel/plugin-transform-private-methods" "^7.24.7"
- "@babel/plugin-transform-private-property-in-object" "^7.24.7"
- "@babel/plugin-transform-property-literals" "^7.24.7"
- "@babel/plugin-transform-regenerator" "^7.24.7"
- "@babel/plugin-transform-reserved-words" "^7.24.7"
- "@babel/plugin-transform-shorthand-properties" "^7.24.7"
- "@babel/plugin-transform-spread" "^7.24.7"
- "@babel/plugin-transform-sticky-regex" "^7.24.7"
- "@babel/plugin-transform-template-literals" "^7.24.7"
- "@babel/plugin-transform-typeof-symbol" "^7.24.7"
- "@babel/plugin-transform-unicode-escapes" "^7.24.7"
- "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
- "@babel/plugin-transform-unicode-regex" "^7.24.7"
- "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
+ "@babel/plugin-transform-arrow-functions" "^7.25.9"
+ "@babel/plugin-transform-async-generator-functions" "^7.25.9"
+ "@babel/plugin-transform-async-to-generator" "^7.25.9"
+ "@babel/plugin-transform-block-scoped-functions" "^7.25.9"
+ "@babel/plugin-transform-block-scoping" "^7.25.9"
+ "@babel/plugin-transform-class-properties" "^7.25.9"
+ "@babel/plugin-transform-class-static-block" "^7.26.0"
+ "@babel/plugin-transform-classes" "^7.25.9"
+ "@babel/plugin-transform-computed-properties" "^7.25.9"
+ "@babel/plugin-transform-destructuring" "^7.25.9"
+ "@babel/plugin-transform-dotall-regex" "^7.25.9"
+ "@babel/plugin-transform-duplicate-keys" "^7.25.9"
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9"
+ "@babel/plugin-transform-dynamic-import" "^7.25.9"
+ "@babel/plugin-transform-exponentiation-operator" "^7.25.9"
+ "@babel/plugin-transform-export-namespace-from" "^7.25.9"
+ "@babel/plugin-transform-for-of" "^7.25.9"
+ "@babel/plugin-transform-function-name" "^7.25.9"
+ "@babel/plugin-transform-json-strings" "^7.25.9"
+ "@babel/plugin-transform-literals" "^7.25.9"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.25.9"
+ "@babel/plugin-transform-member-expression-literals" "^7.25.9"
+ "@babel/plugin-transform-modules-amd" "^7.25.9"
+ "@babel/plugin-transform-modules-commonjs" "^7.25.9"
+ "@babel/plugin-transform-modules-systemjs" "^7.25.9"
+ "@babel/plugin-transform-modules-umd" "^7.25.9"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9"
+ "@babel/plugin-transform-new-target" "^7.25.9"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9"
+ "@babel/plugin-transform-numeric-separator" "^7.25.9"
+ "@babel/plugin-transform-object-rest-spread" "^7.25.9"
+ "@babel/plugin-transform-object-super" "^7.25.9"
+ "@babel/plugin-transform-optional-catch-binding" "^7.25.9"
+ "@babel/plugin-transform-optional-chaining" "^7.25.9"
+ "@babel/plugin-transform-parameters" "^7.25.9"
+ "@babel/plugin-transform-private-methods" "^7.25.9"
+ "@babel/plugin-transform-private-property-in-object" "^7.25.9"
+ "@babel/plugin-transform-property-literals" "^7.25.9"
+ "@babel/plugin-transform-regenerator" "^7.25.9"
+ "@babel/plugin-transform-regexp-modifiers" "^7.26.0"
+ "@babel/plugin-transform-reserved-words" "^7.25.9"
+ "@babel/plugin-transform-shorthand-properties" "^7.25.9"
+ "@babel/plugin-transform-spread" "^7.25.9"
+ "@babel/plugin-transform-sticky-regex" "^7.25.9"
+ "@babel/plugin-transform-template-literals" "^7.25.9"
+ "@babel/plugin-transform-typeof-symbol" "^7.25.9"
+ "@babel/plugin-transform-unicode-escapes" "^7.25.9"
+ "@babel/plugin-transform-unicode-property-regex" "^7.25.9"
+ "@babel/plugin-transform-unicode-regex" "^7.25.9"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.25.9"
"@babel/preset-modules" "0.1.6-no-external-plugins"
babel-plugin-polyfill-corejs2 "^0.4.10"
- babel-plugin-polyfill-corejs3 "^0.10.4"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
babel-plugin-polyfill-regenerator "^0.6.1"
- core-js-compat "^3.31.0"
+ core-js-compat "^3.38.1"
semver "^6.3.1"
"@babel/preset-flow@^7.13.13":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.7.tgz#eef5cb8e05e97a448fc50c16826f5612fe512c06"
- integrity sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.9.tgz#ef8b5e7e3f24a42b3711e77fb14919b87dffed0a"
+ integrity sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-transform-flow-strip-types" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ "@babel/plugin-transform-flow-strip-types" "^7.25.9"
"@babel/preset-modules@0.1.6-no-external-plugins":
version "0.1.6-no-external-plugins"
@@ -1125,20 +1084,20 @@
esutils "^2.0.2"
"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1"
- integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d"
+ integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-syntax-jsx" "^7.24.7"
- "@babel/plugin-transform-modules-commonjs" "^7.24.7"
- "@babel/plugin-transform-typescript" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ "@babel/plugin-syntax-jsx" "^7.25.9"
+ "@babel/plugin-transform-modules-commonjs" "^7.25.9"
+ "@babel/plugin-transform-typescript" "^7.25.9"
"@babel/register@^7.13.16":
- version "7.24.6"
- resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.24.6.tgz#59e21dcc79e1d04eed5377633b0f88029a6bef9e"
- integrity sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.9.tgz#1c465acf7dc983d70ccc318eb5b887ecb04f021b"
+ integrity sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==
dependencies:
clone-deep "^4.0.1"
find-cache-dir "^2.0.0"
@@ -1146,57 +1105,68 @@
pirates "^4.0.6"
source-map-support "^0.5.16"
-"@babel/regjsgen@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
- integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-
-"@babel/runtime@>=7", "@babel/runtime@^7.0.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.0", "@babel/runtime@^7.17.8", "@babel/runtime@^7.20.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12"
- integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==
+"@babel/runtime@7.26.0", "@babel/runtime@>=7", "@babel/runtime@^7.0.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.25.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+ integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/template@^7.0.0", "@babel/template@^7.24.7", "@babel/template@^7.3.3":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315"
- integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/parser" "^7.24.7"
- "@babel/types" "^7.24.7"
+"@babel/template@^7.0.0", "@babel/template@^7.25.0", "@babel/template@^7.25.9", "@babel/template@^7.3.3":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+ integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
+ integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/generator" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.25.9"
+ debug "^4.3.1"
+ globals "^11.1.0"
-"@babel/traverse@^7.20.0", "@babel/traverse@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5"
- integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==
+"@babel/traverse@^7.20.0", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
+ integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-hoist-variables" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
- "@babel/parser" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/code-frame" "^7.25.9"
+ "@babel/generator" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.25.9"
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2"
- integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==
+"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.24.7", "@babel/types@^7.25.2", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff"
+ integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
dependencies:
- "@babel/helper-string-parser" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
- to-fast-properties "^2.0.0"
+ "@babel/helper-string-parser" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+"@bitcoinerlab/miniscript@1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@bitcoinerlab/miniscript/-/miniscript-1.4.0.tgz#9beda21d4dadb1cb806de6f846470927cfd96f6c"
+ integrity sha512-BsG3dmwQmgKHnRZecDgUsPjwcpnf1wgaZbolcMTByS10k1zYzIx97W51LzG7GvokRJ+wnzTX/GhC8Y3L2X0CQA==
+ dependencies:
+ bip68 "^1.0.4"
+
"@egjs/hammerjs@^2.0.17":
version "2.0.17"
resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124"
@@ -1212,16 +1182,16 @@
bigint-buffer "^1.1.5"
"@eslint-community/eslint-utils@^4.2.0":
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
- integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56"
+ integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==
dependencies:
- eslint-visitor-keys "^3.3.0"
+ eslint-visitor-keys "^3.4.3"
"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
- version "4.11.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae"
- integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
+ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
"@eslint/eslintrc@^2.1.4":
version "2.1.4"
@@ -1238,10 +1208,10 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@8.57.0":
- version "8.57.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
- integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
+"@eslint/js@8.57.1":
+ version "8.57.1"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
+ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
"@expo/config-plugins@^4.1.5":
version "4.1.5"
@@ -1265,9 +1235,9 @@
xml2js "0.4.23"
"@expo/config-plugins@~8.0.0":
- version "8.0.10"
- resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.10.tgz#5cda076f38bc04675cb42d8acdd23d6e460a62de"
- integrity sha512-KG1fnSKRmsudPU9BWkl59PyE0byrE2HTnqbOrgwr2FAhqh7tfr9nRs6A9oLS/ntpGzmFxccTEcsV0L4apsuxxg==
+ version "8.0.11"
+ resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.11.tgz#b814395a910f4c8b7cc95d9719dccb6ca53ea4c5"
+ integrity sha512-oALE1HwnLFthrobAcC9ocnR9KXLzfWEjgIe4CPe+rDsfC6GDs8dGYCXfRFoCEzoLN4TGYs9RdZ8r0KoCcNrm2A==
dependencies:
"@expo/config-types" "^51.0.3"
"@expo/json-file" "~8.3.0"
@@ -1336,44 +1306,45 @@
resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c"
integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==
-"@formatjs/ecma402-abstract@2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz#39197ab90b1c78b7342b129a56a7acdb8f512e17"
- integrity sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==
+"@formatjs/ecma402-abstract@2.2.4":
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz#355e42d375678229d46dc8ad7a7139520dd03e7b"
+ integrity sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==
dependencies:
- "@formatjs/intl-localematcher" "0.5.4"
- tslib "^2.4.0"
+ "@formatjs/fast-memoize" "2.2.3"
+ "@formatjs/intl-localematcher" "0.5.8"
+ tslib "2"
-"@formatjs/fast-memoize@2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b"
- integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==
+"@formatjs/fast-memoize@2.2.3":
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz#74e64109279d5244f9fc281f3ae90c407cece823"
+ integrity sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==
dependencies:
- tslib "^2.4.0"
+ tslib "2"
-"@formatjs/icu-messageformat-parser@2.7.8":
- version "2.7.8"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz#f6d7643001e9bb5930d812f1f9a9856f30fa0343"
- integrity sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==
+"@formatjs/icu-messageformat-parser@2.9.4":
+ version "2.9.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz#52501fbdc122a86097644f03ae1117b9ced00872"
+ integrity sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==
dependencies:
- "@formatjs/ecma402-abstract" "2.0.0"
- "@formatjs/icu-skeleton-parser" "1.8.2"
- tslib "^2.4.0"
+ "@formatjs/ecma402-abstract" "2.2.4"
+ "@formatjs/icu-skeleton-parser" "1.8.8"
+ tslib "2"
-"@formatjs/icu-skeleton-parser@1.8.2":
- version "1.8.2"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz#2252c949ae84ee66930e726130ea66731a123c9f"
- integrity sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==
+"@formatjs/icu-skeleton-parser@1.8.8":
+ version "1.8.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz#a16eff7fd040acf096fb1853c99527181d38cf90"
+ integrity sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==
dependencies:
- "@formatjs/ecma402-abstract" "2.0.0"
- tslib "^2.4.0"
+ "@formatjs/ecma402-abstract" "2.2.4"
+ tslib "2"
-"@formatjs/intl-localematcher@0.5.4":
- version "0.5.4"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz#caa71f2e40d93e37d58be35cfffe57865f2b366f"
- integrity sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==
+"@formatjs/intl-localematcher@0.5.8":
+ version "0.5.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz#b11bbd04bd3551f7cadcb1ef1e231822d0e3c97e"
+ integrity sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==
dependencies:
- tslib "^2.4.0"
+ tslib "2"
"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0":
version "9.3.0"
@@ -1387,12 +1358,12 @@
dependencies:
"@hapi/hoek" "^9.0.0"
-"@humanwhocodes/config-array@^0.11.14":
- version "0.11.14"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
- integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
+"@humanwhocodes/config-array@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
+ integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
dependencies:
- "@humanwhocodes/object-schema" "^2.0.2"
+ "@humanwhocodes/object-schema" "^2.0.3"
debug "^4.3.1"
minimatch "^3.0.5"
@@ -1401,37 +1372,37 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-"@humanwhocodes/object-schema@^2.0.2":
+"@humanwhocodes/object-schema@^2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
-"@internationalized/date@^3.5.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.4.tgz#49ba11634fd4350b7a9308e297032267b4063c44"
- integrity sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==
+"@internationalized/date@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.6.0.tgz#b30d43030bfed1855f20c9503606926d75bfdf64"
+ integrity sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==
dependencies:
"@swc/helpers" "^0.5.0"
-"@internationalized/message@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.4.tgz#4da041155829ffb57c9563fa7c99e2b94c8a5766"
- integrity sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==
+"@internationalized/message@^3.1.6":
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.6.tgz#e5a832788a17214bfb3e5bbf5f0e23ed2f568ad7"
+ integrity sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ==
dependencies:
"@swc/helpers" "^0.5.0"
intl-messageformat "^10.1.0"
-"@internationalized/number@^3.5.3":
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.5.3.tgz#9fa060c1c4809f23fb3d38dd3f3d1ae4c87e95a8"
- integrity sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==
+"@internationalized/number@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.6.0.tgz#dc6ba20c41b25eb605f1d5cac7d8668e9022c224"
+ integrity sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==
dependencies:
"@swc/helpers" "^0.5.0"
-"@internationalized/string@^3.2.3":
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.2.3.tgz#b0a8379e779a69e7874979714e27f2ae86761d3c"
- integrity sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw==
+"@internationalized/string@^3.2.5":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.2.5.tgz#2f387b256e79596a2e62ddd5e15c619fe241189c"
+ integrity sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw==
dependencies:
"@swc/helpers" "^0.5.0"
@@ -1712,9 +1683,9 @@
"@jridgewell/trace-mapping" "^0.3.25"
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
- version "1.4.15"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
- integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
@@ -1745,9 +1716,9 @@
eslint-scope "5.1.1"
"@noble/hashes@^1.2.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426"
- integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5"
+ integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==
"@noble/secp256k1@1.6.3":
version "1.6.3"
@@ -1775,6 +1746,11 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@nolyfill/is-core-module@1.0.39":
+ version "1.0.39"
+ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e"
+ integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==
+
"@otplib/core@^12.0.1":
version "12.0.1"
resolved "https://registry.yarnpkg.com/@otplib/core/-/core-12.0.1.tgz#73720a8cedce211fe5b3f683cd5a9c098eaf0f8d"
@@ -1827,187 +1803,188 @@
"@react-types/checkbox" "^3.2.1"
"@react-aria/combobox@^3.0.0-alpha.1":
- version "3.9.1"
- resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.9.1.tgz#ab12b698b76fd063f386aa5516129b2c72f5bf60"
- integrity sha512-SpK92dCmT8qn8aEcUAihRQrBb5LZUhwIbDExFII8PvUvEFy/PoQHXIo3j1V29WkutDBDpMvBv/6XRCHGXPqrhQ==
- dependencies:
- "@react-aria/i18n" "^3.11.1"
- "@react-aria/listbox" "^3.12.1"
- "@react-aria/live-announcer" "^3.3.4"
- "@react-aria/menu" "^3.14.1"
- "@react-aria/overlays" "^3.22.1"
- "@react-aria/selection" "^3.18.1"
- "@react-aria/textfield" "^3.14.5"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/collections" "^3.10.7"
- "@react-stately/combobox" "^3.8.4"
- "@react-stately/form" "^3.0.3"
- "@react-types/button" "^3.9.4"
- "@react-types/combobox" "^3.11.1"
- "@react-types/shared" "^3.23.1"
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.11.0.tgz#9489aaad342d092bf1fe1c4c382f6714316ac1c4"
+ integrity sha512-s88YMmPkMO1WSoiH1KIyZDLJqUwvM2wHXXakj3cYw1tBHGo4rOUFq+JWQIbM5EDO4HOR4AUUqzIUd0NO7t3zyg==
+ dependencies:
+ "@react-aria/i18n" "^3.12.4"
+ "@react-aria/listbox" "^3.13.6"
+ "@react-aria/live-announcer" "^3.4.1"
+ "@react-aria/menu" "^3.16.0"
+ "@react-aria/overlays" "^3.24.0"
+ "@react-aria/selection" "^3.21.0"
+ "@react-aria/textfield" "^3.15.0"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/combobox" "^3.10.1"
+ "@react-stately/form" "^3.1.0"
+ "@react-types/button" "^3.10.1"
+ "@react-types/combobox" "^3.13.1"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/focus@^3.17.1", "@react-aria/focus@^3.2.3":
- version "3.17.1"
- resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.17.1.tgz#c796a188120421e2fedf438cadacdf463c77ad29"
- integrity sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==
+"@react-aria/focus@^3.19.0", "@react-aria/focus@^3.2.3":
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.0.tgz#82b9a5b83f023b943a7970df3d059f49d61df05d"
+ integrity sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A==
dependencies:
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/utils" "^3.24.1"
- "@react-types/shared" "^3.23.1"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/utils" "^3.26.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
clsx "^2.0.0"
-"@react-aria/form@^3.0.5":
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.5.tgz#abaf6ac005dc3f98760ac74fdb6524ad189399d6"
- integrity sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ==
+"@react-aria/form@^3.0.11":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.11.tgz#84511874e1fad5f981bae97ebd4d549923849455"
+ integrity sha512-oXzjTiwVuuWjZ8muU0hp3BrDH5qjVctLOF50mjPvqUbvXQTHhoDxWweyIXPQjGshaqBd2w4pWaE4A2rG2O/apw==
dependencies:
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/form" "^3.0.3"
- "@react-types/shared" "^3.23.1"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/form" "^3.1.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/i18n@^3.11.1", "@react-aria/i18n@^3.2.0", "@react-aria/i18n@^3.3.0":
- version "3.11.1"
- resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.11.1.tgz#2d238d2be30d8c691b5fa3161f5fb48066fc8e4b"
- integrity sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ==
- dependencies:
- "@internationalized/date" "^3.5.4"
- "@internationalized/message" "^3.1.4"
- "@internationalized/number" "^3.5.3"
- "@internationalized/string" "^3.2.3"
- "@react-aria/ssr" "^3.9.4"
- "@react-aria/utils" "^3.24.1"
- "@react-types/shared" "^3.23.1"
+"@react-aria/i18n@^3.12.4", "@react-aria/i18n@^3.2.0", "@react-aria/i18n@^3.3.0":
+ version "3.12.4"
+ resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.4.tgz#4520ce48a1b6ebe4aa470d72eba300e65de01814"
+ integrity sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w==
+ dependencies:
+ "@internationalized/date" "^3.6.0"
+ "@internationalized/message" "^3.1.6"
+ "@internationalized/number" "^3.6.0"
+ "@internationalized/string" "^3.2.5"
+ "@react-aria/ssr" "^3.9.7"
+ "@react-aria/utils" "^3.26.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.3.2":
- version "3.21.3"
- resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.21.3.tgz#a2a3e354a8b894bed7a46e1143453f397f2538d7"
- integrity sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==
+"@react-aria/interactions@^3.22.5", "@react-aria/interactions@^3.3.2":
+ version "3.22.5"
+ resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.5.tgz#9cd8c93b8b6988f1d315d3efb450119d1432bbb8"
+ integrity sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ==
dependencies:
- "@react-aria/ssr" "^3.9.4"
- "@react-aria/utils" "^3.24.1"
- "@react-types/shared" "^3.23.1"
+ "@react-aria/ssr" "^3.9.7"
+ "@react-aria/utils" "^3.26.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/label@^3.1.1", "@react-aria/label@^3.7.8":
- version "3.7.8"
- resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.8.tgz#69f1c184836b04445fcedce78db9fd939a0570ea"
- integrity sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg==
+"@react-aria/label@^3.1.1", "@react-aria/label@^3.7.13":
+ version "3.7.13"
+ resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.13.tgz#9e7153a1ded878b5147d141effc3eb226f3c6c1f"
+ integrity sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg==
dependencies:
- "@react-aria/utils" "^3.24.1"
- "@react-types/shared" "^3.23.1"
+ "@react-aria/utils" "^3.26.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/listbox@^3.12.1", "@react-aria/listbox@^3.2.4":
- version "3.12.1"
- resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.12.1.tgz#cc4f0d23630f496273ca5c31b4dfacf6d6f37df1"
- integrity sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA==
- dependencies:
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/label" "^3.7.8"
- "@react-aria/selection" "^3.18.1"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/collections" "^3.10.7"
- "@react-stately/list" "^3.10.5"
- "@react-types/listbox" "^3.4.9"
- "@react-types/shared" "^3.23.1"
+"@react-aria/listbox@^3.13.6", "@react-aria/listbox@^3.2.4":
+ version "3.13.6"
+ resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.13.6.tgz#43ff24f4a6540a9952729833201460fa6ab081f7"
+ integrity sha512-6hEXEXIZVau9lgBZ4VVjFR3JnGU+fJaPmV3HP0UZ2ucUptfG0MZo24cn+ZQJsWiuaCfNFv5b8qribiv+BcO+Kg==
+ dependencies:
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/label" "^3.7.13"
+ "@react-aria/selection" "^3.21.0"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/list" "^3.11.1"
+ "@react-types/listbox" "^3.5.3"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/live-announcer@^3.0.0-alpha.0", "@react-aria/live-announcer@^3.3.4":
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.3.4.tgz#97a5830ae7da8546b2d19311fe1606c5d5e0151c"
- integrity sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==
+"@react-aria/live-announcer@^3.0.0-alpha.0", "@react-aria/live-announcer@^3.4.1":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.4.1.tgz#efedf706b23f6e1b526a3a35c14c202ac3e68487"
+ integrity sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig==
dependencies:
"@swc/helpers" "^0.5.0"
-"@react-aria/menu@^3.14.1":
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.14.1.tgz#c9ec25bc374ee9bb02dc3d92d8260df702349133"
- integrity sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/i18n" "^3.11.1"
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/overlays" "^3.22.1"
- "@react-aria/selection" "^3.18.1"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/collections" "^3.10.7"
- "@react-stately/menu" "^3.7.1"
- "@react-stately/tree" "^3.8.1"
- "@react-types/button" "^3.9.4"
- "@react-types/menu" "^3.9.9"
- "@react-types/shared" "^3.23.1"
+"@react-aria/menu@^3.16.0":
+ version "3.16.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.16.0.tgz#119e562806e9f8a39fd468ab790d788905c6df83"
+ integrity sha512-TNk+Vd3TbpBPUxEloAdHRTaRxf9JBK7YmkHYiq0Yj5Lc22KS0E2eTyhpPM9xJvEWN2TlC5TEvNfdyui2kYWFFQ==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/i18n" "^3.12.4"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/overlays" "^3.24.0"
+ "@react-aria/selection" "^3.21.0"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/menu" "^3.9.0"
+ "@react-stately/selection" "^3.18.0"
+ "@react-stately/tree" "^3.8.6"
+ "@react-types/button" "^3.10.1"
+ "@react-types/menu" "^3.9.13"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/overlays@^3.22.1", "@react-aria/overlays@^3.7.0":
- version "3.22.1"
- resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.22.1.tgz#7a01673317fa6517bb91b0b7504e303facdc9ccb"
- integrity sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/i18n" "^3.11.1"
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/ssr" "^3.9.4"
- "@react-aria/utils" "^3.24.1"
- "@react-aria/visually-hidden" "^3.8.12"
- "@react-stately/overlays" "^3.6.7"
- "@react-types/button" "^3.9.4"
- "@react-types/overlays" "^3.8.7"
- "@react-types/shared" "^3.23.1"
+"@react-aria/overlays@^3.24.0", "@react-aria/overlays@^3.7.0":
+ version "3.24.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.24.0.tgz#7f97cd12506961abfab3ae653822cea05d1cacd3"
+ integrity sha512-0kAXBsMNTc/a3M07tK9Cdt/ea8CxTAEJ223g8YgqImlmoBBYAL7dl5G01IOj67TM64uWPTmZrOklBchHWgEm3A==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/i18n" "^3.12.4"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/ssr" "^3.9.7"
+ "@react-aria/utils" "^3.26.0"
+ "@react-aria/visually-hidden" "^3.8.18"
+ "@react-stately/overlays" "^3.6.12"
+ "@react-types/button" "^3.10.1"
+ "@react-types/overlays" "^3.8.11"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
"@react-aria/radio@^3.1.2":
- version "3.10.4"
- resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.4.tgz#e1b54fa7a9ee3912a5fe170fc752000eef836c06"
- integrity sha512-3fmoMcQtCpgjTwJReFjnvIE/C7zOZeCeWUn4JKDqz9s1ILYsC3Rk5zZ4q66tFn6v+IQnecrKT52wH6+hlVLwTA==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/form" "^3.0.5"
- "@react-aria/i18n" "^3.11.1"
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/label" "^3.7.8"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/radio" "^3.10.4"
- "@react-types/radio" "^3.8.1"
- "@react-types/shared" "^3.23.1"
+ version "3.10.10"
+ resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.10.tgz#18e2811fb3e72298414c880bd9405ea3f1d83f1f"
+ integrity sha512-NVdeOVrsrHgSfwL2jWCCXFsWZb+RMRZErj5vthHQW4nkHECGOzeX56VaLWTSvdoCPqi9wdIX8A6K9peeAIgxzA==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/form" "^3.0.11"
+ "@react-aria/i18n" "^3.12.4"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/label" "^3.7.13"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/radio" "^3.10.9"
+ "@react-types/radio" "^3.8.5"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/selection@^3.18.1", "@react-aria/selection@^3.3.1", "@react-aria/selection@^3.3.2":
- version "3.18.1"
- resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.18.1.tgz#fd6a10a86be187ac2a591cbbc1f41c3aa0c09f7f"
- integrity sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/i18n" "^3.11.1"
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/selection" "^3.15.1"
- "@react-types/shared" "^3.23.1"
+"@react-aria/selection@^3.21.0", "@react-aria/selection@^3.3.1", "@react-aria/selection@^3.3.2":
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.21.0.tgz#c5660e73a38db5e3e1cdc722e408b4489f5f589a"
+ integrity sha512-52JJ6hlPcM+gt0VV3DBmz6Kj1YAJr13TfutrKfGWcK36LvNCBm1j0N+TDqbdnlp8Nue6w0+5FIwZq44XPYiBGg==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/i18n" "^3.12.4"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/selection" "^3.18.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
"@react-aria/slider@^3.0.1":
- version "3.7.8"
- resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.8.tgz#6f2109527e0ebfaa1aaf46fce2460549d5550e1b"
- integrity sha512-MYvPcM0K8jxEJJicUK2+WxUkBIM/mquBxOTOSSIL3CszA80nXIGVnLlCUnQV3LOUzpWtabbWaZokSPtGgOgQOw==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/i18n" "^3.11.1"
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/label" "^3.7.8"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/slider" "^3.5.4"
- "@react-types/shared" "^3.23.1"
- "@react-types/slider" "^3.7.3"
+ version "3.7.14"
+ resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.14.tgz#25a362725d6cd71e9b86477362a36c847c73384e"
+ integrity sha512-7rOiKjLkEZ0j7mPMlwrqivc+K4OSfL14slaQp06GHRiJkhiWXh2/drPe15hgNq55HmBQBpA0umKMkJcqVgmXPA==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/i18n" "^3.12.4"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/label" "^3.7.13"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/slider" "^3.6.0"
+ "@react-types/shared" "^3.26.0"
+ "@react-types/slider" "^3.7.7"
"@swc/helpers" "^0.5.0"
-"@react-aria/ssr@^3.0.1", "@react-aria/ssr@^3.9.4":
- version "3.9.4"
- resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.4.tgz#9da8b10342c156e816dbfa4c9e713b21f274d7ab"
- integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==
+"@react-aria/ssr@^3.0.1", "@react-aria/ssr@^3.9.7":
+ version "3.9.7"
+ resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.7.tgz#d89d129f7bbc5148657e6c952ac31c9353183770"
+ integrity sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==
dependencies:
"@swc/helpers" "^0.5.0"
@@ -2026,52 +2003,53 @@
"@react-types/shared" "^3.2.1"
"@react-types/tabs" "3.0.0-alpha.2"
-"@react-aria/textfield@^3.14.5":
- version "3.14.5"
- resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.14.5.tgz#afb46b4af019dc88fc7f77396cea5ec0c9701f01"
- integrity sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/form" "^3.0.5"
- "@react-aria/label" "^3.7.8"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/form" "^3.0.3"
- "@react-stately/utils" "^3.10.1"
- "@react-types/shared" "^3.23.1"
- "@react-types/textfield" "^3.9.3"
+"@react-aria/textfield@^3.15.0":
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.15.0.tgz#17ebac0b73f084622aaf9697576b82155bed67cb"
+ integrity sha512-V5mg7y1OR6WXYHdhhm4FC7QyGc9TideVRDFij1SdOJrIo5IFB7lvwpOS0GmgwkVbtr71PTRMjZnNbrJUFU6VNA==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/form" "^3.0.11"
+ "@react-aria/label" "^3.7.13"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/form" "^3.1.0"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/shared" "^3.26.0"
+ "@react-types/textfield" "^3.10.0"
"@swc/helpers" "^0.5.0"
"@react-aria/toggle@^3.1.1":
- version "3.10.4"
- resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.4.tgz#a3673ead72c389381c6217b5bed7269300351a8e"
- integrity sha512-bRk+CdB8QzrSyGNjENXiTWxfzYKRw753iwQXsEAU7agPCUdB8cZJyrhbaUoD0rwczzTp2zDbZ9rRbUPdsBE2YQ==
- dependencies:
- "@react-aria/focus" "^3.17.1"
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/utils" "^3.24.1"
- "@react-stately/toggle" "^3.7.4"
- "@react-types/checkbox" "^3.8.1"
+ version "3.10.10"
+ resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.10.tgz#444658bf606e6d56b1fd96737d5a552c93493979"
+ integrity sha512-QwMT/vTNrbrILxWVHfd9zVQ3mV2NdBwyRu+DphVQiFAXcmc808LEaIX2n0lI6FCsUDC9ZejCyvzd91/YemdZ1Q==
+ dependencies:
+ "@react-aria/focus" "^3.19.0"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/utils" "^3.26.0"
+ "@react-stately/toggle" "^3.8.0"
+ "@react-types/checkbox" "^3.9.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-aria/utils@^3.24.1", "@react-aria/utils@^3.3.0", "@react-aria/utils@^3.4.1", "@react-aria/utils@^3.6.0":
- version "3.24.1"
- resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.24.1.tgz#9d16023f07c23c41793c9030a9bd203a9c8cf0a7"
- integrity sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==
+"@react-aria/utils@^3.26.0", "@react-aria/utils@^3.3.0", "@react-aria/utils@^3.4.1", "@react-aria/utils@^3.6.0":
+ version "3.26.0"
+ resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.26.0.tgz#833cbfa33e75d15835b757791b3f754432d2f948"
+ integrity sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ==
dependencies:
- "@react-aria/ssr" "^3.9.4"
- "@react-stately/utils" "^3.10.1"
- "@react-types/shared" "^3.23.1"
+ "@react-aria/ssr" "^3.9.7"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
clsx "^2.0.0"
-"@react-aria/visually-hidden@^3.2.1", "@react-aria/visually-hidden@^3.8.12":
- version "3.8.12"
- resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz#89388b4773b8fbea4b5f9682e807510c14218c93"
- integrity sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw==
+"@react-aria/visually-hidden@^3.2.1", "@react-aria/visually-hidden@^3.8.18":
+ version "3.8.18"
+ resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.18.tgz#13c168736944cbe19cd8917ec33a4e6f5f694119"
+ integrity sha512-l/0igp+uub/salP35SsNWq5mGmg3G5F5QMS1gDZ8p28n7CgjvzyiGhJbbca7Oxvaw1HRFzVl9ev+89I7moNnFQ==
dependencies:
- "@react-aria/interactions" "^3.21.3"
- "@react-aria/utils" "^3.24.1"
- "@react-types/shared" "^3.23.1"
+ "@react-aria/interactions" "^3.22.5"
+ "@react-aria/utils" "^3.26.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
"@react-native-aria/button@^0.2.4":
@@ -2139,9 +2117,9 @@
"@react-types/shared" "^3.4.0"
"@react-native-aria/overlays@^0.3.3":
- version "0.3.12"
- resolved "https://registry.yarnpkg.com/@react-native-aria/overlays/-/overlays-0.3.12.tgz#224cc8a096a16fb6ee8ffe15d6a4290c7447db84"
- integrity sha512-XV/JjL+zimkpDT7WfomrZl6D7on2RFnhlM0/EPwCPoHRALrJf1gcyEtl0ubWpB3b9yg5uliJ8u0zOS9ui/8S/Q==
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@react-native-aria/overlays/-/overlays-0.3.14.tgz#3992f656704d67bbe9d5c28862e6fac841f263ae"
+ integrity sha512-a8MIB2aBw5yitNB0szNqKQlm4ngOozHGVmXTbslejGIX2+3YQUg8e7J4ouT7ZgK2iIr2gIB3YrstHDM6mvKVmw==
dependencies:
"@react-aria/interactions" "^3.3.2"
"@react-aria/overlays" "^3.7.0"
@@ -2217,16 +2195,6 @@
execa "^5.0.0"
prompts "^2.4.0"
-"@react-native-community/cli-clean@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz#b6754f39c2b877c9d730feb848945150e1d52209"
- integrity sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==
- dependencies:
- "@react-native-community/cli-tools" "13.6.9"
- chalk "^4.1.2"
- execa "^5.0.0"
- fast-glob "^3.3.2"
-
"@react-native-community/cli-config@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.6.tgz#6d3636a8a3c4542ebb123eaf61bbbc0c2a1d2a6b"
@@ -2239,18 +2207,6 @@
glob "^7.1.3"
joi "^17.2.1"
-"@react-native-community/cli-config@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.9.tgz#d609a64d40a173c89bd7d24e31807bb7dcba69f9"
- integrity sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==
- dependencies:
- "@react-native-community/cli-tools" "13.6.9"
- chalk "^4.1.2"
- cosmiconfig "^5.1.0"
- deepmerge "^4.3.0"
- fast-glob "^3.3.2"
- joi "^17.2.1"
-
"@react-native-community/cli-debugger-ui@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.6.tgz#1eb2276450f270a938686b49881fe232a08c01c4"
@@ -2258,13 +2214,6 @@
dependencies:
serve-static "^1.13.1"
-"@react-native-community/cli-debugger-ui@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz#bc5727c51964206a00d417e5148b46331a81d5a5"
- integrity sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==
- dependencies:
- serve-static "^1.13.1"
-
"@react-native-community/cli-doctor@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.6.tgz#fa33ee00fe5120af516aa0f17fe3ad50270976e7"
@@ -2289,29 +2238,6 @@
wcwidth "^1.0.1"
yaml "^2.2.1"
-"@react-native-community/cli-doctor@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz#f1d4eeff427ddc8a9d19851042621c10939c35cb"
- integrity sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==
- dependencies:
- "@react-native-community/cli-config" "13.6.9"
- "@react-native-community/cli-platform-android" "13.6.9"
- "@react-native-community/cli-platform-apple" "13.6.9"
- "@react-native-community/cli-platform-ios" "13.6.9"
- "@react-native-community/cli-tools" "13.6.9"
- chalk "^4.1.2"
- command-exists "^1.2.8"
- deepmerge "^4.3.0"
- envinfo "^7.10.0"
- execa "^5.0.0"
- hermes-profile-transformer "^0.0.6"
- node-stream-zip "^1.9.1"
- ora "^5.4.1"
- semver "^7.5.2"
- strip-ansi "^5.2.0"
- wcwidth "^1.0.1"
- yaml "^2.2.1"
-
"@react-native-community/cli-hermes@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.3.6.tgz#b1acc7feff66ab0859488e5812b3b3e8b8e9434c"
@@ -2323,16 +2249,6 @@
hermes-profile-transformer "^0.0.6"
ip "^1.1.5"
-"@react-native-community/cli-hermes@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz#88c8dfe936a0d4272efc54429eda9ccc3fca3ad8"
- integrity sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==
- dependencies:
- "@react-native-community/cli-platform-android" "13.6.9"
- "@react-native-community/cli-tools" "13.6.9"
- chalk "^4.1.2"
- hermes-profile-transformer "^0.0.6"
-
"@react-native-community/cli-platform-android@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.6.tgz#6f3581ca4eed3deec7edba83c1bc467098c8167b"
@@ -2344,30 +2260,6 @@
glob "^7.1.3"
logkitty "^0.7.1"
-"@react-native-community/cli-platform-android@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz#b175b9b11334fc90da3f395432678bd53c30fae4"
- integrity sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==
- dependencies:
- "@react-native-community/cli-tools" "13.6.9"
- chalk "^4.1.2"
- execa "^5.0.0"
- fast-glob "^3.3.2"
- fast-xml-parser "^4.2.4"
- logkitty "^0.7.1"
-
-"@react-native-community/cli-platform-apple@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz#02fb5dc47d62acd85f4d7a852e93216927a772fa"
- integrity sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==
- dependencies:
- "@react-native-community/cli-tools" "13.6.9"
- chalk "^4.1.2"
- execa "^5.0.0"
- fast-glob "^3.3.2"
- fast-xml-parser "^4.0.12"
- ora "^5.4.1"
-
"@react-native-community/cli-platform-ios@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.6.tgz#0fa58d01f55d85618c4218925509a4be77867dab"
@@ -2380,13 +2272,6 @@
glob "^7.1.3"
ora "^5.4.1"
-"@react-native-community/cli-platform-ios@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz#f37ceab41c2302e8f0d4bcbd3bf58b3353db4306"
- integrity sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==
- dependencies:
- "@react-native-community/cli-platform-apple" "13.6.9"
-
"@react-native-community/cli-plugin-metro@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.6.tgz#2d632c304313435c9ea104086901fbbeba0f1882"
@@ -2419,21 +2304,6 @@
serve-static "^1.13.1"
ws "^7.5.1"
-"@react-native-community/cli-server-api@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz#269e666bc26e9d0b2f42c7f6099559b5f9259e9d"
- integrity sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==
- dependencies:
- "@react-native-community/cli-debugger-ui" "13.6.9"
- "@react-native-community/cli-tools" "13.6.9"
- compression "^1.7.1"
- connect "^3.6.5"
- errorhandler "^1.5.1"
- nocache "^3.0.1"
- pretty-format "^26.6.2"
- serve-static "^1.13.1"
- ws "^6.2.2"
-
"@react-native-community/cli-tools@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.3.6.tgz#ec213b8409917a56e023595f148c84b9cb3ad871"
@@ -2449,23 +2319,6 @@
semver "^7.5.2"
shell-quote "^1.7.3"
-"@react-native-community/cli-tools@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz#2baee279358ba1a863e737b2fa9f45659ad91929"
- integrity sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==
- dependencies:
- appdirsjs "^1.2.4"
- chalk "^4.1.2"
- execa "^5.0.0"
- find-up "^5.0.0"
- mime "^2.4.1"
- node-fetch "^2.6.0"
- open "^6.2.0"
- ora "^5.4.1"
- semver "^7.5.2"
- shell-quote "^1.7.3"
- sudo-prompt "^9.0.0"
-
"@react-native-community/cli-types@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.3.6.tgz#34012f1d0cb1c4039268828abc07c9c69f2e15be"
@@ -2473,13 +2326,6 @@
dependencies:
joi "^17.2.1"
-"@react-native-community/cli-types@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.9.tgz#08bfb796eacf0daeb31e2de516e81e78a36a1a55"
- integrity sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==
- dependencies:
- joi "^17.2.1"
-
"@react-native-community/cli@11.3.6":
version "11.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.6.tgz#d92618d75229eaf6c0391a6b075684eba5d9819f"
@@ -2503,29 +2349,6 @@
prompts "^2.4.0"
semver "^7.5.2"
-"@react-native-community/cli@13.6.9":
- version "13.6.9"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.9.tgz#ba6360b94e0aba9c4001bda256cf7e57e2ecb02c"
- integrity sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==
- dependencies:
- "@react-native-community/cli-clean" "13.6.9"
- "@react-native-community/cli-config" "13.6.9"
- "@react-native-community/cli-debugger-ui" "13.6.9"
- "@react-native-community/cli-doctor" "13.6.9"
- "@react-native-community/cli-hermes" "13.6.9"
- "@react-native-community/cli-server-api" "13.6.9"
- "@react-native-community/cli-tools" "13.6.9"
- "@react-native-community/cli-types" "13.6.9"
- chalk "^4.1.2"
- commander "^9.4.1"
- deepmerge "^4.3.0"
- execa "^5.0.0"
- find-up "^4.1.0"
- fs-extra "^8.1.0"
- graceful-fs "^4.1.3"
- prompts "^2.4.2"
- semver "^7.5.2"
-
"@react-native-community/clipboard@1.5.1":
version "1.5.1"
resolved "https://registry.yarnpkg.com/@react-native-community/clipboard/-/clipboard-1.5.1.tgz#32abb3ea2eb91ee3f9c5fb1d32d5783253c9fabe"
@@ -2545,84 +2368,87 @@
resolved "https://registry.yarnpkg.com/@react-native-firebase/messaging/-/messaging-14.11.1.tgz#891b92f5606386e83ae377e72659d0836ac7bd6b"
integrity sha512-nJjmA+Oku/rWM//y0hpsXJAM8dqkucZKyu71bZ8f4XCOU0ueqO/Qlyv8ylQ/2G+4+FCoSxncffxDdUfr+3nExA==
-"@react-native/assets-registry@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.85.tgz#ae903c0c25f4d6a751d53d63245d5612c81edd98"
- integrity sha512-59YmIQxfGDw4aP9S/nAM+sjSFdW8fUP6fsqczCcXgL2YVEjyER9XCaUT0J1K+PdHep8pi05KUgIKUds8P3jbmA==
+"@react-native/assets-registry@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.76.3.tgz#c31e91b6f60fed7b0bfc1af617e3a61218d1ec08"
+ integrity sha512-7Fnc3lzCFFpnoyL1egua6d/qUp0KiIpeSLbfOMln4nI2g2BMzyFHdPjJnpLV2NehmS0omOOkrfRqK5u1F/MXzA==
"@react-native/assets-registry@^0.72.0":
version "0.72.0"
resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d"
integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==
-"@react-native/babel-plugin-codegen@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.85.tgz#067224bf5099ee2679babd700c7115822a747004"
- integrity sha512-48TSDclRB5OMXiImiJkLxyCfRyLsqkCgI8buugCZzvXcYslfV7gCvcyFyQldtcOmerV+CK4RAj7QS4hmB5Mr8Q==
+"@react-native/babel-plugin-codegen@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.3.tgz#331f1afb4fe744b135979f0d0db62b1cd07cb5bf"
+ integrity sha512-mZ7jmIIg4bUnxCqY3yTOkoHvvzsDyrZgfnIKiTGm5QACrsIGa5eT3pMFpMm2OpxGXRDrTMsYdPXE2rCyDX52VQ==
dependencies:
- "@react-native/codegen" "0.74.85"
+ "@react-native/codegen" "0.76.3"
-"@react-native/babel-preset@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.85.tgz#3ce6ca77a318dec226fd9e3fff9c2ef7b0aa66e3"
- integrity sha512-yMHUlN8INbK5BBwiBuQMftdWkpm1IgCsoJTKcGD2OpSgZhwwm8RUSvGhdRMzB2w7bsqqBmaEMleGtW6aCR7B9w==
+"@react-native/babel-preset@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.76.3.tgz#f1a839b0b2ced0399148ada5e1e152136109b940"
+ integrity sha512-zi2nPlQf9q2fmfPyzwWEj6DU96v8ziWtEfG7CTAX2PG/Vjfsr94vn/wWrCdhBVvLRQ6Kvd/MFAuDYpxmQwIiVQ==
dependencies:
- "@babel/core" "^7.20.0"
- "@babel/plugin-proposal-async-generator-functions" "^7.0.0"
- "@babel/plugin-proposal-class-properties" "^7.18.0"
- "@babel/plugin-proposal-export-default-from" "^7.0.0"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.18.0"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0"
- "@babel/plugin-proposal-numeric-separator" "^7.0.0"
- "@babel/plugin-proposal-object-rest-spread" "^7.20.0"
- "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
- "@babel/plugin-proposal-optional-chaining" "^7.20.0"
- "@babel/plugin-syntax-dynamic-import" "^7.8.0"
- "@babel/plugin-syntax-export-default-from" "^7.0.0"
- "@babel/plugin-syntax-flow" "^7.18.0"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0"
- "@babel/plugin-syntax-optional-chaining" "^7.0.0"
- "@babel/plugin-transform-arrow-functions" "^7.0.0"
- "@babel/plugin-transform-async-to-generator" "^7.20.0"
- "@babel/plugin-transform-block-scoping" "^7.0.0"
- "@babel/plugin-transform-classes" "^7.0.0"
- "@babel/plugin-transform-computed-properties" "^7.0.0"
- "@babel/plugin-transform-destructuring" "^7.20.0"
- "@babel/plugin-transform-flow-strip-types" "^7.20.0"
- "@babel/plugin-transform-function-name" "^7.0.0"
- "@babel/plugin-transform-literals" "^7.0.0"
- "@babel/plugin-transform-modules-commonjs" "^7.0.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0"
- "@babel/plugin-transform-parameters" "^7.0.0"
- "@babel/plugin-transform-private-methods" "^7.22.5"
- "@babel/plugin-transform-private-property-in-object" "^7.22.11"
- "@babel/plugin-transform-react-display-name" "^7.0.0"
- "@babel/plugin-transform-react-jsx" "^7.0.0"
- "@babel/plugin-transform-react-jsx-self" "^7.0.0"
- "@babel/plugin-transform-react-jsx-source" "^7.0.0"
- "@babel/plugin-transform-runtime" "^7.0.0"
- "@babel/plugin-transform-shorthand-properties" "^7.0.0"
- "@babel/plugin-transform-spread" "^7.0.0"
- "@babel/plugin-transform-sticky-regex" "^7.0.0"
- "@babel/plugin-transform-typescript" "^7.5.0"
- "@babel/plugin-transform-unicode-regex" "^7.0.0"
- "@babel/template" "^7.0.0"
- "@react-native/babel-plugin-codegen" "0.74.85"
+ "@babel/core" "^7.25.2"
+ "@babel/plugin-proposal-export-default-from" "^7.24.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-default-from" "^7.24.7"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-transform-arrow-functions" "^7.24.7"
+ "@babel/plugin-transform-async-generator-functions" "^7.25.4"
+ "@babel/plugin-transform-async-to-generator" "^7.24.7"
+ "@babel/plugin-transform-block-scoping" "^7.25.0"
+ "@babel/plugin-transform-class-properties" "^7.25.4"
+ "@babel/plugin-transform-classes" "^7.25.4"
+ "@babel/plugin-transform-computed-properties" "^7.24.7"
+ "@babel/plugin-transform-destructuring" "^7.24.8"
+ "@babel/plugin-transform-flow-strip-types" "^7.25.2"
+ "@babel/plugin-transform-for-of" "^7.24.7"
+ "@babel/plugin-transform-function-name" "^7.25.1"
+ "@babel/plugin-transform-literals" "^7.25.2"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
+ "@babel/plugin-transform-numeric-separator" "^7.24.7"
+ "@babel/plugin-transform-object-rest-spread" "^7.24.7"
+ "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.8"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/plugin-transform-private-methods" "^7.24.7"
+ "@babel/plugin-transform-private-property-in-object" "^7.24.7"
+ "@babel/plugin-transform-react-display-name" "^7.24.7"
+ "@babel/plugin-transform-react-jsx" "^7.25.2"
+ "@babel/plugin-transform-react-jsx-self" "^7.24.7"
+ "@babel/plugin-transform-react-jsx-source" "^7.24.7"
+ "@babel/plugin-transform-regenerator" "^7.24.7"
+ "@babel/plugin-transform-runtime" "^7.24.7"
+ "@babel/plugin-transform-shorthand-properties" "^7.24.7"
+ "@babel/plugin-transform-spread" "^7.24.7"
+ "@babel/plugin-transform-sticky-regex" "^7.24.7"
+ "@babel/plugin-transform-typescript" "^7.25.2"
+ "@babel/plugin-transform-unicode-regex" "^7.24.7"
+ "@babel/template" "^7.25.0"
+ "@react-native/babel-plugin-codegen" "0.76.3"
+ babel-plugin-syntax-hermes-parser "^0.25.1"
babel-plugin-transform-flow-enums "^0.0.2"
react-refresh "^0.14.0"
-"@react-native/codegen@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.85.tgz#568464071c0b9be741da1a1ab43b1df88180ca5d"
- integrity sha512-N7QwoS4Hq/uQmoH83Ewedy6D0M7xbQsOU3OMcQf0eY3ltQ7S2hd9/R4UTalQWRn1OUJfXR6OG12QJ4FStKgV6Q==
+"@react-native/codegen@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.76.3.tgz#a94664601bb60797dd1042972bffdd1b2bfe008c"
+ integrity sha512-oJCH/jbYeGmFJql8/y76gqWCCd74pyug41yzYAjREso1Z7xL88JhDyKMvxEnfhSdMOZYVl479N80xFiXPy3ZYA==
dependencies:
- "@babel/parser" "^7.20.0"
+ "@babel/parser" "^7.25.3"
glob "^7.1.1"
- hermes-parser "0.19.1"
+ hermes-parser "0.23.1"
invariant "^2.2.4"
jscodeshift "^0.14.0"
mkdirp "^0.5.1"
nullthrows "^1.1.1"
+ yargs "^17.6.2"
"@react-native/codegen@^0.72.6":
version "0.72.8"
@@ -2637,49 +2463,46 @@
mkdirp "^0.5.1"
nullthrows "^1.1.1"
-"@react-native/community-cli-plugin@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.85.tgz#5bf95599166fd2b8bf10612250006e282053f6c4"
- integrity sha512-ODzND33eA2owAY3g9jgCdqB+BjAh8qJ7dvmSotXgrgDYr3MJMpd8gvHTIPe2fg4Kab+wk8uipRhrE0i0RYMwtQ==
+"@react-native/community-cli-plugin@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.3.tgz#64e1209959103c4ef60a5edb7d7db94329f35ed5"
+ integrity sha512-vgsLixHS24jR0d0QqPykBWFaC+V8x9cM3cs4oYXw3W199jgBNGP9MWcUJLazD2vzrT/lUTVBVg0rBeB+4XR6fg==
dependencies:
- "@react-native-community/cli-server-api" "13.6.9"
- "@react-native-community/cli-tools" "13.6.9"
- "@react-native/dev-middleware" "0.74.85"
- "@react-native/metro-babel-transformer" "0.74.85"
+ "@react-native/dev-middleware" "0.76.3"
+ "@react-native/metro-babel-transformer" "0.76.3"
chalk "^4.0.0"
execa "^5.1.1"
- metro "^0.80.3"
- metro-config "^0.80.3"
- metro-core "^0.80.3"
+ invariant "^2.2.4"
+ metro "^0.81.0"
+ metro-config "^0.81.0"
+ metro-core "^0.81.0"
node-fetch "^2.2.0"
- querystring "^0.2.1"
readline "^1.3.0"
+ semver "^7.1.3"
-"@react-native/debugger-frontend@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz#a7af94a7b81cb59f241fd1771d1b083445329700"
- integrity sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==
+"@react-native/debugger-frontend@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.76.3.tgz#531e616f6dad159a58117efc69cec20422d15b0d"
+ integrity sha512-pMHQ3NpPB28RxXciSvm2yD+uDx3pkhzfuWkc7VFgOduyzPSIr0zotUiOJzsAtrj8++bPbOsAraCeQhCqoOTWQw==
-"@react-native/dev-middleware@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz#eca35aceb882b1111385f7c20f1aad7a33a2734e"
- integrity sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==
+"@react-native/dev-middleware@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.76.3.tgz#52edc76c88e0c2c436eb989551b827bf69f2a56f"
+ integrity sha512-b+2IpW40z1/S5Jo5JKrWPmucYU/PzeGyGBZZ/SJvmRnBDaP3txb9yIqNZAII1EWsKNhedh8vyRO5PSuJ9Juqzw==
dependencies:
"@isaacs/ttlcache" "^1.4.1"
- "@react-native/debugger-frontend" "0.74.85"
- "@rnx-kit/chromium-edge-launcher" "^1.0.0"
+ "@react-native/debugger-frontend" "0.76.3"
chrome-launcher "^0.15.2"
+ chromium-edge-launcher "^0.2.0"
connect "^3.6.5"
debug "^2.2.0"
- node-fetch "^2.2.0"
nullthrows "^1.1.1"
open "^7.0.3"
selfsigned "^2.4.1"
serve-static "^1.13.1"
- temp-dir "^2.0.0"
- ws "^6.2.2"
+ ws "^6.2.3"
-"@react-native/eslint-config@^0.72.2":
+"@react-native/eslint-config@0.72.2":
version "0.72.2"
resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.72.2.tgz#31da4cec65ad2805d4db9fdda138452821d72133"
integrity sha512-rAYuQQXzi63W7+9Pu/+23od/b/lTSzHjMFibum3sKgdG2LIyvhoMEWQ5+Chu7TqebqYy1b9SDn/KEMHvpWFtNg==
@@ -2703,37 +2526,37 @@
resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.72.0.tgz#7ec4c6a73dfde4bd6b4a4d3c462cfdc2637bf91d"
integrity sha512-xWQthnyKd+H22TBqeJUTFebsyWAAwzUb7EQCT8F/WMZsS1sv5UG+2cM/cU9/2HEbVZgxHYuLIi915WznjKPvlg==
-"@react-native/gradle-plugin@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.85.tgz#7c7d16655a4c15da87402ae3f7d6566466aea723"
- integrity sha512-1VQSLukJzaVMn1MYcs8Weo1nUW8xCas2XU1KuoV7OJPk6xPnEBFJmapmEGP5mWeEy7kcTXJmddEgy1wwW0tcig==
+"@react-native/gradle-plugin@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.76.3.tgz#f9cd1c17433811349fff1cab48393b6e9dd7bfe1"
+ integrity sha512-t0aYZ8ND7+yc+yIm6Yp52bInneYpki6RSIFZ9/LMUzgMKvEB62ptt/7sfho9QkKHCNxE1DJSWIqLIGi/iHHkyg==
"@react-native/gradle-plugin@^0.72.11":
version "0.72.11"
resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz#c063ef12778706611de7a1e42b74b14d9405fb9f"
integrity sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==
-"@react-native/js-polyfills@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.85.tgz#1abfeeaec5ff24b6a1b3e2296e760359fce47739"
- integrity sha512-gp4Rg9le3lVZeW7Cie6qLfekvRKZuhJ3LKgi1SFB4N154z1wIclypAJXVXgWBsy8JKJfTwRI+sffC4qZDlvzrg==
+"@react-native/js-polyfills@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.76.3.tgz#9ac9838b814cf6623797c5118fa4542eb46f410e"
+ integrity sha512-pubJFArMMrdZiytH+W95KngcSQs+LsxOBsVHkwgMnpBfRUxXPMK4fudtBwWvhnwN76Oe+WhxSq7vOS5XgoPhmw==
"@react-native/js-polyfills@^0.72.1":
version "0.72.1"
resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz#905343ef0c51256f128256330fccbdb35b922291"
integrity sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==
-"@react-native/metro-babel-transformer@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.85.tgz#d530d9a6bd319ece226a2d6aaa00b464a1928089"
- integrity sha512-JIrXqEwhTvWPtGArgMptIPGstMdXQIkwSjKVYt+7VC4a9Pw1GurIWanIJheEW6ZuCVvTc0VZkwglFz9JVjzDjA==
+"@react-native/metro-babel-transformer@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.3.tgz#9accefdb77c509329f7272f4ab0676b11d870257"
+ integrity sha512-b2zQPXmW7avw/7zewc9nzMULPIAjsTwN03hskhxHUJH5pzUf7pIklB3FrgYPZrRhJgzHiNl3tOPu7vqiKzBYPg==
dependencies:
- "@babel/core" "^7.20.0"
- "@react-native/babel-preset" "0.74.85"
- hermes-parser "0.19.1"
+ "@babel/core" "^7.25.2"
+ "@react-native/babel-preset" "0.76.3"
+ hermes-parser "0.23.1"
nullthrows "^1.1.1"
-"@react-native/metro-config@^0.72.0":
+"@react-native/metro-config@0.72.12":
version "0.72.12"
resolved "https://registry.yarnpkg.com/@react-native/metro-config/-/metro-config-0.72.12.tgz#f55a0a68100824ac57989ee9ae9518a69b0c43c5"
integrity sha512-6NC5nr70oV8gH5vTz0yVYig6TGn97NfE58DdYottuOGPEODZf9Jpb7gdLs6Rqj5ryFDsKVPU3NsFmXKBJwEgXQ==
@@ -2748,20 +2571,20 @@
resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91"
integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==
-"@react-native/normalize-colors@*", "@react-native/normalize-colors@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz#62bcb9ab1b10b822ca0278fdfdf23d3b18e125da"
- integrity sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==
+"@react-native/normalize-colors@*", "@react-native/normalize-colors@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.76.3.tgz#8d4de4a8671385c53b2d202ef0137632abcf747d"
+ integrity sha512-Yrpmrh4IDEupUUM/dqVxhAN8QW1VEUR3Qrk2lzJC1jB2s46hDe0hrMP2vs12YJqlzshteOthjwXQlY0TgIzgbg==
"@react-native/normalize-colors@^0.72.0":
version "0.72.0"
resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz#14294b7ed3c1d92176d2a00df48456e8d7d62212"
integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==
-"@react-native/virtualized-lists@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.85.tgz#a6178c7168953807b3b610c9f8d208a6f758407d"
- integrity sha512-jx2Zw0qlZteoQ+0KxRc7s4drsljLBEP534FaNZ950e9+CN9nVkLsV6rigcTjDR8wjKMSBWhKf0C0C3egYz7Ehg==
+"@react-native/virtualized-lists@0.76.3":
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.76.3.tgz#9865f9e3770c101476564dc2436018f82adfb4b3"
+ integrity sha512-wTGv9pVh3vAOWb29xFm+J9VRe9dUcUcb9FyaMLT/Hxa88W4wqa5ZMe1V9UvrrBiA1G5DKjv8/1ZcDsJhyugVKA==
dependencies:
invariant "^2.2.4"
nullthrows "^1.1.1"
@@ -2774,40 +2597,22 @@
invariant "^2.2.4"
nullthrows "^1.1.1"
-"@react-navigation/bottom-tabs@6.5.7":
- version "6.5.7"
- resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.7.tgz#08470c96e0d11481422214bb98f0ff034038856c"
- integrity sha512-9oZYyRu2z7+1pr2dX5V54rHFPmlj4ztwQxFe85zwpnGcPtGIsXj7VCIdlHnjRHJBBFCszvJGQpYY6/G2+DfD+A==
- dependencies:
- "@react-navigation/elements" "^1.3.17"
- color "^4.2.3"
- warn-once "^0.1.0"
-
"@react-navigation/core@^6.1.1":
- version "6.4.16"
- resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.16.tgz#f9369a134805174536b9aa0f0f483b930511caf9"
- integrity sha512-UDTJBsHxnzgFETR3ZxhctP+RWr4SkyeZpbhpkQoIGOuwSCkt1SE0qjU48/u6r6w6XlX8OqVudn1Ab0QFXTHxuQ==
+ version "6.4.17"
+ resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.17.tgz#f277a196b578c8a456efcc563d1c9bd87eb4ab04"
+ integrity sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg==
dependencies:
"@react-navigation/routers" "^6.1.9"
escape-string-regexp "^4.0.0"
nanoid "^3.1.23"
query-string "^7.1.3"
react-is "^16.13.0"
- use-latest-callback "^0.1.9"
-
-"@react-navigation/drawer@6.6.6":
- version "6.6.6"
- resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-6.6.6.tgz#6a48e5ea2bf70dc6dfbe17e7e48b5a532d8886dc"
- integrity sha512-DW/oNRisSOGOqvZfCzfhKBxnzT97Teqtg1Gal85g+K3gnVbM1jOBE2PdnYsKU0fULfFtDwvp/QZSbcgjDpr12A==
- dependencies:
- "@react-navigation/elements" "^1.3.21"
- color "^4.2.3"
- warn-once "^0.1.0"
+ use-latest-callback "^0.2.1"
-"@react-navigation/elements@^1.3.1", "@react-navigation/elements@^1.3.17", "@react-navigation/elements@^1.3.21":
- version "1.3.30"
- resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.30.tgz#a81371f599af1070b12014f05d6c09b1a611fd9a"
- integrity sha512-plhc8UvCZs0UkV+sI+3bisIyn78wz9O/BiWZXpounu72k/R/Sj5PuZYFJ1fi6psvriUveMCGh4LeZckAZu2qiQ==
+"@react-navigation/elements@^1.3.1":
+ version "1.3.31"
+ resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.31.tgz#28dd802a0787bb03fc0e5be296daf1804dbebbcf"
+ integrity sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==
"@react-navigation/native-stack@6.5.0":
version "6.5.0"
@@ -2845,14 +2650,14 @@
"@react-types/checkbox" "^3.2.3"
"@react-stately/checkbox@^3.0.1":
- version "3.6.5"
- resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.5.tgz#0566eae3ba3a84af6f29526b3feaf124d3c3a66b"
- integrity sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg==
- dependencies:
- "@react-stately/form" "^3.0.3"
- "@react-stately/utils" "^3.10.1"
- "@react-types/checkbox" "^3.8.1"
- "@react-types/shared" "^3.23.1"
+ version "3.6.10"
+ resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.10.tgz#69b619fdfcf1e15d2d93392e13289a36d85a8a6c"
+ integrity sha512-LHm7i4YI8A/RdgWAuADrnSAYIaYYpQeZqsp1a03Og0pJHAlZL0ymN3y2IFwbZueY0rnfM+yF+kWNXjJqbKrFEQ==
+ dependencies:
+ "@react-stately/form" "^3.1.0"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/checkbox" "^3.9.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
"@react-stately/collections@3.3.0":
@@ -2863,12 +2668,12 @@
"@babel/runtime" "^7.6.2"
"@react-types/shared" "^3.2.1"
-"@react-stately/collections@^3.10.7":
- version "3.10.7"
- resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.10.7.tgz#b1add46cb8e2f2a0d33938ef1b232fb2d0fd11eb"
- integrity sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA==
+"@react-stately/collections@^3.12.0":
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.12.0.tgz#6240d3517d0d86f7d9eb4997108fb432d569e8d7"
+ integrity sha512-MfR9hwCxe5oXv4qrLUnjidwM50U35EFmInUeFf8i9mskYwWlRYS0O1/9PZ0oF1M0cKambaRHKEy98jczgb9ycA==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
"@react-stately/combobox@3.0.0-alpha.1":
@@ -2884,57 +2689,57 @@
"@react-types/combobox" "3.0.0-alpha.1"
"@react-types/shared" "^3.4.0"
-"@react-stately/combobox@^3.8.4":
- version "3.8.4"
- resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.8.4.tgz#6540ec4d53af210e6f3a769ba3f2615a55380984"
- integrity sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA==
- dependencies:
- "@react-stately/collections" "^3.10.7"
- "@react-stately/form" "^3.0.3"
- "@react-stately/list" "^3.10.5"
- "@react-stately/overlays" "^3.6.7"
- "@react-stately/select" "^3.6.4"
- "@react-stately/utils" "^3.10.1"
- "@react-types/combobox" "^3.11.1"
- "@react-types/shared" "^3.23.1"
+"@react-stately/combobox@^3.10.1":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.1.tgz#ebae28c5341d06d69cc8e50055fa816dee19522b"
+ integrity sha512-Rso+H+ZEDGFAhpKWbnRxRR/r7YNmYVtt+Rn0eNDNIUp3bYaxIBCdCySyAtALs4I8RZXZQ9zoUznP7YeVwG3cLg==
+ dependencies:
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/form" "^3.1.0"
+ "@react-stately/list" "^3.11.1"
+ "@react-stately/overlays" "^3.6.12"
+ "@react-stately/select" "^3.6.9"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/combobox" "^3.13.1"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/form@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.0.3.tgz#9894f9b219cc4cfbbde814d43d3f897bc43b25b3"
- integrity sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg==
+"@react-stately/form@^3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.1.0.tgz#7fdb4ca153be18e7516a02e507ada393ad38945d"
+ integrity sha512-E2wxNQ0QaTyDHD0nJFtTSnEH9A3bpJurwxhS4vgcUmESHgjFEMLlC9irUSZKgvOgb42GAq+fHoWBsgKeTp9Big==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/list@^3.10.5", "@react-stately/list@^3.2.2":
- version "3.10.5"
- resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.10.5.tgz#b68ebd595b5f4a51d6719cdcabd34f0780e95b85"
- integrity sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA==
+"@react-stately/list@^3.11.1", "@react-stately/list@^3.2.2":
+ version "3.11.1"
+ resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.1.tgz#d1493e5b9c5cac6cafb3cb3a6edb852bf3cb208f"
+ integrity sha512-UCOpIvqBOjwLtk7zVTYWuKU1m1Oe61Q5lNar/GwHaV1nAiSQ8/yYlhr40NkBEs9X3plEfsV28UIpzOrYnu1tPg==
dependencies:
- "@react-stately/collections" "^3.10.7"
- "@react-stately/selection" "^3.15.1"
- "@react-stately/utils" "^3.10.1"
- "@react-types/shared" "^3.23.1"
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/selection" "^3.18.0"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/menu@^3.1.0", "@react-stately/menu@^3.7.1":
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.7.1.tgz#af3c259c519de036d9e80d7d8370278c7b042c6a"
- integrity sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg==
+"@react-stately/menu@^3.1.0", "@react-stately/menu@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.9.0.tgz#b1e55996405f4e43ff844cbd325df9842914efe4"
+ integrity sha512-++sm0fzZeUs9GvtRbj5RwrP+KL9KPANp9f4SvtI3s+MP+Y/X3X7LNNePeeccGeyikB5fzMsuyvd82bRRW9IhDQ==
dependencies:
- "@react-stately/overlays" "^3.6.7"
- "@react-types/menu" "^3.9.9"
- "@react-types/shared" "^3.23.1"
+ "@react-stately/overlays" "^3.6.12"
+ "@react-types/menu" "^3.9.13"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/overlays@^3.1.1", "@react-stately/overlays@^3.6.7":
- version "3.6.7"
- resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.7.tgz#d4aa1b709e6e72306c33308bb031466730dd0480"
- integrity sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw==
+"@react-stately/overlays@^3.1.1", "@react-stately/overlays@^3.6.12":
+ version "3.6.12"
+ resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.12.tgz#beb594a0e140dbd7957bfa181006854f91480bea"
+ integrity sha512-QinvZhwZgj8obUyPIcyURSCjTZlqZYRRCS60TF8jH8ZpT0tEAuDb3wvhhSXuYA3Xo9EHLwvLjEf3tQKKdAQArw==
dependencies:
- "@react-stately/utils" "^3.10.1"
- "@react-types/overlays" "^3.8.7"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/overlays" "^3.8.11"
"@swc/helpers" "^0.5.0"
"@react-stately/radio@3.2.1":
@@ -2946,37 +2751,37 @@
"@react-stately/utils" "^3.1.1"
"@react-types/radio" "^3.1.1"
-"@react-stately/radio@^3.10.4", "@react-stately/radio@^3.2.1":
- version "3.10.4"
- resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.4.tgz#499ef1e781a47b5ac89b3af571fc61054327f55b"
- integrity sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ==
+"@react-stately/radio@^3.10.9", "@react-stately/radio@^3.2.1":
+ version "3.10.9"
+ resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.9.tgz#cf74b8f47cbef56836424d2e7d06c01fe9d9ea05"
+ integrity sha512-kUQ7VdqFke8SDRCatw2jW3rgzMWbvw+n2imN2THETynI47NmNLzNP11dlGO2OllRtTrsLhmBNlYHa3W62pFpAw==
dependencies:
- "@react-stately/form" "^3.0.3"
- "@react-stately/utils" "^3.10.1"
- "@react-types/radio" "^3.8.1"
- "@react-types/shared" "^3.23.1"
+ "@react-stately/form" "^3.1.0"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/radio" "^3.8.5"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/select@^3.1.0", "@react-stately/select@^3.6.4":
- version "3.6.4"
- resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.4.tgz#efd512c94545309e2373ea2f17cd97c8a1803321"
- integrity sha512-whZgF1N53D0/dS8tOFdrswB0alsk5Q5620HC3z+5f2Hpi8gwgAZ8TYa+2IcmMYRiT+bxVuvEc/NirU9yPmqGbA==
+"@react-stately/select@^3.1.0", "@react-stately/select@^3.6.9":
+ version "3.6.9"
+ resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.9.tgz#088bb0fe7b16cc67d833f17c330df63c4310a5da"
+ integrity sha512-vASUDv7FhEYQURzM+JIwcusPv7/x/l3zHc/oKJPvoCl3aa9pwS8hZwS82SC00o2iFnrDscfDJju4IE/cd4hucg==
dependencies:
- "@react-stately/form" "^3.0.3"
- "@react-stately/list" "^3.10.5"
- "@react-stately/overlays" "^3.6.7"
- "@react-types/select" "^3.9.4"
- "@react-types/shared" "^3.23.1"
+ "@react-stately/form" "^3.1.0"
+ "@react-stately/list" "^3.11.1"
+ "@react-stately/overlays" "^3.6.12"
+ "@react-types/select" "^3.9.8"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/selection@^3.15.1":
- version "3.15.1"
- resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.15.1.tgz#853af4958e7eb02d75487c878460338bbec3f548"
- integrity sha512-6TQnN9L0UY9w19B7xzb1P6mbUVBtW840Cw1SjgNXCB3NPaCf59SwqClYzoj8O2ZFzMe8F/nUJtfU1NS65/OLlw==
+"@react-stately/selection@^3.18.0":
+ version "3.18.0"
+ resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.18.0.tgz#eb723dc26eafd9b016c55056fb550bdde8b4f87b"
+ integrity sha512-6EaNNP3exxBhW2LkcRR4a3pg+3oDguZlBSqIVVR7lyahv/D8xXHRC4dX+m0mgGHJpsgjs7664Xx6c8v193TFxg==
dependencies:
- "@react-stately/collections" "^3.10.7"
- "@react-stately/utils" "^3.10.1"
- "@react-types/shared" "^3.23.1"
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
"@react-stately/slider@3.0.1":
@@ -2990,14 +2795,14 @@
"@react-stately/utils" "^3.2.0"
"@react-types/slider" "^3.0.1"
-"@react-stately/slider@^3.0.1", "@react-stately/slider@^3.5.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.5.4.tgz#f8c1b5133769380348fa1e8a7a513ebbd88a8355"
- integrity sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw==
+"@react-stately/slider@^3.0.1", "@react-stately/slider@^3.6.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.6.0.tgz#20439e08915725c4f6ba2285a561ae92fe59d997"
+ integrity sha512-w5vJxVh267pmD1X+Ppd9S3ZzV1hcg0cV8q5P4Egr160b9WMcWlUspZPtsthwUlN7qQe/C8y5IAhtde4s29eNag==
dependencies:
- "@react-stately/utils" "^3.10.1"
- "@react-types/shared" "^3.23.1"
- "@react-types/slider" "^3.7.3"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/shared" "^3.26.0"
+ "@react-types/slider" "^3.7.7"
"@swc/helpers" "^0.5.0"
"@react-stately/tabs@3.0.0-alpha.0":
@@ -3030,46 +2835,47 @@
"@react-types/checkbox" "^3.2.1"
"@react-types/shared" "^3.2.1"
-"@react-stately/toggle@^3.2.1", "@react-stately/toggle@^3.2.3", "@react-stately/toggle@^3.7.4":
- version "3.7.4"
- resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.7.4.tgz#3345b5c939db96305af7c22b73577db5536220ab"
- integrity sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA==
+"@react-stately/toggle@^3.2.1", "@react-stately/toggle@^3.2.3", "@react-stately/toggle@^3.8.0":
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.8.0.tgz#39a3e45989f56e236809d8fe69c160cc88a616f5"
+ integrity sha512-pyt/k/J8BwE/2g6LL6Z6sMSWRx9HEJB83Sm/MtovXnI66sxJ2EfQ1OaXB7Su5PEL9OMdoQF6Mb+N1RcW3zAoPw==
dependencies:
- "@react-stately/utils" "^3.10.1"
- "@react-types/checkbox" "^3.8.1"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/checkbox" "^3.9.0"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/tree@^3.8.1":
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.1.tgz#a3ea36d503a0276a860842cc8bf7c759aa7fa75f"
- integrity sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw==
+"@react-stately/tree@^3.8.6":
+ version "3.8.6"
+ resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.6.tgz#85dc33c5d5b9a455ffc0b474300957e511db1ea4"
+ integrity sha512-lblUaxf1uAuIz5jm6PYtcJ+rXNNVkqyFWTIMx6g6gW/mYvm8GNx1G/0MLZE7E6CuDGaO9dkLSY2bB1uqyKHidA==
dependencies:
- "@react-stately/collections" "^3.10.7"
- "@react-stately/selection" "^3.15.1"
- "@react-stately/utils" "^3.10.1"
- "@react-types/shared" "^3.23.1"
+ "@react-stately/collections" "^3.12.0"
+ "@react-stately/selection" "^3.18.0"
+ "@react-stately/utils" "^3.10.5"
+ "@react-types/shared" "^3.26.0"
"@swc/helpers" "^0.5.0"
-"@react-stately/utils@^3.0.0-alpha.1", "@react-stately/utils@^3.1.1", "@react-stately/utils@^3.10.1", "@react-stately/utils@^3.2.0", "@react-stately/utils@^3.2.2":
- version "3.10.1"
- resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.1.tgz#dc8685b4994bef0dc10c37b024074be8afbfba62"
- integrity sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==
+"@react-stately/utils@^3.0.0-alpha.1", "@react-stately/utils@^3.1.1", "@react-stately/utils@^3.10.5", "@react-stately/utils@^3.2.0", "@react-stately/utils@^3.2.2":
+ version "3.10.5"
+ resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.5.tgz#47bb91cd5afd1bafe39353614e5e281b818ebccc"
+ integrity sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==
dependencies:
"@swc/helpers" "^0.5.0"
-"@react-types/button@^3.3.1", "@react-types/button@^3.9.4":
- version "3.9.4"
- resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.9.4.tgz#ec10452e870660d31db1994f6fe4abfe0c800814"
- integrity sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA==
+"@react-types/button@^3.10.1", "@react-types/button@^3.3.1":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.1.tgz#fc7ada2e83bc661b31c1473a82ec86dc11de057c"
+ integrity sha512-XTtap8o04+4QjPNAshFWOOAusUTxQlBjU2ai0BTVLShQEjHhRVDBIWsI2B2FKJ4KXT6AZ25llaxhNrreWGonmA==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
-"@react-types/checkbox@^3.2.1", "@react-types/checkbox@^3.2.3", "@react-types/checkbox@^3.8.1":
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.8.1.tgz#de82c93542b2dd85c01df2e0c85c33a2e6349d14"
- integrity sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ==
+"@react-types/checkbox@^3.2.1", "@react-types/checkbox@^3.2.3", "@react-types/checkbox@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.9.0.tgz#d4621fef81850543f7a028917e9c2781cd871443"
+ integrity sha512-9hbHx0Oo2Hp5a8nV8Q75LQR0DHtvOIJbFaeqESSopqmV9EZoYjtY/h0NS7cZetgahQgnqYWQi44XGooMDCsmxA==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
"@react-types/combobox@3.0.0-alpha.1":
version "3.0.0-alpha.1"
@@ -3078,60 +2884,60 @@
dependencies:
"@react-types/shared" "^3.4.0"
-"@react-types/combobox@^3.11.1":
- version "3.11.1"
- resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.11.1.tgz#d5ab2f3c12d01083a3fc7c6ed90b9a2ae9049aa0"
- integrity sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ==
+"@react-types/combobox@^3.13.1":
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.13.1.tgz#d7d843f45501ad141f74ba62ed46d2e991b2d6a0"
+ integrity sha512-7xr+HknfhReN4QPqKff5tbKTe2kGZvH+DGzPYskAtb51FAAiZsKo+WvnNAvLwg3kRoC9Rkn4TAiVBp/HgymRDw==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
-"@react-types/listbox@^3.1.1", "@react-types/listbox@^3.4.9":
- version "3.4.9"
- resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.4.9.tgz#92e9990f480b48c1849ffd57ad8f95f5e278df66"
- integrity sha512-S5G+WmNKUIOPZxZ4svWwWQupP3C6LmVfnf8QQmPDvwYXGzVc0WovkqUWyhhjJirFDswTXRCO9p0yaTHHIlkdwQ==
+"@react-types/listbox@^3.1.1", "@react-types/listbox@^3.5.3":
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.5.3.tgz#c5dbe8a67d67ca59de6b88aaa2f20fcf61fee1c5"
+ integrity sha512-v1QXd9/XU3CCKr2Vgs7WLcTr6VMBur7CrxHhWZQQFExsf9bgJ/3wbUdjy4aThY/GsYHiaS38EKucCZFr1QAfqA==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
-"@react-types/menu@^3.9.9":
- version "3.9.9"
- resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.9.tgz#d7f81f6ecad7dd04fc730b4ad5c3ca39e3c0883d"
- integrity sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg==
+"@react-types/menu@^3.9.13":
+ version "3.9.13"
+ resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.13.tgz#a666c2233cbdb495202586df86a798601788f74d"
+ integrity sha512-7SuX6E2tDsqQ+HQdSvIda1ji/+ujmR86dtS9CUu5yWX91P25ufRjZ72EvLRqClWNQsj1Xl4+2zBDLWlceznAjw==
dependencies:
- "@react-types/overlays" "^3.8.7"
- "@react-types/shared" "^3.23.1"
+ "@react-types/overlays" "^3.8.11"
+ "@react-types/shared" "^3.26.0"
-"@react-types/overlays@^3.4.0", "@react-types/overlays@^3.8.7":
- version "3.8.7"
- resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.7.tgz#a43faf524cb3fce74acceee43898b265e8dfee05"
- integrity sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA==
+"@react-types/overlays@^3.4.0", "@react-types/overlays@^3.8.11":
+ version "3.8.11"
+ resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.11.tgz#313964703b2a23572138120b619d35da33445dfd"
+ integrity sha512-aw7T0rwVI3EuyG5AOaEIk8j7dZJQ9m34XAztXJVZ/W2+4pDDkLDbJ/EAPnuo2xGYRGhowuNDn4tDju01eHYi+w==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
-"@react-types/radio@^3.1.1", "@react-types/radio@^3.8.1":
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.1.tgz#f12ddd21d88fa278baa8ddc237b778c70b67669f"
- integrity sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw==
+"@react-types/radio@^3.1.1", "@react-types/radio@^3.8.5":
+ version "3.8.5"
+ resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.5.tgz#8e2dd1911fba829b7f1ebb40bccf9ca483f021fc"
+ integrity sha512-gSImTPid6rsbJmwCkTliBIU/npYgJHOFaI3PNJo7Y0QTAnFelCtYeFtBiWrFodSArSv7ASqpLLUEj9hZu/rxIg==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
-"@react-types/select@^3.9.4":
- version "3.9.4"
- resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.4.tgz#6283cdcb0583a87d23aa00fd118365f80fe68484"
- integrity sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg==
+"@react-types/select@^3.9.8":
+ version "3.9.8"
+ resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.8.tgz#2443b82549b65821f85876a5b803e6d04ae6343e"
+ integrity sha512-RGsYj2oFjXpLnfcvWMBQnkcDuKkwT43xwYWZGI214/gp/B64tJiIUgTM5wFTRAeGDX23EePkhCQF+9ctnqFd6g==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
-"@react-types/shared@^3.2.1", "@react-types/shared@^3.23.1", "@react-types/shared@^3.4.0":
- version "3.23.1"
- resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.23.1.tgz#2f23c81d819d0ef376df3cd4c944be4d6bce84c3"
- integrity sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==
+"@react-types/shared@^3.2.1", "@react-types/shared@^3.26.0", "@react-types/shared@^3.4.0":
+ version "3.26.0"
+ resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.26.0.tgz#21a8b579f0097ee78de18e3e580421ced89e4c8c"
+ integrity sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw==
-"@react-types/slider@^3.0.1", "@react-types/slider@^3.7.3":
- version "3.7.3"
- resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.3.tgz#d6de0626c6977dd10faea2dba656193106ffbdb8"
- integrity sha512-F8qFQaD2mqug2D0XeWMmjGBikiwbdERFlhFzdvNGbypPLz3AZICBKp1ZLPWdl0DMuy03G/jy6Gl4mDobl7RT2g==
+"@react-types/slider@^3.0.1", "@react-types/slider@^3.7.7":
+ version "3.7.7"
+ resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.7.tgz#f00450c6268665ff2ad38ad69bdf51d84ff2341a"
+ integrity sha512-lYTR9zXQV2fSEm/G3gwDENWiki1IXd/oorsgf0zu1DBi2SQDbOsLsGUXiwvD24Xy6OkUuhAqjLPPexezo7+u9g==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
"@react-types/tabs@3.0.0-alpha.2":
version "3.0.0-alpha.2"
@@ -3140,12 +2946,12 @@
dependencies:
"@react-types/shared" "^3.2.1"
-"@react-types/textfield@^3.9.3":
- version "3.9.3"
- resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.9.3.tgz#23db9d87ddadc4eddff3f85406af91e442f01dc9"
- integrity sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw==
+"@react-types/textfield@^3.10.0":
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.10.0.tgz#10df39b75334174490a539ecae71ad19f5ea074d"
+ integrity sha512-ShU3d6kLJGQjPXccVFjM3KOXdj3uyhYROqH9YgSIEVxgA9W6LRflvk/IVBamD9pJYTPbwmVzuP0wQkTDupfZ1w==
dependencies:
- "@react-types/shared" "^3.23.1"
+ "@react-types/shared" "^3.26.0"
"@realm/common@^0.1.4":
version "0.1.4"
@@ -3171,13 +2977,6 @@
"@babel/runtime" ">=7"
react-native ">=0.68"
-"@redux-devtools/extension@3.2.2":
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/@redux-devtools/extension/-/extension-3.2.2.tgz#2d6da4df2c4d32a0aac54d824e46f52b1fd9fc4d"
- integrity sha512-fKA2TWNzJF7wXSDwBemwcagBFudaejXCzH5hRszN3Z6B7XEJtEmGD77AjV0wliZpIZjA/fs3U7CejFMQ+ipS7A==
- dependencies:
- "@babel/runtime" "^7.17.0"
-
"@redux-saga/core@^1.1.3":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.3.0.tgz#2ce08b73d407fc6ea9e7f7d83d2e97d981a3a8b8"
@@ -3231,22 +3030,15 @@
redux-thunk "^2.4.1"
reselect "^4.1.5"
-"@rnx-kit/chromium-edge-launcher@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz#c0df8ea00a902c7a417cd9655aab06de398b939c"
- integrity sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==
- dependencies:
- "@types/node" "^18.0.0"
- escape-string-regexp "^4.0.0"
- is-wsl "^2.2.0"
- lighthouse-logger "^1.0.0"
- mkdirp "^1.0.4"
- rimraf "^3.0.2"
+"@rtsao/scc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
+ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
"@scure/base@^1.1.1":
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30"
- integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865"
+ integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==
"@sentry-internal/feedback@7.119.0":
version "7.119.0"
@@ -3424,7 +3216,7 @@
dependencies:
"@sentry/types" "7.119.0"
-"@shipt/segmented-arc-for-react-native@^1.0.1":
+"@shipt/segmented-arc-for-react-native@1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@shipt/segmented-arc-for-react-native/-/segmented-arc-for-react-native-1.2.1.tgz#72350eb513a9a813da5ecaa2dc4a9422992ecf82"
integrity sha512-3pbPup+UkDnIrESRSo1sGhmOhFV7deF0UgYlLb8QIbUg5MRqsluX1DpivFyna4mpy432H73MRHYt+reZfJp4jg==
@@ -3570,13 +3362,13 @@
svgo "^3.0.2"
"@swc/helpers@^0.5.0":
- version "0.5.11"
- resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7"
- integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==
+ version "0.5.15"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7"
+ integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==
dependencies:
- tslib "^2.4.0"
+ tslib "^2.8.0"
-"@testing-library/jest-native@^5.3.0":
+"@testing-library/jest-native@5.4.3":
version "5.4.3"
resolved "https://registry.yarnpkg.com/@testing-library/jest-native/-/jest-native-5.4.3.tgz#9334c68eaf45db9eb20d0876728cc5d7fc2c3ea2"
integrity sha512-/sSDGaOuE+PJ1Z9Kp4u7PQScSVVXGud59I/qsBFFJvIbcn4P6yYw6cBnBmbPF+X9aRIsTJRDl6gzw5ZkJNm66w==
@@ -3599,7 +3391,7 @@
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
-"@tsconfig/react-native@^3.0.0":
+"@tsconfig/react-native@3.0.5":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@tsconfig/react-native/-/react-native-3.0.5.tgz#c4971b1eca2e8cdf7b0d25f40193a782039c1abd"
integrity sha512-0+pmYzHccvwWpFz2Tv5AJxp6UroLALmAy+SX34tKlwaCie1mNbtCv6uOJp7x8pKchgNA9/n6BGrx7uLQvw8p9A==
@@ -3642,11 +3434,6 @@
dependencies:
"@babel/types" "^7.20.7"
-"@types/crypto-js@4.1.1":
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d"
- integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==
-
"@types/graceful-fs@^4.1.3":
version "4.1.9"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4"
@@ -3655,9 +3442,9 @@
"@types/node" "*"
"@types/hammerjs@^2.0.36":
- version "2.0.45"
- resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.45.tgz#ffa764bb68a66c08db6efb9c816eb7be850577b1"
- integrity sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==
+ version "2.0.46"
+ resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.46.tgz#381daaca1360ff8a7c8dff63f32e69745b9fb1e1"
+ integrity sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==
"@types/hoist-non-react-statics@^3.3.0":
version "3.3.5"
@@ -3686,10 +3473,10 @@
dependencies:
"@types/istanbul-lib-report" "*"
-"@types/jest@^29.2.1":
- version "29.5.12"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544"
- integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==
+"@types/jest@29.5.14":
+ version "29.5.14"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5"
+ integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==
dependencies:
expect "^29.0.0"
pretty-format "^29.0.0"
@@ -3712,30 +3499,23 @@
"@types/node" "*"
"@types/node@*":
- version "20.14.10"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a"
- integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==
+ version "22.9.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.3.tgz#08f3d64b3bc6d74b162d36f60213e8a6704ef2b4"
+ integrity sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==
dependencies:
- undici-types "~5.26.4"
+ undici-types "~6.19.8"
"@types/node@11.11.6":
version "11.11.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a"
integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
-"@types/node@^18.0.0":
- version "18.19.39"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.39.tgz#c316340a5b4adca3aee9dcbf05de385978590593"
- integrity sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==
- dependencies:
- undici-types "~5.26.4"
-
"@types/prop-types@*":
- version "15.7.12"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
- integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
+ version "15.7.13"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
+ integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
-"@types/react-native@^0.66.15":
+"@types/react-native@0.66.34":
version "0.66.34"
resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.66.34.tgz#e28c304de213a7599093aa69c3d8e861f1d46123"
integrity sha512-ON5oCmPoWvA7dBam7FUx4eNn2uXhEXQ7cCgIf0xO8J9PjVMFdkn2HkTSS1j7xLCxcMnYU5zGY0h+RLi9ZRbQAA==
@@ -3743,44 +3523,30 @@
"@types/react" "^17"
"@types/react-redux@^7.1.20":
- version "7.1.33"
- resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15"
- integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==
+ version "7.1.34"
+ resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.34.tgz#83613e1957c481521e6776beeac4fd506d11bd0e"
+ integrity sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==
dependencies:
"@types/hoist-non-react-statics" "^3.3.0"
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
-"@types/react-test-renderer@^18.0.0":
+"@types/react-test-renderer@18.3.0":
version "18.3.0"
resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz#839502eae70058a4ae161f63385a8e7929cef4c0"
integrity sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw==
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@^17":
- version "17.0.80"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41"
- integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==
- dependencies:
- "@types/prop-types" "*"
- "@types/scheduler" "^0.16"
- csstype "^3.0.2"
-
-"@types/react@^18.0.24":
- version "18.3.3"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f"
- integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==
+"@types/react@*", "@types/react@18.3.12", "@types/react@^17":
+ version "18.3.12"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60"
+ integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
-"@types/scheduler@^0.16":
- version "0.16.8"
- resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff"
- integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==
-
"@types/semver@^7.3.12":
version "7.5.8"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
@@ -3811,13 +3577,13 @@
"@types/yargs-parser" "*"
"@types/yargs@^17.0.8":
- version "17.0.32"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229"
- integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==
+ version "17.0.33"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d"
+ integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/eslint-plugin@^5.15.0", "@typescript-eslint/eslint-plugin@^5.30.5":
+"@typescript-eslint/eslint-plugin@5.62.0", "@typescript-eslint/eslint-plugin@^5.30.5":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db"
integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
@@ -3833,7 +3599,7 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/parser@^5.15.0", "@typescript-eslint/parser@^5.30.5":
+"@typescript-eslint/parser@5.62.0", "@typescript-eslint/parser@^5.30.5":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7"
integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
@@ -3928,7 +3694,7 @@ abort-controller@^3.0.0:
dependencies:
event-target-shim "^5.0.0"
-accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7:
+accepts@^1.3.7, accepts@~1.3.7:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
@@ -3942,9 +3708,9 @@ acorn-jsx@^5.3.2:
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.8.2, acorn@^8.9.0:
- version "8.12.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
- integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+ version "8.14.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
+ integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
agent-base@6:
version "6.0.2"
@@ -4002,9 +3768,9 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-regex@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
- integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
+ integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
@@ -4055,19 +3821,17 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-aria-query@~5.1.3:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
- integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
- dependencies:
- deep-equal "^2.0.5"
+aria-query@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59"
+ integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==
array-back@^3.0.1, array-back@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
-array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1:
+array-buffer-byte-length@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
@@ -4075,7 +3839,7 @@ array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1:
call-bind "^1.0.5"
is-array-buffer "^3.0.4"
-array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8:
+array-includes@^3.1.6, array-includes@^3.1.8:
version "3.1.8"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
@@ -4104,7 +3868,7 @@ array.prototype.findlast@^1.2.5:
es-object-atoms "^1.0.0"
es-shim-unscopables "^1.0.2"
-array.prototype.findlastindex@^1.2.3:
+array.prototype.findlastindex@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
@@ -4136,16 +3900,6 @@ array.prototype.flatmap@^1.3.2:
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
-array.prototype.toreversed@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba"
- integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- es-shim-unscopables "^1.0.0"
-
array.prototype.tosorted@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
@@ -4241,9 +3995,9 @@ async-limiter@~1.0.0:
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async@^3.2.0, async@^3.2.2:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66"
- integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
+ integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
asynckit@^0.4.0:
version "0.4.0"
@@ -4263,14 +4017,14 @@ aws-sign2@~0.7.0:
integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
aws4@^1.8.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc"
- integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
+ integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
-axe-core@^4.9.1:
- version "4.9.1"
- resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae"
- integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==
+axe-core@^4.10.0:
+ version "4.10.2"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df"
+ integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==
axios@1.6.8:
version "1.6.8"
@@ -4281,19 +4035,17 @@ axios@1.6.8:
form-data "^4.0.0"
proxy-from-env "^1.1.0"
-axobject-query@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1"
- integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==
- dependencies:
- deep-equal "^2.0.5"
+axobject-query@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee"
+ integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==
babel-core@^7.0.0-bridge.0:
version "7.0.0-bridge.0"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
-babel-jest@^29.2.1, babel-jest@^29.7.0:
+babel-jest@29.7.0, babel-jest@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5"
integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==
@@ -4327,7 +4079,7 @@ babel-plugin-jest-hoist@^29.6.3:
"@types/babel__core" "^7.1.14"
"@types/babel__traverse" "^7.0.6"
-babel-plugin-module-resolver@^4.1.0:
+babel-plugin-module-resolver@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2"
integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==
@@ -4339,28 +4091,42 @@ babel-plugin-module-resolver@^4.1.0:
resolve "^1.13.1"
babel-plugin-polyfill-corejs2@^0.4.10:
- version "0.4.11"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
- integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==
+ version "0.4.12"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9"
+ integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==
dependencies:
"@babel/compat-data" "^7.22.6"
- "@babel/helper-define-polyfill-provider" "^0.6.2"
+ "@babel/helper-define-polyfill-provider" "^0.6.3"
semver "^6.3.1"
-babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4:
- version "0.10.4"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77"
- integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==
+babel-plugin-polyfill-corejs3@^0.10.6:
+ version "0.10.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
+ integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.6.1"
- core-js-compat "^3.36.1"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ core-js-compat "^3.38.0"
babel-plugin-polyfill-regenerator@^0.6.1:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e"
- integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8"
+ integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.6.2"
+ "@babel/helper-define-polyfill-provider" "^0.6.3"
+
+babel-plugin-syntax-hermes-parser@^0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz#470e9d1d30ad670d4c8a37138e22ae39c843d1ff"
+ integrity sha512-uNLD0tk2tLUjGFdmCk+u/3FEw2o+BAwW4g+z2QVlxJrzZYOOPADroEcNtTPt5lNiScctaUmnsTkVEnOwZUOLhA==
+ dependencies:
+ hermes-parser "0.23.1"
+
+babel-plugin-syntax-hermes-parser@^0.25.1:
+ version "0.25.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz#58b539df973427fcfbb5176a3aec7e5dee793cb0"
+ integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==
+ dependencies:
+ hermes-parser "0.25.1"
babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0:
version "7.0.0-beta.0"
@@ -4374,28 +4140,31 @@ babel-plugin-transform-flow-enums@^0.0.2:
dependencies:
"@babel/plugin-syntax-flow" "^7.12.1"
-babel-plugin-transform-remove-console@^6.9.4:
+babel-plugin-transform-remove-console@6.9.4:
version "6.9.4"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780"
integrity sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==
babel-preset-current-node-syntax@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
- integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30"
+ integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==
dependencies:
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-bigint" "^7.8.3"
- "@babel/plugin-syntax-class-properties" "^7.8.3"
- "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-top-level-await" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
babel-preset-fbjs@^3.4.0:
version "3.4.0"
@@ -4465,7 +4234,7 @@ base-x@^4.0.0:
resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a"
integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
-base58check@^2.0.0:
+base58check@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/base58check/-/base58check-2.0.0.tgz#8046652d14bc87f063bd16be94a39134d3b61173"
integrity sha512-sTzsDAOC9+i2Ukr3p1Ie2DWpD117ua+vBJRDnpsSlScGwImeeiTg/IatwcFLsz9K9wEGoBLVd5ahNZzrZ/jZyg==
@@ -4530,11 +4299,6 @@ bip21@2.0.3:
dependencies:
qs "^6.3.0"
-bip32-path@0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/bip32-path/-/bip32-path-0.4.2.tgz#5db0416ad6822712f077836e2557b8697c0c7c99"
- integrity sha512-ZBMCELjJfcNMkz5bDuJ1WrYvjlhEF5k6mQ8vUr4N7MbVRsXei7ZOg8VhhwMfNiW68NWmLkgkc6WvTickrLGprQ==
-
bip32@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/bip32/-/bip32-4.0.0.tgz#7fac3c05072188d2d355a4d6596b37188f06aa2f"
@@ -4562,6 +4326,11 @@ bip66@^1.1.5:
dependencies:
safe-buffer "^5.0.1"
+bip68@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/bip68/-/bip68-1.0.4.tgz#78a95c7a43fad183957995cc2e08d79b0c372c4d"
+ integrity sha512-O1htyufFTYy3EO0JkHg2CLykdXEtV2ssqw47Gq9A0WByp662xpJnMEB9m43LZjsSDjIAOozWRExlFQk2hlV1XQ==
+
bitcoinjs-lib@6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-6.1.5.tgz#3b03509ae7ddd80a440f10fc38c4a97f0a028d8c"
@@ -4596,11 +4365,11 @@ bl@^4.0.3, bl@^4.1.0:
readable-stream "^3.4.0"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.8, bn.js@^4.11.9:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
- integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7"
+ integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==
-bn.js@^5.0.0, bn.js@^5.2.1:
+bn.js@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
@@ -4676,12 +4445,13 @@ browserify-des@^1.0.0:
safe-buffer "^5.1.2"
browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
- integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238"
+ integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==
dependencies:
- bn.js "^5.0.0"
- randombytes "^2.0.1"
+ bn.js "^5.2.1"
+ randombytes "^2.1.0"
+ safe-buffer "^5.2.1"
browserify-sign@^4.0.4:
version "4.2.3"
@@ -4699,15 +4469,15 @@ browserify-sign@^4.0.4:
readable-stream "^2.3.8"
safe-buffer "^5.2.1"
-browserslist@^4.22.2, browserslist@^4.23.0:
- version "4.23.1"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96"
- integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==
+browserslist@^4.24.0, browserslist@^4.24.2:
+ version "4.24.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580"
+ integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==
dependencies:
- caniuse-lite "^1.0.30001629"
- electron-to-chromium "^1.4.796"
- node-releases "^2.0.14"
- update-browserslist-db "^1.0.16"
+ caniuse-lite "^1.0.30001669"
+ electron-to-chromium "^1.5.41"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.1"
bs58@5.0.0, bs58@^5.0.0:
version "5.0.0"
@@ -4818,10 +4588,10 @@ buffer@^5.1.0, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
-bytes@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
- integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
version "1.0.7"
@@ -4868,10 +4638,10 @@ camelcase@^6.2.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-caniuse-lite@^1.0.30001629:
- version "1.0.30001640"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f"
- integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==
+caniuse-lite@^1.0.30001669:
+ version "1.0.30001684"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16"
+ integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==
caseless@~0.11.0:
version "0.11.0"
@@ -4925,15 +4695,27 @@ chownr@^2.0.0:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-chrome-launcher@^0.15.2:
- version "0.15.2"
- resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da"
- integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==
+chrome-launcher@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da"
+ integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==
+ dependencies:
+ "@types/node" "*"
+ escape-string-regexp "^4.0.0"
+ is-wsl "^2.2.0"
+ lighthouse-logger "^1.0.0"
+
+chromium-edge-launcher@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz#0c378f28c99aefc360705fa155de0113997f62fc"
+ integrity sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==
dependencies:
"@types/node" "*"
escape-string-regexp "^4.0.0"
is-wsl "^2.2.0"
lighthouse-logger "^1.0.0"
+ mkdirp "^1.0.4"
+ rimraf "^3.0.2"
ci-info@^2.0.0:
version "2.0.0"
@@ -4946,17 +4728,17 @@ ci-info@^3.2.0:
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.5.tgz#749f80731c7821e9a5fabd51f6998b696f296686"
+ integrity sha512-xq7ICKB4TMHUx7Tz1L9O2SGKOhYMOTR32oir45Bq28/AQTpHogKgHcoYFSdRbMtddl+ozNXfXY9jWcgYKmde0w==
dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ inherits "^2.0.4"
+ safe-buffer "^5.2.1"
cjs-module-lexer@^1.0.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c"
- integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170"
+ integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==
"cktap-protocol-react-native@git+https://github.com/bithyve/cktap-protocol-react-native.git#7be02d23550e88a5a0b5790138734d34c688ef5d":
version "0.0.1"
@@ -5081,27 +4863,11 @@ color-name@1.1.3:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-color-name@^1.0.0, color-name@~1.1.4:
+color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-color-string@^1.9.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
- integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
- dependencies:
- color-name "^1.0.0"
- simple-swizzle "^0.2.2"
-
-color@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
- integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
- dependencies:
- color-convert "^2.0.1"
- color-string "^1.9.0"
-
colorette@^1.0.7:
version "1.4.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40"
@@ -5139,6 +4905,11 @@ commander@11.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67"
integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==
+commander@^12.0.0:
+ version "12.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
+ integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
+
commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -5164,7 +4935,7 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
-compressible@~2.0.16:
+compressible@~2.0.18:
version "2.0.18"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
@@ -5172,16 +4943,16 @@ compressible@~2.0.16:
mime-db ">= 1.43.0 < 2"
compression@^1.7.1:
- version "1.7.4"
- resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
- integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ version "1.7.5"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93"
+ integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==
dependencies:
- accepts "~1.3.5"
- bytes "3.0.0"
- compressible "~2.0.16"
+ bytes "3.1.2"
+ compressible "~2.0.18"
debug "2.6.9"
+ negotiator "~0.6.4"
on-headers "~1.0.2"
- safe-buffer "5.1.2"
+ safe-buffer "5.2.1"
vary "~1.1.2"
concat-map@0.0.1:
@@ -5224,12 +4995,12 @@ convert-source-map@^2.0.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
-core-js-compat@^3.31.0, core-js-compat@^3.36.1:
- version "3.37.1"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee"
- integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==
+core-js-compat@^3.38.0, core-js-compat@^3.38.1:
+ version "3.39.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61"
+ integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==
dependencies:
- browserslist "^4.23.0"
+ browserslist "^4.24.2"
core-util-is@1.0.2:
version "1.0.2"
@@ -5313,9 +5084,9 @@ create-jest@^29.7.0:
prompts "^2.0.1"
cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57"
+ integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
@@ -5324,9 +5095,9 @@ cross-spawn@^6.0.5:
which "^1.2.9"
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
@@ -5451,9 +5222,9 @@ data-view-byte-offset@^1.0.0:
is-data-view "^1.0.1"
dayjs@^1.8.15:
- version "1.11.11"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e"
- integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==
+ version "1.11.13"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
+ integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
version "2.6.9"
@@ -5462,12 +5233,12 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
- version "4.3.5"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
- integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@~4.3.1, debug@~4.3.2:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
dependencies:
- ms "2.1.2"
+ ms "^2.1.3"
debug@4.3.4:
version "4.3.4"
@@ -5517,30 +5288,6 @@ deep-equal@^1.0.0:
object-keys "^1.1.1"
regexp.prototype.flags "^1.5.1"
-deep-equal@^2.0.5:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1"
- integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==
- dependencies:
- array-buffer-byte-length "^1.0.0"
- call-bind "^1.0.5"
- es-get-iterator "^1.1.3"
- get-intrinsic "^1.2.2"
- is-arguments "^1.1.1"
- is-array-buffer "^3.0.2"
- is-date-object "^1.0.5"
- is-regex "^1.1.4"
- is-shared-array-buffer "^1.0.2"
- isarray "^2.0.5"
- object-is "^1.1.5"
- object-keys "^1.1.1"
- object.assign "^4.1.4"
- regexp.prototype.flags "^1.5.1"
- side-channel "^1.0.4"
- which-boxed-primitive "^1.0.2"
- which-collection "^1.0.1"
- which-typed-array "^1.1.13"
-
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -5773,19 +5520,19 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
-electron-to-chromium@^1.4.796:
- version "1.4.820"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.820.tgz#1195660c157535392a09442540a08ee63fea8c40"
- integrity sha512-kK/4O/YunacfboFEk/BDf7VO1HoPmDudLTJAU9NmXIOSjsV7qVIX3OrI4REZo0VmdqhcpUcncQc6N8Q3aEXlHg==
+electron-to-chromium@^1.5.41:
+ version "1.5.64"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz#ac8c4c89075d35a1514b620f47dfe48a71ec3697"
+ integrity sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==
-"electrum-client@git+https://github.com/bithyve/rn-electrum-client.git":
+"electrum-client@git+https://github.com/bithyve/rn-electrum-client.git#76c0ea35e1a50c47f3a7f818d529ebd100161496":
version "2.0.0"
resolved "git+https://github.com/bithyve/rn-electrum-client.git#76c0ea35e1a50c47f3a7f818d529ebd100161496"
-elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4, elliptic@^6.5.5:
- version "6.5.5"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded"
- integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==
+elliptic@^6.5.3, elliptic@^6.5.4, elliptic@^6.5.5, elliptic@^6.5.7:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06"
+ integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==
dependencies:
bn.js "^4.11.9"
brorand "^1.1.0"
@@ -5820,6 +5567,11 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -5843,10 +5595,10 @@ engine.io-parser@~5.0.3:
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.7.tgz#ed5eae76c71f398284c578ab6deafd3ba7e4e4f6"
integrity sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==
-enhanced-resolve@^5.12.0:
- version "5.17.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5"
- integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==
+enhanced-resolve@^5.15.0:
+ version "5.17.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
+ integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -5856,10 +5608,10 @@ entities@^4.2.0, entities@^4.4.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
-envinfo@^7.10.0, envinfo@^7.7.2:
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31"
- integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==
+envinfo@^7.7.2:
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae"
+ integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==
error-ex@^1.3.1:
version "1.3.2"
@@ -5883,10 +5635,10 @@ errorhandler@^1.5.1:
accepts "~1.3.7"
escape-html "~1.0.3"
-es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
- version "1.23.3"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
- integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5:
+ version "1.23.5"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb"
+ integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==
dependencies:
array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3"
@@ -5903,7 +5655,7 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23
function.prototype.name "^1.1.6"
get-intrinsic "^1.2.4"
get-symbol-description "^1.0.2"
- globalthis "^1.0.3"
+ globalthis "^1.0.4"
gopd "^1.0.1"
has-property-descriptors "^1.0.2"
has-proto "^1.0.3"
@@ -5919,10 +5671,10 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23
is-string "^1.0.7"
is-typed-array "^1.1.13"
is-weakref "^1.0.2"
- object-inspect "^1.13.1"
+ object-inspect "^1.13.3"
object-keys "^1.1.1"
object.assign "^4.1.5"
- regexp.prototype.flags "^1.5.2"
+ regexp.prototype.flags "^1.5.3"
safe-array-concat "^1.1.2"
safe-regex-test "^1.0.3"
string.prototype.trim "^1.2.9"
@@ -5947,25 +5699,10 @@ es-errors@^1.2.1, es-errors@^1.3.0:
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-es-get-iterator@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
- integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==
- dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.3"
- has-symbols "^1.0.3"
- is-arguments "^1.1.1"
- is-map "^2.0.2"
- is-set "^2.0.2"
- is-string "^1.0.7"
- isarray "^2.0.5"
- stop-iteration-iterator "^1.0.0"
-
-es-iterator-helpers@^1.0.19:
- version "1.0.19"
- resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8"
- integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==
+es-iterator-helpers@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz#2f1a3ab998b30cb2d10b195b587c6d9ebdebf152"
+ integrity sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==
dependencies:
call-bind "^1.0.7"
define-properties "^1.2.1"
@@ -5974,12 +5711,13 @@ es-iterator-helpers@^1.0.19:
es-set-tostringtag "^2.0.3"
function-bind "^1.1.2"
get-intrinsic "^1.2.4"
- globalthis "^1.0.3"
+ globalthis "^1.0.4"
+ gopd "^1.0.1"
has-property-descriptors "^1.0.2"
has-proto "^1.0.3"
has-symbols "^1.0.3"
internal-slot "^1.0.7"
- iterator.prototype "^1.1.2"
+ iterator.prototype "^1.1.3"
safe-array-concat "^1.1.2"
es-object-atoms@^1.0.0:
@@ -6019,10 +5757,10 @@ es6-object-assign@^1.1.0:
resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==
-escalade@^3.1.1, escalade@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
- integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-html@~1.0.3:
version "1.0.3"
@@ -6054,7 +5792,7 @@ eslint-config-airbnb-base@^15.0.0:
object.entries "^1.1.5"
semver "^6.3.0"
-eslint-config-airbnb@^19.0.4:
+eslint-config-airbnb@19.0.4:
version "19.0.4"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3"
integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==
@@ -6063,7 +5801,7 @@ eslint-config-airbnb@^19.0.4:
object.assign "^4.1.2"
object.entries "^1.1.5"
-eslint-config-prettier@^8.5.0:
+eslint-config-prettier@8.10.0, eslint-config-prettier@^8.5.0:
version "8.10.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11"
integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==
@@ -6077,23 +5815,24 @@ eslint-import-resolver-node@^0.3.9:
is-core-module "^2.13.0"
resolve "^1.22.4"
-eslint-import-resolver-typescript@^3.5.2:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa"
- integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==
+eslint-import-resolver-typescript@3.6.3:
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e"
+ integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==
dependencies:
- debug "^4.3.4"
- enhanced-resolve "^5.12.0"
- eslint-module-utils "^2.7.4"
- fast-glob "^3.3.1"
- get-tsconfig "^4.5.0"
- is-core-module "^2.11.0"
+ "@nolyfill/is-core-module" "1.0.39"
+ debug "^4.3.5"
+ enhanced-resolve "^5.15.0"
+ eslint-module-utils "^2.8.1"
+ fast-glob "^3.3.2"
+ get-tsconfig "^4.7.5"
+ is-bun-module "^1.0.2"
is-glob "^4.0.3"
-eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34"
- integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==
+eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b"
+ integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==
dependencies:
debug "^3.2.7"
@@ -6113,27 +5852,29 @@ eslint-plugin-ft-flow@^2.0.1:
lodash "^4.17.21"
string-natural-compare "^3.0.1"
-eslint-plugin-import@^2.25.4:
- version "2.29.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643"
- integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
+eslint-plugin-import@2.31.0:
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7"
+ integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
dependencies:
- array-includes "^3.1.7"
- array.prototype.findlastindex "^1.2.3"
+ "@rtsao/scc" "^1.1.0"
+ array-includes "^3.1.8"
+ array.prototype.findlastindex "^1.2.5"
array.prototype.flat "^1.3.2"
array.prototype.flatmap "^1.3.2"
debug "^3.2.7"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.9"
- eslint-module-utils "^2.8.0"
- hasown "^2.0.0"
- is-core-module "^2.13.1"
+ eslint-module-utils "^2.12.0"
+ hasown "^2.0.2"
+ is-core-module "^2.15.1"
is-glob "^4.0.3"
minimatch "^3.1.2"
- object.fromentries "^2.0.7"
- object.groupby "^1.0.1"
- object.values "^1.1.7"
+ object.fromentries "^2.0.8"
+ object.groupby "^1.0.3"
+ object.values "^1.2.0"
semver "^6.3.1"
+ string.prototype.trimend "^1.0.8"
tsconfig-paths "^3.15.0"
eslint-plugin-jest@^26.5.3:
@@ -6143,27 +5884,26 @@ eslint-plugin-jest@^26.5.3:
dependencies:
"@typescript-eslint/utils" "^5.10.0"
-eslint-plugin-jsx-a11y@^6.5.1:
- version "6.9.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8"
- integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==
+eslint-plugin-jsx-a11y@6.10.2:
+ version "6.10.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483"
+ integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==
dependencies:
- aria-query "~5.1.3"
+ aria-query "^5.3.2"
array-includes "^3.1.8"
array.prototype.flatmap "^1.3.2"
ast-types-flow "^0.0.8"
- axe-core "^4.9.1"
- axobject-query "~3.1.1"
+ axe-core "^4.10.0"
+ axobject-query "^4.1.0"
damerau-levenshtein "^1.0.8"
emoji-regex "^9.2.2"
- es-iterator-helpers "^1.0.19"
hasown "^2.0.2"
jsx-ast-utils "^3.3.5"
language-tags "^1.0.9"
minimatch "^3.1.2"
object.fromentries "^2.0.8"
safe-regex-test "^1.0.3"
- string.prototype.includes "^2.0.0"
+ string.prototype.includes "^2.0.1"
eslint-plugin-prettier@^4.2.1:
version "4.2.1"
@@ -6172,7 +5912,7 @@ eslint-plugin-prettier@^4.2.1:
dependencies:
prettier-linter-helpers "^1.0.0"
-eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0:
+eslint-plugin-react-hooks@4.6.2, eslint-plugin-react-hooks@^4.6.0:
version "4.6.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596"
integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==
@@ -6182,36 +5922,36 @@ eslint-plugin-react-native-globals@^0.1.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2"
integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==
-eslint-plugin-react-native@^4.0.0:
+eslint-plugin-react-native@4.1.0, eslint-plugin-react-native@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz#5343acd3b2246bc1b857ac38be708f070d18809f"
integrity sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==
dependencies:
eslint-plugin-react-native-globals "^0.1.1"
-eslint-plugin-react@^7.29.4, eslint-plugin-react@^7.30.1:
- version "7.34.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b"
- integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==
+eslint-plugin-react@7.37.2, eslint-plugin-react@^7.30.1:
+ version "7.37.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a"
+ integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==
dependencies:
array-includes "^3.1.8"
array.prototype.findlast "^1.2.5"
array.prototype.flatmap "^1.3.2"
- array.prototype.toreversed "^1.1.2"
array.prototype.tosorted "^1.1.4"
doctrine "^2.1.0"
- es-iterator-helpers "^1.0.19"
+ es-iterator-helpers "^1.1.0"
estraverse "^5.3.0"
+ hasown "^2.0.2"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2"
object.entries "^1.1.8"
object.fromentries "^2.0.8"
- object.hasown "^1.1.4"
object.values "^1.2.0"
prop-types "^15.8.1"
resolve "^2.0.0-next.5"
semver "^6.3.1"
string.prototype.matchall "^4.0.11"
+ string.prototype.repeat "^1.0.0"
eslint-scope@5.1.1, eslint-scope@^5.1.1:
version "5.1.1"
@@ -6239,16 +5979,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint@^8.19.0:
- version "8.57.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
- integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
+eslint@8.57.1:
+ version "8.57.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9"
+ integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1"
"@eslint/eslintrc" "^2.1.4"
- "@eslint/js" "8.57.0"
- "@humanwhocodes/config-array" "^0.11.14"
+ "@eslint/js" "8.57.1"
+ "@humanwhocodes/config-array" "^0.13.0"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
"@ungap/structured-clone" "^1.2.0"
@@ -6410,6 +6150,11 @@ expect@^29.0.0, expect@^29.7.0:
jest-message-util "^29.7.0"
jest-util "^29.7.0"
+exponential-backoff@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
+ integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
+
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@@ -6440,7 +6185,7 @@ fast-diff@^1.1.2:
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
-fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2:
+fast-glob@^3.2.9, fast-glob@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
@@ -6466,10 +6211,10 @@ fast-loops@^1.1.3:
resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.4.tgz#61bc77d518c0af5073a638c6d9d5c7683f069ce2"
integrity sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==
-fast-xml-parser@^4.0.12, fast-xml-parser@^4.2.4:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501"
- integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==
+fast-xml-parser@^4.0.12:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37"
+ integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==
dependencies:
strnum "^1.0.5"
@@ -6601,9 +6346,9 @@ flat-cache@^3.0.4:
rimraf "^3.0.2"
flatted@^3.2.9:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
- integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27"
+ integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==
flow-enums-runtime@^0.0.5:
version "0.0.5"
@@ -6616,9 +6361,9 @@ flow-enums-runtime@^0.0.6:
integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==
flow-parser@0.*:
- version "0.239.1"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.239.1.tgz#45cfc79bbcc54332cffeb13293b82a7c7358cd1c"
- integrity sha512-topOrETNxJ6T2gAnQiWqAlzGPj8uI2wtmNOlDIMNB+qyvGJZ6R++STbUOTAYmvPhOMz2gXnXPH0hOvURYmrBow==
+ version "0.254.2"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.254.2.tgz#20991dd73c418cbaf1e7e15ce6e62a4f8d1f1e22"
+ integrity sha512-18xCQaVdKNCY0TAEhwUdk1HmRdgsPSraWwu0Zifqo5M4Ubi9LjWTAdlfBFb07Os+fQ9TmzxlyZN6OxK0m9xrBw==
flow-parser@^0.121.0:
version "0.121.0"
@@ -6631,9 +6376,9 @@ flow-parser@^0.206.0:
integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==
follow-redirects@^1.15.6:
- version "1.15.6"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
- integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+ version "1.15.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
for-each@^0.3.3:
version "0.3.3"
@@ -6665,9 +6410,9 @@ forever-agent@~0.6.1:
integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
form-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
- integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
@@ -6757,7 +6502,7 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
+function.prototype.name@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
@@ -6782,7 +6527,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
@@ -6812,10 +6557,10 @@ get-symbol-description@^1.0.2:
es-errors "^1.3.0"
get-intrinsic "^1.2.4"
-get-tsconfig@^4.5.0:
- version "4.7.5"
- resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf"
- integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==
+get-tsconfig@^4.7.5:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471"
+ integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==
dependencies:
resolve-pkg-maps "^1.0.0"
@@ -6832,9 +6577,9 @@ getpass@^0.1.1:
assert-plus "^1.0.0"
gifted-charts-core@^0.1.11:
- version "0.1.11"
- resolved "https://registry.yarnpkg.com/gifted-charts-core/-/gifted-charts-core-0.1.11.tgz#bc3ea02287d9ebcd54c9d1050e571d64928c4fc3"
- integrity sha512-rALSOlGZejpKCDcDWbROwiUHF0a2sBSwtXQLFMrCnxXWispSSjXp1GlratRoF9Ntnp7ApydvcI3uWaiDQSUM0A==
+ version "0.1.47"
+ resolved "https://registry.yarnpkg.com/gifted-charts-core/-/gifted-charts-core-0.1.47.tgz#a47b844d52726fa546573b40baff93599bb13c51"
+ integrity sha512-mVwJKwje7O3zjNatNEb6cPr+Cs8G+2l7oWcyL6BuqUz1NDDavWf6dYivDTfV4Q5oPPJS7FrlCALr43kCIvQFNg==
github-from-package@0.0.0:
version "0.0.0"
@@ -6891,7 +6636,7 @@ globals@^13.19.0:
dependencies:
type-fest "^0.20.2"
-globalthis@^1.0.3:
+globalthis@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
@@ -6990,12 +6735,12 @@ hash-base@^3.0.0:
safe-buffer "^5.2.0"
hash-base@~3.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
- integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a"
+ integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==
dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ inherits "^2.0.4"
+ safe-buffer "^5.2.1"
hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
@@ -7017,15 +6762,20 @@ hermes-estree@0.12.0:
resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.12.0.tgz#8a289f9aee854854422345e6995a48613bac2ca8"
integrity sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==
-hermes-estree@0.19.1:
- version "0.19.1"
- resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.19.1.tgz#d5924f5fac2bf0532547ae9f506d6db8f3c96392"
- integrity sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==
+hermes-estree@0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.23.1.tgz#d0bac369a030188120ee7024926aabe5a9f84fdb"
+ integrity sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==
-hermes-estree@0.20.1:
- version "0.20.1"
- resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.20.1.tgz#0b9a544cf883a779a8e1444b915fa365bef7f72d"
- integrity sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==
+hermes-estree@0.24.0:
+ version "0.24.0"
+ resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.24.0.tgz#487dc1ddc0bae698c2d79f34153ac9bf62d7b3c0"
+ integrity sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==
+
+hermes-estree@0.25.1:
+ version "0.25.1"
+ resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480"
+ integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==
hermes-parser@0.12.0:
version "0.12.0"
@@ -7034,19 +6784,26 @@ hermes-parser@0.12.0:
dependencies:
hermes-estree "0.12.0"
-hermes-parser@0.19.1:
- version "0.19.1"
- resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.19.1.tgz#1044348097165b7c93dc198a80b04ed5130d6b1a"
- integrity sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==
+hermes-parser@0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.23.1.tgz#e5de648e664f3b3d84d01b48fc7ab164f4b68205"
+ integrity sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==
+ dependencies:
+ hermes-estree "0.23.1"
+
+hermes-parser@0.24.0:
+ version "0.24.0"
+ resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.24.0.tgz#2ed19d079efc0848eb1f800f0c393a074c4696fb"
+ integrity sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==
dependencies:
- hermes-estree "0.19.1"
+ hermes-estree "0.24.0"
-hermes-parser@0.20.1:
- version "0.20.1"
- resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.20.1.tgz#ad10597b99f718b91e283f81cbe636c50c3cff92"
- integrity sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==
+hermes-parser@0.25.1:
+ version "0.25.1"
+ resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1"
+ integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==
dependencies:
- hermes-estree "0.20.1"
+ hermes-estree "0.25.1"
hermes-profile-transformer@^0.0.6:
version "0.0.6"
@@ -7128,7 +6885,7 @@ human-signals@^4.3.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
-husky@^8.0.2:
+husky@8.0.3:
version "8.0.3"
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
@@ -7149,9 +6906,9 @@ ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1:
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^5.0.5, ignore@^5.2.0:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
- integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
image-size@^1.0.2:
version "1.1.1"
@@ -7187,9 +6944,9 @@ import-fresh@^3.2.1, import-fresh@^3.3.0:
resolve-from "^4.0.0"
import-local@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
- integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
dependencies:
pkg-dir "^4.2.0"
resolve-cwd "^3.0.0"
@@ -7230,7 +6987,7 @@ inline-style-prefixer@^6.0.1:
css-in-js-utils "^3.1.0"
fast-loops "^1.1.3"
-internal-slot@^1.0.4, internal-slot@^1.0.7:
+internal-slot@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
@@ -7240,14 +6997,14 @@ internal-slot@^1.0.4, internal-slot@^1.0.7:
side-channel "^1.0.4"
intl-messageformat@^10.1.0:
- version "10.5.14"
- resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.14.tgz#e5bb373f8a37b88fbe647d7b941f3ab2a37ed00a"
- integrity sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==
+ version "10.7.7"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.7.tgz#42085e1664729d02240a03346e31a2540b1112a0"
+ integrity sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==
dependencies:
- "@formatjs/ecma402-abstract" "2.0.0"
- "@formatjs/fast-memoize" "2.2.0"
- "@formatjs/icu-messageformat-parser" "2.7.8"
- tslib "^2.4.0"
+ "@formatjs/ecma402-abstract" "2.2.4"
+ "@formatjs/fast-memoize" "2.2.3"
+ "@formatjs/icu-messageformat-parser" "2.9.4"
+ tslib "2"
invariant@*, invariant@^2.2.4:
version "2.2.4"
@@ -7269,7 +7026,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.1:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-array-buffer@^3.0.2, is-array-buffer@^3.0.4:
+is-array-buffer@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
@@ -7282,11 +7039,6 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
-is-arrayish@^0.3.1:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
- integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
-
is-async-function@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
@@ -7309,6 +7061,13 @@ is-boolean-object@^1.1.0:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
+is-bun-module@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc"
+ integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==
+ dependencies:
+ semver "^7.6.3"
+
is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
@@ -7321,10 +7080,10 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
-is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1:
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1"
- integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==
+is-core-module@^2.13.0, is-core-module@^2.15.1:
+ version "2.15.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
dependencies:
hasown "^2.0.2"
@@ -7362,12 +7121,12 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
-is-finalizationregistry@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6"
- integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
+is-finalizationregistry@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2"
+ integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==
dependencies:
- call-bind "^1.0.2"
+ call-bind "^1.0.7"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
@@ -7408,7 +7167,7 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
-is-map@^2.0.2, is-map@^2.0.3:
+is-map@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
@@ -7458,7 +7217,7 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-set@^2.0.2, is-set@^2.0.3:
+is-set@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
@@ -7626,10 +7385,10 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-iterator.prototype@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
- integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+iterator.prototype@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c"
+ integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==
dependencies:
define-properties "^1.2.1"
get-intrinsic "^1.2.1"
@@ -8011,7 +7770,7 @@ jest-worker@^29.6.3, jest-worker@^29.7.0:
merge-stream "^2.0.0"
supports-color "^8.0.0"
-jest@^29.2.1:
+jest@29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613"
integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==
@@ -8102,15 +7861,10 @@ jscodeshift@^0.14.0:
temp "^0.8.4"
write-file-atomic "^2.3.0"
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+jsesc@^3.0.2, jsesc@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
json-buffer@3.0.1:
version "3.0.1"
@@ -8276,7 +8030,7 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
-lint-staged@^13.0.4:
+lint-staged@13.3.0:
version "13.3.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.3.0.tgz#7965d72a8d6a6c932f85e9c13ccf3596782d28a5"
integrity sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==
@@ -8563,13 +8317,14 @@ metro-babel-transformer@0.76.9:
hermes-parser "0.12.0"
nullthrows "^1.1.1"
-metro-babel-transformer@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz#7051ba377b7d2140abd23f4846bbbb1e81fea99b"
- integrity sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==
+metro-babel-transformer@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz#cf468eafea52e4d8a77844eb7257f8a76e9d9d94"
+ integrity sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==
dependencies:
- "@babel/core" "^7.20.0"
- hermes-parser "0.20.1"
+ "@babel/core" "^7.25.2"
+ flow-enums-runtime "^0.0.6"
+ hermes-parser "0.24.0"
nullthrows "^1.1.1"
metro-cache-key@0.76.7:
@@ -8582,10 +8337,12 @@ metro-cache-key@0.76.9:
resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.9.tgz#6f17f821d6f306fa9028b7e79445eb18387d03d9"
integrity sha512-ugJuYBLngHVh1t2Jj+uP9pSCQl7enzVXkuh6+N3l0FETfqjgOaSHlcnIhMPn6yueGsjmkiIfxQU4fyFVXRtSTw==
-metro-cache-key@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.9.tgz#a04cbb0a7828509bb10dde9789ef761c0c60bc3d"
- integrity sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==
+metro-cache-key@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.81.0.tgz#5db34fa1a323a2310205bda7abd0df9614e36f45"
+ integrity sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==
+ dependencies:
+ flow-enums-runtime "^0.0.6"
metro-cache@0.76.7:
version "0.76.7"
@@ -8603,13 +8360,14 @@ metro-cache@0.76.9:
metro-core "0.76.9"
rimraf "^3.0.2"
-metro-cache@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.9.tgz#b914318a90dbcd51b4c27836184519c441ba5123"
- integrity sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==
+metro-cache@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.81.0.tgz#90470d10d190ad708f04c6e337eec2c7cddb3db0"
+ integrity sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==
dependencies:
- metro-core "0.80.9"
- rimraf "^3.0.2"
+ exponential-backoff "^3.1.1"
+ flow-enums-runtime "^0.0.6"
+ metro-core "0.81.0"
metro-config@0.76.7:
version "0.76.7"
@@ -8637,18 +8395,19 @@ metro-config@0.76.9, metro-config@^0.76.9:
metro-core "0.76.9"
metro-runtime "0.76.9"
-metro-config@0.80.9, metro-config@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.9.tgz#4eb6948b0ddc7c38d9d4ba8ddf22a67ca1c2bc06"
- integrity sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==
+metro-config@0.81.0, metro-config@^0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.81.0.tgz#8f8074033cb7e9ddb5b0459642adf6880bc9fbc1"
+ integrity sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==
dependencies:
connect "^3.6.5"
cosmiconfig "^5.0.5"
+ flow-enums-runtime "^0.0.6"
jest-validate "^29.6.3"
- metro "0.80.9"
- metro-cache "0.80.9"
- metro-core "0.80.9"
- metro-runtime "0.80.9"
+ metro "0.81.0"
+ metro-cache "0.81.0"
+ metro-core "0.81.0"
+ metro-runtime "0.81.0"
metro-core@0.76.7:
version "0.76.7"
@@ -8666,13 +8425,14 @@ metro-core@0.76.9:
lodash.throttle "^4.1.1"
metro-resolver "0.76.9"
-metro-core@0.80.9, metro-core@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.9.tgz#3af21d0b09d71ec9c0840f028bffb36bc3619727"
- integrity sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==
+metro-core@0.81.0, metro-core@^0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.81.0.tgz#d0b634f9cf97849b7730c59457ab7a439811d4c8"
+ integrity sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==
dependencies:
+ flow-enums-runtime "^0.0.6"
lodash.throttle "^4.1.1"
- metro-resolver "0.80.9"
+ metro-resolver "0.81.0"
metro-file-map@0.76.7:
version "0.76.7"
@@ -8714,14 +8474,15 @@ metro-file-map@0.76.9:
optionalDependencies:
fsevents "^2.3.2"
-metro-file-map@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.9.tgz#ed8783f6e35dfc005794344c2a9fcd6e914885aa"
- integrity sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==
+metro-file-map@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.81.0.tgz#af0ccf4f8db4fd8429f78f231faa49dde2c402c3"
+ integrity sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==
dependencies:
anymatch "^3.0.3"
debug "^2.2.0"
fb-watchman "^2.0.0"
+ flow-enums-runtime "^0.0.6"
graceful-fs "^4.2.4"
invariant "^2.2.4"
jest-worker "^29.6.3"
@@ -8768,11 +8529,12 @@ metro-minify-terser@0.76.9:
dependencies:
terser "^5.15.0"
-metro-minify-terser@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.9.tgz#2b7798cba2bd4bd69cc5ce05a45bf66291542f83"
- integrity sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==
+metro-minify-terser@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz#8b0abe977d63a99b99fa94d53678ef3170d5b659"
+ integrity sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==
dependencies:
+ flow-enums-runtime "^0.0.6"
terser "^5.15.0"
metro-minify-uglify@0.76.7:
@@ -8834,7 +8596,7 @@ metro-react-native-babel-preset@0.76.7:
babel-plugin-transform-flow-enums "^0.0.2"
react-refresh "^0.4.0"
-metro-react-native-babel-preset@0.76.9, metro-react-native-babel-preset@^0.76.5:
+metro-react-native-babel-preset@0.76.9:
version "0.76.9"
resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.9.tgz#15868142122af14313429d7572c15cf01c16f077"
integrity sha512-eCBtW/UkJPDr6HlMgFEGF+964DZsUEF9RGeJdZLKWE7d/0nY3ABZ9ZAGxzu9efQ35EWRox5bDMXUGaOwUe5ikQ==
@@ -8911,10 +8673,12 @@ metro-resolver@0.76.9:
resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.9.tgz#79c244784b16ca56076bc1fc816d2ba74860e882"
integrity sha512-s86ipNRas9vNR5lChzzSheF7HoaQEmzxBLzwFA6/2YcGmUCowcoyPAfs1yPh4cjMw9F1T4KlMLaiwniGE7HCyw==
-metro-resolver@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.9.tgz#bae9120a0553e0cb59da6429e83a7e97465cc1a8"
- integrity sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==
+metro-resolver@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.81.0.tgz#141f4837e1e0c5a1810ea02f2d9be3c9f6cf3766"
+ integrity sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==
+ dependencies:
+ flow-enums-runtime "^0.0.6"
metro-runtime@0.76.7:
version "0.76.7"
@@ -8940,12 +8704,13 @@ metro-runtime@0.76.9, metro-runtime@^0.76.9:
"@babel/runtime" "^7.0.0"
react-refresh "^0.4.0"
-metro-runtime@0.80.9, metro-runtime@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.9.tgz#665312bd4e4d38fea921b3153d6ab47846eb4f08"
- integrity sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==
+metro-runtime@0.81.0, metro-runtime@^0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.81.0.tgz#63af9b3fec15d1f307d89ef4881f5ba2c592291e"
+ integrity sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==
dependencies:
- "@babel/runtime" "^7.0.0"
+ "@babel/runtime" "^7.25.0"
+ flow-enums-runtime "^0.0.6"
metro-source-map@0.76.7:
version "0.76.7"
@@ -8989,17 +8754,19 @@ metro-source-map@0.76.9:
source-map "^0.5.6"
vlq "^1.0.0"
-metro-source-map@0.80.9, metro-source-map@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.9.tgz#df8f673137548f37ab9f9dcfa771b354a452cfab"
- integrity sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==
+metro-source-map@0.81.0, metro-source-map@^0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.81.0.tgz#ca83964124bb227d5f0bdb1ee304dbfe635f869e"
+ integrity sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==
dependencies:
- "@babel/traverse" "^7.20.0"
- "@babel/types" "^7.20.0"
+ "@babel/traverse" "^7.25.3"
+ "@babel/traverse--for-generate-function-map" "npm:@babel/traverse@^7.25.3"
+ "@babel/types" "^7.25.2"
+ flow-enums-runtime "^0.0.6"
invariant "^2.2.4"
- metro-symbolicate "0.80.9"
+ metro-symbolicate "0.81.0"
nullthrows "^1.1.1"
- ob1 "0.80.9"
+ ob1 "0.81.0"
source-map "^0.5.6"
vlq "^1.0.0"
@@ -9039,13 +8806,14 @@ metro-symbolicate@0.76.9:
through2 "^2.0.1"
vlq "^1.0.0"
-metro-symbolicate@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.9.tgz#8d1d19d26ebb36b9d13dbd29814fdd71d6009db7"
- integrity sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==
+metro-symbolicate@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz#b7b1eae8bfd6ad2a922fa2bcb9f2144e464adafb"
+ integrity sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==
dependencies:
+ flow-enums-runtime "^0.0.6"
invariant "^2.2.4"
- metro-source-map "0.80.9"
+ metro-source-map "0.81.0"
nullthrows "^1.1.1"
source-map "^0.5.6"
through2 "^2.0.1"
@@ -9073,15 +8841,16 @@ metro-transform-plugins@0.76.9:
"@babel/traverse" "^7.20.0"
nullthrows "^1.1.1"
-metro-transform-plugins@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.9.tgz#473a2c0a9e48043210547abe61cdeedb77725422"
- integrity sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==
+metro-transform-plugins@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz#614c0e50593df545487b3f3383fed810c608fb32"
+ integrity sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==
dependencies:
- "@babel/core" "^7.20.0"
- "@babel/generator" "^7.20.0"
- "@babel/template" "^7.0.0"
- "@babel/traverse" "^7.20.0"
+ "@babel/core" "^7.25.2"
+ "@babel/generator" "^7.25.0"
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.3"
+ flow-enums-runtime "^0.0.6"
nullthrows "^1.1.1"
metro-transform-worker@0.76.7:
@@ -9121,22 +8890,23 @@ metro-transform-worker@0.76.9:
metro-transform-plugins "0.76.9"
nullthrows "^1.1.1"
-metro-transform-worker@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.9.tgz#f1d8ef4f77228bb7e1d20d3c06934166e8ee3b28"
- integrity sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==
+metro-transform-worker@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz#43e63c95014f36786f0e1a132c778c6392950de7"
+ integrity sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==
dependencies:
- "@babel/core" "^7.20.0"
- "@babel/generator" "^7.20.0"
- "@babel/parser" "^7.20.0"
- "@babel/types" "^7.20.0"
- metro "0.80.9"
- metro-babel-transformer "0.80.9"
- metro-cache "0.80.9"
- metro-cache-key "0.80.9"
- metro-minify-terser "0.80.9"
- metro-source-map "0.80.9"
- metro-transform-plugins "0.80.9"
+ "@babel/core" "^7.25.2"
+ "@babel/generator" "^7.25.0"
+ "@babel/parser" "^7.25.3"
+ "@babel/types" "^7.25.2"
+ flow-enums-runtime "^0.0.6"
+ metro "0.81.0"
+ metro-babel-transformer "0.81.0"
+ metro-cache "0.81.0"
+ metro-cache-key "0.81.0"
+ metro-minify-terser "0.81.0"
+ metro-source-map "0.81.0"
+ metro-transform-plugins "0.81.0"
nullthrows "^1.1.1"
metro@0.76.7:
@@ -9246,18 +9016,18 @@ metro@0.76.9:
ws "^7.5.1"
yargs "^17.6.2"
-metro@0.80.9, metro@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.9.tgz#de3c2011df62036520d51d040d2dde0d015aecb6"
- integrity sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==
+metro@0.81.0, metro@^0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/metro/-/metro-0.81.0.tgz#cffe9b7d597728dee8b57903ca155417b7c13a4f"
+ integrity sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==
dependencies:
- "@babel/code-frame" "^7.0.0"
- "@babel/core" "^7.20.0"
- "@babel/generator" "^7.20.0"
- "@babel/parser" "^7.20.0"
- "@babel/template" "^7.0.0"
- "@babel/traverse" "^7.20.0"
- "@babel/types" "^7.20.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/core" "^7.25.2"
+ "@babel/generator" "^7.25.0"
+ "@babel/parser" "^7.25.3"
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.3"
+ "@babel/types" "^7.25.2"
accepts "^1.3.7"
chalk "^4.0.0"
ci-info "^2.0.0"
@@ -9265,34 +9035,33 @@ metro@0.80.9, metro@^0.80.3:
debug "^2.2.0"
denodeify "^1.2.1"
error-stack-parser "^2.0.6"
+ flow-enums-runtime "^0.0.6"
graceful-fs "^4.2.4"
- hermes-parser "0.20.1"
+ hermes-parser "0.24.0"
image-size "^1.0.2"
invariant "^2.2.4"
jest-worker "^29.6.3"
jsc-safe-url "^0.2.2"
lodash.throttle "^4.1.1"
- metro-babel-transformer "0.80.9"
- metro-cache "0.80.9"
- metro-cache-key "0.80.9"
- metro-config "0.80.9"
- metro-core "0.80.9"
- metro-file-map "0.80.9"
- metro-resolver "0.80.9"
- metro-runtime "0.80.9"
- metro-source-map "0.80.9"
- metro-symbolicate "0.80.9"
- metro-transform-plugins "0.80.9"
- metro-transform-worker "0.80.9"
+ metro-babel-transformer "0.81.0"
+ metro-cache "0.81.0"
+ metro-cache-key "0.81.0"
+ metro-config "0.81.0"
+ metro-core "0.81.0"
+ metro-file-map "0.81.0"
+ metro-resolver "0.81.0"
+ metro-runtime "0.81.0"
+ metro-source-map "0.81.0"
+ metro-symbolicate "0.81.0"
+ metro-transform-plugins "0.81.0"
+ metro-transform-worker "0.81.0"
mime-types "^2.1.27"
- node-fetch "^2.2.0"
nullthrows "^1.1.1"
- rimraf "^3.0.2"
serialize-error "^2.1.0"
source-map "^0.5.6"
strip-ansi "^6.0.0"
throat "^5.0.0"
- ws "^7.5.1"
+ ws "^7.5.10"
yargs "^17.6.2"
micromatch@4.0.5:
@@ -9304,9 +9073,9 @@ micromatch@4.0.5:
picomatch "^2.3.1"
micromatch@^4.0.2, micromatch@^4.0.4:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5"
- integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
dependencies:
braces "^3.0.3"
picomatch "^2.3.1"
@@ -9319,11 +9088,16 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
-mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+"mime-db@>= 1.43.0 < 2":
+ version "1.53.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447"
+ integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==
+
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -9443,15 +9217,15 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@2.1.3, ms@^2.1.1:
+ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
nan@^2.14.0:
- version "2.20.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
- integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
+ version "2.22.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
+ integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
nanoid@^3.1.23:
version "3.3.7"
@@ -9519,6 +9293,11 @@ negotiator@0.6.3:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+negotiator@~0.6.4:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7"
+ integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
+
neo-async@^2.5.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
@@ -9543,9 +9322,9 @@ nocache@^3.0.1:
integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==
node-abi@^3.3.0:
- version "3.65.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3"
- integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==
+ version "3.71.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038"
+ integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==
dependencies:
semver "^7.3.5"
@@ -9598,9 +9377,9 @@ node-forge@^1:
integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
node-gyp-build@^4.2.0:
- version "4.8.1"
- resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5"
- integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==
+ version "4.8.4"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8"
+ integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
node-int64@^0.4.0:
version "0.4.0"
@@ -9612,10 +9391,10 @@ node-machine-id@^1.1.10:
resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267"
integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==
-node-releases@^2.0.14:
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
- integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
node-rsa@1.1.1:
version "1.1.1"
@@ -9680,20 +9459,22 @@ ob1@0.76.9:
resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.9.tgz#a493e4b83a0fb39200de639804b5d06eed5599dc"
integrity sha512-g0I/OLnSxf6OrN3QjSew3bTDJCdbZoWxnh8adh1z36alwCuGF1dgDeRA25bTYSakrG5WULSaWJPOdgnf1O/oQw==
-ob1@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.9.tgz#4ae3edd807536097674ff943509089f5d4e0649f"
- integrity sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==
+ob1@0.81.0:
+ version "0.81.0"
+ resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.81.0.tgz#dc3154cca7aa9c2eb58f5ac63e9ee23ff4c6f520"
+ integrity sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==
+ dependencies:
+ flow-enums-runtime "^0.0.6"
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-object-inspect@^1.13.1:
- version "1.13.2"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
- integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+object-inspect@^1.13.1, object-inspect@^1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
+ integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==
object-is@^1.0.1, object-is@^1.1.5:
version "1.1.6"
@@ -9727,7 +9508,7 @@ object.entries@^1.1.5, object.entries@^1.1.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
-object.fromentries@^2.0.7, object.fromentries@^2.0.8:
+object.fromentries@^2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
@@ -9737,7 +9518,7 @@ object.fromentries@^2.0.7, object.fromentries@^2.0.8:
es-abstract "^1.23.2"
es-object-atoms "^1.0.0"
-object.groupby@^1.0.1:
+object.groupby@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
@@ -9746,15 +9527,6 @@ object.groupby@^1.0.1:
define-properties "^1.2.1"
es-abstract "^1.23.2"
-object.hasown@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc"
- integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==
- dependencies:
- define-properties "^1.2.1"
- es-abstract "^1.23.2"
- es-object-atoms "^1.0.0"
-
object.pick@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
@@ -9762,7 +9534,7 @@ object.pick@^1.1.1:
dependencies:
isobject "^3.0.1"
-object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0:
+object.values@^1.1.6, object.values@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
@@ -10046,10 +9818,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
-picocolors@^1.0.0, picocolors@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
- integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+picocolors@^1.0.0, picocolors@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
@@ -10148,7 +9920,7 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@^2.4.1:
+prettier@2.8.8:
version "2.8.8"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@@ -10211,7 +9983,7 @@ promise@^8.3.0:
dependencies:
asap "~2.0.6"
-prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2:
+prompts@^2.0.1, prompts@^2.4.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
@@ -10234,9 +10006,11 @@ proxy-from-env@^1.1.0:
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
psl@^1.1.28:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
- integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.13.0.tgz#8b2357f13ef3cf546af3f52de00543a94da86cfa"
+ integrity sha512-BFwmFXiJoFqlUpZ5Qssolv15DMyc84gTBds1BjsV1BfXEo1UyyD7GsmN67n7J77uRhoSNW1AXtXKPLcBFQn9Aw==
+ dependencies:
+ punycode "^2.3.1"
public-encrypt@^4.0.0:
version "4.0.3"
@@ -10251,9 +10025,9 @@ public-encrypt@^4.0.0:
safe-buffer "^5.1.2"
pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
@@ -10263,7 +10037,7 @@ punycode@1.2.4:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.2.4.tgz#54008ac972aec74175def9cba6df7fa9d3918740"
integrity sha512-h/vscxLPvI2l7k/0dFUKZ5I5TgMCJ/Pl+J6rw77PDuQM6UApf/GaRVkjv/YSm2k+fbp7Yw8dxsoe29DolT7h7w==
-punycode@^2.1.0, punycode@^2.1.1:
+punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
@@ -10283,9 +10057,9 @@ qrcode@^1.5.1:
yargs "^15.3.1"
qs@^6.1.0, qs@^6.3.0:
- version "6.12.3"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.3.tgz#e43ce03c8521b9c7fd7f1f13e514e5ca37727754"
- integrity sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==
+ version "6.13.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e"
+ integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==
dependencies:
side-channel "^1.0.6"
@@ -10304,11 +10078,6 @@ query-string@^7.1.3:
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
-querystring@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd"
- integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==
-
querystringify@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
@@ -10364,10 +10133,10 @@ react-devtools-core@^4.27.2:
shell-quote "^1.6.1"
ws "^7"
-react-devtools-core@^5.0.0:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.3.1.tgz#d57f5b8f74f16e622bd6a7bc270161e4ba162666"
- integrity sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==
+react-devtools-core@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.3.2.tgz#d5df92f8ef2a587986d094ef2c47d84cf4ae46ec"
+ integrity sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==
dependencies:
shell-quote "^1.6.1"
ws "^7"
@@ -10377,7 +10146,7 @@ react-freeze@^1.0.0:
resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.4.tgz#cbbea2762b0368b05cbe407ddc9d518c57c6f3ad"
integrity sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==
-"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0:
+"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.3.0:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
@@ -10426,7 +10195,7 @@ react-native-camera@4.2.1:
dependencies:
prop-types "^15.6.2"
-react-native-codegen@^0.70.7:
+react-native-codegen@0.70.7:
version "0.70.7"
resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.70.7.tgz#8f6b47a88740ae703209d57b7605538d86dacfa6"
integrity sha512-qXE8Jrhc9BmxDAnCmrHFDLJrzgjsE/mH57dtC4IO7K76AwagdXNCMRp5SA8XdHJzvvHWRaghpiFHEMl9TtOBcQ==
@@ -10441,7 +10210,7 @@ react-native-config@1.4.6:
resolved "https://registry.yarnpkg.com/react-native-config/-/react-native-config-1.4.6.tgz#2aefebf4d9cf02831e64bbc1307596bd212f6d42"
integrity sha512-cSLdOfva2IPCxh6HjHN1IDVW9ratAvNnnAUx6ar2Byvr8KQU7++ysdFYPaoNVuJURuYoAKgvjab8ZcnwGZIO6Q==
-react-native-contacts@^7.0.8:
+react-native-contacts@7.0.8:
version "7.0.8"
resolved "https://registry.yarnpkg.com/react-native-contacts/-/react-native-contacts-7.0.8.tgz#485ba7a77653b30205c76f96494808d07b8e57b9"
integrity sha512-Zfkdpw1uQVRb8v1m+ogknzjyfEs9k63o2sPAYvxZ8ZJff31D45G8+uZb6VcM4tIe3ELH9EDvh93nd515kFvRYQ==
@@ -10500,7 +10269,7 @@ react-native-get-random-values@1.8.0:
dependencies:
fast-base64-decode "^1.0.0"
-react-native-gifted-charts@^1.4.7:
+react-native-gifted-charts@1.4.15:
version "1.4.15"
resolved "https://registry.yarnpkg.com/react-native-gifted-charts/-/react-native-gifted-charts-1.4.15.tgz#9739be5572a052814c20d408c33e17105d0fe0ec"
integrity sha512-7hzky6xOS1s8hWHnGTBTg4ZRLkz9u2/eR3XJkf6BowBSCuFWB96/iPeA9te+RjhjnZ+cp4qoEs20ormki7l/Cw==
@@ -10535,7 +10304,7 @@ react-native-keychain@8.1.2:
resolved "https://registry.yarnpkg.com/react-native-keychain/-/react-native-keychain-8.1.2.tgz#34291ae472878e5124d081211af5ede7d810e64f"
integrity sha512-bhHEui+yMp3Us41NMoRGtnWEJiBE0g8tw5VFpq4mpmXAx6XJYahuM6K3WN5CsUeUl83hYysSL9oFZNKSTPSvYw==
-react-native-linear-gradient@^2.8.3:
+react-native-linear-gradient@2.8.3:
version "2.8.3"
resolved "https://registry.yarnpkg.com/react-native-linear-gradient/-/react-native-linear-gradient-2.8.3.tgz#9a116649f86d74747304ee13db325e20b21e564f"
integrity sha512-KflAXZcEg54PXkLyflaSZQ3PJp4uC4whM7nT/Uot9m0e/qxFV3p6uor1983D1YOBJbJN7rrWdqIjq0T42jOJyA==
@@ -10612,7 +10381,7 @@ react-native-responsive-screen@1.4.2:
resolved "https://registry.yarnpkg.com/react-native-responsive-screen/-/react-native-responsive-screen-1.4.2.tgz#45280826d24f9accbfdf46a36cb8e6d780f76f28"
integrity sha512-BLYz0UUpeohrib7jbz6wDmtBD5OmiuMRko4IT8kIF63taXPod/c5iZgmWnr5qOnK8hMuKiGMvsM3sC+eHX/lEQ==
-react-native-rsa-native@^2.0.5:
+react-native-rsa-native@2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/react-native-rsa-native/-/react-native-rsa-native-2.0.5.tgz#7db4aef49405bb5b5bcaea12b9dfd1b251c690ab"
integrity sha512-gwwvFSwGW5WKrpDyBQ/eTf1UrVABeAvMcT4YWemzPSUo6aHZs1kbBm2rXmwN5okhUzJsry5zjjz/qdx5GXRugQ==
@@ -10647,10 +10416,10 @@ react-native-share@9.2.3:
resolved "https://registry.yarnpkg.com/react-native-share/-/react-native-share-9.2.3.tgz#14eb07cb1ee503421df0e9a80fdbf3fb0180223b"
integrity sha512-y6ju4HS6ydJoPVoacZ/Hp3i47AfI9W4e76Jv00r01dVbr6SCCcuqk37kIbn+kYivdTxOW77UGEbhtBHHtXnhzg==
-react-native-svg-transformer@^1.1.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/react-native-svg-transformer/-/react-native-svg-transformer-1.4.0.tgz#d17502d3659cfe58780ca28cb13b353cb68bbd76"
- integrity sha512-ZJ9dpSl8EONXbFQcVoGVr0cAl/7Vm/sKtOH1V6Mf9lcdyeT1/rfww43xgSfQWjmneTNTTXjslM5EoyZTHPfawQ==
+react-native-svg-transformer@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/react-native-svg-transformer/-/react-native-svg-transformer-1.5.0.tgz#75ae4dbdc4b1a1508e75282d54d66900ee5fe3c2"
+ integrity sha512-RG5fSWJT7mjCQYocgYFUo1KYPLOoypPVG5LQab+pZZO7m4ciGaQIe0mhok3W4R5jLQsEXKo0u+aQGkZV/bZG7w==
dependencies:
"@svgr/core" "^8.1.0"
"@svgr/plugin-jsx" "^8.1.0"
@@ -10729,46 +10498,47 @@ react-native@0.72.4:
yargs "^17.6.2"
react-native@>=0.68:
- version "0.74.3"
- resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.3.tgz#eef32cd10afb1f4b26f75b79eefd6b220c63953c"
- integrity sha512-UFutCC6WEw6HkxlcpQ2BemKqi0JkwrgDchYB5Svi8Sp4Xwt4HA6LGEjNQgZ+3KM44bjyFRpofQym0uh0jACGng==
+ version "0.76.3"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.76.3.tgz#18b79949c58932e9fd8d04b205e5c0a46bc46d8f"
+ integrity sha512-0TUhgmlouRNf6yuDIIAdbQl0g1VsONgCMsLs7Et64hjj5VLMCA7np+4dMrZvGZ3wRNqzgeyT9oWJsUm49AcwSQ==
dependencies:
"@jest/create-cache-key-function" "^29.6.3"
- "@react-native-community/cli" "13.6.9"
- "@react-native-community/cli-platform-android" "13.6.9"
- "@react-native-community/cli-platform-ios" "13.6.9"
- "@react-native/assets-registry" "0.74.85"
- "@react-native/codegen" "0.74.85"
- "@react-native/community-cli-plugin" "0.74.85"
- "@react-native/gradle-plugin" "0.74.85"
- "@react-native/js-polyfills" "0.74.85"
- "@react-native/normalize-colors" "0.74.85"
- "@react-native/virtualized-lists" "0.74.85"
+ "@react-native/assets-registry" "0.76.3"
+ "@react-native/codegen" "0.76.3"
+ "@react-native/community-cli-plugin" "0.76.3"
+ "@react-native/gradle-plugin" "0.76.3"
+ "@react-native/js-polyfills" "0.76.3"
+ "@react-native/normalize-colors" "0.76.3"
+ "@react-native/virtualized-lists" "0.76.3"
abort-controller "^3.0.0"
anser "^1.4.9"
ansi-regex "^5.0.0"
+ babel-jest "^29.7.0"
+ babel-plugin-syntax-hermes-parser "^0.23.1"
base64-js "^1.5.1"
chalk "^4.0.0"
+ commander "^12.0.0"
event-target-shim "^5.0.1"
flow-enums-runtime "^0.0.6"
+ glob "^7.1.1"
invariant "^2.2.4"
jest-environment-node "^29.6.3"
jsc-android "^250231.0.0"
memoize-one "^5.0.0"
- metro-runtime "^0.80.3"
- metro-source-map "^0.80.3"
+ metro-runtime "^0.81.0"
+ metro-source-map "^0.81.0"
mkdirp "^0.5.1"
nullthrows "^1.1.1"
- pretty-format "^26.5.2"
+ pretty-format "^29.7.0"
promise "^8.3.0"
- react-devtools-core "^5.0.0"
+ react-devtools-core "^5.3.1"
react-refresh "^0.14.0"
- react-shallow-renderer "^16.15.0"
regenerator-runtime "^0.13.2"
scheduler "0.24.0-canary-efb381bbf-20230505"
+ semver "^7.1.3"
stacktrace-parser "^0.1.10"
whatwg-fetch "^3.0.0"
- ws "^6.2.2"
+ ws "^6.2.3"
yargs "^17.6.2"
react-redux@7.2.8:
@@ -10801,14 +10571,14 @@ react-shallow-renderer@^16.15.0:
object-assign "^4.1.1"
react-is "^16.12.0 || ^17.0.0 || ^18.0.0"
-react-test-renderer@18.2.0:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e"
- integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==
+react-test-renderer@18.3.0:
+ version "18.3.0"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.0.tgz#579dec2312b9841f7a0cafc1dfbdfdc582be0ea4"
+ integrity sha512-eFnJU8sSYq9I6VI8ISrXDm+7F0igeFlTc0Ngq2XCkVasR5AsyJRg8SuwcD9D5E+VvDS2NrYGZ+gKpO43/wIDHw==
dependencies:
- react-is "^18.2.0"
+ react-is "^18.3.0"
react-shallow-renderer "^16.15.0"
- scheduler "^0.23.0"
+ scheduler "^0.23.1"
react@18.2.0:
version "18.2.0"
@@ -10907,10 +10677,10 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
-redux-mock-store@^1.5.4:
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872"
- integrity sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==
+redux-mock-store@1.5.5:
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.5.tgz#ec3676663c081c4ca5a6a14f1ac193b56c3220eb"
+ integrity sha512-YxX+ofKUTQkZE4HbhYG4kKGr7oCTJfB0GLy7bSeqx86GLpGirrbUWstMnqXkqHNaQpcnbMGbof2dYs5KsPE6Zg==
dependencies:
lodash.isplainobject "^4.0.6"
@@ -10945,23 +10715,23 @@ redux@^4.0.0, redux@^4.1.2:
dependencies:
"@babel/runtime" "^7.9.2"
-reflect.getprototypeof@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
- integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==
+reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5"
+ integrity sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==
dependencies:
call-bind "^1.0.7"
define-properties "^1.2.1"
- es-abstract "^1.23.1"
+ es-abstract "^1.23.5"
es-errors "^1.3.0"
get-intrinsic "^1.2.4"
- globalthis "^1.0.3"
- which-builtin-type "^1.1.3"
+ gopd "^1.0.1"
+ which-builtin-type "^1.1.4"
-regenerate-unicode-properties@^10.1.0:
- version "10.1.1"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480"
- integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==
+regenerate-unicode-properties@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0"
+ integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==
dependencies:
regenerate "^1.4.2"
@@ -10987,34 +10757,39 @@ regenerator-transform@^0.15.2:
dependencies:
"@babel/runtime" "^7.8.4"
-regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
- integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2, regexp.prototype.flags@^1.5.3:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
dependencies:
- call-bind "^1.0.6"
+ call-bind "^1.0.7"
define-properties "^1.2.1"
es-errors "^1.3.0"
- set-function-name "^2.0.1"
+ set-function-name "^2.0.2"
-regexpu-core@^5.3.1:
- version "5.3.2"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b"
- integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==
+regexpu-core@^6.1.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826"
+ integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==
dependencies:
- "@babel/regjsgen" "^0.8.0"
regenerate "^1.4.2"
- regenerate-unicode-properties "^10.1.0"
- regjsparser "^0.9.1"
+ regenerate-unicode-properties "^10.2.0"
+ regjsgen "^0.8.0"
+ regjsparser "^0.12.0"
unicode-match-property-ecmascript "^2.0.0"
unicode-match-property-value-ecmascript "^2.1.0"
-regjsparser@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
- integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+regjsgen@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab"
+ integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==
+
+regjsparser@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc"
+ integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==
dependencies:
- jsesc "~0.5.0"
+ jsesc "~3.0.2"
request@^2.88.0:
version "2.88.2"
@@ -11167,7 +10942,7 @@ ripemd160@2.0.2, ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
-"rn-nodeify@github:tradle/rn-nodeify":
+"rn-nodeify@github:tradle/rn-nodeify#338d8d6ba8438403093e9409e9a9d88ad884926f":
version "10.3.0"
resolved "https://codeload.github.com/tradle/rn-nodeify/tar.gz/338d8d6ba8438403093e9409e9a9d88ad884926f"
dependencies:
@@ -11198,16 +10973,16 @@ safe-array-concat@^1.1.2:
has-symbols "^1.0.3"
isarray "^2.0.5"
-safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
safe-regex-test@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
@@ -11234,7 +11009,7 @@ scheduler@0.24.0-canary-efb381bbf-20230505:
dependencies:
loose-envify "^1.1.0"
-scheduler@^0.23.0:
+scheduler@^0.23.1:
version "0.23.2"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
@@ -11251,16 +11026,16 @@ secp256k1@4.0.3:
node-gyp-build "^4.2.0"
secp256k1@^3.0.1:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d"
- integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.1.tgz#b62a62a882d6b16f9b51fe599c6b3a861e36c59f"
+ integrity sha512-tArjQw2P0RTdY7QmkNehgp6TVvQXq6ulIhxv8gaH6YubKG/wxxAoNKcbuXjDhybbc+b2Ihc7e0xxiGN744UIiQ==
dependencies:
bindings "^1.5.0"
bip66 "^1.1.5"
bn.js "^4.11.8"
create-hash "^1.2.0"
drbg.js "^1.0.1"
- elliptic "^6.5.2"
+ elliptic "^6.5.7"
nan "^2.14.0"
safe-buffer "^5.1.2"
@@ -11289,15 +11064,15 @@ semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4:
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
- integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+semver@^7.1.3, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
-send@0.18.0:
- version "0.18.0"
- resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
- integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
dependencies:
debug "2.6.9"
depd "2.0.0"
@@ -11319,14 +11094,14 @@ serialize-error@^2.1.0:
integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==
serve-static@^1.13.1:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
- integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
dependencies:
- encodeurl "~1.0.2"
+ encodeurl "~2.0.0"
escape-html "~1.0.3"
parseurl "~1.3.3"
- send "0.18.0"
+ send "0.19.0"
set-blocking@^2.0.0:
version "2.0.0"
@@ -11451,13 +11226,6 @@ simple-plist@^1.1.0:
bplist-parser "0.3.1"
plist "^3.0.5"
-simple-swizzle@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
- integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
- dependencies:
- is-arrayish "^0.3.1"
-
sisteransi@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@@ -11527,9 +11295,9 @@ socket.io-parser@~4.2.1:
debug "~4.3.1"
source-map-js@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
- integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
source-map-support@0.5.13:
version "0.5.13"
@@ -11621,13 +11389,6 @@ statuses@~1.5.0:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
-stop-iteration-iterator@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
- integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
- dependencies:
- internal-slot "^1.0.4"
-
stream-browserify@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-1.0.0.tgz#bf9b4abfb42b274d751479e44e0ff2656b6f1193"
@@ -11694,13 +11455,14 @@ string-width@^5.0.0, string-width@^5.0.1:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
-string.prototype.includes@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f"
- integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==
+string.prototype.includes@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92"
+ integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==
dependencies:
- define-properties "^1.1.3"
- es-abstract "^1.17.5"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.3"
string.prototype.matchall@^4.0.11:
version "4.0.11"
@@ -11720,6 +11482,14 @@ string.prototype.matchall@^4.0.11:
set-function-name "^2.0.2"
side-channel "^1.0.6"
+string.prototype.repeat@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a"
+ integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
string.prototype.trim@^1.2.9:
version "1.2.9"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
@@ -11934,11 +11704,6 @@ tar@^6.0.1:
mkdirp "^1.0.3"
yallist "^4.0.0"
-temp-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
- integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
-
temp@^0.8.4:
version "0.8.4"
resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
@@ -11947,9 +11712,9 @@ temp@^0.8.4:
rimraf "~2.6.2"
terser@^5.15.0:
- version "5.31.1"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4"
- integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==
+ version "5.36.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e"
+ integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -12022,11 +11787,6 @@ tmpl@1.0.5:
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
-
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -12062,16 +11822,16 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
+tslib@2, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.8.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.0.1, tslib@^2.0.3, tslib@^2.4.0:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
- integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
-
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@@ -12144,9 +11904,9 @@ typed-array-byte-length@^1.0.1:
is-typed-array "^1.1.13"
typed-array-byte-offset@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
- integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2"
+ integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==
dependencies:
available-typed-arrays "^1.0.7"
call-bind "^1.0.7"
@@ -12154,18 +11914,19 @@ typed-array-byte-offset@^1.0.2:
gopd "^1.0.1"
has-proto "^1.0.3"
is-typed-array "^1.1.13"
+ reflect.getprototypeof "^1.0.6"
typed-array-length@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
- integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d"
+ integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
dependencies:
call-bind "^1.0.7"
for-each "^0.3.3"
gopd "^1.0.1"
- has-proto "^1.0.3"
is-typed-array "^1.1.13"
possible-typed-array-names "^1.0.0"
+ reflect.getprototypeof "^1.0.6"
typedarray@^0.0.6:
version "0.0.6"
@@ -12229,15 +11990,15 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+undici-types@~6.19.8:
+ version "6.19.8"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
unicode-canonical-property-names-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
- integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2"
+ integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==
unicode-match-property-ecmascript@^2.0.0:
version "2.0.0"
@@ -12248,9 +12009,9 @@ unicode-match-property-ecmascript@^2.0.0:
unicode-property-aliases-ecmascript "^2.0.0"
unicode-match-property-value-ecmascript@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0"
- integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71"
+ integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==
unicode-property-aliases-ecmascript@^2.0.0:
version "2.1.0"
@@ -12267,13 +12028,13 @@ unpipe@~1.0.0:
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
-update-browserslist-db@^1.0.16:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
- integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+update-browserslist-db@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
dependencies:
- escalade "^3.1.2"
- picocolors "^1.0.1"
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
uri-js@^4.2.2:
version "4.4.1"
@@ -12297,10 +12058,10 @@ url@0.10.1:
dependencies:
punycode "1.2.4"
-use-latest-callback@^0.1.9:
- version "0.1.11"
- resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.11.tgz#e073fcbba792cc95ac661d96bc13b6041956cfe1"
- integrity sha512-8nhb73STSD/z3GTHklvNjL8F9wMOo0bj0AFnulpIYuFTm6aQlT3ZcNbXF2YurKImIY8+kpSFSDHZZyQmurGrhw==
+use-latest-callback@^0.2.1:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.3.tgz#2d644d3063040b9bc2d4c55bb525a13ae3de9e16"
+ integrity sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ==
use-sync-external-store@^1.0.0, use-sync-external-store@^1.2.0:
version "1.2.2"
@@ -12436,25 +12197,26 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
-which-builtin-type@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b"
- integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+which-builtin-type@^1.1.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c"
+ integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==
dependencies:
- function.prototype.name "^1.1.5"
- has-tostringtag "^1.0.0"
+ call-bind "^1.0.7"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
is-async-function "^2.0.0"
is-date-object "^1.0.5"
- is-finalizationregistry "^1.0.2"
+ is-finalizationregistry "^1.1.0"
is-generator-function "^1.0.10"
is-regex "^1.1.4"
is-weakref "^1.0.2"
isarray "^2.0.5"
which-boxed-primitive "^1.0.2"
- which-collection "^1.0.1"
- which-typed-array "^1.1.9"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.15"
-which-collection@^1.0.1:
+which-collection@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
@@ -12469,7 +12231,7 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
-which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2, which-typed-array@^1.1.9:
+which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2:
version "1.1.15"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
@@ -12555,14 +12317,14 @@ write-file-atomic@^4.0.2:
imurmurhash "^0.1.4"
signal-exit "^3.0.7"
-ws@^6.2.2:
+ws@^6.2.2, ws@^6.2.3:
version "6.2.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee"
integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==
dependencies:
async-limiter "~1.0.0"
-ws@^7, ws@^7.5.1:
+ws@^7, ws@^7.5.1, ws@^7.5.10:
version "7.5.10"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
@@ -12647,9 +12409,9 @@ yaml@2.3.1:
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
yaml@^2.2.1:
- version "2.4.5"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e"
- integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773"
+ integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==
yargs-parser@^18.1.2:
version "18.1.3"