@artblocks/contracts 1.0.4 → 1.1.0

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 (120) hide show
  1. package/README.md +2 -2
  2. package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
  3. package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +97 -10
  4. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +4 -4
  5. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +4 -9
  6. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +4 -9
  7. package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +4 -9
  8. package/artifacts/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol/GenArt721CoreV3_Engine_Flex_PROHIBITION.json +4 -9
  9. package/artifacts/contracts/engine-registry/CoreRegistryV1.sol/CoreRegistryV1.json +12 -12
  10. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +4 -4
  11. package/artifacts/contracts/interfaces/v0.8.x/ICoreRegistryV1.sol/ICoreRegistryV1.json +6 -6
  12. package/artifacts/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +19 -0
  13. package/artifacts/contracts/interfaces/v0.8.x/IMinterFilterV1.sol/IMinterFilterV1.json +22 -22
  14. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol/ISharedMinterDAExpSettlementV0.json +8 -101
  15. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol/ISharedMinterDAExpV0.json +1 -57
  16. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol/ISharedMinterDALinV0.json +1 -57
  17. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol/ISharedMinterDAV0.json +2 -21
  18. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol/ISharedMinterHolderERC20V0.json +158 -0
  19. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol/ISharedMinterHolderV0.json +15 -90
  20. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol/ISharedMinterMerkleV0.json +10 -36
  21. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol/ISharedMinterSEAV0.json +4 -236
  22. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol/ISharedMinterSimplePurchaseV0.json +5 -5
  23. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterV0.sol/ISharedMinterV0.json +7 -423
  24. package/artifacts/contracts/interfaces/v0.8.x/ISharedRandomizerV0.sol/ISharedRandomizerV0.json +17 -17
  25. package/artifacts/contracts/libs/v0.8.x/ABHelpers.sol/ABHelpers.json +2 -2
  26. package/artifacts/contracts/libs/v0.8.x/AuthLib.sol/AuthLib.json +2 -2
  27. package/artifacts/contracts/libs/v0.8.x/Bytes32Strings.sol/Bytes32Strings.json +2 -2
  28. package/artifacts/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol/DAExpLib.json +60 -3
  29. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALib.sol/DALib.json +30 -0
  30. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALinLib.sol/DALinLib.json +60 -3
  31. package/artifacts/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol/GenericMinterEventsLib.json +346 -0
  32. package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +29 -3
  33. package/artifacts/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol/MerkleLib.json +30 -3
  34. package/artifacts/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol/PolyptychLib.json +2 -2
  35. package/artifacts/contracts/libs/v0.8.x/minter-libs/SEALib.sol/SEALib.json +254 -3
  36. package/artifacts/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol/SetPriceLib.json +48 -3
  37. package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +41 -3
  38. package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +35 -3
  39. package/artifacts/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol/TokenHolderLib.json +79 -3
  40. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
  41. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV2.sol/MinterFilterV2.json +41 -41
  42. package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +66 -632
  43. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -20
  44. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +67 -594
  45. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +33 -524
  46. package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +66 -632
  47. package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +33 -524
  48. package/artifacts/contracts/minter-suite/Minters/MinterSEAV1.sol/MinterSEAV1.json +51 -717
  49. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +58 -454
  50. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +61 -552
  51. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +55 -497
  52. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +110 -571
  53. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +69 -560
  54. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +28 -444
  55. package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +2 -2
  56. package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +4 -9
  57. package/artifacts/contracts/mock/OriginRegisterMock.sol/OriginRegisterMock.json +2 -2
  58. package/artifacts/contracts/mock/ReentrancyHolderMockShared.sol/ReentrancyHolderMockShared.json +136 -0
  59. package/artifacts/contracts/mock/ReentrancyMerkleMockShared.sol/ReentrancyMerkleMockShared.json +105 -0
  60. package/artifacts/contracts/mock/ReentrancyMockShared.sol/ReentrancyMockShared.json +100 -0
  61. package/artifacts/contracts/mock/ReentrancySEAMockShared.sol/ReentrancySEAAutoBidderMockShared.json +69 -0
  62. package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +19 -19
  63. package/contracts/DependencyRegistryV0.sol +84 -16
  64. package/contracts/archive/readme.md +16 -0
  65. package/contracts/engine/README.md +21 -0
  66. package/contracts/engine/V3/GenArt721CoreV3_Engine.sol +4 -10
  67. package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +4 -10
  68. package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +4 -10
  69. package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +4 -10
  70. package/contracts/engine-registry/CoreRegistryV1.sol +58 -65
  71. package/contracts/interfaces/v0.8.x/ICoreRegistryV1.sol +6 -8
  72. package/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol +3 -0
  73. package/contracts/interfaces/v0.8.x/IMinterFilterV1.sol +25 -25
  74. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol +11 -20
  75. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol +1 -14
  76. package/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol +1 -15
  77. package/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol +2 -8
  78. package/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol +47 -0
  79. package/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol +15 -43
  80. package/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol +10 -20
  81. package/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol +4 -67
  82. package/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol +5 -5
  83. package/contracts/interfaces/v0.8.x/ISharedMinterV0.sol +7 -155
  84. package/contracts/interfaces/v0.8.x/ISharedRandomizerV0.sol +37 -37
  85. package/contracts/libs/v0.8.x/ABHelpers.sol +14 -14
  86. package/contracts/libs/v0.8.x/AuthLib.sol +101 -102
  87. package/contracts/libs/v0.8.x/Bytes32Strings.sol +5 -5
  88. package/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol +163 -38
  89. package/contracts/libs/v0.8.x/minter-libs/DALib.sol +26 -0
  90. package/contracts/libs/v0.8.x/minter-libs/DALinLib.sol +144 -37
  91. package/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol +171 -0
  92. package/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol +250 -110
  93. package/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol +257 -48
  94. package/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol +138 -58
  95. package/contracts/libs/v0.8.x/minter-libs/SEALib.sol +778 -103
  96. package/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol +135 -13
  97. package/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol +567 -187
  98. package/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol +480 -322
  99. package/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol +214 -76
  100. package/contracts/minter-suite/MinterFilter/MinterFilterV2.sol +347 -304
  101. package/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol +391 -491
  102. package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +1 -54
  103. package/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol +388 -628
  104. package/contracts/minter-suite/Minters/MinterDAExpV5.sol +212 -273
  105. package/contracts/minter-suite/Minters/MinterDALinHolderV5.sol +393 -488
  106. package/contracts/minter-suite/Minters/MinterDALinV5.sol +220 -277
  107. package/contracts/minter-suite/Minters/MinterSEAV1.sol +327 -664
  108. package/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol +278 -303
  109. package/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol +355 -446
  110. package/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol +328 -416
  111. package/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol +538 -622
  112. package/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol +429 -553
  113. package/contracts/minter-suite/Minters/MinterSetPriceV5.sol +180 -227
  114. package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +3 -10
  115. package/contracts/mock/ReentrancyHolderMockShared.sol +59 -0
  116. package/contracts/mock/ReentrancyMerkleMockShared.sol +58 -0
  117. package/contracts/mock/ReentrancyMockShared.sol +48 -0
  118. package/contracts/mock/ReentrancySEAMockShared.sol +40 -0
  119. package/contracts/randomizer/shared/SharedRandomizerV0.sol +78 -70
  120. package/package.json +39 -33
