@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,467 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
|
|
5
|
+
import "../interfaces/0.8.x/IBonusContract.sol";
|
|
6
|
+
|
|
7
|
+
import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol";
|
|
8
|
+
import "@openzeppelin-4.5/contracts/utils/Strings.sol";
|
|
9
|
+
import "@openzeppelin-4.5/contracts/interfaces/IERC20.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity 0.8.9;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Powered by Art Blocks minter contract that allows tokens to be
|
|
15
|
+
* minted with ETH or any ERC-20 token. Has ability to burn configured ERC-20
|
|
16
|
+
* tokens during purchase events to avoid re-use of tokens.
|
|
17
|
+
* @author Art Blocks Inc.
|
|
18
|
+
*/
|
|
19
|
+
contract GenArt721MinterBurner_PBAB is ReentrancyGuard {
|
|
20
|
+
/**
|
|
21
|
+
* @notice ERC-20 tokens at address `_ERC20Address` will be burned during
|
|
22
|
+
* purchases if `_doBurnDuringPurchase` is true, otherwise they will be
|
|
23
|
+
* distributed to the artist, additional payee, platform, and render
|
|
24
|
+
* provider.
|
|
25
|
+
*/
|
|
26
|
+
event BurnERC20DuringPurchaseSet(
|
|
27
|
+
address indexed _ERC20Address,
|
|
28
|
+
bool _doBurnDuringPurchase
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
/// PBAB core contract this minter may interact with.
|
|
32
|
+
IGenArt721CoreV2_PBAB public genArtCoreContract;
|
|
33
|
+
|
|
34
|
+
uint256 constant ONE_MILLION = 1_000_000;
|
|
35
|
+
|
|
36
|
+
address payable public ownerAddress;
|
|
37
|
+
uint256 public ownerPercentage;
|
|
38
|
+
|
|
39
|
+
mapping(uint256 => bool) public projectIdToBonus;
|
|
40
|
+
mapping(uint256 => address) public projectIdToBonusContractAddress;
|
|
41
|
+
mapping(uint256 => bool) public contractFilterProject;
|
|
42
|
+
mapping(address => mapping(uint256 => uint256)) public projectMintCounter;
|
|
43
|
+
mapping(uint256 => uint256) public projectMintLimit;
|
|
44
|
+
mapping(uint256 => bool) public projectMaxHasBeenInvoked;
|
|
45
|
+
mapping(uint256 => uint256) public projectMaxInvocations;
|
|
46
|
+
|
|
47
|
+
/// ERC20 address => burn during purchase
|
|
48
|
+
mapping(address => bool) public burnERC20DuringPurchase;
|
|
49
|
+
// don't rely on optional ERC20 burn() to burn tokens, send here instead
|
|
50
|
+
address internal constant ERC20_BURN_ADDRESS =
|
|
51
|
+
0x000000000000000000000000000000000000dEaD;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @notice Initializes contract to be a Minter for PBAB core contract at
|
|
55
|
+
* address `_genArt721Address`.
|
|
56
|
+
*/
|
|
57
|
+
constructor(address _genArt721Address) ReentrancyGuard() {
|
|
58
|
+
genArtCoreContract = IGenArt721CoreV2_PBAB(_genArt721Address);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @notice Gets your balance of the ERC-20 token currently set
|
|
63
|
+
* as the payment currency for project `_projectId`.
|
|
64
|
+
* @param _projectId Project ID to be queried.
|
|
65
|
+
* @return balance Balance of ERC-20
|
|
66
|
+
*/
|
|
67
|
+
function getYourBalanceOfProjectERC20(
|
|
68
|
+
uint256 _projectId
|
|
69
|
+
) public view returns (uint256) {
|
|
70
|
+
uint256 balance = IERC20(
|
|
71
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
72
|
+
).balanceOf(msg.sender);
|
|
73
|
+
return balance;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @notice Gets your allowance for this minter of the ERC-20
|
|
78
|
+
* token currently set as the payment currency for project
|
|
79
|
+
* `_projectId`.
|
|
80
|
+
* @param _projectId Project ID to be queried.
|
|
81
|
+
* @return remaining Remaining allowance of ERC-20
|
|
82
|
+
*/
|
|
83
|
+
function checkYourAllowanceOfProjectERC20(
|
|
84
|
+
uint256 _projectId
|
|
85
|
+
) public view returns (uint256) {
|
|
86
|
+
uint256 remaining = IERC20(
|
|
87
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
88
|
+
).allowance(msg.sender, address(this));
|
|
89
|
+
return remaining;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @notice Sets the mint limit of a single purchaser for project
|
|
94
|
+
* `_projectId` to `_limit`.
|
|
95
|
+
* @param _projectId Project ID to set the mint limit for.
|
|
96
|
+
* @param _limit Number of times a given address may mint the project's
|
|
97
|
+
* tokens.
|
|
98
|
+
*/
|
|
99
|
+
function setProjectMintLimit(uint256 _projectId, uint8 _limit) public {
|
|
100
|
+
require(
|
|
101
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
102
|
+
"can only be set by admin"
|
|
103
|
+
);
|
|
104
|
+
projectMintLimit[_projectId] = _limit;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @notice Configures the minter to either burn or distribute ERC-20 tokens
|
|
109
|
+
* during purchases. Default behavior is to not burn tokens.
|
|
110
|
+
* @param _ERC20Address Contract address of the ERC-20 token used to
|
|
111
|
+
* purchase.
|
|
112
|
+
* @param _doBurnDuringPurchase Burn the tokens during purchase if true,
|
|
113
|
+
* distribute to artist, additional payee, platform, and render provider
|
|
114
|
+
* if false.
|
|
115
|
+
*/
|
|
116
|
+
function setBurnERC20DuringPurchase(
|
|
117
|
+
address _ERC20Address,
|
|
118
|
+
bool _doBurnDuringPurchase
|
|
119
|
+
) public {
|
|
120
|
+
require(
|
|
121
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
122
|
+
"can only be set by admin"
|
|
123
|
+
);
|
|
124
|
+
burnERC20DuringPurchase[_ERC20Address] = _doBurnDuringPurchase;
|
|
125
|
+
emit BurnERC20DuringPurchaseSet(_ERC20Address, _doBurnDuringPurchase);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @notice Sets the maximum invocations of project `_projectId` based
|
|
130
|
+
* on the value currently defined in the core contract.
|
|
131
|
+
* @param _projectId Project ID to set the maximum invocations for.
|
|
132
|
+
* @dev also checks and may refresh projectMaxHasBeenInvoked for project
|
|
133
|
+
*/
|
|
134
|
+
function setProjectMaxInvocations(uint256 _projectId) public {
|
|
135
|
+
require(
|
|
136
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
137
|
+
"can only be set by admin"
|
|
138
|
+
);
|
|
139
|
+
uint256 maxInvocations;
|
|
140
|
+
uint256 invocations;
|
|
141
|
+
(, , invocations, maxInvocations, , , , , ) = genArtCoreContract
|
|
142
|
+
.projectTokenInfo(_projectId);
|
|
143
|
+
projectMaxInvocations[_projectId] = maxInvocations;
|
|
144
|
+
if (invocations < maxInvocations) {
|
|
145
|
+
projectMaxHasBeenInvoked[_projectId] = false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @notice Sets the owner address to `_ownerAddress`.
|
|
151
|
+
* @param _ownerAddress New owner address.
|
|
152
|
+
*/
|
|
153
|
+
function setOwnerAddress(address payable _ownerAddress) public {
|
|
154
|
+
require(
|
|
155
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
156
|
+
"can only be set by admin"
|
|
157
|
+
);
|
|
158
|
+
ownerAddress = _ownerAddress;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @notice Sets the owner mint revenue to `_ownerPercentage` percent.
|
|
163
|
+
* @param _ownerPercentage New owner percentage.
|
|
164
|
+
*/
|
|
165
|
+
function setOwnerPercentage(uint256 _ownerPercentage) public {
|
|
166
|
+
require(
|
|
167
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
168
|
+
"can only be set by admin"
|
|
169
|
+
);
|
|
170
|
+
ownerPercentage = _ownerPercentage;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* @notice Toggles if contracts are allowed to mint tokens for
|
|
175
|
+
* project `_projectId`.
|
|
176
|
+
* @param _projectId Project ID to be toggled.
|
|
177
|
+
*/
|
|
178
|
+
function toggleContractFilter(uint256 _projectId) public {
|
|
179
|
+
require(
|
|
180
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
181
|
+
"can only be set by admin"
|
|
182
|
+
);
|
|
183
|
+
contractFilterProject[_projectId] = !contractFilterProject[_projectId];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @notice Toggles if bonus contract for project `_projectId`.
|
|
188
|
+
* @param _projectId Project ID to be toggled.
|
|
189
|
+
*/
|
|
190
|
+
function artistToggleBonus(uint256 _projectId) public {
|
|
191
|
+
require(
|
|
192
|
+
msg.sender ==
|
|
193
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId),
|
|
194
|
+
"can only be set by artist"
|
|
195
|
+
);
|
|
196
|
+
projectIdToBonus[_projectId] = !projectIdToBonus[_projectId];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* @notice Sets bonus contract for project `_projectId` to
|
|
201
|
+
* `_bonusContractAddress`.
|
|
202
|
+
* @param _projectId Project ID to be toggled.
|
|
203
|
+
* @param _bonusContractAddress Bonus contract.
|
|
204
|
+
*/
|
|
205
|
+
function artistSetBonusContractAddress(
|
|
206
|
+
uint256 _projectId,
|
|
207
|
+
address _bonusContractAddress
|
|
208
|
+
) public {
|
|
209
|
+
require(
|
|
210
|
+
msg.sender ==
|
|
211
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId),
|
|
212
|
+
"can only be set by artist"
|
|
213
|
+
);
|
|
214
|
+
projectIdToBonusContractAddress[_projectId] = _bonusContractAddress;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @notice Purchases a token from project `_projectId`.
|
|
219
|
+
* @param _projectId Project ID to mint a token on.
|
|
220
|
+
* @return _tokenId Token ID of minted token
|
|
221
|
+
*/
|
|
222
|
+
function purchase(
|
|
223
|
+
uint256 _projectId
|
|
224
|
+
) public payable returns (uint256 _tokenId) {
|
|
225
|
+
return purchaseTo(msg.sender, _projectId);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* @notice Purchases a token from project `_projectId` and sets
|
|
230
|
+
* the token's owner to `_to`.
|
|
231
|
+
* @param _to Address to be the new token's owner.
|
|
232
|
+
* @param _projectId Project ID to mint a token on.
|
|
233
|
+
* @return _tokenId Token ID of minted token
|
|
234
|
+
*/
|
|
235
|
+
function purchaseTo(
|
|
236
|
+
address _to,
|
|
237
|
+
uint256 _projectId
|
|
238
|
+
) public payable nonReentrant returns (uint256 _tokenId) {
|
|
239
|
+
// CHECKS
|
|
240
|
+
require(
|
|
241
|
+
!projectMaxHasBeenInvoked[_projectId],
|
|
242
|
+
"Maximum number of invocations reached"
|
|
243
|
+
);
|
|
244
|
+
// if contract filter is active prevent calls from another contract
|
|
245
|
+
if (contractFilterProject[_projectId]) {
|
|
246
|
+
require(msg.sender == tx.origin, "No Contract Buys");
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// limit mints per address by project
|
|
250
|
+
if (projectMintLimit[_projectId] > 0) {
|
|
251
|
+
require(
|
|
252
|
+
projectMintCounter[msg.sender][_projectId] <
|
|
253
|
+
projectMintLimit[_projectId],
|
|
254
|
+
"Reached minting limit"
|
|
255
|
+
);
|
|
256
|
+
// EFFECTS
|
|
257
|
+
projectMintCounter[msg.sender][_projectId]++;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
uint256 tokenId = genArtCoreContract.mint(_to, _projectId, msg.sender);
|
|
261
|
+
|
|
262
|
+
// What if this overflows, since default value of uint256 is 0?
|
|
263
|
+
// That is intended, so that by default the minter allows infinite
|
|
264
|
+
// transactions, allowing the `genArtCoreContract` to stop minting
|
|
265
|
+
// `uint256 tokenInvocation = tokenId % ONE_MILLION;`
|
|
266
|
+
if (
|
|
267
|
+
projectMaxInvocations[_projectId] > 0 &&
|
|
268
|
+
tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1
|
|
269
|
+
) {
|
|
270
|
+
projectMaxHasBeenInvoked[_projectId] = true;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// INTERACTIONS
|
|
274
|
+
// bonus contract
|
|
275
|
+
if (projectIdToBonus[_projectId]) {
|
|
276
|
+
require(
|
|
277
|
+
IBonusContract(projectIdToBonusContractAddress[_projectId])
|
|
278
|
+
.bonusIsActive(),
|
|
279
|
+
"bonus must be active"
|
|
280
|
+
);
|
|
281
|
+
IBonusContract(projectIdToBonusContractAddress[_projectId])
|
|
282
|
+
.triggerBonus(msg.sender);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// validate and split funds
|
|
286
|
+
if (
|
|
287
|
+
keccak256(
|
|
288
|
+
abi.encodePacked(
|
|
289
|
+
genArtCoreContract.projectIdToCurrencySymbol(_projectId)
|
|
290
|
+
)
|
|
291
|
+
) != keccak256(abi.encodePacked("ETH"))
|
|
292
|
+
) {
|
|
293
|
+
require(
|
|
294
|
+
msg.value == 0,
|
|
295
|
+
"this project accepts a different currency and cannot accept ETH"
|
|
296
|
+
);
|
|
297
|
+
require(
|
|
298
|
+
IERC20(
|
|
299
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
300
|
+
).allowance(msg.sender, address(this)) >=
|
|
301
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(
|
|
302
|
+
_projectId
|
|
303
|
+
),
|
|
304
|
+
"Insufficient Funds Approved for TX"
|
|
305
|
+
);
|
|
306
|
+
require(
|
|
307
|
+
IERC20(
|
|
308
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
309
|
+
).balanceOf(msg.sender) >=
|
|
310
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(
|
|
311
|
+
_projectId
|
|
312
|
+
),
|
|
313
|
+
"Insufficient balance."
|
|
314
|
+
);
|
|
315
|
+
_splitFundsERC20(_projectId);
|
|
316
|
+
} else {
|
|
317
|
+
require(
|
|
318
|
+
msg.value >=
|
|
319
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(
|
|
320
|
+
_projectId
|
|
321
|
+
),
|
|
322
|
+
"Must send minimum value to mint!"
|
|
323
|
+
);
|
|
324
|
+
_splitFundsETH(_projectId);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return tokenId;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* @dev splits ETH funds between sender (if refund), foundation,
|
|
332
|
+
* artist, and artist's additional payee for a token purchased on
|
|
333
|
+
* project `_projectId`.
|
|
334
|
+
* @dev utilizes transfer() to send ETH, so access lists may need to be
|
|
335
|
+
* populated when purchasing tokens.
|
|
336
|
+
*/
|
|
337
|
+
function _splitFundsETH(uint256 _projectId) internal {
|
|
338
|
+
if (msg.value > 0) {
|
|
339
|
+
uint256 pricePerTokenInWei = genArtCoreContract
|
|
340
|
+
.projectIdToPricePerTokenInWei(_projectId);
|
|
341
|
+
uint256 refund = msg.value -
|
|
342
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(_projectId);
|
|
343
|
+
if (refund > 0) {
|
|
344
|
+
(bool success_, ) = msg.sender.call{value: refund}("");
|
|
345
|
+
require(success_, "Refund failed");
|
|
346
|
+
}
|
|
347
|
+
uint256 renderProviderAmount = (pricePerTokenInWei *
|
|
348
|
+
genArtCoreContract.renderProviderPercentage()) / 100;
|
|
349
|
+
if (renderProviderAmount > 0) {
|
|
350
|
+
(bool success_, ) = genArtCoreContract
|
|
351
|
+
.renderProviderAddress()
|
|
352
|
+
.call{value: renderProviderAmount}("");
|
|
353
|
+
require(success_, "Renderer payment failed");
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
|
|
357
|
+
|
|
358
|
+
uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
|
|
359
|
+
if (ownerFunds > 0) {
|
|
360
|
+
(bool success_, ) = ownerAddress.call{value: ownerFunds}("");
|
|
361
|
+
require(success_, "Owner payment failed");
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
uint256 projectFunds = pricePerTokenInWei -
|
|
365
|
+
renderProviderAmount -
|
|
366
|
+
ownerFunds;
|
|
367
|
+
uint256 additionalPayeeAmount;
|
|
368
|
+
if (
|
|
369
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
370
|
+
_projectId
|
|
371
|
+
) > 0
|
|
372
|
+
) {
|
|
373
|
+
additionalPayeeAmount =
|
|
374
|
+
(projectFunds *
|
|
375
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
376
|
+
_projectId
|
|
377
|
+
)) /
|
|
378
|
+
100;
|
|
379
|
+
if (additionalPayeeAmount > 0) {
|
|
380
|
+
(bool success_, ) = genArtCoreContract
|
|
381
|
+
.projectIdToAdditionalPayee(_projectId)
|
|
382
|
+
.call{value: additionalPayeeAmount}("");
|
|
383
|
+
require(success_, "Additional payment failed");
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
uint256 creatorFunds = projectFunds - additionalPayeeAmount;
|
|
387
|
+
if (creatorFunds > 0) {
|
|
388
|
+
(bool success_, ) = genArtCoreContract
|
|
389
|
+
.projectIdToArtistAddress(_projectId)
|
|
390
|
+
.call{value: creatorFunds}("");
|
|
391
|
+
require(success_, "Artist payment failed");
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* @dev splits ERC-20 funds between render provider, owner, artist, and
|
|
398
|
+
* artist's additional payee, for a token purchased on project
|
|
399
|
+
`_projectId`.
|
|
400
|
+
*/
|
|
401
|
+
function _splitFundsERC20(uint256 _projectId) internal {
|
|
402
|
+
uint256 pricePerTokenInWei = genArtCoreContract
|
|
403
|
+
.projectIdToPricePerTokenInWei(_projectId);
|
|
404
|
+
address _tokenAddress = genArtCoreContract.projectIdToCurrencyAddress(
|
|
405
|
+
_projectId
|
|
406
|
+
);
|
|
407
|
+
if (burnERC20DuringPurchase[_tokenAddress]) {
|
|
408
|
+
IERC20(_tokenAddress).transferFrom(
|
|
409
|
+
msg.sender,
|
|
410
|
+
ERC20_BURN_ADDRESS,
|
|
411
|
+
pricePerTokenInWei
|
|
412
|
+
);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
uint256 renderProviderAmount = (pricePerTokenInWei *
|
|
416
|
+
genArtCoreContract.renderProviderPercentage()) / 100;
|
|
417
|
+
if (renderProviderAmount > 0) {
|
|
418
|
+
IERC20(_tokenAddress).transferFrom(
|
|
419
|
+
msg.sender,
|
|
420
|
+
genArtCoreContract.renderProviderAddress(),
|
|
421
|
+
renderProviderAmount
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
|
|
425
|
+
|
|
426
|
+
uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
|
|
427
|
+
if (ownerFunds > 0) {
|
|
428
|
+
IERC20(_tokenAddress).transferFrom(
|
|
429
|
+
msg.sender,
|
|
430
|
+
ownerAddress,
|
|
431
|
+
ownerFunds
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
uint256 projectFunds = pricePerTokenInWei -
|
|
436
|
+
renderProviderAmount -
|
|
437
|
+
ownerFunds;
|
|
438
|
+
uint256 additionalPayeeAmount;
|
|
439
|
+
if (
|
|
440
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
441
|
+
_projectId
|
|
442
|
+
) > 0
|
|
443
|
+
) {
|
|
444
|
+
additionalPayeeAmount =
|
|
445
|
+
(projectFunds *
|
|
446
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
447
|
+
_projectId
|
|
448
|
+
)) /
|
|
449
|
+
100;
|
|
450
|
+
if (additionalPayeeAmount > 0) {
|
|
451
|
+
IERC20(_tokenAddress).transferFrom(
|
|
452
|
+
msg.sender,
|
|
453
|
+
genArtCoreContract.projectIdToAdditionalPayee(_projectId),
|
|
454
|
+
additionalPayeeAmount
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
uint256 creatorFunds = projectFunds - additionalPayeeAmount;
|
|
459
|
+
if (creatorFunds > 0) {
|
|
460
|
+
IERC20(_tokenAddress).transferFrom(
|
|
461
|
+
msg.sender,
|
|
462
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId),
|
|
463
|
+
creatorFunds
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|