Add EIP-712 name and version getters (#4303)
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: ernestognw <ernestognw@gmail.com>
This commit is contained in:
5
.changeset/little-falcons-build.md
Normal file
5
.changeset/little-falcons-build.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'openzeppelin-solidity': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
`EIP712`: Add internal getters for the name and version strings
|
||||||
@ -130,12 +130,38 @@ abstract contract EIP712 is IERC5267 {
|
|||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
hex"0f", // 01111
|
hex"0f", // 01111
|
||||||
_name.toStringWithFallback(_nameFallback),
|
_EIP712Name(),
|
||||||
_version.toStringWithFallback(_versionFallback),
|
_EIP712Version(),
|
||||||
block.chainid,
|
block.chainid,
|
||||||
address(this),
|
address(this),
|
||||||
bytes32(0),
|
bytes32(0),
|
||||||
new uint256[](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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,10 +59,10 @@ index ff596b0c..00000000
|
|||||||
-<!-- Make sure that you have reviewed the OpenZeppelin Contracts Contributor Guidelines. -->
|
-<!-- Make sure that you have reviewed the OpenZeppelin Contracts Contributor Guidelines. -->
|
||||||
-<!-- https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CONTRIBUTING.md -->
|
-<!-- https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CONTRIBUTING.md -->
|
||||||
diff --git a/README.md b/README.md
|
diff --git a/README.md b/README.md
|
||||||
index 9fc95518..53130e3c 100644
|
index aba99171..6656267b 100644
|
||||||
--- a/README.md
|
--- a/README.md
|
||||||
+++ b/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.
|
: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.
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ index 9fc95518..53130e3c 100644
|
|||||||
|
|
||||||
### Usage
|
### 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
|
```solidity
|
||||||
pragma solidity ^0.8.19;
|
pragma solidity ^0.8.19;
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ index 9fc95518..53130e3c 100644
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol
|
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
|
--- a/contracts/finance/VestingWallet.sol
|
||||||
+++ b/contracts/finance/VestingWallet.sol
|
+++ b/contracts/finance/VestingWallet.sol
|
||||||
@@ -18,6 +18,8 @@ import "../utils/Context.sol";
|
@@ -18,6 +18,8 @@ import "../utils/Context.sol";
|
||||||
@ -114,7 +114,7 @@ index bb70d19f..38513771 100644
|
|||||||
contract VestingWallet is Context {
|
contract VestingWallet is Context {
|
||||||
event EtherReleased(uint256 amount);
|
event EtherReleased(uint256 amount);
|
||||||
diff --git a/contracts/governance/extensions/GovernorVotes.sol b/contracts/governance/extensions/GovernorVotes.sol
|
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
|
--- a/contracts/governance/extensions/GovernorVotes.sol
|
||||||
+++ b/contracts/governance/extensions/GovernorVotes.sol
|
+++ b/contracts/governance/extensions/GovernorVotes.sol
|
||||||
@@ -10,6 +10,8 @@ import "../../interfaces/IERC5805.sol";
|
@@ -10,6 +10,8 @@ import "../../interfaces/IERC5805.sol";
|
||||||
@ -127,7 +127,7 @@ index 64431711..885f0e42 100644
|
|||||||
abstract contract GovernorVotes is Governor {
|
abstract contract GovernorVotes is Governor {
|
||||||
IERC5805 public immutable token;
|
IERC5805 public immutable token;
|
||||||
diff --git a/contracts/package.json b/contracts/package.json
|
diff --git a/contracts/package.json b/contracts/package.json
|
||||||
index 55e70b17..ceefb984 100644
|
index 4d0f576b..822fd471 100644
|
||||||
--- a/contracts/package.json
|
--- a/contracts/package.json
|
||||||
+++ b/contracts/package.json
|
+++ b/contracts/package.json
|
||||||
@@ -1,5 +1,5 @@
|
@@ -1,5 +1,5 @@
|
||||||
@ -135,7 +135,7 @@ index 55e70b17..ceefb984 100644
|
|||||||
- "name": "@openzeppelin/contracts",
|
- "name": "@openzeppelin/contracts",
|
||||||
+ "name": "@openzeppelin/contracts-upgradeable",
|
+ "name": "@openzeppelin/contracts-upgradeable",
|
||||||
"description": "Secure Smart Contract library for Solidity",
|
"description": "Secure Smart Contract library for Solidity",
|
||||||
"version": "4.8.2",
|
"version": "4.9.0",
|
||||||
"files": [
|
"files": [
|
||||||
@@ -13,7 +13,7 @@
|
@@ -13,7 +13,7 @@
|
||||||
},
|
},
|
||||||
@ -147,7 +147,7 @@ index 55e70b17..ceefb984 100644
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"solidity",
|
"solidity",
|
||||||
diff --git a/contracts/token/ERC20/extensions/ERC20Capped.sol b/contracts/token/ERC20/extensions/ERC20Capped.sol
|
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
|
--- a/contracts/token/ERC20/extensions/ERC20Capped.sol
|
||||||
+++ b/contracts/token/ERC20/extensions/ERC20Capped.sol
|
+++ b/contracts/token/ERC20/extensions/ERC20Capped.sol
|
||||||
@@ -7,6 +7,8 @@ import "../ERC20.sol";
|
@@ -7,6 +7,8 @@ import "../ERC20.sol";
|
||||||
@ -160,20 +160,20 @@ index 16f830d1..9ef98148 100644
|
|||||||
abstract contract ERC20Capped is ERC20 {
|
abstract contract ERC20Capped is ERC20 {
|
||||||
uint256 private immutable _cap;
|
uint256 private immutable _cap;
|
||||||
diff --git a/contracts/token/ERC20/extensions/ERC20Permit.sol b/contracts/token/ERC20/extensions/ERC20Permit.sol
|
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
|
--- a/contracts/token/ERC20/extensions/ERC20Permit.sol
|
||||||
+++ b/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.
|
* need to send a transaction, and thus is not required to hold Ether at all.
|
||||||
*
|
*
|
||||||
* _Available since v3.4._
|
* _Available since v3.4._
|
||||||
+ *
|
+ *
|
||||||
+ * @custom:storage-size 51
|
+ * @custom:storage-size 51
|
||||||
*/
|
*/
|
||||||
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
|
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {
|
||||||
using Counters for Counters.Counter;
|
// solhint-disable-next-line var-name-mixedcase
|
||||||
diff --git a/contracts/token/ERC20/extensions/ERC20Wrapper.sol b/contracts/token/ERC20/extensions/ERC20Wrapper.sol
|
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
|
--- a/contracts/token/ERC20/extensions/ERC20Wrapper.sol
|
||||||
+++ b/contracts/token/ERC20/extensions/ERC20Wrapper.sol
|
+++ b/contracts/token/ERC20/extensions/ERC20Wrapper.sol
|
||||||
@@ -14,6 +14,8 @@ import "../utils/SafeERC20.sol";
|
@@ -14,6 +14,8 @@ import "../utils/SafeERC20.sol";
|
||||||
@ -186,7 +186,7 @@ index bfe782e4..7264fe32 100644
|
|||||||
abstract contract ERC20Wrapper is ERC20 {
|
abstract contract ERC20Wrapper is ERC20 {
|
||||||
IERC20 private immutable _underlying;
|
IERC20 private immutable _underlying;
|
||||||
diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol
|
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
|
--- a/contracts/utils/cryptography/EIP712.sol
|
||||||
+++ b/contracts/utils/cryptography/EIP712.sol
|
+++ b/contracts/utils/cryptography/EIP712.sol
|
||||||
@@ -4,7 +4,6 @@
|
@@ -4,7 +4,6 @@
|
||||||
@ -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
|
uint256[] memory extensions
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -278,34 +278,34 @@ index 6a4e1cad..55d8eced 100644
|
|||||||
+
|
+
|
||||||
return (
|
return (
|
||||||
hex"0f", // 01111
|
hex"0f", // 01111
|
||||||
- _name.toStringWithFallback(_nameFallback),
|
_EIP712Name(),
|
||||||
- _version.toStringWithFallback(_versionFallback),
|
@@ -142,26 +131,62 @@ abstract contract EIP712 is IERC5267 {
|
||||||
+ _EIP712Name(),
|
/**
|
||||||
+ _EIP712Version(),
|
* @dev The name parameter for the EIP712 domain.
|
||||||
block.chainid,
|
*
|
||||||
address(this),
|
- * NOTE: By default this function reads _name which is an immutable value.
|
||||||
bytes32(0),
|
- * It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
|
||||||
new uint256[](0)
|
- *
|
||||||
);
|
- * _Available since v5.0._
|
||||||
}
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * @dev The name parameter for the EIP712 domain.
|
|
||||||
+ *
|
|
||||||
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
|
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
|
||||||
+ * are a concern.
|
+ * 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;
|
+ 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
|
+ * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
|
||||||
+ * are a concern.
|
+ * are a concern.
|
||||||
+ */
|
+ */
|
||||||
+ function _EIP712Version() internal virtual view returns (string memory) {
|
+ function _EIP712Version() internal view virtual returns (string memory) {
|
||||||
+ return _version;
|
+ return _version;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@ -332,9 +332,13 @@ index 6a4e1cad..55d8eced 100644
|
|||||||
+
|
+
|
||||||
+ /**
|
+ /**
|
||||||
+ * @dev The hash of the version parameter for the EIP712 domain.
|
+ * @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.
|
+ * 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) {
|
+ function _EIP712VersionHash() internal view returns (bytes32) {
|
||||||
+ string memory version = _EIP712Version();
|
+ string memory version = _EIP712Version();
|
||||||
+ if (bytes(version).length > 0) {
|
+ if (bytes(version).length > 0) {
|
||||||
@ -349,13 +353,13 @@ index 6a4e1cad..55d8eced 100644
|
|||||||
+ return keccak256("");
|
+ return keccak256("");
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ }
|
}
|
||||||
}
|
}
|
||||||
diff --git a/package.json b/package.json
|
diff --git a/package.json b/package.json
|
||||||
index 8458dd61..b4672240 100644
|
index c070915f..9a513cac 100644
|
||||||
--- a/package.json
|
--- a/package.json
|
||||||
+++ b/package.json
|
+++ b/package.json
|
||||||
@@ -36,7 +36,7 @@
|
@@ -33,7 +33,7 @@
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -365,7 +369,7 @@ index 8458dd61..b4672240 100644
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"solidity",
|
"solidity",
|
||||||
diff --git a/test/utils/cryptography/EIP712.test.js b/test/utils/cryptography/EIP712.test.js
|
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
|
--- a/test/utils/cryptography/EIP712.test.js
|
||||||
+++ b/test/utils/cryptography/EIP712.test.js
|
+++ b/test/utils/cryptography/EIP712.test.js
|
||||||
@@ -47,26 +47,6 @@ contract('EIP712', function (accounts) {
|
@@ -47,26 +47,6 @@ contract('EIP712', function (accounts) {
|
||||||
|
|||||||
@ -98,6 +98,14 @@ contract('EIP712', function (accounts) {
|
|||||||
|
|
||||||
await this.eip712.verify(signature, wallet.getAddressString(), message.to, message.contents);
|
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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user