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 }