Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add EIP-712 name and version getters #4303

Merged
merged 15 commits into from
Jun 14, 2023
Merged
5 changes: 5 additions & 0 deletions .changeset/little-falcons-build.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---

`EIP712`: Add internal getters for the name and version strings
30 changes: 28 additions & 2 deletions contracts/utils/cryptography/EIP712.sol
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,38 @@ abstract contract EIP712 is IERC5267 {
{
return (
hex"0f", // 01111
_name.toStringWithFallback(_nameFallback),
_version.toStringWithFallback(_versionFallback),
_EIP712Name(),
_EIP712Version(),
block.chainid,
address(this),
bytes32(0),
new uint256[](0)
);
}

/**
* @dev The name parameter for the EIP712 domain.
*
* NOTE: By default this function reads _name which is an immutable value.
* It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
*
* _Available since v5.0._
*/
// solhint-disable-next-line func-name-mixedcase
function _EIP712Name() internal view returns (string memory) {
return _name.toStringWithFallback(_nameFallback);
}

/**
* @dev The version parameter for the EIP712 domain.
*
* NOTE: By default this function reads _version which is an immutable value.
* It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
*
* _Available since v5.0._
*/
// solhint-disable-next-line func-name-mixedcase
function _EIP712Version() internal view returns (string memory) {
return _version.toStringWithFallback(_versionFallback);
}
}
90 changes: 47 additions & 43 deletions scripts/upgradeable/upgradeable.patch
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ index ff596b0c..00000000
-<!-- Make sure that you have reviewed the OpenZeppelin Contracts Contributor Guidelines. -->
-<!-- https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CONTRIBUTING.md -->
diff --git a/README.md b/README.md
index 9fc95518..53130e3c 100644
index aba99171..6656267b 100644
--- a/README.md
+++ b/README.md
@@ -16,17 +16,20 @@
@@ -19,17 +19,20 @@

