Skip to main content
Version 3 moves every onchain flow to ENSv2. Most apps only need to bump the package, but three cases need code changes: minting under an old Namespace listing, showing the registration price from the success callback, and passing message to TransactionPendingScreen.

What changed from 2.x to 3.x

The new version prop on EnsNameRegistrationForm, NameRenewForm, EnsRecordsForm, and SubnameMintForm, and on the useENSResolver hook, defaults to 2. ENSv1 registration and renewal are retired, so the only reason to pass version={1} is to mint under an old Namespace listing. Peer dependencies are unchanged: React 19 or later, wagmi ^2.19.5, and viem ^2.46.3.

Upgrade checklist

1

Update the package

2

Pass version={1} for old Namespace listings

In 3.x, SubnameMintForm looks for an ENSv2 activation on the parent. If the parent has a listing created before ENSv2, keep it on ENSv1:
Parents that the owner activates on ENSv2 in the Namespace App need no version prop. If a listing mints on Base or Optimism, keep those chains in your wagmi config.
3

Read the registration price from registrationCost

Registration is now paid in USDC or DAI. In onRegistrationSuccess, registrationCost is the token amount. transactionFees and total are both the ETH network fees, so total no longer includes the price.
Update copy that tells users they’ll pay in ETH. Users need USDC or DAI to register, and ETH for gas.
4

Drop message from TransactionPendingScreen

TransactionPendingScreen still works without message, and its hash is now optional. TransactionProgress replaces it. See Transaction progress.
5

Remove your own approval and balance steps

The forms now approve the payment token, batch calls when the wallet supports it, and block the transaction with “Insufficient funds” when the wallet can’t pay. Remove any approval or balance check you added around the forms.
6

Check the networks in your wagmi config

ENSv2 runs on Ethereum mainnet, and on Sepolia with isTestnet. Make sure your wagmi config includes the chains you use.
7

Add the new renewal forms, if you need them

NameRenewForm and SubnameRenewForm are new and optional. See Renew names and Renew subnames.

Upgrade from 1.x to 2.x

Version 2.0.0 was a visual redesign. Props, hooks, and exports didn’t change.
  • The accent changed from blue to near-black, set by --ns-ink, and corners changed from square to 10 px, set by --ns-radius.
  • Fonts changed from Satoshi to DM Sans and DM Mono.
  • The stylesheet no longer sets a background on your page’s html element. Add background: var(--ns-bg) to your page if you relied on it.
  • Older --ns-color-* and --ns-blue-* variables still resolve. Move overrides to the new tokens. See Theming.
If you are on 1.1.0 or 1.1.1, two later 1.x releases also changed the API:
  • 1.1.2: OffchainSubnameForm takes an offchainManager client instead of apiKeyOrToken, and onSubnameCreated and onSubnameUpdated replace onSuccess. The form no longer saves subnames, so your callbacks must. See Offchain subnames.
  • 1.3.0: onRegistrationSuccess returns durationLabel instead of expiryInYears.
See the changelog for every release.