@@ -7,7 +7,7 @@ import "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol";
77import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol " ;
88import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol " ;
99
10- import "erc721a-upgradeable/contracts/ERC721AUpgradeable .sol " ;
10+ import "../eip/ERC721AVirtualApprove .sol " ;
1111
1212// ========== Internal imports ==========
1313
@@ -26,6 +26,9 @@ import "../extension/LazyMint.sol";
2626import "../extension/PermissionsEnumerable.sol " ;
2727import "../extension/Drop.sol " ;
2828
29+ // OpenSea operator filter
30+ import "../extension/DefaultOperatorFiltererUpgradeable.sol " ;
31+
2932contract DropERC721 is
3033 Initializable ,
3134 ContractMetadata ,
@@ -39,6 +42,7 @@ contract DropERC721 is
3942 Drop ,
4043 ERC2771ContextUpgradeable ,
4144 MulticallUpgradeable ,
45+ DefaultOperatorFiltererUpgradeable ,
4246 ERC721AUpgradeable
4347{
4448 using StringsUpgradeable for uint256 ;
@@ -86,9 +90,11 @@ contract DropERC721 is
8690 // Initialize inherited contracts, most base-like -> most derived.
8791 __ERC2771Context_init (_trustedForwarders);
8892 __ERC721A_init (_name, _symbol);
93+ __DefaultOperatorFilterer_init ();
8994
9095 _setupContractURI (_contractURI);
9196 _setupOwner (_defaultAdmin);
97+ _setOperatorRestriction (true );
9298
9399 _setupRole (DEFAULT_ADMIN_ROLE, _defaultAdmin);
94100 _setupRole (_minterRole, _defaultAdmin);
@@ -280,6 +286,11 @@ contract DropERC721 is
280286 return hasRole (minterRole, _msgSender ());
281287 }
282288
289+ /// @dev Returns whether operator restriction can be set in the given execution context.
290+ function _canSetOperatorRestriction () internal virtual override returns (bool ) {
291+ return hasRole (DEFAULT_ADMIN_ROLE, _msgSender ());
292+ }
293+
283294 /*///////////////////////////////////////////////////////////////
284295 Miscellaneous
285296 //////////////////////////////////////////////////////////////*/
@@ -326,6 +337,44 @@ contract DropERC721 is
326337 }
327338 }
328339
340+ /// @dev See {ERC721-setApprovalForAll}.
341+ function setApprovalForAll (address operator , bool approved ) public override onlyAllowedOperatorApproval (operator) {
342+ super .setApprovalForAll (operator, approved);
343+ }
344+
345+ /// @dev See {ERC721-approve}.
346+ function approve (address operator , uint256 tokenId ) public override onlyAllowedOperatorApproval (operator) {
347+ super .approve (operator, tokenId);
348+ }
349+
350+ /// @dev See {ERC721-_transferFrom}.
351+ function transferFrom (
352+ address from ,
353+ address to ,
354+ uint256 tokenId
355+ ) public override (ERC721AUpgradeable ) onlyAllowedOperator (from) {
356+ super .transferFrom (from, to, tokenId);
357+ }
358+
359+ /// @dev See {ERC721-_safeTransferFrom}.
360+ function safeTransferFrom (
361+ address from ,
362+ address to ,
363+ uint256 tokenId
364+ ) public override (ERC721AUpgradeable ) onlyAllowedOperator (from) {
365+ super .safeTransferFrom (from, to, tokenId);
366+ }
367+
368+ /// @dev See {ERC721-_safeTransferFrom}.
369+ function safeTransferFrom (
370+ address from ,
371+ address to ,
372+ uint256 tokenId ,
373+ bytes memory data
374+ ) public override (ERC721AUpgradeable ) onlyAllowedOperator (from) {
375+ super .safeTransferFrom (from, to, tokenId, data);
376+ }
377+
329378 function _dropMsgSender () internal view virtual override returns (address ) {
330379 return _msgSender ();
331380 }
0 commit comments