diff --git a/app.json b/app.json index 1ae8a1af..31b239c2 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,7 @@ { - "name": "HeliumWallet", - "displayName": "Helium Wallet", + "displayName": "Helium", "expo": { "scheme": "heliumwallet" - } + }, + "name": "HeliumWallet" } diff --git a/ios/HeliumWallet.xcodeproj/project.pbxproj b/ios/HeliumWallet.xcodeproj/project.pbxproj index af603e37..bebc6c8a 100644 --- a/ios/HeliumWallet.xcodeproj/project.pbxproj +++ b/ios/HeliumWallet.xcodeproj/project.pbxproj @@ -1080,6 +1080,7 @@ ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; INFOPLIST_FILE = HeliumWallet/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Helium; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1118,6 +1119,7 @@ DEVELOPMENT_TEAM = PVM9KJZ2AD; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; INFOPLIST_FILE = HeliumWallet/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Helium; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/ios/HeliumWallet/Info.plist b/ios/HeliumWallet/Info.plist index 7d8cce33..d07b6061 100644 --- a/ios/HeliumWallet/Info.plist +++ b/ios/HeliumWallet/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Helium Wallet + Helium CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 36205d10..4fb46583 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1107,27 +1107,8 @@ PODS: - react-native-onesignal (5.2.2): - OneSignalXCFramework (= 5.2.2) - React (< 1.0.0, >= 0.13.0) - - react-native-pager-view (6.3.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Codegen + - react-native-pager-view (6.1.2): - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - react-native-randombytes (3.6.1): - React-Core - react-native-safe-area-context (4.10.8): @@ -1440,7 +1421,7 @@ PODS: - React-utils (= 0.74.5) - RNBootSplash (6.3.2): - React-Core - - RNCAsyncStorage (1.23.1): + - RNCAsyncStorage (1.18.1): - React-Core - RNCCheckbox (0.5.17): - BEMCheckBox (~> 1.4) @@ -1495,20 +1476,20 @@ PODS: - React - RNLocalize (2.2.3): - React-Core - - rnmapbox-maps (10.1.33): + - rnmapbox-maps (10.1.31): - MapboxMaps (= 11.8.0) - React - React-Core - - rnmapbox-maps/DynamicLibrary (= 10.1.33) + - rnmapbox-maps/DynamicLibrary (= 10.1.31) - Turf - - rnmapbox-maps/DynamicLibrary (10.1.33): + - rnmapbox-maps/DynamicLibrary (10.1.31): - MapboxMaps (= 11.8.0) - React - React-Core - Turf - RNOS (1.2.6): - React - - RNPermissions (3.9.2): + - RNPermissions (3.9.0): - React-Core - RNReactNativeSharedGroupPreferences (1.1.24): - React @@ -1568,6 +1549,12 @@ PODS: - React - Toast (4.0.0) - Turf (3.0.0) + - VisionCamera (4.5.3): + - VisionCamera/Core (= 4.5.3) + - VisionCamera/React (= 4.5.3) + - VisionCamera/Core (4.5.3) + - VisionCamera/React (4.5.3): + - React-Core - Yoga (0.0.0) - ZXingObjC/Core (3.6.9) - ZXingObjC/OneD (3.6.9): @@ -1691,6 +1678,7 @@ DEPENDENCIES: - RNSVG (from `../node_modules/react-native-svg`) - RNTestFlight (from `../node_modules/react-native-test-flight`) - TcpSockets (from `../node_modules/react-native-tcp`) + - VisionCamera (from `../node_modules/react-native-vision-camera`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -1934,6 +1922,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-test-flight" TcpSockets: :path: "../node_modules/react-native-tcp" + VisionCamera: + :path: "../node_modules/react-native-vision-camera" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -2005,7 +1995,7 @@ SPEC CHECKSUMS: react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983 react-native-network-info: d1290ffc0bd0709e11436f5b8d7f605dcc5c4530 react-native-onesignal: 592184d34780d04ebbea2b9844d5b6088606cb30 - react-native-pager-view: c1e29e1a6105a02807392ba822ad322447a72f55 + react-native-pager-view: 54bed894cecebe28cede54c01038d9d1e122de43 react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846 react-native-safe-area-context: b7daa1a8df36095a032dff095a1ea8963cb48371 react-native-simple-toast: 8ee5d23f0b92b935ab7434cdb65159ce12dfb4b7 @@ -2039,7 +2029,7 @@ SPEC CHECKSUMS: React-utils: f242eb7e7889419d979ca0e1c02ccc0ea6e43b29 ReactCommon: f7da14a8827b72704169a48c929bcde802698361 RNBootSplash: 3a44c2c3ebfce98254de887ceed22c4941c8c6c5 - RNCAsyncStorage: 826b603ae9c0f88b5ac4e956801f755109fa4d5c + RNCAsyncStorage: b90b71f45b8b97be43bc4284e71a6af48ac9f547 RNCCheckbox: a3ca9978cb0846b981d28da4e9914bd437403d77 RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 RNCMaskedView: da52ec927af4b4c3f3f6b5b5e816a69be62fe642 @@ -2047,9 +2037,9 @@ SPEC CHECKSUMS: RNGestureHandler: efed690b8493a00b99654043daeb1335276ac4a2 RNICloudStore: bc6e225811637c09bd1eb055d6cd7448e61cd451 RNLocalize: a64514b46a01375fdfae9349036b4dc7130333b5 - rnmapbox-maps: e215d3fe420ef53090d65ecdda5cf8bf4af19c66 + rnmapbox-maps: bf7989fd36420aabdd12960095a3f84ec298071f RNOS: 6f2f9a70895bbbfbdad7196abd952e7b01d45027 - RNPermissions: 2af759cf053542b2b4b3c4cf9f43874796106f2c + RNPermissions: 1d1a8318f659ffd609dd7f81de8a7ecabfb52f10 RNReactNativeSharedGroupPreferences: 29092869fc2e40d5baca5e15d82fa5c24a668977 RNReanimated: f4ff116e33e0afc3d127f70efe928847c7c66355 RNScreens: aa943ad421c3ced3ef5a47ede02b0cbfc43a012e @@ -2062,9 +2052,10 @@ SPEC CHECKSUMS: TcpSockets: 14306fb79f9750ea7d2ddd02d8bed182abb01797 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 Turf: a1604e74adce15c58462c9ae2acdbf049d5be35e - Yoga: 2246eea72aaf1b816a68a35e6e4b74563653ae09 + VisionCamera: cb84d0d8485b3e67c91b62931d3aa88f49747c92 + Yoga: 950bbfd7e6f04790fdb51149ed51df41f329fcc8 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 PODFILE CHECKSUM: 51a354c5ff94b58e8c8bd1903d2326a93a17b4d0 -COCOAPODS: 1.16.2 +COCOAPODS: 1.16.1 diff --git a/package.json b/package.json index 9a97c86a..cb5e2cdd 100644 --- a/package.json +++ b/package.json @@ -29,62 +29,62 @@ "packageManager": "yarn@3.6.4", "dependencies": { "@babel/preset-typescript": "7.21.0", - "@bonfida/spl-name-service": "^1.1.1", - "@coral-xyz/anchor": "^0.28.0", + "@bonfida/spl-name-service": "1.1.1", + "@coral-xyz/anchor": "0.28.0", "@gorhom/bottom-sheet": "5.0.4", "@gorhom/portal": "1.0.14", - "@graphql-codegen/cli": "^5.0.0", - "@graphql-codegen/typescript": "^4.0.1", - "@graphql-codegen/typescript-operations": "^4.0.1", - "@graphql-codegen/typescript-rtk-query": "^3.1.1", - "@helium/account-fetch-cache": "0.9.18", - "@helium/account-fetch-cache-hooks": "0.9.18", + "@graphql-codegen/cli": "5.0.0", + "@graphql-codegen/typescript": "4.0.1", + "@graphql-codegen/typescript-operations": "4.0.1", + "@graphql-codegen/typescript-rtk-query": "3.1.1", + "@helium/account-fetch-cache": "0.9.14", + "@helium/account-fetch-cache-hooks": "0.9.14", "@helium/address": "4.10.2", - "@helium/circuit-breaker-sdk": "^0.9.18", + "@helium/circuit-breaker-sdk": "0.9.14", "@helium/crypto-react-native": "4.8.0", - "@helium/currency-utils": "^0.9.18", - "@helium/data-credits-sdk": "^0.9.18", - "@helium/distributor-oracle": "0.9.18", - "@helium/fanout-sdk": "^0.9.18", - "@helium/helium-entity-manager-sdk": "^0.9.18", - "@helium/helium-react-hooks": "0.9.18", - "@helium/helium-sub-daos-sdk": "^0.9.18", + "@helium/currency-utils": "0.9.14", + "@helium/data-credits-sdk": "0.9.14", + "@helium/distributor-oracle": "0.9.14", + "@helium/fanout-sdk": "0.9.14", + "@helium/helium-entity-manager-sdk": "0.9.14", + "@helium/helium-react-hooks": "0.9.14", + "@helium/helium-sub-daos-sdk": "0.9.14", "@helium/http": "4.7.5", - "@helium/idls": "0.9.18", - "@helium/lazy-distributor-sdk": "^0.9.18", - "@helium/modular-governance-hooks": "^0.0.13", + "@helium/idls": "0.9.14", + "@helium/lazy-distributor-sdk": "0.9.14", + "@helium/modular-governance-hooks": "0.0.13", "@helium/modular-governance-idls": "0.0.13", "@helium/onboarding": "4.11.0", - "@helium/organization-sdk": "^0.0.13", + "@helium/organization-sdk": "0.0.13", "@helium/proto-ble": "4.0.0", "@helium/react-native-sdk": "3.0.5", - "@helium/spl-utils": "0.9.18", - "@helium/state-controller-sdk": "^0.0.13", - "@helium/sus": "0.9.18", + "@helium/spl-utils": "0.9.14", + "@helium/state-controller-sdk": "0.0.13", + "@helium/sus": "0.9.14", "@helium/transactions": "4.8.1", - "@helium/treasury-management-sdk": "^0.9.18", - "@helium/voter-stake-registry-hooks": "0.9.18", - "@helium/voter-stake-registry-sdk": "0.9.18", + "@helium/treasury-management-sdk": "0.9.14", + "@helium/voter-stake-registry-hooks": "0.9.14", + "@helium/voter-stake-registry-sdk": "0.9.14", "@helium/wallet-link": "4.11.0", - "@jup-ag/api": "^6.0.6", - "@keystonehq/keystone-sdk": "^0.8.0", + "@jup-ag/api": "6.0.6", + "@keystonehq/keystone-sdk": "0.8.0", "@ledgerhq/hw-app-solana": "7.2.4", "@ledgerhq/react-native-hid": "6.32.4", "@ledgerhq/react-native-hw-transport-ble": "6.29.4", - "@ledgerhq/types-devices": "^6.25.3", - "@metaplex-foundation/js": "^0.19.5", + "@ledgerhq/types-devices": "6.25.3", + "@metaplex-foundation/js": "0.19.5", "@metaplex-foundation/mpl-bubblegum": "0.6.0", "@metaplex-foundation/mpl-token-metadata": "2.10.0", - "@ngraveio/bc-ur": "^1.1.13", + "@ngraveio/bc-ur": "1.1.13", "@novalabsxyz/mobile-theme": "2.0.0-y.26", - "@onsol/tldparser": "^0.5.3", - "@react-native-async-storage/async-storage": "1.23.1", + "@onsol/tldparser": "0.5.3", + "@react-native-async-storage/async-storage": "1.18.1", "@react-native-community/blur": "4.3.0", "@react-native-community/checkbox": "0.5.17", "@react-native-community/clipboard": "1.5.1", "@react-native-community/hooks": "2.8.1", "@react-native-community/netinfo": "9.3.7", - "@react-native-community/slider": "^4.5.2", + "@react-native-community/slider": "4.5.2", "@react-native-masked-view/masked-view": "0.3.2", "@react-navigation/bottom-tabs": "6.4.0", "@react-navigation/material-top-tabs": "6.5.1", @@ -92,39 +92,40 @@ "@react-navigation/native-stack": "6.7.0", "@react-navigation/stack": "6.2.2", "@reduxjs/toolkit": "1.9.1", - "@rnmapbox/maps": "10.1.33", + "@rnmapbox/maps": "10.1.31", "@shopify/react-native-skia": "1.5.10", "@shopify/restyle": "2.4.2", "@solana/spl-account-compression": "0.1.4", "@solana/spl-memo": "0.2.3", "@solana/spl-token": "0.3.6", - "@solana/spl-token-metadata": "^0.1.4", + "@solana/spl-token-metadata": "0.1.4", "@solana/wallet-adapter-react": "0.15.33", "@solana/wallet-standard-features": "1.0.0", - "@solana/web3.js": "^1.87.6", - "@tanstack/react-query": "^5.45.1", + "@solana/web3.js": "1.87.6", + "@tanstack/react-query": "5.45.1", "@tradle/react-native-http": "2.0.1", "@turf/bbox": "6.5.0", "@turf/center": "6.5.0", "@turf/helpers": "6.5.0", - "@types/base-64": "^1.0.2", + "@types/base-64": "1.0.2", "@walletconnect/react-native-compat": "2.2.1", "@walletconnect/sign-client": "2.2.1", "@walletconnect/types": "2.2.1", + "aes-js": "3.1.2", "angry-purple-tiger": "1.0.5", "assert": "1.5.0", "axios": "1.3.2", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "1.22.0", "base-64": "1.0.0", "bcrypt-react-native": "1.1.1", "bignumber.js": "9.1.1", - "bip39": "^3.1.0", + "bip39": "3.1.0", "bn.js": "5.2.1", "browserify-zlib": "0.1.4", "bs58": "5.0.0", "buffer": "6.0.3", "camelcase-keys": "7.0.2", - "compare-versions": "^6.1.0", + "compare-versions": "6.1.0", "console-browserify": "1.2.0", "constants-browserify": "1.0.0", "crypto": "1.0.1", @@ -132,7 +133,7 @@ "deprecated-react-native-prop-types": "2.3.0", "dns.js": "1.0.1", "domain-browser": "1.2.0", - "ed25519-hd-key": "^1.3.0", + "ed25519-hd-key": "1.3.0", "events": "3.3.0", "expo": "51.0.39", "expo-asset": "10.0.10", @@ -142,43 +143,44 @@ "expo-haptics": "13.0.1", "expo-linking": "6.3.1", "expo-local-authentication": "14.0.1", - "expo-location": "^17.0.1", + "expo-location": "17.0.1", "expo-secure-store": "13.0.2", "fuse.js": "6.6.2", - "geolib": "^3.3.4", + "geolib": "3.3.4", "h3-js": "4.1.0", "https-browserify": "0.0.1", "i18next": "21.9.1", "lodash": "4.17.21", "long": "5.2.0", - "lottie-ios": "^4.4.1", - "lottie-react-native": "^6.7.0", - "markdown-it": "^13.0.2", - "metro-react-native-babel-transformer": "^0.77.0", + "lottie-ios": "4.4.1", + "lottie-react-native": "6.7.0", + "markdown-it": "13.0.2", + "metro-react-native-babel-transformer": "0.77.0", "parse5": "6.0.1", - "patch-package": "^8.0.0", + "patch-package": "8.0.0", "path-browserify": "0.0.0", "punycode": "1.4.1", "qs": "6.11.0", "query-string": "7.1.1", "querystring-es3": "0.2.1", "react": "18.2.0", - "react-async-hook": "^4.0.0", - "react-error-boundary": "^4.0.13", + "react-async-hook": "4.0.0", + "react-error-boundary": "4.0.13", "react-i18next": "11.18.4", "react-native": "0.74.5", - "react-native-animated-numbers": "^0.6.2", + "react-native-animated-numbers": "0.6.2", "react-native-appstate-hook": "1.0.6", "react-native-ble-plx": "2.0.3", - "react-native-bootsplash": "^6.3.2", + "react-native-bootsplash": "6.3.2", "react-native-charts-wrapper": "0.5.10", - "react-native-compass-heading": "^1.5.0", - "react-native-confetti-cannon": "^1.5.2", + "react-native-cheerio": "1.0.0-rc.4", + "react-native-compass-heading": "1.5.0", + "react-native-confetti-cannon": "1.5.2", "react-native-config": "1.4.6", "react-native-crypto": "2.2.0", "react-native-device-info": "8.7.1", "react-native-flash-message": "0.2.1", - "react-native-geocoding": "^0.5.0", + "react-native-geocoding": "0.5.0", "react-native-gesture-handler": "2.18.1", "react-native-get-random-values": "1.11.0", "react-native-icloudstore": "0.9.0", @@ -188,14 +190,14 @@ "react-native-linear-gradient": "2.6.2", "react-native-localize": "2.2.3", "react-native-mail": "6.1.1", - "react-native-markdown-display": "^7.0.0-alpha.2", - "react-native-navigation-bar-color": "^2.0.2", + "react-native-markdown-display": "7.0.0-alpha.2", + "react-native-navigation-bar-color": "2.0.2", "react-native-network-info": "5.2.1", "react-native-onesignal": "5.2.2", - "react-native-os": "^1.2.6", - "react-native-pager-view": "6.3.0", - "react-native-permissions": "^3.9.0", - "react-native-qrcode-svg": "^6.3.2", + "react-native-os": "1.2.6", + "react-native-pager-view": "6.1.2", + "react-native-permissions": "3.9.0", + "react-native-qrcode-svg": "6.3.2", "react-native-randombytes": "3.6.1", "react-native-reanimated": "3.14.0", "react-native-safe-area-context": "4.10.8", @@ -203,17 +205,18 @@ "react-native-share": "7.9.0", "react-native-shared-group-preferences": "1.1.24", "react-native-simple-toast": "1.1.4", - "react-native-skeleton-placeholder": "^5.2.4", + "react-native-skeleton-placeholder": "5.2.4", "react-native-snap-carousel": "4.0.0-beta.6", - "react-native-sodium": "^0.4.0", + "react-native-sodium": "0.4.0", "react-native-svg": "13.4.0", "react-native-tab-view": "3.3.4", "react-native-tcp": "3.3.2", "react-native-test-flight": "1.1.0", "react-native-text-ticker": "1.14.0", "react-native-udp": "2.7.0", - "react-native-url-polyfill": "^2.0.0", + "react-native-url-polyfill": "2.0.0", "react-native-video": "5.2.1", + "react-native-vision-camera": "4.5.3", "react-native-webview": "13.10.5", "react-redux": "8.0.4", "readable-stream": "3.6.0", @@ -225,7 +228,7 @@ "stream": "0.0.2", "stream-browserify": "1.0.0", "string_decoder": "0.10.31", - "text-encoding-polyfill": "^0.6.7", + "text-encoding-polyfill": "0.6.7", "timers-browserify": "1.4.2", "tinycolor2": "1.4.2", "tty-browserify": "0.0.0", @@ -244,14 +247,14 @@ "@react-native/metro-config": "0.74.87", "@react-native/typescript-config": "0.74.87", "@types/bn.js": "5.1.1", - "@types/debounce": "^1.2.4", + "@types/debounce": "1.2.4", "@types/i18n-js": "3.8.2", "@types/lodash": "4.14.183", - "@types/mapbox__geo-viewport": "^0.5.3", - "@types/markdown-it": "^13.0.5", + "@types/mapbox__geo-viewport": "0.5.3", + "@types/markdown-it": "13.0.5", "@types/parse5": "5.0.3", "@types/qs": "6.9.7", - "@types/react": "18.2.79", + "@types/react": "18.2.6", "@types/react-native": "0.70.6", "@types/react-native-charts-wrapper": "0.5.2", "@types/react-native-shared-group-preferences": "1.1.1", @@ -262,7 +265,7 @@ "@types/tinycolor2": "1.4.3", "@typescript-eslint/eslint-plugin": "5.59.2", "@typescript-eslint/parser": "5.59.2", - "babel-jest": "^29.6.3", + "babel-jest": "29.6.3", "babel-plugin-module-resolver": "4.1.0", "babel-plugin-transform-remove-console": "6.9.4", "eslint": "7.32.0", @@ -276,10 +279,10 @@ "eslint-plugin-react": "7.30.1", "eslint-plugin-react-hooks": "4.6.0", "husky": "7.0.4", - "jest": "^29.6.3", + "jest": "29.6.3", "jetifier": "1.6.8", "prettier": "2.8.8", - "react-native-clean-project": "^4.0.3", + "react-native-clean-project": "4.0.3", "react-native-cli-bump-version": "1.5.0", "react-native-codegen": "0.0.7", "react-native-svg-transformer": "0.14.3", @@ -293,12 +296,12 @@ "@types/react": "18", "react": "18.2.0", "@solana/wallet-adapter-react": "0.15.33", - "@helium/account-fetch-cache": "^0.9.18", - "@helium/account-fetch-cache-hooks": "^0.9.18", - "@helium/helium-react-hooks": "^0.9.18", - "@helium/voter-stake-registry-hooks": "^0.9.18", - "@helium/voter-stake-registry-sdk": "^0.9.18", - "@helium/modular-governance-hooks": "^0.0.13", + "@helium/account-fetch-cache": "0.9.14", + "@helium/account-fetch-cache-hooks": "0.9.14", + "@helium/helium-react-hooks": "0.9.14", + "@helium/voter-stake-registry-hooks": "0.9.14", + "@helium/voter-stake-registry-sdk": "0.9.14", + "@helium/modular-governance-hooks": "0.0.13", "@helium/onboarding": "4.11.0" }, "react-native": { diff --git a/src/app/RootNavigator.tsx b/src/app/RootNavigator.tsx index ebc05978..0b3e977b 100644 --- a/src/app/RootNavigator.tsx +++ b/src/app/RootNavigator.tsx @@ -16,6 +16,12 @@ import PaymentScreen from '@features/payment/PaymentScreen' import LinkWallet from '@features/txnDelegation/LinkWallet' import SignHotspot from '@features/txnDelegation/SignHotspot' import { useNavigation } from '@react-navigation/native' +import SignTransaction from '@features/provider-methods/SignTransaction' +import SignMessage from '@features/provider-methods/SignMessage' +import Connect from '@features/provider-methods/Connect' +import Disconnect from '@features/provider-methods/Disconnect' +import SignAndSendTransaction from '@features/provider-methods/SignAndSendTransaction' +import SignAllTransactions from '@features/provider-methods/SignAllTransactions' import { RootNavigationProp, RootStackParamList } from './rootTypes' const screenOptions = { headerShown: false } as StackNavigationOptions @@ -103,6 +109,36 @@ const RootNavigator = () => { component={ScanQrCodeScreen} options={screenOptions} /> + + + + + + ) } diff --git a/src/app/rootTypes.ts b/src/app/rootTypes.ts index 95b14544..7e18896e 100644 --- a/src/app/rootTypes.ts +++ b/src/app/rootTypes.ts @@ -2,6 +2,14 @@ import { LinkWalletRequest, SignHotspotRequest } from '@helium/wallet-link' import { StackNavigationProp } from '@react-navigation/stack' import { KeystoneAccountType } from 'src/features/keystone/SelectKeystoneAccountsScreen' import { PaymentRouteParam } from 'src/app/services/WalletService' +import { + SignAllTransactionsMethod, + ConnectMethod, + DisconnectMethod, + SignMessageMethod, + SignTransactionMethod, + SignAndSendTransactionMethod, +} from '@features/provider-methods/utils' export type RootStackParamList = { OnboardingNavigator: undefined @@ -14,6 +22,12 @@ export type RootStackParamList = { ImportPrivateKey: { key?: string } SelectKeystoneAccounts: { derivationAccounts: KeystoneAccountType[] } ScanQrCode: undefined + Connect: ConnectMethod + Disconnect: DisconnectMethod + SignTransaction: SignTransactionMethod + SignMessage: SignMessageMethod + SignAndSendTransaction: SignAndSendTransactionMethod + SignAllTransactions: SignAllTransactionsMethod } export type TabBarStackParamList = { diff --git a/src/app/services/AccountsService/pages/AddExistingWalletPage.tsx b/src/app/services/AccountsService/pages/AddExistingWalletPage.tsx index 40d146e2..57ec2b64 100644 --- a/src/app/services/AccountsService/pages/AddExistingWalletPage.tsx +++ b/src/app/services/AccountsService/pages/AddExistingWalletPage.tsx @@ -1,11 +1,9 @@ import Box from '@components/Box' import ScrollBox from '@components/ScrollBox' -import { NavBarHeight } from '@components/ServiceNavBar' import { useSpacing, useColors } from '@config/theme/themeHooks' import Text from '@components/Text' import React, { useCallback, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import { StyleProp, ViewStyle } from 'react-native' import SecretPhrase from '@assets/svgs/secretPhrase.svg' import PrivateKey from '@assets/svgs/privateKey.svg' @@ -24,13 +22,14 @@ import { FlowType, OnboardingSheetWrapper, } from '@features/onboarding/OnboardingSheet' +import { useBottomSpacing } from '@hooks/useBottomSpacing' const AddExistingWalletPage = () => { const { t } = useTranslation() const spacing = useSpacing() const colors = useColors() - const { bottom } = useSafeAreaInsets() const onboardingSheetRef = useRef(null) + const bottomSpacing = useBottomSpacing() const onAddExistingWallet = useCallback( (flowType: FlowType) => () => { @@ -41,20 +40,25 @@ const AddExistingWalletPage = () => { const contentContainerStyle = useMemo( () => ({ - paddingHorizontal: spacing['2xl'], - flex: 1, + padding: spacing['2xl'], justifyContent: 'center', gap: spacing.xl, - paddingBottom: bottom + spacing['2xl'] + NavBarHeight, + paddingBottom: bottomSpacing, }), - [spacing, bottom], + [spacing, bottomSpacing], ) return ( } > - + {t('AddExistingWalletPage.title')} { const { t } = useTranslation() const spacing = useSpacing() const colors = useColors() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const onboardingSheetRef = useRef(null) const contentContainerStyle = useMemo( () => ({ - paddingHorizontal: spacing['2xl'], - flex: 1, + padding: spacing['2xl'], justifyContent: 'center', alignItems: 'center', - paddingBottom: bottom + spacing['2xl'] + NavBarHeight, + paddingBottom: bottomSpacing, }), - [spacing, bottom], + [spacing, bottomSpacing], ) const openOnboarding = useCallback(() => { @@ -40,6 +38,7 @@ const ConnectKeystonePage = () => { contentContainerStyle={contentContainerStyle as StyleProp} > diff --git a/src/app/services/AccountsService/pages/CreateSeedPhrasePage.tsx b/src/app/services/AccountsService/pages/CreateSeedPhrasePage.tsx index 4b625110..135d4a7c 100644 --- a/src/app/services/AccountsService/pages/CreateSeedPhrasePage.tsx +++ b/src/app/services/AccountsService/pages/CreateSeedPhrasePage.tsx @@ -8,30 +8,29 @@ import React, { useCallback, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { StyleProp, ViewStyle } from 'react-native' import Add from '@assets/svgs/add.svg' -import { useSafeAreaInsets } from 'react-native-safe-area-context' -import { NavBarHeight } from '@components/ServiceNavBar' import { OnboardingSheetRef, OnboardingSheetWrapper, } from '@features/onboarding/OnboardingSheet' +import { useBottomSpacing } from '@hooks/useBottomSpacing' const CreateSeedPhrasePage = () => { const { t } = useTranslation() const spacing = useSpacing() const colors = useColors() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() + const onboardingSheetRef = useRef(null) const contentContainerStyle = useMemo( () => ({ - paddingHorizontal: spacing['2xl'], - flex: 1, + padding: spacing['2xl'], justifyContent: 'center', alignItems: 'center', gap: spacing.xl, - paddingBottom: bottom + spacing['2xl'] + NavBarHeight, + paddingBottom: bottomSpacing, }), - [spacing, bottom], + [spacing, bottomSpacing], ) const showBottomSheet = useCallback(() => { @@ -40,10 +39,11 @@ const CreateSeedPhrasePage = () => { return ( } > - - + + {t('CreateSeedPhrasePage.title')} { const { t } = useTranslation() const spacing = useSpacing() const colors = useColors() const onboardingSheetRef = useRef(null) - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const contentContainerStyle = useMemo( () => ({ - paddingHorizontal: spacing['2xl'], - flex: 1, + padding: spacing['2xl'], justifyContent: 'center', alignItems: 'center', - paddingBottom: bottom + spacing['2xl'] + NavBarHeight, + paddingBottom: bottomSpacing, }), - [spacing, bottom], + [spacing, bottomSpacing], ) const openOnboardingSheet = useCallback(() => { diff --git a/src/app/services/HotspotService/pages/AddHotspotPage.tsx b/src/app/services/HotspotService/pages/AddHotspotPage.tsx index 3a3237a4..94e5cad7 100644 --- a/src/app/services/HotspotService/pages/AddHotspotPage.tsx +++ b/src/app/services/HotspotService/pages/AddHotspotPage.tsx @@ -8,19 +8,18 @@ import Add from '@assets/svgs/add.svg' import { useColors, useSpacing } from '@config/theme/themeHooks' import RightArrow from '@assets/svgs/rightArrow.svg' import ScrollBox from '@components/ScrollBox' -import { NavBarHeight } from '@components/ServiceNavBar' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import { OnboardingSheetWrapper, OnboardingSheetRef, } from '@features/hotspot-onboarding/OnboardingSheet' +import { useBottomSpacing } from '@hooks/useBottomSpacing' const AddHotspotPage = () => { const { t } = useTranslation() - const { bottom } = useSafeAreaInsets() const colors = useColors() const spacing = useSpacing() const onboardingSheetRef = useRef(null) + const bottomSpacing = useBottomSpacing() const showOnboardingSheet = useCallback(() => { onboardingSheetRef.current?.show() @@ -88,7 +87,7 @@ const AddHotspotPage = () => { gap="sm" justifyContent="center" style={{ - marginBottom: NavBarHeight + bottom + spacing['2xl'], + marginBottom: bottomSpacing, }} > diff --git a/src/app/services/HotspotService/pages/ExplorerPage.tsx b/src/app/services/HotspotService/pages/ExplorerPage.tsx index 712b544e..44f2571c 100644 --- a/src/app/services/HotspotService/pages/ExplorerPage.tsx +++ b/src/app/services/HotspotService/pages/ExplorerPage.tsx @@ -15,6 +15,12 @@ import { useSpacing } from '@config/theme/themeHooks' import Text from '@components/Text' import { ReAnimatedBox } from '@components/AnimatedBox' import { FadeIn, FadeOut } from 'react-native-reanimated' +import { useAsync } from 'react-async-hook' +import { useEntityKey } from '@hooks/useEntityKey' +import { useIotInfo } from '@hooks/useIotInfo' +import { useMobileInfo } from '@hooks/useMobileInfo' +import { parseH3BNLocation } from '@utils/h3' +import { HotspotWithPendingRewards } from '../../../../types/solana' const ExplorerPage = () => { const { hotspotsWithMeta } = useHotspots() @@ -90,31 +96,41 @@ const ExplorerPage = () => { - {hotspotsWithMeta.map((hotspot) => { - const subDao = hotspot?.content?.metadata?.hotspot_infos?.iot - ?.device_type - ? 'iot' - : 'mobile' - const { long, lat } = hotspot.content.metadata.hotspot_infos[subDao] - - if (!long || !lat) return null - - return ( - - - - ) - })} + {hotspotsWithMeta.map((hotspot) => ( + + ))} ) } +const HotspotMarker = ({ hotspot }: { hotspot: HotspotWithPendingRewards }) => { + const entityKey = useEntityKey(hotspot) + const iotInfoAcc = useIotInfo(entityKey) + const mobileInfoAcc = useMobileInfo(entityKey) + + const { result } = useAsync(async () => { + if (iotInfoAcc) { + return parseH3BNLocation(iotInfoAcc.info.location).reverse() + } + + if (mobileInfoAcc) { + return parseH3BNLocation(mobileInfoAcc.info.location).reverse() + } + }, [hotspot]) + + if (!result) return null + + return ( + + + + ) +} + export default ExplorerPage diff --git a/src/assets/images/connectLogo.png b/src/assets/images/connectLogo.png new file mode 100644 index 00000000..1566488b Binary files /dev/null and b/src/assets/images/connectLogo.png differ diff --git a/src/assets/images/connectLogo@2x.png b/src/assets/images/connectLogo@2x.png new file mode 100644 index 00000000..1bc400b1 Binary files /dev/null and b/src/assets/images/connectLogo@2x.png differ diff --git a/src/assets/images/connectLogo@3x.png b/src/assets/images/connectLogo@3x.png new file mode 100644 index 00000000..cb3015f0 Binary files /dev/null and b/src/assets/images/connectLogo@3x.png differ diff --git a/src/assets/images/disconnectLogo.png b/src/assets/images/disconnectLogo.png new file mode 100644 index 00000000..8039fd12 Binary files /dev/null and b/src/assets/images/disconnectLogo.png differ diff --git a/src/assets/images/disconnectLogo@2x.png b/src/assets/images/disconnectLogo@2x.png new file mode 100644 index 00000000..1c54d95d Binary files /dev/null and b/src/assets/images/disconnectLogo@2x.png differ diff --git a/src/assets/images/disconnectLogo@3x.png b/src/assets/images/disconnectLogo@3x.png new file mode 100644 index 00000000..ab4a534e Binary files /dev/null and b/src/assets/images/disconnectLogo@3x.png differ diff --git a/src/assets/images/signAndSendLogo.png b/src/assets/images/signAndSendLogo.png new file mode 100644 index 00000000..7779cdc4 Binary files /dev/null and b/src/assets/images/signAndSendLogo.png differ diff --git a/src/assets/images/signAndSendLogo@2x.png b/src/assets/images/signAndSendLogo@2x.png new file mode 100644 index 00000000..ab588bee Binary files /dev/null and b/src/assets/images/signAndSendLogo@2x.png differ diff --git a/src/assets/images/signAndSendLogo@3x.png b/src/assets/images/signAndSendLogo@3x.png new file mode 100644 index 00000000..28f11abf Binary files /dev/null and b/src/assets/images/signAndSendLogo@3x.png differ diff --git a/src/assets/images/signMessageLogo.png b/src/assets/images/signMessageLogo.png new file mode 100644 index 00000000..796b5c97 Binary files /dev/null and b/src/assets/images/signMessageLogo.png differ diff --git a/src/assets/images/signMessageLogo@2x.png b/src/assets/images/signMessageLogo@2x.png new file mode 100644 index 00000000..852517ef Binary files /dev/null and b/src/assets/images/signMessageLogo@2x.png differ diff --git a/src/assets/images/signMessageLogo@3x.png b/src/assets/images/signMessageLogo@3x.png new file mode 100644 index 00000000..2e315ee5 Binary files /dev/null and b/src/assets/images/signMessageLogo@3x.png differ diff --git a/src/assets/images/signTransactionLogo.png b/src/assets/images/signTransactionLogo.png new file mode 100644 index 00000000..796b5c97 Binary files /dev/null and b/src/assets/images/signTransactionLogo.png differ diff --git a/src/assets/images/signTransactionLogo@2x.png b/src/assets/images/signTransactionLogo@2x.png new file mode 100644 index 00000000..852517ef Binary files /dev/null and b/src/assets/images/signTransactionLogo@2x.png differ diff --git a/src/assets/images/signTransactionLogo@3x.png b/src/assets/images/signTransactionLogo@3x.png new file mode 100644 index 00000000..2e315ee5 Binary files /dev/null and b/src/assets/images/signTransactionLogo@3x.png differ diff --git a/src/assets/images/signTransactionsLogo.png b/src/assets/images/signTransactionsLogo.png new file mode 100644 index 00000000..032294fe Binary files /dev/null and b/src/assets/images/signTransactionsLogo.png differ diff --git a/src/assets/images/signTransactionsLogo@2x.png b/src/assets/images/signTransactionsLogo@2x.png new file mode 100644 index 00000000..8489ff98 Binary files /dev/null and b/src/assets/images/signTransactionsLogo@2x.png differ diff --git a/src/assets/images/signTransactionsLogo@3x.png b/src/assets/images/signTransactionsLogo@3x.png new file mode 100644 index 00000000..146c10a6 Binary files /dev/null and b/src/assets/images/signTransactionsLogo@3x.png differ diff --git a/src/components/AccountButton.tsx b/src/components/AccountButton.tsx index 2ae04d9a..86fb1e16 100644 --- a/src/components/AccountButton.tsx +++ b/src/components/AccountButton.tsx @@ -6,18 +6,17 @@ import { BoxProps } from '@shopify/restyle' import { useColors, useHitSlop } from '@config/theme/themeHooks' import { Color, Theme } from '@config/theme/theme' import useHaptic from '@hooks/useHaptic' +import { ellipsizeAddress } from '@utils/accountUtils' import AccountIcon from './AccountIcon' import Box from './Box' import Text from './Text' -import TouchableOpacityBox from './TouchableOpacityBox' +import TouchableContainer from './TouchableContainer' type Props = { onPress?: (address?: string) => void address?: string title?: string - subtitle?: string showBubbleArrow?: boolean - innerBoxProps?: BoxProps showChevron?: boolean accountIconSize?: number } & BoxProps @@ -26,9 +25,7 @@ const AccountButton = ({ onPress, address, title, - subtitle, showBubbleArrow, - innerBoxProps, showChevron = true, accountIconSize = 28, backgroundColor: backgroundColorProps, @@ -45,40 +42,39 @@ const AccountButton = ({ }, [address, onPress, triggerImpact]) const textColor = useMemo((): Color => { - return 'secondaryText' + return 'text.quaternary-500' }, []) return ( - - {!!subtitle && ( - - {subtitle} - - )} + + {title} + - {title} + {ellipsizeAddress(address || '', { + numChars: 4, + })} {showChevron && } @@ -92,7 +88,7 @@ const AccountButton = ({ /> )} - + ) } diff --git a/src/components/AccountListItem.tsx b/src/components/AccountListItem.tsx index cc7584e0..1944380b 100644 --- a/src/components/AccountListItem.tsx +++ b/src/components/AccountListItem.tsx @@ -23,7 +23,7 @@ const AccountListItem = ({ disabled, ...rest }: Props & BoxProps) => { - const { primaryText } = useColors() + const { primaryBackground } = useColors() const handlePress = useCallback(() => onPress?.(account), [account, onPress]) @@ -55,14 +55,14 @@ const AccountListItem = ({ {selected && ( - + )} diff --git a/src/components/AccountSelector.tsx b/src/components/AccountSelector.tsx index 9ae2b3d1..6ca9fc08 100644 --- a/src/components/AccountSelector.tsx +++ b/src/components/AccountSelector.tsx @@ -1,7 +1,6 @@ import React, { forwardRef, memo, - ReactNode, Ref, useCallback, useImperativeHandle, @@ -9,19 +8,19 @@ import React, { useRef, useState, } from 'react' -import { +import BottomSheet, { BottomSheetBackdrop, BottomSheetFlatList, - BottomSheetModal, - BottomSheetModalProvider, } from '@gorhom/bottom-sheet' import { GestureResponderEvent } from 'react-native' -import { useColors, useOpacity, useSpacing } from '@config/theme/themeHooks' -import useBackHandler from '@hooks/useBackHandler' +import { useSpacing } from '@config/theme/themeHooks' import { useAccountStorage } from '@config/storage/AccountStorageProvider' import { CSAccount } from '@config/storage/cloudStorage' +import { ThemeProvider } from '@shopify/restyle' +import { lightTheme } from '@config/theme/theme' import { AccountNetTypeOpt } from '../utils/accountUtils' import AccountListItem from './AccountListItem' +import HeliumBottomSheet from './HeliumBottomSheet' export type AccountSelectorRef = { show: (_type?: AccountNetTypeOpt | GestureResponderEvent) => void @@ -33,124 +32,113 @@ const isGesture = ( ): x is GestureResponderEvent => !!x && typeof x === 'object' && 'bubbles' in (x as GestureResponderEvent) -const AccountSelector = forwardRef( - ({ children }: { children: ReactNode }, ref: Ref) => { - useImperativeHandle(ref, () => ({ show, showAccountTypes })) - - const bottomSheetModalRef = useRef(null) - const { backgroundStyle } = useOpacity('bg.tertiary', 1) - const spacing = useSpacing() - const [accountsType, setAccountsTypes] = useState('all') - const snapPoints = useMemo(() => ['60%', '80%'], []) - const colors = useColors() - - const sheetHandleStyle = useMemo(() => ({ padding: spacing[4] }), [spacing]) - const flatListContainerStyle = useMemo( - () => ({ paddingBottom: spacing[8] }), - [spacing], - ) - - const { handleDismiss, setIsShowing } = useBackHandler(bottomSheetModalRef) - - const show = useCallback( - (x?: AccountNetTypeOpt | GestureResponderEvent) => { - let type: AccountNetTypeOpt = 'all' - if (x !== undefined && !isGesture(x)) { - type = x - } - setAccountsTypes(type) - bottomSheetModalRef.current?.present() - setIsShowing(true) - }, - [setIsShowing], - ) - - const showAccountTypes = useCallback( - (type: AccountNetTypeOpt) => () => { - show(type) - }, - [show], - ) - - const hide = useCallback(() => { - bottomSheetModalRef.current?.dismiss() - }, []) - - const { sortedAccountsForNetType, currentAccount, setCurrentAccount } = - useAccountStorage() - - const data = useMemo( - () => sortedAccountsForNetType(accountsType), - - [accountsType, sortedAccountsForNetType], - ) - - const handleAccountPress = useCallback( - (account: CSAccount) => { - setCurrentAccount(account) - hide() - }, - [hide, setCurrentAccount], - ) - - const keyExtractor = useCallback((item: CSAccount) => { - return item.address - }, []) - - const handleIndicatorStyle = useMemo(() => { - return { - backgroundColor: colors.secondaryText, - } - }, [colors.secondaryText]) - - const renderFlatlistItem = useCallback( - // eslint-disable-next-line react/no-unused-prop-types - ({ item: account }: { item: CSAccount; index: number }) => { - return ( - - ) - }, - [currentAccount?.address, handleAccountPress], - ) - const renderBackdrop = useCallback( - (props) => ( - ) => { + useImperativeHandle(ref, () => ({ show, showAccountTypes })) + + const bottomSheetModalRef = useRef(null) + const spacing = useSpacing() + const [accountsType, setAccountsTypes] = useState('all') + + const flatListContainerStyle = useMemo( + () => ({ padding: spacing['2xl'] }), + [spacing], + ) + + const show = useCallback((x?: AccountNetTypeOpt | GestureResponderEvent) => { + let type: AccountNetTypeOpt = 'all' + if (x !== undefined && !isGesture(x)) { + type = x + } + setAccountsTypes(type) + bottomSheetModalRef.current?.expand() + }, []) + + const showAccountTypes = useCallback( + (type: AccountNetTypeOpt) => () => { + show(type) + }, + [show], + ) + + const hide = useCallback(() => { + bottomSheetModalRef.current?.close() + }, []) + + const { sortedAccountsForNetType, currentAccount, setCurrentAccount } = + useAccountStorage() + + const data = useMemo( + () => sortedAccountsForNetType(accountsType), + + [accountsType, sortedAccountsForNetType], + ) + + const handleAccountPress = useCallback( + (account: CSAccount) => { + setCurrentAccount(account) + hide() + }, + [hide, setCurrentAccount], + ) + + const keyExtractor = useCallback((item: CSAccount) => { + return item.address + }, []) + + const renderFlatlistItem = useCallback( + // eslint-disable-next-line react/no-unused-prop-types + ({ item: account }: { item: CSAccount; index: number }) => { + const isFirst = account.address === data[0].address + const isLast = account.address === data[data.length - 1].address + const borderTopStartRadius = isFirst ? '2xl' : 'none' + const borderTopEndRadius = isFirst ? '2xl' : 'none' + const borderBottomStartRadius = isLast ? '2xl' : 'none' + const borderBottomEndRadius = isLast ? '2xl' : 'none' + + return ( + - ), - [], - ) - return ( - - - - - {children} - - ) - }, -) + ) + }, + [currentAccount?.address, handleAccountPress, data], + ) + const renderBackdrop = useCallback( + (props) => ( + + ), + [], + ) + return ( + + + + + + ) +}) export default memo(AccountSelector) diff --git a/src/components/ServiceNavBar.tsx b/src/components/ServiceNavBar.tsx index 7f109ace..57d05041 100644 --- a/src/components/ServiceNavBar.tsx +++ b/src/components/ServiceNavBar.tsx @@ -180,7 +180,7 @@ const NavServiceNavBar = ({ return ( { + const encryptionKey = crypto.randomBytes(256 / 8) + + // eslint-disable-next-line new-cap + const cipher = new aesjs.ModeOfOperation.ctr( + encryptionKey, + new aesjs.Counter(1), + ) + const encryptedBytes = cipher.encrypt(aesjs.utils.utf8.toBytes(value)) + + await SecureStore.setItemAsync(key, aesjs.utils.hex.fromBytes(encryptionKey)) + + return aesjs.utils.hex.fromBytes(encryptedBytes) +} + +const decrypt = async (key: string, value: string) => { + const encryptionKeyHex = await SecureStore.getItemAsync(key) + if (!encryptionKeyHex) { + return encryptionKeyHex + } + + // eslint-disable-next-line new-cap + const cipher = new aesjs.ModeOfOperation.ctr( + aesjs.utils.hex.toBytes(encryptionKeyHex), + new aesjs.Counter(1), + ) + const decryptedBytes = cipher.decrypt(aesjs.utils.hex.toBytes(value)) + + return aesjs.utils.utf8.fromBytes(decryptedBytes) +} + +export const getItem = async (key: string) => { + const encrypted = await AsyncStorage.getItem(key) + if (!encrypted) { + return encrypted + } + + return decrypt(key, encrypted) +} + +export const removeItem = async (key: string) => { + await AsyncStorage.removeItem(key) + await SecureStore.deleteItemAsync(key) +} + +export const setItem = async (key: string, value: string) => { + const encrypted = await encrypt(key, value) + + await AsyncStorage.setItem(key, encrypted) +} diff --git a/src/features/accounts/WalletList.tsx b/src/features/accounts/WalletList.tsx index cf9b69e6..56885b41 100644 --- a/src/features/accounts/WalletList.tsx +++ b/src/features/accounts/WalletList.tsx @@ -23,7 +23,6 @@ import { getSecureAccount } from '@config/storage/secureStorage' import * as bip39 from 'bip39' import { useOnboarding } from '@features/onboarding/OnboardingProvider' import Toast from 'react-native-simple-toast' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import { ServiceSheetNavigationProp } from 'src/app/services/serviceSheetTypes' import CircleLoader from '@components/CircleLoader' import ScrollBox from '@components/ScrollBox' @@ -31,7 +30,7 @@ import { OnboardingSheetRef, OnboardingSheetWrapper, } from '@features/onboarding/OnboardingSheet' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { AccountsServiceNavigationProp } from './accountServiceTypes' const ACCOUNT_LIMIT = 100 @@ -49,7 +48,7 @@ const WalletList = () => { >() const { sortedAccounts, currentAccount, setCurrentAccount, accounts } = useAccountStorage() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const onboardingSheetRef = useRef(null) const handleAddSub = useCallback( @@ -322,7 +321,7 @@ const WalletList = () => { { } const ActivityDetailsScreen = () => { - const { bottom } = useSafeAreaInsets() const route = useRoute() const colors = useColors() const { t, i18n } = useTranslation() const createExplorerUrl = useCreateExplorerUrl() const copyText = useCopyText() const { triggerImpact } = useHaptic() + const bottomSpacing = useBottomSpacing() const { transaction } = route.params @@ -398,7 +397,7 @@ const ActivityDetailsScreen = () => { titleColor="base.black" onPress={handleOpenExplorer} style={{ - marginBottom: NavBarHeight + bottom, + marginBottom: bottomSpacing, }} /> diff --git a/src/features/activity/ActivityScreen.tsx b/src/features/activity/ActivityScreen.tsx index fabd8a02..ddc2172a 100644 --- a/src/features/activity/ActivityScreen.tsx +++ b/src/features/activity/ActivityScreen.tsx @@ -4,7 +4,6 @@ import { EnrichedTransaction } from 'src/types/solana' import { ConfirmedSignatureInfo } from '@solana/web3.js' import { useNavigation } from '@react-navigation/native' import { useTranslation } from 'react-i18next' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import Box from '@components/Box' import Text from '@components/Text' import useEnrichedTransactions from '@hooks/useEnrichedTransactions' @@ -12,8 +11,8 @@ import CircleLoader from '@components/CircleLoader' import FadeInOut from '@components/FadeInOut' import useHaptic from '@hooks/useHaptic' import { useColors, useSpacing } from '@config/theme/themeHooks' -import { NavBarHeight } from '@components/ServiceNavBar' import ScrollBox from '@components/ScrollBox' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { ActivityNavigationProp } from './activityTypes' import ActivityListItem from './ActivityListItem' @@ -22,17 +21,17 @@ const ActivityScreen = () => { useEnrichedTransactions() const { t } = useTranslation() const spacing = useSpacing() - const { bottom } = useSafeAreaInsets() const colors = useColors() const navigation = useNavigation() const { triggerImpact } = useHaptic() + const bottomSpacing = useBottomSpacing() const contentContainer = useMemo( () => ({ paddingTop: spacing['6xl'], - paddingBottom: NavBarHeight + bottom + spacing['6xl'], + paddingBottom: bottomSpacing, }), - [spacing, bottom], + [spacing, bottomSpacing], ) const SectionData = useMemo((): { diff --git a/src/features/addressBook/ContactDetails.tsx b/src/features/addressBook/ContactDetails.tsx index f1ab9981..375dfdf2 100644 --- a/src/features/addressBook/ContactDetails.tsx +++ b/src/features/addressBook/ContactDetails.tsx @@ -28,13 +28,12 @@ import { heliumAddressFromSolAddress } from '@helium/spl-utils' import { useDebounce } from 'use-debounce' import { fetchDomainOwner } from '@utils/getDomainOwner' import BackScreen from '@components/BackScreen' -import { NavBarHeight } from '@components/ServiceNavBar' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import ScrollBox from '@components/ScrollBox' import { useAccountStorage } from '@config/storage/AccountStorageProvider' import { useAppStorage } from '@config/storage/AppStorageProvider' import { CSAccount } from '@config/storage/cloudStorage' import { useSolana } from '@features/solana/SolanaProvider' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import AddressExtra from './AddressExtra' import { AddressBookNavigationProp, @@ -55,7 +54,6 @@ const ContactDetails = ({ action, contact }: Props) => { const { t } = useTranslation() const addressBookNav = useNavigation() const route = useRoute() - const { bottom } = useSafeAreaInsets() const { addContact, editContact, deleteContact } = useAccountStorage() const [nickname, setNickname] = useState(contact?.alias || '') const [address, setAddress] = useState('') @@ -67,6 +65,7 @@ const ContactDetails = ({ action, contact }: Props) => { const { connection } = useSolana() // debounce is needed to avoid unneccessary rpc calls const [debouncedAddress] = useDebounce(address, 800) + const bottomSpacing = useBottomSpacing() useEffect(() => { if (route.params?.address) { @@ -185,7 +184,7 @@ const ContactDetails = ({ action, contact }: Props) => { paddingHorizontal="0" padding="4" style={{ - paddingBottom: NavBarHeight + bottom + spacing.xl, + paddingBottom: bottomSpacing, }} > diff --git a/src/features/addressBook/ContactsList.tsx b/src/features/addressBook/ContactsList.tsx index 3b24231a..70ced5c1 100644 --- a/src/features/addressBook/ContactsList.tsx +++ b/src/features/addressBook/ContactsList.tsx @@ -13,8 +13,7 @@ import FabButton from '@components/FabButton' import SearchInput from '@components/SearchInput' import AccountListItem from '@components/AccountListItem' import { useSpacing } from '@config/theme/themeHooks' -import { NavBarHeight } from '@components/ServiceNavBar' -import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { CSAccount } from '@config/storage/cloudStorage' type Props = { @@ -38,7 +37,7 @@ const ContactsList = ({ const { t } = useTranslation() const spacing = useSpacing() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const [searchTerm, setSearchTerm] = useState('') const handleContactPressed = useCallback( (item: CSAccount) => { @@ -161,9 +160,9 @@ const ContactsList = ({ const contentContainerStyle = useMemo(() => { return { padding: spacing['5'], - paddingBottom: NavBarHeight + bottom, + paddingBottom: bottomSpacing, } - }, [spacing, bottom]) + }, [spacing, bottomSpacing]) if (insideBottomSheet) { return ( diff --git a/src/features/burn/BurnScreen.tsx b/src/features/burn/BurnScreen.tsx index c168e761..ed4a70f5 100644 --- a/src/features/burn/BurnScreen.tsx +++ b/src/features/burn/BurnScreen.tsx @@ -23,7 +23,7 @@ import { useCurrentWallet } from '@hooks/useCurrentWallet' import { useMetaplexMetadata } from '@hooks/useMetaplexMetadata' import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' import { PublicKey } from '@solana/web3.js' -import { useColors, useHitSlop, useSpacing } from '@config/theme/themeHooks' +import { useColors, useHitSlop } from '@config/theme/themeHooks' import { BN } from 'bn.js' import React, { memo as reactMemo, @@ -44,7 +44,7 @@ import { } from '@services/WalletService/pages/WalletPage' import { useAccountStorage } from '@config/storage/AccountStorageProvider' import { CSAccount } from '@config/storage/cloudStorage' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import ScrollBox from '@components/ScrollBox' import AddressBookSelector, { AddressBookRef, @@ -72,8 +72,8 @@ const BurnScreen = () => { setCurrentAccount, defaultAccountAddress, } = useAccountStorage() - const spacing = useSpacing() - const { top, bottom } = useSafeAreaInsets() + const { top } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const navigation = useNavigation() const { t } = useTranslation() const { primaryText } = useColors() @@ -105,10 +105,10 @@ const BurnScreen = () => { const containerStyle = useMemo( () => ({ marginTop: Platform.OS === 'android' ? top : undefined, - paddingBottom: NavBarHeight + spacing['2xl'] + bottom, + paddingBottom: bottomSpacing, flex: 1, }), - [top, spacing, bottom], + [top, bottomSpacing], ) const networkType = useMemo( diff --git a/src/features/collectables/ManageCollectables.tsx b/src/features/collectables/ManageCollectables.tsx index 798a5d55..3eaea6a4 100644 --- a/src/features/collectables/ManageCollectables.tsx +++ b/src/features/collectables/ManageCollectables.tsx @@ -1,6 +1,6 @@ import BackScreen from '@components/BackScreen' import ScrollBox from '@components/ScrollBox' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import useCollectables from '@hooks/useCollectables' import { RootState } from '@store/rootReducer' import { useColors } from '@config/theme/themeHooks' @@ -9,13 +9,12 @@ import React, { useCallback } from 'react' import { useAsync } from 'react-async-hook' import { FlatList, RefreshControl } from 'react-native' import { useSelector } from 'react-redux' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import { useTranslation } from 'react-i18next' import CollectionItem, { Collection } from './CollectionItem' const ManageCollectables = () => { const { t } = useTranslation() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const colors = useColors() const { fetchAllCollectablesByGroup } = useCollectables() const approvedCollections = useSelector( @@ -118,7 +117,7 @@ const ManageCollectables = () => { renderItem={renderItem} keyExtractor={keyExtractor} contentContainerStyle={{ - paddingBottom: NavBarHeight + bottom, + paddingBottom: bottomSpacing, }} /> diff --git a/src/features/collectables/NftDetailsScreen.tsx b/src/features/collectables/NftDetailsScreen.tsx index ba24b102..c691ccff 100644 --- a/src/features/collectables/NftDetailsScreen.tsx +++ b/src/features/collectables/NftDetailsScreen.tsx @@ -1,6 +1,5 @@ import React, { useCallback, useMemo, memo } from 'react' import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import 'text-encoding-polyfill' import { useTranslation } from 'react-i18next' import Face from '@assets/svgs/face.svg' @@ -18,7 +17,7 @@ import { WalletNavigationProp, WalletStackParamList, } from '@services/WalletService/pages/WalletPage' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import ButtonPressable from '@components/ButtonPressable' import { useAccountStorage } from '@config/storage/AccountStorageProvider' import NftMetadata from './NftMetadata' @@ -31,7 +30,7 @@ const NftDetailsScreen = () => { const route = useRoute() const navigation = useNavigation() const COLLECTABLE_HEIGHT = ww - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const { editAvatar } = useAccountStorage() const { t } = useTranslation() @@ -182,7 +181,7 @@ const NftDetailsScreen = () => { diff --git a/src/features/collectables/NftList.tsx b/src/features/collectables/NftList.tsx index e4ed8c85..16b104f3 100644 --- a/src/features/collectables/NftList.tsx +++ b/src/features/collectables/NftList.tsx @@ -6,8 +6,7 @@ import Box from '@components/Box' import useCollectables from '@hooks/useCollectables' import { useColors, useSpacing } from '@config/theme/themeHooks' import { useNavigation } from '@react-navigation/native' -import { NavBarHeight } from '@components/ServiceNavBar' -import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import TouchableOpacityBox from '@components/TouchableOpacityBox' import Config from '@assets/svgs/config.svg' import Text from '@components/Text' @@ -19,7 +18,7 @@ import NFTListItem, { NFTSkeleton } from './NftListItem' const NftList = () => { const spacing = useSpacing() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const navigation = useNavigation() const approvedCollections = useSelector( (state: RootState) => state.collectables.approvedCollections, @@ -110,11 +109,11 @@ const NftList = () => { const contentContainerStyle = useMemo( () => ({ marginTop: spacing[4], - paddingBottom: NavBarHeight + bottom + spacing['6xl'], + paddingBottom: bottomSpacing, paddingHorizontal: spacing[5], gap: spacing[4], }), - [spacing, bottom], + [spacing, bottomSpacing], ) return ( diff --git a/src/features/collectables/TransferCollectableScreen.tsx b/src/features/collectables/TransferCollectableScreen.tsx index 30953b08..561d638d 100644 --- a/src/features/collectables/TransferCollectableScreen.tsx +++ b/src/features/collectables/TransferCollectableScreen.tsx @@ -21,11 +21,10 @@ import { NativeSyntheticEvent, TextInputEndEditingEventData, } from 'react-native' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import 'text-encoding-polyfill' import ScrollBox from '@components/ScrollBox' import { Asset } from '@helium/spl-utils' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import TouchableOpacityBox from '@components/TouchableOpacityBox' import AddressIcon from '@assets/svgs/addressIcon.svg' import { WalletNavigationProp } from '@services/WalletService/pages/WalletPage' @@ -46,7 +45,7 @@ const TransferCollectableScreen = () => { const route = useRoute() const navigation = useNavigation() const COLLECTABLE_HEIGHT = ww - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const { t } = useTranslation() const { collectable } = route.params @@ -222,7 +221,7 @@ const TransferCollectableScreen = () => { flexDirection="row" marginTop="4" style={{ - marginBottom: NavBarHeight + bottom, + marginBottom: bottomSpacing, }} > { const route = useRoute() const colors = useColors() const spacing = useSpacing() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const navigation = useNavigation() const COLLECTABLE_HEIGHT = ww const solBalance = useBN(useSolOwnedAmount(useCurrentWallet()).amount) @@ -193,7 +192,7 @@ const TransferCollectableScreen = () => { width="100%" justifyContent="flex-end" style={{ - paddingBottom: NavBarHeight + bottom + spacing.xl, + paddingBottom: bottomSpacing, }} > { }, [currentAccount, setCurrentAccount, sortedMainnetAccounts]) return ( - + <> { - + + ) } diff --git a/src/features/hotspot-onboarding/screens/SelectNetworkScreen.tsx b/src/features/hotspot-onboarding/screens/SelectNetworkScreen.tsx index 15bea522..97cbd8bf 100644 --- a/src/features/hotspot-onboarding/screens/SelectNetworkScreen.tsx +++ b/src/features/hotspot-onboarding/screens/SelectNetworkScreen.tsx @@ -48,14 +48,12 @@ const SelectNetworkScreen = () => { marginTop="2xl" backgroundColor="bg.brand-secondary" backgroundColorPressed="blue.light-200" - opacity={0.3} padding="xl" paddingEnd="4xl" borderTopStartRadius="4xl" borderTopEndRadius="4xl" flexDirection="row" alignItems="center" - disabled onPress={onMobileSelected} > diff --git a/src/features/hotspots/AssertLocationScreen.tsx b/src/features/hotspots/AssertLocationScreen.tsx index 9097c808..98af2281 100644 --- a/src/features/hotspots/AssertLocationScreen.tsx +++ b/src/features/hotspots/AssertLocationScreen.tsx @@ -50,7 +50,6 @@ import { import 'text-encoding-polyfill' import { useDebounce } from 'use-debounce' import { useColors, useCreateOpacity } from '@config/theme/themeHooks' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import Map from '@components/Map' import { Camera, @@ -64,7 +63,7 @@ import { INITIAL_MAP_VIEW_STATE, MAX_MAP_ZOOM, } from '@utils/mapUtils' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { Search } from '@components/Search' import { CollectableNavigationProp, @@ -75,7 +74,7 @@ type Route = RouteProp const AssertLocationScreen = () => { const { t } = useTranslation() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const route = useRoute() const { backgroundStyle } = useCreateOpacity() const { collectable } = route.params @@ -737,7 +736,7 @@ const AssertLocationScreen = () => { justifyContent="center" onPress={handleAssertLocationPress} style={{ - marginBottom: bottom + NavBarHeight, + marginBottom: bottomSpacing, }} > {debouncedDisabled || asserting ? ( @@ -847,7 +846,7 @@ const AssertLocationScreen = () => { { const navigation = useNavigation() const copyText = useCopyText() const { triggerImpact } = useHaptic() - + const bottomSpacing = useBottomSpacing() const data = useMemo(() => { return [ { @@ -170,12 +171,6 @@ export const HotspotConfig = () => { [data, colors], ) - const contentContainerStyle = useMemo(() => { - return { - // paddingBottom: spacing['2xl'], - } - }, []) - const renderHeader = useCallback(() => { return ( @@ -191,9 +186,13 @@ export const HotspotConfig = () => { }, [onBack]) return ( - + { hotspot: HotspotWithPendingRewards } const spacing = useSpacing() + const bottomSpacing = useBottomSpacing() const navigation = useNavigation() - + const entityKey = useEntityKey(hotspot) + const iotInfoAcc = useIotInfo(entityKey) + const mobileInfoAcc = useMobileInfo(entityKey) const colors = useColors() const borderRadii = useBorderRadii() @@ -60,12 +68,27 @@ const HotspotDetails = () => { }, [hotspot]) const { result: hotspotAddress } = useAsync(async () => { - const subDaoInfo = hotspot?.content?.metadata?.hotspot_infos[subDao] + let address: + | { + city: string | undefined + postalCode: string | undefined + country: string | undefined + street: string | undefined + state: string | undefined + } + | undefined - const lat = subDaoInfo?.lat - const long = subDaoInfo?.long + if (iotInfoAcc) { + const loc = await parseH3BNLocation(iotInfoAcc.info.location).reverse() + address = await getAddressFromLatLng(loc[1], loc[0]) + } + + if (mobileInfoAcc) { + const loc = await parseH3BNLocation(mobileInfoAcc.info.location).reverse() + address = await getAddressFromLatLng(loc[1], loc[0]) + } - const address = await getAddressFromLatLng(lat, long) + if (!address) return undefined return `${address.street}, ${address.city}, ${address.state}` }, [hotspot, subDao]) @@ -201,7 +224,12 @@ const HotspotDetails = () => { ) return ( - + { const { @@ -35,11 +34,16 @@ const HotspotPage = () => { onEndReached, } = useHotspots() + // Refresh the hotspots when the page is loaded + useEffect(() => { + refresh() + }, [refresh]) + const isFocused = useIsFocused() const colors = useColors() const { t } = useTranslation() const spacing = useSpacing() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const navigation = useNavigation() const [filterText, setFilterText] = useState('') const [userLocation, setUserLocation] = useState() @@ -310,9 +314,9 @@ const HotspotPage = () => { const contentContainerStyle = useMemo(() => { return { paddingHorizontal: spacing['2xl'], - paddingBottom: bottom + NavBarHeight + spacing.xl, + paddingBottom: bottomSpacing, } - }, [spacing, bottom]) + }, [spacing, bottomSpacing]) return ( <> diff --git a/src/features/hotspots/EmptyState.tsx b/src/features/hotspots/components/EmptyState.tsx similarity index 86% rename from src/features/hotspots/EmptyState.tsx rename to src/features/hotspots/components/EmptyState.tsx index 9544f3ce..c0fb11df 100644 --- a/src/features/hotspots/EmptyState.tsx +++ b/src/features/hotspots/components/EmptyState.tsx @@ -1,9 +1,8 @@ import Box from '@components/Box' -import { NavBarHeight } from '@components/ServiceNavBar' -import { useColors, useSpacing } from '@config/theme/themeHooks' +import { useBottomSpacing } from '@hooks/useBottomSpacing' +import { useColors } from '@config/theme/themeHooks' import React, { useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import Text from '@components/Text' import ButtonPressable from '@components/ButtonPressable' import AddIcon from '@assets/svgs/add.svg' @@ -12,10 +11,9 @@ import { useNavigation } from '@react-navigation/native' import { HotspotServiceNavigationProp } from 'src/app/services/HotspotService' const EmptyState = () => { - const spacing = useSpacing() const colors = useColors() const { t } = useTranslation() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const navigation = useNavigation() const onLearnMore = useCallback(() => { @@ -30,7 +28,7 @@ const EmptyState = () => { { backgroundColor="primaryText" borderRadius="6xl" alignItems="center" - paddingTop="8xl" + paddingTop={{ xs: '2xl', lg: '8xl' }} > { variant="textXlMedium" color="text.quaternary-500" marginTop="2.5" - marginBottom="8xl" + marginBottom={{ xs: '2xl', lg: '8xl' }} textAlign="center" paddingHorizontal="2" > diff --git a/src/features/keystone/SelectKeystoneAccountsScreen.tsx b/src/features/keystone/SelectKeystoneAccountsScreen.tsx index b45abcab..420d303e 100644 --- a/src/features/keystone/SelectKeystoneAccountsScreen.tsx +++ b/src/features/keystone/SelectKeystoneAccountsScreen.tsx @@ -18,8 +18,7 @@ import { useSolana } from '@features/solana/SolanaProvider' import { useOnboardingSheet } from '@features/onboarding/OnboardingSheet' import ForwardButton from '@components/ForwardButton' import ScrollBox from '@components/ScrollBox' -import { NavBarHeight } from '@components/ServiceNavBar' -import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { useKeystoneOnboarding } from './KeystoneOnboardingProvider' export type KeystoneAccountType = { @@ -31,7 +30,7 @@ export type KeystoneAccountType = { } const SelectKeystoneAccountsScreen = () => { - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const colors = useColors() const spacing = useSpacing() const { @@ -214,9 +213,9 @@ const SelectKeystoneAccountsScreen = () => { return { padding: spacing['2xl'], flex: 1, - paddingBottom: bottom + NavBarHeight + spacing.xl, + paddingBottom: bottomSpacing, } - }, [spacing, bottom]) + }, [spacing, bottomSpacing]) return ( <> diff --git a/src/features/onboarding/CreateImportAccountScreen.tsx b/src/features/onboarding/CreateImportAccountScreen.tsx index aa817feb..32f724f7 100644 --- a/src/features/onboarding/CreateImportAccountScreen.tsx +++ b/src/features/onboarding/CreateImportAccountScreen.tsx @@ -3,7 +3,7 @@ import React, { memo, useCallback, useRef } from 'react' import { useTranslation } from 'react-i18next' import Box from '@components/Box' import Text from '@components/Text' -import { useColors } from '@config/theme/themeHooks' +import { useColors, useSpacing } from '@config/theme/themeHooks' import FinePrint from '@components/FinePrint' import TouchableContainer from '@components/TouchableContainer' import SecretPhrase from '@assets/svgs/secretPhrase.svg' @@ -28,6 +28,7 @@ const CreateImportAccountScreen = () => { const navigation = useNavigation() const colors = useColors() const onboardingSheetRef = useRef(null) + const spacing = useSpacing() const goBack = useCallback(() => { navigation.goBack() @@ -43,8 +44,10 @@ const CreateImportAccountScreen = () => { return ( { return ( - + @@ -38,7 +53,10 @@ const WelcomeToHeliumScreen = () => { {t('WelcomeToHeliumScreen.title')} { {t('WelcomeToHeliumScreen.subtitle')} - + { options={options} onItemSelected={onWordAmountClicked} paddingTop="4xl" - paddingBottom="8xl" + paddingBottom={{ xs: '4xl', lg: '8xl' }} /> diff --git a/src/features/payment/PaymentScreen.tsx b/src/features/payment/PaymentScreen.tsx index fadc09ed..0373ceb0 100644 --- a/src/features/payment/PaymentScreen.tsx +++ b/src/features/payment/PaymentScreen.tsx @@ -42,7 +42,7 @@ import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view import { useSafeAreaInsets } from 'react-native-safe-area-context' import Toast from 'react-native-simple-toast' import { useSelector } from 'react-redux' -import { NavBarHeight } from '@components/ServiceNavBar' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { WalletNavigationProp } from '@services/WalletService/pages/WalletPage' import { PaymentRouteParam } from 'src/app/services/WalletService' import ScrollBox from '@components/ScrollBox' @@ -100,7 +100,7 @@ const parseLinkedPayments = (opts: PaymentRouteParam): LinkedPayment[] => { type Route = RouteProp const PaymentScreen = () => { const route = useRoute() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const addressBookRef = useRef(null) const tokenSelectorRef = useRef(null) const hntKeyboardRef = useRef(null) @@ -675,7 +675,7 @@ const PaymentScreen = () => { backgroundColor="primaryBackground" style={{ ...containerStyle, - paddingBottom: NavBarHeight + bottom, + paddingBottom: bottomSpacing, }} > {/* { const { t } = useTranslation() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() return ( @@ -45,7 +44,7 @@ const PaymentSuccess = ({ padding="6" overflow="hidden" style={{ - paddingBottom: NavBarHeight + bottom, + paddingBottom: bottomSpacing, }} backgroundColor="cardBackground" > diff --git a/src/features/provider-methods/Connect.tsx b/src/features/provider-methods/Connect.tsx new file mode 100644 index 00000000..0605a089 --- /dev/null +++ b/src/features/provider-methods/Connect.tsx @@ -0,0 +1,180 @@ +import React, { useCallback, useMemo, useRef } from 'react' +import Box from '@components/Box' +import Text from '@components/Text' +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' +import { RootNavigationProp, RootStackParamList } from '@app/rootTypes' +import ScrollBox from '@components/ScrollBox' +import { useSpacing } from '@config/theme/themeHooks' +import { Linking, ViewStyle } from 'react-native' +import { useTranslation } from 'react-i18next' +import ImageBox from '@components/ImageBox' +import ButtonPressable from '@components/ButtonPressable' +import AccountButton from '@components/AccountButton' +import { formatAccountAlias } from '@utils/accountUtils' +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import AccountSelector, { + AccountSelectorRef, +} from '@components/AccountSelector' +import { useAsync, useAsyncCallback } from 'react-async-hook' +import useSession, { Session } from './hooks/useSession' +import ErrorDetected from './components/ErrorDetected' +import extractWebMetadata from './utils' + +type Route = RouteProp +export const Connect = () => { + const { params } = useRoute() + const spacing = useSpacing() + const { t } = useTranslation('') + const navigation = useNavigation() + const { currentAccount } = useAccountStorage() + const accountSelectorRef = useRef(null) + const { connect } = useSession() + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + + const { result: appMetadata } = useAsync(async () => { + if (!params.app_url) + return { + title: t('generic.anApp'), + icon: null, + } + + const { title, icon } = await extractWebMetadata(params.app_url) + + return { title: title || t('generic.anApp'), icon: icon || null } + }, [params]) + + const { execute: onConnect, loading: connecting } = useAsyncCallback( + async () => { + if (!currentAccount?.solanaAddress) return + + const session: Session = { + app_url: params.app_url, + chain: 'solana', + cluster: undefined, + timestamp: new Date().toISOString(), + } + + const connectResponse = await connect( + currentAccount?.solanaAddress, + params.dapp_encryption_public_key, + session, + ) + + if (!connectResponse) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { helium_encryption_public_key, nonce, data } = connectResponse + + const searchParams = new URLSearchParams({ + helium_encryption_public_key, + nonce, + data, + }) + + Linking.openURL(`${params.redirect_link}?${searchParams.toString()}`) + }, + ) + + const onCancel = useCallback(() => { + if (navigation.canGoBack()) { + navigation.popToTop() + } else { + navigation.reset({ + index: 0, + routes: [ + { + name: currentAccount + ? 'ServiceSheetNavigator' + : 'OnboardingNavigator', + }, + ], + }) + } + }, [navigation, currentAccount]) + + const handleAccountButtonPress = useCallback(() => { + accountSelectorRef.current?.show() + }, [accountSelectorRef]) + + if ( + !params.app_url || + !params.dapp_encryption_public_key || + !params.redirect_link + ) { + return + } + + return ( + <> + + + + {t('Connect.title')} + + + {t('Connect.subtitle', { + appName: appMetadata?.title || t('generic.anApp'), + })} + + + + + + + + + + + + + ) +} + +export default Connect diff --git a/src/features/provider-methods/Disconnect.tsx b/src/features/provider-methods/Disconnect.tsx new file mode 100644 index 00000000..762b1bf7 --- /dev/null +++ b/src/features/provider-methods/Disconnect.tsx @@ -0,0 +1,154 @@ +import React, { useCallback, useMemo } from 'react' +import Box from '@components/Box' +import Text from '@components/Text' +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' +import { RootNavigationProp, RootStackParamList } from '@app/rootTypes' +import ScrollBox from '@components/ScrollBox' +import { useSpacing } from '@config/theme/themeHooks' +import { Linking, ViewStyle } from 'react-native' +import { useTranslation } from 'react-i18next' +import ImageBox from '@components/ImageBox' +import ButtonPressable from '@components/ButtonPressable' +import { useAsync, useAsyncCallback } from 'react-async-hook' +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import useSession, { DisconnectPayload, Session } from './hooks/useSession' +import ErrorDetected from './components/ErrorDetected' +import extractWebMetadata from './utils' + +type Route = RouteProp +export const Disconnect = () => { + const { params } = useRoute() + const spacing = useSpacing() + const { t } = useTranslation('') + const navigation = useNavigation() + const { currentAccount } = useAccountStorage() + const { disconnect, getSharedSecret, decryptPayload } = useSession() + + const { result: appMetadata } = useAsync(async () => { + if (!params.nonce || !params.dapp_encryption_public_key || !params.payload) + return { + title: t('generic.anApp'), + icon: null, + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const decryptedPayload = await decryptPayload( + params.payload, + params.nonce, + sharedSecret, + ) + + const parsedPayload: DisconnectPayload = JSON.parse(decryptedPayload) + + const { session } = parsedPayload + + const parsedSession: Session = JSON.parse(session) + + const { title, icon } = await extractWebMetadata(parsedSession.app_url) + + return { title: title || t('generic.anApp'), icon: icon || null } + }, [params]) + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + const { execute: onDisconnect, loading: disconnecting } = useAsyncCallback( + async () => { + if (!currentAccount?.solanaAddress) return + + try { + await disconnect( + params.dapp_encryption_public_key, + params.payload, + params.nonce, + ) + + Linking.openURL(`${params.redirect_link}`) + } catch (e) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + } + }, + ) + + const onCancel = useCallback(() => { + if (navigation.canGoBack()) { + navigation.popToTop() + } else { + navigation.reset({ + index: 0, + routes: [ + { + name: currentAccount + ? 'ServiceSheetNavigator' + : 'OnboardingNavigator', + }, + ], + }) + } + }, [navigation, currentAccount]) + if ( + !params.nonce || + !params.dapp_encryption_public_key || + !params.redirect_link || + !params.payload + ) { + return + } + + return ( + + + + {t('Disconnect.title')} + + + {t('Disconnect.subtitle', { + appName: appMetadata?.title || t('generic.anApp'), + })} + + + + + + + + + ) +} + +export default Disconnect diff --git a/src/features/provider-methods/SignAllTransactions.tsx b/src/features/provider-methods/SignAllTransactions.tsx new file mode 100644 index 00000000..639da925 --- /dev/null +++ b/src/features/provider-methods/SignAllTransactions.tsx @@ -0,0 +1,232 @@ +import React, { useCallback, useMemo } from 'react' +import Box from '@components/Box' +import Text from '@components/Text' +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' +import { RootNavigationProp, RootStackParamList } from '@app/rootTypes' +import ScrollBox from '@components/ScrollBox' +import { useSpacing } from '@config/theme/themeHooks' +import { Linking, ViewStyle } from 'react-native' +import { useTranslation } from 'react-i18next' +import ImageBox from '@components/ImageBox' +import ButtonPressable from '@components/ButtonPressable' +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import { useAsync, useAsyncCallback } from 'react-async-hook' +import { useSolana } from '@features/solana/SolanaProvider' +import { Transaction } from '@solana/web3.js' +import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes' +import { WalletStandardMessageTypes } from '@features/solana/walletSignBottomSheetTypes' +import { useWalletSign } from '@features/solana/WalletSignProvider' +import ErrorDetected from './components/ErrorDetected' +import useSession, { + Session, + SignTransactionsPayload, +} from './hooks/useSession' +import extractWebMetadata from './utils' + +type Route = RouteProp +export const SignAllTransactions = () => { + const { params } = useRoute() + const spacing = useSpacing() + const { t } = useTranslation('') + const navigation = useNavigation() + const { currentAccount } = useAccountStorage() + const { + signAllTransactions, + getSharedSecret, + encryptPayload, + decryptPayload, + } = useSession() + const { walletSignBottomSheetRef } = useWalletSign() + const { anchorProvider } = useSolana() + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + + const { result: appMetadata } = useAsync(async () => { + if (!params.nonce || !params.dapp_encryption_public_key || !params.payload) + return { + title: t('generic.anApp'), + icon: null, + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const decryptedPayload = await decryptPayload( + params.payload, + params.nonce, + sharedSecret, + ) + + const parsedPayload: SignTransactionsPayload = JSON.parse(decryptedPayload) + + const { session } = parsedPayload + + const parsedSession: Session = JSON.parse(session) + + const { title, icon } = await extractWebMetadata(parsedSession.app_url) + + return { title: title || t('generic.anApp'), icon: icon || null } + }, [params]) + + const { execute: onSignAllTransactions, loading: signing } = useAsyncCallback( + async () => { + if (!currentAccount?.solanaAddress) return + + try { + const signAllTransactionsResponse = await signAllTransactions( + params.dapp_encryption_public_key, + params.payload, + params.nonce, + ) + + if (!signAllTransactionsResponse) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { transactions } = signAllTransactionsResponse + + const parsedSession: Session = JSON.parse(params.payload) + + // TODO: Support Versioned Transactions + const txns = transactions.map((tx: string) => + Transaction.from(bs58.decode(tx)), + ) + + const decision = await walletSignBottomSheetRef?.show({ + type: WalletStandardMessageTypes.signTransaction, + url: parsedSession.app_url, + serializedTxs: txns.map((tx) => + tx.serialize({ + requireAllSignatures: false, + }), + ), + }) + + if (!decision) { + const errorParams = new URLSearchParams({ + errorCode: '-32000', + errorMessage: 'User rejected the request', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + const signedTransactions = + await anchorProvider?.wallet.signAllTransactions(txns) + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const [nonce, encryptedPayload] = encryptPayload( + JSON.stringify({ + transactions: signedTransactions?.map((tx) => + bs58.encode(tx.serialize()), + ), + }), + sharedSecret, + ) + + const searchParams = new URLSearchParams({ + nonce: bs58.encode(nonce), + data: bs58.encode(encryptedPayload), + }) + + Linking.openURL(`${params.redirect_link}?${searchParams.toString()}`) + } catch { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + } + }, + ) + + const onCancel = useCallback(() => { + if (navigation.canGoBack()) { + navigation.popToTop() + } else { + navigation.reset({ + index: 0, + routes: [ + { + name: currentAccount + ? 'ServiceSheetNavigator' + : 'OnboardingNavigator', + }, + ], + }) + } + }, [navigation, currentAccount]) + + if ( + !params.nonce || + !params.dapp_encryption_public_key || + !params.redirect_link || + !params.payload + ) { + return + } + + return ( + + + + {t('SignAllTransactions.title')} + + + {t('SignAllTransactions.subtitle', { + appName: appMetadata?.title || t('generic.anApp'), + })} + + + + + + + + + ) +} + +export default SignAllTransactions diff --git a/src/features/provider-methods/SignAndSendTransaction.tsx b/src/features/provider-methods/SignAndSendTransaction.tsx new file mode 100644 index 00000000..dfff0591 --- /dev/null +++ b/src/features/provider-methods/SignAndSendTransaction.tsx @@ -0,0 +1,244 @@ +import React, { useCallback, useMemo } from 'react' +import Box from '@components/Box' +import Text from '@components/Text' +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' +import { RootNavigationProp, RootStackParamList } from '@app/rootTypes' +import ScrollBox from '@components/ScrollBox' +import { useSpacing } from '@config/theme/themeHooks' +import { Linking, ViewStyle } from 'react-native' +import { useTranslation } from 'react-i18next' +import ImageBox from '@components/ImageBox' +import ButtonPressable from '@components/ButtonPressable' +import { useAsync, useAsyncCallback } from 'react-async-hook' +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import { useSolana } from '@features/solana/SolanaProvider' +import { Transaction } from '@solana/web3.js' +import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes' +import { WalletStandardMessageTypes } from '@features/solana/walletSignBottomSheetTypes' +import { useWalletSign } from '@features/solana/WalletSignProvider' +import useSession, { + Session, + SignAndSendTransactionPayload, +} from './hooks/useSession' +import ErrorDetected from './components/ErrorDetected' +import extractWebMetadata from './utils' + +type Route = RouteProp +export const SignAndSendTransaction = () => { + const { params } = useRoute() + const spacing = useSpacing() + const { t } = useTranslation('') + const navigation = useNavigation() + const { currentAccount } = useAccountStorage() + const { + signAndSendTransaction, + getSharedSecret, + encryptPayload, + decryptPayload, + } = useSession() + const { anchorProvider } = useSolana() + const { walletSignBottomSheetRef } = useWalletSign() + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + + const { result: appMetadata } = useAsync(async () => { + if (!params.nonce || !params.dapp_encryption_public_key || !params.payload) + return { + title: t('generic.anApp'), + icon: null, + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const decryptedPayload = await decryptPayload( + params.payload, + params.nonce, + sharedSecret, + ) + + const parsedPayload: SignAndSendTransactionPayload = + JSON.parse(decryptedPayload) + + const { session } = parsedPayload + + const parsedSession: Session = JSON.parse(session) + + const { title, icon } = await extractWebMetadata(parsedSession.app_url) + + return { title: title || t('generic.anApp'), icon: icon || null } + }, [params]) + + const { execute: onSignAndSendTransaction, loading: signing } = + useAsyncCallback(async () => { + if (!currentAccount?.solanaAddress || !anchorProvider?.connection) return + + try { + const signAndSendTransactionResponse = await signAndSendTransaction( + params.dapp_encryption_public_key, + params.payload, + params.nonce, + ) + + if (!signAndSendTransactionResponse) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { transaction, sendOptions, session } = + signAndSendTransactionResponse + + const parsedSession: Session = JSON.parse(session) + + // TODO: Support Versioned Transactions + const txn = Transaction.from(bs58.decode(transaction)) + + const decision = await walletSignBottomSheetRef?.show({ + type: WalletStandardMessageTypes.signTransaction, + url: parsedSession.app_url, + serializedTxs: [ + txn.serialize({ + requireAllSignatures: false, + }), + ], + }) + + if (!decision) { + const errorParams = new URLSearchParams({ + errorCode: '-32000', + errorMessage: 'User rejected the request', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + const signedTransaction = await anchorProvider?.wallet.signTransaction( + txn, + ) + + if (!signedTransaction) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + const signature = await anchorProvider?.sendAndConfirm( + signedTransaction, + undefined, + sendOptions, + ) + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const [nonce, encryptedPayload] = encryptPayload( + JSON.stringify({ signature }), + sharedSecret, + ) + + const searchParams = new URLSearchParams({ + nonce: bs58.encode(nonce), + data: bs58.encode(encryptedPayload), + }) + + Linking.openURL(`${params.redirect_link}?${searchParams.toString()}`) + } catch { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + } + }) + + const onCancel = useCallback(() => { + if (navigation.canGoBack()) { + navigation.popToTop() + } else { + navigation.reset({ + index: 0, + routes: [ + { + name: currentAccount + ? 'ServiceSheetNavigator' + : 'OnboardingNavigator', + }, + ], + }) + } + }, [navigation, currentAccount]) + + if ( + !params.nonce || + !params.dapp_encryption_public_key || + !params.redirect_link || + !params.payload + ) { + return + } + + return ( + + + + {t('SignAndSendTransaction.title')} + + + {t('SignAndSendTransaction.subtitle', { + appName: appMetadata?.title || t('generic.anApp'), + })} + + + + + + + + + ) +} + +export default SignAndSendTransaction diff --git a/src/features/provider-methods/SignMessage.tsx b/src/features/provider-methods/SignMessage.tsx new file mode 100644 index 00000000..4f2a4619 --- /dev/null +++ b/src/features/provider-methods/SignMessage.tsx @@ -0,0 +1,199 @@ +import React, { useCallback, useMemo } from 'react' +import Box from '@components/Box' +import Text from '@components/Text' +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' +import { RootNavigationProp, RootStackParamList } from '@app/rootTypes' +import ScrollBox from '@components/ScrollBox' +import { useSpacing } from '@config/theme/themeHooks' +import { Linking, ViewStyle } from 'react-native' +import { useTranslation } from 'react-i18next' +import ImageBox from '@components/ImageBox' +import ButtonPressable from '@components/ButtonPressable' +import { useAsync, useAsyncCallback } from 'react-async-hook' +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import { useSolana } from '@features/solana/SolanaProvider' +import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes' +import ErrorDetected from './components/ErrorDetected' +import useSession, { Session, SignMessagePayload } from './hooks/useSession' +import extractWebMetadata from './utils' + +type Route = RouteProp +export const SignMessage = () => { + const { params } = useRoute() + const spacing = useSpacing() + const { t } = useTranslation('') + const navigation = useNavigation() + const { currentAccount } = useAccountStorage() + const { anchorProvider, signMsg } = useSolana() + const { signMessage, getSharedSecret, encryptPayload, decryptPayload } = + useSession() + + const { result: appMetadata } = useAsync(async () => { + if (!params.nonce || !params.dapp_encryption_public_key || !params.payload) + return { + title: t('generic.anApp'), + icon: null, + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const decryptedPayload = await decryptPayload( + params.payload, + params.nonce, + sharedSecret, + ) + + const parsedPayload: SignMessagePayload = JSON.parse(decryptedPayload) + + const { session } = parsedPayload + + const parsedSession: Session = JSON.parse(session) + + const { title, icon } = await extractWebMetadata(parsedSession.app_url) + + return { title: title || t('generic.anApp'), icon: icon || null } + }, [params]) + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + + const { execute: onSignMessage, loading: signing } = useAsyncCallback( + async () => { + if (!currentAccount?.solanaAddress || !anchorProvider?.connection) return + + try { + const signMessageResponse = await signMessage( + params.dapp_encryption_public_key, + params.payload, + params.nonce, + ) + + if (!signMessageResponse) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { message } = signMessageResponse + + const signature = await signMsg(bs58.decode(message)) + + if (!signature) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const [nonce, encryptedPayload] = encryptPayload( + JSON.stringify({ signature: bs58.encode(signature) }), + sharedSecret, + ) + + const searchParams = new URLSearchParams({ + nonce: bs58.encode(nonce), + data: bs58.encode(encryptedPayload), + }) + + Linking.openURL(`${params.redirect_link}?${searchParams.toString()}`) + } catch { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + } + }, + ) + + const onCancel = useCallback(() => { + if (navigation.canGoBack()) { + navigation.popToTop() + } else { + navigation.reset({ + index: 0, + routes: [ + { + name: currentAccount + ? 'ServiceSheetNavigator' + : 'OnboardingNavigator', + }, + ], + }) + } + }, [navigation, currentAccount]) + + if ( + !params.nonce || + !params.dapp_encryption_public_key || + !params.redirect_link || + !params.payload + ) { + return + } + + return ( + + + + {t('SignMessage.title')} + + + {t('SignMessage.subtitle', { + appName: appMetadata?.title || t('generic.anApp'), + })} + + + + + + + + + ) +} + +export default SignMessage diff --git a/src/features/provider-methods/SignTransaction.tsx b/src/features/provider-methods/SignTransaction.tsx new file mode 100644 index 00000000..c21b40c8 --- /dev/null +++ b/src/features/provider-methods/SignTransaction.tsx @@ -0,0 +1,233 @@ +import React, { useCallback, useMemo } from 'react' +import Box from '@components/Box' +import Text from '@components/Text' +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native' +import { RootNavigationProp, RootStackParamList } from '@app/rootTypes' +import ScrollBox from '@components/ScrollBox' +import { useSpacing } from '@config/theme/themeHooks' +import { Linking, ViewStyle } from 'react-native' +import { useTranslation } from 'react-i18next' +import ImageBox from '@components/ImageBox' +import ButtonPressable from '@components/ButtonPressable' +import { Transaction } from '@solana/web3.js' +import { useWalletSign } from '@features/solana/WalletSignProvider' +import { WalletStandardMessageTypes } from '@features/solana/walletSignBottomSheetTypes' +import { useSolana } from '@features/solana/SolanaProvider' +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import { useAsync, useAsyncCallback } from 'react-async-hook' +import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes' +import useSession, { Session, SignTransactionPayload } from './hooks/useSession' +import ErrorDetected from './components/ErrorDetected' +import extractWebMetadata from './utils' + +type Route = RouteProp +export const SignTransaction = () => { + const { params } = useRoute() + const spacing = useSpacing() + const navigation = useNavigation() + const { t } = useTranslation('') + const { walletSignBottomSheetRef } = useWalletSign() + const { anchorProvider } = useSolana() + const { currentAccount } = useAccountStorage() + const { signTransaction, getSharedSecret, encryptPayload, decryptPayload } = + useSession() + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + + const { result: appMetadata } = useAsync(async () => { + if (!params.nonce || !params.dapp_encryption_public_key || !params.payload) + return { + title: t('generic.anApp'), + icon: null, + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const decryptedPayload = await decryptPayload( + params.payload, + params.nonce, + sharedSecret, + ) + + const parsedPayload: SignTransactionPayload = JSON.parse(decryptedPayload) + + const { session } = parsedPayload + + const parsedSession: Session = JSON.parse(session) + + const { title, icon } = await extractWebMetadata(parsedSession.app_url) + + return { title: title || t('generic.anApp'), icon: icon || null } + }, [params]) + + const { execute: onSignTransaction, loading: signing } = useAsyncCallback( + async () => { + if (!currentAccount?.solanaAddress || !anchorProvider?.connection) return + + try { + const signAndSendTransactionResponse = await signTransaction( + params.dapp_encryption_public_key, + params.payload, + params.nonce, + ) + + if (!signAndSendTransactionResponse) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { transaction, session } = signAndSendTransactionResponse + + const parsedSession: Session = JSON.parse(session) + + // TODO: Support Versioned Transactions + const txn = Transaction.from(bs58.decode(transaction)) + + const decision = await walletSignBottomSheetRef?.show({ + type: WalletStandardMessageTypes.signTransaction, + url: parsedSession.app_url, + serializedTxs: [ + txn.serialize({ + requireAllSignatures: false, + }), + ], + theme: 'light', + }) + + if (!decision) { + const errorParams = new URLSearchParams({ + errorCode: '-32000', + errorMessage: 'User rejected the request', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + const signedTransaction = await anchorProvider?.wallet.signTransaction( + txn, + ) + + if (!signedTransaction) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + return + } + + const sharedSecret = await getSharedSecret( + params.dapp_encryption_public_key, + ) + + const [nonce, encryptedPayload] = encryptPayload( + JSON.stringify({ + transaction: bs58.encode(signedTransaction.serialize()), + }), + sharedSecret, + ) + + const searchParams = new URLSearchParams({ + nonce: bs58.encode(nonce), + data: bs58.encode(encryptedPayload), + }) + + Linking.openURL(`${params.redirect_link}?${searchParams.toString()}`) + } catch (e) { + const errorParams = new URLSearchParams({ + errorCode: '-32603', + errorMessage: 'Failed to connect to the provider', + }) + + Linking.openURL(`${params.redirect_link}?${errorParams.toString()}`) + } + }, + ) + + const onCancel = useCallback(() => { + if (navigation.canGoBack()) { + navigation.popToTop() + } else { + navigation.reset({ + index: 0, + routes: [ + { + name: currentAccount + ? 'ServiceSheetNavigator' + : 'OnboardingNavigator', + }, + ], + }) + } + }, [navigation, currentAccount]) + + if ( + !params.nonce || + !params.dapp_encryption_public_key || + !params.redirect_link || + !params.payload + ) { + return + } + + return ( + + + + {t('SignTransaction.title')} + + + {t('SignTransaction.subtitle', { + appName: appMetadata?.title || t('generic.anApp'), + })} + + + + + + + + + ) +} + +export default SignTransaction diff --git a/src/features/provider-methods/components/ErrorDetected.tsx b/src/features/provider-methods/components/ErrorDetected.tsx new file mode 100644 index 00000000..0f2e0a07 --- /dev/null +++ b/src/features/provider-methods/components/ErrorDetected.tsx @@ -0,0 +1,63 @@ +import Box from '@components/Box' +import ButtonPressable from '@components/ButtonPressable' +import ImageBox from '@components/ImageBox' +import ScrollBox from '@components/ScrollBox' +import Text from '@components/Text' +import { useSpacing } from '@config/theme/themeHooks' +import { useNavigation } from '@react-navigation/native' +import React, { memo, useCallback, useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { ViewStyle } from 'react-native' + +const ErrorDetected = () => { + const spacing = useSpacing() + const navigation = useNavigation() + const { t } = useTranslation() + + const onBack = useCallback(() => { + navigation.goBack() + }, [navigation]) + + const contentContainerStyle = useMemo(() => { + return { + flexGrow: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing['2xl'], + gap: spacing.xl, + } + }, [spacing]) + + return ( + + + + {t('ErrorDetected.title')} + + + {t('ErrorDetected.subtitle', { appName: 'Builder App' })} + + + + + + + + + ) +} + +export default memo(ErrorDetected) diff --git a/src/features/provider-methods/hooks/useSession.ts b/src/features/provider-methods/hooks/useSession.ts new file mode 100644 index 00000000..2768ecd8 --- /dev/null +++ b/src/features/provider-methods/hooks/useSession.ts @@ -0,0 +1,376 @@ +import { useAccountStorage } from '@config/storage/AccountStorageProvider' +import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes' +import { SendOptions } from '@solana/web3.js' +import { solAddressToHelium } from '@utils/accountUtils' +import { isEqual } from 'lodash' +import { useCallback } from 'react' +import tweetnacl from 'tweetnacl' +import * as LargeSecureStorage from '@config/storage/largeSecureStorage' + +const APP_SESSIONS_KEY = 'appSessions' + +// eslint-disable-next-line @typescript-eslint/naming-convention +type APP_SESSIONS = Record + +// eslint-disable-next-line @typescript-eslint/naming-convention +type APP_SESSION = { + // shared secret key for the session + secretKey: string + session: string + // public key that is connected to the session + publicKey: string +} + +export type Session = { + app_url: string + timestamp: string + chain?: string + cluster?: string +} + +export type DisconnectPayload = { + session: string +} + +export type SignTransactionPayload = { + transaction: string + session: string // token received from connect-method +} + +export type SignMessagePayload = { + message: string + session: string // token received from connect-method + display?: 'utf8' | 'hex' +} + +export type SignTransactionsPayload = { + transactions: string[] // serialized transactions, bs58-encoded + session: string // token received from connect-method +} + +export type SignAndSendTransactionPayload = { + transaction: string // serialized transaction, base58-encoded + session: string // token received from connect-method + sendOptions?: SendOptions // an optional Solana web3.js sendOptions object +} + +const useSession = () => { + const { accounts, setCurrentAccount } = useAccountStorage() + + const getSharedSecret = useCallback( + async (dapp_encryption_public_key: string) => { + const existingStorage = await LargeSecureStorage.getItem(APP_SESSIONS_KEY) + let existingStorageParsed: APP_SESSIONS = {} + + if (existingStorage) { + existingStorageParsed = JSON.parse(existingStorage) + } + + if (!existingStorageParsed[dapp_encryption_public_key]) { + throw new Error('Session not found') + } + + const appSession: APP_SESSION = JSON.parse( + existingStorageParsed[dapp_encryption_public_key], + ) as APP_SESSION + + const sharedSecret = tweetnacl.box.before( + bs58.decode(dapp_encryption_public_key), + bs58.decode(appSession.secretKey), + ) + + return sharedSecret + }, + [], + ) + + const encryptPayload = useCallback( + (payload: string, sharedSecret?: Uint8Array) => { + if (!sharedSecret) throw new Error('missing shared secret') + + const nonce = tweetnacl.randomBytes(24) + + const encryptedPayload = tweetnacl.box.after( + Buffer.from(payload), + nonce, + sharedSecret, + ) + + return [nonce, encryptedPayload] + }, + [], + ) + + const decryptPayload = useCallback( + (data: string, nonce: string, sharedSecret?: Uint8Array) => { + if (!sharedSecret) throw new Error('missing shared secret') + + const decryptedData = tweetnacl.box.open.after( + bs58.decode(data), + bs58.decode(nonce), + sharedSecret, + ) + if (!decryptedData) { + throw new Error('Unable to decrypt data') + } + return JSON.parse(Buffer.from(decryptedData).toString('utf8')) + }, + [], + ) + + const connect = useCallback( + async ( + userPublicKey: string, + dapp_encryption_public_key: string, + session: Session, + ) => { + if (!dapp_encryption_public_key) return + if (!session?.app_url || !session?.timestamp) return + + const { publicKey: heliumEncryptionPublicKey, secretKey } = + tweetnacl.box.keyPair() + + const sharedSecret = tweetnacl.box.before( + bs58.decode(dapp_encryption_public_key), + secretKey, + ) + + const existingStorage = await LargeSecureStorage.getItem(APP_SESSIONS_KEY) + let existingStorageParsed: APP_SESSIONS = {} + + if (existingStorage) { + existingStorageParsed = JSON.parse(existingStorage) + } + + existingStorageParsed[dapp_encryption_public_key] = JSON.stringify({ + secretKey: bs58.encode(secretKey), + session: JSON.stringify(session), + publicKey: userPublicKey, + }) + + await LargeSecureStorage.setItem( + APP_SESSIONS_KEY, + JSON.stringify(existingStorageParsed), + ) + + const [nonce, encryptedPayload] = encryptPayload( + JSON.stringify({ + session: JSON.stringify(session), + public_key: userPublicKey, + }), + sharedSecret, + ) + + return { + helium_encryption_public_key: bs58.encode(heliumEncryptionPublicKey), + nonce: bs58.encode(nonce), + data: bs58.encode(encryptedPayload), + } + }, + [encryptPayload], + ) + + const disconnect = useCallback( + async ( + dapp_encryption_public_key: string, + payload: string, + nonce: string, + ) => { + if (!dapp_encryption_public_key) return + + const existingStorage = await LargeSecureStorage.getItem(APP_SESSIONS_KEY) + let existingStorageParsed: APP_SESSIONS = {} + + if (existingStorage) { + existingStorageParsed = JSON.parse(existingStorage) + } + + if (!existingStorageParsed[dapp_encryption_public_key]) return + + const appSession: APP_SESSION = JSON.parse( + existingStorageParsed[dapp_encryption_public_key], + ) as APP_SESSION + + const { secretKey, session: storedSession } = appSession + + const sharedSecret = tweetnacl.box.before( + bs58.decode(dapp_encryption_public_key), + bs58.decode(secretKey), + ) + + const { session } = decryptPayload(payload, nonce, sharedSecret) + + // check if session and storedSession objects are equal + if (!isEqual(session, storedSession)) { + throw new Error('Session is not valid') + } + + delete existingStorageParsed[dapp_encryption_public_key] + + await LargeSecureStorage.setItem( + APP_SESSIONS_KEY, + JSON.stringify(existingStorageParsed), + ) + }, + [decryptPayload], + ) + + const getSignPayload = useCallback( + async ( + dapp_encryption_public_key: string, + payload: string, + nonce: string, + ) => { + if (!dapp_encryption_public_key || !accounts) return + + const existingStorage = await LargeSecureStorage.getItem(APP_SESSIONS_KEY) + if (!existingStorage) { + throw new Error('No sessions found') + } + + const existingStorageParsed: APP_SESSIONS = JSON.parse(existingStorage) + + if (!existingStorageParsed[dapp_encryption_public_key]) { + throw new Error('Session not found') + } + + const { + secretKey, + session: storedSession, + publicKey, + } = JSON.parse( + existingStorageParsed[dapp_encryption_public_key], + ) as APP_SESSION + + const sharedSecret = tweetnacl.box.before( + bs58.decode(dapp_encryption_public_key), + bs58.decode(secretKey), + ) + + const payloadData = decryptPayload(payload, nonce, sharedSecret) + + const { session } = payloadData + + if (!isEqual(session, storedSession)) { + throw new Error('Session is not valid') + } + + const account = accounts[solAddressToHelium(publicKey)] + + if (!account) { + throw new Error('Account not found please reconnect') + } + + setCurrentAccount(account) + + return payloadData + }, + [accounts, setCurrentAccount, decryptPayload], + ) + + const signTransaction = useCallback( + async ( + dapp_encryption_public_key: string, + payload: string, + nonce: string, + ) => { + const signTxnPayload: SignTransactionPayload = await getSignPayload( + dapp_encryption_public_key, + payload, + nonce, + ) + + if (!signTxnPayload) { + throw new Error('Sign transaction payload not found') + } + + return signTxnPayload + }, + [getSignPayload], + ) + + const signMessage = useCallback( + async ( + dapp_encryption_public_key: string, + payload: string, + nonce: string, + ) => { + const signMessagePayload: string | undefined = await getSignPayload( + dapp_encryption_public_key, + payload, + nonce, + ) + + if (!signMessagePayload) { + throw new Error('Sign message payload not found') + } + + const parsedPayload: SignMessagePayload = JSON.parse(signMessagePayload) + + return parsedPayload + }, + [getSignPayload], + ) + + const signAllTransactions = useCallback( + async ( + dapp_encryption_public_key: string, + payload: string, + nonce: string, + ) => { + const signTransactionsPayload: string | undefined = await getSignPayload( + dapp_encryption_public_key, + payload, + nonce, + ) + + if (!signTransactionsPayload) { + throw new Error('Sign transactions payload not found') + } + + const parsedPayload: SignTransactionsPayload = JSON.parse( + signTransactionsPayload, + ) + + return parsedPayload + }, + [getSignPayload], + ) + + const signAndSendTransaction = useCallback( + async ( + dapp_encryption_public_key: string, + payload: string, + nonce: string, + ) => { + const signAndSendTransactionPayload: string | undefined = + await getSignPayload(dapp_encryption_public_key, payload, nonce) + + if (!signAndSendTransactionPayload) { + throw new Error('Sign and send transaction payload not found') + } + + const parsedPayload: SignAndSendTransactionPayload = JSON.parse( + signAndSendTransactionPayload, + ) + + return parsedPayload + }, + [getSignPayload], + ) + + return { + connect, + disconnect, + getSignPayload, + signTransaction, + signMessage, + signAllTransactions, + signAndSendTransaction, + getSharedSecret, + encryptPayload, + decryptPayload, + } +} + +export default useSession diff --git a/src/features/provider-methods/utils/index.ts b/src/features/provider-methods/utils/index.ts new file mode 100644 index 00000000..cdb8df2e --- /dev/null +++ b/src/features/provider-methods/utils/index.ts @@ -0,0 +1,146 @@ +import axios from 'axios' +import cheerio from 'react-native-cheerio' + +export type ConnectMethod = { + app_url: string + dapp_encryption_public_key: string + redirect_link: string + cluster?: string +} + +export type DisconnectMethod = { + dapp_encryption_public_key: string + nonce: string + redirect_link: string + payload: string + /** Encrypted JSON string with the following structure: + * { + * "session": "...", // token received from connect-method + * } + */ +} + +export type SignAndSendTransactionMethod = { + dapp_encryption_public_key: string + nonce: string + redirect_link: string + payload: string + /** Encrypted JSON string with the following structure: + * { + * "transaction": "...", // serialized transaction, base58-encoded + * "sendOptions": "..." // an optional Solana web3.js sendOptions object + * "session": "...", // token received from the connect method + * } + * + * transaction (required): The transaction that Helium will sign and submit, serialized and encoded in base58. + * sendOptions (optional): An optional object that specifies options for how Helium should submit the transaction. This object is defined in Solana web3.js. + * session (required): The session token received from the Connect method. + */ +} + +export type SignAllTransactionsMethod = { + dapp_encryption_public_key: string + nonce: string + redirect_link: string + payload: string + /** Encrypted JSON string with the following structure: + * { + * "transactions": "...", // serialized transactions, base58 encoded + * "session": "...", // token received from connect-method + * } + * transactions (required): An array of serialized transactions, encoded in base58. + * session (required): The session token received from the Connect method. + */ +} + +export type SignTransactionMethod = { + dapp_encryption_public_key: string + nonce: string + redirect_link: string + payload: string + /** Encrypted JSON string with the following structure: + * { + * "transaction": "...", // serialized transaction, base58 encoded + * "session": "...", // token received from connect-method + * } + */ +} + +export type SignMessageMethod = { + dapp_encryption_public_key: string + nonce: string + redirect_link: string + payload: string + /** Encrypted JSON string with the following structure: + * { + * "message": "...", // the message, base58 encoded + * "session": "...", // token received from connect-method + * "display": "utf8" | "hex", // the encoding to use when displaying the message + * } + * message (required): The message that should be signed by the user, encoded in base58. Helium will display this message to the user when they are prompted to sign. + * session (required): The session token received from the Connect method. Please see Handling Sessions for more details. + * display (optional): How you want us to display the string to the user. Defaults to utf8 + */ +} + +/** + * Extracts metadata (title and icon) from a given URL + * @param {string} url - The URL to scrape + * @returns {Promise} An object containing extracted title and icon + */ +export const extractWebMetadata = async (url: string) => { + try { + // Fetch the webpage content + const response = await axios.get(url, { + headers: { + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + }, + }) + + // Parse the HTML content + const $ = cheerio.load(response.data) + + // Title Extraction + let title: string | null | undefined = null + + // Primary lookup: Open Graph title + title = $('meta[property="og:title"]').attr('content') + + // Secondary lookup: Document title (if Open Graph title not found) + if (!title) { + title = $('title').text().trim() + } + + // Icon Extraction + let icon: string | null | undefined = null + + // Primary lookup: Apple touch icon + icon = $('link[rel="apple-touch-icon"]').attr('href') + + // Secondary lookup: Favicon + if (!icon) { + icon = + $('link[rel="icon"]').attr('href') || + $('link[rel="shortcut icon"]').attr('href') + } + + // Resolve relative URLs + if (icon && !icon.startsWith('http')) { + const urlObj = new URL(url) + icon = new URL(icon, urlObj.origin).href + } + + return { + title: title || null, + icon: icon || null, + } + } catch { + return { + title: null, + icon: null, + } + } +} + +export default extractWebMetadata diff --git a/src/features/solana/WalletSIgnBottomSheetSimulated.tsx b/src/features/solana/WalletSIgnBottomSheetSimulated.tsx index b0494e4c..89920f20 100644 --- a/src/features/solana/WalletSIgnBottomSheetSimulated.tsx +++ b/src/features/solana/WalletSIgnBottomSheetSimulated.tsx @@ -410,11 +410,11 @@ export const WalletSignBottomSheetSimulated = ({ @@ -493,7 +493,7 @@ export const WalletSignBottomSheetSimulated = ({ @@ -524,7 +524,7 @@ export const WalletSignBottomSheetSimulated = ({ diff --git a/src/features/solana/WalletSignBottomSheet.tsx b/src/features/solana/WalletSignBottomSheet.tsx index 654ac520..76f6790e 100644 --- a/src/features/solana/WalletSignBottomSheet.tsx +++ b/src/features/solana/WalletSignBottomSheet.tsx @@ -17,7 +17,7 @@ import React, { useState, } from 'react' import { ThemeProvider } from '@shopify/restyle' -import { darkTheme } from '@config/theme/theme' +import { darkTheme, lightTheme } from '@config/theme/theme' import { StyleProp, ViewStyle } from 'react-native' import { WalletSignBottomSheetProps, @@ -47,6 +47,7 @@ const WalletSignBottomSheet = forwardRef( serializedTxs: undefined, header: undefined, suppressWarnings: false, + theme: 'dark', }) const hasRenderer = walletSignOpts.renderer !== undefined @@ -128,7 +129,10 @@ const WalletSignBottomSheet = forwardRef( ref={bottomSheetModalRef} index={0} backgroundStyle={{ - backgroundColor: darkTheme.colors.primaryBackground, + backgroundColor: + walletSignOpts.theme === 'light' + ? lightTheme.colors.primaryBackground + : darkTheme.colors.primaryBackground, borderRadius: borderRadii['4xl'] + borderRadii['4xl'], }} backdropComponent={renderBackdrop} @@ -145,7 +149,9 @@ const WalletSignBottomSheet = forwardRef( }} enableDynamicSizing > - + {hasRenderer && !simulated ? ( diff --git a/src/features/solana/WalletSignBottomSheetTransaction.tsx b/src/features/solana/WalletSignBottomSheetTransaction.tsx index df97a24d..8876d1b5 100644 --- a/src/features/solana/WalletSignBottomSheetTransaction.tsx +++ b/src/features/solana/WalletSignBottomSheetTransaction.tsx @@ -123,7 +123,7 @@ const WalletSignBottomSheetTransaction = ({ {uncollapsedAccounts.map((writableAccount) => ( - + {body} diff --git a/src/features/solana/WritableAccountPreview.tsx b/src/features/solana/WritableAccountPreview.tsx index 469409d6..68a0255f 100644 --- a/src/features/solana/WritableAccountPreview.tsx +++ b/src/features/solana/WritableAccountPreview.tsx @@ -118,7 +118,7 @@ export const WritableAccountPreview = ({ flexDirection="row" justifyContent="space-between" alignItems="stretch" - backgroundColor="gray.900" + backgroundColor="cardBackground" borderTopLeftRadius="2xl" borderTopRightRadius="2xl" padding="2" @@ -127,7 +127,7 @@ export const WritableAccountPreview = ({ {t('browserScreen.estimatedAccountChanges')} - + {writableAccount.pre.account && !writableAccount.post.account && ( @@ -188,7 +188,7 @@ export const WritableAccountPreview = ({ flexDirection="row" justifyContent="space-between" alignItems="stretch" - backgroundColor="gray.900" + backgroundColor="cardBackground" borderTopLeftRadius="2xl" borderTopRightRadius="2xl" padding="2" @@ -197,14 +197,14 @@ export const WritableAccountPreview = ({ {t('browserScreen.instructionsAndPrograms')} - + {instructions.map(({ parsed, raw }, index) => ( ReactNode + theme?: 'light' | 'dark' } export type WalletSignBottomSheetRef = { diff --git a/src/features/swaps/SwapScreen.tsx b/src/features/swaps/SwapScreen.tsx index 083b36d0..ae9ff9d2 100644 --- a/src/features/swaps/SwapScreen.tsx +++ b/src/features/swaps/SwapScreen.tsx @@ -67,13 +67,13 @@ import { Keyboard, Image, } from 'react-native' -import { Edge, useSafeAreaInsets } from 'react-native-safe-area-context' -import { NavBarHeight } from '@components/ServiceNavBar' +import { Edge } from 'react-native-safe-area-context' import SegmentedControl from '@components/SegmentedControl' import { Portal } from '@gorhom/portal' import ScrollBox from '@components/ScrollBox' import changeNavigationBarColor from 'react-native-navigation-bar-color' import { useSolana } from '@features/solana/SolanaProvider' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { solAddressIsValid } from '../../utils/accountUtils' import SwapItem from './SwapItem' import { SwapNavigationProp } from './swapTypes' @@ -88,7 +88,7 @@ enum SelectorMode { const SwapScreen = () => { const { t } = useTranslation() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const spacing = useSpacing() const { currentAccount } = useAccountStorage() const { isDevnet, anchorProvider, connection } = useSolana() @@ -704,9 +704,7 @@ const SwapScreen = () => { flex={1} paddingHorizontal="5" style={{ - marginBottom: slippageInfoVisible - ? 0 - : NavBarHeight + bottom + spacing['2xl'], + marginBottom: slippageInfoVisible ? 0 : bottomSpacing, }} > diff --git a/src/features/txnDelegation/LinkWallet.tsx b/src/features/txnDelegation/LinkWallet.tsx index 2f86b663..7d9ee0ee 100644 --- a/src/features/txnDelegation/LinkWallet.tsx +++ b/src/features/txnDelegation/LinkWallet.tsx @@ -133,17 +133,29 @@ const LinkWallet = () => { }, []) return ( - + <> - + {t('linkWallet.title', { appName })} - + {t('linkWallet.body', { appName })} @@ -158,12 +170,16 @@ const LinkWallet = () => { - + {t('linkWallet.yes')} @@ -181,7 +197,8 @@ const LinkWallet = () => { - + + ) } diff --git a/src/features/wallet/AccountManageTokenListScreen.tsx b/src/features/wallet/AccountManageTokenListScreen.tsx index 2fc9f217..49fa5b60 100644 --- a/src/features/wallet/AccountManageTokenListScreen.tsx +++ b/src/features/wallet/AccountManageTokenListScreen.tsx @@ -23,8 +23,8 @@ import BackScreen from '@components/BackScreen' import ScrollBox from '@components/ScrollBox' import { BoxProps } from '@shopify/restyle' import { Theme } from '@config/theme/theme' -import { NavBarHeight } from '@components/ServiceNavBar' import { useSolana } from '@features/solana/SolanaProvider' +import { useBottomSpacing } from '@hooks/useBottomSpacing' import { syncTokenAccounts } from '../../store/slices/balancesSlice' import { useAppDispatch } from '../../store/store' import AccountTokenCurrencyBalance from './AccountTokenCurrencyBalance' @@ -114,6 +114,8 @@ const CheckableTokenListItem = ({ const AccountManageTokenListScreen: React.FC = () => { const { visibleTokens, setVisibleTokens } = useVisibleTokens() const { tokenAccounts } = useBalance() + const bottomSpacing = useBottomSpacing() + const mints = useMemo(() => { return tokenAccounts ?.filter( @@ -185,7 +187,7 @@ const AccountManageTokenListScreen: React.FC = () => { renderItem={renderItem} keyExtractor={keyExtractor} contentContainerStyle={{ - paddingBottom: NavBarHeight, + paddingBottom: bottomSpacing, }} /> diff --git a/src/features/wallet/AirdropScreen.tsx b/src/features/wallet/AirdropScreen.tsx index bc011d2e..1351b3ea 100644 --- a/src/features/wallet/AirdropScreen.tsx +++ b/src/features/wallet/AirdropScreen.tsx @@ -23,16 +23,15 @@ import { withRepeat, withTiming, } from 'react-native-reanimated' -import { useSafeAreaInsets } from 'react-native-safe-area-context' import ScrollBox from '@components/ScrollBox' import HNT from '@assets/svgs/hnt.svg' import { useMetaplexMetadata } from '@hooks/useMetaplexMetadata' -import { NavBarHeight } from '@components/ServiceNavBar' import { WalletNavigationProp, WalletStackParamList, } from 'src/app/services/WalletService/pages/WalletPage' import { useSolana } from '@features/solana/SolanaProvider' +import { useBottomSpacing } from '@hooks/useBottomSpacing' const DROP_HEIGHT = 79 @@ -40,7 +39,7 @@ type Route = RouteProp const AirdropScreen = () => { const navigation = useNavigation() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const { currentAccount } = useAccountStorage() const { anchorProvider } = useSolana() const { t } = useTranslation() @@ -192,7 +191,7 @@ const AirdropScreen = () => { { const widgetGroup = 'group.com.helium.mobile.wallet.widget' @@ -50,7 +49,7 @@ const TokensScreen = () => { const { visibleTokens } = useVisibleTokens() const colors = useColors() const spacing = useSpacing() - const { bottom } = useSafeAreaInsets() + const bottomSpacing = useBottomSpacing() const { currentAccount, sortedAccounts, defaultAccountAddress } = useAccountStorage() const dispatch = useAppDispatch() @@ -212,9 +211,9 @@ const TokensScreen = () => { () => ({ backgroundColor: colors['base.white'], paddingTop: spacing['4'], - paddingBottom: NavBarHeight + bottom, + paddingBottom: bottomSpacing, }), - [colors, spacing, bottom], + [colors, spacing, bottomSpacing], ) useEffect(() => { diff --git a/src/hooks/useBottomSpacing.ts b/src/hooks/useBottomSpacing.ts new file mode 100644 index 00000000..490b56c8 --- /dev/null +++ b/src/hooks/useBottomSpacing.ts @@ -0,0 +1,10 @@ +import { NavBarHeight } from '@components/ServiceNavBar' +import { useSpacing } from '@config/theme/themeHooks' +import { useSafeAreaInsets } from 'react-native-safe-area-context' + +export const useBottomSpacing = () => { + const { bottom } = useSafeAreaInsets() + const spacing = useSpacing() + + return (bottom || spacing['2xl']) + NavBarHeight + spacing.xs +} diff --git a/src/utils/linking.ts b/src/utils/linking.ts index 5b658600..7fd08ef5 100644 --- a/src/utils/linking.ts +++ b/src/utils/linking.ts @@ -30,6 +30,12 @@ export const authenticatedLinking: LinkingOptions = { PaymentScreen: 'payment', DappLoginScreen: 'dapp_login', ImportPrivateKey: 'import_key/:key', + Connect: 'ul/v1/connect', + Disconnect: 'ul/v1/disconnect', + SignTransaction: 'ul/v1/signTransaction', + SignMessage: 'ul/v1/signMessage', + SignAllTransactions: 'ul/v1/signAllTransactions', + SignAndSendTransaction: 'ul/v1/signAndSendTransaction', ServiceSheetNavigator: { screens: { Governance: { diff --git a/yarn.lock b/yarn.lock index e8a32693..5d923850 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1904,6 +1904,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.23.2": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a + languageName: node + linkType: hard + "@babel/runtime@npm:^7.25.0": version: 7.25.7 resolution: "@babel/runtime@npm:7.25.7" @@ -1913,7 +1922,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.0.0, @babel/template@npm:^7.20.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.0.0, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": version: 7.25.0 resolution: "@babel/template@npm:7.25.0" dependencies: @@ -2018,7 +2027,7 @@ __metadata: languageName: node linkType: hard -"@bonfida/spl-name-service@npm:^1.1.1": +"@bonfida/spl-name-service@npm:1.1.1": version: 1.1.1 resolution: "@bonfida/spl-name-service@npm:1.1.1" dependencies: @@ -2075,7 +2084,7 @@ __metadata: languageName: node linkType: hard -"@coral-xyz/anchor@npm:^0.28.0": +"@coral-xyz/anchor@npm:0.28.0, @coral-xyz/anchor@npm:^0.28.0": version: 0.28.0 resolution: "@coral-xyz/anchor@npm:0.28.0" dependencies: @@ -3163,28 +3172,15 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/add@npm:^5.0.3": - version: 5.0.3 - resolution: "@graphql-codegen/add@npm:5.0.3" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.3 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 5196b6c64907f03dc1adc0ac4f98ed5fe69abe0eb87027a55dfc14b178cc1fee2bc47f68c8f5a68ce7aa4bc5a4f970f983d1d85b6d7a20489e50657baccd2ad0 - languageName: node - linkType: hard - -"@graphql-codegen/cli@npm:^5.0.0": - version: 5.0.3 - resolution: "@graphql-codegen/cli@npm:5.0.3" +"@graphql-codegen/cli@npm:5.0.0": + version: 5.0.0 + resolution: "@graphql-codegen/cli@npm:5.0.0" dependencies: "@babel/generator": ^7.18.13 "@babel/template": ^7.18.10 "@babel/types": ^7.18.13 - "@graphql-codegen/client-preset": ^4.4.0 - "@graphql-codegen/core": ^4.0.2 - "@graphql-codegen/plugin-helpers": ^5.0.3 + "@graphql-codegen/core": ^4.0.0 + "@graphql-codegen/plugin-helpers": ^5.0.1 "@graphql-tools/apollo-engine-loader": ^8.0.0 "@graphql-tools/code-file-loader": ^8.0.0 "@graphql-tools/git-loader": ^8.0.0 @@ -3195,12 +3191,12 @@ __metadata: "@graphql-tools/prisma-loader": ^8.0.0 "@graphql-tools/url-loader": ^8.0.0 "@graphql-tools/utils": ^10.0.0 - "@whatwg-node/fetch": ^0.9.20 + "@whatwg-node/fetch": ^0.8.0 chalk: ^4.1.0 cosmiconfig: ^8.1.3 debounce: ^1.2.0 detect-indent: ^6.0.0 - graphql-config: ^5.1.1 + graphql-config: ^5.0.2 inquirer: ^8.0.0 is-glob: ^4.0.1 jiti: ^1.17.1 @@ -3225,34 +3221,11 @@ __metadata: graphql-code-generator: cjs/bin.js graphql-codegen: cjs/bin.js graphql-codegen-esm: esm/bin.js - checksum: 8a28419b25e73b4edf5006a93243a24ecdcc030b80d19dbf9153326c45382b2654b9275fa5b29035864652e3698196883e93ba593339cba43221c46cc20da697 - languageName: node - linkType: hard - -"@graphql-codegen/client-preset@npm:^4.4.0": - version: 4.5.0 - resolution: "@graphql-codegen/client-preset@npm:4.5.0" - dependencies: - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/template": ^7.20.7 - "@graphql-codegen/add": ^5.0.3 - "@graphql-codegen/gql-tag-operations": 4.0.11 - "@graphql-codegen/plugin-helpers": ^5.1.0 - "@graphql-codegen/typed-document-node": ^5.0.11 - "@graphql-codegen/typescript": ^4.1.1 - "@graphql-codegen/typescript-operations": ^4.3.1 - "@graphql-codegen/visitor-plugin-common": ^5.5.0 - "@graphql-tools/documents": ^1.0.0 - "@graphql-tools/utils": ^10.0.0 - "@graphql-typed-document-node/core": 3.2.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 8247074bdb5210c2822e1f3d9c6a37c21d642a4d2241424f1afefdd3a7a29a984da8b9efd250876d6b8f89e056661c70ed70cb96060e71d0f36d5339405f5ed9 + checksum: 55c3cafb08ee33667a896aa1c56e27ff2b6eae123d6116ff299be308038a543fb7d58c4179f34a3dff64079065d549dc05bfd95208c8c3024cecdd6307c0353b languageName: node linkType: hard -"@graphql-codegen/core@npm:^4.0.2": +"@graphql-codegen/core@npm:^4.0.0": version: 4.0.2 resolution: "@graphql-codegen/core@npm:4.0.2" dependencies: @@ -3266,21 +3239,6 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/gql-tag-operations@npm:4.0.11": - version: 4.0.11 - resolution: "@graphql-codegen/gql-tag-operations@npm:4.0.11" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.1.0 - "@graphql-codegen/visitor-plugin-common": 5.5.0 - "@graphql-tools/utils": ^10.0.0 - auto-bind: ~4.0.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 68d5eac31547b7012551a72a41caa2be532b85e08efe3efaf7744f27ea4b355a59f032a99f3394b1c2d0eea045d30e2216bf5d86379cbc0e926bf51cb12b4de2 - languageName: node - linkType: hard - "@graphql-codegen/plugin-helpers@npm:^2.7.2": version: 2.7.2 resolution: "@graphql-codegen/plugin-helpers@npm:2.7.2" @@ -3313,7 +3271,7 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/plugin-helpers@npm:^5.0.3, @graphql-codegen/plugin-helpers@npm:^5.1.0": +"@graphql-codegen/plugin-helpers@npm:^5.0.0, @graphql-codegen/plugin-helpers@npm:^5.0.1, @graphql-codegen/plugin-helpers@npm:^5.0.3, @graphql-codegen/plugin-helpers@npm:^5.1.0": version: 5.1.0 resolution: "@graphql-codegen/plugin-helpers@npm:5.1.0" dependencies: @@ -3329,7 +3287,7 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/schema-ast@npm:^4.0.2": +"@graphql-codegen/schema-ast@npm:^4.0.0, @graphql-codegen/schema-ast@npm:^4.0.2": version: 4.1.0 resolution: "@graphql-codegen/schema-ast@npm:4.1.0" dependencies: @@ -3342,37 +3300,22 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/typed-document-node@npm:^5.0.11": - version: 5.0.11 - resolution: "@graphql-codegen/typed-document-node@npm:5.0.11" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.1.0 - "@graphql-codegen/visitor-plugin-common": 5.5.0 - auto-bind: ~4.0.0 - change-case-all: 1.0.15 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: c14b16c06910181355c4b3b0d01e023ca394889cf18c1262841280c84c2c00a27692359d8703d4545832183749f185ebf0d519b1ca6970043fce6fb8687aaa9c - languageName: node - linkType: hard - -"@graphql-codegen/typescript-operations@npm:^4.0.1, @graphql-codegen/typescript-operations@npm:^4.3.1": - version: 4.3.1 - resolution: "@graphql-codegen/typescript-operations@npm:4.3.1" +"@graphql-codegen/typescript-operations@npm:4.0.1": + version: 4.0.1 + resolution: "@graphql-codegen/typescript-operations@npm:4.0.1" dependencies: - "@graphql-codegen/plugin-helpers": ^5.1.0 - "@graphql-codegen/typescript": ^4.1.1 - "@graphql-codegen/visitor-plugin-common": 5.5.0 + "@graphql-codegen/plugin-helpers": ^5.0.0 + "@graphql-codegen/typescript": ^4.0.1 + "@graphql-codegen/visitor-plugin-common": 4.0.1 auto-bind: ~4.0.0 - tslib: ~2.6.0 + tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 9618fb8287d6f5d94942da67e48826ae85d9ed2df376a4da686f37438492a4870f209f0473356abd3140762d34021f4c8166a7c8cab63ace8be5f423a8e2f0d3 + checksum: 82cd58ceb7406a3ff7aa5b36a58c9303fd819259679c2de10411f9e22c4fd142068d711714f68259c64eab86ea0a2b3d761959fa59fa5140ca3f1382a5ab5169 languageName: node linkType: hard -"@graphql-codegen/typescript-rtk-query@npm:^3.1.1": +"@graphql-codegen/typescript-rtk-query@npm:3.1.1": version: 3.1.1 resolution: "@graphql-codegen/typescript-rtk-query@npm:3.1.1" dependencies: @@ -3393,7 +3336,22 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/typescript@npm:^4.0.1, @graphql-codegen/typescript@npm:^4.1.1": +"@graphql-codegen/typescript@npm:4.0.1": + version: 4.0.1 + resolution: "@graphql-codegen/typescript@npm:4.0.1" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.0 + "@graphql-codegen/schema-ast": ^4.0.0 + "@graphql-codegen/visitor-plugin-common": 4.0.1 + auto-bind: ~4.0.0 + tslib: ~2.5.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: f360b7204dc33b918d1ece88b65a46a4eac89e7c3f729886e954ebdc405d1279de6fc5a688580a4aba50826ca663dae03bcda2ac72189f5afbfc1a1727d188a6 + languageName: node + linkType: hard + +"@graphql-codegen/typescript@npm:^4.0.1": version: 4.1.1 resolution: "@graphql-codegen/typescript@npm:4.1.1" dependencies: @@ -3428,7 +3386,27 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/visitor-plugin-common@npm:5.5.0, @graphql-codegen/visitor-plugin-common@npm:^5.5.0": +"@graphql-codegen/visitor-plugin-common@npm:4.0.1": + version: 4.0.1 + resolution: "@graphql-codegen/visitor-plugin-common@npm:4.0.1" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.0 + "@graphql-tools/optimize": ^2.0.0 + "@graphql-tools/relay-operation-optimizer": ^7.0.0 + "@graphql-tools/utils": ^10.0.0 + auto-bind: ~4.0.0 + change-case-all: 1.0.15 + dependency-graph: ^0.11.0 + graphql-tag: ^2.11.0 + parse-filepath: ^1.0.2 + tslib: ~2.5.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 72fe72850bcf9907c46ee85cf80ca5f7313418953fc6bc09b761145260ceb9e79199e92c7b3467e9b6371342e70234af5e1be7ee664457a4fdec92ea3bed878a + languageName: node + linkType: hard + +"@graphql-codegen/visitor-plugin-common@npm:5.5.0": version: 5.5.0 resolution: "@graphql-codegen/visitor-plugin-common@npm:5.5.0" dependencies: @@ -3509,18 +3487,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/documents@npm:^1.0.0": - version: 1.0.1 - resolution: "@graphql-tools/documents@npm:1.0.1" - dependencies: - lodash.sortby: ^4.7.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: c6ff859d2673dbf884f19d6319735afacc6bff2df6f8ea3dbf56839d01568f61210f256f0905156f123428cc24962ada26b37903263699fc8cd7efb8849a6508 - languageName: node - linkType: hard - "@graphql-tools/executor-graphql-ws@npm:^1.3.1": version: 1.3.1 resolution: "@graphql-tools/executor-graphql-ws@npm:1.3.1" @@ -3889,26 +3855,26 @@ __metadata: languageName: node linkType: hard -"@helium/account-fetch-cache-hooks@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/account-fetch-cache-hooks@npm:0.9.18" +"@helium/account-fetch-cache-hooks@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/account-fetch-cache-hooks@npm:0.9.14" dependencies: - "@helium/account-fetch-cache": ^0.9.18 + "@helium/account-fetch-cache": ^0.9.14 "@solana/web3.js": ^1.78.8 react-async-hook: ^4.0.0 peerDependencies: react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 - checksum: cb83f66cb17f1ea1d000e5dfc0085612ae8d9e16cfc572f34e7275018bd0068e7ed581786894c02a978b0b7236ea39f58f34a4480fb4409dc2581cc0de903045 + checksum: a72612d800ffe5f8127050f8a5c033ac740cd22ba77d9e1091e3f2b77cfcbf02838da7e76042e6a4c0c2405d32ada1372a6bdbf275f8c55e589e58e36b0451af languageName: node linkType: hard -"@helium/account-fetch-cache@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/account-fetch-cache@npm:0.9.18" +"@helium/account-fetch-cache@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/account-fetch-cache@npm:0.9.14" dependencies: "@solana/web3.js": ^1.78.8 - checksum: 07ba1f9f3357e3185a8d730a4b590695ac6dbd864ae415a4daef4652fa638650a533eb5d1a14499645760e8039b0dbf1a0cb7227057971d07b41848b36ed152b + checksum: 519ed605322ed4ea519068d43666df640f899882e258453c11fe1cb83bcb82b8b5be02b38467ddf5b96cd531051dc9d62c22fccb8265c110e2a5653b3032b3d8 languageName: node linkType: hard @@ -3982,7 +3948,7 @@ __metadata: languageName: node linkType: hard -"@helium/anchor-resolvers@npm:^0.9.18": +"@helium/anchor-resolvers@npm:^0.9.14, @helium/anchor-resolvers@npm:^0.9.15, @helium/anchor-resolvers@npm:^0.9.18": version: 0.9.18 resolution: "@helium/anchor-resolvers@npm:0.9.18" dependencies: @@ -3994,6 +3960,19 @@ __metadata: languageName: node linkType: hard +"@helium/circuit-breaker-sdk@npm:0.9.14, @helium/circuit-breaker-sdk@npm:^0.9.14": + version: 0.9.14 + resolution: "@helium/circuit-breaker-sdk@npm:0.9.14" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/idls": ^0.9.14 + bn.js: ^5.2.0 + bs58: ^4.0.1 + checksum: 1ccbf2ca4de833066b63592756ce4cfc0b5135a97d8f3f3a006d948d226e094ab992a80643ee0ef5436540aa38e69a7bbc97070fef983be89e6ea21eff72b498 + languageName: node + linkType: hard + "@helium/circuit-breaker-sdk@npm:^0.6.6": version: 0.6.6 resolution: "@helium/circuit-breaker-sdk@npm:0.6.6" @@ -4046,6 +4025,16 @@ __metadata: languageName: node linkType: hard +"@helium/currency-utils@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/currency-utils@npm:0.9.14" + dependencies: + "@solana/spl-token": ^0.3.8 + "@solana/web3.js": ^1.78.8 + checksum: 77854dcc5149621ad9b97c54c1419e2f5f0bb7eee6cdacea2c2d56452087627fe4d1323b15eb84ab5f7cf1b58f1fdb051ce94e23edadd6b536f502b08a863480 + languageName: node + linkType: hard + "@helium/currency-utils@npm:^0.6.6": version: 0.6.6 resolution: "@helium/currency-utils@npm:0.6.6" @@ -4067,16 +4056,6 @@ __metadata: languageName: node linkType: hard -"@helium/currency-utils@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/currency-utils@npm:0.9.18" - dependencies: - "@solana/spl-token": ^0.3.8 - "@solana/web3.js": ^1.78.8 - checksum: c43f8f0c21123b506a3b04cc085adfeb77924c735e0ab66348d71d6dbc98ff36285abef9e18309651991dd66a352ae80555f21a47b5924d6fa7ecabecb1e5721 - languageName: node - linkType: hard - "@helium/currency@npm:^4.7.3": version: 4.10.2 resolution: "@helium/currency@npm:4.10.2" @@ -4086,6 +4065,22 @@ __metadata: languageName: node linkType: hard +"@helium/data-credits-sdk@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/data-credits-sdk@npm:0.9.14" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/circuit-breaker-sdk": ^0.9.14 + "@helium/helium-sub-daos-sdk": ^0.9.14 + "@helium/idls": ^0.9.14 + bn.js: ^5.2.0 + bs58: ^4.0.1 + crypto-js: ^4.1.1 + checksum: f6f7204a0de8cb40ee75f58407bb34e17d744af08ae649ecf232abfef104564ddc29f31d978f7b6fa2da644d56f4a9f114aa3dfd453019dfbacf81bb94481f37 + languageName: node + linkType: hard + "@helium/data-credits-sdk@npm:^0.6.6": version: 0.6.6 resolution: "@helium/data-credits-sdk@npm:0.6.6" @@ -4118,37 +4113,20 @@ __metadata: languageName: node linkType: hard -"@helium/data-credits-sdk@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/data-credits-sdk@npm:0.9.18" - dependencies: - "@coral-xyz/anchor": ^0.28.0 - "@helium/anchor-resolvers": ^0.9.18 - "@helium/circuit-breaker-sdk": ^0.9.18 - "@helium/helium-sub-daos-sdk": ^0.9.18 - "@helium/idls": ^0.9.18 - "@helium/spl-utils": ^0.9.18 - bn.js: ^5.2.0 - bs58: ^4.0.1 - crypto-js: ^4.1.1 - checksum: 994260148624e2a1289c88e933309aac400ea421d5a6be558817ed1492ef570d5c23a52c009f811cab7c9946b6bbff815c3f885239a40472996744f928c72c92 - languageName: node - linkType: hard - -"@helium/distributor-oracle@npm:0.9.18": - version: 0.9.18 - resolution: "@helium/distributor-oracle@npm:0.9.18" +"@helium/distributor-oracle@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/distributor-oracle@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 "@fastify/cors": ^8.1.1 - "@helium/account-fetch-cache": ^0.9.18 + "@helium/account-fetch-cache": ^0.9.14 "@helium/address": ^4.10.2 - "@helium/helium-entity-manager-sdk": ^0.9.18 - "@helium/helium-sub-daos-sdk": ^0.9.18 - "@helium/idls": ^0.9.18 - "@helium/lazy-distributor-sdk": ^0.9.18 - "@helium/rewards-oracle-sdk": ^0.9.18 - "@helium/spl-utils": ^0.9.18 + "@helium/helium-entity-manager-sdk": ^0.9.14 + "@helium/helium-sub-daos-sdk": ^0.9.14 + "@helium/idls": ^0.9.14 + "@helium/lazy-distributor-sdk": ^0.9.14 + "@helium/rewards-oracle-sdk": ^0.9.14 + "@helium/spl-utils": ^0.9.14 "@metaplex-foundation/mpl-bubblegum": ^0.7.0 "@solana/spl-token": ^0.3.8 "@types/sequelize": ^4.28.14 @@ -4164,21 +4142,39 @@ __metadata: prom-client: ^15.0.0 sequelize: ^6.28.0 typescript-collections: ^1.3.3 - checksum: d283938488e48a9c9860e7c8abe9093bd41240b83afa4cf548e4a2a5ebd6c538cfbdd3beafd61bd7a0912afe871f6f1212d6a1671455dffc3f97dbed6e155f83 + checksum: 4cb6a95b24d02f02e5b0620646c1265ef464a551775c302d686f1f620eb1b3baef99eadd4707e6692fa8458784648a57cb27a717699bdf4650bf394ecfa92ab9 languageName: node linkType: hard -"@helium/fanout-sdk@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/fanout-sdk@npm:0.9.18" +"@helium/fanout-sdk@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/fanout-sdk@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 - "@helium/anchor-resolvers": ^0.9.18 - "@helium/idls": ^0.9.18 - "@helium/spl-utils": ^0.9.18 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/idls": ^0.9.14 bn.js: ^5.2.0 bs58: ^4.0.1 - checksum: 5f6accd8638b72202353dbdcd9aadeb5f157ea1cd6cb8c6c5fa4ba1ec7020412d45ad8a883590ddfead7f82387e35c2b93debec7cd1508d336b31d77de5ae589 + checksum: 9f84f1e5b141d5cacde952b805ee2a8f18ace52c89bda8dc09a8aba6d675afa5458f7f7d7acf21b69720b159790e6306fe7cf62af992ae6c04a72e64bdf524b5 + languageName: node + linkType: hard + +"@helium/helium-entity-manager-sdk@npm:0.9.14, @helium/helium-entity-manager-sdk@npm:^0.9.14": + version: 0.9.14 + resolution: "@helium/helium-entity-manager-sdk@npm:0.9.14" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/address": ^4.10.2 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/helium-sub-daos-sdk": ^0.9.14 + "@helium/idls": ^0.9.14 + "@helium/no-emit-sdk": ^0.9.14 + "@helium/spl-utils": ^0.9.14 + bn.js: ^5.2.0 + bs58: ^4.0.1 + crypto-js: ^4.1.1 + js-sha256: ^0.9.0 + checksum: 24c6825b2226ba40ad433d1c7ec132effef96f535b5fb34d2abbf94c7dfed218b21cc53fc2ecb151c7152703e3b2c8359e383446fc15d89f6022f1918f6ab9de languageName: node linkType: hard @@ -4220,32 +4216,13 @@ __metadata: languageName: node linkType: hard -"@helium/helium-entity-manager-sdk@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/helium-entity-manager-sdk@npm:0.9.18" +"@helium/helium-react-hooks@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/helium-react-hooks@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 - "@helium/address": ^4.10.2 - "@helium/anchor-resolvers": ^0.9.18 - "@helium/helium-sub-daos-sdk": ^0.9.18 - "@helium/idls": ^0.9.18 - "@helium/no-emit-sdk": ^0.9.18 - "@helium/spl-utils": ^0.9.18 - bn.js: ^5.2.0 - bs58: ^4.0.1 - crypto-js: ^4.1.1 - js-sha256: ^0.9.0 - checksum: 4c03cae6d77af4acbcdec891b669b40898255805011e536f818e31fef08b9611c7df72fc0754c64f7ffcaa44d923f5ea8c47d1f40c0d47b12b4bb922e31a06c4 - languageName: node - linkType: hard - -"@helium/helium-react-hooks@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/helium-react-hooks@npm:0.9.18" - dependencies: - "@coral-xyz/anchor": ^0.28.0 - "@helium/account-fetch-cache": ^0.9.18 - "@helium/account-fetch-cache-hooks": ^0.9.18 + "@helium/account-fetch-cache": ^0.9.14 + "@helium/account-fetch-cache-hooks": ^0.9.14 "@solana/spl-token": ^0.3.8 "@solana/web3.js": ^1.78.8 bs58: ^4.0.1 @@ -4255,7 +4232,22 @@ __metadata: "@solana/wallet-adapter-react": ^0.15.32 react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 - checksum: 77088e3184a25327373db663af4e549687f3ad9bf465ee29a365ca70d35041dd523a6fd244f92e1ac00a1b2f8aadbea2926bdd4bd41a15fcd4b3db4c868d070b + checksum: cd5106ab16e0003758220609852274415cee1ed10210d291ba66cdefaa904ec73c61a5158b1bb2d859fc73310f7a6de41a348f4c6e1246bae7df56702ea783c3 + languageName: node + linkType: hard + +"@helium/helium-sub-daos-sdk@npm:0.9.14, @helium/helium-sub-daos-sdk@npm:^0.9.14": + version: 0.9.14 + resolution: "@helium/helium-sub-daos-sdk@npm:0.9.14" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/circuit-breaker-sdk": ^0.9.14 + "@helium/treasury-management-sdk": ^0.9.14 + "@helium/voter-stake-registry-sdk": ^0.9.14 + bn.js: ^5.2.0 + bs58: ^4.0.1 + checksum: 91eef5ad462687c7eeda5cd4692d0450c99f4b8ad6cf1158956c0d8d788883996f82673b93cb3011688ee611d957062a87c965cb73900304587e1a95d20d0f6b languageName: node linkType: hard @@ -4289,22 +4281,6 @@ __metadata: languageName: node linkType: hard -"@helium/helium-sub-daos-sdk@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/helium-sub-daos-sdk@npm:0.9.18" - dependencies: - "@coral-xyz/anchor": ^0.28.0 - "@helium/anchor-resolvers": ^0.9.18 - "@helium/circuit-breaker-sdk": ^0.9.18 - "@helium/spl-utils": ^0.9.18 - "@helium/treasury-management-sdk": ^0.9.18 - "@helium/voter-stake-registry-sdk": ^0.9.18 - bn.js: ^5.2.0 - bs58: ^4.0.1 - checksum: af0ec342d98671ece5b211bec7eda68a95b7f6c07b3ec5db830a6d192d5364d412e44df97bfc838ece7ad0c1a7278edbdadaaa851c9b934661b12076da9a3ecc - languageName: node - linkType: hard - "@helium/hotspot-utils@npm:^0.6.6": version: 0.6.6 resolution: "@helium/hotspot-utils@npm:0.6.6" @@ -4350,16 +4326,16 @@ __metadata: languageName: node linkType: hard -"@helium/idls@npm:0.9.18, @helium/idls@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/idls@npm:0.9.18" +"@helium/idls@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/idls@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 "@solana/web3.js": ^1.78.8 bn.js: ^5.2.0 borsh: ^0.7.0 bs58: ^4.0.1 - checksum: 06959b002ce88faca3e8fa20efce068a2ee0019d91617ca0b5e4fa07d99b3f911141840fd4258f02c42dc457062eb3fe50377832657c8603dd4f9dd7a7704acd + checksum: a3ea8d58c1885d2ec392b6a256c0cd7e89e3b89824810dcbd0c8979f832c8683449895aed1654af08ff3d6ebddc52e34181c89a5a113e62a7b64f377a7574819 languageName: node linkType: hard @@ -4402,7 +4378,33 @@ __metadata: languageName: node linkType: hard -"@helium/lazy-distributor-sdk@npm:^0.9.18": +"@helium/idls@npm:^0.9.14, @helium/idls@npm:^0.9.15, @helium/idls@npm:^0.9.18": + version: 0.9.18 + resolution: "@helium/idls@npm:0.9.18" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@solana/web3.js": ^1.78.8 + bn.js: ^5.2.0 + borsh: ^0.7.0 + bs58: ^4.0.1 + checksum: 06959b002ce88faca3e8fa20efce068a2ee0019d91617ca0b5e4fa07d99b3f911141840fd4258f02c42dc457062eb3fe50377832657c8603dd4f9dd7a7704acd + languageName: node + linkType: hard + +"@helium/lazy-distributor-sdk@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/lazy-distributor-sdk@npm:0.9.14" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/circuit-breaker-sdk": ^0.9.14 + bn.js: ^5.2.0 + bs58: ^4.0.1 + checksum: af6a6ba42e0450c821fe5b971be4c98c27c4ea2b02d8cefcf80bad00b17e42db4b2cd2127d396c5b8bb238be1c5436bdf2f3ee63a9057976ee6ce76293a130a4 + languageName: node + linkType: hard + +"@helium/lazy-distributor-sdk@npm:^0.9.14": version: 0.9.18 resolution: "@helium/lazy-distributor-sdk@npm:0.9.18" dependencies: @@ -4416,7 +4418,7 @@ __metadata: languageName: node linkType: hard -"@helium/modular-governance-hooks@npm:^0.0.13": +"@helium/modular-governance-hooks@npm:0.0.13": version: 0.0.13 resolution: "@helium/modular-governance-hooks@npm:0.0.13" dependencies: @@ -4454,25 +4456,25 @@ __metadata: languageName: node linkType: hard -"@helium/modular-governance-idls@npm:^0.0.15": - version: 0.0.15 - resolution: "@helium/modular-governance-idls@npm:0.0.15" +"@helium/modular-governance-idls@npm:^0.0.12": + version: 0.0.12 + resolution: "@helium/modular-governance-idls@npm:0.0.12" dependencies: "@coral-xyz/anchor": ^0.28.0 "@solana/web3.js": ^1.78.4 - checksum: cbfaa2a83b074fb24d138de1901acaa7a0cf0de715bdabb3fdad9ab04b59a34e5f6c02216fdb6b6d78d4fa48bf80fe76d2c657107458f9d9b53d64aa532bc547 + checksum: 606c888d1f1af24aeae2b3f011ee2db19f17ce78b3bf37fe6bebaccc3e8e040b4e365d3fa32d4a4e42d181efdc35dc53dc0bf701b5b85065cab167e307c7f035 languageName: node linkType: hard -"@helium/nft-proxy-sdk@npm:^0.0.15": - version: 0.0.15 - resolution: "@helium/nft-proxy-sdk@npm:0.0.15" +"@helium/nft-proxy-sdk@npm:^0.0.12": + version: 0.0.12 + resolution: "@helium/nft-proxy-sdk@npm:0.0.12" dependencies: "@coral-xyz/anchor": ^0.28.0 "@helium/anchor-resolvers": ^0.2.17 "@helium/modular-governance-idls": ^0.0.10 "@solana/spl-token": ^0.3.8 - checksum: ce22c3b786b00bb1a64baa33b040b0530d87420b49ab5b0b8a5704fbc184c71d93c01120d4fc8cf9fdc347b2a4a38c422011d86cc3e5e090243ee630f29e9456 + checksum: e70478c9ed007a1044ff7c76d0e0fdaf1163b489772893b8f4b52dd9d69d194aee71bc63a181a81c766dc459474cdbf3403035cc1f43e2741e89c139e3881b8b languageName: node linkType: hard @@ -4489,7 +4491,7 @@ __metadata: languageName: node linkType: hard -"@helium/no-emit-sdk@npm:^0.9.18": +"@helium/no-emit-sdk@npm:^0.9.14": version: 0.9.18 resolution: "@helium/no-emit-sdk@npm:0.9.18" dependencies: @@ -4534,7 +4536,7 @@ __metadata: languageName: node linkType: hard -"@helium/organization-sdk@npm:^0.0.13": +"@helium/organization-sdk@npm:0.0.13, @helium/organization-sdk@npm:^0.0.13": version: 0.0.13 resolution: "@helium/organization-sdk@npm:0.0.13" dependencies: @@ -4546,6 +4548,21 @@ __metadata: languageName: node linkType: hard +"@helium/position-voting-rewards-sdk@npm:^0.9.14": + version: 0.9.15 + resolution: "@helium/position-voting-rewards-sdk@npm:0.9.15" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/anchor-resolvers": ^0.9.15 + "@helium/idls": ^0.9.15 + "@helium/spl-utils": ^0.9.15 + "@solana/spl-token": ^0.3.8 + bn.js: ^5.2.0 + bs58: ^4.0.1 + checksum: e0cac754a5d44ca491127922320d23a6e424cc3a6ad29820f5671906eb52c60d1a08262e091cd523e3e19ae646d4e60641b0a1314dfce612bb72a8d6f4b95924 + languageName: node + linkType: hard + "@helium/proposal-sdk@npm:^0.0.13": version: 0.0.13 resolution: "@helium/proposal-sdk@npm:0.0.13" @@ -4650,7 +4667,7 @@ __metadata: languageName: node linkType: hard -"@helium/rewards-oracle-sdk@npm:^0.9.18": +"@helium/rewards-oracle-sdk@npm:^0.9.14": version: 0.9.18 resolution: "@helium/rewards-oracle-sdk@npm:0.9.18" dependencies: @@ -4664,14 +4681,14 @@ __metadata: languageName: node linkType: hard -"@helium/spl-utils@npm:0.9.18, @helium/spl-utils@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/spl-utils@npm:0.9.18" +"@helium/spl-utils@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/spl-utils@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 - "@helium/account-fetch-cache": ^0.9.18 + "@helium/account-fetch-cache": ^0.9.14 "@helium/address": ^4.10.2 - "@helium/anchor-resolvers": ^0.9.18 + "@helium/anchor-resolvers": ^0.9.14 "@metaplex-foundation/mpl-token-metadata": ^2.10.0 "@solana/spl-account-compression": ^0.1.7 "@solana/spl-token": ^0.3.8 @@ -4680,7 +4697,7 @@ __metadata: bn.js: ^5.2.0 borsh: ^0.7.0 bs58: ^4.0.1 - checksum: 4ee452a9f424fc0fce51d4a3753af1537dae05884affb8a024b103d483fe323552f87419644b23aef89a44b16d101633f875f0d672c10993ce133a43f4274cee + checksum: f604647b63e0432eec4384427d1cd823485d4236a980e2a7f347f286aea3fd21cc3700fd7f58e853e166e17d879967b8776964528f169fb1442529ef839c0521 languageName: node linkType: hard @@ -4724,7 +4741,27 @@ __metadata: languageName: node linkType: hard -"@helium/state-controller-sdk@npm:^0.0.13": +"@helium/spl-utils@npm:^0.9.14, @helium/spl-utils@npm:^0.9.15, @helium/spl-utils@npm:^0.9.18": + version: 0.9.18 + resolution: "@helium/spl-utils@npm:0.9.18" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/account-fetch-cache": ^0.9.18 + "@helium/address": ^4.10.2 + "@helium/anchor-resolvers": ^0.9.18 + "@metaplex-foundation/mpl-token-metadata": ^2.10.0 + "@solana/spl-account-compression": ^0.1.7 + "@solana/spl-token": ^0.3.8 + "@solana/web3.js": ^1.78.8 + axios: ^1.5.0 + bn.js: ^5.2.0 + borsh: ^0.7.0 + bs58: ^4.0.1 + checksum: 4ee452a9f424fc0fce51d4a3753af1537dae05884affb8a024b103d483fe323552f87419644b23aef89a44b16d101633f875f0d672c10993ce133a43f4274cee + languageName: node + linkType: hard + +"@helium/state-controller-sdk@npm:0.0.13": version: 0.0.13 resolution: "@helium/state-controller-sdk@npm:0.0.13" dependencies: @@ -4735,9 +4772,9 @@ __metadata: languageName: node linkType: hard -"@helium/sus@npm:0.9.18": - version: 0.9.18 - resolution: "@helium/sus@npm:0.9.18" +"@helium/sus@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/sus@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 "@metaplex-foundation/mpl-token-metadata": ^2.10.0 @@ -4746,7 +4783,7 @@ __metadata: axios: ^1.6.5 bn.js: ^5.2.0 bs58: ^4.0.1 - checksum: bb4f5fd1e6e22b8f1a9185414da9387cb9a68a6310ce1680ebb77279a57966c4c2a65bca99dba32966e4847d75ff455305edcf7a014751c2fab0362a3d5fa7d5 + checksum: ff4be446ea060511924f32ddaac4236bd3db0a0ae59065f4565dec4505e2b31f709ae53322cdb240a85dd9a6daa0c2600f826eeda3a4b306de259660d578581a languageName: node linkType: hard @@ -4776,6 +4813,20 @@ __metadata: languageName: node linkType: hard +"@helium/treasury-management-sdk@npm:0.9.14, @helium/treasury-management-sdk@npm:^0.9.14": + version: 0.9.14 + resolution: "@helium/treasury-management-sdk@npm:0.9.14" + dependencies: + "@coral-xyz/anchor": ^0.28.0 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/circuit-breaker-sdk": ^0.9.14 + "@helium/idls": ^0.9.14 + bn.js: ^5.2.0 + bs58: ^4.0.1 + checksum: a46291b78876591fac3900ac3784e6fe7427fae56982a2b7830c2a5194c919307ef520e98a1f66b84cec1896c59905f3a917497fa0557f67ff7ae07dff3dfa0f + languageName: node + linkType: hard + "@helium/treasury-management-sdk@npm:^0.6.6": version: 0.6.6 resolution: "@helium/treasury-management-sdk@npm:0.6.6" @@ -4804,35 +4855,21 @@ __metadata: languageName: node linkType: hard -"@helium/treasury-management-sdk@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/treasury-management-sdk@npm:0.9.18" - dependencies: - "@coral-xyz/anchor": ^0.28.0 - "@helium/anchor-resolvers": ^0.9.18 - "@helium/circuit-breaker-sdk": ^0.9.18 - "@helium/idls": ^0.9.18 - "@helium/spl-utils": ^0.9.18 - bn.js: ^5.2.0 - bs58: ^4.0.1 - checksum: 143f4f13ee9461dcd6eb8dd789a65a5468fce6ed1d9c93f0f040eed837fafea3d11df3682d9fa9df3fe5baaf35bae82591fcefa18d16c2cc5eab0d9129311e91 - languageName: node - linkType: hard - -"@helium/voter-stake-registry-hooks@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/voter-stake-registry-hooks@npm:0.9.18" +"@helium/voter-stake-registry-hooks@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/voter-stake-registry-hooks@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 - "@helium/account-fetch-cache": ^0.9.18 - "@helium/account-fetch-cache-hooks": ^0.9.18 - "@helium/circuit-breaker-sdk": ^0.9.18 - "@helium/helium-react-hooks": ^0.9.18 - "@helium/helium-sub-daos-sdk": ^0.9.18 - "@helium/modular-governance-hooks": ^0.0.15 - "@helium/modular-governance-idls": ^0.0.15 - "@helium/spl-utils": ^0.9.18 - "@helium/voter-stake-registry-sdk": ^0.9.18 + "@helium/account-fetch-cache": ^0.9.14 + "@helium/account-fetch-cache-hooks": ^0.9.14 + "@helium/circuit-breaker-sdk": ^0.9.14 + "@helium/helium-react-hooks": ^0.9.14 + "@helium/helium-sub-daos-sdk": ^0.9.14 + "@helium/modular-governance-hooks": ^0.0.12 + "@helium/modular-governance-idls": ^0.0.12 + "@helium/position-voting-rewards-sdk": ^0.9.14 + "@helium/spl-utils": ^0.9.14 + "@helium/voter-stake-registry-sdk": ^0.9.14 "@solana/wallet-adapter-base": ^0.9.22 "@solana/wallet-adapter-react": ^0.15.32 "@solana/web3.js": ^1.78.8 @@ -4843,24 +4880,24 @@ __metadata: peerDependencies: react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 - checksum: 1e498a70b5ff6d62e0d5d3909c0c4e096dcbadad40fe2f974cd68b9e12441224fbc256d7e98f19fae42929e7cc4484222468cd9e0f5783b3c69adc7098156955 + checksum: 1e8d393afc5db230afc1e42802a136a0bb1c06f5e2b48e6b048ea91122a70df0f0b25c6cd83228b4cf91791a0bd0abcaa926223308a67acc84d6fc8171ac001b languageName: node linkType: hard -"@helium/voter-stake-registry-sdk@npm:^0.9.18": - version: 0.9.18 - resolution: "@helium/voter-stake-registry-sdk@npm:0.9.18" +"@helium/voter-stake-registry-sdk@npm:0.9.14": + version: 0.9.14 + resolution: "@helium/voter-stake-registry-sdk@npm:0.9.14" dependencies: "@coral-xyz/anchor": ^0.28.0 - "@helium/anchor-resolvers": ^0.9.18 - "@helium/idls": ^0.9.18 - "@helium/nft-proxy-sdk": ^0.0.15 - "@helium/spl-utils": ^0.9.18 + "@helium/anchor-resolvers": ^0.9.14 + "@helium/idls": ^0.9.14 + "@helium/nft-proxy-sdk": ^0.0.12 + "@helium/spl-utils": ^0.9.14 "@metaplex-foundation/mpl-token-metadata": ^2.10.0 "@solana/spl-token": ^0.3.8 bn.js: ^5.2.0 bs58: ^4.0.1 - checksum: 9de2b67c64afd0adcdc5c7372ee80d63b60bac57f73325841e20c8bf30e2b3b046960d860dab92f8793be69ee1d7d542ca298bb3db7faeb9d6c9b9ee6ddd2850 + checksum: 855b2dc578adc80e03b799c7fa0a5ca4b7202b63adcd3d96a7a738833a0a102dde2b01825882dbce9c405380066f1a99db58d43e48269307c9b1015eedae8db6 languageName: node linkType: hard @@ -4951,7 +4988,7 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:^29.7.0": +"@jest/core@npm:^29.6.3, @jest/core@npm:^29.7.0": version: 29.7.0 resolution: "@jest/core@npm:29.7.0" dependencies: @@ -5139,7 +5176,7 @@ __metadata: languageName: node linkType: hard -"@jest/transform@npm:^29.7.0": +"@jest/transform@npm:^29.6.3, @jest/transform@npm:^29.7.0": version: 29.7.0 resolution: "@jest/transform@npm:29.7.0" dependencies: @@ -5252,7 +5289,7 @@ __metadata: languageName: node linkType: hard -"@jup-ag/api@npm:^6.0.6": +"@jup-ag/api@npm:6.0.6": version: 6.0.6 resolution: "@jup-ag/api@npm:6.0.6" checksum: 3438ac34675b3f5250755d4d61460b811a64a401bd52b51090c369077f9880f9f02dcbf732a13c5114765daed3711c60461019f66737c46adfda95a766de3f6f @@ -5432,7 +5469,7 @@ __metadata: languageName: node linkType: hard -"@keystonehq/keystone-sdk@npm:^0.8.0": +"@keystonehq/keystone-sdk@npm:0.8.0": version: 0.8.0 resolution: "@keystonehq/keystone-sdk@npm:0.8.0" dependencies: @@ -5587,7 +5624,7 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/types-devices@npm:^6.25.3": +"@ledgerhq/types-devices@npm:6.25.3": version: 6.25.3 resolution: "@ledgerhq/types-devices@npm:6.25.3" checksum: 1bfe60ed14752f0f8daabd7af8c0b4daa26182b29aac7329f5510c1cd5f0dcb3592133a3e331277cf48440a5236373c50e473597a715f9ab54bb0b3c540ac260 @@ -5658,7 +5695,7 @@ __metadata: languageName: node linkType: hard -"@metaplex-foundation/js@npm:^0.19.5": +"@metaplex-foundation/js@npm:0.19.5": version: 0.19.5 resolution: "@metaplex-foundation/js@npm:0.19.5" dependencies: @@ -5823,7 +5860,7 @@ __metadata: languageName: node linkType: hard -"@ngraveio/bc-ur@npm:^1.1.13, @ngraveio/bc-ur@npm:^1.1.5, @ngraveio/bc-ur@npm:^1.1.6": +"@ngraveio/bc-ur@npm:1.1.13, @ngraveio/bc-ur@npm:^1.1.5, @ngraveio/bc-ur@npm:^1.1.6": version: 1.1.13 resolution: "@ngraveio/bc-ur@npm:1.1.13" dependencies: @@ -5958,7 +5995,7 @@ __metadata: languageName: node linkType: hard -"@onsol/tldparser@npm:^0.5.3": +"@onsol/tldparser@npm:0.5.3": version: 0.5.3 resolution: "@onsol/tldparser@npm:0.5.3" dependencies: @@ -5980,6 +6017,39 @@ __metadata: languageName: node linkType: hard +"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.3.8": + version: 2.3.13 + resolution: "@peculiar/asn1-schema@npm:2.3.13" + dependencies: + asn1js: ^3.0.5 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + checksum: 245cf398992788fc61c48a4e1263a47803bccd91807e7a419e3fe9ad44ede5e396a5f8d13215b0765774855b634fe10d730b08944e5dc085fc5ee121a7e0139e + languageName: node + linkType: hard + +"@peculiar/json-schema@npm:^1.1.12": + version: 1.1.12 + resolution: "@peculiar/json-schema@npm:1.1.12" + dependencies: + tslib: ^2.0.0 + checksum: b26ececdc23c5ef25837f8be8d1eb5e1c8bb6e9ae7227ac59ffea57fff56bd05137734e7685e9100595d3d88d906dff638ef8d1df54264c388d3eac1b05aa060 + languageName: node + linkType: hard + +"@peculiar/webcrypto@npm:^1.4.0": + version: 1.5.0 + resolution: "@peculiar/webcrypto@npm:1.5.0" + dependencies: + "@peculiar/asn1-schema": ^2.3.8 + "@peculiar/json-schema": ^1.1.12 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + webcrypto-core: ^1.8.0 + checksum: 9022d7452d564a5a26fbacf477842be34736f2d9139f2f5026adc47fdeda7033193d727491503f2a829d35ab819bbfa61c82a785c49c999eac535ecd69a3a459 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -6089,14 +6159,14 @@ __metadata: languageName: node linkType: hard -"@react-native-async-storage/async-storage@npm:1.23.1": - version: 1.23.1 - resolution: "@react-native-async-storage/async-storage@npm:1.23.1" +"@react-native-async-storage/async-storage@npm:1.18.1": + version: 1.18.1 + resolution: "@react-native-async-storage/async-storage@npm:1.18.1" dependencies: merge-options: ^3.0.4 peerDependencies: - react-native: ^0.0.0-0 || >=0.60 <1.0 - checksum: 7096546ed4a5faf1f6e0425e2e15713575f1a7493a04524da386ff35c3844b57b8fd20544fad4157b4a61e048b10235f2f06124f262da5b327edc74fbc31e02b + react-native: ^0.0.0-0 || 0.60 - 0.72 || 1000.0.0 + checksum: 58c8497fafdd4d112c4a70b0976783abdc6fa487f0cffca196901efd146fc838dee0cf498fdc4ef67a4634ba4ca97d60fec5a24720aea1d46f1999b0ba8b249b languageName: node linkType: hard @@ -6388,7 +6458,7 @@ __metadata: languageName: node linkType: hard -"@react-native-community/slider@npm:^4.5.2": +"@react-native-community/slider@npm:4.5.2": version: 4.5.2 resolution: "@react-native-community/slider@npm:4.5.2" checksum: 99023660756a1a876fc3d9c1a7cec13f7e414abee3452e1e03d2794bc7f46a9d689740bed5c3889914adf6ed85a55c6017e2f0d73b5de353025ba52bba6e79e1 @@ -6841,9 +6911,9 @@ __metadata: languageName: node linkType: hard -"@rnmapbox/maps@npm:10.1.33": - version: 10.1.33 - resolution: "@rnmapbox/maps@npm:10.1.33" +"@rnmapbox/maps@npm:10.1.31": + version: 10.1.31 + resolution: "@rnmapbox/maps@npm:10.1.31" dependencies: "@turf/along": 6.5.0 "@turf/distance": 6.5.0 @@ -6865,7 +6935,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 847b34994f121d057840d73d20c713bdd54eafda95b576344022cda32362ecd131429a9f55a219068ee6a4ff03ad1e271ade521bffd7d1c5b266746207b3a850 + checksum: f4ac56f9dbc3128b2bfeedd3980668f2c05e92b965297a0be1556b0059fcf15e7c84d9127b32383d6608d65b6986e5e3ed6ef08499091f0a31a6fbb72c0819fb languageName: node linkType: hard @@ -7270,27 +7340,27 @@ __metadata: languageName: node linkType: hard -"@solana/spl-token-metadata@npm:^0.1.2": - version: 0.1.5 - resolution: "@solana/spl-token-metadata@npm:0.1.5" +"@solana/spl-token-metadata@npm:0.1.4": + version: 0.1.4 + resolution: "@solana/spl-token-metadata@npm:0.1.4" dependencies: - "@solana/codecs": 2.0.0-rc.1 + "@solana/codecs": 2.0.0-preview.2 "@solana/spl-type-length-value": 0.1.0 peerDependencies: - "@solana/web3.js": ^1.95.3 - checksum: dffe1bf05c5c60cb3a725044c2013c5d3dfeed2e0ae99dd083916cf92cc433f5d87b631f38fc8ae0aac5ed8c1d266be1c8dc7c868da5253be076fe7ce49a31b8 + "@solana/web3.js": ^1.91.6 + checksum: 974969ce59a184f17e8d2f6aa98a118154ec042e9efa41a7b8ad33aecff8234d0a1161573807a59ab9e9d3557d8438b0b78f785cfc481f038900337f73523b02 languageName: node linkType: hard -"@solana/spl-token-metadata@npm:^0.1.4": - version: 0.1.4 - resolution: "@solana/spl-token-metadata@npm:0.1.4" +"@solana/spl-token-metadata@npm:^0.1.2": + version: 0.1.5 + resolution: "@solana/spl-token-metadata@npm:0.1.5" dependencies: - "@solana/codecs": 2.0.0-preview.2 + "@solana/codecs": 2.0.0-rc.1 "@solana/spl-type-length-value": 0.1.0 peerDependencies: - "@solana/web3.js": ^1.91.6 - checksum: 974969ce59a184f17e8d2f6aa98a118154ec042e9efa41a7b8ad33aecff8234d0a1161573807a59ab9e9d3557d8438b0b78f785cfc481f038900337f73523b02 + "@solana/web3.js": ^1.95.3 + checksum: dffe1bf05c5c60cb3a725044c2013c5d3dfeed2e0ae99dd083916cf92cc433f5d87b631f38fc8ae0aac5ed8c1d266be1c8dc7c868da5253be076fe7ce49a31b8 languageName: node linkType: hard @@ -7471,7 +7541,30 @@ __metadata: languageName: node linkType: hard -"@solana/web3.js@npm:^1.21.0, @solana/web3.js@npm:^1.32.0, @solana/web3.js@npm:^1.43.4, @solana/web3.js@npm:^1.50.1, @solana/web3.js@npm:^1.56.2, @solana/web3.js@npm:^1.66.2, @solana/web3.js@npm:^1.68.0, @solana/web3.js@npm:^1.69.0, @solana/web3.js@npm:^1.78.4, @solana/web3.js@npm:^1.78.8, @solana/web3.js@npm:^1.87.6": +"@solana/web3.js@npm:1.87.6": + version: 1.87.6 + resolution: "@solana/web3.js@npm:1.87.6" + dependencies: + "@babel/runtime": ^7.23.2 + "@noble/curves": ^1.2.0 + "@noble/hashes": ^1.3.1 + "@solana/buffer-layout": ^4.0.0 + agentkeepalive: ^4.3.0 + bigint-buffer: ^1.1.5 + bn.js: ^5.2.1 + borsh: ^0.7.0 + bs58: ^4.0.1 + buffer: 6.0.3 + fast-stable-stringify: ^1.0.0 + jayson: ^4.1.0 + node-fetch: ^2.6.12 + rpc-websockets: ^7.5.1 + superstruct: ^0.14.2 + checksum: 182eb2a953f6ebebdfbc7dfda031d1985fb1591a2aa38b388d5dfb9fd3df0fb53a3962373384dbd91df343e148ec3d42a579324effab9ca86f0560c4f6f08481 + languageName: node + linkType: hard + +"@solana/web3.js@npm:^1.21.0, @solana/web3.js@npm:^1.32.0, @solana/web3.js@npm:^1.43.4, @solana/web3.js@npm:^1.50.1, @solana/web3.js@npm:^1.56.2, @solana/web3.js@npm:^1.66.2, @solana/web3.js@npm:^1.68.0, @solana/web3.js@npm:^1.69.0, @solana/web3.js@npm:^1.78.4, @solana/web3.js@npm:^1.78.8": version: 1.91.4 resolution: "@solana/web3.js@npm:1.91.4" dependencies: @@ -7825,7 +7918,7 @@ __metadata: languageName: node linkType: hard -"@tanstack/react-query@npm:^5.45.0, @tanstack/react-query@npm:^5.45.1": +"@tanstack/react-query@npm:5.45.1, @tanstack/react-query@npm:^5.45.0": version: 5.45.1 resolution: "@tanstack/react-query@npm:5.45.1" dependencies: @@ -8025,7 +8118,7 @@ __metadata: languageName: node linkType: hard -"@types/base-64@npm:^1.0.2": +"@types/base-64@npm:1.0.2": version: 1.0.2 resolution: "@types/base-64@npm:1.0.2" checksum: bb7593c6de16c88a1bfed73a37c3be2e940921261bb7a160ab6d671f66d976b5426334ae9ce59553a10086db11e52af348813271a8b636e4f88e4cab8f27a3e4 @@ -8066,7 +8159,7 @@ __metadata: languageName: node linkType: hard -"@types/debounce@npm:^1.2.4": +"@types/debounce@npm:1.2.4": version: 1.2.4 resolution: "@types/debounce@npm:1.2.4" checksum: decef3eee65d681556d50f7fac346f1b33134f6b21f806d41326f9dfb362fa66b0282ff0640ae6791b690694c9dc3dad4e146e909e707e6f96650f3aa325b9da @@ -8220,14 +8313,14 @@ __metadata: languageName: node linkType: hard -"@types/mapbox__geo-viewport@npm:^0.5.3": +"@types/mapbox__geo-viewport@npm:0.5.3": version: 0.5.3 resolution: "@types/mapbox__geo-viewport@npm:0.5.3" checksum: 82240cc936a4bd70293d05576614f0932804c3b58cc841fd72e688f1bd41bcaac406d8249a6342ae669923496b5e6913fe90a3738ffcadf818493ca678afaf08 languageName: node linkType: hard -"@types/markdown-it@npm:^13.0.5": +"@types/markdown-it@npm:13.0.5": version: 13.0.5 resolution: "@types/markdown-it@npm:13.0.5" dependencies: @@ -9219,6 +9312,13 @@ __metadata: languageName: node linkType: hard +"@whatwg-node/events@npm:^0.0.3": + version: 0.0.3 + resolution: "@whatwg-node/events@npm:0.0.3" + checksum: af26f40d4d0a0f5f0ee45fc6124afb8d6b33988dae96ab0fb87aa5e66d1ff08a749491b9da533ea524bbaebd4a770736f254d574a91ab4455386aa098cee8c77 + languageName: node + linkType: hard + "@whatwg-node/fetch@npm:^0.10.0": version: 0.10.1 resolution: "@whatwg-node/fetch@npm:0.10.1" @@ -9229,25 +9329,29 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/fetch@npm:^0.9.20": - version: 0.9.23 - resolution: "@whatwg-node/fetch@npm:0.9.23" +"@whatwg-node/fetch@npm:^0.8.0": + version: 0.8.8 + resolution: "@whatwg-node/fetch@npm:0.8.8" dependencies: - "@whatwg-node/node-fetch": ^0.6.0 - urlpattern-polyfill: ^10.0.0 - checksum: 16c99adecce7eac17220b24c9385f34a30b9c546a790ab8f03f602747746c34ebbd24cf22faa7c921b92463f2e1f6b1ce754da636b4eda1b920720b31f9c41b8 + "@peculiar/webcrypto": ^1.4.0 + "@whatwg-node/node-fetch": ^0.3.6 + busboy: ^1.6.0 + urlpattern-polyfill: ^8.0.0 + web-streams-polyfill: ^3.2.1 + checksum: 891407ba57e32e5af70a3b0a86980c4466dcf2ba8581b6927475c85400280b163085519e98821dd94776da9aa1b0b1e221e718009e2abed9c8a0d4721025b2ab languageName: node linkType: hard -"@whatwg-node/node-fetch@npm:^0.6.0": - version: 0.6.0 - resolution: "@whatwg-node/node-fetch@npm:0.6.0" +"@whatwg-node/node-fetch@npm:^0.3.6": + version: 0.3.6 + resolution: "@whatwg-node/node-fetch@npm:0.3.6" dependencies: - "@kamilkisiela/fast-url-parser": ^1.1.4 + "@whatwg-node/events": ^0.0.3 busboy: ^1.6.0 fast-querystring: ^1.1.1 - tslib: ^2.6.3 - checksum: 78a80a3c0ada94ba5256a7d94be5d27a5527b4cdc071ed2c328ff0f434d8446ee1e0464019af79be06c2d032520065f47abb7e492b774a084ac4b13bd4a86c41 + fast-url-parser: ^1.1.3 + tslib: ^2.3.1 + checksum: d3d7b0a0242c0511c7b666de66d9096fb24ea251426ce76e3a26a8ca17408de5d4d4f81b5aaec840cc7025f0321fb97e06067c53f377c844a5a9473dd76491ae languageName: node linkType: hard @@ -9379,6 +9483,13 @@ __metadata: languageName: node linkType: hard +"aes-js@npm:3.1.2": + version: 3.1.2 + resolution: "aes-js@npm:3.1.2" + checksum: 062154d50b1e433cc8c3b8ca7879f3a6375d5e79c2a507b2b6c4ec920b4cd851bf2afa7f65c98761a9da89c0ab618cbe6529e8e9a1c71f93290b53128fb8f712 + languageName: node + linkType: hard + "agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -9397,7 +9508,7 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.5.0": +"agentkeepalive@npm:^4.3.0, agentkeepalive@npm:^4.5.0": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" dependencies: @@ -9867,6 +9978,17 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.5": + version: 3.0.5 + resolution: "asn1js@npm:3.0.5" + dependencies: + pvtsutils: ^1.3.2 + pvutils: ^1.1.3 + tslib: ^2.4.0 + checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb + languageName: node + linkType: hard + "assert@npm:1.5.0": version: 1.5.0 resolution: "assert@npm:1.5.0" @@ -10041,7 +10163,7 @@ __metadata: languageName: node linkType: hard -"axios-mock-adapter@npm:^1.21.5, axios-mock-adapter@npm:^1.22.0": +"axios-mock-adapter@npm:1.22.0, axios-mock-adapter@npm:^1.21.5": version: 1.22.0 resolution: "axios-mock-adapter@npm:1.22.0" dependencies: @@ -10126,7 +10248,24 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.6.3, babel-jest@npm:^29.7.0": +"babel-jest@npm:29.6.3": + version: 29.6.3 + resolution: "babel-jest@npm:29.6.3" + dependencies: + "@jest/transform": ^29.6.3 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.6.3 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 8b4b85d829d8ee010f0c8381cb9d67842da905c32183c1fc6e1e8833447a79b969f8279759d44197bb77001239dc41a49fff0e8222d8e8577f47a8d0428d178e + languageName: node + linkType: hard + +"babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" dependencies: @@ -10476,7 +10615,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.0.2, base64-js@npm:^1.2.3, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": +"base64-js@npm:^1.0.2, base64-js@npm:^1.2.0, base64-js@npm:^1.2.3, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -10621,7 +10760,7 @@ __metadata: languageName: node linkType: hard -"bip39@npm:^3.1.0": +"bip39@npm:3.1.0": version: 3.1.0 resolution: "bip39@npm:3.1.0" dependencies: @@ -11034,7 +11173,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.0.0, buffer@npm:^5.1.0, buffer@npm:^5.4.3, buffer@npm:^5.5.0": +"buffer@npm:^5.0.0, buffer@npm:^5.0.7, buffer@npm:^5.1.0, buffer@npm:^5.4.3, buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -11750,7 +11889,7 @@ __metadata: languageName: node linkType: hard -"compare-versions@npm:^6.1.0": +"compare-versions@npm:6.1.0, compare-versions@npm:^6.1.0": version: 6.1.0 resolution: "compare-versions@npm:6.1.0" checksum: d4e2a45706a023d8d0b6680338b66b79e20bd02d1947f0ac6531dab634cbed89fa373b3f03d503c5e489761194258d6e1bae67a07f88b1efc61648454f2d47e7 @@ -12148,6 +12287,18 @@ __metadata: languageName: node linkType: hard +"css-select@npm:~1.2.0": + version: 1.2.0 + resolution: "css-select@npm:1.2.0" + dependencies: + boolbase: ~1.0.0 + css-what: 2.1 + domutils: 1.5.1 + nth-check: ~1.0.1 + checksum: 607cca60d2f5c56701fe5f800bbe668b114395c503d4e4808edbbbe70b8be3c96a6407428dc0227fcbdf335b20468e6a9e7fd689185edfb57d402e1e4837c9b7 + languageName: node + linkType: hard + "css-to-react-native@npm:^3.0.0": version: 3.2.0 resolution: "css-to-react-native@npm:3.2.0" @@ -12179,6 +12330,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:2.1": + version: 2.1.3 + resolution: "css-what@npm:2.1.3" + checksum: a52d56c591a7e1c37506d0d8c4fdef72537fb8eb4cb68711485997a88d76b5a3342b73a7c79176268f95b428596c447ad7fa3488224a6b8b532e2f1f2ee8545c + languageName: node + linkType: hard + "css-what@npm:^3.2.1": version: 3.4.2 resolution: "css-what@npm:3.4.2" @@ -12733,6 +12891,16 @@ __metadata: languageName: node linkType: hard +"dom-serializer@npm:~0.1.0": + version: 0.1.1 + resolution: "dom-serializer@npm:0.1.1" + dependencies: + domelementtype: ^1.3.0 + entities: ^1.1.1 + checksum: 4f6a3eff802273741931cfd3c800fab4e683236eed10628d6605f52538a6bc0ce4770f3ca2ad68a27412c103ae9b6cdaed3c0a8e20d2704192bde497bc875215 + languageName: node + linkType: hard + "domain-browser@npm:1.2.0": version: 1.2.0 resolution: "domain-browser@npm:1.2.0" @@ -12740,7 +12908,7 @@ __metadata: languageName: node linkType: hard -"domelementtype@npm:1": +"domelementtype@npm:1, domelementtype@npm:^1.3.0": version: 1.3.1 resolution: "domelementtype@npm:1.3.1" checksum: 7893da40218ae2106ec6ffc146b17f203487a52f5228b032ea7aa470e41dfe03e1bd762d0ee0139e792195efda765434b04b43cddcf63207b098f6ae44b36ad6 @@ -12754,6 +12922,15 @@ __metadata: languageName: node linkType: hard +"domhandler@npm:^2.3.0": + version: 2.4.2 + resolution: "domhandler@npm:2.4.2" + dependencies: + domelementtype: 1 + checksum: 49bd70c9c784f845cd047e1dfb3611bd10891c05719acfc93f01fc726a419ed09fbe0b69f9064392d556a63fffc5a02010856cedae9368f4817146d95a97011f + languageName: node + linkType: hard + "domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": version: 5.0.3 resolution: "domhandler@npm:5.0.3" @@ -12763,7 +12940,17 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^1.7.0": +"domutils@npm:1.5.1": + version: 1.5.1 + resolution: "domutils@npm:1.5.1" + dependencies: + dom-serializer: 0 + domelementtype: 1 + checksum: 800d1f9d1c2e637267dae078ff6e24461e6be1baeb52fa70f2e7e7520816c032a925997cd15d822de53ef9896abb1f35e5c439d301500a9cd6b46a395f6f6ca0 + languageName: node + linkType: hard + +"domutils@npm:^1.5.1, domutils@npm:^1.7.0": version: 1.7.0 resolution: "domutils@npm:1.7.0" dependencies: @@ -12859,7 +13046,7 @@ __metadata: languageName: node linkType: hard -"ed25519-hd-key@npm:^1.3.0": +"ed25519-hd-key@npm:1.3.0": version: 1.3.0 resolution: "ed25519-hd-key@npm:1.3.0" dependencies: @@ -12990,6 +13177,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^1.1.1, entities@npm:~1.1.1": + version: 1.1.2 + resolution: "entities@npm:1.1.2" + checksum: d537b02799bdd4784ffd714d000597ed168727bddf4885da887c5a491d735739029a00794f1998abbf35f3f6aeda32ef5c15010dca1817d401903a501b6d3e05 + languageName: node + linkType: hard + "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -13841,6 +14035,13 @@ __metadata: languageName: node linkType: hard +"eventemitter2@npm:^1.0.0": + version: 1.0.5 + resolution: "eventemitter2@npm:1.0.5" + checksum: f501d8ad439aad85b4d5494d96a83abbb156ed4acf5897fed53a99f4fa427c5a968959276461d8640b613ed16a34995fcd63a13404262e725131a29df9177c96 + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -14076,7 +14277,7 @@ __metadata: languageName: node linkType: hard -"expo-location@npm:^17.0.1": +"expo-location@npm:17.0.1": version: 17.0.1 resolution: "expo-location@npm:17.0.1" peerDependencies: @@ -14332,6 +14533,15 @@ __metadata: languageName: node linkType: hard +"fast-url-parser@npm:^1.1.3": + version: 1.1.3 + resolution: "fast-url-parser@npm:1.1.3" + dependencies: + punycode: ^1.3.2 + checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c + languageName: node + linkType: hard + "fast-xml-parser@npm:^4.0.12, fast-xml-parser@npm:^4.2.4": version: 4.4.1 resolution: "fast-xml-parser@npm:4.4.1" @@ -14954,7 +15164,7 @@ __metadata: languageName: node linkType: hard -"geolib@npm:^3.3.4": +"geolib@npm:3.3.4": version: 3.3.4 resolution: "geolib@npm:3.3.4" checksum: b5ca8090effd384fec168a957d89416577a92dcb63aedf361a60794e07051e6f2a98a3c2db64de2dd9114ac22c63fbf9ec67b2f61dbc300292040cbd4387942b @@ -15185,7 +15395,7 @@ __metadata: languageName: node linkType: hard -"graphql-config@npm:^5.1.1": +"graphql-config@npm:^5.0.2": version: 5.1.3 resolution: "graphql-config@npm:5.1.3" dependencies: @@ -15426,63 +15636,63 @@ __metadata: "@babel/preset-env": 7.20.2 "@babel/preset-typescript": 7.21.0 "@babel/runtime": 7.20.13 - "@bonfida/spl-name-service": ^1.1.1 - "@coral-xyz/anchor": ^0.28.0 + "@bonfida/spl-name-service": 1.1.1 + "@coral-xyz/anchor": 0.28.0 "@gorhom/bottom-sheet": 5.0.4 "@gorhom/portal": 1.0.14 - "@graphql-codegen/cli": ^5.0.0 - "@graphql-codegen/typescript": ^4.0.1 - "@graphql-codegen/typescript-operations": ^4.0.1 - "@graphql-codegen/typescript-rtk-query": ^3.1.1 - "@helium/account-fetch-cache": 0.9.18 - "@helium/account-fetch-cache-hooks": 0.9.18 + "@graphql-codegen/cli": 5.0.0 + "@graphql-codegen/typescript": 4.0.1 + "@graphql-codegen/typescript-operations": 4.0.1 + "@graphql-codegen/typescript-rtk-query": 3.1.1 + "@helium/account-fetch-cache": 0.9.14 + "@helium/account-fetch-cache-hooks": 0.9.14 "@helium/address": 4.10.2 - "@helium/circuit-breaker-sdk": ^0.9.18 + "@helium/circuit-breaker-sdk": 0.9.14 "@helium/crypto-react-native": 4.8.0 - "@helium/currency-utils": ^0.9.18 - "@helium/data-credits-sdk": ^0.9.18 - "@helium/distributor-oracle": 0.9.18 - "@helium/fanout-sdk": ^0.9.18 - "@helium/helium-entity-manager-sdk": ^0.9.18 - "@helium/helium-react-hooks": 0.9.18 - "@helium/helium-sub-daos-sdk": ^0.9.18 + "@helium/currency-utils": 0.9.14 + "@helium/data-credits-sdk": 0.9.14 + "@helium/distributor-oracle": 0.9.14 + "@helium/fanout-sdk": 0.9.14 + "@helium/helium-entity-manager-sdk": 0.9.14 + "@helium/helium-react-hooks": 0.9.14 + "@helium/helium-sub-daos-sdk": 0.9.14 "@helium/http": 4.7.5 - "@helium/idls": 0.9.18 - "@helium/lazy-distributor-sdk": ^0.9.18 - "@helium/modular-governance-hooks": ^0.0.13 + "@helium/idls": 0.9.14 + "@helium/lazy-distributor-sdk": 0.9.14 + "@helium/modular-governance-hooks": 0.0.13 "@helium/modular-governance-idls": 0.0.13 "@helium/onboarding": 4.11.0 - "@helium/organization-sdk": ^0.0.13 + "@helium/organization-sdk": 0.0.13 "@helium/proto-ble": 4.0.0 "@helium/react-native-sdk": 3.0.5 - "@helium/spl-utils": 0.9.18 - "@helium/state-controller-sdk": ^0.0.13 - "@helium/sus": 0.9.18 + "@helium/spl-utils": 0.9.14 + "@helium/state-controller-sdk": 0.0.13 + "@helium/sus": 0.9.14 "@helium/transactions": 4.8.1 - "@helium/treasury-management-sdk": ^0.9.18 - "@helium/voter-stake-registry-hooks": 0.9.18 - "@helium/voter-stake-registry-sdk": 0.9.18 + "@helium/treasury-management-sdk": 0.9.14 + "@helium/voter-stake-registry-hooks": 0.9.14 + "@helium/voter-stake-registry-sdk": 0.9.14 "@helium/wallet-link": 4.11.0 - "@jup-ag/api": ^6.0.6 - "@keystonehq/keystone-sdk": ^0.8.0 + "@jup-ag/api": 6.0.6 + "@keystonehq/keystone-sdk": 0.8.0 "@ledgerhq/hw-app-solana": 7.2.4 "@ledgerhq/hw-transport-mocker": 6.27.2 "@ledgerhq/react-native-hid": 6.32.4 "@ledgerhq/react-native-hw-transport-ble": 6.29.4 - "@ledgerhq/types-devices": ^6.25.3 - "@metaplex-foundation/js": ^0.19.5 + "@ledgerhq/types-devices": 6.25.3 + "@metaplex-foundation/js": 0.19.5 "@metaplex-foundation/mpl-bubblegum": 0.6.0 "@metaplex-foundation/mpl-token-metadata": 2.10.0 - "@ngraveio/bc-ur": ^1.1.13 + "@ngraveio/bc-ur": 1.1.13 "@novalabsxyz/mobile-theme": 2.0.0-y.26 - "@onsol/tldparser": ^0.5.3 - "@react-native-async-storage/async-storage": 1.23.1 + "@onsol/tldparser": 0.5.3 + "@react-native-async-storage/async-storage": 1.18.1 "@react-native-community/blur": 4.3.0 "@react-native-community/checkbox": 0.5.17 "@react-native-community/clipboard": 1.5.1 "@react-native-community/hooks": 2.8.1 "@react-native-community/netinfo": 9.3.7 - "@react-native-community/slider": ^4.5.2 + "@react-native-community/slider": 4.5.2 "@react-native-masked-view/masked-view": 0.3.2 "@react-native/babel-preset": 0.74.87 "@react-native/eslint-config": 0.74.87 @@ -15494,31 +15704,31 @@ __metadata: "@react-navigation/native-stack": 6.7.0 "@react-navigation/stack": 6.2.2 "@reduxjs/toolkit": 1.9.1 - "@rnmapbox/maps": 10.1.33 + "@rnmapbox/maps": 10.1.31 "@shopify/react-native-skia": 1.5.10 "@shopify/restyle": 2.4.2 "@solana/spl-account-compression": 0.1.4 "@solana/spl-memo": 0.2.3 "@solana/spl-token": 0.3.6 - "@solana/spl-token-metadata": ^0.1.4 + "@solana/spl-token-metadata": 0.1.4 "@solana/wallet-adapter-react": 0.15.33 "@solana/wallet-standard-features": 1.0.0 - "@solana/web3.js": ^1.87.6 - "@tanstack/react-query": ^5.45.1 + "@solana/web3.js": 1.87.6 + "@tanstack/react-query": 5.45.1 "@tradle/react-native-http": 2.0.1 "@turf/bbox": 6.5.0 "@turf/center": 6.5.0 "@turf/helpers": 6.5.0 - "@types/base-64": ^1.0.2 + "@types/base-64": 1.0.2 "@types/bn.js": 5.1.1 - "@types/debounce": ^1.2.4 + "@types/debounce": 1.2.4 "@types/i18n-js": 3.8.2 "@types/lodash": 4.14.183 - "@types/mapbox__geo-viewport": ^0.5.3 - "@types/markdown-it": ^13.0.5 + "@types/mapbox__geo-viewport": 0.5.3 + "@types/markdown-it": 13.0.5 "@types/parse5": 5.0.3 "@types/qs": 6.9.7 - "@types/react": 18.2.79 + "@types/react": 18.2.6 "@types/react-native": 0.70.6 "@types/react-native-charts-wrapper": 0.5.2 "@types/react-native-shared-group-preferences": 1.1.1 @@ -15532,23 +15742,24 @@ __metadata: "@walletconnect/react-native-compat": 2.2.1 "@walletconnect/sign-client": 2.2.1 "@walletconnect/types": 2.2.1 + aes-js: 3.1.2 angry-purple-tiger: 1.0.5 assert: 1.5.0 axios: 1.3.2 - axios-mock-adapter: ^1.22.0 - babel-jest: ^29.6.3 + axios-mock-adapter: 1.22.0 + babel-jest: 29.6.3 babel-plugin-module-resolver: 4.1.0 babel-plugin-transform-remove-console: 6.9.4 base-64: 1.0.0 bcrypt-react-native: 1.1.1 bignumber.js: 9.1.1 - bip39: ^3.1.0 + bip39: 3.1.0 bn.js: 5.2.1 browserify-zlib: 0.1.4 bs58: 5.0.0 buffer: 6.0.3 camelcase-keys: 7.0.2 - compare-versions: ^6.1.0 + compare-versions: 6.1.0 console-browserify: 1.2.0 constants-browserify: 1.0.0 crypto: 1.0.1 @@ -15556,7 +15767,7 @@ __metadata: deprecated-react-native-prop-types: 2.3.0 dns.js: 1.0.1 domain-browser: 1.2.0 - ed25519-hd-key: ^1.3.0 + ed25519-hd-key: 1.3.0 eslint: 7.32.0 eslint-config-airbnb: 18.2.1 eslint-config-airbnb-typescript: 14.0.2 @@ -15576,24 +15787,24 @@ __metadata: expo-haptics: 13.0.1 expo-linking: 6.3.1 expo-local-authentication: 14.0.1 - expo-location: ^17.0.1 + expo-location: 17.0.1 expo-secure-store: 13.0.2 fuse.js: 6.6.2 - geolib: ^3.3.4 + geolib: 3.3.4 h3-js: 4.1.0 https-browserify: 0.0.1 husky: 7.0.4 i18next: 21.9.1 - jest: ^29.6.3 + jest: 29.6.3 jetifier: 1.6.8 lodash: 4.17.21 long: 5.2.0 - lottie-ios: ^4.4.1 - lottie-react-native: ^6.7.0 - markdown-it: ^13.0.2 - metro-react-native-babel-transformer: ^0.77.0 + lottie-ios: 4.4.1 + lottie-react-native: 6.7.0 + markdown-it: 13.0.2 + metro-react-native-babel-transformer: 0.77.0 parse5: 6.0.1 - patch-package: ^8.0.0 + patch-package: 8.0.0 path-browserify: 0.0.0 prettier: 2.8.8 punycode: 1.4.1 @@ -15601,25 +15812,26 @@ __metadata: query-string: 7.1.1 querystring-es3: 0.2.1 react: 18.2.0 - react-async-hook: ^4.0.0 - react-error-boundary: ^4.0.13 + react-async-hook: 4.0.0 + react-error-boundary: 4.0.13 react-i18next: 11.18.4 react-native: 0.74.5 - react-native-animated-numbers: ^0.6.2 + react-native-animated-numbers: 0.6.2 react-native-appstate-hook: 1.0.6 react-native-ble-plx: 2.0.3 - react-native-bootsplash: ^6.3.2 + react-native-bootsplash: 6.3.2 react-native-charts-wrapper: 0.5.10 - react-native-clean-project: ^4.0.3 + react-native-cheerio: 1.0.0-rc.4 + react-native-clean-project: 4.0.3 react-native-cli-bump-version: 1.5.0 react-native-codegen: 0.0.7 - react-native-compass-heading: ^1.5.0 - react-native-confetti-cannon: ^1.5.2 + react-native-compass-heading: 1.5.0 + react-native-confetti-cannon: 1.5.2 react-native-config: 1.4.6 react-native-crypto: 2.2.0 react-native-device-info: 8.7.1 react-native-flash-message: 0.2.1 - react-native-geocoding: ^0.5.0 + react-native-geocoding: 0.5.0 react-native-gesture-handler: 2.18.1 react-native-get-random-values: 1.11.0 react-native-icloudstore: 0.9.0 @@ -15629,14 +15841,14 @@ __metadata: react-native-linear-gradient: 2.6.2 react-native-localize: 2.2.3 react-native-mail: 6.1.1 - react-native-markdown-display: ^7.0.0-alpha.2 - react-native-navigation-bar-color: ^2.0.2 + react-native-markdown-display: 7.0.0-alpha.2 + react-native-navigation-bar-color: 2.0.2 react-native-network-info: 5.2.1 react-native-onesignal: 5.2.2 - react-native-os: ^1.2.6 - react-native-pager-view: 6.3.0 - react-native-permissions: ^3.9.0 - react-native-qrcode-svg: ^6.3.2 + react-native-os: 1.2.6 + react-native-pager-view: 6.1.2 + react-native-permissions: 3.9.0 + react-native-qrcode-svg: 6.3.2 react-native-randombytes: 3.6.1 react-native-reanimated: 3.14.0 react-native-safe-area-context: 4.10.8 @@ -15644,9 +15856,9 @@ __metadata: react-native-share: 7.9.0 react-native-shared-group-preferences: 1.1.24 react-native-simple-toast: 1.1.4 - react-native-skeleton-placeholder: ^5.2.4 + react-native-skeleton-placeholder: 5.2.4 react-native-snap-carousel: 4.0.0-beta.6 - react-native-sodium: ^0.4.0 + react-native-sodium: 0.4.0 react-native-svg: 13.4.0 react-native-svg-transformer: 0.14.3 react-native-tab-view: 3.3.4 @@ -15654,8 +15866,9 @@ __metadata: react-native-test-flight: 1.1.0 react-native-text-ticker: 1.14.0 react-native-udp: 2.7.0 - react-native-url-polyfill: ^2.0.0 + react-native-url-polyfill: 2.0.0 react-native-video: 5.2.1 + react-native-vision-camera: 4.5.3 react-native-webview: 13.10.5 react-redux: 8.0.4 react-test-renderer: 17.0.2 @@ -15671,7 +15884,7 @@ __metadata: stream: 0.0.2 stream-browserify: 1.0.0 string_decoder: 0.10.31 - text-encoding-polyfill: ^0.6.7 + text-encoding-polyfill: 0.6.7 timers-browserify: 1.4.2 tinycolor2: 1.4.2 tty-browserify: 0.0.0 @@ -15792,6 +16005,21 @@ __metadata: languageName: node linkType: hard +"htmlparser2-without-node-native@npm:^3.9.0": + version: 3.9.2 + resolution: "htmlparser2-without-node-native@npm:3.9.2" + dependencies: + domelementtype: ^1.3.0 + domhandler: ^2.3.0 + domutils: ^1.5.1 + entities: ^1.1.1 + eventemitter2: ^1.0.0 + inherits: ^2.0.1 + readable-stream: ^2.0.2 + checksum: 95754dc0f9ab057b5c072eaf2daed6db7595ec7a51290fde0cde6df803cbe528927764da4acb7bc9e633ff6396b07046eff7edb6f1f619fe665df4eaa8c735ad + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -15921,7 +16149,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": +"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.1.8, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e @@ -16995,7 +17223,7 @@ __metadata: languageName: node linkType: hard -"jest-cli@npm:^29.7.0": +"jest-cli@npm:^29.6.3": version: 29.7.0 resolution: "jest-cli@npm:29.7.0" dependencies: @@ -17376,14 +17604,14 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.6.3": - version: 29.7.0 - resolution: "jest@npm:29.7.0" +"jest@npm:29.6.3": + version: 29.6.3 + resolution: "jest@npm:29.6.3" dependencies: - "@jest/core": ^29.7.0 + "@jest/core": ^29.6.3 "@jest/types": ^29.6.3 import-local: ^3.0.2 - jest-cli: ^29.7.0 + jest-cli: ^29.6.3 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -17391,7 +17619,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 17ca8d67504a7dbb1998cf3c3077ec9031ba3eb512da8d71cb91bcabb2b8995c4e4b292b740cb9bf1cbff5ce3e110b3f7c777b0cefb6f41ab05445f248d0ee0b + checksum: dd4f53fb84f28b665b47c628222e5d3b624e9e0afa79b22afceef4f2a53dc0d8f0edd7ca254917ace5c94c3a7bf58c108563234c4fe34e86c679ce99633cfbe6 languageName: node linkType: hard @@ -18276,13 +18504,6 @@ __metadata: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - "lodash.throttle@npm:^4.1.1": version: 4.1.1 resolution: "lodash.throttle@npm:4.1.1" @@ -18297,7 +18518,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.10, lodash@npm:^4.17.13, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:~4.17.0": +"lodash@npm:4.17.21, lodash@npm:^4.15.0, lodash@npm:^4.17.10, lodash@npm:^4.17.13, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:~4.17.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -18380,14 +18601,14 @@ __metadata: languageName: node linkType: hard -"lottie-ios@npm:^4.4.1": +"lottie-ios@npm:4.4.1": version: 4.4.1 resolution: "lottie-ios@npm:4.4.1" checksum: a3a1b60693a55abb2cb1496a1bf2596d51905a05367535e666bdb2a64e58e1aab2965a2badd3155d849ce9d287fe71df4314c0babd187d01ed07213044147766 languageName: node linkType: hard -"lottie-react-native@npm:^6.7.0": +"lottie-react-native@npm:6.7.0": version: 6.7.0 resolution: "lottie-react-native@npm:6.7.0" peerDependencies: @@ -18521,33 +18742,33 @@ __metadata: languageName: node linkType: hard -"markdown-it@npm:^10.0.0": - version: 10.0.0 - resolution: "markdown-it@npm:10.0.0" +"markdown-it@npm:13.0.2": + version: 13.0.2 + resolution: "markdown-it@npm:13.0.2" dependencies: - argparse: ^1.0.7 - entities: ~2.0.0 - linkify-it: ^2.0.0 + argparse: ^2.0.1 + entities: ~3.0.1 + linkify-it: ^4.0.1 mdurl: ^1.0.1 uc.micro: ^1.0.5 bin: markdown-it: bin/markdown-it.js - checksum: 69f5ee640cbebb451b80d3cce308fff7230767e05c0f8c206a1e413775b7a6e5a08e91e9f3ec59f9b5c5a45493f9ce7ac089379cffb60c9d3e6677ed9d535086 + checksum: bb4bf2cb3e5d77a7f3dc9cf48e17d050fbcd26d37992204eaa5812220752858fe9debe439b2ae1de06e749a3bba537c0baf6ce7510307cf7163a70f04fafe672 languageName: node linkType: hard -"markdown-it@npm:^13.0.2": - version: 13.0.2 - resolution: "markdown-it@npm:13.0.2" +"markdown-it@npm:^10.0.0": + version: 10.0.0 + resolution: "markdown-it@npm:10.0.0" dependencies: - argparse: ^2.0.1 - entities: ~3.0.1 - linkify-it: ^4.0.1 + argparse: ^1.0.7 + entities: ~2.0.0 + linkify-it: ^2.0.0 mdurl: ^1.0.1 uc.micro: ^1.0.5 bin: markdown-it: bin/markdown-it.js - checksum: bb4bf2cb3e5d77a7f3dc9cf48e17d050fbcd26d37992204eaa5812220752858fe9debe439b2ae1de06e749a3bba537c0baf6ce7510307cf7163a70f04fafe672 + checksum: 69f5ee640cbebb451b80d3cce308fff7230767e05c0f8c206a1e413775b7a6e5a08e91e9f3ec59f9b5c5a45493f9ce7ac089379cffb60c9d3e6677ed9d535086 languageName: node linkType: hard @@ -18843,7 +19064,7 @@ __metadata: languageName: node linkType: hard -"metro-react-native-babel-transformer@npm:^0.77.0": +"metro-react-native-babel-transformer@npm:0.77.0": version: 0.77.0 resolution: "metro-react-native-babel-transformer@npm:0.77.0" dependencies: @@ -19743,7 +19964,7 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^1.0.2": +"nth-check@npm:^1.0.2, nth-check@npm:~1.0.1": version: 1.0.2 resolution: "nth-check@npm:1.0.2" dependencies: @@ -20324,7 +20545,7 @@ __metadata: languageName: node linkType: hard -"patch-package@npm:^8.0.0": +"patch-package@npm:8.0.0": version: 8.0.0 resolution: "patch-package@npm:8.0.0" dependencies: @@ -21100,7 +21321,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:1.4.1": +"punycode@npm:1.4.1, punycode@npm:^1.3.2": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 @@ -21121,6 +21342,22 @@ __metadata: languageName: node linkType: hard +"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: ^2.8.1 + checksum: 97b023b46d7b95bff004f8340efc465c1d995f35d7e97a2ef2e28d5e160f5ca47b48f42463b6be92b4341452a6b8c555feb2b1eb59ee90b97bd5d6fc86ffb186 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.3 + resolution: "pvutils@npm:1.1.3" + checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9 + languageName: node + linkType: hard + "q@npm:^1.1.2": version: 1.5.1 resolution: "q@npm:1.5.1" @@ -21334,7 +21571,7 @@ __metadata: languageName: node linkType: hard -"react-async-hook@npm:^4.0.0": +"react-async-hook@npm:4.0.0, react-async-hook@npm:^4.0.0": version: 4.0.0 resolution: "react-async-hook@npm:4.0.0" peerDependencies: @@ -21353,7 +21590,7 @@ __metadata: languageName: node linkType: hard -"react-error-boundary@npm:^4.0.13": +"react-error-boundary@npm:4.0.13": version: 4.0.13 resolution: "react-error-boundary@npm:4.0.13" dependencies: @@ -21412,7 +21649,7 @@ __metadata: languageName: node linkType: hard -"react-native-animated-numbers@npm:^0.6.2": +"react-native-animated-numbers@npm:0.6.2": version: 0.6.2 resolution: "react-native-animated-numbers@npm:0.6.2" peerDependencies: @@ -21439,7 +21676,7 @@ __metadata: languageName: node linkType: hard -"react-native-bootsplash@npm:^6.3.2": +"react-native-bootsplash@npm:6.3.2": version: 6.3.2 resolution: "react-native-bootsplash@npm:6.3.2" dependencies: @@ -21477,7 +21714,22 @@ __metadata: languageName: node linkType: hard -"react-native-clean-project@npm:^4.0.3": +"react-native-cheerio@npm:1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "react-native-cheerio@npm:1.0.0-rc.4" + dependencies: + buffer: ^5.0.7 + css-select: ~1.2.0 + dom-serializer: ~0.1.0 + entities: ~1.1.1 + htmlparser2-without-node-native: ^3.9.0 + lodash: ^4.15.0 + react-native-parse-html: ^2.2.6 + checksum: 9b384f6c588cdb430c579263fc2fd9ed18750cb3146cc79bb47ec5b64f31e23c203b97590afc87b6c6ffddd978f9a6cbd593b21cb7a3c6f331346dbc45abcd79 + languageName: node + linkType: hard + +"react-native-clean-project@npm:4.0.3": version: 4.0.3 resolution: "react-native-clean-project@npm:4.0.3" bin: @@ -21504,7 +21756,7 @@ __metadata: languageName: node linkType: hard -"react-native-compass-heading@npm:^1.5.0": +"react-native-compass-heading@npm:1.5.0": version: 1.5.0 resolution: "react-native-compass-heading@npm:1.5.0" peerDependencies: @@ -21514,7 +21766,7 @@ __metadata: languageName: node linkType: hard -"react-native-confetti-cannon@npm:^1.5.2": +"react-native-confetti-cannon@npm:1.5.2": version: 1.5.2 resolution: "react-native-confetti-cannon@npm:1.5.2" checksum: 09026fd93304c0f3c3acfcf8dfc9b25003b30826031dffd81df6eea3b66dcee84f6ac4237719a84d3d71cb430f4fbf53d4c22b64ef17d439d5a3e5986c2ada83 @@ -21595,7 +21847,7 @@ __metadata: languageName: node linkType: hard -"react-native-geocoding@npm:^0.5.0": +"react-native-geocoding@npm:0.5.0": version: 0.5.0 resolution: "react-native-geocoding@npm:0.5.0" checksum: a33e9dc87d104abe19206660e9fa0782090909ca8b58c70eae4690faa92194817724833086b29c57387500cdd9ecd0febd6ccbbd0f4eac0e11a93696429cf9d2 @@ -21726,7 +21978,7 @@ __metadata: languageName: node linkType: hard -"react-native-markdown-display@npm:^7.0.0-alpha.2": +"react-native-markdown-display@npm:7.0.0-alpha.2": version: 7.0.0-alpha.2 resolution: "react-native-markdown-display@npm:7.0.0-alpha.2" dependencies: @@ -21741,7 +21993,7 @@ __metadata: languageName: node linkType: hard -"react-native-navigation-bar-color@npm:^2.0.2": +"react-native-navigation-bar-color@npm:2.0.2": version: 2.0.2 resolution: "react-native-navigation-bar-color@npm:2.0.2" checksum: 47b74fc343c63b90819a67889b7af6e9b6524a663586dc8a7927d81e8517fbf8b395545d651ddf44e978167e4d8994a4b6d6e3dc086a35903c48087fa40155cd @@ -21766,26 +22018,35 @@ __metadata: languageName: node linkType: hard -"react-native-os@npm:^1.2.6": +"react-native-os@npm:1.2.6": version: 1.2.6 resolution: "react-native-os@npm:1.2.6" checksum: a0259a5b1d25dddf4b88eb501a55799403b71cef04d54f7750ea24f881fc0c31a49e809021e9ba1e9a9fa8cbcc8a2e097afcf2904045b21895ce995621d44d4f languageName: node linkType: hard -"react-native-pager-view@npm:6.3.0": - version: 6.3.0 - resolution: "react-native-pager-view@npm:6.3.0" +"react-native-pager-view@npm:6.1.2": + version: 6.1.2 + resolution: "react-native-pager-view@npm:6.1.2" peerDependencies: react: "*" react-native: "*" - checksum: 6a7224c191bf64a2a476627221cc7fcbcb9bbc735ec5f2215d5b888fb8d31c0fc2c769b298b9a21d68636bcef626ae8d1b266f0b414d469a9a8fb21b4357c45c + checksum: 813da82c7816748b7a66c87d281c11cc3d787342b0896ffad686ee15e968911f4ed7b1164cdf196068eb2abcb28513bd85cdd0023280af73ff66e2b42bd2efa1 languageName: node linkType: hard -"react-native-permissions@npm:^3.9.0": - version: 3.9.2 - resolution: "react-native-permissions@npm:3.9.2" +"react-native-parse-html@npm:^2.2.6": + version: 2.2.6 + resolution: "react-native-parse-html@npm:2.2.6" + dependencies: + react-native-stream: ^0.1.0 + checksum: 21c8a8b95a9ff579639514ab16b17a2fe748eb308dd2b78840a7982e457e03ae7e076577f49993041ab55e64859399d5039502efd2ebd2a677353cd21fb084e5 + languageName: node + linkType: hard + +"react-native-permissions@npm:3.9.0": + version: 3.9.0 + resolution: "react-native-permissions@npm:3.9.0" peerDependencies: react: ">=16.13.1" react-native: ">=0.63.3" @@ -21793,11 +22054,11 @@ __metadata: peerDependenciesMeta: react-native-windows: optional: true - checksum: 047540958d415e62ea2359f8f5da392a345cec11d7bbe14b065459375b1185431bc98ac144595b9db27376ebb059811f79d9f3c80d61508aeecc3cb5e7c49996 + checksum: 4c08edb5fbddb8a927e32cf3cb7d3db255400978336e684ed44b1b263ba6fcdac508eebe27942e374e2c7418af3e4181ad59e4b7d7c159056ec5ba777214ef7a languageName: node linkType: hard -"react-native-qrcode-svg@npm:^6.3.2": +"react-native-qrcode-svg@npm:6.3.2": version: 6.3.2 resolution: "react-native-qrcode-svg@npm:6.3.2" dependencies: @@ -21888,7 +22149,7 @@ __metadata: languageName: node linkType: hard -"react-native-skeleton-placeholder@npm:^5.2.4": +"react-native-skeleton-placeholder@npm:5.2.4": version: 5.2.4 resolution: "react-native-skeleton-placeholder@npm:5.2.4" peerDependencies: @@ -21913,13 +22174,23 @@ __metadata: languageName: node linkType: hard -"react-native-sodium@npm:^0.4.0": +"react-native-sodium@npm:0.4.0, react-native-sodium@npm:^0.4.0": version: 0.4.0 resolution: "react-native-sodium@npm:0.4.0" checksum: fd8bcfcb48ef029ddf57b362e02699de9cefe7a260947c454083201a67fd1e40cb6516f7a5bbcbaf4fb57dad29872b35a4649cdea5fb898cf036b578268d5c7b languageName: node linkType: hard +"react-native-stream@npm:^0.1.0": + version: 0.1.9 + resolution: "react-native-stream@npm:0.1.9" + dependencies: + base64-js: ^1.2.0 + ieee754: ^1.1.8 + checksum: 9f04c24fa3d1032ee0bfc09a61a63a62bc13fab2fc45d4f11643860025fd7908c03c0c105daa70708e5470cc8ddb5f2c7f012a36b10bb82625d3d1b7d54a5955 + languageName: node + linkType: hard + "react-native-svg-transformer@npm:0.14.3": version: 0.14.3 resolution: "react-native-svg-transformer@npm:0.14.3" @@ -22006,7 +22277,7 @@ __metadata: languageName: node linkType: hard -"react-native-url-polyfill@npm:^2.0.0": +"react-native-url-polyfill@npm:2.0.0": version: 2.0.0 resolution: "react-native-url-polyfill@npm:2.0.0" dependencies: @@ -22029,6 +22300,26 @@ __metadata: languageName: node linkType: hard +"react-native-vision-camera@npm:4.5.3": + version: 4.5.3 + resolution: "react-native-vision-camera@npm:4.5.3" + peerDependencies: + "@shopify/react-native-skia": "*" + react: "*" + react-native: "*" + react-native-reanimated: "*" + react-native-worklets-core: "*" + peerDependenciesMeta: + "@shopify/react-native-skia": + optional: true + react-native-reanimated: + optional: true + react-native-worklets-core: + optional: true + checksum: 99d57a70f93134903ae25ef798947f79804ea00e3b58cbb21131115552e6f2950d2a3be9a6a237232ca6bab7b5031aa12d9ca2df659be39dc607d75997317abc + languageName: node + linkType: hard + "react-native-webview@npm:13.10.5": version: 13.10.5 resolution: "react-native-webview@npm:13.10.5" @@ -22246,7 +22537,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -24506,7 +24797,7 @@ __metadata: languageName: node linkType: hard -"text-encoding-polyfill@npm:^0.6.7": +"text-encoding-polyfill@npm:0.6.7, text-encoding-polyfill@npm:^0.6.7": version: 0.6.7 resolution: "text-encoding-polyfill@npm:0.6.7" checksum: 8e5b45154f3394cd29af01760ec2f728caba7cfc57fbcab60c073dc9c6db479d923efda3e074ae467379c4a0710c45e6427c6917a70da3059876924c190e03ed @@ -24847,6 +25138,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.3.1, tslib@npm:^2.5.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.7.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a + languageName: node + linkType: hard + "tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -24861,13 +25159,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.5.0, tslib@npm:^2.6.3": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a - languageName: node - linkType: hard - "tslib@npm:~2.4.0": version: 2.4.1 resolution: "tslib@npm:2.4.1" @@ -24875,6 +25166,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:~2.5.0": + version: 2.5.3 + resolution: "tslib@npm:2.5.3" + checksum: 88902b309afaf83259131c1e13da1dceb0ad1682a213143a1346a649143924d78cf3760c448b84d796938fd76127183894f8d85cbb3bf9c4fddbfcc140c0003c + languageName: node + linkType: hard + "tslib@npm:~2.6.0": version: 2.6.3 resolution: "tslib@npm:2.6.3" @@ -25358,6 +25656,13 @@ __metadata: languageName: node linkType: hard +"urlpattern-polyfill@npm:^8.0.0": + version: 8.0.2 + resolution: "urlpattern-polyfill@npm:8.0.2" + checksum: d2cc0905a613c77e330c426e8697ee522dd9640eda79ac51160a0f6350e103f09b8c327623880989f8ba7325e8d95267b745aa280fdcc2aead80b023e16bd09d + languageName: node + linkType: hard + "use-debounce@npm:7.0.1": version: 7.0.1 resolution: "use-debounce@npm:7.0.1" @@ -25621,6 +25926,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.2.1": + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb + languageName: node + linkType: hard + "web3-utils@npm:^1.3.4": version: 1.10.4 resolution: "web3-utils@npm:1.10.4" @@ -25637,6 +25949,19 @@ __metadata: languageName: node linkType: hard +"webcrypto-core@npm:^1.8.0": + version: 1.8.1 + resolution: "webcrypto-core@npm:1.8.1" + dependencies: + "@peculiar/asn1-schema": ^2.3.13 + "@peculiar/json-schema": ^1.1.12 + asn1js: ^3.0.5 + pvtsutils: ^1.3.5 + tslib: ^2.7.0 + checksum: 5f8d862991bf9b36bfec53a317ceec7de95010c6d16092d2ba62b988acdfca9adfd254ef388036e610c66d0aad506d3f344574f62e06501a8c72ef961c8996b2 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1"