Saltar al contenido
ecdsa.com
viem (TypeScript)Billeteras y firmas Web3

Mensaje de error

Invalid primary type `Email` must be one of `["EIP712Domain","Mail"]`.

Los nombres entre comillas invertidas son tu `primaryType` y los tipos disponibles. viem 2.57 lo lanza con `err.name` «BaseError»; `err.shortMessage` es el texto de arriba, y `err.message` añade una sugerencia, un enlace a la documentación («typeddatainvalidprimarytypeerror») y la versión de viem.

viem (TypeScript) — hashTypedData / signTypedData / verifyTypedData / recoverTypedDataAddress

Qué significa

El `primaryType` que pasas no es una de las claves de `types` (viem añade `EIP712Domain` a la lista que muestra). EIP-712 calcula el hash del mensaje como una instancia del tipo primario, así que viem se niega a adivinar. Los datos tipados en sí pueden estar bien; lo que no existe en ellos es el nombre del struct que se firma.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Declarar los tipos con as const

    Con `as const`, los tipos de viem convierten `primaryType` en una unión de los nombres de tus structs, así que una discrepancia falla al compilar en lugar de al firmar.

    ts
    const types = {
      Mail: [
        { name: "to", type: "address" },
        { name: "contents", type: "string" },
      ],
    } as const; // "as const" lets TypeScript reject a wrong primaryType at compile time
    
    const signature = await walletClient.signTypedData({ account, domain, types, primaryType: "Mail", message });

Errores relacionados

Explorar toda la base de datos de errores de firma