Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
6991c4b
Fix: catch exception when adding a signer with wrong xpub format
Toporin Feb 19, 2026
fb6eb07
Fix: disable key sharing for Satochip key with wrong xpub format
Toporin Feb 19, 2026
73020bb
Fix: Satochip import-seed flow corrupts nav stack → black screen
Toporin Mar 3, 2026
f099d40
UX: improve authenticity message to user when Satochip card is not setup
Toporin Mar 3, 2026
e9da5b0
Merge branch 'sprint' into fix_satochip_import_seed_bug
ben-kaufman Mar 29, 2026
f43fa9a
Merge pull request #6907 from Toporin/fix_satochip_import_seed_bug
cakesoft-vaibhav Mar 30, 2026
ba55a9d
Merge branch 'sprint' into fix-6901-crash
cakesoft-vaibhav Mar 30, 2026
b4365a3
Merge pull request #6903 from Toporin/fix-6901-crash
cakesoft-vaibhav Mar 30, 2026
6e44e69
Update version to 2.5.10 and increment version code to 589.
cakesoft-vaibhav Mar 30, 2026
27b9347
Update satochip-react-native library to v0.1.4
Toporin Apr 2, 2026
a34ff08
Merge pull request #6916 from Toporin/589
ben-kaufman Apr 5, 2026
2a861dd
Increment version code to 590 and update CFBundleVersion in iOS and A…
cakesoft-vaibhav Apr 11, 2026
3528317
Merge pull request #6913 from KeeperCommunity/release/589
ben-kaufman Apr 12, 2026
d57224e
Merge remote-tracking branch 'origin/dev' into fix/mergeDevInSprint
cakesoft-vaibhav Apr 13, 2026
57c040a
Merge pull request #6919 from KeeperCommunity/fix/mergeDevInSprint
cakesoft-vaibhav Apr 13, 2026
9e387bb
Merge pull request #6918 from KeeperCommunity/sprint
cakesoft-vaibhav Apr 13, 2026
267e980
Merge branch 'main' into dev
cakesoft-utkarsh Apr 14, 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 @@ -98,8 +98,8 @@ android {
applicationId "io.hexawallet.keeper"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 588
versionName "2.5.9"
versionCode 590
versionName "2.5.10"
missingDimensionStrategy 'react-native-camera', 'general'
missingDimensionStrategy 'store', 'play'
multiDexEnabled true
Expand Down
41 changes: 30 additions & 11 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1332,8 +1332,27 @@ PODS:
- React-Core
- react-native-document-picker (8.2.2):
- React-Core
- react-native-get-random-values (1.8.0):
- react-native-get-random-values (2.0.0):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2024.11.18.00)
- RCTRequired
- RCTTypeSafety
- React-Core
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-ImageManager
- React-NativeModulesApple
- React-RCTFabric
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- react-native-hce (0.2.0):
- React
- react-native-html-to-pdf (0.12.0):
Expand Down Expand Up @@ -1712,7 +1731,7 @@ PODS:
- Yoga
- RNLocalize (2.2.2):
- React-Core
- RNQrGenerator (1.4.4):
- RNQrGenerator (1.4.5):
- React
- ZXingObjC
- RNReanimated (3.17.0):
Expand Down Expand Up @@ -1891,11 +1910,11 @@ PODS:
- SDWebImage/Core (~> 5.10)
- Sentry/HybridSDK (8.41.0)
- SocketRocket (0.7.1)
- VisionCamera (4.7.2):
- VisionCamera/Core (= 4.7.2)
- VisionCamera/React (= 4.7.2)
- VisionCamera/Core (4.7.2)
- VisionCamera/React (4.7.2):
- VisionCamera (4.7.3):
- VisionCamera/Core (= 4.7.3)
- VisionCamera/React (= 4.7.3)
- VisionCamera/Core (4.7.3)
- VisionCamera/React (4.7.3):
- React-Core
- Yoga (0.0.0)
- ZXingObjC (3.6.9):
Expand Down Expand Up @@ -2319,7 +2338,7 @@ SPEC CHECKSUMS:
react-native-config: 8e425892a531627c52db765be3088185cb871e19
react-native-contacts: f551920b74ebfc5f7f6df307495f085e504a4369
react-native-document-picker: a338165804b1a14c8e408448115dc0edfd7b73ca
react-native-get-random-values: 0fd2b6a3129988d701d10e30f0622d5f039531bc
react-native-get-random-values: f59032ad9c14f378130e6570dc86ce168959fe96
react-native-hce: 164e785abe2648edac12934203f55dc785bb1c0b
react-native-html-to-pdf: 7a49e6c58ac5221bcc093027b195f4b214f27a9d
react-native-image-picker: 1f5318beec2ebed6695454ffb9bea8c4152f1598
Expand Down Expand Up @@ -2371,7 +2390,7 @@ SPEC CHECKSUMS:
RNIap: 66eb29da8e992696071182f91b89e5bffa85b4a2
RNKeychain: 8024819eb861575c8e1bdcfc6e02c2b947ed16f7
RNLocalize: 19917c3f32cf6386f7d2957a638a4281669cae57
RNQrGenerator: 95feb09b4b2ed65f3a4afe795a20beed4b134ab5
RNQrGenerator: b467624cdcb0e88108a8b4ca74c94b0978efa265
RNReanimated: 6e7f7b3e9bf83adb6cf60e713e2d1d9438cb5437
RNScreens: 96fe858d87d26c3f46f0696f9e8824ce33a05aa7
RNSentry: cccb4a5cbe42c46f119b102475abe5dc74712833
Expand All @@ -2381,10 +2400,10 @@ SPEC CHECKSUMS:
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
Sentry: 54d0fe6c0df448497c8ed4cce66ccf7027e1823e
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
VisionCamera: 30b358b807324c692064f78385e9a732ce1bebfe
VisionCamera: 7187b3dac1ff3071234ead959ce311875748e14f
Yoga: 92f3bb322c40a86b7233b815854730442e01b8c4
ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5

