From 7a1a8ae3289947d0e319a6863a8e611584d47811 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 23 Aug 2021 10:43:27 +0200 Subject: [PATCH] Add an internal _setApprovalForAll function (721 & 1155) --- contracts/token/ERC1155/ERC1155.sol | 15 ++++++++++++--- contracts/token/ERC721/ERC721.sol | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index 634f389345d..1b41106784a 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -101,9 +101,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); - - _operatorApprovals[_msgSender()][operator] = approved; - emit ApprovalForAll(_msgSender(), operator, approved); + _setApprovalForAll(_msgSender(), operator, approved); } /** @@ -369,6 +367,17 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { emit TransferBatch(operator, account, address(0), ids, amounts); } + /** + * @dev Approve `operator` to operate on all of `owner` tokens + * + * Emits a {ApprovalForAll} event. + */ + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { + // TODO: add sanity checks? + _operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 0b37218ec25..50d16baed69 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -134,9 +134,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); - - _operatorApprovals[_msgSender()][operator] = approved; - emit ApprovalForAll(_msgSender(), operator, approved); + _setApprovalForAll(_msgSender(), operator, approved); } /** @@ -356,6 +354,17 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } + /** + * @dev Approve `operator` to operate on all of `owner` tokens + * + * Emits a {ApprovalForAll} event. + */ + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { + // TODO: add sanity checks? + _operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract.