Zum Inhalt springen
ecdsa.com
MetaMask (eth_signTypedData_v3/v4)Web3-Wallets und -Signaturen

Fehlermeldung

Provided chainId "1" must match the active chainId "137"

Auch ausgegeben als

  • Cannot sign messages for chainId "1", because MetaMask is switching networks.

dApps erhalten die Meldung als JSON-RPC-Fehler von `eth_signTypedData_v4` (MetaMask gibt Code -32603 mit diesem Text zurück). Die Zahlen sind die Chain-IDs deiner Domain und der Wallet. Während MetaMask das Netzwerk wechselt, scheitert die Anfrage mit „Cannot sign messages for chainId …, because MetaMask is switching networks.“

MetaMask (eth_signTypedData_v3/v4) — validation in @metamask/signature-controller

Was der Fehler bedeutet

Der EIP-712-Wert `domain.chainId` der Typed Data weicht vom Netzwerk ab, mit dem die Wallet gerade verbunden ist, und MetaMask weigert sich, die Signaturanfrage anzuzeigen. Die Regel schützt alle, die signieren: Die Chain-ID gehört zu dem, was signiert wird, und eine Signatur für eine andere Chain könnte dort erneut eingespielt werden. Die erste Zahl ist `domain.chainId` der dApp, die zweite die aktive Chain der Wallet, beide dezimal.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Domain aus der aktuellen Chain der Wallet aufbauen

    Lies die Chain-ID direkt vor dem Signieren aus und wähle den Verifying Contract, der auf dieser Chain bereitgestellt ist.

    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.

    Oder Wallet auf die benötigte Chain umstellen

    Ist die Order oder das Permit nur auf einer Chain gültig, fordere zuerst einen Netzwerkwechsel an (`wallet_switchEthereumChain`) und signiere danach.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen