Modify EIP712 implementation to use constants for _HASHED_NAME and _HASHED_VERSION#
Informational
Done
Recommended changes were made in a new file.
The draft-EIP712Upgradeable.sol implementation being used from OpenZeppelin uses bytes32 private _HASHED_NAME and bytes32 private _HASHED_VERSION state variables which is gas inefficient because these could instead be constants.
Reading a state variable costs 2100 gas. Reading a constant costs nothing since the compiler replaces constants with literal values during compilation.
The _hashTypedDataV4 function from draft-EIP712Upgradeable.sol reads the state variables _HASHED_NAME and _HASHED_VERSION.
_hashTypedDataV4 is used by the matchOrders function in UniverseMarketplaceCore to verify signatures.
Recommendation#
I recommend copying the draft-EIP712Upgradeable.sol implementation to the Universe-Marketplace repo and making the following changes:
Change this in draft-EIP712Upgradeable.sol:
bytes32 private constant _HASHED_NAME = keccak256("Exchange");
bytes32 private constant _HASHED_VERSION = keccak256("2");
And delete these functions in draft-EIP712Upgradeable.sol because they aren't needed:
function __EIP712_init(string memory name, string memory version) internal initializer {
__EIP712_init_unchained(name, version);
}
function __EIP712_init_unchained(string memory name, string memory version) internal initializer {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
}
And delete any function calls to the above two functions.