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
Die dApp hat chainId fest einprogrammiert
häufigEine Domain mit `chainId: 1` (oder der ID eines Testnetzes), während sich die Nutzer über Polygon, Base, Arbitrum … verbinden. Die Signaturanfrage scheitert für alle, die nicht auf dieser Chain sind.
In der Wallet wurde das Netzwerk gewechselt, nachdem die dApp die Chain ausgelesen hatte
häufigDie dApp hat die Chain-ID beim Aufbau der Verbindung zwischengespeichert und nicht auf `chainChanged` reagiert. Die nächste Signaturanfrage trägt den veralteten Wert.
chainId als String, der anders geparst wird
gelegentlichChain-IDs, die als String vorliegen, interpretiert MetaMask nur mit dem Präfix `0x` als Hex. `"89"` ist dezimal 89, nicht die 0x89 (137) von Polygon.
So behebst du den Fehler
- 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.
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 });