Merge branch 'master' into dependabot/npm_and_yarn/fast-xml-builder-1.2.0

This commit is contained in:
Overtorment 2026-05-09 13:07:41 +01:00 committed by GitHub
commit edff2468d4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 889 additions and 705 deletions

View File

@ -10,6 +10,10 @@ on:
- master
workflow_dispatch:
concurrency:
group: build-ios-release-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: macos-26
@ -26,7 +30,7 @@ jobs:
steps:
- name: Checkout Project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # Ensures the full Git history is
@ -65,13 +69,12 @@ jobs:
echo "Branch Name: ${{ env.CURRENT_BRANCH }}"
- name: Specify Node.js Version
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1
- uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1.7.0
with:
xcode-version: latest
@ -244,6 +247,17 @@ jobs:
- name: Install Node Modules
run: npm ci --omit=dev --yes
- name: Cache CocoaPods
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods/repos
key: ${{ runner.os }}-pods-ios-release-${{ hashFiles('ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-ios-release-
- name: Install CocoaPods Dependencies
run: |
bundle exec fastlane ios install_pods
@ -430,7 +444,7 @@ jobs:
- name: Upload Build Logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: build_logs
path: ./ios/build_logs/
@ -451,7 +465,7 @@ jobs:
- name: Upload IPA as Artifact
if: success()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: BlueWallet_IPA
path: ${{ env.IPA_OUTPUT_PATH }}
@ -473,7 +487,7 @@ jobs:
BRANCH_NAME: ${{ needs.build.outputs.branch_name }}
steps:
- name: Checkout Project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set Up Ruby
uses: ruby/setup-ruby@v1

View File

@ -49,27 +49,26 @@ jobs:
- name: Checkout project
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Setup Node.js
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: npm
cache-dependency-path: package-lock.json
cache: 'npm'
- name: Setup Xcode
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1
uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1.7.0
with:
xcode-version: latest
- name: Set up Ruby
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
bundler-cache: true
@ -78,6 +77,18 @@ jobs:
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
run: npm ci
- name: Cache CocoaPods
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods/repos
key: ${{ runner.os }}-pods-catalyst-${{ hashFiles('ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-catalyst-
- name: Install CocoaPods dependencies
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
run: bundle exec fastlane ios install_pods
@ -110,7 +121,7 @@ jobs:
- name: Upload Mac Catalyst DMG
id: upload_dmg
if: success() && (github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true')
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: BlueWallet-Mac-Catalyst
path: ${{ steps.build_catalyst.outputs.catalyst_dmg_path }}

View File

@ -11,11 +11,11 @@ on:
jobs:
buildReleaseApk:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: "0"
@ -37,18 +37,26 @@ jobs:
df -h
- name: Specify node version
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Use specific Java version for sdkmanager to work
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
with:
distribution: 'temurin'
java-version: '17'
cache: 'gradle'
- name: Use gradle caches
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('android/**/*.gradle', 'android/**/*.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Set up Android SDK
uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3
@ -62,19 +70,11 @@ jobs:
run: npm ci --yes
- name: Set up Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
bundler-cache: true
- name: Cache Ruby Gems
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: vendor/bundle
key: ${{ runner.os }}-ruby-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-ruby-
- name: Generate Build Number based on timestamp
id: build_number
run: |
@ -92,7 +92,7 @@ jobs:
- name: Upload build logs on failure
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: android-build-logs
path: |
@ -122,23 +122,23 @@ jobs:
echo "APK_PATH=${APK_PATH}" >> $GITHUB_ENV
- name: Upload APK as artifact
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: signed-apk
path: ${{ env.APK_PATH }}
if-no-files-found: error
browserstack:
runs-on: macos-latest
runs-on: macos-26
needs: buildReleaseApk
if: ${{ github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'browserstack') }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: 3.4.8
bundler-cache: true

View File

@ -14,16 +14,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Specify node version
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Install node_modules
run: npm ci || npm ci
@ -35,16 +34,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Specify node version
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Install node_modules
run: npm ci || npm ci
@ -66,16 +64,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Specify node version
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Install node_modules
run: npm ci || npm ci

152
.github/workflows/e2e-android.yml vendored Normal file
View File

@ -0,0 +1,152 @@
name: Tests e2e Android
on: [pull_request]
permissions:
contents: read
concurrency:
group: e2e-android-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Free disk space (Ubuntu)
run: |
echo "Disk before cleanup:" && df -h
sudo rm -rf /usr/share/dotnet /opt/ghc
sudo apt-get clean
sudo rm -rf /opt/ghc || true
sudo rm -rf /usr/local/share/boost || true
sudo rm -rf /usr/local/lib/android/sdk/ndk || true
sudo docker system prune -af || true
sudo rm -rf /usr/local/lib/android/sdk/system-images || true
sudo rm -rf /usr/local/lib/android/sdk/emulator || true
rm -rf ~/.gradle/caches/modules-2/files-2.1 || true
rm -rf ~/.gradle/caches/build-cache || true
rm -rf ~/.npm/_cacache ~/.cache || true
sudo rm -rf /home/runner/work/_temp || true
echo "Disk after cleanup:" && df -h
- name: Specify node version
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
- name: Use gradle caches
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('android/**/*.gradle', 'android/**/*.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Install node_modules
run: npm ci || npm ci
- name: Use specific Java version for sdkmanager to work
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
with:
distribution: 'temurin'
java-version: '17'
- name: Build
run: npm run e2e:release-build || npm run e2e:release-build
- name: Package APKs
run: |
tar -czf bluewallet-android-apks.tar.gz \
android/app/build/outputs/apk/release/app-release.apk \
android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk
- name: Upload APKs
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bluewallet-android-apks
path: bluewallet-android-apks.tar.gz
retention-days: 3
compression-level: 0
if-no-files-found: error
test:
runs-on: ubuntu-24.04
needs: build
env:
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }}
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Free disk space (Ubuntu)
run: |
echo "Disk before cleanup:" && df -h
sudo rm -rf /usr/share/dotnet /opt/ghc
sudo apt-get clean
sudo rm -rf /opt/ghc || true
sudo rm -rf /usr/local/share/boost || true
sudo rm -rf /usr/local/lib/android/sdk/ndk || true
sudo docker system prune -af || true
rm -rf ~/.npm/_cacache ~/.cache || true
sudo rm -rf /home/runner/work/_temp || true
echo "Disk after cleanup:" && df -h
- name: Ensure artifacts directory
run: mkdir -p ${{ github.workspace }}/artifacts
- name: Specify node version
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
- name: Install node_modules
run: npm ci || npm ci
- name: Use specific Java version for sdkmanager to work
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
with:
distribution: 'temurin'
java-version: '17'
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Download APKs
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: bluewallet-android-apks
- name: Restore APKs
run: tar -xzf bluewallet-android-apks.tar.gz
- name: Run tests
uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2
with:
api-level: 36
profile: pixel
avd-name: Pixel_API_29_AOSP
force-avd-creation: true
enable-hw-keyboard: true
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none -camera-front none -partition-size 2047
arch: x86_64
script: npm run e2e:release-test -- --record-videos failing --record-logs failing --take-screenshots failing --headless --retries 4 --reuse --artifacts-location ${{ github.workspace }}/artifacts
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: failure()
with:
name: e2e-android-videos
path: ${{ github.workspace }}/artifacts

213
.github/workflows/e2e-ios.yml vendored Normal file
View File

@ -0,0 +1,213 @@
name: Tests e2e iOS
on: [pull_request]
permissions:
contents: read
concurrency:
group: e2e-ios-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: macos-26
env:
BUILD_CONFIGURATION: Release
CCACHE_MAXSIZE: "2G"
CCACHE_DIR: /Users/runner/.ccache
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
- name: Setup Ruby
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
ruby-version: "3.4.8"
bundler-cache: true
- name: Install Node dependencies
run: npm ci || npm ci
- name: Cache CocoaPods
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: |
ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods/repos
key: ${{ runner.os }}-pods-prebuilt-${{ hashFiles('ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-prebuilt-
- name: Install ccache
run: brew install ccache
- name: Cache ccache
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ~/.ccache
key: ${{ runner.os }}-ccache-${{ github.sha }}
restore-keys: |
${{ runner.os }}-ccache-
- name: Delete extension and watch targets
run: |
bundle exec ruby <<'RUBY'
require 'xcodeproj'
project_path = 'ios/BlueWallet.xcodeproj'
project = Xcodeproj::Project.open(project_path)
target_names = %w[BlueWalletWatch WidgetsExtension Stickers]
embed_phase_names = ['Embed Watch Content', 'Embed Foundation Extensions']
removed_any = false
target_names.each do |target_name|
target = project.targets.find { |t| t.name == target_name }
next unless target
puts "Removing target #{target_name}"
target.dependencies.each(&:remove_from_project)
target.build_phases.each(&:remove_from_project)
project.targets.delete(target)
removed_any = true
end
main_target = project.targets.find { |t| t.name == 'BlueWallet' }
if main_target
main_target.build_phases.select { |phase| embed_phase_names.include?(phase.display_name) }.each do |phase|
puts "Removing build phase #{phase.display_name}"
phase.remove_from_project
main_target.build_phases.delete(phase)
removed_any = true
end
end
if removed_any
project.save
puts 'Extension and watch target references removed'
else
puts 'No extension or watch targets found'
end
RUBY
- name: Remove extension and watch schemes
run: |
rm -f ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme
rm -f ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WidgetsExtension.xcscheme
rm -f ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/Stickers.xcscheme
- name: Install CocoaPods dependencies
env:
RCT_USE_RN_DEP: "1"
RCT_USE_PREBUILT_RNCORE: "1"
USE_CCACHE: "1"
run: bundle exec fastlane ios install_pods || bundle exec fastlane ios install_pods
- name: Reset ccache stats
run: ccache -z || true
- name: Build iOS simulator app
working-directory: ios
env:
RCT_NO_LAUNCH_PACKAGER: "1"
CCACHE_BINARY: /opt/homebrew/bin/ccache
run: |
set -eo pipefail
build() {
xcodebuild \
-workspace BlueWallet.xcworkspace \
-scheme BlueWallet \
-configuration "${BUILD_CONFIGURATION}" \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath build \
CLANG_ENABLE_EXPLICIT_MODULES=NO \
SWIFT_ENABLE_EXPLICIT_MODULES=NO \
build
}
build || build
- name: ccache stats
if: always()
run: ccache -s || true
- name: Package simulator app
run: |
APP_DIR="ios/build/Build/Products/${BUILD_CONFIGURATION}-iphonesimulator/BlueWallet.app"
if [ ! -d "$APP_DIR" ]; then
echo "Simulator app not found at $APP_DIR"
find ios/build -maxdepth 5 -name '*.app' || true
exit 1
fi
tar -czf BlueWallet.app.tar.gz -C "$(dirname "$APP_DIR")" "$(basename "$APP_DIR")"
- name: Upload simulator app
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bluewallet-ios-app
path: BlueWallet.app.tar.gz
retention-days: 3
compression-level: 0
if-no-files-found: error
test:
runs-on: macos-26
needs: build
env:
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }}
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: 'npm'
- name: Install Node dependencies
run: npm ci || npm ci
- name: Install applesimutils
run: |
brew tap wix/brew
brew install applesimutils
- name: Download simulator app
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: bluewallet-ios-app
- name: Restore simulator app
run: |
mkdir -p ios/build/Build/Products/Release-iphonesimulator
tar -xzf BlueWallet.app.tar.gz -C ios/build/Build/Products/Release-iphonesimulator
- name: Run detox tests
timeout-minutes: 360
run: |
npm run e2e:test:ios-release -- \
--record-videos failing \
--record-logs failing \
--take-screenshots failing \
--headless \
--retries 3 \
--reuse \
--artifacts-location ./artifacts
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: failure()
with:
name: e2e-ios-videos
path: ./artifacts/

View File

@ -1,247 +0,0 @@
name: Tests e2e
on: [pull_request]
permissions:
contents: read
jobs:
ios:
runs-on: macos-26
env:
BUILD_CONFIGURATION: Release
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }}
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.4.8"
- name: Cache Ruby gems
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: vendor/bundle
key: ${{ runner.os }}-ruby-${{ hashFiles('Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-ruby-
- name: Install Ruby gems
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3 --quiet
- name: Install Node dependencies
run: npm ci || npm ci
- name: Cache CocoaPods
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ios/Pods
key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install CocoaPods dependencies
run: bundle exec fastlane ios install_pods || bundle exec fastlane ios install_pods
- name: Delete Apple Watch target
run: |
bundle exec ruby <<'RUBY'
require 'xcodeproj'
project_path = 'ios/BlueWallet.xcodeproj'
project = Xcodeproj::Project.open(project_path)
target_names = %w[BlueWalletWatch]
removed_any = false
target_names.each do |target_name|
target = project.targets.find { |t| t.name == target_name }
next unless target
puts "Removing target #{target_name}"
target.dependencies.each(&:remove_from_project)
target.build_phases.each(&:remove_from_project)
project.targets.delete(target)
removed_any = true
end
main_target = project.targets.find { |t| t.name == 'BlueWallet' }
if main_target
main_target.build_phases.select { |phase| phase.display_name == 'Embed Watch Content' }.each do |phase|
puts "Removing build phase #{phase.display_name}"
phase.remove_from_project
main_target.build_phases.delete(phase)
removed_any = true
end
end
if removed_any
project.save
puts 'Apple Watch target references removed'
else
puts 'No Apple Watch targets found'
end
RUBY
- name: Remove Watch schemes
run: rm -f ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme
- name: Build iOS simulator app
working-directory: ios
env:
RCT_NO_LAUNCH_PACKAGER: "1"
run: |
set -eo pipefail
build() {
xcodebuild \
-workspace BlueWallet.xcworkspace \
-scheme BlueWallet \
-configuration "${BUILD_CONFIGURATION}" \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath build \
build
}
build || build
- name: Package simulator app
run: |
APP_DIR="ios/build/Build/Products/${BUILD_CONFIGURATION}-iphonesimulator/BlueWallet.app"
if [ ! -d "$APP_DIR" ]; then
echo "Simulator app not found at $APP_DIR"
find ios/build -maxdepth 5 -name '*.app' || true
exit 1
fi
OUTPUT_DIR="BlueWallet-simulator"
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"
cp -R "$APP_DIR" "$OUTPUT_DIR/BlueWallet.app"
echo "APP_EXPORT_PATH=$OUTPUT_DIR" >> "$GITHUB_ENV"
- name: Install applesimutils
run: |
brew tap wix/brew
brew install applesimutils
- name: Run detox tests
timeout-minutes: 360
run: |
npm run e2e:test:ios-release -- \
--record-videos failing \
--record-logs failing \
--take-screenshots failing \
--headless \
--retries 3 \
--reuse \
--artifacts-location ./artifacts
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
if: failure()
with:
name: e2e-ios-videos
path: ./artifacts/
android:
runs-on: ubuntu-22.04
env:
HD_MNEMONIC: ${{ secrets.HD_MNEMONIC }}
HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }}
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0
- name: Free disk space (Ubuntu)
run: |
echo "Disk before cleanup:" && df -h
sudo rm -rf /usr/share/dotnet /opt/ghc
sudo apt-get clean
sudo rm -rf /opt/ghc || true
sudo rm -rf /usr/local/share/boost || true
sudo rm -rf /usr/local/lib/android/sdk/ndk || true
sudo docker system prune -af || true
sudo rm -rf /usr/local/lib/android/sdk/system-images || true
sudo rm -rf /usr/local/lib/android/sdk/emulator || true
rm -rf ~/.gradle/caches/modules-2/files-2.1 || true
rm -rf ~/.gradle/caches/build-cache || true
rm -rf ~/.npm/_cacache ~/.cache || true
sudo rm -rf /home/runner/work/_temp || true
echo "Disk after cleanup:" && df -h
- name: Ensure artifacts directory
run: |
mkdir -p ${{ github.workspace }}/artifacts
- name: Specify node version
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: 24
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Use gradle caches
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Install node_modules
run: npm ci --omit=dev --yes || npm ci --omit=dev --yes
- name: Use specific Java version for sdkmanager to work
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
with:
distribution: 'temurin'
java-version: '17'
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Build
run: npm run e2e:release-build || npm run e2e:release-build
- name: Install dev deps needed for tests
run: npm i || npm i
- name: Run tests
uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2
with:
api-level: 36
profile: pixel
avd-name: Pixel_API_29_AOSP
force-avd-creation: true
enable-hw-keyboard: true
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none -camera-front none -partition-size 2047
arch: x86_64
script: npm run e2e:release-test -- --record-videos failing --record-logs failing --take-screenshots failing --headless --retries 4 --reuse --artifacts-location ${{ github.workspace }}/artifacts
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
if: failure()
with:
name: e2e-android-videos
path: ${{ github.workspace }}/artifacts

View File

@ -41,7 +41,7 @@ post_install do |installer|
react_native_post_install(
installer,
:mac_catalyst_enabled => true,
# :ccache_enabled => true
:ccache_enabled => ENV['USE_CCACHE'] == '1',
)
# Fix RCTDeprecation module map error with Xcode 16+/26+ (required for react-native-notifications).
# The bridging header imports RCTBridgeModule.h which does

File diff suppressed because it is too large Load Diff

196
package-lock.json generated
View File

@ -31,10 +31,10 @@
"@react-native-vector-icons/ionicons": "13.1.1",
"@react-native-vector-icons/material-design-icons": "13.1.1",
"@react-native-vector-icons/material-icons": "13.1.1",
"@react-native/babel-preset": "0.85.2",
"@react-native/codegen": "0.85.2",
"@react-native/gradle-plugin": "0.85.2",
"@react-native/metro-config": "0.85.2",
"@react-native/babel-preset": "0.85.3",
"@react-native/codegen": "0.85.3",
"@react-native/gradle-plugin": "0.85.3",
"@react-native/metro-config": "0.85.3",
"@react-navigation/devtools": "7.0.56",
"@react-navigation/drawer": "7.9.9",
"@react-navigation/native": "7.2.2",
@ -59,7 +59,7 @@
"crypto-browserify": "3.12.1",
"crypto-js": "4.2.0",
"dayjs": "1.11.20",
"detox": "20.51.0",
"detox": "20.51.1",
"ecpair": "3.0.0",
"electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d",
"electrum-mnemonic": "2.0.0",
@ -71,7 +71,7 @@
"qr": "0.5.5",
"react": "19.2.3",
"react-localization": "github:BlueWallet/react-localization#ae7969a",
"react-native": "0.85.2",
"react-native": "0.85.3",
"react-native-biometrics": "3.0.1",
"react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442",
"react-native-camera-kit-no-google": "github:BlueWallet/react-native-camera-kit-no-google#0ed049a62da29cf304019363ec9d9ef3a73652e6",
@ -119,11 +119,11 @@
"@babel/preset-env": "^7.26.0",
"@babel/runtime": "^7.26.0",
"@jest/reporters": "^27.5.1",
"@react-native/eslint-config": "^0.85.2",
"@react-native/jest-preset": "0.85.2",
"@react-native/js-polyfills": "^0.85.2",
"@react-native/metro-babel-transformer": "^0.85.2",
"@react-native/typescript-config": "^0.85.2",
"@react-native/eslint-config": "^0.85.3",
"@react-native/jest-preset": "0.85.3",
"@react-native/js-polyfills": "^0.85.3",
"@react-native/metro-babel-transformer": "^0.85.3",
"@react-native/typescript-config": "^0.85.3",
"@testing-library/react-native": "^13.0.1",
"@types/bip38": "^3.1.2",
"@types/bs58check": "^2.1.0",
@ -3918,31 +3918,31 @@
}
},
"node_modules/@react-native/assets-registry": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.2.tgz",
"integrity": "sha512-kauC/oPaxklU4Y+u9gBfCBJm51qX6WBZq4xx0USCdimtp+G8+554kpygfSWIjoqCJa2o06bWxBEjesiuCv+LzA==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.3.tgz",
"integrity": "sha512-u9ZiYP23vA2IFtdFQFmetzSmk6SM0xgKIoiOsr1hXNHjHaLhOm+/Ph1ud57wX6+Dbwdzx8coJgnzSKL3W21PCg==",
"license": "MIT",
"engines": {
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/babel-plugin-codegen": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.85.2.tgz",
"integrity": "sha512-5Dqn08kRTUIxPLYju9hExI0cR1ESX+P5tEv5yv0q0UZcisRTw0VB8iUWDIph2LdY1i5Dc8PIvuaWMRNCw3vnKg==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.85.3.tgz",
"integrity": "sha512-Wc94zGfeFG8Njf9SHMPfYZP04kjigkOps6F1TYTvd7ZVXuGxqseCDgxc50LWcOhOCLypI9n3oVVqz81C3p44ZA==",
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.29.0",
"@react-native/codegen": "0.85.2"
"@react-native/codegen": "0.85.3"
},
"engines": {
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/babel-preset": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.85.2.tgz",
"integrity": "sha512-7d2yW23eKkVt0FbbnZLxqO7KybGLtQXOuvvcO1NUOYGtjzVh6ihNKn0TIHrhSNpMyHwYLDoiiuj95wLtcg3IwQ==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.85.3.tgz",
"integrity": "sha512-fD7fxEhkJB/aF57tWoXjaAWpklfrExYZS3k6aXPP3BQ77DZY7gvf/b7dbirwjID6NVnP1JDRJyTuPBGr0K/vlw==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
@ -3974,7 +3974,7 @@
"@babel/plugin-transform-runtime": "^7.24.7",
"@babel/plugin-transform-typescript": "^7.25.2",
"@babel/plugin-transform-unicode-regex": "^7.24.7",
"@react-native/babel-plugin-codegen": "0.85.2",
"@react-native/babel-plugin-codegen": "0.85.3",
"babel-plugin-syntax-hermes-parser": "0.33.3",
"babel-plugin-transform-flow-enums": "^0.0.2",
"react-refresh": "^0.14.0"
@ -3987,9 +3987,9 @@
}
},
"node_modules/@react-native/codegen": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.2.tgz",
"integrity": "sha512-XCginmxh0//++EXVOEJHBVZxHla294FzLCFF6jXwAUjvXVhqyIKyxhABfz+r4OOmaiuWk4Rtd4arqdAzeHeprg==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.3.tgz",
"integrity": "sha512-/JkS1lGLyzBWP1FbgDwaqEf7qShIC6pUC1M0a/YMAd/v4iqR24MRkQWe7jkYvcBQ2LpEhs5NGE9InhxSv21zCA==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
@ -4008,17 +4008,17 @@
}
},
"node_modules/@react-native/community-cli-plugin": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.2.tgz",
"integrity": "sha512-3KLgSg1kHvBpr93zMaQhvfYTgnCw7yZRED+3J4dMcYjfSjtD0Wf8SofU6uBmAw9JaVYvP43lpdwUpI4p0+ABsg==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.3.tgz",
"integrity": "sha512-fs85dmbIqNmtzEixDb0g+q6R3Vt4H9eAt8/inIZdDKfjN76+sUJA2r1nxODQ76bU23MrIbz8sI7KFBPaWk/zQw==",
"license": "MIT",
"dependencies": {
"@react-native/dev-middleware": "0.85.2",
"@react-native/dev-middleware": "0.85.3",
"debug": "^4.4.0",
"invariant": "^2.2.4",
"metro": "^0.84.0",
"metro-config": "^0.84.0",
"metro-core": "^0.84.0",
"metro": "^0.84.3",
"metro-config": "^0.84.3",
"metro-core": "^0.84.3",
"semver": "^7.1.3"
},
"engines": {
@ -4026,7 +4026,7 @@
},
"peerDependencies": {
"@react-native-community/cli": "*",
"@react-native/metro-config": "0.85.2"
"@react-native/metro-config": "0.85.3"
},
"peerDependenciesMeta": {
"@react-native-community/cli": {
@ -4050,18 +4050,18 @@
}
},
"node_modules/@react-native/debugger-frontend": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.2.tgz",
"integrity": "sha512-j+0b9H5f5hGTLQxHIhJU/b/W6ijuxJF+ZTLHB0se2kzUBNxFKd7DkIc6753qk3CJdiv55vxG3XDgmlpbHxOpmA==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.3.tgz",
"integrity": "sha512-uAu7rM5o/Np1zgp6fi5zM1sP1aB8DcS7DdOLcj/TkSutOAjkMqqd2lWt1/+3S7qXexRHVK5XcP+o3VXo4L/V0A==",
"license": "BSD-3-Clause",
"engines": {
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/debugger-shell": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.2.tgz",
"integrity": "sha512-r5BkhqPMfg3LmaZS5zadHmBNVH5h4bhSpv4BEPGfK4gat9HABAMzUzybi+2wpgU3SoHxnyKGdExEJvoqVcjeRg==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.3.tgz",
"integrity": "sha512-/jRAaT9boiCttIcEwS02WPwYkUihqsjSaK/TMtHz05vT6uMgac9PaQt5kzBQLIABv5aEIa5gtrMmKVz49MjkjQ==",
"license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.6",
@ -4073,14 +4073,14 @@
}
},
"node_modules/@react-native/dev-middleware": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.2.tgz",
"integrity": "sha512-3J+NaDUg+QEfDeLAUzgaWhpaxEg78g+KwbydlDCewh2G6WnHpsty8XooruxNHzyAsqVWywZMrzmbn78Ctc1O9Q==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.3.tgz",
"integrity": "sha512-JYzBiT4A8w+KQt+dOD5v+ti+tDrGoPnsSTuApq3Ls4RB5sfWbDlYMyz3dbc8qBIHz9tv0sQ5+eOu6Xwqzr5AQA==",
"license": "MIT",
"dependencies": {
"@isaacs/ttlcache": "^1.4.1",
"@react-native/debugger-frontend": "0.85.2",
"@react-native/debugger-shell": "0.85.2",
"@react-native/debugger-frontend": "0.85.3",
"@react-native/debugger-shell": "0.85.3",
"chrome-launcher": "^0.15.2",
"chromium-edge-launcher": "^0.3.0",
"connect": "^3.6.5",
@ -4145,15 +4145,15 @@
}
},
"node_modules/@react-native/eslint-config": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/eslint-config/-/eslint-config-0.85.2.tgz",
"integrity": "sha512-bTEC3qY2ZFrKCs4KtZ28OSw4FH3bHZWU+1Tdl67jwDdgRvU9YAo0mfMdlTAIR7BD8V7zLAdqpIlGt/fOH4rPNA==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/eslint-config/-/eslint-config-0.85.3.tgz",
"integrity": "sha512-CvE+1H4be7eZXpadoBDnz7B3ooK2Tl/tvbW2+odrsR22Afs2Q4m9fJtKD8lD8/LCufttsT5pnGIhP/ugO6x/mw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.25.1",
"@react-native/eslint-plugin": "0.85.2",
"@react-native/eslint-plugin": "0.85.3",
"@typescript-eslint/eslint-plugin": "^8.36.0",
"@typescript-eslint/parser": "^8.36.0",
"eslint-config-prettier": "^8.5.0",
@ -4496,9 +4496,9 @@
}
},
"node_modules/@react-native/eslint-plugin": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/eslint-plugin/-/eslint-plugin-0.85.2.tgz",
"integrity": "sha512-y4nwd4LR1K8/u1W7n0sRUgaAw6SOUqlvZtTsx/nyhghN5VQ56VGcJEP+1FohEOA6YLBwwa80nzNn/RyVXcUgjw==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/eslint-plugin/-/eslint-plugin-0.85.3.tgz",
"integrity": "sha512-xUt6BZkIEPxNpsHsZc/FsjsyslrCW5NrGZDFIayyxQxg0zwwd0nXWFZ0qDfCeA75qYYTnboOwIuDIqykzJp61Q==",
"dev": true,
"license": "MIT",
"engines": {
@ -4506,23 +4506,23 @@
}
},
"node_modules/@react-native/gradle-plugin": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.2.tgz",
"integrity": "sha512-YXBOLeAqFrv7XwUeBPTKZeOV1FIxn4AW7UAEitScf3ibC8bu8+6NpJu4HWgbNQHg7vDbbTZVbcOl8EwGxsSq2w==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.3.tgz",
"integrity": "sha512-39dY2j50Q1pntejzwt3XL7vwXtrj8jcIfHq6E+gyu3jzYxZJVvMkMutQ39vSg6zinIQOX36oQDhidXUbCXzgoA==",
"license": "MIT",
"engines": {
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/jest-preset": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.85.2.tgz",
"integrity": "sha512-tCps+2P67PKbFMlqlLMmYuvQ3C7QFAWaMvax/SfBktZO4TydFVxwGgXoVC+db35uY8Bue6xrkcNOwrFjY8ewzw==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.85.3.tgz",
"integrity": "sha512-ALPSrM0q2fU+5AXcOXzDKx7rxVKPMvygAZfsTWLdrGRVWIqf/HEfM0R8euQqIKUqmEuQ1TxMWN+px3h6gc4vow==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/create-cache-key-function": "^29.7.0",
"@react-native/js-polyfills": "0.85.2",
"@react-native/js-polyfills": "0.85.3",
"babel-jest": "^29.7.0",
"jest-environment-node": "^29.7.0",
"regenerator-runtime": "^0.13.2"
@ -4542,22 +4542,22 @@
"license": "MIT"
},
"node_modules/@react-native/js-polyfills": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.2.tgz",
"integrity": "sha512-esGEAmKVM40DV/yVmNljCKZTIeUo7qXqc+Hwffkv3TG+b3E24xyFovHrbP98gGxZr2ZsEyx+2sKLdXF5asY5nw==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.3.tgz",
"integrity": "sha512-U2+aMshIXf1uFn77tpBb/xhHWB9vkVrMpt7kkucAugF8hJKYTDGB587X7WwelHduK2KBfhl4giSv0rzZGoef9A==",
"license": "MIT",
"engines": {
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/metro-babel-transformer": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.85.2.tgz",
"integrity": "sha512-lU9XOGahpHvQff30H5lnvh9RYbVwC1zpSHpl84E+7BD2zj0FvW+pD7MBh7CWbmbWmegjtAb+U/2bokXcDVA+jA==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.85.3.tgz",
"integrity": "sha512-omuKq+r7jM4XvCMIlNMPP7Up3SyB8o5EAdZtF7YXniKyq7UOMBqhYHFqgsdOXr0lT+3ADf7VCJG3sb82jlBrrQ==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
"@react-native/babel-preset": "0.85.2",
"@react-native/babel-preset": "0.85.3",
"hermes-parser": "0.33.3",
"nullthrows": "^1.1.1"
},
@ -4569,37 +4569,37 @@
}
},
"node_modules/@react-native/metro-config": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.85.2.tgz",
"integrity": "sha512-YkTIMfTPeyMUrtpQo/7zd3oybVYJCfTp8626PqoakOvEiWi9PxsUpZ8j44a5GFtOIq8Nc6WWVBiFRn/6qdi1uQ==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.85.3.tgz",
"integrity": "sha512-sVo6HepUmCcpdfozEf91lA0FjpLNNZYu/Zi9FiYiAQTK8pzATXDVTqhvdxpFrQn435p5eUTSbllvbH/KN+bnyA==",
"license": "MIT",
"dependencies": {
"@react-native/js-polyfills": "0.85.2",
"@react-native/metro-babel-transformer": "0.85.2",
"metro-config": "^0.84.0",
"metro-runtime": "^0.84.0"
"@react-native/js-polyfills": "0.85.3",
"@react-native/metro-babel-transformer": "0.85.3",
"metro-config": "^0.84.3",
"metro-runtime": "^0.84.3"
},
"engines": {
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/normalize-colors": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.2.tgz",
"integrity": "sha512-svuOLtjbFGXDdHsriHXuND5FgHg7XlkOXCbH/8+X4t76YLH6qSTffSIQQrKLDL5mn4EFU+Oh/PNO0/FfpnTOTg==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.3.tgz",
"integrity": "sha512-hj0PScZEhIbcOvQV5yMKX3ha4XEIOy/SVE1Rrpp0beW0dpNLOgSC7KDxGewmDnIHK9YdQUXGY9eMEfShUMIaZw==",
"license": "MIT"
},
"node_modules/@react-native/typescript-config": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/typescript-config/-/typescript-config-0.85.2.tgz",
"integrity": "sha512-kJAIGIQdYSf2llBq28EuEjgkK0ELaOLs9hzZunhwQUWICqUuad4yJtqL1JioFeFrkzN3NvdfgM7eBN4Se4Tq9w==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/typescript-config/-/typescript-config-0.85.3.tgz",
"integrity": "sha512-F2Ign3lv/99R5HMDiaQE6NpRdopn87VuXgfHABSk0iwzouLFk1fcwaMkJUmjhnxrQagsUwxOWp4WTPwEvRRazQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@react-native/virtualized-lists": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.2.tgz",
"integrity": "sha512-wmVKpAlcr+UB0L5SpbrV865EdleUP7I5+X+48e1aRsQK8q+wsTRBXeUwWVip/1l+HZwlZFeO8iOILJ16VRu0Cw==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.3.tgz",
"integrity": "sha512-dsCjI//OIPEUJMyNHp4l7zNLVjCx7bcaRUceOCkU+IB17hkbtbGWvi7HjGFSzy7FJGmS/MOlcfpb72xXiy1Oig==",
"license": "MIT",
"dependencies": {
"invariant": "^2.2.4",
@ -4611,7 +4611,7 @@
"peerDependencies": {
"@types/react": "^19.2.0",
"react": "*",
"react-native": "0.85.2"
"react-native": "0.85.3"
},
"peerDependenciesMeta": {
"@types/react": {
@ -7952,9 +7952,9 @@
}
},
"node_modules/detox": {
"version": "20.51.0",
"resolved": "https://registry.npmjs.org/detox/-/detox-20.51.0.tgz",
"integrity": "sha512-epO3hZwxY/cN38vZoF5FSOAdDu2rnS4pvurPxpI5RZ7E5h++EiieZDC8yIV/uLjTxEnU5SoKIb6lfUMk57TrTA==",
"version": "20.51.1",
"resolved": "https://registry.npmjs.org/detox/-/detox-20.51.1.tgz",
"integrity": "sha512-SKHM445qJDSaCO0vQHZnzfStpU1nQtBgWPjMZh/R+1q/ra9F2WyvtNSQcDTb2SPC/jN4FNWaj9ZUcJTkaLEB/g==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@ -15835,18 +15835,18 @@
}
},
"node_modules/react-native": {
"version": "0.85.2",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.2.tgz",
"integrity": "sha512-GFWEPwLYirfj5X8gMtXOWtqX0cqUEURRHETZfFk37VCa4++izrKvGvv24anvuyulXV87NAhVkfNw93rLg3HByw==",
"version": "0.85.3",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.3.tgz",
"integrity": "sha512-HN/fGC+3nZVcDNcw7gfbM/DuqZAvI9Mz+/SxuhODaua4JY0BPzhfTzWXRyTR4mRgMHmShTPpH2PYMTxvZrsdZA==",
"license": "MIT",
"dependencies": {
"@react-native/assets-registry": "0.85.2",
"@react-native/codegen": "0.85.2",
"@react-native/community-cli-plugin": "0.85.2",
"@react-native/gradle-plugin": "0.85.2",
"@react-native/js-polyfills": "0.85.2",
"@react-native/normalize-colors": "0.85.2",
"@react-native/virtualized-lists": "0.85.2",
"@react-native/assets-registry": "0.85.3",
"@react-native/codegen": "0.85.3",
"@react-native/community-cli-plugin": "0.85.3",
"@react-native/gradle-plugin": "0.85.3",
"@react-native/js-polyfills": "0.85.3",
"@react-native/normalize-colors": "0.85.3",
"@react-native/virtualized-lists": "0.85.3",
"abort-controller": "^3.0.0",
"anser": "^1.4.9",
"ansi-regex": "^5.0.0",
@ -15857,8 +15857,8 @@
"hermes-compiler": "250829098.0.10",
"invariant": "^2.2.4",
"memoize-one": "^5.0.0",
"metro-runtime": "^0.84.0",
"metro-source-map": "^0.84.0",
"metro-runtime": "^0.84.3",
"metro-source-map": "^0.84.3",
"nullthrows": "^1.1.1",
"pretty-format": "^29.7.0",
"promise": "^8.3.0",
@ -15880,7 +15880,7 @@
"node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
"@react-native/jest-preset": "0.85.2",
"@react-native/jest-preset": "0.85.3",
"@types/react": "^19.1.1",
"react": "^19.2.3"
},

View File

@ -19,11 +19,11 @@
"@babel/preset-env": "^7.26.0",
"@babel/runtime": "^7.26.0",
"@jest/reporters": "^27.5.1",
"@react-native/eslint-config": "^0.85.2",
"@react-native/jest-preset": "0.85.2",
"@react-native/js-polyfills": "^0.85.2",
"@react-native/metro-babel-transformer": "^0.85.2",
"@react-native/typescript-config": "^0.85.2",
"@react-native/eslint-config": "^0.85.3",
"@react-native/jest-preset": "0.85.3",
"@react-native/js-polyfills": "^0.85.3",
"@react-native/metro-babel-transformer": "^0.85.3",
"@react-native/typescript-config": "^0.85.3",
"@testing-library/react-native": "^13.0.1",
"@types/bip38": "^3.1.2",
"@types/bs58check": "^2.1.0",
@ -114,10 +114,10 @@
"@react-native-vector-icons/ionicons": "13.1.1",
"@react-native-vector-icons/material-design-icons": "13.1.1",
"@react-native-vector-icons/material-icons": "13.1.1",
"@react-native/babel-preset": "0.85.2",
"@react-native/codegen": "0.85.2",
"@react-native/gradle-plugin": "0.85.2",
"@react-native/metro-config": "0.85.2",
"@react-native/babel-preset": "0.85.3",
"@react-native/codegen": "0.85.3",
"@react-native/gradle-plugin": "0.85.3",
"@react-native/metro-config": "0.85.3",
"@react-navigation/devtools": "7.0.56",
"@react-navigation/drawer": "7.9.9",
"@react-navigation/native": "7.2.2",
@ -142,7 +142,7 @@
"crypto-browserify": "3.12.1",
"crypto-js": "4.2.0",
"dayjs": "1.11.20",
"detox": "20.51.0",
"detox": "20.51.1",
"ecpair": "3.0.0",
"electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d",
"electrum-mnemonic": "2.0.0",
@ -154,7 +154,7 @@
"qr": "0.5.5",
"react": "19.2.3",
"react-localization": "github:BlueWallet/react-localization#ae7969a",
"react-native": "0.85.2",
"react-native": "0.85.3",
"react-native-biometrics": "3.0.1",
"react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442",
"react-native-camera-kit-no-google": "github:BlueWallet/react-native-camera-kit-no-google#0ed049a62da29cf304019363ec9d9ef3a73652e6",