@@ -1,11 +1,12 @@
1
1
  // SPDX-License-Identifier: LGPL-3.0-only
2
2
  // Created By: Art Blocks Inc.
3
3
 
4
- import "@openzeppelin-4.5/contracts/utils/structs/EnumerableSet.sol";
5
- import "@openzeppelin-4.7/contracts/token/ERC721/IERC721.sol";
6
-
7
4
  pragma solidity ^0.8.0;
8
5
 
6
+ import {IERC721} from "@openzeppelin-4.7/contracts/token/ERC721/IERC721.sol";
7
+
8
+ import {EnumerableSet} from "@openzeppelin-4.5/contracts/utils/structs/EnumerableSet.sol";
9
+
9
10
  /**
10
11
  * @title Art Blocks Token Holder Library
11
12
  * @notice This library provides a collection of functions for managing and
@@ -19,98 +20,196 @@ pragma solidity ^0.8.0;
19
20
 
20
21
  library TokenHolderLib {
21
22
  using EnumerableSet for EnumerableSet.AddressSet;
23
+ /**
24
+ * @notice Notifies of the contracts' current delegation registry address.
25
+ * @param delegationRegistry The address of the delegation registry
26
+ */
27
+ event DelegationRegistryUpdated(address delegationRegistry);
28
+ /**
29
+ * @notice Allow holders of NFTs at addresses `ownedNFTAddresses`, project
30
+ * IDs `ownedNFTProjectIds` to mint on project `projectId`.
31
+ * `ownedNFTAddresses` assumed to be aligned with `ownedNFTProjectIds`.
32
+ * e.g. Allows holders of project `ownedNFTProjectIds[0]` on token
33
+ * contract `ownedNFTAddresses[0]` to mint.
34
+ * @param projectId Project ID to allowlist holders for.
35
+ * @param coreContract Core contract address to allowlist holders for.
36
+ * @param ownedNFTAddresses NFT core addresses of projects to be
37
+ * allowlisted. Indexes align with `ownedNFTProjectIds`.
38
+ * @param ownedNFTProjectIds Project IDs on `ownedNFTAddresses` whose
39
+ * holders shall be allowlisted to mint project `projectId`. Indexes
40
+ * align with `ownedNFTAddresses`.
41
+ */
42
+ event AllowedHoldersOfProjects(
43
+ uint256 indexed projectId,
44
+ address indexed coreContract,
45
+ address[] ownedNFTAddresses,
46
+ uint256[] ownedNFTProjectIds
47
+ );
48
+ /**
49
+ * @notice Remove holders of NFTs at addresses `ownedNFTAddresses`,
50
+ * project IDs `ownedNFTProjectIds` to mint on project `projectId`.
51
+ * `ownedNFTAddresses` assumed to be aligned with `ownedNFTProjectIds`.
52
+ * e.g. Removes holders of project `ownedNFTProjectIds[0]` on token
53
+ * contract `ownedNFTAddresses[0]` from mint allowlist.
54
+ * @param projectId Project ID to remove holders for.
55
+ * @param coreContract Core contract address to remove holders for.
56
+ * @param ownedNFTAddresses NFT core addresses of projects to be removed
57
+ * from allowlist. Indexes align with `ownedNFTProjectIds`.
58
+ * @param ownedNFTProjectIds Project IDs on `ownedNFTAddresses` whose
59
+ * holders will be removed from allowlist to mint project `projectId`.
60
+ * Indexes align with `ownedNFTAddresses`.
61
+ */
62
+ event RemovedHoldersOfProjects(
63
+ uint256 indexed projectId,
64
+ address indexed coreContract,
65
+ address[] ownedNFTAddresses,
66
+ uint256[] ownedNFTProjectIds
67
+ );
68
+
69
+ // position of Token Holder Lib storage, using a diamond storage pattern
70
+ // for this library
71
+ bytes32 constant TOKEN_HOLDER_LIB_STORAGE_POSITION =
72
+ keccak256("tokenholderlib.storage");
73
+
22
74
  // Define one million to represent the base token ID for each project.
