@@ -4,10 +4,8 @@ pragma solidity ^0.8.20;
4
4
5
5
import {ERC20 } from "../ERC20.sol " ;
6
6
import {IERC165 , ERC165 } from "../../../utils/introspection/ERC165.sol " ;
7
-
8
7
import {IERC1363 } from "../../../interfaces/IERC1363.sol " ;
9
- import {IERC1363Receiver } from "../../../interfaces/IERC1363Receiver.sol " ;
10
- import {IERC1363Spender } from "../../../interfaces/IERC1363Spender.sol " ;
8
+ import {ERC1363Utils } from "../utils/ERC1363Utils.sol " ;
11
9
12
10
/**
13
11
* @title ERC1363
@@ -16,18 +14,6 @@ import {IERC1363Spender} from "../../../interfaces/IERC1363Spender.sol";
16
14
* {ERC1363-transferFromAndCall} methods while calls after approvals can be made with {ERC1363-approveAndCall}
17
15
*/
18
16
abstract contract ERC1363 is ERC20 , ERC165 , IERC1363 {
19
- /**
20
- * @dev Indicates a failure with the token `receiver`. Used in transfers.
21
- * @param receiver Address to which tokens are being transferred.
22
- */
23
- error ERC1363InvalidReceiver (address receiver );
24
-
25
- /**
26
- * @dev Indicates a failure with the token `spender`. Used in approvals.
27
- * @param spender Address that may be allowed to operate on tokens without being their owner.
28
- */
29
- error ERC1363InvalidSpender (address spender );
30
-
31
17
/**
32
18
* @dev Indicates a failure within the {transfer} part of a transferAndCall operation.
33
19
* @param receiver Address to which tokens are being transferred.
@@ -80,7 +66,7 @@ abstract contract ERC1363 is ERC20, ERC165, IERC1363 {
80
66
if (! transfer (to, value)) {
81
67
revert ERC1363TransferFailed (to, value);
82
68
}
83
- _checkOnTransferReceived ( _msgSender (), to, value, data);
69
+ ERC1363Utils . checkOnERC1363TransferReceived ( _msgSender (), _msgSender (), to, value, data);
84
70
return true ;
85
71
}
86
72
@@ -112,7 +98,7 @@ abstract contract ERC1363 is ERC20, ERC165, IERC1363 {
112
98
if (! transferFrom (from, to, value)) {
113
99
revert ERC1363TransferFromFailed (from, to, value);
114
100
}
115
- _checkOnTransferReceived ( from, to, value, data);
101
+ ERC1363Utils . checkOnERC1363TransferReceived ( _msgSender (), from, to, value, data);
116
102
return true ;
117
103
}
118
104
@@ -139,67 +125,7 @@ abstract contract ERC1363 is ERC20, ERC165, IERC1363 {
139
125
if (! approve (spender, value)) {
140
126
revert ERC1363ApproveFailed (spender, value);
141
127
}
142
- _checkOnApprovalReceived ( spender, value, data);
128
+ ERC1363Utils . checkOnERC1363ApprovalReceived ( _msgSender (), spender, value, data);
143
129
return true ;
144
130
}
145
-
146
- /**
147
- * @dev Performs a call to {IERC1363Receiver-onTransferReceived} on a target address.
148
- *
149
- * Requirements:
150
- *
151
- * - The target has code (i.e. is a contract).
152
- * - The target `to` must implement the {IERC1363Receiver} interface.
153
- * - The target must return the {IERC1363Receiver-onTransferReceived} selector to accept the transfer.
154
- */
155
- function _checkOnTransferReceived (address from , address to , uint256 value , bytes memory data ) private {
156
- if (to.code.length == 0 ) {
157
- revert ERC1363InvalidReceiver (to);
158
- }
159
-
160
- try IERC1363Receiver (to).onTransferReceived (_msgSender (), from, value, data) returns (bytes4 retval ) {
161
- if (retval != IERC1363Receiver .onTransferReceived.selector ) {
162
- revert ERC1363InvalidReceiver (to);
163
- }
164
- } catch (bytes memory reason ) {
165
- if (reason.length == 0 ) {
166
- revert ERC1363InvalidReceiver (to);
167
- } else {
168
- /// @solidity memory-safe-assembly
169
- assembly {
170
- revert (add (32 , reason), mload (reason))
171
- }
172
- }
173
- }
174
- }
175
-
176
- /**
177
- * @dev Performs a call to {IERC1363Spender-onApprovalReceived} on a target address.
178
- *
179
- * Requirements:
180
- *
181
- * - The target has code (i.e. is a contract).
182
- * - The target `spender` must implement the {IERC1363Spender} interface.
183
- * - The target must return the {IERC1363Spender-onApprovalReceived} selector to accept the approval.
184
- */
185
- function _checkOnApprovalReceived (address spender , uint256 value , bytes memory data ) private {
186
- if (spender.code.length == 0 ) {
187
- revert ERC1363InvalidSpender (spender);
188
- }
189
-
190
- try IERC1363Spender (spender).onApprovalReceived (_msgSender (), value, data) returns (bytes4 retval ) {
191
- if (retval != IERC1363Spender .onApprovalReceived.selector ) {
192
- revert ERC1363InvalidSpender (spender);
193
- }
194
- } catch (bytes memory reason ) {
195
- if (reason.length == 0 ) {
196
- revert ERC1363InvalidSpender (spender);
197
- } else {
198
- /// @solidity memory-safe-assembly
199
- assembly {
200
- revert (add (32 , reason), mload (reason))
201
- }
202
- }
203
- }
204
- }
205
131
}
0 commit comments