Skip to content

Conversation

@Jon-edge
Copy link
Collaborator

@Jon-edge Jon-edge commented Dec 23, 2025

CHANGELOG

Does this branch warrant an entry to the CHANGELOG?

  • Yes
  • No

Dependencies

none

Requirements

If you have made any visual changes to the GUI. Make sure you have:

  • Tested on iOS device
  • Tested on Android device
  • Tested on small-screen device (iPod Touch)
  • Tested on large-screen device (tablet)

Note

E2E tests (Maestro) – major expansion

  • Add comprehensive wallet flows: view keys (master/private view/raw), xpub, migrate/pause/archive/restore/split wallets, autodetect/enable/disable tokens, create all wallet types; plus shared helpers (add-wallets, import-wallets, add-all-wallet-types, no-errors, relogin-pin, dismiss-modals).
  • Update existing flows for robustness (timeouts, modal handling, balances, retries) and adjust notification/IP validation tests.

Build/Deps

  • Bump edge-core-js to ^2.38.2, edge-currency-accountbased to ^4.68.0, edge-currency-plugins to ^3.8.10, edge-exchange-plugins to ^2.40.2; sync ios/Podfile.lock.

Lint

  • Add no-restricted-syntax warning for styled() usage to encourage useTheme() + cacheStyles().

Misc

  • CHANGELOG: note Zcash buy/sell support with Banxa; re-enable UFO.
  • Add Maestro env vars for asset test accounts in scripts/runMaestro.ts.
  • Update reducer snapshot (new denominationSettingsOptimized).

Written by Cursor Bugbot for commit d102426. This will update automatically on new commits. Configure here.

paullinator and others added 30 commits December 10, 2025 10:54
Fix fading to avoid white empty white square
Per Paybis team feedback, this prevents an invalid session that triggers a new email verification check.
Split search queries by spaces so users can search multiple terms
like 'base eth' to find Ethereum on Base network. All terms must
match at least one searchable field (AND logic).

Add chainDisplayName as a searchable field in searchWalletList to
enable searching by network/chain name.
Include assetDisplayName from currencyInfo as a searchable field
for wallet and create-wallet searches. This allows users to search
by the asset's display name (e.g., 'Ethereum') in addition to other
existing searchable fields.
Change search matching for currencyCode, displayName, and
assetDisplayName from includes() to startsWith(). This prevents
partial substring matches that crowd search results.