23
75
  uint256 constant ONE_MILLION = 1_000_000;
24
76
 
25
77
  struct HolderProjectConfig {
26
78
  // projects whose holders are allowed to purchase a token on `projectId`
27
- // ownedNFTAddress => ownedNFTProjectIds => bool
28
- mapping(address => mapping(uint256 => bool)) allowedProjectHolders;
79
+ mapping(address ownedNFTAddress => mapping(uint256 ownedNFTProjectId => bool allowed)) allowedProjectHolders;
80
+ }
81
+
82
+ // Diamond storage pattern is used in this library
83
+ struct TokenHolderLibStorage {
84
+ mapping(address coreContract => mapping(uint256 projectId => HolderProjectConfig)) holderProjectConfigs;
29
85
  }
30
86
 
31
87
  /**
32
- * @dev Allows holders of specific project tokens.
33
- * @param holderProjectConfig A mapping of the allowed holders for a specific project.
34
- * @param _ownedNFTAddresses NFT core addresses of projects to be
35
- * allowlisted. Indexes must align with `_ownedNFTProjectIds`.
36
- * @param _ownedNFTProjectIds Project IDs on `_ownedNFTAddresses` whose
37
- * holders shall be allowlisted to mint project `_projectId`. Indexes must
38
- * align with `_ownedNFTAddresses`.
88
+ * @notice Allows holders of specific project tokens.
89
+ * @param projectId Project ID to allowlist holders for.
90
+ * @param coreContract Core contract address to allowlist holders for.
91
+ * @param ownedNFTAddresses NFT core addresses of projects to be
92
+ * allowlisted. Indexes must align with `ownedNFTProjectIds`.
93
+ * @param ownedNFTProjectIds Project IDs on `ownedNFTAddresses` whose
94
+ * holders shall be allowlisted to mint project `projectId`. Indexes must
95
+ * align with `ownedNFTAddresses`.
39
96
  */
