Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
0e41c02
TSS: Enhancement - persist joiner session ID until user manually rege…
gabrielbazan7 Jun 1, 2026
33e61fa
Braze: Chore - Upgrade to latest plugin version
cmgustavo May 22, 2026
fcb75c2
Import: Enhancement - show account number in 'checking for additional…
gabrielbazan7 Jun 5, 2026
e98cf3e
AddMultisig: Fix - disable minus/plus icon when max values are reached
cmgustavo May 5, 2026
7d71173
Theme: Fix - Replace `null` with `unspecified` to standardize system …
cmgustavo May 6, 2026
ea837a1
Buy: Fix - newly added token wallets not inheriting hidden EVM accoun…
cmgustavo May 25, 2026
f1c518e
KeyOverview: Fix - Cannot read property of undefined
cmgustavo May 26, 2026
5ab8194
CreateAccount: Fix - Use crypto.randomBytes for salt generation
cmgustavo May 27, 2026
e4ced76
Onboarding: Fix - Ensure proper flow for skipped Pin and Notification…
cmgustavo May 29, 2026
e4b17be
Auth: Enhancement - Prevent re-authentication when sharing on Android
gabrielbazan7 Jun 1, 2026
00b4916
Fixed merge conflicts
JohnathanWhite Jun 8, 2026
f6d4226
Combine import statements for Alert and Share
JohnathanWhite Jun 9, 2026
a86f6c3
feat: show asset list even when 'Show portfolio' is disabled
msalcala11 May 19, 2026
9b5b658
feat: use legacy pnl in asset details when 'Show portfolio' is disabled
msalcala11 May 19, 2026
3733ca1
ref: show home root balance even when 'show portfolio' is disabled
msalcala11 May 18, 2026
da85df7
ref: rename to 'Show Portfolio' setting to 'Show Portfolio Charts'
msalcala11 May 19, 2026
b6385ed
fix: show home linking buttons even if 'Show Portfolio Charts' is dis…
msalcala11 May 19, 2026
ec3f14a
test: align asset row pnl expectation
msalcala11 May 29, 2026
aac388d
fix: ensure pnl percentages are consistent with exchange rate changes…
msalcala11 Jun 1, 2026
ad2a8bc
fix: ensure stable PnL row height in home root even when hidden
msalcala11 Jun 1, 2026
23c83aa
fix: hydrate FX bridge deps for exchange-rate charts
msalcala11 Jun 1, 2026
ecb5c98
fix: fix failing tests
msalcala11 Jun 1, 2026
bcc7fd3
fix: return direct FX bridge series for non-USD rate cache
msalcala11 Jun 1, 2026
1298255
ref: simplify legacy portfolio chart fallbacks
msalcala11 Jun 1, 2026
fd90909
TSS: Fix - typo walletPrivateKey -> walletPrivKey in TSS create
gabrielbazan7 Jun 2, 2026
bbe0d4e
TSS: Fix - reset button state when share is cancelled
gabrielbazan7 Jun 2, 2026
fde3c8d
Ref: buy errorMsg log added to analytics
Gamboster Jun 2, 2026
a2e903d
TSS: enhancement - add ceremony timeout + err message
gabrielbazan7 Jun 3, 2026
890a083
TSS: enhancement - add ceremony stuck err message
gabrielbazan7 Jun 4, 2026
bb560c2
Feat: moonpay challenges logs and analytics
Gamboster Jun 3, 2026
f2ea42d
Ref: use custom modal to show challenges
Gamboster Jun 4, 2026
1adb161
Fix: show anonymousEid in connectionSettings for logged out users
Gamboster Jun 10, 2026
33d0437
Validate: fix - add TS18048 to validate script and fix existing viola…
gabrielbazan7 Jun 10, 2026
12fad7b
Feat: ACH payment method support for Transak
Gamboster Jun 10, 2026
c06e457
AppsFlyer: Fix - await logEvent to catch network rejection in track()
gabrielbazan7 Jun 12, 2026
ed6cf26
Sentry: fix - chain native exception handler to Sentrys uncaughtExcep…
gabrielbazan7 Jun 12, 2026
66a74e2
Amount: Fix - prevent cannot read property of undefined
cmgustavo Jun 15, 2026
6680545
Migration: fix - skip encrypted keys in startAddEDDSAKey migration
gabrielbazan7 Jun 15, 2026
1112d23
BottomNotification: fix - await async actions in BottomNotification a…
gabrielbazan7 Jun 15, 2026
eed94f1
BitPayId: fix - catch unhandled rejections in ProfileSettings and Rec…
gabrielbazan7 Jun 15, 2026
2515c06
Coinbase: Fix - Open modal wallet selector for Withdrawal
cmgustavo Jun 16, 2026
061327d
Android: fix - android crash react-native-webassembly build compatibi…
gabrielbazan7 Jun 17, 2026
0e3b922
TSS: fix - android mark keyshare backup complete when sharing via email
gabrielbazan7 Jun 18, 2026
03fd943
Wallet: Fix - Crash adding custom token to read-only key
cmgustavo Jun 19, 2026
40180f0
bump 14.44.1
JohnathanWhite Jun 23, 2026
aab1d64
WalletConnect: fix - lazy init core to prevent idle heartbeat loop
gabrielbazan7 Jun 18, 2026
6a949b1
WalletConnect: fix - wrap rejectSession in try/catch to revent unhand…
gabrielbazan7 Jun 23, 2026
cb6e8ae
Rates: Fix - block symbol fallback for token rate lookup
gabrielbazan7 Jun 24, 2026
6e1637d
bump 14.44.2
JohnathanWhite Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ android {
applicationId "com.bitpay.wallet"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 91212420
versionName "14.43.3"
versionCode 91212431
versionName "14.44.2"
missingDimensionStrategy 'react-native-camera', 'mlkit'
ndk {
abiFilters "armeabi-v7a", "x86", "x86_64", "arm64-v8a"
Expand Down
2 changes: 2 additions & 0 deletions android/app/src/main/java/com/bitpay/wallet/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import com.braze.reactbridge.BrazeReactUtils
import com.braze.ui.inappmessage.BrazeInAppMessageManager
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
Expand Down Expand Up @@ -40,6 +41,7 @@ class MainActivity : ReactActivity() {
return
}

BrazeReactUtils.populateInitialPushPayloadFromIntent(intent)
RNBootSplash.init(this, R.style.BootTheme)
supportFragmentManager.fragmentFactory = RNScreensFragmentFactory()
super.onCreate(savedInstanceState)
Expand Down
3 changes: 1 addition & 2 deletions android/app/src/main/res/values/braze.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="com_braze_api_key">BRAZE_API_KEY_REPLACE_ME</string>
<string translatable="false" name="com_braze_custom_endpoint">sdk.iad-05.braze.com</string>
<bool name="com_braze_enable_delayed_initialization">true</bool>
<bool translatable="false" name="com_braze_firebase_cloud_messaging_registration_enabled">true</bool>
<string translatable="false" name="com_braze_firebase_cloud_messaging_sender_id">BRAZE_SENDER_ID_REPLACE_ME</string>
<bool name="com_braze_handle_push_deep_links_automatically">false</bool>
Expand Down
3 changes: 3 additions & 0 deletions declarations.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ declare module '*.svg' {
declare module '@env' {
export const PAYPRO_TRUSTED_KEYS: string;
export const BASE_FIATRATES_MARKETSTATS_URL_DEVELOPMENT: string;
export const BRAZE_API_ENDPOINT: string;
export const BRAZE_API_KEY_ANDROID: string;
export const BRAZE_API_KEY_IOS: string;
export const BRAZE_EXPORT_API_KEY: string;
export const BRAZE_MERGE_AND_DELETE_API_KEY: string;
export const BRAZE_REST_API_ENDPOINT: string;
Expand Down
5 changes: 3 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ const ReduxProvider = () => {
setStore({store, persistor});
setStoreReady(true);
setJSExceptionHandler(makeErrorHandler(store), true);
setNativeExceptionHandler(makeNativeExceptionHandler(store));
// executeDefaultHandler=true chains to Sentry's UncaughtExceptionHandler so native crashes are captured
setNativeExceptionHandler(makeNativeExceptionHandler(store), true, true);
});

return () => {
Expand Down Expand Up @@ -206,7 +207,7 @@ const AppWrapper = () => {

const subscription = Appearance.addChangeListener(
({colorScheme: newScheme}) => {
if (colorScheme === null) {
if (!colorScheme || colorScheme === 'unspecified') {
setIsDark(newScheme === 'dark');
}
},
Expand Down
17 changes: 8 additions & 9 deletions ios/BitPayApp/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import AppsFlyerLib
import RNBootSplash
import BrazeKit
import BrazeUI
import braze_react_native_sdk
import UserNotifications
import CryptoKit

Expand Down Expand Up @@ -172,17 +173,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, BrazeInAppMessageUIDelega
window?.makeKeyAndVisible()

// MARK: Braze SDK setup
let config = Braze.Configuration(apiKey: "BRAZE_API_KEY_REPLACE_ME", endpoint: "sdk.iad-05.braze.com")
config.logger.level = .info
config.triggerMinimumTimeInterval = 1

// `BrazeReactBridge.initBraze(_:)` is an Objective-C selector; we call it dynamically
if let brazeObj = BrazeReactBridge.perform(#selector(BrazeReactBridge.initBraze(_:)), with: config)?.takeUnretainedValue() as? Braze {
self.braze = brazeObj
BrazeReactInitializer.configure({ config in
config.logger.level = .info
config.triggerMinimumTimeInterval = 1
}, postInitialization: { [weak self] braze in
self?.braze = braze
let inAppUI = BrazeInAppMessageUI()
inAppUI.delegate = self
brazeObj.inAppMessagePresenter = inAppUI
}
braze.inAppMessagePresenter = inAppUI
})

// Disable URL caching globally to prevent sensitive data disclosure
URLCache.shared.removeAllCachedResponses()
Expand Down
2 changes: 1 addition & 1 deletion ios/BitPayApp/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>14.43.3</string>
<string>14.44.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand Down
1 change: 1 addition & 0 deletions ios/BitPayApp/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
<string>1C8F.1</string>
</array>
</dict>
<dict>
Expand Down
28 changes: 14 additions & 14 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ PODS:
- AppsFlyerFramework/Main (= 6.17.9)
- AppsFlyerFramework/Main (6.17.9)
- boost (1.84.0)
- braze-react-native-sdk (16.1.0):
- braze-react-native-sdk (20.1.0):
- boost
- BrazeKit (~> 13.2.0)
- BrazeLocation (~> 13.2.0)
- BrazeUI (~> 13.2.0)
- BrazeKit (~> 14.0.4)
- BrazeLocation (~> 14.0.4)
- BrazeUI (~> 14.0.4)
- DoubleConversion
- fast_float
- fmt
Expand All @@ -34,11 +34,11 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- BrazeKit (13.2.1)
- BrazeLocation (13.2.1):
- BrazeKit (= 13.2.1)
- BrazeUI (13.2.1):
- BrazeKit (= 13.2.1)
- BrazeKit (14.0.4)
- BrazeLocation (14.0.4):
- BrazeKit (= 14.0.4)
- BrazeUI (14.0.4):
- BrazeKit (= 14.0.4)
- BVLinearGradient (2.6.2):
- React-Core
- CookieManager (6.3.0):
Expand Down Expand Up @@ -3955,10 +3955,10 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
AppsFlyerFramework: 4f9a8237d40e9093941aef760cd77d606238aedd
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
braze-react-native-sdk: b3bd4594310a390c12beb06b02bf0fbbfcbca7e0
BrazeKit: dc74d3969d42e3f890461fe842e9422480269774
BrazeLocation: 1919682502f70d3f215215b9ef2b56836dde4a9e
BrazeUI: b49f51ff3eb88657d6a97e6b3688e03a7255cbe1
braze-react-native-sdk: 12e813e4a989839c912c87acc4a2ab72c5652df5
BrazeKit: ba951d2299c1d16b541cf35cdd7250d03e28a0fb
BrazeLocation: d6938a737f123bb9e6632246d1abea40eeb12768
BrazeUI: 1d733e1dea4d81f95f261b52cc6e4b91a0eccca8
BVLinearGradient: 34a999fda29036898a09c6a6b728b0b4189e1a44
CookieManager: ae06e97a79ea66832add0c8aa501a7986bdbb72d
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
Expand Down Expand Up @@ -4101,4 +4101,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 91e915b372fe50cffa909299965ad28bb54bc3f7

COCOAPODS: 1.16.2
COCOAPODS: 1.15.2
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bitpay",
"version": "14.43.3",
"version": "14.44.2",
"private": true,
"engines": {
"node": ">=20"
Expand All @@ -23,7 +23,7 @@
"build:android:release": "export NODE_OPTIONS=--openssl-legacy-provider && ./scripts/android-release.sh",
"postbuild:android:release": "yarn reset:prod",
"lint": "eslint --fix . --ext .js,.jsx,.ts,.tsx",
"validate": "tsc --noEmit --skipLibCheck 2>&1 | grep -v node_modules | grep -E 'TS(2304|2693|2349|2351|2448|2554|2307|2454|2305|2774)' && exit 1 || exit 0",
"validate": "tsc --noEmit --skipLibCheck 2>&1 | grep -v node_modules | grep -E 'TS(2304|2693|2349|2351|2448|2554|2307|2454|2305|2774|2532|18048)' && exit 1 || exit 0",
"prettier": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
"prettier:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx}\"",
"postinstall": "./scripts/postinstall.sh",
Expand All @@ -49,7 +49,7 @@
},
"dependencies": {
"@bitpay-labs/bitcore-wallet-client": "11.10.0",
"@braze/react-native-sdk": "16.1.0",
"@braze/react-native-sdk": "20.1.0",
"@ethersproject/shims": "5.7.0",
"@freakycoder/react-native-bounceable": "0.2.5",
"@gorhom/bottom-sheet": "5.2.6",
Expand Down
36 changes: 17 additions & 19 deletions patches/react-native-webassembly+0.3.3.patch
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
diff --git a/node_modules/react-native-webassembly/android/CMakeLists.txt b/node_modules/react-native-webassembly/android/CMakeLists.txt
index 0f879e0..e5992c2 100644
index 0f879e0..75b0cdc 100644
--- a/node_modules/react-native-webassembly/android/CMakeLists.txt
+++ b/node_modules/react-native-webassembly/android/CMakeLists.txt
@@ -64,6 +64,7 @@ find_package(ReactAndroid REQUIRED CONFIG)
@@ -64,7 +64,9 @@ find_package(ReactAndroid REQUIRED CONFIG)

target_link_libraries(
cpp
+ "-Wl,-z,max-page-size=16384"
${log-lib}
+ c++_shared
ReactAndroid::jsi
android
diff --git a/node_modules/react-native-webassembly/android/build.gradle b/node_modules/react-native-webassembly/android/build.gradle
index 5643083..9185c73 100644
--- a/node_modules/react-native-webassembly/android/build.gradle
+++ b/node_modules/react-native-webassembly/android/build.gradle
@@ -42,9 +42,11 @@ android {
cmake {
cppFlags "-O2 -frtti -fexceptions -Wall -fstack-protector-all"
arguments "-DANDROID_STL=c++_shared"
- abiFilters "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
}
}
+ ndk {
+ abiFilters "arm64-v8a", "x86_64"
+ }
}
externalNativeBuild {
cmake {
)
diff --git a/node_modules/react-native-webassembly/cpp/m3_config_platforms.h b/node_modules/react-native-webassembly/cpp/m3_config_platforms.h
index 50b86ac..8deaf8d 100644
--- a/node_modules/react-native-webassembly/cpp/m3_config_platforms.h
+++ b/node_modules/react-native-webassembly/cpp/m3_config_platforms.h
@@ -82,7 +82,7 @@
# endif
# endif

-# if M3_COMPILER_HAS_ATTRIBUTE(musttail)
+# if M3_COMPILER_HAS_ATTRIBUTE(musttail) && !defined(__arm__)
# define M3_MUSTTAIL __attribute__((musttail))
# else
# define M3_MUSTTAIL
18 changes: 0 additions & 18 deletions scripts/braze-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,10 @@ const dotenv = require('dotenv');
throw result.error;
}

// Configure Braze for iOS
if (process.env.BRAZE_API_KEY_IOS) {
const brazeConfigFileIOS = `${__dirname}/../ios/BitPayApp/AppDelegate.swift`;
let contentiOS = fs.readFileSync(brazeConfigFileIOS, 'utf8');
contentiOS = contentiOS.replace(
'BRAZE_API_KEY_REPLACE_ME',
process.env.BRAZE_API_KEY_IOS,
);
fs.writeFileSync(brazeConfigFileIOS, contentiOS);
}

// Configure Braze for Android
const brazeConfigFileAndroid = `${__dirname}/../android/app/src/main/res/values/braze.xml`;
let contentAndroid = fs.readFileSync(brazeConfigFileAndroid, 'utf8');

if (process.env.BRAZE_API_KEY_ANDROID) {
contentAndroid = contentAndroid.replace(
'BRAZE_API_KEY_REPLACE_ME',
process.env.BRAZE_API_KEY_ANDROID,
);
}

if (process.env.BRAZE_SENDER_ID) {
contentAndroid = contentAndroid.replace(
'BRAZE_SENDER_ID_REPLACE_ME',
Expand Down
10 changes: 8 additions & 2 deletions src/Root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,10 @@ const StartupGate = () => {
const appColorScheme = useAppSelector(({APP}) => APP.colorScheme);
const hasRoutedRef = useRef(false);

const scheme = appColorScheme || Appearance.getColorScheme();
const scheme =
!appColorScheme || appColorScheme === 'unspecified'
? Appearance.getColorScheme()
: appColorScheme;
const theme = scheme === 'dark' ? BitPayDarkTheme : BitPayLightTheme;

useEffect(() => {
Expand Down Expand Up @@ -694,7 +697,10 @@ export default () => {
patchLogger(Logger);
}, []);

const scheme = appColorScheme || Appearance.getColorScheme();
const scheme =
!appColorScheme || appColorScheme === 'unspecified'
? Appearance.getColorScheme()
: appColorScheme;
const theme = scheme === 'dark' ? BitPayDarkTheme : BitPayLightTheme;

return (
Expand Down
Loading
Loading