For example, searching 'eth' now shows Ethereum assets but not
Tether (which contains 'eth' in the middle). Context fields like
chainDisplayName, wallet name, and contractAddress still use
includes() for broader discovery.
Test coverage for:
- Multi-word search with space delimiter (AND logic)
- startsWith matching for currencyCode, displayName, assetDisplayName
- includes matching for chainDisplayName, wallet name, contractAddress
- assetDisplayName and chainDisplayName only searched for mainnet assets
- Regression tests for original issues (#1: 'base eth', #3: 'eth' vs Tether)
samholmes and others added 29 commits December 19, 2025 14:09
Layout animations on elements within WelcomeHero were causing visually
slow gesture-based animation. Disabling them ensures smoother rendering
of the gesture-based animation during the welcome flow.
Use layout positioning (not absolute nor relative) for
ButtonFadeContainer on both platforms to prevent layout shift when
buttons swap visibility. This fixes the issue where the "Next" button
would fly in from the upper section of the screen on Android instead of
fading in place like on iOS.

Also unified TertiaryTouchable margins across platforms.

The HACK was introduced in PR #5590 (May 2025) as a workaround after
PR #5566 fixed a button animation issue using absolute positioning but
broke iOS. The conditional styling attempted to address "iOS/Android
parity mismatches when the animation fires" without understanding the
root cause.

The actual root cause is that EdgeAnim applies `layout={LAYOUT_ANIMATION}`
(LinearTransition) to all animated views. With relative positioning,
when the "Get Started" button unmounts and "Next" mounts, there's a
layout shift that triggers the layout animation - causing the button
to fly in from its initial position.

Absolute positioning prevents any layout shift, so the layout animation
has nothing to animate, and the button simply fades in place as intended.
This is the same approach the original fix (PR #5566) used, but now
correctly applied to both platforms.
Replace styled() usage with a single getStyles cacheStyles pattern.
Extract reusable animated components (HeroItem, PageIndicator,
SectionItem) placed at the bottom of the file.
Replace showNextButton state with animated button opacity.
Add EdgeAnim fade-in for pagination and button container.
Also fixes bug where static flexGrow: 1 was overridden by animated style.
Encourage migration away from styled components to regular components
with useTheme() and cacheStyles().
The showScamWarningModal function was already disabled (always returns
false), making these calls unnecessary async overhead during login and
other operations.

Removes calls from:
- initializeAccount (firstLogin)
- WcConnectionsScene (firstWalletConnect)
- WalletListMenuActions (firstPrivateKeyView)
When Settings.json doesn't exist (new account or first login), return
default values without writing them to disk. Defaults are derived from
cleaners, so they don't need to be persisted. Settings will be written
when the user explicitly changes a value.

This eliminates unnecessary disk I/O during the login flow.
When local Settings.json doesn't exist (new account), return default
values without writing them to disk. Defaults are derived from cleaners,
so they don't need to be persisted. Settings will be written when values
actually change.

This eliminates unnecessary disk I/O during the login flow.
Move biometric checks (isTouchEnabled, getSupportedBiometryType) from
blocking awaits to background Promise execution. This removes two
blocking native module calls from the critical login path.

The biometric state is loaded asynchronously and dispatched via a new
UI/SETTINGS/SET_TOUCH_ID_SUPPORT action when available. The UI will
use default values (false) until the background check completes.

Also removes the redundant refreshTouchId call - this is already called
by edge-login-ui-rn in submitLogin() before the onLogin callback, so
the call here was unnecessary.
Remove isTouchEnabled and isTouchSupported from global Redux state.
Biometric state is now loaded lazily in SettingsScene using useAsyncValue,
which removes it from the login critical path.

- Remove biometric fields from SettingsState and AccountInitPayload
- Remove CHANGE_TOUCH_ID_SETTINGS action type
- Remove updateTouchIdEnabled thunk from SettingsActions
- SettingsScene loads biometric state locally on mount via useAsyncValue
- Toggle calls enableTouchId/disableTouchId directly with local state
Add a migration that removes default denomination values from the synced
settings file. This migration:

1. Runs once per account (tracked via denominationSettingsOptimized flag)
2. Compares each saved denomination to the default from currencyInfo
3. Removes entries that match the default (they're derived on-demand)
4. Reduces settings file size for existing accounts

The migration runs in the background after ACCOUNT_INIT_COMPLETE to
avoid blocking the login flow. For existing accounts with many saved
denominations, this significantly reduces the settings file size.
Remove the expensive nested loop that merged default denomination
settings with synced settings. Since default denominations are no longer
populated in the LOGIN reducer, we can use synced settings directly.

The synced settings contain only user customizations. Default
denominations are derived on-demand from currencyInfo via selectors.
Remove the expensive loop that populated denomination defaults for all
currency plugins and tokens during LOGIN. This loop iterated through
every plugin and token to set default denominations in Redux state.

Denomination defaults are already available from currencyInfo and can be
derived on-demand via selectors (selectDisplayDenom already has fallback
logic to currencyConfig). This change eliminates unnecessary work during
the login critical path.
Separate out the new account workflow to `navigateToNewAccountFlow`
in initializeAccount and the existing account flow into
`navigateToExistingAccountHome`.
Eliminate the ACCOUNT_INIT_COMPLETE action by loading all settings upfront
and dispatching them in the LOGIN action. This enables immediate navigation
after login since all required state is available in Redux right away.

- Load synced and local settings in parallel before LOGIN dispatch
- Expand LOGIN action payload to include syncedSettings and localSettings
- Remove ACCOUNT_INIT_COMPLETE action type and AccountInitPayload
- Remove pinLoginEnabled from Redux, load locally in SettingsScene
- Remove togglePinLoginEnabled thunk from SettingsActions
- Update WalletsReducer to remove ACCOUNT_INIT_COMPLETE handling
- Update SpendingLimitsReducer to read from LOGIN payload
- Update PasswordReminderReducer to read from LOGIN payload
- Remove getFirstActiveWalletInfo (walletId/currencyCode no longer set at login)
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 141 to 145
// Check for security alerts:
if (hasSecurityAlerts(account)) {
navigation.push('securityAlerts')
hideSurvey = true
}

Choose a reason for hiding this comment

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

P1 Badge Show scam warning on first login

The login flow no longer calls showScamWarningModal('firstLogin') (the only caller was removed), so new users will never see the anti-scam warning. With no other entry point for this modal, first-time logins now skip the security warning entirely, reducing protection for new accounts.

Useful? React with 👍 / 👎.

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.

6 participants