Project

One World
NFTDeFi
15,000 USDC
View results
Submission Details
Severity: medium
Invalid

EIP-712 Domain Separator Specification Inconsistencies

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:

// Current Implementation
struct EIP712Domain {
string name;
string version;
address verifyingContract;
bytes32 salt; // Misused for chainId
}
// EIP-712 Standard
struct EIP712Domain {
string name;
string version;
uint256 chainId; // Missing
address verifyingContract;
bytes32 salt; // Should be optional
}

TypeHash Construction:

// Current Implementation
bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
bytes(
"EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
)
);
// Should be according to EIP-712
bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
bytes(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
)
);

Domain Separator Encoding:

// Current Implementation
domainSeperator = keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
keccak256(bytes(version)),
address(this),
bytes32(getChainId()) // Incorrect type casting
)
);
// Should be
domainSeperator = keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
keccak256(bytes(version)),
getChainId(), // As uint256
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)"
)
);
  1. 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)
)
);
}
Updates

Lead Judging Commences

0xbrivan2 Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Known issue

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.