Skip to content

Commit 92cda4a

Browse files
authored
Opensea operator filterer + toggle (#303)
* Add a toggle to OpenSea operator filter logic * docs update * fix compiler version * Add Opensea filter with toggle * Fix build error: snake case for constants * Set default operator restriction to true
1 parent 365bf69 commit 92cda4a

25 files changed

+1633
-73
lines changed

contracts/drop/DropERC1155.sol

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import "../extension/LazyMint.sol";
2525
import "../extension/PermissionsEnumerable.sol";
2626
import "../extension/Drop1155.sol";
2727

28+
// OpenSea operator filter
29+
import "../extension/DefaultOperatorFiltererUpgradeable.sol";
30+
2831
contract DropERC1155 is
2932
Initializable,
3033
ContractMetadata,
@@ -37,6 +40,7 @@ contract DropERC1155 is
3740
Drop1155,
3841
ERC2771ContextUpgradeable,
3942
MulticallUpgradeable,
43+
DefaultOperatorFiltererUpgradeable,
4044
ERC1155Upgradeable
4145
{
4246
using StringsUpgradeable for uint256;
@@ -107,10 +111,12 @@ contract DropERC1155 is
107111
// Initialize inherited contracts, most base-like -> most derived.
108112
__ERC2771Context_init(_trustedForwarders);
109113
__ERC1155_init_unchained("");
114+
__DefaultOperatorFilterer_init();
110115

111116
// Initialize this contract's state.
112117
_setupContractURI(_contractURI);
113118
_setupOwner(_defaultAdmin);
119+
_setOperatorRestriction(true);
114120

115121
_setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
116122
_setupRole(_minterRole, _defaultAdmin);
@@ -271,6 +277,11 @@ contract DropERC1155 is
271277
return hasRole(minterRole, _msgSender());
272278
}
273279

280+
/// @dev Returns whether operator restriction can be set in the given execution context.
281+
function _canSetOperatorRestriction() internal virtual override returns (bool) {
282+
return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
283+
}
284+
274285
/*///////////////////////////////////////////////////////////////
275286
Miscellaneous
276287
//////////////////////////////////////////////////////////////*/
@@ -325,6 +336,37 @@ contract DropERC1155 is
325336
}
326337
}
327338

339+
/// @dev See {ERC1155-setApprovalForAll}
340+
function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
341+
super.setApprovalForAll(operator, approved);
342+
}
343+
344+
/**
345+
* @dev See {IERC1155-safeTransferFrom}.
346+
*/
347+
function safeTransferFrom(
348+
address from,
349+
address to,
350+
uint256 id,
351+
uint256 amount,
352+
bytes memory data
353+
) public override(ERC1155Upgradeable) onlyAllowedOperator(from) {
354+
super.safeTransferFrom(from, to, id, amount, data);
355+
}
356+
357+
/**
358+
* @dev See {IERC1155-safeBatchTransferFrom}.
359+
*/
360+
function safeBatchTransferFrom(
361+
address from,
362+
address to,
363+
uint256[] memory ids,
364+
uint256[] memory amounts,
365+
bytes memory data
366+
) public override(ERC1155Upgradeable) onlyAllowedOperator(from) {
367+
super.safeBatchTransferFrom(from, to, ids, amounts, data);
368+
}
369+
328370
function _dropMsgSender() internal view virtual override returns (address) {
329371
return _msgSender();
330372
}

contracts/drop/DropERC721.sol

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol";
77
import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";
88
import "@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";
2626
import "../extension/PermissionsEnumerable.sol";
2727
import "../extension/Drop.sol";
2828

29+
// OpenSea operator filter
30+
import "../extension/DefaultOperatorFiltererUpgradeable.sol";
31+
2932
contract 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

Comments
 (0)