Summary
Multiple inconsistencies exist in EIP712Base.sol's implementation compared to the EIP-712 standard, affecting domain separator construction and type handling.
Technical Details
Current implementation has several deviations from the EIP-712 standard:
Domain Structure Mismatch:
struct EIP712Domain {
string name;
string version;
address verifyingContract;
bytes32 salt;
}
struct EIP712Domain {
string name;
string version;
uint256 chainId;
address verifyingContract;
bytes32 salt;
}
TypeHash Construction:
bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
bytes(
"EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
)
);
bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
bytes(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
)
);
Domain Separator Encoding:
domainSeperator = keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
keccak256(bytes(version)),
address(this),
bytes32(getChainId())
)
);
domainSeperator = keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
keccak256(bytes(version)),
getChainId(),
address(this)
)
);
Impact
Does not comply with EIP-712
Recommendations
Correct Domain Structure:
struct EIP712Domain {
string name;
string version;
uint256 chainId;
address verifyingContract;
}
Fix Type Hash:
bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
bytes(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
)
);
Correct Separator Construction:
function _setDomainSeparator(string memory name, string memory version) internal {
domainSeparator = keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
keccak256(bytes(version)),
getChainId(),
address(this)
)
);
}