735546619e
Signed-off-by: T-Hax <>
64 lines
2.0 KiB
Solidity
64 lines
2.0 KiB
Solidity
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
pragma solidity >=0.5.0;
|
|
|
|
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
|
|
import '@openzeppelin/contracts/drafts/IERC20Permit.sol';
|
|
|
|
import '../interfaces/ISelfPermit.sol';
|
|
import '../interfaces/external/IERC20PermitAllowed.sol';
|
|
|
|
/// @title Self Permit
|
|
/// @notice Functionality to call permit on any EIP-2612-compliant token for use in the route
|
|
/// @dev These functions are expected to be embedded in multicalls to allow EOAs to approve a contract and call a function
|
|
/// that requires an approval in a single transaction.
|
|
abstract contract SelfPermit is ISelfPermit {
|
|
/// @inheritdoc ISelfPermit
|
|
function selfPermit(
|
|
address token,
|
|
uint256 value,
|
|
uint256 deadline,
|
|
uint8 v,
|
|
bytes32 r,
|
|
bytes32 s
|
|
) public payable override {
|
|
IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s);
|
|
}
|
|
|
|
/// @inheritdoc ISelfPermit
|
|
function selfPermitIfNecessary(
|
|
address token,
|
|
uint256 value,
|
|
uint256 deadline,
|
|
uint8 v,
|
|
bytes32 r,
|
|
bytes32 s
|
|
) external payable override {
|
|
if (IERC20(token).allowance(msg.sender, address(this)) < value) selfPermit(token, value, deadline, v, r, s);
|
|
}
|
|
|
|
/// @inheritdoc ISelfPermit
|
|
function selfPermitAllowed(
|
|
address token,
|
|
uint256 nonce,
|
|
uint256 expiry,
|
|
uint8 v,
|
|
bytes32 r,
|
|
bytes32 s
|
|
) public payable override {
|
|
IERC20PermitAllowed(token).permit(msg.sender, address(this), nonce, expiry, true, v, r, s);
|
|
}
|
|
|
|
/// @inheritdoc ISelfPermit
|
|
function selfPermitAllowedIfNecessary(
|
|
address token,
|
|
uint256 nonce,
|
|
uint256 expiry,
|
|
uint8 v,
|
|
bytes32 r,
|
|
bytes32 s
|
|
) external payable override {
|
|
if (IERC20(token).allowance(msg.sender, address(this)) < type(uint256).max)
|
|
selfPermitAllowed(token, nonce, expiry, v, r, s);
|
|
}
|
|
}
|