End-to-end wallet testing

Test real wallet flows
across every chain.

Chroma drives Polkadot, Ethereum & Solana wallet extensions inside real Playwright tests. Import seeds, authorize dApps, approve and reject transactions, all in code.

$ npm i @avalix/chromaRead the docs →
Built on Playwright
PolkadotEthereumSolana

Why Chroma

Wallet automation that behaves like a user, not a mock.

No stubbed providers or injected globals. Chroma loads the real browser extensions and clicks through them, so your tests exercise the exact flows your users hit.

Real extensions, real popups

Polkadot-JS, Talisman and MetaMask run as actual Chromium extensions. Chroma finds their popups and side panels and drives them like a person would.

Multi-wallet by design

Configure one wallet or several in a single test. The wallets fixture is fully typed. Only the wallets you declare show up, with their own methods.

Persistent profiles

Import an account once and reuse it across the whole worker. Clone a prepared profile per parallel worker for fast, isolated runs.

Drop-in Playwright

It is Playwright. createWalletTest() returns a normal test object, so every assertion, trace and reporter you already use just works.

One CLI for fixtures

npx chroma download-extensions pulls pinned extension builds into .chroma/, reproducible across machines and CI.

Headless & Docker-ready

Run headed locally to watch the flow, or headless in a container. A ready-made Dockerfile runs the full matrix on CI.

From zero to signed tx

A whole wallet flow, in a few lines.

Declare the wallets you need, import an account, then walk the dApp exactly like a user.

  • 1

    Configure

    Pass the wallets to createWalletTest() and get a typed test.

  • 2

    Import

    Seed an account with a mnemonic. Chroma drives the extension's import flow.

  • 3

    Authorize & sign

    Connect to the dApp, then approve or reject the transaction popup.

wallet.spec.ts
import { createWalletTest } from '@avalix/chroma'

const test = createWalletTest({
  wallets: [{ type: 'polkadot-js' }],
})

test('connects and signs', async ({ page, wallets }) => {
  const pjs = wallets['polkadot-js']

  await pjs.importMnemonic({
    seed: 'bottom drive obey lake curtain smoke...',
  })

  await page.goto('http://localhost:3000')
  await pjs.authorize()      // connect dApp
  await pjs.approveTx()      // sign the tx
})

Coverage

Wallets & chains, accounted for.

The matrix grows with every release. Here's what ships in v1.0.1.

Wallets
Polkadot JS Extensionv0.62.6 · supported
Talismanv3.1.13 · supported
MetaMaskv13.28.0 · supported
SubWalletplanned
Chains
Polkadotsupported
Ethereumsupported
Solanasupported
More soonon the roadmap

Ship wallet features without the manual QA.

Install the package, download the extensions, write your first test in minutes.