Skip to content

Commit d26bd92

Browse files
committed
add IERC5267, use token name for EIP712 domain
1 parent 8605661 commit d26bd92

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

packages/ethereum-contracts/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ All notable changes to the ethereum-contracts will be documented in this file.
33

44
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
55

6+
## [unreleased]
7+
8+
### Added
9+
- `SuperToken` now implements [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) (permit extension for EIP-20 signed approvals)
10+
611
## [v1.12.1]
712

813
### Added

packages/ethereum-contracts/contracts/interfaces/superfluid/ISuperToken.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pragma solidity >= 0.8.11;
44
import { ISuperfluidToken } from "./ISuperfluidToken.sol";
55
import { IERC20, IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
66
import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
7+
import { IERC5267 } from "@openzeppelin/contracts/interfaces/IERC5267.sol";
78
import { IERC777 } from "@openzeppelin/contracts/token/ERC777/IERC777.sol";
89
import { IPoolAdminNFT } from "../agreements/gdav1/IPoolAdminNFT.sol";
910
import { IPoolMemberNFT } from "../agreements/gdav1/IPoolMemberNFT.sol";
@@ -12,7 +13,7 @@ import { IPoolMemberNFT } from "../agreements/gdav1/IPoolMemberNFT.sol";
1213
* @title Super token (Superfluid Token + ERC20 + ERC777) interface
1314
* @author Superfluid
1415
*/
15-
interface ISuperToken is ISuperfluidToken, IERC20Metadata, IERC777, IERC20Permit {
16+
interface ISuperToken is ISuperfluidToken, IERC20Metadata, IERC777, IERC20Permit, IERC5267 {
1617

1718
/**************************************************************************
1819
* Errors

packages/ethereum-contracts/contracts/superfluid/SuperToken.sol

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ contract SuperToken is
5252
// EIP-712 permit typehash
5353
bytes32 constant private _PERMIT_TYPEHASH =
5454
keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
55+
bytes32 constant private _EIP712_DOMAIN_TYPEHASH =
56+
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
57+
58+
string constant private _EIP712_VERSION = "1";
5559

5660
// solhint-disable-next-line var-name-mixedcase
5761
IConstantOutflowNFT immutable public CONSTANT_OUTFLOW_NFT;
@@ -188,14 +192,14 @@ contract SuperToken is
188192
UUPSProxiable._updateCodeAddress(newAddress);
189193
}
190194

191-
function changeAdmin(address newAdmin) external override onlyAdmin {
195+
function changeAdmin(address newAdmin) external virtual override onlyAdmin {
192196
address oldAdmin = _getAdmin();
193197
_setAdmin(newAdmin);
194198

195199
emit AdminChanged(oldAdmin, newAdmin);
196200
}
197201

198-
function getAdmin() external view override returns (address) {
202+
function getAdmin() external view virtual override returns (address) {
199203
return _getAdmin();
200204
}
201205

@@ -243,7 +247,7 @@ contract SuperToken is
243247
uint8 v,
244248
bytes32 r,
245249
bytes32 s
246-
) public override {
250+
) public virtual override {
247251
if (block.timestamp > deadline) revert SUPER_TOKEN_PERMIT_EXPIRED_SIGNATURE(deadline);
248252

249253
bytes32 structHash = keccak256(
@@ -278,25 +282,53 @@ contract SuperToken is
278282

279283
/// @dev EIP-712 Domain Separator
280284
// solhint-disable func-name-mixedcase
281-
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
285+
function DOMAIN_SEPARATOR() public view virtual override returns (bytes32) {
282286
// TODO: can be optimized: provide immutable parts from constants
283287
return keccak256(
284288
abi.encode(
285-
// TYPE_HASH
286-
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
287-
keccak256("SuperToken"), // name
288-
keccak256("1"), // version
289+
_EIP712_DOMAIN_TYPEHASH,
290+
keccak256(bytes(_name)),
291+
keccak256(bytes(_EIP712_VERSION)),
289292
block.chainid,
290293
address(this)
291294
)
292295
);
293296
}
294297

295298
/// @dev EIP-2612 Nonces
296-
function nonces(address owner) public view virtual returns (uint256) {
299+
function nonces(address owner) public view virtual override returns (uint256) {
297300
return _nonces[owner];
298301
}
299302

303+
/// @dev EIP-5267: Retrieval of EIP-712 domain
304+
function eip712Domain()
305+
public
306+
view
307+
virtual
308+
override
309+
returns
310+
(
311+
bytes1 fields,
312+
/* commented out to avoid warning of name clash with name() */
313+
string memory /*name*/,
314+
string memory version,
315+
uint256 chainId,
316+
address verifyingContract,
317+
bytes32 salt,
318+
uint256[] memory extensions
319+
)
320+
{
321+
return (
322+
hex"0f", // 01111 - field "salt" not present
323+
_name,
324+
_EIP712_VERSION,
325+
block.chainid,
326+
address(this), // verifyingContract
327+
bytes32(0), // salt
328+
new uint256[](0) // extensions
329+
);
330+
}
331+
300332
/**************************************************************************
301333
* (private) Token Logics
302334
*************************************************************************/

0 commit comments

Comments
 (0)