Sitelet https://github.com/synpress/synpress/issues/1311
Skip to content

Phantom extension download URL is NXDOMAIN — crx-backup.phantom.dev no longer resolves #1311

Description

@kauenet

@synthetixio/synpress-phantom cannot download the Phantom extension: the URL it fetches from no longer resolves. Every Phantom fixture fails at cache-build time, which effectively means Solana support is unreachable even though the code for it is complete and merged.

The dead host

wallets/phantom/src/prepareExtensionPhantom.ts:

PHANTOM_EXTENSION_DOWNLOAD_URL = 'https://crx-backup.phantom.dev/latest.crx'

crx-backup.phantom.dev returns NXDOMAIN — DNS status 3 from both Cloudflare DoH (1.1.1.1) and Google DoH (8.8.8.8). phantom.dev itself resolves normally, so it is that subdomain specifically that is gone.

The same literal is baked into the published @synthetixio/synpress-cache@0.0.14 tarball, so a user cannot work around it by pinning an older cache package.

There is no override hook

I grepped the published dist of @synthetixio/synpress-cache@0.0.14 for process.env: the only reads are HEADLESS and two rimraf-related test variables. There is no PHANTOM_EXTENSION_DOWNLOAD_URL, no generic extension-path variable, and no documented way to point synpress-cache --phantom at a locally downloaded .crx. So the failure is unrecoverable from the user side.

Why this is worth fixing rather than deprecating

The Solana support here is real and, as far as I can tell, the most complete in any Playwright wallet driver:

  • Networks = 'solana' | 'ethereum' | 'base' | 'polygon' | 'bitcoin'
  • importWalletFromPrivateKey('solana', <base58 secret>), getAccountAddress('solana'), toggleTestnetMode()
  • confirmSignature, confirmSignatureWithRisk, rejectSignature, confirmTransaction, rejectTransaction — 23 methods
  • Working specs: test/playwright/e2e/confirmTransaction.spec.ts drives should Sign Transaction and should Sign All Transactions through a solanaSandboxSetup() common step

That landed in #1271, "Phantom support for Playwright", merged 2025-05-04. It would be a shame for it to be unusable over a hostname.

Suggested fix

The Chrome Web Store CRX endpoint serves authentic Phantom bytes and works today. I verified it this session:

https://clients2.google.com/service/update2/crx?response=redirect&acceptformat=crx2,crx3&prodversion=<ver>&x=id%3Dbfnaelmomeimhlpmgjnjophhpkkoljpa%26uc

→ HTTP 200, 17,597,295 bytes, application/x-chrome-extension, redirecting to …BFNAELMOMEIMHLPMGJNJOPHHPKKOLJPA_26_31_0_0.crx. bfnaelmomeimhlpmgjnjophhpkkoljpa is Phantom's real Web Store ID.

The trade-off worth naming: the Web Store serves whatever is current and refuses a version pin, so a Phantom release can change selectors under a passing suite. Another project in this space (walletwright) handles that by recording a sha256 of the bytes it actually downloaded and failing loudly when it moves, rather than silently trusting a new build — that seems like the right posture, and it is strictly better than a dead URL.

Whatever the fix, an environment-variable override for the download URL or a local .crx path would make this class of breakage recoverable without a release.

Two smaller things in the Phantom fixtures

While reading the specs:

  1. wallets/phantom/test/playwright/basic.setup.ts uses the public test test test test test test test test test test test junk seed. Phantom is reported to block dApp connections from that well-known seed, so a fresh onboarding with it may not be usable even once the download is fixed.
  2. solanaSandboxSetup navigates to https://r3byv.csb.app/, a CodeSandbox preview URL. That is an external dependency on somebody's sandbox staying alive — vendoring the dapp-under-test would make the suite self-contained.

Happy to send a PR for the download-URL change plus an env override if that is a direction you would take.


Context: I am a maintainer of solanabr/ai-kit, a Claude Code configuration kit for Solana development. We were evaluating wallet E2E options and this was the most capable candidate we found, which is why the dead hostname was worth reporting carefully rather than just moving on.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions