Skip to content

⬆️ major upgrade and app improvements#630

Closed
cruzdanilo wants to merge 4 commits intomainfrom
upgrade
Closed

⬆️ major upgrade and app improvements#630
cruzdanilo wants to merge 4 commits intomainfrom
upgrade

Conversation

@cruzdanilo
Copy link
Member

@cruzdanilo cruzdanilo commented Jan 11, 2026

Summary by CodeRabbit

  • New Features

    • ESLint flat config system with environment-specific configurations (base, node, React).
    • Edge-to-edge UI support for Android.
    • Major framework upgrades: Expo 54, React 19, React Native 0.81.5, Wagmi 3.
  • Chores

    • Upgraded pnpm to 10.28.0 across all workflows and Docker builds.
    • Migrated from @alchemy/aa to @account-kit packages.
    • Updated navigation system throughout app.
    • Enhanced test infrastructure with new targets and improved mock handling.

✏️ Tip: You can customize this high-level summary in your review settings.

@changeset-bot
Copy link

changeset-bot bot commented Jan 11, 2026

🦋 Changeset detected

Latest commit: 514e147

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai
Copy link

coderabbitai bot commented Jan 11, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

Large-scale migration consolidating ESLint configurations to flat config format, upgrading major dependencies (Expo 52→54, React 18→19, React Native 0.76→0.81, Wagmi 2→3, pnpm 9→10), migrating from @alchemy/aa-* to @account-kit/*, replacing Expo Router's useNavigation with useRouter throughout mobile app, and updating TypeScript/build configurations across the monorepo.

Changes

Cohort / File(s) Summary
ESLint Flat Config Migration
.eslintrc.cjs, eslint.config.mjs, common/eslint.config.mjs, common/eslint/base.mjs, common/eslint/node.mjs, common/eslint/react.mjs, docs/eslint.config.mjs, server/eslint.config.mjs, .maestro/eslint.config.mjs
Centralized ESLint configuration from legacy .eslintrc.cjs into modular flat config structure with base, node, and React-specific presets; includes TypeScript strict-type-checked, unicorn, regexp, import, NX, prettier, JSDoc, and Drizzle plugins.
pnpm & Node Version Updates
.eas/workflows/local.yaml, .eas/workflows/production.yaml, .github/workflows/docs.yaml, .github/workflows/mobile-expo.yaml, .github/workflows/test.yaml, .github/workflows/version.yaml, eas.json, server/Dockerfile
Bumped pnpm from 9.15.9 to 10.28.0 across CI/CD workflows and build infrastructure; Node 24.12.0 maintained.
Core Dependency Upgrades
package.json, .maestro/package.json, docs/package.json, common/package.json, contracts/package.json
Major version bumps: Expo 52→54, React 18.3.1→19.1.0, React Native 0.76.9→0.81.5, Wagmi 2→3; migrated @alchemy/aa-* to @account-kit/*; Tamagui 1.125→1.144; added catalog-based version management; updated Sentry, TypeScript, and build tooling.
Mobile Navigation API Migration
src/app/(auth)/_layout.tsx, src/app/(main)/_layout.tsx, src/app/(main)/(home)/_layout.tsx, src/app/(main)/\*/_layout.tsx, src/components/\*\*/\*.tsx
Removed React Navigation type declarations (NavigationProperties, ParameterList interfaces) and migrated 50+ components from useNavigation() to useRouter() with updated route paths (e.g., "(home)""/(main)/(home)").
Account-Kit Module Migration
src/utils/alchemyConnector.ts, src/utils/accountClient.ts, src/utils/publicClient.ts, src/app/_layout.tsx, server/utils/ensClient.ts
Updated imports from @alchemy/aa-* to @aa-sdk/* and @account-kit/*; changed RPC client configuration from connectionConfig to transport pattern.
Wagmi Hook Updates
src/components/pay-mode/Pay.tsx, src/components/roll-debt/RollDebt.tsx, src/components/send-funds/Amount.tsx, src/components/swaps/Swaps.tsx, src/utils/useAuth.ts, src/utils/useAccount.ts, src/utils/server.ts
Migrated from useAccount/getAccount to useConnection/getConnection; changed mutation API from writeContract to mutate destructuring; updated parameter types throughout.
TypeScript Configuration Updates
tsconfig.json, common/tsconfig.json, server/tsconfig.json, .maestro/tsconfig.json
Broadened include patterns to config files, changed moduleResolution to "bundler", added path aliases, adjusted lib and checkJs settings across packages.
Test Infrastructure Changes
server/test/anvil.ts, server/test/database.ts, server/test/hooks/\*.test.ts, server/test/\*\*.ts
Migrated from prool/instances to prool with Instance.anvil(), updated mock cleanup from resetAllMocks() to combined clearAllMocks() + restoreAllMocks(), wrapped publicKey types in Uint8Array<ArrayBuffer>.
Build & App Config Changes
app.config.ts, babel.config.cjs, metro.config.cjs, common/wagmi.config.ts, tamagui.config.ts
Added edge-to-edge UI config, inline AndroidManifest plugin for ML Kit, Babel preset options for import meta, Metro resolveRequest hook for tslib/.js handling, Zustand/jose module aliases, expanded theme token placeholders.
Persona Integration Refactor
src/utils/persona.ts
Simplified createInquiry and resumeInquiry function signatures by removing navigation parameters; moved router-based navigation inside functions; refactored environment handling to use string literals.
Maestro Test Flow Updates
.maestro/flows/local.yaml, .maestro/subflows/sendAsset.yaml, .maestro/subflows/verifyIdentity.yaml, .maestro/package.json, .maestro/tsconfig.json
Added getAccount.js pre-steps to asset transfers, updated verifyIdentity flow with iOS-specific hacks and new script steps, added ESLint dev dependency and test targets, enabled checkJs/enableJs in TypeScript.
Configuration & Manifest Cleanup
.npmrc, .ncurc.json, pnpm-workspace.yaml, cspell.json, nx.json
Removed .npmrc peer hoisting config (moved to pnpm-workspace.yaml); updated NCU reject list for Expo/Babel packages; added workspace hoisting patterns; added ESLint plugin to NX config; updated spell check words.
Deleted Files
src/components/card/CardBack.tsx
Removed entire CardBack component including iframe/WebView cross-platform rendering, message handling, and loading indicator.
Type & Utility Signature Updates
server/utils/decodePublicKey.ts, server/hooks/activity.ts, server/database/schema.ts, server/api/auth/registration.ts, server/test/mocks/keeper.ts
Broadened type parameters (Uint8ArrayUint8Array<ArrayBuffer>), removed optional chaining for RPC URL access (potential runtime error change), relaxed registration validation guard, updated decoder overloads.
Gas Snapshot & Version Updates
contracts/.gas-snapshot, contracts/package.json
Updated gas metrics for several ExaPlugin/ExaAccountFactory tests; bumped forge-std, fresh-crypto-lib, solhint, and switched typescript to catalog.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested reviewers

  • dieguezguille
  • itofarina
  • nfmelendez
  • franm91
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch upgrade

📜 Recent review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 67bfb2e and 514e147.

⛔ Files ignored due to path filters (2)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • substreams/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (133)
  • .changeset/mighty-coins-fly.md
  • .changeset/polite-turtles-glow.md
  • .changeset/swift-waves-dance.md
  • .eas/workflows/local.yaml
  • .eas/workflows/production.yaml
  • .eslintrc.cjs
  • .github/workflows/docs.yaml
  • .github/workflows/mobile-expo.yaml
  • .github/workflows/test.yaml
  • .github/workflows/version.yaml
  • .maestro/eslint.config.mjs
  • .maestro/flows/local.yaml
  • .maestro/package.json
  • .maestro/subflows/sendAsset.yaml
  • .maestro/subflows/verifyIdentity.yaml
  • .maestro/tsconfig.json
  • .ncurc.json
  • .npmrc
  • app.config.ts
  • babel.config.cjs
  • common/eslint.config.mjs
  • common/eslint/base.mjs
  • common/eslint/node.mjs
  • common/eslint/react.mjs
  • common/package.json
  • common/tsconfig.json
  • common/wagmi.config.ts
  • contracts/.gas-snapshot
  • contracts/package.json
  • cspell.json
  • docs/eslint.config.mjs
  • docs/package.json
  • eas.json
  • eslint.config.mjs
  • metro.config.cjs
  • nx.json
  • package.json
  • pnpm-workspace.yaml
  • server/Dockerfile
  • server/api/auth/registration.ts
  • server/database/schema.ts
  • server/eslint.config.mjs
  • server/hooks/activity.ts
  • server/package.json
  • server/test/anvil.ts
  • server/test/api/activity.test.ts
  • server/test/database.ts
  • server/test/e2e.ts
  • server/test/hooks/activity.test.ts
  • server/test/hooks/block.test.ts
  • server/test/hooks/panda.test.ts
  • server/test/mocks/keeper.ts
  • server/test/utils/keeper.test.ts
  • server/tsconfig.json
  • server/utils/createCredential.ts
  • server/utils/decodePublicKey.ts
  • server/utils/ensClient.ts
  • server/utils/keeper.ts
  • server/utils/publicClient.ts
  • server/utils/traceClient.ts
  • src/app/(auth)/_layout.tsx
  • src/app/(main)/(home)/_layout.tsx
  • src/app/(main)/_layout.tsx
  • src/app/(main)/activity-details/_layout.tsx
  • src/app/(main)/add-funds/_layout.tsx
  • src/app/(main)/getting-started/_layout.tsx
  • src/app/(main)/loan/_layout.tsx
  • src/app/(main)/pay/_layout.tsx
  • src/app/(main)/roll-debt/_layout.tsx
  • src/app/(main)/send-funds/_layout.tsx
  • src/app/_layout.tsx
  • src/components/activity/ActivityItem.tsx
  • src/components/activity/PendingProposals.tsx
  • src/components/activity/details/ActivityDetails.tsx
  • src/components/add-funds/AddCrypto.tsx
  • src/components/add-funds/AddFunds.tsx
  • src/components/add-funds/Bridge.tsx
  • src/components/auth/Auth.tsx
  • src/components/auth/Passkeys.tsx
  • src/components/auth/PasskeysAbout.tsx
  • src/components/auth/Success.tsx
  • src/components/card/Card.tsx
  • src/components/card/CardBack.tsx
  • src/components/card/CardPIN.tsx
  • src/components/defi/DeFi.tsx
  • src/components/getting-started/GettingStarted.tsx
  • src/components/home/CardLimits.tsx
  • src/components/home/CardStatus.tsx
  • src/components/home/ExploreDeFi.tsx
  • src/components/home/GettingStarted.tsx
  • src/components/home/Home.tsx
  • src/components/home/HomeActions.tsx
  • src/components/home/Portfolio.tsx
  • src/components/home/PortfolioSummary.tsx
  • src/components/home/VisaSignatureSheet.tsx
  • src/components/home/card-upgrade/ActivateCard.tsx
  • src/components/home/card-upgrade/VerifyIdentity.tsx
  • src/components/loans/Amount.tsx
  • src/components/loans/Asset.tsx
  • src/components/loans/CreditLine.tsx
  • src/components/loans/Installments.tsx
  • src/components/loans/Loans.tsx
  • src/components/loans/Maturity.tsx
  • src/components/loans/Receiver.tsx
  • src/components/loans/Review.tsx
  • src/components/pay-mode/Pay.tsx
  • src/components/pay-mode/PayMode.tsx
  • src/components/pay-mode/PaymentSheet.tsx
  • src/components/roll-debt/RollDebt.tsx
  • src/components/send-funds/Amount.tsx
  • src/components/send-funds/Asset.tsx
  • src/components/send-funds/Qr.tsx
  • src/components/send-funds/Receiver.tsx
  • src/components/settings/Settings.tsx
  • src/components/shared/LatestActivity.tsx
  • src/components/shared/ModalSheet.tsx
  • src/components/shared/ProfileHeader.tsx
  • src/components/shared/ProposalBanner.tsx
  • src/components/shared/TabBar.tsx
  • src/components/swaps/Failure.tsx
  • src/components/swaps/Success.tsx
  • src/components/swaps/Swaps.tsx
  • src/utils/accountClient.ts
  • src/utils/alchemyConnector.ts
  • src/utils/panda.ts
  • src/utils/persona.ts
  • src/utils/publicClient.ts
  • src/utils/server.ts
  • src/utils/useAccount.ts
  • src/utils/useAuth.ts
  • substreams/package.json
  • tamagui.config.ts
  • tsconfig.json

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link

Summary of Changes

Hello @cruzdanilo, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request delivers a comprehensive overhaul of the application's foundational technologies and user interface. It modernizes the development stack by upgrading critical libraries and adopting a streamlined ESLint setup. The changes aim to enhance the application's robustness, responsiveness, and overall user experience by resolving existing issues and introducing refined component interactions.

Highlights

  • Major Dependency Upgrades: Updated core dependencies including Expo (52 -> 54), React (18.3.1 -> 19.1.0), React Native (0.76.9 -> 0.81.5), Wagmi (2 -> 3), Tamagui (1.125.26 -> 1.144.1), and Sentry (6 -> 7) to their latest versions, bringing new features and performance improvements.
  • ESLint Configuration Migration: Migrated the entire monorepo to the new ESLint flat configuration system, centralizing and standardizing linting rules across common, mobile, server, and docs projects for improved code quality and consistency.
  • Account Abstraction Refactoring: Refactored account abstraction logic, transitioning from Wagmi v2 to v3 and replacing @alchemy/aa-* packages with @account-kit/* for enhanced smart account functionality and EIP-5792 support.
  • UI/UX Enhancements & Bug Fixes: Implemented numerous UI/UX improvements across various components, including input fields, card PIN display, bridge component structure, repay amount selector, and asset selector accessibility. Several bugs related to web-only props, OneSignal imports, native refresh calls, animated views, and chain switching on transfer have also been addressed.
  • Maestro E2E Flow Updates: Updated Maestro end-to-end test flows to reflect changes in the application, including new script runs for account retrieval and adjustments to element selection for improved reliability.
  • Build and Deployment Tooling Updates: Updated pnpm versions in .eas/workflows, eas.json, package.json, pnpm-workspace.yaml, and server/Dockerfile to 10.28.0. The pnpm-workspace.yaml now includes a catalog for managing common dependency versions and a publicHoistPattern for better dependency hoisting.
Ignored Files
  • Ignored by pattern: .github/workflows/** (4)
    • .github/workflows/docs.yaml
    • .github/workflows/mobile-expo.yaml
    • .github/workflows/test.yaml
    • .github/workflows/version.yaml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Comment on lines 62 to 69
entryPoint,
source: "WebauthnAccount" as const,
getAccountInitCode: () => Promise.resolve(accountInitCode({ factory, x, y })),
getDummySignature: () => "0x",
getDummySignature: () => DUMMY_SIGNATURE,
signUserOperationHash: async (uoHash) => {
try {
if (queryClient.getQueryData<AuthMethod>(["method"]) === "siwe" && getAccount(ownerConfig).address) {
if (queryClient.getQueryData<AuthMethod>(["method"]) === "siwe" && getConnection(ownerConfig).address) {
return wrapSignature(0, await signMessage(ownerConfig, { message: { raw: uoHash } }));
Copy link

Choose a reason for hiding this comment

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

Bug: The code accesses a non-existent property isDisconnected on the object from getConnection. The correct property is status, which will break the SIWE authentication flow.
Severity: CRITICAL

🔍 Detailed Analysis

In the signIn mutation function within src/utils/useAuth.ts, the code attempts to check the connection status using getConnection(ownerConfig).isDisconnected. However, the object returned by Wagmi's getConnection function does not have an isDisconnected property. The correct property to check is status. Accessing a non-existent property will evaluate to undefined, causing the conditional check to fail. This will break the Sign-In With Ethereum (SIWE) authentication flow, preventing it from triggering a new connection when one is needed.

💡 Suggested Fix

In src/utils/useAuth.ts, update the conditional check to use the status property. Change if (method === "siwe" && getConnection(ownerConfig).isDisconnected) to if (method === "siwe" && getConnection(ownerConfig).status === 'disconnected').

🤖 Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.

Location: src/utils/accountClient.ts#L62-L69

Potential issue: In the `signIn` mutation function within `src/utils/useAuth.ts`, the
code attempts to check the connection status using
`getConnection(ownerConfig).isDisconnected`. However, the object returned by Wagmi's
`getConnection` function does not have an `isDisconnected` property. The correct
property to check is `status`. Accessing a non-existent property will evaluate to
`undefined`, causing the conditional check to fail. This will break the Sign-In With
Ethereum (SIWE) authentication flow, preventing it from triggering a new connection when
one is needed.

Did we get this right? 👍 / 👎 to inform future reviews.
Reference ID: 8445513

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request is a major undertaking, upgrading numerous dependencies including Expo, React, React Native, Wagmi, and Tamagui. The migration to ESLint flat config and pnpm catalogs is a significant improvement for maintainability. The core logic changes to support EIP-5792 are well-implemented. My review focuses on a few subtle issues related to React's ref system that might have been missed during the large-scale refactoring. Overall, this is an excellent and crucial upgrade for the project.

I am having trouble creating individual review comments. Click here to see my feedback.

src/components/activity/Activity.tsx (96-97)

high

Using a plain object literal { current: null } for a ref is not recommended. While it might work in some cases, it relies on React's implementation details and is not the idiomatic way to create refs. You should use React.createRef() for module-level refs to ensure they are correctly handled by React. This change breaks the "scroll to top on tab press" functionality. This issue is also present in other files like Card.tsx, DeFi.tsx, Home.tsx, PayMode.tsx, and Swaps.tsx.

export const activityScrollReference = React.createRef<FlatList<ActivityItemType>>();
export const activityRefreshControlReference = React.createRef<RefreshControl>();

src/components/card/exa-card/ExaCard.tsx (48-57)

high

Similar to AnimatedView, the forwardedRef pattern is implemented incorrectly here. Animated.createAnimatedComponent passes a ref prop that is not received by the YStackWithForwardedReference function component. To fix this and allow refs to be passed to the animated YStack, you should use React.forwardRef.

const YStackWithForwardedReference = React.forwardRef<
  React.ComponentRef<typeof YStack>,
  ComponentPropsWithoutRef<typeof YStack>
>((properties, ref) => {
  return <YStack ref={ref} {...properties} />;
});
YStackWithForwardedReference.displayName = "YStackWithForwardedRef";
const AnimatedYStack = Animated.createAnimatedComponent(YStackWithForwardedReference);

src/components/shared/AnimatedView.tsx (5-14)

high

The forwardedRef pattern is implemented incorrectly here. Animated.createAnimatedComponent will pass a ref prop, but a standard function component cannot receive it. This means the ref will be lost. To correctly forward the ref to the underlying View component, you should wrap your component in React.forwardRef.

const ViewWithForwardedReference = React.forwardRef<
  React.ComponentRef<typeof View>,
  ComponentPropsWithoutRef<typeof View>
>((properties, ref) => {
  return <View ref={ref} {...properties} />;
});
ViewWithForwardedReference.displayName = "ViewWithForwardedRef";
export default Animated.createAnimatedComponent(ViewWithForwardedReference);

src/components/shared/Text.tsx (28-42)

high

The ref is not being forwarded correctly here. The ref prop is special in React and is not passed down as a normal prop. To forward a ref to a function component, you must wrap it in React.forwardRef. The current implementation will not forward the ref to the underlying StyledText component, which can cause issues when a parent component tries to get a ref to this Text component.

const TextComponent = React.forwardRef<
  React.ComponentRef<typeof StyledText>,
  ComponentPropsWithoutRef<typeof StyledText> & { sensitive?: boolean }
>(({ children, sensitive, ...rest }, reference) => {
  const { data: hidden } = useQuery<boolean>({ queryKey: ["settings", "sensitive"] });
  return (
    <StyledText ref={reference} {...rest}>
      {sensitive && hidden ? "***" : children}
    </StyledText>
  );
});

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.

1 participant

Comments