• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

RigoBlock / v3-contracts / 13349491824

15 Feb 2025 11:15PM UTC coverage: 95.172% (+0.8%) from 94.346%
13349491824

Pull #642

github

web-flow
Merge 23b15aa05 into da745e9a8
Pull Request #642: fix: minor fixes

884 of 978 branches covered (90.39%)

Branch coverage included in aggregate %.

29 of 35 new or added lines in 4 files covered. (82.86%)

3 existing lines in 1 file now uncovered.

1856 of 1901 relevant lines covered (97.63%)

68.62 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.33
/contracts/protocol/libraries/SafeTransferLib.sol
1
// SPDX-License-Identifier: Apache3.0-or-later
2
pragma solidity >=0.8.28;
3

4
import {IERC20} from "../interfaces/IERC20.sol";
5

6
type Currency is address;
7

8
/// @title SafeTransferLib
9
/// @dev This library allows for safe transfer of tokens without using assembly
10
library SafeTransferLib {
11
    error ApprovalFailed(address token);
12
    error NativeTransferFailed();
13
    error TokenTransferFailed();
14
    error TokenTransferFromFailed();
15

16
    function safeTransferNative(address to, uint256 amount) internal {
17
        (bool success, ) = to.call{gas: 2300, value: amount}("");
13✔
18
        require(success, NativeTransferFailed());
13✔
19
    }
20

21
    function safeTransfer(address token, address to, uint256 amount) internal {
22
        // solhint-disable-next-line avoid-low-level-calls
23
        (bool success, bytes memory data) = token.call(abi.encodeCall(IERC20.transfer, (to, amount)));
10✔
24
        require(success && (data.length == 0 || abi.decode(data, (bool))), TokenTransferFailed());
10✔
25
    }
26

27
    function safeTransferFrom(address token, address from, address to, uint256 amount) internal {
28
        // solhint-disable-next-line avoid-low-level-calls
29
        (bool success, bytes memory data) = token.call(
25✔
30
            abi.encodeCall(IERC20.transferFrom, (from, to, amount))
31
        );
32
        require(success && (data.length == 0 || abi.decode(data, (bool))), TokenTransferFromFailed());
25✔
33
    }
34

35
    /// @dev Allows approving all ERC20 tokens, forcing approvals when needed.
36
    function safeApprove(address token, address spender, uint256 amount) internal {
37
        try IERC20(token).approve(spender, amount) returns (bool success) {
192✔
38
            // will revert in case of silent failure (i.e. an address without code)
39
            require(success, ApprovalFailed(token));
188!
40
        } catch {
41
            // USDT on mainnet requires approval to be set to 0 before being reset again
UNCOV
42
            try IERC20(token).approve(spender, 0) {
×
UNCOV
43
                IERC20(token).approve(spender, amount);
×
44
            } catch {
UNCOV
45
                revert ApprovalFailed(token);
×
46
            }
47
        }
48
    }
49

50
    function isAddressZero(address target) internal pure returns (bool) {
51
        return target == address(0);
505✔
52
    }
53
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc