Fehlermeldung
ambiguous primary types or unused types: "EIP712Domain", "Mail"
Auch ausgegeben als
- ambiguous primary types or unused types
Die aufgeführten Namen sind deine nicht referenzierten Typen. `err.message` ergänzt den vollständigen Wert von `types` und die ethers-Version; `err.code` ist `INVALID_ARGUMENT`.
ethers v6 (JavaScript) — TypedDataEncoder used by signTypedData / verifyTypedData
Was der Fehler bedeutet
ethers ermittelt den Primärtyp von Typed Data nach EIP-712 als den einzigen Typ, auf den kein anderer Typ verweist. In deinem `types`-Objekt werden mehrere Typen nirgends referenziert, daher kann ethers nicht erkennen, welcher davon signiert wird – und in der Praxis ist der überzählige fast immer `EIP712Domain`. ethers baut den Domain-Typ selbst aus dem Argument `domain` und darf ihn nicht in `types` erhalten, während das JSON-Format von `eth_signTypedData_v4` (MetaMask, WalletConnect) ihn enthält.
Warum der Fehler auftritt
EIP712Domain steht noch in types
häufigTyped Data, die aus einer Wallet-Anfrage, aus einem Backend, das Payloads für `eth_signTypedData_v4` erzeugt, oder aus einem Test-Fixture kopiert wurden, enthalten `EIP712Domain`. ethers behandelt den Typ als zweiten Wurzeltyp.
Ein Typ, auf den nichts verweist
gelegentlichÜbrig gebliebene Struct-Definitionen (zum Beispiel aus einer älteren Version der Nachricht) sind ebenfalls Wurzeln und machen den Primärtyp mehrdeutig.
Zwei unabhängige Structs in einem Objekt
gelegentlichTypen für verschiedene Nachrichten (Order und Cancel) in einem einzigen `types`-Objekt zusammengefasst. Übergib nur die Typen der Nachricht, die du signierst.
So behebst du den Fehler
- 1.
EIP712Domain vor dem Aufruf von ethers entfernen
Entferne den Typ per Destrukturierung; die Signatur ist identisch mit der, die eine Wallet für die v4-Payload erzeugt, weil der Domain-Typ aus denselben Feldern abgeleitet wird.
js const { EIP712Domain, ...types } = typedData.types; // ethers derives the domain type itself const signature = await signer.signTypedData(typedData.domain, types, typedData.message); const signer2 = verifyTypedData(typedData.domain, types, typedData.message, signature); - 2.
Ermittelten Primärtyp prüfen
`TypedDataEncoder.from(types).primaryType` wirft denselben Fehler oder gibt den Typ zurück, den ethers hashen wird – eine schnelle Prüfung für Tests.
js import { TypedDataEncoder } from "ethers"; // Inspect what ethers considers the primary type before signing. console.log(TypedDataEncoder.from(types).primaryType);