Aller au contenu
ecdsa.com
MetaMask (eth_signTypedData_v3/v4)Portefeuilles et signatures Web3

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

Comment corriger l’erreur

  1. 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. 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 });

Erreurs associées

Parcourir toute la base de données des erreurs de signature