Message d’erreur
ambiguous primary types or unused types: "EIP712Domain", "Mail"
Également affiché sous la forme
- ambiguous primary types or unused types
Les noms listés sont vos types non référencés. `err.message` ajoute la valeur complète de `types` et la version d’ethers ; `err.code` vaut `INVALID_ARGUMENT`.
ethers v6 (JavaScript) — TypedDataEncoder used by signTypedData / verifyTypedData
Ce que cela signifie
ethers déduit le type principal des données typées EIP-712 : c’est l’unique type qu’aucun autre type ne référence. Dans votre objet `types`, plusieurs types ne sont pas référencés : ethers ne peut donc pas savoir lequel est signé, et en pratique le type en trop est presque toujours `EIP712Domain`. ethers construit lui-même le type du domaine à partir de l’argument `domain` et ne doit pas le recevoir dans `types`, alors que le format JSON de `eth_signTypedData_v4` (MetaMask, WalletConnect) l’inclut.
Pourquoi cela se produit
EIP712Domain laissé dans types
fréquenteDes données typées copiées depuis une requête de portefeuille, un back-end qui produit des charges utiles `eth_signTypedData_v4` ou une fixture de test incluent `EIP712Domain`. ethers le traite comme un second type racine.
Un type que rien ne référence
occasionnelleDes définitions de structures restantes (par exemple d’une ancienne version du message) sont elles aussi des racines et rendent le type principal ambigu.
Deux structures indépendantes dans un même objet
occasionnelleLes types de messages différents (Order et Cancel) réunis dans un seul objet `types`. Ne passez que les types du message que vous signez.
Comment corriger l’erreur
- 1.
Retirer EIP712Domain avant d’appeler ethers
Écartez-le par déstructuration ; la signature est identique à celle qu’un portefeuille produit pour la charge utile v4, car le type du domaine est dérivé des mêmes champs.
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.
Vérifier le type principal déduit
`TypedDataEncoder.from(types).primaryType` lève la même erreur ou renvoie le type qu’ethers va hacher : une vérification rapide à placer dans les tests.
js import { TypedDataEncoder } from "ethers"; // Inspect what ethers considers the primary type before signing. console.log(TypedDataEncoder.from(types).primaryType);