Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

Multi-Chain Made Easy with Talisman Wallet. An ultra-secure Ethereum and Polkadot wallet for both beginners and pros.

License

Notifications You must be signed in to change notification settings

TalismanSociety/talisman

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Talisman Wallet

Talisman

website-link discord-link chrome-users-count
chrome-web-store-link firefox-addon-link

Multi-Chain Made Easy with Talisman Wallet.
An ultra-secure Ethereum, Polkadot and Solana wallet for both beginners and pros.

What's inside?

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:

System requirements

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.

Getting started (wallet extension development)

  1. Install Node.js and enable corepack, as per the System Requirements section.

  2. Clone the repo.

    git clone [email protected]:TalismanSociety/talisman.git

  3. Change to the repo directory.

    cd talisman

  4. Install nodejs

    nvm install

  5. Install dependencies.

    pnpm install

  6. Start the dev server (uses WXT/Vite for fast rebuilds and HMR).

    pnpm dev:extension

  7. Open Chrome and navigate to chrome://extensions.

  8. Turn on the Developer mode toggle on the top right of the page.

  9. Click Load unpacked on the top left of the page and select the apps/extension/dist/chrome-mv3-dev directory.

  10. Change some code! The extension will hot-reload automatically.

Firefox Development

To develop for Firefox instead:

pnpm dev:extension:firefox

Then load the extension from apps/extension/dist/firefox-mv3-dev in Firefox's about:debugging page.

Apps and packages

  • apps/extension: the non-custodial Talisman Wallet browser extension (built with WXT/Vite)
  • packages/tsconfig: shared tsconfig.jsons used throughout the monorepo
  • packages/util: library containing shared non-react code. It is not meant to be npm published.

All our apps and packages are 100% TypeScript.

Writing and running tests

  • Testing is carried out with Vitest.
  • Tests can be written in *.spec.ts files, inside a __tests__ folder.
  • Follow the pattern in apps/extension/src/core/handlers/Extension.spec.ts or apps/extension/src/core/domains/signing/__tests__/requestsStore.spec.ts
  • Tests are run with pnpm test

Code quality

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.

i18n (wallet extension development)

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:

  1. Import the useTranslation hook into your React components:

    import { useTranslation } from "react-i18next";
  2. Use the hook in your component to get access to the t function:

    const { t } = useTranslation();
  3. Wrap any user-visible language in your component with the t function:

    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>
    );
  4. If you want to include any react components in your translation, you will need to use the Trans component:

    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>
          ),
        }}
    )
  5. If you see one of the following errors in your console:

    locales/en/common.json:1
    Failed to load resource: net::ERR_FILE_NOT_FOUND
    
    i18next::translator: missingKey en common <i18n-key>
    

    Then update the english translation files with this command:

    pnpm chore:update-translations

Scripts

  • 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

Development

  • dev : starts the extension dev server (alias for dev:extension)
  • dev:extension : starts WXT dev server with hot module replacement for Chrome
  • dev:extension:firefox : starts WXT dev server for Firefox

Production Builds

  • build:extension : builds the extension for Chrome (outputs to dist/chrome-mv3)
  • build:extension:firefox : builds the extension for Firefox (outputs to dist/firefox-mv3)
  • build:extension:prod : production Chrome build with Sentry sourcemap upload
  • build:extension:prod:firefox : production Firefox build via Docker (reproducible)
  • build:extension:canary : canary Chrome build for internal testing
  • build:extension:canary:firefox : canary Firefox build for internal testing

Firefox Production Builds

Firefox production builds use a two-pass Docker build to ensure reproducibility:

  1. Pass 1: Build from repo → generates sources.zip
  2. 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.sh

See FIREFOX_SOURCE_CODE_REVIEW.md for reviewer instructions.

Update packages

# Make changes, and then run:
pnpm changeset
# Select the packages which have been modified and write a commit message

Security disclosures

If 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.

About

Multi-Chain Made Easy with Talisman Wallet. An ultra-secure Ethereum and Polkadot wallet for both beginners and pros.

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Contributors 18

Languages