PODFILE CHECKSUM: e1bd49dc88eaef529a830a07581f7b6b3479d3ac

COCOAPODS: 1.15.2
COCOAPODS: 1.16.2
16 changes: 8 additions & 8 deletions ios/hexa_keeper.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 588;
CURRENT_PROJECT_VERSION = 590;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = Y5TCB759QL;
ENABLE_BITCODE = NO;
Expand Down Expand Up @@ -851,7 +851,7 @@
"$(inherited)",
"\"$(SRCROOT)\"",
);
MARKETING_VERSION = 2.5.9;
MARKETING_VERSION = 2.5.10;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
Expand Down Expand Up @@ -879,7 +879,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 588;
CURRENT_PROJECT_VERSION = 590;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = Y5TCB759QL;
HEADER_SEARCH_PATHS = (
Expand Down Expand Up @@ -980,7 +980,7 @@
"$(inherited)",
"\"$(SRCROOT)\"",
);
MARKETING_VERSION = 2.5.9;
MARKETING_VERSION = 2.5.10;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
Expand Down Expand Up @@ -1150,7 +1150,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 588;
CURRENT_PROJECT_VERSION = 590;
DEVELOPMENT_TEAM = Y5TCB759QL;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = Y5TCB759QL;
ENABLE_BITCODE = NO;
Expand Down Expand Up @@ -1253,7 +1253,7 @@
"$(PROJECT_DIR)",
"\"$(SRCROOT)\"",
);
MARKETING_VERSION = 2.5.9;
MARKETING_VERSION = 2.5.10;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
Expand Down Expand Up @@ -1281,7 +1281,7 @@
CODE_SIGN_ENTITLEMENTS = hexa_keeper_dev.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CURRENT_PROJECT_VERSION = 588;
CURRENT_PROJECT_VERSION = 590;
DEVELOPMENT_TEAM = Y5TCB759QL;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = Y5TCB759QL;
HEADER_SEARCH_PATHS = (
Expand Down Expand Up @@ -1383,7 +1383,7 @@
"$(PROJECT_DIR)",
"\"$(SRCROOT)\"",
);
MARKETING_VERSION = 2.5.9;
MARKETING_VERSION = 2.5.10;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
Expand Down
2 changes: 1 addition & 1 deletion ios/hexa_keeper/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>588</string>
<string>590</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>itms-apps</string>
Expand Down
2 changes: 1 addition & 1 deletion ios/hexa_keeperTests/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>588</string>
<string>590</string>
</dict>
</plist>
2 changes: 1 addition & 1 deletion ios/hexa_keeper_dev-Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>588</string>
<string>590</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>itms-apps</string>
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hexa_keeper",
"version": "2.5.9",
"version": "2.5.10",
"private": true,
"scripts": {
"ios": "npx react-native run-ios --scheme=hexa_keeper_dev --simulator 'iPhone 16' ",
Expand Down Expand Up @@ -118,7 +118,7 @@
"redux-persist": "6.0.0",
"redux-saga": "1.1.3",
"rn-qr-generator": "^1.4.4",
"satochip-react-native": "git+https://github.com/Toporin/satochip-react-native.git#7ce6606613ab8d244e3d0ace56d57d11c141e480",
"satochip-react-native": "git+https://github.com/Toporin/satochip-react-native.git#1076e7c097571d561b5b903f31c6337455def19e",
"semver": "7.3.8",
"socket.io-client": "4.5.4",
"stream": "0.0.2",
Expand Down Expand Up @@ -194,4 +194,4 @@
"engines": {
"node": ">=18"
}
}
}
2 changes: 1 addition & 1 deletion src/hardware/satochip/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export const getCardInfo = async (card: SatochipCard, pin: string = null) => {
return {
setupDone: false,
isSeeded: false,
isAuthentic: false,
isAuthentic: null,
authenticityMsg: 'Card setup required!',
};
}
Expand Down
36 changes: 16 additions & 20 deletions src/screens/SigningDevices/ImportSatochipSeed.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useContext } from 'react';
import { Box, useColorMode } from 'native-base';
import { StyleSheet } from 'react-native';
import { CommonActions } from '@react-navigation/native';
import { CommonActions, StackActions } from '@react-navigation/native';

