Skip to content

Conversation

@Toporin
Copy link

@Toporin Toporin commented Dec 8, 2025

This is a pull request to add support for the Satochip hardware wallet.

The Satochip hardware wallet is based on a jacavard smartcard and is fully open-source.
The firmware uses a javacard applet that is loaded on the smartcard.
With native NFC (Near Field Communication) support, Satochip enables seamless interaction with mobile devices.

Satochip technical details

  • Platform: JavaCard 3.0.1-compliant smartcard with an EAL6+ secure element.
  • Key management: supports BIP39 seeds; private keys are derived and stored within the secure chip, never exposed externally.
  • NFC support: contactless communication via NFC, compatible with Android and iOS devices equipped with NFC readers.
  • Contact interface for use with a card reader on a computer, compatible with Sparrow wallet.
  • Cryptographic capabilities: implements ALG_ECDSA_SHA_256 for Bitcoin signatures and optional Schnorr signature support (beta v0.14+) for Taproot and Nostr.

Advantages of Satochip

Here are the main advantages of the Satochip hardware wallet:

  • Security: private keys remain offline in a tamper-resistant chip, protected by a PIN code.
  • Mobile-friendly: NFC support for quick, contactless interaction with mobile devices.
  • Affordable: priced at approximately €25, Satochip offers a budget-friendly alternative.
  • Open-source: javacard applet is AGPLv3.
  • DIY: build your own hardware wallet in a few minutes using widely available blank smartcards.
  • Portability: credit card-sized form factor is discreet, easy to carry, and durable.
  • Compatibility: with widely-used client Sparrow for Desktop use.

More info:
https://github.com/Toporin/ (Official repository)
https://x.com/satochip (X account)
https://t.me/Satochip (Telegram support)
https://satochip.io (Official website)

Better to reset seed from the import Satochip key options during new key import.
…tSatochipSeed

old resetSatochipSeed screen: reset from settings using provided PIN
new resetSatochipSeed screen: reset from Satochip key add, use pin from previous screen
The error arose from an incorrect parsing of the BIP32 path, that led to a wrong key derivation for Satochip, when using remote key signing.
The patch is:

    +      let keypath = "";
    +      if (signer.derivationPath.endsWith("/") || input.subPath.startsWith("/")){
    +        keypath = signer.derivationPath + input.subPath;
    +      } else {
    +        keypath = signer.derivationPath + "/" + input.subPath;
    +      }
    +      console.log(`index signWithSatochip keypath: ${keypath}`);
Update Satochip branch with upstream changes
@ben-kaufman
Copy link
Collaborator

Thanks for the PR!

I've tested and everything worked (mostly) well.
One issue I noticed is that if the user enters the add Satochip screen and clicks the Check Initial Setup status, if the user doesn't first enters a PIN (or if he clicks it even before setting a PIN to the card) the popup result will show a warning saying the card is not authentic. I think there should be better error handling for this case.

Also on the first try for actually adding the card the app crashed, but I couldn't reproduce this after the first time. When I retried adding a few times after it worked well.

Also on this screen make sure please to have the buttons at the bottom like in the rest of the app
IMG_9887

And also on the UI, I think it's a bit confusing to have 4 of the buttons for different actions in the setup screen, I'd recommend adding a settings or options button and move at least the check setup and reset seed there.

Besides everything worked well. Import succeeded, initializw and reset of the card, change PIN, signing with all wallet types. So. overall very good integration!

"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#main",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please specify commit instead of branch (see for example libportal-react-native)

@@ -0,0 +1,64 @@
<svg width="157" height="123" viewBox="0 0 157 123" fill="none" xmlns="http://www.w3.org/2000/svg">
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be Tapsigner instead of satochip

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also in src/assets/privateImages/satochip-illustration.svg

"satochipSigned": "SATOCHIP signed successfully!",
"satochipInfoRetrieved": "SATOCHIP information retrieved",
"errorFetchingSatochipInfo": "Error while checking SATOCHIP information. Please try again",
"satochipAlreadySetupAndSeeded": "PIN set and Seed imported",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should lowercase seed

Comment on lines +1981 to +1982
"satochipPinChanged": "Satochip PIN changed successfully",
"errorChangingSatochipPin": "Error while changing Satochip pin. Please try again",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should fully uppercase Satochip for consistency


{/* result dialog */}
<KeeperModal
visible={showResultModal} // TODO: update translation + activate on success/fail?
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove TODO

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants