@artblocks/contracts 0.0.1 → 1.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.
Files changed (138) hide show
  1. package/README.md +30 -11
  2. package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
  3. package/artifacts/contracts/BasicPolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
  4. package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +3 -3
  5. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +2 -2
  6. package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +2 -2
  7. package/artifacts/contracts/archive/GenArt721CoreV0.sol/Address.json +10 -0
  8. package/artifacts/contracts/archive/GenArt721CoreV0.sol/Counters.json +10 -0
  9. package/artifacts/contracts/archive/GenArt721CoreV0.sol/CustomERC721Metadata.json +425 -0
  10. package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC165.json +38 -0
  11. package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC721.json +322 -0
  12. package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC721Enumerable.json +384 -0
  13. package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC721ReceiverMock.json +101 -0
  14. package/artifacts/contracts/archive/GenArt721CoreV0.sol/GenArt721.json +1528 -0
  15. package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC165.json +32 -0
  16. package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC721.json +316 -0
  17. package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC721Enumerable.json +378 -0
  18. package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC721Receiver.json +47 -0
  19. package/artifacts/contracts/archive/GenArt721CoreV0.sol/SafeMath.json +10 -0
  20. package/artifacts/contracts/archive/GenArt721CoreV0.sol/Strings.json +10 -0
  21. package/artifacts/contracts/archive/GenArt721CoreV1.sol/Address.json +10 -0
  22. package/artifacts/contracts/archive/GenArt721CoreV1.sol/Counters.json +10 -0
  23. package/artifacts/contracts/archive/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
  24. package/artifacts/contracts/archive/GenArt721CoreV1.sol/ERC165.json +38 -0
  25. package/artifacts/contracts/archive/GenArt721CoreV1.sol/ERC721.json +322 -0
  26. package/artifacts/contracts/archive/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
  27. package/artifacts/contracts/archive/GenArt721CoreV1.sol/GenArt721Core.json +1773 -0
  28. package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC165.json +32 -0
  29. package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC721.json +316 -0
  30. package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
  31. package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
  32. package/artifacts/contracts/archive/GenArt721CoreV1.sol/Randomizer.json +26 -0
  33. package/artifacts/contracts/archive/GenArt721CoreV1.sol/SafeMath.json +10 -0
  34. package/artifacts/contracts/archive/GenArt721CoreV1.sol/Strings.json +10 -0
  35. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol/MinterDAExpV0.json +575 -0
  36. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol/MinterDAExpV1.json +463 -0
  37. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +3 -3
  38. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +3 -3
  39. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +15 -15
  40. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +1066 -0
  41. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol/MinterDALinV0.json +551 -0
  42. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol/MinterDALinV1.json +439 -0
  43. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +3 -3
  44. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +3 -3
  45. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol/MinterHolderV0.json +622 -0
  46. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +719 -0
  47. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
  48. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +3 -3
  49. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol/MinterMerkleV0.json +873 -0
  50. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +932 -0
  51. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +984 -0
  52. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +3 -3
  53. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +3 -3
  54. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol/MinterSetPriceV0.json +400 -0
  55. package/artifacts/contracts/{minter-suite/Minters/MinterSetPrice/deprecated → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV1.sol/MinterSetPriceV1.json +3 -3
  56. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +3 -3
  57. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +3 -3
  58. package/artifacts/contracts/{minter-suite/Minters/MinterSetPriceERC20/deprecated → archive/minter-suite/Minters/MinterSetPriceERC20}/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +3 -3
  59. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.json +349 -0
  60. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +3 -3
  61. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +3 -3
  62. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +2 -2
  63. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +12 -12
  64. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +767 -0
  65. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlement_Mixin.sol/IFilteredMinterDAExpSettlement_Mixin.json +161 -0
  66. package/artifacts/contracts/interfaces/0.8.x/IMinterBaseV0.sol/IMinterBaseV0.json +24 -0
  67. package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +6 -0
  68. package/artifacts/contracts/interfaces/0.8.x/IMintingAPICoreV0.sol/IMintingAPICoreV0.json +185 -0
  69. package/artifacts/contracts/interfaces/0.8.x/IMintingAPIMinterV0.sol/IMintingAPIMinterV0.json +88 -0
  70. package/artifacts/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol/IRandomizerPolyptychV0.json +87 -0
  71. package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +1 -1
  72. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +8 -2
  73. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +34 -2
  74. package/artifacts/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol/MinterBase.json +24 -0
  75. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +1127 -0
  76. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +882 -0
  77. package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +858 -0
  78. package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +1126 -0
  79. package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +1065 -0
  80. package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +662 -0
  81. package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +1268 -0
  82. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +768 -0
  83. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +697 -0
  84. package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +1817 -0
  85. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +3 -3
  86. package/contracts/BasicPolyptychRandomizerV0.sol +126 -0
  87. package/contracts/BasicRandomizerV2.sol +3 -3
  88. package/contracts/archive/GenArt721CoreV0.sol +1621 -0
  89. package/contracts/archive/GenArt721CoreV1.sol +1577 -0
  90. package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol +503 -0
  91. package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol +442 -0
  92. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV2.sol +3 -3
  93. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV3.sol +3 -3
  94. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +3 -3
  95. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +1026 -0
  96. package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol +450 -0
  97. package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol +406 -0
  98. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV2.sol +3 -3
  99. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV3.sol +3 -3
  100. package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol +540 -0
  101. package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol +648 -0
  102. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterHolder/MinterHolderV2.sol +6 -6
  103. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterHolder/MinterHolderV3.sol +4 -4
  104. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol +523 -0
  105. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol +602 -0
  106. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol +679 -0
  107. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV3.sol +4 -4
  108. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV4.sol +4 -4
  109. package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol +333 -0
  110. package/contracts/{minter-suite/Minters/MinterSetPrice/deprecated → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV1.sol +0 -0
  111. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV2.sol +3 -3
  112. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV3.sol +3 -3
  113. package/contracts/{minter-suite/Minters/MinterSetPriceERC20/deprecated → archive/minter-suite/Minters/MinterSetPriceERC20}/MinterSetPriceERC20V0.sol +0 -0
  114. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol +411 -0
  115. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +3 -3
  116. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +3 -3
  117. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +4 -53
  118. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol +21 -0
  119. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlement_Mixin.sol +62 -0
  120. package/contracts/interfaces/0.8.x/IMinterBaseV0.sol +20 -0
  121. package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +6 -0
  122. package/contracts/interfaces/0.8.x/IMintingAPICoreV0.sol +62 -0
  123. package/contracts/interfaces/0.8.x/IMintingAPIMinterV0.sol +31 -0
  124. package/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol +31 -0
  125. package/contracts/interfaces/0.8.x/IRandomizerV2.sol +5 -2
  126. package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +18 -0
  127. package/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol +293 -0
  128. package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +1312 -0
  129. package/contracts/minter-suite/Minters/MinterDAExpV4.sol +600 -0
  130. package/contracts/minter-suite/Minters/MinterDALinV4.sol +552 -0
  131. package/contracts/minter-suite/Minters/MinterHolderV4.sol +781 -0
  132. package/contracts/minter-suite/Minters/MinterMerkleV5.sol +717 -0
  133. package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +998 -0
  134. package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +480 -0
  135. package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +380 -0
  136. package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +1979 -0
  137. package/package.json +8 -2
  138. package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +0 -794
@@ -0,0 +1,62 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ /* Provides an interface definition for compatibility with the Minting API.
7
+ *
8
+ * In order for a core contract to be compatible with the REST API provided
9
+ * at https://minting-api.artblocks.io/ it must implement the interface defined
10
+ * below.
11
+ */
12
+ interface IMintingAPICoreV0 {
13
+ /**
14
+ * @notice Token ID `_tokenId` minted on project ID `_projectId` to `_to`.
15
+ */
16
+ event Mint(
17
+ address indexed _to,
18
+ uint256 indexed _tokenId,
19
+ uint256 indexed _projectId
20
+ );
21
+
22
+ // getter function of public variable
23
+ function nextProjectId() external view returns (uint256);
24
+
25
+ function projectDetails(
26
+ uint256 _projectId
27
+ )
28
+ external
29
+ view
30
+ returns (
31
+ string memory projectName,
32
+ string memory artist,
33
+ string memory description,
34
+ string memory website,
35
+ string memory license
36
+ );
37
+
38
+ function projectIdToPricePerTokenInWei(
39
+ uint256 _projectId
40
+ ) external view returns (uint256);
41
+
42
+ function projectTokenInfo(
43
+ uint256 _projectId
44
+ )
45
+ external
46
+ view
47
+ returns (
48
+ address,
49
+ uint256,
50
+ uint256,
51
+ uint256,
52
+ bool,
53
+ address,
54
+ uint256,
55
+ string memory,
56
+ address
57
+ );
58
+
59
+ function tokensOfOwner(
60
+ address owner
61
+ ) external view returns (uint256[] memory);
62
+ }
@@ -0,0 +1,31 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ /* Provides an interface definition for compatibility with the Minting API.
7
+ *
8
+ * In order for a minter contract to be compatible with the REST API provided
9
+ * at https://minting-api.artblocks.io/ it must implement the interface defined
10
+ * below.
11
+ */
12
+ interface IMintingAPIMinterV0 {
13
+ function projectMaxHasBeenInvoked(uint256) external returns (bool);
14
+
15
+ function purchaseTo(
16
+ address _to,
17
+ uint256 _projectId
18
+ ) external returns (uint256 _tokenId);
19
+
20
+ function getPriceInfo(
21
+ uint256 _projectId
22
+ )
23
+ external
24
+ view
25
+ returns (
26
+ bool isConfigured,
27
+ uint256 tokenPriceInWei,
28
+ string memory currencySymbol,
29
+ address currencyAddress
30
+ );
31
+ }
@@ -0,0 +1,31 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Creatd By: Art Blocks Inc.
3
+
4
+ pragma solidity 0.8.17;
5
+
6
+ import "./IRandomizerV2.sol";
7
+
8
+ interface IRandomizerPolyptychV0 is IRandomizerV2 {
9
+ /**
10
+ * @notice Minter contract at `_contractAddress` allowed to assign token hash seeds.
11
+ */
12
+ event HashSeedSetterUpdated(address indexed _contractAddress);
13
+
14
+ /**
15
+ * @notice Project with ID `_projectId` is enabled/disabled for polyptych minting.
16
+ */
17
+ event ProjectIsPolyptychUpdated(uint256 _projectId, bool _isPolyptych);
18
+
19
+ /**
20
+ * @notice When a core contract calls this, it can be assured that the randomizer
21
+ * will set a bytes32 hash for tokenId `_tokenId` on the core contract. This function
22
+ * may only be called by the contract configured as the `hashSeedSetterContract` via
23
+ * the `setHashSeedSetterContract` available to the core contract admin.
24
+ */
25
+ function assignTokenHash(uint256 _tokenId) external;
26
+
27
+ /**
28
+ * @notice Store the token hash seed for an existing token to be re-used in a polyptych panel.
29
+ */
30
+ function setPolyptychHashSeed(uint256 _tokenId, bytes12 _hashSeed) external;
31
+ }
@@ -3,11 +3,14 @@
3
3
 
4
4
  pragma solidity ^0.8.0;
5
5
 
6
- import "./IGenArt721CoreContractV3.sol";
6
+ import "./IGenArt721CoreContractV3_Base.sol";
7
7
 
8
8
  interface IRandomizerV2 {
9
9
  // The core contract that may interact with this randomizer contract.
10
- function genArt721Core() external view returns (IGenArt721CoreContractV3);
10
+ function genArt721Core()
11
+ external
12
+ view
13
+ returns (IGenArt721CoreContractV3_Base);
11
14
 
12
15
  // When a core contract calls this, it can be assured that the randomizer
13
16
  // will set a bytes32 hash for tokenId `_tokenId` on the core contract.
@@ -6,6 +6,8 @@ import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
6
6
  import "../../interfaces/0.8.x/IAdminACLV0.sol";
7
7
  import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
8
8
 
9
+ import "../../libs/0.8.x/Bytes32Strings.sol";
10
+
9
11
  import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
10
12
 
11
13
  pragma solidity 0.8.17;
@@ -39,6 +41,21 @@ pragma solidity 0.8.17;
39
41
  contract MinterFilterV1 is IMinterFilterV0 {
40
42
  // add Enumerable Map methods
41
43
  using EnumerableMap for EnumerableMap.UintToAddressMap;
44
+ // add Bytes32Strings methods
45
+ using Bytes32Strings for bytes32;
46
+
47
+ /// version & type of this core contract
48
+ bytes32 constant MINTER_FILTER_VERSION = "v1.0.1";
49
+
50
+ function minterFilterVersion() external pure returns (string memory) {
51
+ return MINTER_FILTER_VERSION.toString();
52
+ }
53
+
54
+ bytes32 constant MINTER_FILTER_TYPE = "MinterFilterV1";
55
+
56
+ function minterFilterType() external pure returns (string memory) {
57
+ return MINTER_FILTER_TYPE.toString();
58
+ }
42
59
 
43
60
  /// Core contract address this minter interacts with
44
61
  address public immutable genArt721CoreAddress;
@@ -106,6 +123,7 @@ contract MinterFilterV1 is IMinterFilterV0 {
106
123
  ) onlyNonZeroAddress(_genArt721Address) {
107
124
  genArt721CoreAddress = _genArt721Address;
108
125
  genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address);
126
+ emit Deployed();
109
127
  }
110
128
 
111
129
  /**
@@ -0,0 +1,293 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../../interfaces/0.8.x/IMinterBaseV0.sol";
5
+ import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol";
6
+ import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
7
+ import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol";
8
+
9
+ import "@openzeppelin-4.7/contracts/token/ERC20/IERC20.sol";
10
+
11
+ pragma solidity ^0.8.0;
12
+
13
+ /**
14
+ * @title Art Blocks Minter Base Class
15
+ * @notice A base class for Art Blocks minter contracts that provides common
16
+ * functionality used across minter contracts.
17
+ * This contract is not intended to be deployed directly, but rather to be
18
+ * inherited by other minter contracts.
19
+ * From a design perspective, this contract is intended to remain simple and
20
+ * easy to understand. It is not intended to cause a complex inheritance tree,
21
+ * and instead should keep minter contracts as readable as possible for
22
+ * collectors and developers.
23
+ * @dev Semantic versioning is used in the solidity file name, and is therefore
24
+ * controlled by contracts importing the appropriate filename version.
25
+ * @author Art Blocks Inc.
26
+ */
27
+ abstract contract MinterBase is IMinterBaseV0 {
28
+ /// state variable that tracks whether this contract's associated core
29
+ /// contract is an Engine contract, where Engine contracts have an
30
+ /// additional revenue split for the platform provider
31
+ bool public immutable isEngine;
32
+
33
+ // @dev we do not track an initialization state, as the only state variable
34
+ // is immutable, which the compiler enforces to be assigned during
35
+ // construction.
36
+
37
+ /**
38
+ * @notice Initializes contract to ensure state variable `isEngine` is set
39
+ * appropriately based on the minter's associated core contract address.
40
+ * @param genArt721Address Art Blocks core contract address for
41
+ * which this contract will be a minter.
42
+ */
43
+ constructor(address genArt721Address) {
44
+ // set state variable isEngine
45
+ isEngine = _getV3CoreIsEngine(genArt721Address);
46
+ }
47
+
48
+ /**
49
+ * @notice splits ETH funds between sender (if refund), providers,
50
+ * artist, and artist's additional payee for a token purchased on
51
+ * project `_projectId`.
52
+ * WARNING: This function uses msg.value and msg.sender to determine
53
+ * refund amounts, and therefore may not be applicable to all use cases
54
+ * (e.g. do not use with Dutch Auctions with on-chain settlement).
55
+ * @dev possible DoS during splits is acknowledged, and mitigated by
56
+ * business practices, including end-to-end testing on mainnet, and
57
+ * admin-accepted artist payment addresses.
58
+ * @param projectId Project ID for which funds shall be split.
59
+ * @param pricePerTokenInWei Current price of token, in Wei.
60
+ */
61
+ function splitFundsETH(
62
+ uint256 projectId,
63
+ uint256 pricePerTokenInWei,
64
+ address genArt721CoreAddress
65
+ ) internal {
66
+ if (msg.value > 0) {
67
+ bool success_;
68
+ // send refund to sender
69
+ uint256 refund = msg.value - pricePerTokenInWei;
70
+ if (refund > 0) {
71
+ (success_, ) = msg.sender.call{value: refund}("");
72
+ require(success_, "Refund failed");
73
+ }
74
+ // split revenues
75
+ splitRevenuesETH(
76
+ projectId,
77
+ pricePerTokenInWei,
78
+ genArt721CoreAddress
79
+ );
80
+ }
81
+ }
82
+
83
+ /**
84
+ * @notice splits ETH revenues between providers, artist, and artist's
85
+ * additional payee for revenue generated by project `_projectId`.
86
+ * @dev possible DoS during splits is acknowledged, and mitigated by
87
+ * business practices, including end-to-end testing on mainnet, and
88
+ * admin-accepted artist payment addresses.
89
+ * @param projectId Project ID for which funds shall be split.
90
+ * @param valueInWei Value to be split, in Wei.
91
+ */
92
+ function splitRevenuesETH(
93
+ uint256 projectId,
94
+ uint256 valueInWei,
95
+ address genArtCoreContract
96
+ ) internal {
97
+ if (valueInWei <= 0) {
98
+ return; // return early
99
+ }
100
+ bool success;
101
+ // split funds between platforms, artist, and artist's
102
+ // additional payee
103
+ uint256 renderProviderRevenue_;
104
+ address payable renderProviderAddress_;
105
+ uint256 artistRevenue_;
106
+ address payable artistAddress_;
107
+ uint256 additionalPayeePrimaryRevenue_;
108
+ address payable additionalPayeePrimaryAddress_;
109
+ if (isEngine) {
110
+ // get engine splits
111
+ uint256 platformProviderRevenue_;
112
+ address payable platformProviderAddress_;
113
+ (
114
+ renderProviderRevenue_,
115
+ renderProviderAddress_,
116
+ platformProviderRevenue_,
117
+ platformProviderAddress_,
118
+ artistRevenue_,
119
+ artistAddress_,
120
+ additionalPayeePrimaryRevenue_,
121
+ additionalPayeePrimaryAddress_
122
+ ) = IGenArt721CoreContractV3_Engine(genArtCoreContract)
123
+ .getPrimaryRevenueSplits(projectId, valueInWei);
124
+ // Platform Provider payment (only possible if engine)
125
+ if (platformProviderRevenue_ > 0) {
126
+ (success, ) = platformProviderAddress_.call{
127
+ value: platformProviderRevenue_
128
+ }("");
129
+ require(success, "Platform Provider payment failed");
130
+ }
131
+ } else {
132
+ // get flagship splits
133
+ (
134
+ renderProviderRevenue_, // artblocks revenue
135
+ renderProviderAddress_, // artblocks address
136
+ artistRevenue_,
137
+ artistAddress_,
138
+ additionalPayeePrimaryRevenue_,
139
+ additionalPayeePrimaryAddress_
140
+ ) = IGenArt721CoreContractV3(genArtCoreContract)
141
+ .getPrimaryRevenueSplits(projectId, valueInWei);
142
+ }
143
+ // Render Provider / Art Blocks payment
144
+ if (renderProviderRevenue_ > 0) {
145
+ (success, ) = renderProviderAddress_.call{
146
+ value: renderProviderRevenue_
147
+ }("");
148
+ require(success, "Render Provider payment failed");
149
+ }
150
+ // artist payment
151
+ if (artistRevenue_ > 0) {
152
+ (success, ) = artistAddress_.call{value: artistRevenue_}("");
153
+ require(success, "Artist payment failed");
154
+ }
155
+ // additional payee payment
156
+ if (additionalPayeePrimaryRevenue_ > 0) {
157
+ (success, ) = additionalPayeePrimaryAddress_.call{
158
+ value: additionalPayeePrimaryRevenue_
159
+ }("");
160
+ require(success, "Additional Payee payment failed");
161
+ }
162
+ }
163
+
164
+ /**
165
+ * @notice splits ERC-20 funds between providers, artist, and artist's
166
+ * additional payee, for a token purchased on project `_projectId`.
167
+ * @dev possible DoS during splits is acknowledged, and mitigated by
168
+ * business practices, including end-to-end testing on mainnet, and
169
+ * admin-accepted artist payment addresses.
170
+ */
171
+ function splitFundsERC20(
172
+ uint256 projectId,
173
+ uint256 pricePerTokenInWei,
174
+ address currencyAddress,
175
+ address genArtCoreContract
176
+ ) internal {
177
+ IERC20 _projectCurrency = IERC20(currencyAddress);
178
+ // split remaining funds between foundation, artist, and artist's
179
+ // additional payee
180
+ uint256 renderProviderRevenue_;
181
+ address payable renderProviderAddress_;
182
+ uint256 artistRevenue_;
183
+ address payable artistAddress_;
184
+ uint256 additionalPayeePrimaryRevenue_;
185
+ address payable additionalPayeePrimaryAddress_;
186
+ if (isEngine) {
187
+ // get engine splits
188
+ uint256 platformProviderRevenue_;
189
+ address payable platformProviderAddress_;
190
+ (
191
+ renderProviderRevenue_,
192
+ renderProviderAddress_,
193
+ platformProviderRevenue_,
194
+ platformProviderAddress_,
195
+ artistRevenue_,
196
+ artistAddress_,
197
+ additionalPayeePrimaryRevenue_,
198
+ additionalPayeePrimaryAddress_
199
+ ) = IGenArt721CoreContractV3_Engine(genArtCoreContract)
200
+ .getPrimaryRevenueSplits(projectId, pricePerTokenInWei);
201
+ // Platform Provider payment (only possible if engine)
202
+ if (platformProviderRevenue_ > 0) {
203
+ _projectCurrency.transferFrom(
204
+ msg.sender,
205
+ platformProviderAddress_,
206
+ platformProviderRevenue_
207
+ );
208
+ }
209
+ } else {
210
+ // get flagship splits
211
+ (
212
+ renderProviderRevenue_, // artblocks revenue
213
+ renderProviderAddress_, // artblocks address
214
+ artistRevenue_,
215
+ artistAddress_,
216
+ additionalPayeePrimaryRevenue_,
217
+ additionalPayeePrimaryAddress_
218
+ ) = IGenArt721CoreContractV3(genArtCoreContract)
219
+ .getPrimaryRevenueSplits(projectId, pricePerTokenInWei);
220
+ }
221
+ // Art Blocks payment
222
+ if (renderProviderRevenue_ > 0) {
223
+ _projectCurrency.transferFrom(
224
+ msg.sender,
225
+ renderProviderAddress_,
226
+ renderProviderRevenue_
227
+ );
228
+ }
229
+ // artist payment
230
+ if (artistRevenue_ > 0) {
231
+ _projectCurrency.transferFrom(
232
+ msg.sender,
233
+ artistAddress_,
234
+ artistRevenue_
235
+ );
236
+ }
237
+ // additional payee payment
238
+ if (additionalPayeePrimaryRevenue_ > 0) {
239
+ _projectCurrency.transferFrom(
240
+ msg.sender,
241
+ additionalPayeePrimaryAddress_,
242
+ additionalPayeePrimaryRevenue_
243
+ );
244
+ }
245
+ }
246
+
247
+ /**
248
+ * @notice Returns whether a V3 core contract is an Art Blocks Engine
249
+ * contract or not. Return value of false indicates that the core is a
250
+ * flagship contract.
251
+ * @dev this function reverts if a core contract does not return the
252
+ * expected number of return values from getPrimaryRevenueSplits() for
253
+ * either a flagship or engine core contract.
254
+ * @dev this function uses the length of the return data (in bytes) to
255
+ * determine whether the core is an engine or not.
256
+ * @param genArt721CoreV3 The address of the deployed core contract.
257
+ */
258
+ function _getV3CoreIsEngine(
259
+ address genArt721CoreV3
260
+ ) private returns (bool) {
261
+ // call getPrimaryRevenueSplits() on core contract
262
+ bytes memory payload = abi.encodeWithSignature(
263
+ "getPrimaryRevenueSplits(uint256,uint256)",
264
+ 0,
265
+ 0
266
+ );
267
+ (bool success, bytes memory returnData) = genArt721CoreV3.call(payload);
268
+ require(success, "getPrimaryRevenueSplits() call failed");
269
+ // determine whether core is engine or not, based on return data length
270
+ uint256 returnDataLength = returnData.length;
271
+ if (returnDataLength == 6 * 32) {
272
+ // 6 32-byte words returned if flagship (not engine)
273
+ // @dev 6 32-byte words are expected because the non-engine core
274
+ // contracts return a payout address and uint256 payment value for
275
+ // the artist, and artist's additional payee, and Art Blocks.
276
+ // also note that per Solidity ABI encoding, the address return
277
+ // values are padded to 32 bytes.
278
+ return false;
279
+ } else if (returnDataLength == 8 * 32) {
280
+ // 8 32-byte words returned if engine
281
+ // @dev 8 32-byte words are expected because the engine core
282
+ // contracts return a payout address and uint256 payment value for
283
+ // the artist, artist's additional payee, render provider
284
+ // typically Art Blocks, and platform provider (partner).
285
+ // also note that per Solidity ABI encoding, the address return
286
+ // values are padded to 32 bytes.
287
+ return true;
288
+ } else {
289
+ // unexpected return value length
290
+ revert("Unexpected revenue split bytes");
291
+ }
292
+ }
293
+ }