Skip to content

Commit b307211

Browse files
authoredAug 2, 2024··
fix: interface compatibility with non-standard ERC20s (#71)
1 parent 6a1dc9a commit b307211

File tree

5 files changed

+39
-27
lines changed

5 files changed

+39
-27
lines changed
 

‎.gas-snapshot

+21-21
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
OrderOriginPermit2Test:test_fillPermit2() (gas: 225289)
2-
OrderOriginPermit2Test:test_fillPermit2_multi() (gas: 1019134)
3-
OrderOriginPermit2Test:test_initiatePermit2() (gas: 235774)
4-
OrderOriginPermit2Test:test_initiatePermit2_multi() (gas: 992096)
5-
OrdersTest:test_fill_ERC20() (gas: 70559)
6-
OrdersTest:test_fill_ETH() (gas: 68520)
7-
OrdersTest:test_fill_both() (gas: 166795)
8-
OrdersTest:test_fill_multiETH() (gas: 132141)
1+
OrderOriginPermit2Test:test_fillPermit2() (gas: 225275)
2+
OrderOriginPermit2Test:test_fillPermit2_multi() (gas: 1019098)
3+
OrderOriginPermit2Test:test_initiatePermit2() (gas: 235756)
4+
OrderOriginPermit2Test:test_initiatePermit2_multi() (gas: 992082)
5+
OrdersTest:test_fill_ERC20() (gas: 71615)
6+
OrdersTest:test_fill_ETH() (gas: 68524)
7+
OrdersTest:test_fill_both() (gas: 167851)
8+
OrdersTest:test_fill_multiETH() (gas: 132145)
99
OrdersTest:test_fill_underflowETH() (gas: 115425)
10-
OrdersTest:test_initiate_ERC20() (gas: 81636)
10+
OrdersTest:test_initiate_ERC20() (gas: 82688)
1111
OrdersTest:test_initiate_ETH() (gas: 45150)
12-
OrdersTest:test_initiate_both() (gas: 118911)
13-
OrdersTest:test_initiate_multiERC20() (gas: 722642)
12+
OrdersTest:test_initiate_both() (gas: 119963)
13+
OrdersTest:test_initiate_multiERC20() (gas: 724742)
1414
OrdersTest:test_initiate_multiETH() (gas: 75538)
1515
OrdersTest:test_orderExpired() (gas: 28106)
16-
OrdersTest:test_sweepERC20() (gas: 59721)
16+
OrdersTest:test_sweepERC20() (gas: 60713)
1717
OrdersTest:test_sweepETH() (gas: 82348)
1818
OrdersTest:test_underflowETH() (gas: 63690)
19-
PassagePermit2Test:test_disallowedEnterPermit2() (gas: 699630)
20-
PassagePermit2Test:test_enterTokenPermit2() (gas: 145449)
21-
PassageTest:test_configureEnter() (gas: 125771)
22-
PassageTest:test_disallowedEnter() (gas: 56619)
19+
PassagePermit2Test:test_disallowedEnterPermit2() (gas: 696817)
20+
PassagePermit2Test:test_enterTokenPermit2() (gas: 145435)
21+
PassageTest:test_configureEnter() (gas: 128989)
22+
PassageTest:test_disallowedEnter() (gas: 57692)
2323
PassageTest:test_enter() (gas: 25519)
24-
PassageTest:test_enterToken() (gas: 64397)
25-
PassageTest:test_enterToken_defaultChain() (gas: 62979)
24+
PassageTest:test_enterToken() (gas: 65469)
25+
PassageTest:test_enterToken_defaultChain() (gas: 64051)
2626
PassageTest:test_enter_defaultChain() (gas: 24055)
2727
PassageTest:test_fallback() (gas: 21533)
2828
PassageTest:test_onlyTokenAdmin() (gas: 16881)
2929
PassageTest:test_receive() (gas: 21383)
3030
PassageTest:test_setUp() (gas: 17011)
31-
PassageTest:test_withdraw() (gas: 59188)
32-
RollupPassagePermit2Test:test_exitTokenPermit2() (gas: 129402)
31+
PassageTest:test_withdraw() (gas: 60183)
32+
RollupPassagePermit2Test:test_exitTokenPermit2() (gas: 129388)
3333
RollupPassageTest:test_exit() (gas: 22403)
34-
RollupPassageTest:test_exitToken() (gas: 50232)
34+
RollupPassageTest:test_exitToken() (gas: 51071)
3535
RollupPassageTest:test_fallback() (gas: 19949)
3636
RollupPassageTest:test_receive() (gas: 19844)
3737
TransactTest:test_configureGas() (gas: 22828)

‎src/orders/OrderDestination.sol

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ pragma solidity ^0.8.24;
44
import {OrdersPermit2} from "./OrdersPermit2.sol";
55
import {IOrders} from "./IOrders.sol";
66
import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
7+
import {SafeERC20} from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
78

89
/// @notice Contract capable of processing fulfillment of intent-based Orders.
910
abstract contract OrderDestination is IOrders, OrdersPermit2 {
11+
using SafeERC20 for IERC20;
12+
1013
/// @notice Emitted when Order Outputs are sent to their recipients.
1114
/// @dev NOTE that here, Output.chainId denotes the *origin* chainId.
1215
event Filled(Output[] outputs);
@@ -53,7 +56,7 @@ abstract contract OrderDestination is IOrders, OrdersPermit2 {
5356
value -= outputs[i].amount;
5457
payable(outputs[i].recipient).transfer(outputs[i].amount);
5558
} else {
56-
IERC20(outputs[i].token).transferFrom(msg.sender, outputs[i].recipient, outputs[i].amount);
59+
IERC20(outputs[i].token).safeTransferFrom(msg.sender, outputs[i].recipient, outputs[i].amount);
5760
}
5861
}
5962
}

