Pular para o conteúdo
ecdsa.com
MetaMask (eth_signTypedData_v3/v4)Carteiras e assinaturas Web3

Mensagem de erro

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

Também aparece como

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

Os dApps recebem isso como um erro JSON-RPC de `eth_signTypedData_v4` (o MetaMask retorna o código -32603 com este texto). Os números são os IDs da cadeia do seu domínio e da carteira. Enquanto o MetaMask está trocando de rede, a requisição falha com “Cannot sign messages for chainId …, because MetaMask is switching networks.”.

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

O que significa

O `domain.chainId` EIP-712 dos dados tipados é diferente da rede à qual a carteira está conectada no momento, e o MetaMask se recusa a mostrar a solicitação de assinatura. A regra protege os usuários: o ID da cadeia faz parte do que é assinado, e uma assinatura feita para outra cadeia poderia ser repetida (replay) nela. O primeiro número é o `domain.chainId` do dApp; o segundo, a cadeia ativa da carteira, ambos em decimal.

Por que acontece

Como corrigir

  1. 1.

    Montar o domínio a partir da cadeia atual da carteira

    Leia o ID da cadeia logo antes de assinar e escolha o contrato verificador implantado nessa cadeia.

    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 trocar a carteira para a cadeia exigida

    Quando a ordem ou o permit só vale em uma cadeia, peça primeiro a troca de rede (`wallet_switchEthereumChain`) e depois assine.

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

Erros relacionados

Ver toda a base de erros de assinatura