tornado-contracts/contracts/Classic/libraries/SafeERC20.sol
2024-03-29 21:52:45 +00:00

40 lines
1.6 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { IERC20 } from "../interfaces/IERC20.sol";
library SafeERC20 {
function safeTransfer(IERC20 token, address to, uint256 value) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(token.transfer.selector, to, value));
// Return native revert data from token
if (!success) {
assembly {
revert(add(32, data), mload(data))
}
}
require(data.length == 0 || abi.decode(data, (bool)), 'SafeERC20: safeTransfer failed');
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
// Return native revert data from token
if (!success) {
assembly {
revert(add(32, data), mload(data))
}
}
require(data.length == 0 || abi.decode(data, (bool)), 'SafeERC20: safeTransferFrom failed');
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(token.approve.selector, spender, value));
// Return native revert data from token
if (!success) {
assembly {
revert(add(32, data), mload(data))
}
}
require(data.length == 0 || abi.decode(data, (bool)), 'SafeERC20: safeApprove failed');
}
}