github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/test/contracts/uniswap/v2/TransferHelper.sol (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  pragma solidity >=0.6.0;
     4  
     5  // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
     6  library TransferHelper {
     7      function safeApprove(
     8          address token,
     9          address to,
    10          uint256 value
    11      ) internal {
    12          // bytes4(keccak256(bytes('approve(address,uint256)')));
    13          (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    14          require(
    15              success && (data.length == 0 || abi.decode(data, (bool))),
    16              'TransferHelper::safeApprove: approve failed'
    17          );
    18      }
    19  
    20      function safeTransfer(
    21          address token,
    22          address to,
    23          uint256 value
    24      ) internal {
    25          // bytes4(keccak256(bytes('transfer(address,uint256)')));
    26          (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    27          require(
    28              success && (data.length == 0 || abi.decode(data, (bool))),
    29              'TransferHelper::safeTransfer: transfer failed'
    30          );
    31      }
    32  
    33      function safeTransferFrom(
    34          address token,
    35          address from,
    36          address to,
    37          uint256 value
    38      ) internal {
    39          // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    40          (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    41          require(
    42              success && (data.length == 0 || abi.decode(data, (bool))),
    43              'TransferHelper::transferFrom: transferFrom failed'
    44          );
    45      }
    46  
    47      function safeTransferETH(address to, uint256 value) internal {
    48          (bool success, ) = to.call{value: value}(new bytes(0));
    49          require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    50      }
    51  }