40
97
  function allowHoldersOfProjects(
41
- HolderProjectConfig storage holderProjectConfig,
42
- address[] memory _ownedNFTAddresses,
43
- uint256[] memory _ownedNFTProjectIds
98
+ uint256 projectId,
99
+ address coreContract,
100
+ address[] calldata ownedNFTAddresses,
101
+ uint256[] calldata ownedNFTProjectIds
44
102
  ) internal {
45
103
  require(
46
- _ownedNFTAddresses.length == _ownedNFTProjectIds.length,
104
+ ownedNFTAddresses.length == ownedNFTProjectIds.length,
47
105
  "TokenHolderLib: arrays neq length"
48
106
  );
49
- for (uint256 i = 0; i < _ownedNFTAddresses.length; i++) {
50
- holderProjectConfig.allowedProjectHolders[_ownedNFTAddresses[i]][
51
- _ownedNFTProjectIds[i]
107
+ HolderProjectConfig
108
+ storage holderProjectConfig = getHolderProjectConfig({
109
+ projectId: projectId,
110
+ coreContract: coreContract
111
+ });
112
+ uint256 ownedNFTLoopLength = ownedNFTAddresses.length;
113
+ for (uint256 i; i < ownedNFTLoopLength; ) {
114
+ holderProjectConfig.allowedProjectHolders[ownedNFTAddresses[i]][
115
+ ownedNFTProjectIds[i]
52
116
  ] = true;
117
+ // gas-efficient loop increment
118
+ unchecked {
119
+ ++i;
120
+ }
53
121
  }
122
+ // emit approve event
123
+ emit AllowedHoldersOfProjects({
124
+ projectId: projectId,
125
+ coreContract: coreContract,
126
+ ownedNFTAddresses: ownedNFTAddresses,
127
+ ownedNFTProjectIds: ownedNFTProjectIds
128
+ });
54
129
  }
55
130
 
56
131
  /**
57
- * @dev Removes holders of specific project tokens.
58
- * @param holderProjectConfig A mapping of the allowed holders for a specific project.
59
- * @param _ownedNFTAddresses NFT core addresses of projects to be removed
60
- * from allowlist. Indexes must align with `_ownedNFTProjectIds`.
61
- * @param _ownedNFTProjectIds Project IDs on `_ownedNFTAddresses` whose
62
- * holders will be removed from allowlist to mint project `_projectId`.
63
- * Indexes must align with `_ownedNFTAddresses`.
132
+ * @notice Removes holders of specific project tokens.
133
+ * @param projectId Project ID to remove holders for.
134
+ * @param coreContract Core contract address to remove holders for.
135
+ * @param ownedNFTAddresses NFT core addresses of projects to be removed
136
+ * from allowlist. Indexes must align with `ownedNFTProjectIds`.
137
+ * @param ownedNFTProjectIds Project IDs on `ownedNFTAddresses` whose
138
+ * holders will be removed from allowlist to mint project `projectId`.
139
+ * Indexes must align with `ownedNFTAddresses`.
64
140
  */
65
141
  function removeHoldersOfProjects(
66
- HolderProjectConfig storage holderProjectConfig,
67
- address[] memory _ownedNFTAddresses,
68
- uint256[] memory _ownedNFTProjectIds
142
+ uint256 projectId,
143
+ address coreContract,
144
+ address[] calldata ownedNFTAddresses,
145
+ uint256[] calldata ownedNFTProjectIds
69
146
  ) internal {
70
147
  require(
71
- _ownedNFTAddresses.length == _ownedNFTProjectIds.length,
148
+ ownedNFTAddresses.length == ownedNFTProjectIds.length,
72
149
  "TokenHolderLib: arrays neq length"
73
150
  );
74
- for (uint256 i = 0; i < _ownedNFTAddresses.length; i++) {
75
- holderProjectConfig.allowedProjectHolders[_ownedNFTAddresses[i]][
76
- _ownedNFTProjectIds[i]
151
+ HolderProjectConfig
152
+ storage holderProjectConfig = getHolderProjectConfig({
153
+ projectId: projectId,
154
+ coreContract: coreContract
155
+ });
156
+ uint256 ownedNFTLoopLength = ownedNFTAddresses.length;
157
+ for (uint256 i; i < ownedNFTLoopLength; ) {
158
+ holderProjectConfig.allowedProjectHolders[ownedNFTAddresses[i]][
159
+ ownedNFTProjectIds[i]
77
160
  ] = false;
161
+ // gas-efficient loop increment
162
+ unchecked {
163
+ ++i;
164
+ }
78
165
  }
166
+ // emit removed event
167
+ emit RemovedHoldersOfProjects({
168
+ projectId: projectId,
169
+ coreContract: coreContract,
170
+ ownedNFTAddresses: ownedNFTAddresses,
171
+ ownedNFTProjectIds: ownedNFTProjectIds
172
+ });
79
173
  }
80
174
 
81
175
  /**
82
- * @dev Allows and removes holders of specific project tokens in one operation.
83
- * @param holderProjectConfig A mapping of the allowed holders for a specific project.
84
- * @param _ownedNFTAddressesAdd NFT core addresses of projects to be
85
- * allowlisted. Indexes must align with `_ownedNFTProjectIdsAdd`.
86
- * @param _ownedNFTProjectIdsAdd Project IDs on `_ownedNFTAddressesAdd`
87
- * whose holders shall be allowlisted to mint project `_projectId`. Indexes
88
- * must align with `_ownedNFTAddressesAdd`.
89
- * @param _ownedNFTAddressesRemove NFT core addresses of projects to be
176
+ * @notice Allows and removes holders of specific project tokens in one
177
+ * operation.
178
+ * @param projectId Project ID to modify holders for.
179
+ * @param coreContract Core contract address to modify holders for.
180
+ * @param ownedNFTAddressesAdd NFT core addresses of projects to be
181
+ * allowlisted. Indexes must align with `ownedNFTProjectIdsAdd`.
182
+ * @param ownedNFTProjectIdsAdd Project IDs on `ownedNFTAddressesAdd`
183
+ * whose holders shall be allowlisted to mint project `projectId`. Indexes
184
+ * must align with `ownedNFTAddressesAdd`.
185
+ * @param ownedNFTAddressesRemove NFT core addresses of projects to be
90
186
  * removed from allowlist. Indexes must align with
91
- * `_ownedNFTProjectIdsRemove`.
92
- * @param _ownedNFTProjectIdsRemove Project IDs on
93
- * `_ownedNFTAddressesRemove` whose holders will be removed from allowlist
94
- * to mint project `_projectId`. Indexes must align with
95
- * `_ownedNFTAddressesRemove`.
187
+ * `ownedNFTProjectIdsRemove`.
188
+ * @param ownedNFTProjectIdsRemove Project IDs on
189
+ * `ownedNFTAddressesRemove` whose holders will be removed from allowlist
190
+ * to mint project `projectId`. Indexes must align with
191
+ * `ownedNFTAddressesRemove`.
96
192
  */
97
193
  function allowAndRemoveHoldersOfProjects(
98
- HolderProjectConfig storage holderProjectConfig,
99
- address[] memory _ownedNFTAddressesAdd,
100
- uint256[] memory _ownedNFTProjectIdsAdd,
101
- address[] memory _ownedNFTAddressesRemove,
102
- uint256[] memory _ownedNFTProjectIdsRemove
194
+ uint256 projectId,
195
+ address coreContract,
196
+ address[] calldata ownedNFTAddressesAdd,
197
+ uint256[] calldata ownedNFTProjectIdsAdd,
198
+ address[] calldata ownedNFTAddressesRemove,
199
+ uint256[] calldata ownedNFTProjectIdsRemove
103
200
  ) internal {
104
- allowHoldersOfProjects(
105
- holderProjectConfig,
106
- _ownedNFTAddressesAdd,
107
- _ownedNFTProjectIdsAdd
108
- );
109
- removeHoldersOfProjects(
110
- holderProjectConfig,
111
- _ownedNFTAddressesRemove,
112
- _ownedNFTProjectIdsRemove
113
- );
201
+ allowHoldersOfProjects({
202
+ projectId: projectId,
203
+ coreContract: coreContract,
204
+ ownedNFTAddresses: ownedNFTAddressesAdd,
205
+ ownedNFTProjectIds: ownedNFTProjectIdsAdd
206
+ });
207
+ removeHoldersOfProjects({
208
+ projectId: projectId,
209
+ coreContract: coreContract,
210
+ ownedNFTAddresses: ownedNFTAddressesRemove,
211
+ ownedNFTProjectIds: ownedNFTProjectIdsRemove
212
+ });
114
213
  }
115
214
 
116
215
  /**
@@ -120,34 +219,73 @@ library TokenHolderLib {
120
219
  * contract. Plan is to only integrate with AB/PBAB NFTs on the minter, but
121
220
  * in case other NFTs are registered, better to check here. Also,
122
221
  * function is non-reentrant, so this is extra cautious.
222
+ * @param ownedNFTAddress ERC-721 NFT token address to be checked.
223
+ * @param ownedNFTTokenId ERC-721 NFT token ID to be checked.
224
+ * @param targetOwner Target owner address to check.
123
225
  */
124
226
  function validateNFTOwnership(
125
- address _ownedNFTAddress,
126
- uint256 _ownedNFTTokenId,
127
- address _targetOwner
227
+ address ownedNFTAddress,
228
+ uint256 ownedNFTTokenId,
229
+ address targetOwner
128
230
  ) internal view {
129
- address actualNFTOwner = IERC721(_ownedNFTAddress).ownerOf(
130
- _ownedNFTTokenId
231
+ address actualNFTOwner = IERC721(ownedNFTAddress).ownerOf(
232
+ ownedNFTTokenId
131
233
  );
132
- require(actualNFTOwner == _targetOwner, "Only owner of NFT");
234
+ require(actualNFTOwner == targetOwner, "Only owner of NFT");
133
235
  }
134
236
 
135
237
  /**
136
- * @dev Checks if a specific NFT is allowlisted.
137
- * @param holderProjectConfig A mapping of the allowed holders for a specific project.
138
- * @param _ownedNFTAddress ERC-721 NFT token address to be checked.
139
- * @param _ownedNFTTokenId ERC-721 NFT token ID to be checked.
238
+ * @notice Checks if a specific NFT is allowlisted.
239
+ * @param projectId Project ID to be checked.
240
+ * @param coreContract Core contract address to be checked.
241
+ * @param ownedNFTAddress ERC-721 NFT token address to be checked.
242
+ * @param ownedNFTTokenId ERC-721 NFT token ID to be checked.
140
243
  * @return bool true if the NFT is allowlisted; false otherwise.
141
244
  */
142
245
  function isAllowlistedNFT(
143
- HolderProjectConfig storage holderProjectConfig,
144
- address _ownedNFTAddress,
145
- uint256 _ownedNFTTokenId
246
+ uint256 projectId,
247
+ address coreContract,
248
+ address ownedNFTAddress,
249
+ uint256 ownedNFTTokenId
146
250
  ) internal view returns (bool) {
147
- uint256 ownedNFTProjectId = _ownedNFTTokenId / ONE_MILLION;
251
+ HolderProjectConfig
252
+ storage holderProjectConfig = getHolderProjectConfig({
253
+ projectId: projectId,
254
+ coreContract: coreContract
255
+ });
256
+ uint256 ownedNFTProjectId = ownedNFTTokenId / ONE_MILLION;
148
257
  return
149
- holderProjectConfig.allowedProjectHolders[_ownedNFTAddress][
258
+ holderProjectConfig.allowedProjectHolders[ownedNFTAddress][
150
259
  ownedNFTProjectId
151
260
  ];
152
261
  }
262
+
263
+ /**
264
+ * @notice Loads the HolderProjectConfig for a given project and core
265
+ * contract.
266
+ * @param projectId Project Id to get config for
267
+ * @param coreContract Core contract address to get config for
268
+ */
269
+ function getHolderProjectConfig(
270
+ uint256 projectId,
271
+ address coreContract
272
+ ) internal view returns (HolderProjectConfig storage) {
273
+ return s().holderProjectConfigs[coreContract][projectId];
274
+ }
275
+
276
+ /**
277
+ * @notice Return the storage struct for reading and writing. This library
278
+ * uses a diamond storage pattern when managing storage.
279
+ * @return storageStruct The SetPriceLibStorage struct.
280
+ */
281
+ function s()
282
+ internal
283
+ pure
284
+ returns (TokenHolderLibStorage storage storageStruct)
285
+ {
286
+ bytes32 position = TOKEN_HOLDER_LIB_STORAGE_POSITION;
287
+ assembly ("memory-safe") {
288
+ storageStruct.slot := position
289
+ }
290
+ }
153
291
  }