Keys and UX patterns
Mobile wallets handle real money. Follow these patterns on Flutter and React Native.
Key storage
| Platform | Use | Avoid |
|---|---|---|
| iOS | Keychain via secure storage plugin | UserDefaults, plain files |
| Android | Keystore / EncryptedSharedPreferences | SharedPreferences for mnemonics |
| RN | expo-secure-store or react-native-keychain | AsyncStorage for secrets |
| Flutter | Keychain via flutter_secure_storage (mnemonic for CosmJS bridge only) | SharedPreferences for secrets |
Never log mnemonics or private keys. Use biometrics to gate signing screens.
Confirm-before-sign UX
- Show recipient (SafHandle
@name+ resolved truncatedaddr_safro...) - Show amount in SAF and
usaf - Show fee estimate from simulate (see Simulate gas)
- Require explicit confirm (button + optional biometric)
Address display
- Default:
addr_safro1abc...xyz(first 10 + last 6 chars) - With SafHandle: display
@johnprominently; show resolved address on confirm screen
Deep links (planned)
Register app links for pay intents:
safro://pay/@alice?amount=1000000&denom=usaf&memo=coffee
https://pay.safrochain.com/@alice
See SafHandle resolve before building MsgSend.