diff --git a/.changeset/social-tools-sniff.md b/.changeset/social-tools-sniff.md new file mode 100644 index 00000000000..dfb447f63d1 --- /dev/null +++ b/.changeset/social-tools-sniff.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ERC1155`: Introduce the `_checkAuthorized` internal virtual function to encapsulate `isApprovedForAll` and `msg.sender == from` checks. diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index 1af455cc6e2..6ecd3579f23 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -97,10 +97,7 @@ abstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IER /// @inheritdoc IERC1155 function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) public virtual { - address sender = _msgSender(); - if (from != sender && !isApprovedForAll(from, sender)) { - revert ERC1155MissingApprovalForAll(sender, from); - } + _checkAuthorized(_msgSender(), from); _safeTransferFrom(from, to, id, value, data); } @@ -112,13 +109,17 @@ abstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IER uint256[] memory values, bytes memory data ) public virtual { - address sender = _msgSender(); - if (from != sender && !isApprovedForAll(from, sender)) { - revert ERC1155MissingApprovalForAll(sender, from); - } + _checkAuthorized(_msgSender(), from); _safeBatchTransferFrom(from, to, ids, values, data); } + /// @dev Checks if `operator` is authorized to transfer tokens owned by `owner`. Reverts with {ERC1155MissingApprovalForAll} if not. + function _checkAuthorized(address operator, address owner) internal view virtual { + if (owner != operator && !isApprovedForAll(owner, operator)) { + revert ERC1155MissingApprovalForAll(operator, owner); + } + } + /** * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from` * (or `to`) is the zero address.