Skip to content

Normalize recipient addresses to checksum format#280

Draft
DRadmir wants to merge 8 commits into
mainfrom
202-confirm-screen-should-always-have-addresses-in-checksum-format
Draft

Normalize recipient addresses to checksum format#280
DRadmir wants to merge 8 commits into
mainfrom
202-confirm-screen-should-always-have-addresses-in-checksum-format

Conversation

@DRadmir
Copy link
Copy Markdown
Contributor

@DRadmir DRadmir commented May 7, 2026

Closes #202.

Recipient screen now applies EIP-55 checksum to EVM addresses on paste, QR scan, and ENS resolution, so the Confirm screen always sees normalized addresses. Non-EVM chains pass through unchanged.

Both platforms route through the new Gemstone uniffi function checksum_address via Chain extensions, replacing the iOS WalletCore-based implementation and the Android operator/DI pattern.

  • Test

Closes #202.

Recipient screen now applies EIP-55 checksum to EVM addresses on paste,
QR scan, and ENS resolution, so the Confirm screen always sees normalized
addresses. Non-EVM chains pass through unchanged.

Both platforms route through the new Gemstone uniffi function
checksum_address via Chain extensions, replacing the iOS WalletCore-based
implementation and the Android operator/DI pattern.
@DRadmir DRadmir self-assigned this May 7, 2026
DRadmir added 3 commits May 8, 2026 16:48
…m-screen-should-always-have-addresses-in-checksum-format

# Conflicts:
#	core
Rename AddressInputViewModel.resolvedAddress to address and update call sites accordingly across iOS (ManageContactAddressViewModel, RecipientSceneViewModel). Ensure decoded payment addresses are checksummed at decode time and use payment.address consistently for validation and recipient creation. Also fix a duplicate owner declaration and redundant null check in the Android RecipientViewModel.
…m-screen-should-always-have-addresses-in-checksum-format
@DRadmir DRadmir marked this pull request as ready for review May 8, 2026 16:43
DRadmir added 4 commits May 10, 2026 22:36
…m-screen-should-always-have-addresses-in-checksum-format

# Conflicts:
#	core
…m-screen-should-always-have-addresses-in-checksum-format

# Conflicts:
#	core
Replaces Gemstone.checksumAddress free function with GemChainAddress
constructor — already validates and now normalizes on construction.

Chain.checksumAddress(_) is now throws on both platforms (matches the
GemstoneException surface). Soft callsites (text input on every keystroke,
QR scan into ViewModel state) wrap with try?/runCatching and fall back
to the input on error. Callers inside throwing contexts propagate.
GemChainAddress::new validates address before normalizing, but gemstone's
validate_address returns false for Bitcoin/XRP/Polkadot/Cardano (no
validator implemented). That means a strict throws API would reject
valid Bitcoin addresses outright — breaking ImportWalletSceneViewModel
and the GemstonePrimitivesTests case.

Make Chain.checksumAddress(_:) non-throws with a try?/runCatching
fallback to the input. Soft semantics belong at this boundary; the
underlying GemChainAddress.init can stay throws for callers that need
strict validation.

Drops the now-redundant try?/runCatching wrappers from callsites.
@DRadmir DRadmir marked this pull request as draft May 12, 2026 17:36
@DRadmir DRadmir marked this pull request as draft May 12, 2026 17:36
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.

Confirm screen should always have addresses in checksum format

1 participant