import ScreenWrapper from 'src/components/ScreenWrapper';
import Buttons from 'src/components/Buttons';
Expand All @@ -26,25 +26,21 @@ function ImportSatochipSeed({ route, navigation }) {
const handleContinue = () => {

navigation.dispatch(
CommonActions.navigate({
name: 'EnterSeedScreen',
params: {
mode: InteracationMode.VAULT_IMPORT_SEED,
isImport: true,
isUSDTWallet: false,
importSeedCta: async (mnemonic: string) => {
// Navigate to NFC processing screen with the mnemonic
navigation.dispatch(
CommonActions.navigate({
name: 'SatochipSeedImportModal',
params: {
pin,
mnemonic,
setupSatochipParams,
},
})
);
},
StackActions.push('EnterSeedScreen', {
mode: InteracationMode.VAULT_IMPORT_SEED,
isImport: true,
isUSDTWallet: false,
importSeedCta: async (mnemonic: string) => {
navigation.dispatch(
CommonActions.navigate({
name: 'SatochipSeedImportModal',
params: {
pin,
mnemonic,
setupSatochipParams,
},
})
);
},
})
);
Expand Down
6 changes: 2 additions & 4 deletions src/screens/SigningDevices/SatochipSeedImportModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ function SatochipSeedImportModal({ route, navigation }) {
common,
} = translations;

const { pin, mnemonic } = route.params || {};
const { pin, mnemonic, setupSatochipParams } = route.params || {};
const card = useRef(new SatochipCard()).current;
const { withModal, nfcVisible, closeNfc } = useSatochipModal(card);
const [showResultModal, setShowResultModal] = useState(false);
Expand Down Expand Up @@ -72,9 +72,7 @@ function SatochipSeedImportModal({ route, navigation }) {
navigation.dispatch(
CommonActions.navigate({
name: 'SatochipAction',
params: {
mode: InteracationMode.VAULT_ADDITION,
},
params: setupSatochipParams ?? { mode: InteracationMode.VAULT_ADDITION },
})
);

Expand Down
28 changes: 17 additions & 11 deletions src/screens/Vault/AddSigningDevice.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,17 +135,23 @@ const onSignerSelect = (
scheme.n !== 1 ||
vaultType === VaultType.MINISCRIPT
) {
const scriptKey = WalletUtilities.getKeyForScheme(
isMultisig,
signer,
msXpub,
ssXpub,
amfXpub
);
vaultKeys.push(scriptKey);
setVaultKeys(vaultKeys);
setHotWalletSelected(false);
setHotWalletInstanceNum(null);
try {
const scriptKey = WalletUtilities.getKeyForScheme(
isMultisig,
signer,
msXpub,
ssXpub,
amfXpub
);
vaultKeys.push(scriptKey);
setVaultKeys(vaultKeys);
setHotWalletSelected(false);
setHotWalletInstanceNum(null);
}
catch (error){
showToast(`This key is invalid. You may need to remove and reimport it. Error: ${error.message}`, <ToastErrorIcon />);
return;
}
} else {
setHotWalletSelected(true);
setHotWalletInstanceNum(signer.extraData.instanceNumber - 1);
Expand Down
9 changes: 9 additions & 0 deletions src/screens/Vault/SigningDeviceDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,15 @@ function SigningDeviceDetails({ route }) {
text: signerTranslations.magicLinkCTA,
Icon: () => <FooterIcon Icon={() => <ThemedSvg name={'share_key'} />} />,
onPress: () => {
if (signer.type === SignerType.SATOCHIP) {
// Fix for Satochip keys created with buggy v2.5.8 that have zpub/Zpub instead of xpub
const xpub = signer.signerXpubs[XpubTypes.P2WPKH][0].xpub;
const prefix= xpub.substring(0, 4);
if (prefix === 'zpub' || prefix === 'Zpub') {
showToast(`This key has an invalid xpub. Please remove and reimport it`, <ToastErrorIcon />);
return;
}
}
setShareKeyModal(true);
},
},
Expand Down
6 changes: 3 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10657,9 +10657,9 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==

"satochip-react-native@git+https://github.com/Toporin/satochip-react-native.git#7ce6606613ab8d244e3d0ace56d57d11c141e480":
version "0.1.3"
resolved "git+https://github.com/Toporin/satochip-react-native.git#7ce6606613ab8d244e3d0ace56d57d11c141e480"
"satochip-react-native@git+https://github.com/Toporin/satochip-react-native.git#1076e7c097571d561b5b903f31c6337455def19e":
version "0.1.4"
resolved "git+https://github.com/Toporin/satochip-react-native.git#1076e7c097571d561b5b903f31c6337455def19e"
dependencies:
asn1js "^3.0.6"
bech32 "2.0.0"
Expand Down
Loading