:building_construction: **Want to scale your decentralized application?** Check out [OpenZeppelin Defender](https://openzeppelin.com/defender) — a secure platform for automating and monitoring your operations.

Expand All @@ -85,7 +85,7 @@ index 9fc95518..53130e3c 100644

### Usage

@@ -35,10 +38,11 @@ Once installed, you can use the contracts in the library by importing them:
@@ -38,10 +41,11 @@ Once installed, you can use the contracts in the library by importing them:
```solidity
pragma solidity ^0.8.19;

Expand All @@ -101,7 +101,7 @@ index 9fc95518..53130e3c 100644
}
```
diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol
index bb70d19f..38513771 100644
index 5b7e1b15..1ca745d6 100644
--- a/contracts/finance/VestingWallet.sol
+++ b/contracts/finance/VestingWallet.sol
@@ -18,6 +18,8 @@ import "../utils/Context.sol";
Expand All @@ -114,7 +114,7 @@ index bb70d19f..38513771 100644
contract VestingWallet is Context {
event EtherReleased(uint256 amount);
diff --git a/contracts/governance/extensions/GovernorVotes.sol b/contracts/governance/extensions/GovernorVotes.sol
index 64431711..885f0e42 100644
index 5d8318f4..ef3cde55 100644
--- a/contracts/governance/extensions/GovernorVotes.sol
+++ b/contracts/governance/extensions/GovernorVotes.sol
@@ -10,6 +10,8 @@ import "../../interfaces/IERC5805.sol";
Expand All @@ -127,15 +127,15 @@ index 64431711..885f0e42 100644
abstract contract GovernorVotes is Governor {
IERC5805 public immutable token;
diff --git a/contracts/package.json b/contracts/package.json
index 55e70b17..ceefb984 100644
index 4d0f576b..822fd471 100644
--- a/contracts/package.json
+++ b/contracts/package.json
@@ -1,5 +1,5 @@
{
- "name": "@openzeppelin/contracts",
+ "name": "@openzeppelin/contracts-upgradeable",
"description": "Secure Smart Contract library for Solidity",
"version": "4.8.2",
"version": "4.9.0",
"files": [
@@ -13,7 +13,7 @@
},
Expand All @@ -147,7 +147,7 @@ index 55e70b17..ceefb984 100644
"keywords": [
"solidity",
diff --git a/contracts/token/ERC20/extensions/ERC20Capped.sol b/contracts/token/ERC20/extensions/ERC20Capped.sol
index 16f830d1..9ef98148 100644
index cda07265..d314148c 100644
--- a/contracts/token/ERC20/extensions/ERC20Capped.sol
+++ b/contracts/token/ERC20/extensions/ERC20Capped.sol
@@ -7,6 +7,8 @@ import "../ERC20.sol";
Expand All @@ -160,20 +160,20 @@ index 16f830d1..9ef98148 100644
abstract contract ERC20Capped is ERC20 {
uint256 private immutable _cap;
diff --git a/contracts/token/ERC20/extensions/ERC20Permit.sol b/contracts/token/ERC20/extensions/ERC20Permit.sol
index a357199b..9dc8e894 100644
index 9379e445..e02f0644 100644
--- a/contracts/token/ERC20/extensions/ERC20Permit.sol
+++ b/contracts/token/ERC20/extensions/ERC20Permit.sol
@@ -18,6 +18,8 @@ import "../../../utils/Counters.sol";
@@ -18,6 +18,8 @@ import "../../../utils/Nonces.sol";
* need to send a transaction, and thus is not required to hold Ether at all.
*
* _Available since v3.4._
+ *
+ * @custom:storage-size 51
*/
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
using Counters for Counters.Counter;
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {
// solhint-disable-next-line var-name-mixedcase
diff --git a/contracts/token/ERC20/extensions/ERC20Wrapper.sol b/contracts/token/ERC20/extensions/ERC20Wrapper.sol
index bfe782e4..7264fe32 100644
index bf2b225c..0e5b3628 100644
--- a/contracts/token/ERC20/extensions/ERC20Wrapper.sol
+++ b/contracts/token/ERC20/extensions/ERC20Wrapper.sol
@@ -14,6 +14,8 @@ import "../utils/SafeERC20.sol";
Expand All @@ -186,7 +186,7 @@ index bfe782e4..7264fe32 100644
abstract contract ERC20Wrapper is ERC20 {
IERC20 private immutable _underlying;
diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol
index 6a4e1cad..55d8eced 100644
index 2628014f..7d5193c8 100644
--- a/contracts/utils/cryptography/EIP712.sol
+++ b/contracts/utils/cryptography/EIP712.sol
@@ -4,7 +4,6 @@
Expand Down Expand Up @@ -268,7 +268,7 @@ index 6a4e1cad..55d8eced 100644
}

/**
@@ -129,14 +114,80 @@ abstract contract EIP712 is IERC5267 {
@@ -128,6 +113,10 @@ abstract contract EIP712 is IERC5267 {
uint256[] memory extensions
)
{
Expand All @@ -278,34 +278,34 @@ index 6a4e1cad..55d8eced 100644
+
return (
hex"0f", // 01111
- _name.toStringWithFallback(_nameFallback),
- _version.toStringWithFallback(_versionFallback),
+ _EIP712Name(),
+ _EIP712Version(),
block.chainid,
address(this),
bytes32(0),
new uint256[](0)
);
}
+
+ /**
+ * @dev The name parameter for the EIP712 domain.
+ *
_EIP712Name(),
@@ -142,26 +131,62 @@ abstract contract EIP712 is IERC5267 {
/**
* @dev The name parameter for the EIP712 domain.
*
- * NOTE: By default this function reads _name which is an immutable value.
- * It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
- *
- * _Available since v5.0._
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
+ * are a concern.
+ */
+ function _EIP712Name() internal virtual view returns (string memory) {
*/
- // solhint-disable-next-line func-name-mixedcase
- function _EIP712Name() internal view returns (string memory) {
- return _name.toStringWithFallback(_nameFallback);
+ function _EIP712Name() internal view virtual returns (string memory) {
+ return _name;
+ }
+
+ /**
+ * @dev The version parameter for the EIP712 domain.
+ *
}

/**
* @dev The version parameter for the EIP712 domain.
*
- * NOTE: By default this function reads _version which is an immutable value.
- * It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
+ * are a concern.
+ */
+ function _EIP712Version() internal virtual view returns (string memory) {
+ function _EIP712Version() internal view virtual returns (string memory) {
+ return _version;
+ }
+
Expand All @@ -332,9 +332,13 @@ index 6a4e1cad..55d8eced 100644
+
+ /**
+ * @dev The hash of the version parameter for the EIP712 domain.
+ *
*
- * _Available since v5.0._
+ * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.
+ */
*/
- // solhint-disable-next-line func-name-mixedcase
- function _EIP712Version() internal view returns (string memory) {
- return _version.toStringWithFallback(_versionFallback);
+ function _EIP712VersionHash() internal view returns (bytes32) {
+ string memory version = _EIP712Version();
+ if (bytes(version).length > 0) {
Expand All @@ -349,13 +353,13 @@ index 6a4e1cad..55d8eced 100644
+ return keccak256("");
+ }
+ }
+ }
}
}
diff --git a/package.json b/package.json
index 8458dd61..b4672240 100644
index c070915f..9a513cac 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
@@ -33,7 +33,7 @@
},
"repository": {
"type": "git",
Expand All @@ -365,7 +369,7 @@ index 8458dd61..b4672240 100644
"keywords": [
"solidity",
diff --git a/test/utils/cryptography/EIP712.test.js b/test/utils/cryptography/EIP712.test.js
index 54a4e772..ba4602ed 100644
index 7ea535b7..32e3a370 100644
--- a/test/utils/cryptography/EIP712.test.js
+++ b/test/utils/cryptography/EIP712.test.js
@@ -47,26 +47,6 @@ contract('EIP712', function (accounts) {
Expand Down
8 changes: 8 additions & 0 deletions test/utils/cryptography/EIP712.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ contract('EIP712', function (accounts) {

await this.eip712.verify(signature, wallet.getAddressString(), message.to, message.contents);
});

it('name', async function () {
expect(await this.eip712.$_EIP712Name()).to.be.equal(name);
});

it('version', async function () {
expect(await this.eip712.$_EIP712Version()).to.be.equal(version);
});
});
}
});