Fehlermeldung
Invalid primary type `Email` must be one of `["EIP712Domain","Mail"]`.
Die Namen in Backticks sind dein `primaryType` und die verfügbaren Typen. viem 2.57 wirft den Fehler mit `err.name` „BaseError“; `err.shortMessage` ist der Text oben, und `err.message` ergänzt einen Hinweis, einen Link zur Dokumentation („typeddatainvalidprimarytypeerror“) und die viem-Version.
viem (TypeScript) — hashTypedData / signTypedData / verifyTypedData / recoverTypedDataAddress
Was der Fehler bedeutet
Der übergebene `primaryType` ist kein Schlüssel im Objekt `types` (viem ergänzt `EIP712Domain` in der angezeigten Liste). EIP-712 hasht die Nachricht als Instanz des Primärtyps, deshalb weigert sich viem zu raten. Die Typed Data selbst können in Ordnung sein; der Name des Structs, das signiert wird, kommt darin nicht vor.
Warum der Fehler auftritt
Das Struct wurde auf einer Seite umbenannt
häufigDer Contract oder das Backend hat `Mail` in `Email` umbenannt (oder `Order` in `OrderV2`), und das Frontend sendet noch den alten Namen – oder umgekehrt. Da der Typname Teil des Typ-Hashes ist, müssen sich ohnehin beide Seiten gemeinsam ändern.
primaryType fehlt oder ist undefined
gelegentlichDynamisch gebaute Payloads (zum Beispiel aus JSON), in denen `primaryType` nie gesetzt wurde, erzeugen `Invalid primary type \`undefined\``.
Abweichende Groß- und Kleinschreibung
gelegentlich`mail` gegenüber `Mail`: Typnamen unterscheiden in EIP-712 zwischen Groß- und Kleinschreibung.
So behebst du den Fehler
- 1.
Typen als const deklarieren
Mit `as const` machen die Typen von viem aus `primaryType` einen Union-Typ deiner Struct-Namen, sodass eine Abweichung schon beim Kompilieren scheitert statt erst beim Signieren.
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 });