Safe{Wallet} – smart account wallet
  • TypeScript 90.6%
  • JavaScript 7.3%
  • CSS 1.3%
  • Shell 0.4%
  • HTML 0.3%
  • Other 0.1%
Find a file
Tim e979da22d1
feat(mobile): enable connect wallet app option on signer import screen (#7545)
* feat: add appkit dependencies

* feat: add basic appkit config

* feat: add wallet configs for Rabby and Phantom to appKit configuration

* feat: update ImportSigners feature with new wallet connection options and replace Metamask image

- Added new ConnectWalletApp image for wallet connection.
- Removed Metamask image from the project.
- Enhanced ImportSignersContainer to support wallet connection via WalletConnect.
- Updated item descriptions and titles for clarity in the signer import process.
- Introduced new SignerType enum for better type management in signersSlice.

* fix: remove borderRadius from SafeCard component

* refactor: update SignerType to use string literals and clean up imports in ImportSignersContainer

- Replaced SignerType enum with string literals.
- Removed unused import of SignerType in ImportSignersContainer.
- Updated type assignment for wallet connection in ImportSignersContainer to use string literal 'walletconnect'.

* fix: update wallet-related images in mobile assets

Make gradient overlay transparent so it works on both light and dark mode

* refactor: streamline signer connection handling in ImportSignersContainer

- Updated the handling of signer connections to use a more concise approach with a single callback function.
- Removed the previous memoization of items and integrated the item definitions directly into the component.
- Enhanced the connection logic to include biometric checks for the seed signer option.

* fix: update minimum SDK version for Android in app configuration

* refactor: migrate from AsyncStorage to MMKV for improved storage performance

- Removed AsyncStorage dependency and replaced it with MMKV for better efficiency in data handling.
- Updated storage methods in appKit and Storybook configuration to utilize MMKV's API.

* refactor: simplify state management in ImportSignersContainer

- Removed unused selector for existing signer to streamline the connection logic.

* refactor: reorganize component hierarchy in RootLayout for improved readability

- Adjusted the order of providers in RootLayout to enhance clarity and maintainability.
- Moved AppKitProvider to be nested within the Provider for better context management.

* refactor: update type handling in appKit storage methods for improved type safety

- Changed generic type from 'any' to 'unknown' in getEntries, setItem, and getItem methods to enhance type safety.
- Updated parseEntry function to return a tuple with the correct type inference.

* chore: updare yarn.lock

* fix:  revert removal of `@react-native-async-storage/async-storage` dependency

It's needed by appkit

* refactor: replace base64 wallet icons with URLs in appKit configuration

- Removed base64 encoded icons for Phantom and Rabby wallets.
- Updated image URLs to point to hosted images for better performance and maintainability.
- Added new image files for the wallets in the web public images directory.
2026-03-27 16:11:51 +01:00
.claude tests: improve test coverage and reduce CI flakiness (#7507) 2026-03-25 11:34:23 +01:00
.cursor/rules fix(e2e): add and update tests for the actions panel task (#7233) 2026-03-04 16:19:57 +01:00
.github fix(e2e): hard code chrome version (#7547) 2026-03-27 14:30:24 +01:00
.husky chore: fix lint-staged running in pre-push instead of pre-commit (#7375) 2026-03-10 13:58:36 +01:00
.specify chore: migrate tx-builder from safe-apps repo to this monorepo (#6953) 2026-01-22 12:43:50 +01:00
.vscode Refactor Cypress tests: address book and balance tests (#2502) 2023-09-11 08:13:28 +02:00
.yarn/patches chore(mobile): upgrade Tamagui from v1 to v2 (#7497) 2026-03-20 16:39:59 +01:00
apps feat(mobile): enable connect wallet app option on signer import screen (#7545) 2026-03-27 16:11:51 +01:00
config chore: tx-builder path-filtered changelog for releases (#7540) 2026-03-26 17:11:36 +01:00
docs/solutions/workflow-issues chore(mobile): upgrade Tamagui from v1 to v2 (#7497) 2026-03-20 16:39:59 +01:00
expo-plugins/notification-service-ios chore: fix lint-staged to run prettier on staged files only (#7542) 2026-03-26 17:11:21 +01:00
packages feat: add GTF gas fees preview and info banner (#7522) 2026-03-26 11:58:07 +01:00
scripts tests: improve test quality by removing as-any casts, dead tests, and fetch mock anti-patterns (#7501) 2026-03-20 17:47:17 +01:00
specs feat(web): enhance proposer functionality with nested safe support (#7028) 2026-02-18 15:10:37 +01:00
tools/codemods/migrate-feature refactor: optimize useLoadFeature with shared registry and reduced re-renders (#7154) 2026-02-12 16:05:20 +01:00
.codescene.yml feat(web): Epic: Spaces (#7168) 2026-03-19 15:44:20 +01:00
.editorconfig chore: add .editorconfig for consistent formatting (#6503) 2025-10-20 08:39:18 +02:00
.gitattributes chore: Normalize line endings to LF (#6259) 2025-09-02 08:38:33 +02:00
.gitignore fix(mobile): upgrade react-native-quick-crypto for Android 16KB page size (#7480) 2026-03-19 13:28:26 +01:00
.lintstagedrc.mjs chore: fix lint-staged to run prettier on staged files only (#7542) 2026-03-26 17:11:21 +01:00
.nvmrc chore(ci): enforce Node 24.14.0 and unify mobile CI setup (#7469) 2026-03-18 17:33:02 +01:00
.prettierignore fix: add auto-generated schema.json to .prettierignore (#7243) 2026-03-02 12:41:52 +01:00
.prettierrc chore: Normalize line endings to LF (#6259) 2025-09-02 08:38:33 +02:00
.yarnrc.yml feat(mobile): upgrade Expo SDK to v55 (#7433) 2026-03-18 09:29:16 +01:00
AGENTS.md chore: require visual summary in PR descriptions for AI agents (#7544) 2026-03-27 08:57:33 +01:00
CLAUDE.md docs: clean up CLAUDE.md (#7394) 2026-03-12 08:42:28 +01:00
CONTRIBUTING.md docs(mobile): move docs to correct locations 2025-02-12 11:11:47 +00:00
Dockerfile Chore: fix docker build (#4740) 2025-01-07 13:42:53 +01:00
LICENSE Chore: copy the LICENSE back in the monorepo root (#4769) 2025-01-14 11:39:06 +01:00
package.json chore(mobile): upgrade Tamagui from v1 to v2 (#7497) 2026-03-20 16:39:59 +01:00
README.md docs: add poem to README (#7355) 2026-03-10 17:51:51 +01:00
yarn.config.cjs feat(mobile): upgrade Expo SDK to v55 (#7433) 2026-03-18 09:29:16 +01:00
yarn.lock feat(mobile): enable connect wallet app option on signer import screen (#7545) 2026-03-27 16:11:51 +01:00

Safe{Wallet}

Safe{Wallet} monorepo

🌐 Safe{Wallet} web app📱 Safe{Wallet} mobile app

Overview

Welcome to the Safe{Wallet} monorepo! Safe (formerly Gnosis Safe) is a multi-signature smart contract wallet for Ethereum and other EVM chains, requiring multiple signatures to execute transactions.

This repository houses both web and mobile applications along with shared packages, managed under a unified structure using Yarn Workspaces. The monorepo setup simplifies dependency management and ensures consistent development practices across projects.

Key components

  • apps/web - Next.js web application (detailed documentation)
  • apps/mobile - Expo/React Native mobile application (detailed documentation)
  • packages/store - Shared Redux store used by both platforms
  • packages/utils - Shared utilities and TypeScript types
  • config/ - Shared configuration files

Important

For detailed setup instructions and platform-specific development guides, please refer to the dedicated README files:

Getting started

To get started, ensure you have the required tools installed and follow these steps:

Prerequisites

  • Node.js: Install the latest stable version from Node.js.
  • Yarn: Use Yarn version 4.5.3 or later

to install it with the latest node version you can simply do

corepack enable

and then just run

yarn

This will install the required version of yarn and resolve all dependencies.

Note

Corepack is a tool to help with managing versions of your package managers. It exposes binary proxies for each supported package manager that, when called, will identify whatever package manager is configured for the current project, download it if needed, and finally run it.

Initial setup

  1. Clone the repository:
git clone <repo-url>
cd monorepo
  1. Install dependencies:
yarn install

Quick start commands

# Run web app in development mode
yarn workspace @safe-global/web dev

# Run mobile app in development mode
yarn workspace @safe-global/mobile start

# Run tests for web
yarn workspace @safe-global/web test

# Run Storybook for web
yarn workspace @safe-global/web storybook

Tip

For comprehensive setup instructions, environment variables, testing, and platform-specific workflows, see:

  • Web App README - Environment setup, Cypress E2E tests, Storybook, and more
  • Mobile App README - iOS/Android setup, Maestro E2E tests, Expo configuration, and more

Monorepo commands

Here are some essential commands to help you navigate the monorepo:

Workspace management

  • Run a script in a specific workspace:
yarn workspace <workspace-name> <script>

Example:

yarn workspace @safe-global/web dev
  • Add a dependency to a specific workspace:
yarn workspace <workspace-name> add <package-name>
  • Remove a dependency from a specific workspace:
yarn workspace <workspace-name> remove <package-name>

Note

Yarn treats commands that contain a colon as global commands. For example if you have a command in a workspace that has a colon and there isn't another workspace that has the same command, you can run the command without specifying the workspace name. For example:

yarn cypress:open

is equivalent to:

yarn workspace @safe-global/web cypress:open

Linting, formatting, and type-checking

  • Run ESLint across all workspaces:
yarn lint
  • Run Prettier to check formatting:
yarn prettier
  • Run type-check for a workspace:
yarn workspace @safe-global/web type-check
yarn workspace @safe-global/mobile type-check

Testing

  • Run unit tests across all workspaces:
yarn test
  • Run E2E tests (web only):
yarn workspace @safe-global/web cypress:open  # Interactive mode
yarn workspace @safe-global/web cypress:run   # Headless mode

Contributing

Adding a new workspace

  1. Create a new directory under apps/ or packages/.
  2. Add a package.json file with the appropriate configuration.
  3. Run:
yarn install

Best practices

  • Use Yarn Workspaces commands for managing dependencies.
  • Ensure type-check, lint, prettier, and tests pass before pushing changes.
  • Follow the semantic commit message guidelines.
  • For AI contributors, see AGENTS.md for detailed guidelines.

Tools & configurations

  • Husky: Pre-commit hooks for linting, formatting, and type-checking.
  • ESLint & Prettier: Enforce coding standards and formatting.
  • Jest: Unit testing framework.
  • Cypress: E2E testing for the web app.
  • Storybook: Component documentation and development for the web app.
  • Expo: Mobile app framework for the mobile workspace.
  • Next.js: React framework for the web workspace.
  • Tamagui: UI component library for the mobile app.

Release process

For information on releasing the web app, see the Automated Release Procedure.

Ode to the repo

In ages past when Gnosis laid the founding stone,
A vault was wrought that no single key could own.
Where signatures must gather ere the gate will yield,
M-of-N doth guard the treasure, sworn and sealed.

Now Yarn doth wind its threads through hall and bower,
Binding web and mobile in a single tower.
Redux keeps the ledger, RTK Query rides afar,
Returning with the fetched gold beneath the evening star.

Chain by chain the watchers set their vigil wide,
Across th' EVM kingdoms, ever at the Safe's own side.
Storybook doth chronicle each component's tale,
And Cypress walks the paths where lesser tests would fail.

No `any` types shall darken these well-guarded lands —
That ancient law doth hold by Prettier's own hands.
Feature flags like waypoints mark what lies ahead,
And lazy loads awaken only where the road doth tread.

Long the name hath wandered — Gnosis once, now Safe it stands,
Yet still the vow endureth, written into typed commands:
That what you hold stays guarded, deep beyond all theft or flame,
For this the codebase liveth — and security its name.

If you have any questions or run into issues, feel free to open a discussion or contact the maintainers. Happy coding! 🚀