@@ -4,10 +4,8 @@ pragma solidity ^0.8.20;
44
55import {ERC20 } from "../ERC20.sol " ;
66import {IERC165 , ERC165 } from "../../../utils/introspection/ERC165.sol " ;
7-
87import {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 " ;
119
1210/**
1311 * @title ERC1363
@@ -16,18 +14,6 @@ import {IERC1363Spender} from "../../../interfaces/IERC1363Spender.sol";
1614 * {ERC1363-transferFromAndCall} methods while calls after approvals can be made with {ERC1363-approveAndCall}
1715 */
1816abstract 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-
3117 /**
3218 * @dev Indicates a failure within the {transfer} part of a transferAndCall operation.
3319 * @param receiver Address to which tokens are being transferred.
@@ -80,7 +66,7 @@ abstract contract ERC1363 is ERC20, ERC165, IERC1363 {
8066 if (! transfer (to, value)) {
8167 revert ERC1363TransferFailed (to, value);
8268 }
83- _checkOnTransferReceived ( _msgSender (), to, value, data);
69+ ERC1363Utils . checkOnERC1363TransferReceived ( _msgSender (), _msgSender (), to, value, data);
8470 return true ;
8571 }
8672
@@ -112,7 +98,7 @@ abstract contract ERC1363 is ERC20, ERC165, IERC1363 {
11298 if (! transferFrom (from, to, value)) {
11399 revert ERC1363TransferFromFailed (from, to, value);
114100 }
115- _checkOnTransferReceived ( from, to, value, data);
101+ ERC1363Utils . checkOnERC1363TransferReceived ( _msgSender (), from, to, value, data);
116102 return true ;
117103 }
118104
@@ -139,67 +125,7 @@ abstract contract ERC1363 is ERC20, ERC165, IERC1363 {
139125 if (! approve (spender, value)) {
140126 revert ERC1363ApproveFailed (spender, value);
141127 }
142- _checkOnApprovalReceived ( spender, value, data);
128+ ERC1363Utils . checkOnERC1363ApprovalReceived ( _msgSender (), spender, value, data);
143129 return true ;
144130 }
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- }
205131}
0 commit comments