@artblocks/contracts 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +10 -0
- package/LICENSE +165 -0
- package/README.md +286 -0
- package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +164 -0
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +248 -0
- package/artifacts/contracts/BasicRandomizer.sol/BasicRandomizer.json +24 -0
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +1020 -0
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +1928 -0
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1942 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +1708 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +1410 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +1436 -0
- package/artifacts/contracts/engine/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +437 -0
- package/artifacts/contracts/engine/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +508 -0
- package/artifacts/contracts/engine/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +381 -0
- package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +109 -0
- package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +109 -0
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +1902 -0
- package/artifacts/contracts/interfaces/0.5.x/IBonusContract.sol/IBonusContract.json +47 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +413 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +392 -0
- package/artifacts/contracts/interfaces/0.5.x/IRandomizer.sol/IRandomizer.json +26 -0
- package/artifacts/contracts/interfaces/0.8.x/IAdminACLV0.sol/IAdminACLV0.json +122 -0
- package/artifacts/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +59 -0
- package/artifacts/contracts/interfaces/0.8.x/IBonusContract.sol/IBonusContract.json +43 -0
- package/artifacts/contracts/interfaces/0.8.x/IDelegationRegistry.sol/IDelegationRegistry.json +510 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +53 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +350 -0
- package/artifacts/contracts/interfaces/0.8.x/IEngineRegistryV0.sol/IEngineRegistryV0.json +85 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +730 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +311 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +617 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +292 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +598 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +355 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +368 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +674 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +551 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +564 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +601 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV0.sol/IFilteredMinterV0.json +216 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV1.sol/IFilteredMinterV1.json +485 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV2.sol/IFilteredMinterV2.json +522 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +299 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +609 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +448 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +649 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +362 -0
- package/artifacts/contracts/interfaces/0.8.x/IManifold.sol/IManifold.json +35 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +192 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizer.sol/IRandomizer.json +24 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +37 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC165.json +38 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +322 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +1773 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC165.json +32 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721.json +316 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +10 -0
- package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +338 -0
- package/artifacts/contracts/libs/0.5.x/CustomERC721Metadata.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/libs/0.5.x/IERC20.sol/IERC20.json +206 -0
- package/artifacts/contracts/libs/0.5.x/SafeMath.sol/SafeMath.json +10 -0
- package/artifacts/contracts/libs/0.5.x/Strings.sol/Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/BytecodeStorage.sol/BytecodeStorage.json +10 -0
- package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +357 -0
- package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +529 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +1037 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +172 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +24 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +342 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +322 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +550 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +856 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +1053 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +526 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +832 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +1100 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +1002 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +1039 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +365 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +671 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol/MinterSetPriceV1.json +288 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +436 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +742 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +461 -0
- package/artifacts/contracts/mock/BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json +194 -0
- package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +15 -0
- package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +292 -0
- package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +165 -0
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +128 -0
- package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +118 -0
- package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +87 -0
- package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +82 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +208 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +301 -0
- package/contracts/AdminACLV0.sol +103 -0
- package/contracts/AdminACLV1.sol +193 -0
- package/contracts/BasicRandomizer.sol +23 -0
- package/contracts/BasicRandomizerV2.sol +36 -0
- package/contracts/DependencyRegistryV0.sol +893 -0
- package/contracts/GenArt721CoreV3.sol +2001 -0
- package/contracts/GenArt721CoreV3_Engine.sol +2061 -0
- package/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol +887 -0
- package/contracts/engine/GenArt721CoreV2_PBAB.sol +695 -0
- package/contracts/engine/GenArt721CoreV2_PRTNR.sol +749 -0
- package/contracts/engine/GenArt721MinterBurner_PBAB.sol +467 -0
- package/contracts/engine/GenArt721MinterDAExp_PBAB.sol +614 -0
- package/contracts/engine/GenArt721Minter_PBAB.sol +420 -0
- package/contracts/engine-registry/EngineRegistryV0.sol +72 -0
- package/contracts/engine-registry/future/EngineRegistryV1.sol +86 -0
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +1989 -0
- package/contracts/interfaces/0.5.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol +91 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol +92 -0
- package/contracts/interfaces/0.5.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IAdminACLV0.sol +51 -0
- package/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol +34 -0
- package/contracts/interfaces/0.8.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +221 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +95 -0
- package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +38 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +70 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol +35 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol +32 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol +68 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol +37 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV0.sol +74 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV1.sol +127 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV2.sol +30 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol +73 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol +79 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +127 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +80 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol +91 -0
- package/contracts/interfaces/0.8.x/IManifold.sol +24 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +47 -0
- package/contracts/interfaces/0.8.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +15 -0
- package/contracts/legacy/GenArt721CoreV1.sol +1593 -0
- package/contracts/legacy/GenArt721LegacyMinter.sol +275 -0
- package/contracts/libs/0.5.x/CustomERC721Metadata.sol +52 -0
- package/contracts/libs/0.5.x/IERC20.sol +96 -0
- package/contracts/libs/0.5.x/SafeMath.sol +98 -0
- package/contracts/libs/0.5.x/Strings.sol +92 -0
- package/contracts/libs/0.8.x/BytecodeStorage.sol +314 -0
- package/contracts/libs/0.8.x/Bytes32Strings.sol +66 -0
- package/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol +514 -0
- package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +663 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol +6 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +291 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +320 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +571 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +622 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1066 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +527 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +576 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +749 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +798 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +682 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +733 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +350 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +401 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol +274 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +491 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +542 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol +470 -0
- package/contracts/mock/BytecodeTextCR_DMock.sol +184 -0
- package/contracts/mock/DeadReceiverMock.sol +13 -0
- package/contracts/mock/ERC20Mock.sol +11 -0
- package/contracts/mock/MockAdminACLV0.sol +65 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +43 -0
- package/contracts/mock/ReentrancyHolderMock.sol +50 -0
- package/contracts/mock/ReentrancyMerkleMock.sol +64 -0
- package/contracts/mock/ReentrancyMock.sol +44 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +168 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +221 -0
- package/package.json +83 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity 0.8.17;
|
|
4
|
+
|
|
5
|
+
import "../interfaces/0.8.x/IAdminACLV0.sol";
|
|
6
|
+
import "@openzeppelin-4.7/contracts/access/Ownable.sol";
|
|
7
|
+
import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @dev Mock contract for testing purposes.
|
|
11
|
+
* This contract has a single superAdmin that passes all ACL checks. All checks
|
|
12
|
+
* for any other address will return false.
|
|
13
|
+
* It also emits an event for all ACL checks, enabling our test suite to verify
|
|
14
|
+
* that the ACL was checked with the correct parameters.
|
|
15
|
+
* @dev this contract specifically does not broadcast conformance to IAdminACLV0
|
|
16
|
+
* for testing purposes.
|
|
17
|
+
*/
|
|
18
|
+
contract MockAdminACLV0Events is IAdminACLV0, ERC165 {
|
|
19
|
+
// event used for testing purposes to diagnose what core contract is asking
|
|
20
|
+
// approval for.
|
|
21
|
+
event ACLCheck(address indexed sender, bytes4 indexed selector);
|
|
22
|
+
|
|
23
|
+
string public AdminACLType = "MockAdminACLV0Events";
|
|
24
|
+
|
|
25
|
+
// superAdmin is the only address that passes any and all ACL checks
|
|
26
|
+
address public superAdmin;
|
|
27
|
+
|
|
28
|
+
constructor() {
|
|
29
|
+
superAdmin = msg.sender;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @dev Returns true for all ACL checks.
|
|
34
|
+
* Also emits event for testing purposes.
|
|
35
|
+
*/
|
|
36
|
+
function allowed(
|
|
37
|
+
address _sender,
|
|
38
|
+
address /*_contract*/,
|
|
39
|
+
bytes4 _selector
|
|
40
|
+
) external returns (bool) {
|
|
41
|
+
emit ACLCheck(_sender, _selector);
|
|
42
|
+
return superAdmin == _sender;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @dev Allows superAdmin to call transferOwnership on other contract from
|
|
47
|
+
* this contract.
|
|
48
|
+
*/
|
|
49
|
+
function transferOwnershipOn(
|
|
50
|
+
address _contract,
|
|
51
|
+
address _newAdminACL
|
|
52
|
+
) external {
|
|
53
|
+
require(msg.sender == superAdmin, "Only superAdmin");
|
|
54
|
+
Ownable(_contract).transferOwnership(_newAdminACL);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @dev Allows superAdmin to call renounceOwnership on other contract from
|
|
59
|
+
* this contract.
|
|
60
|
+
*/
|
|
61
|
+
function renounceOwnershipOn(address _contract) external {
|
|
62
|
+
require(msg.sender == superAdmin, "Only superAdmin");
|
|
63
|
+
Ownable(_contract).renounceOwnership();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Creatd By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity 0.8.17;
|
|
5
|
+
|
|
6
|
+
import "../BasicRandomizerV2.sol";
|
|
7
|
+
|
|
8
|
+
/// @title RandomizerV2_NoAssignMock
|
|
9
|
+
/// @notice WARNING - This is a mock contract. Do not use it in production.
|
|
10
|
+
/// @dev This is a mock of the RandomizerV2 contract that does not assign the
|
|
11
|
+
/// token hash on the core contract at the time of mint.
|
|
12
|
+
/// Instead, anyone may set an existing token's hash via the
|
|
13
|
+
/// `actuallyAssignTokenHash` function.
|
|
14
|
+
contract RandomizerV2_NoAssignMock is BasicRandomizerV2 {
|
|
15
|
+
// When `genArt721Core` calls this, the call is ignored and nothing is set
|
|
16
|
+
// on the core contract. Used for test purposes only.
|
|
17
|
+
function assignTokenHash(uint256 /*_tokenId*/) external pure override {}
|
|
18
|
+
|
|
19
|
+
// When ANYONE calls this, token `_tokenId`'s hash is set
|
|
20
|
+
// on the core contract. Used for test purposes only.
|
|
21
|
+
// @dev WARNING - THIS IS NOT SECURE AND SHOULD NOT BE USED IN PRODUCTION.
|
|
22
|
+
function actuallyAssignTokenHash(uint256 _tokenId) external {
|
|
23
|
+
uint256 time = block.timestamp;
|
|
24
|
+
bytes32 hash = keccak256(
|
|
25
|
+
abi.encodePacked(
|
|
26
|
+
_tokenId,
|
|
27
|
+
block.number,
|
|
28
|
+
blockhash(block.number - 1),
|
|
29
|
+
time,
|
|
30
|
+
(time % 200) + 1
|
|
31
|
+
)
|
|
32
|
+
);
|
|
33
|
+
genArt721Core.setTokenHash_8PT(_tokenId, hash);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// When ANYONE calls this, token `_tokenId`'s hash is attempted to be set
|
|
37
|
+
// to zero on the core contract. Used for test purposes only.
|
|
38
|
+
// @dev WARNING - THIS IS NOT SECURE AND SHOULD NOT BE USED IN PRODUCTION.
|
|
39
|
+
function actuallyAssignZeroTokenHash(uint256 _tokenId) external {
|
|
40
|
+
bytes32 hash;
|
|
41
|
+
genArt721Core.setTokenHash_8PT(_tokenId, hash);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IFilteredMinterHolderV0.sol";
|
|
5
|
+
|
|
6
|
+
pragma solidity ^0.8.0;
|
|
7
|
+
|
|
8
|
+
contract ReentrancyHolderMock {
|
|
9
|
+
uint256 public currentQtyToPurchase;
|
|
10
|
+
uint256 public currentProjectId;
|
|
11
|
+
uint256 public currentPriceToPay;
|
|
12
|
+
address public currentOwnedNftAddress;
|
|
13
|
+
uint256 public currentOwnedNftTokenId;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
@notice This function can be called to induce controlled reentrency attacks
|
|
17
|
+
on AB minter filter suite's Token Holder minter.
|
|
18
|
+
Note that _priceToPay should be > project price per token to induce refund,
|
|
19
|
+
making reentrency possible via fallback function.
|
|
20
|
+
*/
|
|
21
|
+
function attack(
|
|
22
|
+
uint256 _qtyToPurchase,
|
|
23
|
+
address _minterContractAddress,
|
|
24
|
+
uint256 _projectId,
|
|
25
|
+
uint256 _priceToPay,
|
|
26
|
+
address _ownedNftAddress,
|
|
27
|
+
uint256 _ownedNftTokenId
|
|
28
|
+
) external payable {
|
|
29
|
+
currentQtyToPurchase = _qtyToPurchase;
|
|
30
|
+
currentProjectId = _projectId;
|
|
31
|
+
currentPriceToPay = _priceToPay;
|
|
32
|
+
currentOwnedNftAddress = _ownedNftAddress;
|
|
33
|
+
currentOwnedNftTokenId = _ownedNftTokenId;
|
|
34
|
+
IFilteredMinterHolderV0(_minterContractAddress).purchase{
|
|
35
|
+
value: _priceToPay
|
|
36
|
+
}(_projectId, _ownedNftAddress, _ownedNftTokenId);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// receiver is called when minter sends refunded Ether to this contract.
|
|
40
|
+
receive() external payable {
|
|
41
|
+
// decrement num to be purchased
|
|
42
|
+
currentQtyToPurchase--;
|
|
43
|
+
if (currentQtyToPurchase > 0) {
|
|
44
|
+
// purchase again!
|
|
45
|
+
IFilteredMinterHolderV0(msg.sender).purchase{
|
|
46
|
+
value: currentPriceToPay
|
|
47
|
+
}(currentProjectId, currentOwnedNftAddress, currentOwnedNftTokenId);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IFilteredMinterMerkleV0.sol";
|
|
5
|
+
|
|
6
|
+
pragma solidity ^0.8.0;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @dev This contract is tailored to attack our Merkle allowlist minter with a
|
|
10
|
+
* reentrency attack. It simulates the case where an artist allowlists a
|
|
11
|
+
* malicious contract.
|
|
12
|
+
* @dev Note that a simple contract like this assumes a specific Merkle proof
|
|
13
|
+
* depth. In this case, a Merkle proof depth of 3 is assumed (since it
|
|
14
|
+
* integrates well with our tests). More complex strategies could be used to
|
|
15
|
+
* write a more flexible reentrency attack contract, but it doesn't add more
|
|
16
|
+
* value to our test suite at this time.
|
|
17
|
+
*/
|
|
18
|
+
contract ReentrancyMerkleMock {
|
|
19
|
+
uint256 public currentQtyToPurchase;
|
|
20
|
+
uint256 public currentProjectId;
|
|
21
|
+
uint256 public currentPriceToPay;
|
|
22
|
+
bytes32[3] currentProof;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
@notice This function can be called to induce controlled reentrency attacks
|
|
26
|
+
on AB minter filter suite's Merkle minter (originally designed for V0).
|
|
27
|
+
Note that _priceToPay should be > project price per token to induce refund,
|
|
28
|
+
making reentrency possible via fallback function.
|
|
29
|
+
*/
|
|
30
|
+
function attack(
|
|
31
|
+
uint256 _qtyToPurchase,
|
|
32
|
+
address _minterContractAddress,
|
|
33
|
+
uint256 _projectId,
|
|
34
|
+
uint256 _priceToPay,
|
|
35
|
+
bytes32[] memory _proof
|
|
36
|
+
) external payable {
|
|
37
|
+
currentQtyToPurchase = _qtyToPurchase;
|
|
38
|
+
currentProjectId = _projectId;
|
|
39
|
+
currentPriceToPay = _priceToPay;
|
|
40
|
+
currentProof[0] = _proof[0];
|
|
41
|
+
currentProof[1] = _proof[1];
|
|
42
|
+
currentProof[2] = _proof[2];
|
|
43
|
+
IFilteredMinterMerkleV0(_minterContractAddress).purchase{
|
|
44
|
+
value: _priceToPay
|
|
45
|
+
}(_projectId, _proof);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// receiver is called when minter sends refunded Ether to this contract.
|
|
49
|
+
receive() external payable {
|
|
50
|
+
// decrement num to be purchased
|
|
51
|
+
currentQtyToPurchase--;
|
|
52
|
+
if (currentQtyToPurchase > 0) {
|
|
53
|
+
// rebuild _proof
|
|
54
|
+
bytes32[] memory _proof = new bytes32[](3);
|
|
55
|
+
_proof[0] = currentProof[0];
|
|
56
|
+
_proof[1] = currentProof[1];
|
|
57
|
+
_proof[2] = currentProof[2];
|
|
58
|
+
// purchase again!
|
|
59
|
+
IFilteredMinterMerkleV0(msg.sender).purchase{
|
|
60
|
+
value: currentPriceToPay
|
|
61
|
+
}(currentProjectId, _proof);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IFilteredMinterV0.sol";
|
|
5
|
+
|
|
6
|
+
pragma solidity ^0.8.0;
|
|
7
|
+
|
|
8
|
+
contract ReentrancyMock {
|
|
9
|
+
uint256 public currentQtyToPurchase;
|
|
10
|
+
uint256 public currentProjectId;
|
|
11
|
+
uint256 public currentPriceToPay;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
@notice This function can be called to induce controlled reentrency attacks
|
|
15
|
+
on AB minter filter suite.
|
|
16
|
+
Note that _priceToPay should be > project price per token to induce refund,
|
|
17
|
+
making reentrency possible via fallback function.
|
|
18
|
+
*/
|
|
19
|
+
function attack(
|
|
20
|
+
uint256 _qtyToPurchase,
|
|
21
|
+
address _minterContractAddress,
|
|
22
|
+
uint256 _projectId,
|
|
23
|
+
uint256 _priceToPay
|
|
24
|
+
) external payable {
|
|
25
|
+
currentQtyToPurchase = _qtyToPurchase;
|
|
26
|
+
currentProjectId = _projectId;
|
|
27
|
+
currentPriceToPay = _priceToPay;
|
|
28
|
+
IFilteredMinterV0(_minterContractAddress).purchase{value: _priceToPay}(
|
|
29
|
+
_projectId
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// receiver is called when minter sends refunded Ether to this contract.
|
|
34
|
+
receive() external payable {
|
|
35
|
+
// decrement num to be purchased
|
|
36
|
+
currentQtyToPurchase--;
|
|
37
|
+
if (currentQtyToPurchase > 0) {
|
|
38
|
+
// purchase again!
|
|
39
|
+
IFilteredMinterV0(msg.sender).purchase{value: currentPriceToPay}(
|
|
40
|
+
currentProjectId
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IArtblocksRoyaltyOverride.sol";
|
|
5
|
+
import "../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
|
|
6
|
+
|
|
7
|
+
import "@openzeppelin-4.5/contracts/utils/introspection/ERC165.sol";
|
|
8
|
+
|
|
9
|
+
pragma solidity 0.8.9;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @title Royalty Registry override for Art Blocks token contracts.
|
|
13
|
+
* @author Art Blocks Inc.
|
|
14
|
+
*/
|
|
15
|
+
contract GenArt721RoyaltyOverride is ERC165, IArtblocksRoyaltyOverride {
|
|
16
|
+
/**
|
|
17
|
+
* @notice Art Blocks royalty payment address for `contractAddress`
|
|
18
|
+
* updated to be `artblocksRoyaltyAddress`.
|
|
19
|
+
*/
|
|
20
|
+
event ArtblocksRoyaltyAddressForContractUpdated(
|
|
21
|
+
address indexed contractAddress,
|
|
22
|
+
address payable indexed artblocksRoyaltyAddress
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @notice Art Blocks royalty payment basis points for `tokenAddress`
|
|
27
|
+
* updated to be `bps` if `useOverride`, else updated to use default
|
|
28
|
+
* BPS.
|
|
29
|
+
*/
|
|
30
|
+
event ArtblocksBpsForContractUpdated(
|
|
31
|
+
address indexed tokenAddress,
|
|
32
|
+
bool indexed useOverride,
|
|
33
|
+
uint256 bps
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
/// token contract => Art Blocks royalty payment address
|
|
37
|
+
mapping(address => address payable)
|
|
38
|
+
public tokenAddressToArtblocksRoyaltyAddress;
|
|
39
|
+
|
|
40
|
+
struct BpsOverride {
|
|
41
|
+
bool useOverride;
|
|
42
|
+
uint256 bps;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// Default Art Blocks royalty basis points if no BPS override is set.
|
|
46
|
+
uint256 public constant ARTBLOCKS_DEFAULT_BPS = 250; // 2.5 percent
|
|
47
|
+
/// token contract => if bps override is set, and bps value.
|
|
48
|
+
mapping(address => BpsOverride) public tokenAddressToArtblocksBpsOverride;
|
|
49
|
+
|
|
50
|
+
modifier onlyAdminOnContract(address _tokenContract) {
|
|
51
|
+
require(
|
|
52
|
+
IGenArt721CoreContractV3(_tokenContract).admin() == msg.sender,
|
|
53
|
+
"Only core admin for specified token contract"
|
|
54
|
+
);
|
|
55
|
+
_;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @dev See {IERC165-supportsInterface}.
|
|
60
|
+
*/
|
|
61
|
+
function supportsInterface(
|
|
62
|
+
bytes4 interfaceId
|
|
63
|
+
) public view override(ERC165, IERC165) returns (bool) {
|
|
64
|
+
return
|
|
65
|
+
// register interface 0x9ca7dc7a - getRoyalties(address,uint256)
|
|
66
|
+
interfaceId == type(IArtblocksRoyaltyOverride).interfaceId ||
|
|
67
|
+
super.supportsInterface(interfaceId);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @notice Updates Art Blocks royalty payment address for `_tokenContract`
|
|
72
|
+
* to be `_artblocksRoyaltyAddress`.
|
|
73
|
+
* @param _tokenContract Token contract to be updated.
|
|
74
|
+
* @param _artblocksRoyaltyAddress Address to receive royalty payments.
|
|
75
|
+
*/
|
|
76
|
+
function updateArtblocksRoyaltyAddressForContract(
|
|
77
|
+
address _tokenContract,
|
|
78
|
+
address payable _artblocksRoyaltyAddress
|
|
79
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
80
|
+
tokenAddressToArtblocksRoyaltyAddress[
|
|
81
|
+
_tokenContract
|
|
82
|
+
] = _artblocksRoyaltyAddress;
|
|
83
|
+
emit ArtblocksRoyaltyAddressForContractUpdated(
|
|
84
|
+
_tokenContract,
|
|
85
|
+
_artblocksRoyaltyAddress
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @notice Updates Art Blocks royalty payment BPS for `_tokenContract` to be
|
|
91
|
+
* `_bps`.
|
|
92
|
+
* @param _tokenContract Token contract to be updated.
|
|
93
|
+
* @param _bps Art Blocks royalty basis points.
|
|
94
|
+
* @dev `_bps` must be less than or equal to default bps
|
|
95
|
+
*/
|
|
96
|
+
function updateArtblocksBpsForContract(
|
|
97
|
+
address _tokenContract,
|
|
98
|
+
uint256 _bps
|
|
99
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
100
|
+
require(
|
|
101
|
+
_bps <= ARTBLOCKS_DEFAULT_BPS,
|
|
102
|
+
"override bps for contract must be less than or equal to default"
|
|
103
|
+
);
|
|
104
|
+
tokenAddressToArtblocksBpsOverride[_tokenContract] = BpsOverride(
|
|
105
|
+
true,
|
|
106
|
+
_bps
|
|
107
|
+
);
|
|
108
|
+
emit ArtblocksBpsForContractUpdated(_tokenContract, true, _bps);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @notice Clears any overrides of Art Blocks royalty payment BPS for
|
|
113
|
+
* `_tokenContract`.
|
|
114
|
+
* @param _tokenContract Token contract to be cleared.
|
|
115
|
+
* @dev token contracts without overrides use default BPS value.
|
|
116
|
+
*/
|
|
117
|
+
function clearArtblocksBpsForContract(
|
|
118
|
+
address _tokenContract
|
|
119
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
120
|
+
tokenAddressToArtblocksBpsOverride[_tokenContract] = BpsOverride(
|
|
121
|
+
false,
|
|
122
|
+
0
|
|
123
|
+
); // initial values
|
|
124
|
+
emit ArtblocksBpsForContractUpdated(_tokenContract, false, 0);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @notice Gets royalites of token ID `_tokenId` on token contract
|
|
129
|
+
* `_tokenAddress`.
|
|
130
|
+
* @param _tokenAddress Token contract to be queried.
|
|
131
|
+
* @param _tokenId Token ID to be queried.
|
|
132
|
+
* @return recipients_ array of royalty recipients
|
|
133
|
+
* @return bps array of basis points for each recipient, aligned by index
|
|
134
|
+
*/
|
|
135
|
+
function getRoyalties(
|
|
136
|
+
address _tokenAddress,
|
|
137
|
+
uint256 _tokenId
|
|
138
|
+
)
|
|
139
|
+
external
|
|
140
|
+
view
|
|
141
|
+
returns (address payable[] memory recipients_, uint256[] memory bps)
|
|
142
|
+
{
|
|
143
|
+
recipients_ = new address payable[](3);
|
|
144
|
+
bps = new uint256[](3);
|
|
145
|
+
// get standard royalty data for artist and additional payee
|
|
146
|
+
(
|
|
147
|
+
address artistAddress,
|
|
148
|
+
address additionalPayee,
|
|
149
|
+
uint256 additionalPayeePercentage,
|
|
150
|
+
uint256 royaltyFeeByID
|
|
151
|
+
) = IGenArt721CoreContractV3(_tokenAddress).getRoyaltyData(_tokenId);
|
|
152
|
+
// translate to desired output
|
|
153
|
+
recipients_[0] = payable(artistAddress);
|
|
154
|
+
bps[0] = (uint256(100) - additionalPayeePercentage) * royaltyFeeByID;
|
|
155
|
+
recipients_[1] = payable(additionalPayee);
|
|
156
|
+
bps[1] = additionalPayeePercentage * royaltyFeeByID;
|
|
157
|
+
// append art blocks royalty
|
|
158
|
+
require(
|
|
159
|
+
tokenAddressToArtblocksRoyaltyAddress[_tokenAddress] != address(0),
|
|
160
|
+
"Art Blocks royalty address must be defined for contract"
|
|
161
|
+
);
|
|
162
|
+
recipients_[2] = tokenAddressToArtblocksRoyaltyAddress[_tokenAddress];
|
|
163
|
+
bps[2] = tokenAddressToArtblocksBpsOverride[_tokenAddress].useOverride
|
|
164
|
+
? tokenAddressToArtblocksBpsOverride[_tokenAddress].bps
|
|
165
|
+
: ARTBLOCKS_DEFAULT_BPS;
|
|
166
|
+
return (recipients_, bps);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IArtblocksRoyaltyOverride.sol";
|
|
5
|
+
import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
|
|
6
|
+
|
|
7
|
+
import "@openzeppelin-4.5/contracts/utils/introspection/ERC165.sol";
|
|
8
|
+
|
|
9
|
+
pragma solidity 0.8.9;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @title Royalty Registry override for Art Blocks PBAB token contracts.
|
|
13
|
+
* @author Art Blocks Inc.
|
|
14
|
+
*/
|
|
15
|
+
contract GenArt721RoyaltyOverride_PBAB is ERC165, IArtblocksRoyaltyOverride {
|
|
16
|
+
/**
|
|
17
|
+
* @notice Platform royalty payment address for `contractAddress`
|
|
18
|
+
* updated to be `platformRoyaltyAddress`.
|
|
19
|
+
*/
|
|
20
|
+
event PlatformRoyaltyAddressForContractUpdated(
|
|
21
|
+
address indexed contractAddress,
|
|
22
|
+
address payable indexed platformRoyaltyAddress
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @notice Render provider royalty payment basis points for `tokenAddress`
|
|
27
|
+
* updated to be `bps` if `useOverride`, else updated to use default BPS.
|
|
28
|
+
*/
|
|
29
|
+
event RenderProviderBpsForContractUpdated(
|
|
30
|
+
address indexed tokenAddress,
|
|
31
|
+
bool indexed useOverride,
|
|
32
|
+
uint256 bps
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @notice Platform royalty payment basis points for
|
|
37
|
+
* `tokenAddress` updated to be `bps` if `useOverride`, else
|
|
38
|
+
* updated to use default BPS.
|
|
39
|
+
*/
|
|
40
|
+
event PlatformBpsForContractUpdated(
|
|
41
|
+
address indexed tokenAddress,
|
|
42
|
+
bool indexed useOverride,
|
|
43
|
+
uint256 bps
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
/// token contract => Platform royalty payment address
|
|
47
|
+
mapping(address => address payable)
|
|
48
|
+
public tokenAddressToPlatformRoyaltyAddress;
|
|
49
|
+
|
|
50
|
+
struct BpsOverride {
|
|
51
|
+
bool useOverride;
|
|
52
|
+
uint256 bps;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/// Default Render Provider royalty basis points if no BPS override is set.
|
|
56
|
+
uint256 public constant RENDER_PROVIDER_DEFAULT_BPS = 250; // 2.5 percent
|
|
57
|
+
/// Default Platform royalty basis points if no BPS override is set.
|
|
58
|
+
uint256 public constant PLATFORM_DEFAULT_BPS = 250; // 2.5 percent
|
|
59
|
+
/// token contract => if render provider bps override is set, and bps value.
|
|
60
|
+
mapping(address => BpsOverride)
|
|
61
|
+
public tokenAddressToRenderProviderBpsOverride;
|
|
62
|
+
/// token contract => if Platform bps override is set, and bps value.
|
|
63
|
+
mapping(address => BpsOverride) public tokenAddressToPlatformBpsOverride;
|
|
64
|
+
|
|
65
|
+
modifier onlyAdminOnContract(address _tokenContract) {
|
|
66
|
+
require(
|
|
67
|
+
IGenArt721CoreV2_PBAB(_tokenContract).admin() == msg.sender,
|
|
68
|
+
"Only core admin for specified token contract"
|
|
69
|
+
);
|
|
70
|
+
_;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @dev See {IERC165-supportsInterface}.
|
|
75
|
+
*/
|
|
76
|
+
function supportsInterface(
|
|
77
|
+
bytes4 interfaceId
|
|
78
|
+
) public view override(ERC165, IERC165) returns (bool) {
|
|
79
|
+
return
|
|
80
|
+
// register interface 0x9ca7dc7a - getRoyalties(address,uint256)
|
|
81
|
+
interfaceId == type(IArtblocksRoyaltyOverride).interfaceId ||
|
|
82
|
+
super.supportsInterface(interfaceId);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @notice Updates platform royalty payment address for `_tokenContract`
|
|
87
|
+
* to be `_platformRoyaltyAddress`.
|
|
88
|
+
* @param _tokenContract Token contract to be updated.
|
|
89
|
+
* @param _platformRoyaltyAddress Address to receive royalty payments.
|
|
90
|
+
*/
|
|
91
|
+
function updatePlatformRoyaltyAddressForContract(
|
|
92
|
+
address _tokenContract,
|
|
93
|
+
address payable _platformRoyaltyAddress
|
|
94
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
95
|
+
tokenAddressToPlatformRoyaltyAddress[
|
|
96
|
+
_tokenContract
|
|
97
|
+
] = _platformRoyaltyAddress;
|
|
98
|
+
emit PlatformRoyaltyAddressForContractUpdated(
|
|
99
|
+
_tokenContract,
|
|
100
|
+
_platformRoyaltyAddress
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @notice Updates render provider royalty payment BPS for `_tokenContract`
|
|
106
|
+
* to be `_bps`.
|
|
107
|
+
* @param _tokenContract Token contract to be updated.
|
|
108
|
+
* @param _bps Render provider royalty payment basis points.
|
|
109
|
+
*/
|
|
110
|
+
function updateRenderProviderBpsForContract(
|
|
111
|
+
address _tokenContract,
|
|
112
|
+
uint256 _bps
|
|
113
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
114
|
+
require(_bps <= 10000, "invalid bps");
|
|
115
|
+
tokenAddressToRenderProviderBpsOverride[_tokenContract] = BpsOverride(
|
|
116
|
+
true,
|
|
117
|
+
_bps
|
|
118
|
+
);
|
|
119
|
+
emit RenderProviderBpsForContractUpdated(_tokenContract, true, _bps);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @notice Updates platform royalty payment BPS for `_tokenContract` to be
|
|
124
|
+
* `_bps`.
|
|
125
|
+
* @param _tokenContract Token contract to be updated.
|
|
126
|
+
* @param _bps Platform royalty payment basis points.
|
|
127
|
+
*/
|
|
128
|
+
function updatePlatformBpsForContract(
|
|
129
|
+
address _tokenContract,
|
|
130
|
+
uint256 _bps
|
|
131
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
132
|
+
require(_bps <= 10000, "invalid bps");
|
|
133
|
+
tokenAddressToPlatformBpsOverride[_tokenContract] = BpsOverride(
|
|
134
|
+
true,
|
|
135
|
+
_bps
|
|
136
|
+
);
|
|
137
|
+
emit PlatformBpsForContractUpdated(_tokenContract, true, _bps);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @notice Clears any overrides of render provider royalty payment BPS
|
|
142
|
+
* for `_tokenContract`.
|
|
143
|
+
* @param _tokenContract Token contract to be cleared.
|
|
144
|
+
* @dev token contracts without overrides use default BPS value.
|
|
145
|
+
*/
|
|
146
|
+
function clearRenderProviderBpsForContract(
|
|
147
|
+
address _tokenContract
|
|
148
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
149
|
+
tokenAddressToRenderProviderBpsOverride[_tokenContract] = BpsOverride(
|
|
150
|
+
false,
|
|
151
|
+
0
|
|
152
|
+
); // initial values
|
|
153
|
+
emit RenderProviderBpsForContractUpdated(_tokenContract, false, 0);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @notice Clears any overrides of platform provider royalty payment BPS
|
|
158
|
+
* for `_tokenContract`.
|
|
159
|
+
* @param _tokenContract Token contract to be cleared.
|
|
160
|
+
* @dev token contracts without overrides use default BPS value.
|
|
161
|
+
*/
|
|
162
|
+
function clearPlatformBpsForContract(
|
|
163
|
+
address _tokenContract
|
|
164
|
+
) external onlyAdminOnContract(_tokenContract) {
|
|
165
|
+
tokenAddressToPlatformBpsOverride[_tokenContract] = BpsOverride(
|
|
166
|
+
false,
|
|
167
|
+
0
|
|
168
|
+
); // initial values
|
|
169
|
+
emit PlatformBpsForContractUpdated(_tokenContract, false, 0);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @notice Gets royalites of token ID `_tokenId` on token contract
|
|
174
|
+
* `_tokenAddress`.
|
|
175
|
+
* @param _tokenAddress Token contract to be queried.
|
|
176
|
+
* @param _tokenId Token ID to be queried.
|
|
177
|
+
* @return recipients_ array of royalty recipients
|
|
178
|
+
* @return bps array of basis points for each recipient, aligned by index
|
|
179
|
+
*/
|
|
180
|
+
function getRoyalties(
|
|
181
|
+
address _tokenAddress,
|
|
182
|
+
uint256 _tokenId
|
|
183
|
+
)
|
|
184
|
+
external
|
|
185
|
+
view
|
|
186
|
+
returns (address payable[] memory recipients_, uint256[] memory bps)
|
|
187
|
+
{
|
|
188
|
+
recipients_ = new address payable[](4);
|
|
189
|
+
bps = new uint256[](4);
|
|
190
|
+
// get standard royalty data for artist and additional payee
|
|
191
|
+
(
|
|
192
|
+
address artistAddress,
|
|
193
|
+
address additionalPayee,
|
|
194
|
+
uint256 additionalPayeePercentage,
|
|
195
|
+
uint256 royaltyFeeByID
|
|
196
|
+
) = IGenArt721CoreV2_PBAB(_tokenAddress).getRoyaltyData(_tokenId);
|
|
197
|
+
// translate to desired output
|
|
198
|
+
recipients_[0] = payable(artistAddress);
|
|
199
|
+
bps[0] = (uint256(100) - additionalPayeePercentage) * royaltyFeeByID;
|
|
200
|
+
recipients_[1] = payable(additionalPayee);
|
|
201
|
+
bps[1] = additionalPayeePercentage * royaltyFeeByID;
|
|
202
|
+
// append platform provider royalty
|
|
203
|
+
require(
|
|
204
|
+
tokenAddressToPlatformRoyaltyAddress[_tokenAddress] != address(0),
|
|
205
|
+
"Platform royalty address must be defined for contract"
|
|
206
|
+
);
|
|
207
|
+
recipients_[2] = tokenAddressToPlatformRoyaltyAddress[_tokenAddress];
|
|
208
|
+
bps[2] = tokenAddressToPlatformBpsOverride[_tokenAddress].useOverride
|
|
209
|
+
? tokenAddressToPlatformBpsOverride[_tokenAddress].bps
|
|
210
|
+
: PLATFORM_DEFAULT_BPS;
|
|
211
|
+
// append render provider royalty
|
|
212
|
+
recipients_[3] = payable(
|
|
213
|
+
IGenArt721CoreV2_PBAB(_tokenAddress).renderProviderAddress()
|
|
214
|
+
);
|
|
215
|
+
bps[3] = tokenAddressToRenderProviderBpsOverride[_tokenAddress]
|
|
216
|
+
.useOverride
|
|
217
|
+
? tokenAddressToRenderProviderBpsOverride[_tokenAddress].bps
|
|
218
|
+
: RENDER_PROVIDER_DEFAULT_BPS;
|
|
219
|
+
return (recipients_, bps);
|
|
220
|
+
}
|
|
221
|
+
}
|