-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #128 from 1inch/feature/SC-1077-Extend-safePermit
[SC-1077] Add support for ERC-7597 permit
- Loading branch information
Showing
6 changed files
with
149 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// SPDX-License-Identifier: MIT | ||
|
||
pragma solidity ^0.8.0; | ||
|
||
interface IERC7597Permit { | ||
function permit( | ||
address owner, | ||
address spender, | ||
uint256 value, | ||
uint256 deadline, | ||
bytes memory signature | ||
) external; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// SPDX-License-Identifier: MIT | ||
|
||
pragma solidity ^0.8.0; | ||
|
||
import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; | ||
import { ERC20, ERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; | ||
|
||
contract USDCLikePermitMock is ERC20Permit { | ||
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") | ||
bytes32 | ||
public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; | ||
|
||
error InvalidSignature(); | ||
error PermitExpired(); | ||
|
||
constructor( | ||
string memory name, | ||
string memory symbol, | ||
address initialAccount, | ||
uint256 initialBalance | ||
) payable ERC20(name, symbol) ERC20Permit(name){ | ||
_mint(initialAccount, initialBalance); | ||
} | ||
|
||
/** | ||
* @notice Update allowance with a signed permit | ||
* @dev EOA wallet signatures should be packed in the order of r, s, v. | ||
* @param owner Token owner's address (Authorizer) | ||
* @param spender Spender's address | ||
* @param value Amount of allowance | ||
* @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration | ||
* @param signature Signature bytes signed by an EOA wallet or a contract wallet | ||
*/ | ||
function permit( | ||
address owner, | ||
address spender, | ||
uint256 value, | ||
uint256 deadline, | ||
bytes memory signature | ||
) external { | ||
if (deadline != type(uint256).max && deadline < block.timestamp) { | ||
revert PermitExpired(); | ||
} | ||
|
||
bytes32 typedDataHash = _hashTypedDataV4( | ||
keccak256( | ||
abi.encode( | ||
PERMIT_TYPEHASH, | ||
owner, | ||
spender, | ||
value, | ||
_useNonce(owner), | ||
deadline | ||
) | ||
) | ||
); | ||
if (!_isValidERC1271SignatureNow(owner, typedDataHash, signature)) { | ||
revert InvalidSignature(); | ||
} | ||
_approve(owner, spender, value); | ||
} | ||
|
||
function _isValidERC1271SignatureNow( | ||
address signer, | ||
bytes32 digest, | ||
bytes memory signature | ||
) internal view returns (bool) { | ||
(bool success, bytes memory result) = signer.staticcall( | ||
abi.encodeWithSelector( | ||
IERC1271.isValidSignature.selector, | ||
digest, | ||
signature | ||
) | ||
); | ||
return (success && | ||
result.length >= 32 && | ||
abi.decode(result, (bytes32)) == | ||
bytes32(IERC1271.isValidSignature.selector)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters