Message d’erreur
Invalid primary type `Email` must be one of `["EIP712Domain","Mail"]`.
Les noms entre accents graves sont votre `primaryType` et les types disponibles. viem 2.57 lève cette erreur avec `err.name` égal à « BaseError » ; `err.shortMessage` est le texte ci-dessus et `err.message` y ajoute une indication, un lien vers la documentation (« typeddatainvalidprimarytypeerror ») et la version de viem.
viem (TypeScript) — hashTypedData / signTypedData / verifyTypedData / recoverTypedDataAddress
Ce que cela signifie
Le `primaryType` que vous avez passé n’est pas une clé de `types` (viem ajoute `EIP712Domain` à la liste qu’il affiche). EIP-712 hache le message en tant qu’instance du type principal : viem refuse donc de deviner. Les données typées elles-mêmes peuvent être correctes ; c’est le nom de la structure signée qui n’y existe pas.
Pourquoi cela se produit
La structure a été renommée d’un seul côté
fréquenteLe contrat ou le back-end a renommé `Mail` en `Email` (ou `Order` en `OrderV2`), et le front-end envoie toujours l’ancien nom, ou l’inverse. Comme le nom du type fait partie du condensat du type, les deux côtés doivent de toute façon changer ensemble.
primaryType omis ou non défini
occasionnelleLes charges utiles construites dynamiquement (par exemple à partir de JSON) dans lesquelles `primaryType` n’a jamais été défini produisent `Invalid primary type \`undefined\``.
Casse différente
occasionnelle`mail` n’est pas `Mail` : les noms de types sont sensibles à la casse dans EIP-712.
Comment corriger l’erreur
- 1.
Déclarer les types avec as const
Avec `as const`, les types de viem font de `primaryType` une union des noms de vos structures : une incohérence échoue donc à la compilation et non au moment de la signature.
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 });