Multi-Chain Made Easy with Talisman Wallet.
An ultra-secure Ethereum, Polkadot and Solana wallet for both beginners and pros.
This repo contains the source code for Talisman Wallet.
If you want to use Talisman, you can install it for your browser by following this link.
If you would like to build Talisman from source, please continue reading:
If you haven't already, you will first need to install Node.js on your system.
This repo uses corepack and pnpm to manage dependencies.
Corepack is distributed by default with all recent Node.js versions.
Pnpm is a fast, disk space efficient javascript package manager.
Corepack lets you use pnpm without having to install a specific version of it.
Once you have installed Node.js, run corepack enable to turn it on, then follow the Getting started instructions to continue.
-
Install Node.js and enable corepack, as per the System Requirements section.
-
Clone the repo.
git clone [email protected]:TalismanSociety/talisman.git -
Change to the repo directory.
cd talisman -
Install nodejs
nvm install -
Install dependencies.
pnpm install -
Start the dev server (uses WXT/Vite for fast rebuilds and HMR).
pnpm dev:extension -
Open Chrome and navigate to
chrome://extensions. -
Turn on the
Developer modetoggle on the top right of the page. -
Click
Load unpackedon the top left of the page and select theapps/extension/dist/chrome-mv3-devdirectory. -
Change some code! The extension will hot-reload automatically.
To develop for Firefox instead:
pnpm dev:extension:firefoxThen load the extension from apps/extension/dist/firefox-mv3-dev in Firefox's about:debugging page.
apps/extension: the non-custodial Talisman Wallet browser extension (built with WXT/Vite)packages/tsconfig: sharedtsconfig.jsons used throughout the monorepopackages/util: library containing shared non-react code. It is not meant to be npm published.
All our apps and packages are 100% TypeScript.
- Testing is carried out with Vitest.
- Tests can be written in
*.spec.tsfiles, inside a__tests__folder. - Follow the pattern in
apps/extension/src/core/handlers/Extension.spec.tsorapps/extension/src/core/domains/signing/__tests__/requestsStore.spec.ts - Tests are run with
pnpm test
We use Biome for linting and formatting across the monorepo.
- Format code:
pnpm chore:format - Lint code:
pnpm lint - Pre-commit hook: Automatically runs Biome checks on staged files
If you're using VS Code, install the Biome extension for automatic formatting on save.
We use i18next in the wallet to make it available in a bunch of languages.
When building UI features, please follow the following spec to ensure they're translatable:
-
Import the
useTranslationhook into your React components:import { useTranslation } from "react-i18next";
-
Use the hook in your component to get access to the
tfunction:const { t } = useTranslation();
-
Wrap any user-visible language in your component with the
tfunction:return ( <div className="flex flex-col items-start"> <div className="text-base">{t("Account Assets")}</div> <div className="text-sm"> {t("Account has {{assetCount}} assets", { assetCount: assets.length })} </div> </div> );
-
If you want to include any react components in your translation, you will need to use the
Transcomponent:import { useTranslation, Trans } from "react-i18next" const { t } = useTranslation() return ( <Trans {/* DO NOT FORGET THIS `t` PROP! */} t={t} defaults="Your <Highlight>{{name}} <Tooltip /></Highlight> address" values={{ name: chain.name }} components={{ Highlight: <span className="text-body" />, Tooltip: ( <Tooltip> <TooltipTrigger> <InfoIcon className="hover:text-body inline align-middle text-xs" /> </TooltipTrigger> <TooltipContent> {t( "Only use this address for receiving assets on the {{name}} network.", { name: chain.name, } )} </TooltipContent> </Tooltip> ), }} )
-
If you see one of the following errors in your console:
locales/en/common.json:1 Failed to load resource: net::ERR_FILE_NOT_FOUNDi18next::translator: missingKey en common <i18n-key>Then update the english translation files with this command:
pnpm chore:update-translations
chore:update-translations: finds all of the i18n strings in the codebase and adds them to the english translations files which i18next loads in development builds of the wallet
dev: starts the extension dev server (alias fordev:extension)dev:extension: starts WXT dev server with hot module replacement for Chromedev:extension:firefox: starts WXT dev server for Firefox
build:extension: builds the extension for Chrome (outputs todist/chrome-mv3)build:extension:firefox: builds the extension for Firefox (outputs todist/firefox-mv3)build:extension:prod: production Chrome build with Sentry sourcemap uploadbuild:extension:prod:firefox: production Firefox build via Docker (reproducible)build:extension:canary: canary Chrome build for internal testingbuild:extension:canary:firefox: canary Firefox build for internal testing
Firefox production builds use a two-pass Docker build to ensure reproducibility:
- Pass 1: Build from repo → generates
sources.zip - Pass 2: Rebuild from
sources.zip→ produces final deliverables
This guarantees that the shipped extension is built from the exact sources that are shipped, which is what Firefox Add-on reviewers will do. The build produces byte-identical output with matching SHA-256 checksums.
# Build Firefox production extension (requires Docker with network access)
pnpm build:extension:prod:firefox
# Verify the build is reproducible
./scripts/verify-reproducible-build.shSee FIREFOX_SOURCE_CODE_REVIEW.md for reviewer instructions.
# Make changes, and then run:
pnpm changeset
# Select the packages which have been modified and write a commit messageIf you find a security issue or exploit, please email us at [email protected]. Please DO NOT create an issue or PR in this repo for security issues.