‎src/orders/OrderOrigin.sol

+5-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ pragma solidity ^0.8.24;
44
import {OrdersPermit2} from "./OrdersPermit2.sol";
55
import {IOrders} from "./IOrders.sol";
66
import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
7+
import {SafeERC20} from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
78

89
/// @notice Contract capable of registering initiation of intent-based Orders.
910
abstract contract OrderOrigin is IOrders, OrdersPermit2 {
11+
using SafeERC20 for IERC20;
12+
1013
/// @notice Thrown when an Order is submitted with a deadline that has passed.
1114
error OrderExpired();
1215

@@ -79,7 +82,7 @@ abstract contract OrderOrigin is IOrders, OrdersPermit2 {
7982
if (token == address(0)) {
8083
payable(recipient).transfer(amount);
8184
} else {
82-
IERC20(token).transfer(recipient, amount);
85+
IERC20(token).safeTransfer(recipient, amount);
8386
}
8487
emit Sweep(recipient, token, amount);
8588
}
@@ -92,7 +95,7 @@ abstract contract OrderOrigin is IOrders, OrdersPermit2 {
9295
// this line should underflow if there's an attempt to spend more ETH than is attached to the transaction
9396
value -= inputs[i].amount;
9497
} else {
95-
IERC20(inputs[i].token).transferFrom(msg.sender, address(this), inputs[i].amount);
98+
IERC20(inputs[i].token).safeTransferFrom(msg.sender, address(this), inputs[i].amount);
9699
}
97100
}
98101
}

‎src/passage/Passage.sol

+5-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ pragma solidity ^0.8.24;
44
import {PassagePermit2} from "./PassagePermit2.sol";
55
import {UsesPermit2} from "../UsesPermit2.sol";
66
import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
7+
import {SafeERC20} from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
78

89
/// @notice A contract deployed to Host chain that allows tokens to enter the rollup.
910
contract Passage is PassagePermit2 {
11+
using SafeERC20 for IERC20;
12+
1013
/// @notice The chainId of rollup that Ether will be sent to by default when entering the rollup via fallback() or receive().
1114
uint256 public immutable defaultRollupChainId;
1215

@@ -90,7 +93,7 @@ contract Passage is PassagePermit2 {
9093
/// @param amount - The amount of tokens entering the rollup.
9194
function enterToken(uint256 rollupChainId, address rollupRecipient, address token, uint256 amount) public {
9295
// transfer tokens to this contract
93-
IERC20(token).transferFrom(msg.sender, address(this), amount);
96+
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
9497
// check and emit
9598
_enterToken(rollupChainId, rollupRecipient, token, amount);
9699
}
@@ -127,7 +130,7 @@ contract Passage is PassagePermit2 {
127130
if (token == address(0)) {
128131
payable(recipient).transfer(amount);
129132
} else {
130-
IERC20(token).transfer(recipient, amount);
133+
IERC20(token).safeTransfer(recipient, amount);
131134
}
132135
emit Withdrawal(token, recipient, amount);
133136
}

‎src/passage/RollupPassage.sol

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ pragma solidity ^0.8.24;
44
import {PassagePermit2} from "./PassagePermit2.sol";
55
import {UsesPermit2} from "../UsesPermit2.sol";
66
import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
7+
import {SafeERC20} from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
78
import {ERC20Burnable} from "openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol";
89

910
/// @notice Enables tokens to Exit the rollup.
1011
contract RollupPassage is PassagePermit2 {
12+
using SafeERC20 for IERC20;
13+
1114
/// @notice Emitted when native Ether exits the rollup.
1215
/// @param hostRecipient - The *requested* recipient of tokens on the host chain.
1316
/// @param amount - The amount of Ether exiting the rollup.
@@ -46,7 +49,7 @@ contract RollupPassage is PassagePermit2 {
4649
/// @custom:emits ExitToken
4750
function exitToken(address hostRecipient, address token, uint256 amount) external {
4851
// transfer tokens to this contract
49-
IERC20(token).transferFrom(msg.sender, address(this), amount);
52+
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
5053
// burn and emit
5154
_exitToken(hostRecipient, token, amount);
5255
}

0 commit comments

Comments
 (0)
Please sign in to comment.