Message d’erreur
Provided chainId "1" must match the active chainId "137"
Également affiché sous la forme
- Cannot sign messages for chainId "1", because MetaMask is switching networks.
Les dApps la reçoivent sous forme d’erreur JSON-RPC de `eth_signTypedData_v4` (MetaMask renvoie le code -32603 avec ce texte). Les nombres sont les ID de chaîne de votre domaine et du portefeuille. Pendant que MetaMask change de réseau, la requête échoue avec « Cannot sign messages for chainId …, because MetaMask is switching networks. ».
MetaMask (eth_signTypedData_v3/v4) — validation in @metamask/signature-controller
Ce que cela signifie
Le `domain.chainId` EIP-712 des données typées diffère du réseau auquel le portefeuille est actuellement connecté, et MetaMask refuse d’afficher la demande de signature. Cette règle protège les utilisateurs : l’ID de chaîne fait partie de ce qui est signé, et une signature destinée à une autre chaîne pourrait y être rejouée. Le premier nombre est le `domain.chainId` de la dApp, le second la chaîne active du portefeuille, tous deux en décimal.
Pourquoi cela se produit
La dApp code chainId en dur
fréquenteUn domaine construit avec `chainId: 1` (ou l’ID d’un réseau de test) alors que les utilisateurs se connectent sur Polygon, Base, Arbitrum… La demande de signature échoue pour chaque utilisateur qui n’est pas sur cette chaîne.
L’utilisateur a changé de réseau après que la dApp a lu la chaîne
fréquenteLa dApp a mis en cache l’ID de chaîne au moment de la connexion et n’a pas écouté `chainChanged`. La demande de signature suivante porte la valeur périmée.
chainId sous forme de chaîne interprétée autrement
occasionnelleMetaMask n’interprète un ID de chaîne fourni sous forme de chaîne comme hexadécimal qu’avec un préfixe `0x`. `"89"` correspond à 89 en décimal, et non au 0x89 (137) de Polygon.
Comment corriger l’erreur
- 1.
Construire le domaine à partir de la chaîne actuelle du portefeuille
Lisez l’ID de chaîne juste avant de signer et choisissez le contrat vérificateur déployé sur cette chaîne.
ts const chainId = await walletClient.getChainId(); // viem // const chainId = Number(await provider.send("eth_chainId", [])); // ethers / raw EIP-1193 const domain = { name: "Example DEX", version: "1", chainId, verifyingContract: dexAddressFor(chainId) }; - 2.
Ou basculer le portefeuille sur la chaîne requise
Lorsque l’ordre ou le permit n’est valide que sur une seule chaîne, demandez d’abord un changement de réseau (`wallet_switchEthereumChain`), puis signez.
ts // If the signature is only valid on one chain (the verifying contract lives there), ask the wallet to switch. await walletClient.switchChain({ id: 1 }); const signature = await walletClient.signTypedData({ account, domain, types, primaryType: "Order", message });