@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.
Files changed (196) hide show
  1. package/.env.example +10 -0
  2. package/LICENSE +165 -0
  3. package/README.md +286 -0
  4. package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +164 -0
  5. package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +248 -0
  6. package/artifacts/contracts/BasicRandomizer.sol/BasicRandomizer.json +24 -0
  7. package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +102 -0
  8. package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +1020 -0
  9. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +1928 -0
  10. package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1942 -0
  11. package/artifacts/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +1708 -0
  12. package/artifacts/contracts/engine/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +1410 -0
  13. package/artifacts/contracts/engine/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +1436 -0
  14. package/artifacts/contracts/engine/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +437 -0
  15. package/artifacts/contracts/engine/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +508 -0
  16. package/artifacts/contracts/engine/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +381 -0
  17. package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +109 -0
  18. package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +109 -0
  19. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +1902 -0
  20. package/artifacts/contracts/interfaces/0.5.x/IBonusContract.sol/IBonusContract.json +47 -0
  21. package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +413 -0
  22. package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +392 -0
  23. package/artifacts/contracts/interfaces/0.5.x/IRandomizer.sol/IRandomizer.json +26 -0
  24. package/artifacts/contracts/interfaces/0.8.x/IAdminACLV0.sol/IAdminACLV0.json +122 -0
  25. package/artifacts/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +59 -0
  26. package/artifacts/contracts/interfaces/0.8.x/IBonusContract.sol/IBonusContract.json +43 -0
  27. package/artifacts/contracts/interfaces/0.8.x/IDelegationRegistry.sol/IDelegationRegistry.json +510 -0
  28. package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +53 -0
  29. package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +350 -0
  30. package/artifacts/contracts/interfaces/0.8.x/IEngineRegistryV0.sol/IEngineRegistryV0.json +85 -0
  31. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +730 -0
  32. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +311 -0
  33. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +617 -0
  34. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +292 -0
  35. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +598 -0
  36. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +355 -0
  37. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +368 -0
  38. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +674 -0
  39. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +551 -0
  40. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +564 -0
  41. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +601 -0
  42. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV0.sol/IFilteredMinterV0.json +216 -0
  43. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV1.sol/IFilteredMinterV1.json +485 -0
  44. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV2.sol/IFilteredMinterV2.json +522 -0
  45. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +299 -0
  46. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +609 -0
  47. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +448 -0
  48. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +649 -0
  49. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +362 -0
  50. package/artifacts/contracts/interfaces/0.8.x/IManifold.sol/IManifold.json +35 -0
  51. package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +192 -0
  52. package/artifacts/contracts/interfaces/0.8.x/IRandomizer.sol/IRandomizer.json +24 -0
  53. package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +37 -0
  54. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +10 -0
  55. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +10 -0
  56. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
  57. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC165.json +38 -0
  58. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +322 -0
  59. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
  60. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +1773 -0
  61. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC165.json +32 -0
  62. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721.json +316 -0
  63. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
  64. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
  65. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +10 -0
  66. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +10 -0
  67. package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +338 -0
  68. package/artifacts/contracts/libs/0.5.x/CustomERC721Metadata.sol/CustomERC721Metadata.json +425 -0
  69. package/artifacts/contracts/libs/0.5.x/IERC20.sol/IERC20.json +206 -0
  70. package/artifacts/contracts/libs/0.5.x/SafeMath.sol/SafeMath.json +10 -0
  71. package/artifacts/contracts/libs/0.5.x/Strings.sol/Strings.json +10 -0
  72. package/artifacts/contracts/libs/0.8.x/BytecodeStorage.sol/BytecodeStorage.json +10 -0
  73. package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +10 -0
  74. package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +357 -0
  75. package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +529 -0
  76. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +1037 -0
  77. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +172 -0
  78. package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +24 -0
  79. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +342 -0
  80. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +322 -0
  81. package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +550 -0
  82. package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +856 -0
  83. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +1053 -0
  84. package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +526 -0
  85. package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +832 -0
  86. package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
  87. package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +1100 -0
  88. package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +1002 -0
  89. package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +1039 -0
  90. package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +365 -0
  91. package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +671 -0
  92. package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol/MinterSetPriceV1.json +288 -0
  93. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +436 -0
  94. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +742 -0
  95. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +461 -0
  96. package/artifacts/contracts/mock/BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json +194 -0
  97. package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +15 -0
  98. package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +292 -0
  99. package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +165 -0
  100. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +128 -0
  101. package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +118 -0
  102. package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +87 -0
  103. package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +82 -0
  104. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +208 -0
  105. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +301 -0
  106. package/contracts/AdminACLV0.sol +103 -0
  107. package/contracts/AdminACLV1.sol +193 -0
  108. package/contracts/BasicRandomizer.sol +23 -0
  109. package/contracts/BasicRandomizerV2.sol +36 -0
  110. package/contracts/DependencyRegistryV0.sol +893 -0
  111. package/contracts/GenArt721CoreV3.sol +2001 -0
  112. package/contracts/GenArt721CoreV3_Engine.sol +2061 -0
  113. package/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol +887 -0
  114. package/contracts/engine/GenArt721CoreV2_PBAB.sol +695 -0
  115. package/contracts/engine/GenArt721CoreV2_PRTNR.sol +749 -0
  116. package/contracts/engine/GenArt721MinterBurner_PBAB.sol +467 -0
  117. package/contracts/engine/GenArt721MinterDAExp_PBAB.sol +614 -0
  118. package/contracts/engine/GenArt721Minter_PBAB.sol +420 -0
  119. package/contracts/engine-registry/EngineRegistryV0.sol +72 -0
  120. package/contracts/engine-registry/future/EngineRegistryV1.sol +86 -0
  121. package/contracts/explorations/GenArt721CoreV3_Explorations.sol +1989 -0
  122. package/contracts/interfaces/0.5.x/IBonusContract.sol +10 -0
  123. package/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol +91 -0
  124. package/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol +92 -0
  125. package/contracts/interfaces/0.5.x/IRandomizer.sol +8 -0
  126. package/contracts/interfaces/0.8.x/IAdminACLV0.sol +51 -0
  127. package/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol +34 -0
  128. package/contracts/interfaces/0.8.x/IBonusContract.sol +10 -0
  129. package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +221 -0
  130. package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +31 -0
  131. package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +95 -0
  132. package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +38 -0
  133. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +70 -0
  134. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol +35 -0
  135. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol +16 -0
  136. package/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol +32 -0
  137. package/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol +16 -0
  138. package/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol +68 -0
  139. package/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol +19 -0
  140. package/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol +19 -0
  141. package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol +37 -0
  142. package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol +19 -0
  143. package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol +19 -0
  144. package/contracts/interfaces/0.8.x/IFilteredMinterV0.sol +74 -0
  145. package/contracts/interfaces/0.8.x/IFilteredMinterV1.sol +127 -0
  146. package/contracts/interfaces/0.8.x/IFilteredMinterV2.sol +30 -0
  147. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol +73 -0
  148. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol +79 -0
  149. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +127 -0
  150. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +80 -0
  151. package/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol +91 -0
  152. package/contracts/interfaces/0.8.x/IManifold.sol +24 -0
  153. package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +47 -0
  154. package/contracts/interfaces/0.8.x/IRandomizer.sol +8 -0
  155. package/contracts/interfaces/0.8.x/IRandomizerV2.sol +15 -0
  156. package/contracts/legacy/GenArt721CoreV1.sol +1593 -0
  157. package/contracts/legacy/GenArt721LegacyMinter.sol +275 -0
  158. package/contracts/libs/0.5.x/CustomERC721Metadata.sol +52 -0
  159. package/contracts/libs/0.5.x/IERC20.sol +96 -0
  160. package/contracts/libs/0.5.x/SafeMath.sol +98 -0
  161. package/contracts/libs/0.5.x/Strings.sol +92 -0
  162. package/contracts/libs/0.8.x/BytecodeStorage.sol +314 -0
  163. package/contracts/libs/0.8.x/Bytes32Strings.sol +66 -0
  164. package/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol +514 -0
  165. package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +663 -0
  166. package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol +6 -0
  167. package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol +6 -0
  168. package/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol +6 -0
  169. package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +291 -0
  170. package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +320 -0
  171. package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +571 -0
  172. package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +622 -0
  173. package/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1066 -0
  174. package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +527 -0
  175. package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +576 -0
  176. package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +749 -0
  177. package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +798 -0
  178. package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +682 -0
  179. package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +733 -0
  180. package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +350 -0
  181. package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +401 -0
  182. package/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol +274 -0
  183. package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +491 -0
  184. package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +542 -0
  185. package/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol +470 -0
  186. package/contracts/mock/BytecodeTextCR_DMock.sol +184 -0
  187. package/contracts/mock/DeadReceiverMock.sol +13 -0
  188. package/contracts/mock/ERC20Mock.sol +11 -0
  189. package/contracts/mock/MockAdminACLV0.sol +65 -0
  190. package/contracts/mock/RandomizerV2_NoAssignMock.sol +43 -0
  191. package/contracts/mock/ReentrancyHolderMock.sol +50 -0
  192. package/contracts/mock/ReentrancyMerkleMock.sol +64 -0
  193. package/contracts/mock/ReentrancyMock.sol +44 -0
  194. package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +168 -0
  195. package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +221 -0
  196. package/package.json +83 -0
@@ -0,0 +1,893 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ pragma solidity 0.8.17;
3
+
4
+ // Created By: Art Blocks Inc.
5
+
6
+ import "./interfaces/0.8.x/IAdminACLV0.sol";
7
+ import "./interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol";
8
+ import "./interfaces/0.8.x/IDependencyRegistryV0.sol";
9
+
10
+ import "@openzeppelin-4.7/contracts/utils/Strings.sol";
11
+ import "@openzeppelin-4.7/contracts/utils/structs/EnumerableSet.sol";
12
+ import "@openzeppelin-4.8/contracts-upgradeable/access/OwnableUpgradeable.sol";
13
+ import "@openzeppelin-4.8/contracts-upgradeable/proxy/utils/Initializable.sol";
14
+ import "@openzeppelin-4.5/contracts/utils/math/SafeCast.sol";
15
+
16
+ import "./libs/0.8.x/BytecodeStorage.sol";
17
+ import "./libs/0.8.x/Bytes32Strings.sol";
18
+
19
+ /**
20
+ * @title Art Blocks Dependency Registry, V0.
21
+ * @author Art Blocks Inc.
22
+ * @notice Privileged Roles and Ownership:
23
+ * Permissions managed by ACL contract. If/when we ever call
24
+ * renounceOwnership() this will becom a frozen, immutable registry
25
+ * as no upgrades will be possible.
26
+ * This contract This contract is intended to be an auxiliary reference registry
27
+ * to our non-upgradeable and immutable ERC-721 conforming core contracts,
28
+ * and has been made upgradeable as we expect its required functionality in
29
+ * relation to the Art Blocks ecosystem to evolve over time.
30
+ */
31
+ contract DependencyRegistryV0 is
32
+ Initializable,
33
+ OwnableUpgradeable,
34
+ IDependencyRegistryV0
35
+ {
36
+ using BytecodeStorage for string;
37
+ using BytecodeStorage for address;
38
+ using Bytes32Strings for bytes32;
39
+ using Strings for uint256;
40
+ using EnumerableSet for EnumerableSet.Bytes32Set;
41
+ using EnumerableSet for EnumerableSet.AddressSet;
42
+ using SafeCast for uint24;
43
+
44
+ uint8 constant AT_CHARACTER_CODE = uint8(bytes1("@")); // 0x40
45
+
46
+ /// admin ACL contract
47
+ IAdminACLV0 public adminACLContract;
48
+
49
+ struct Dependency {
50
+ string preferredCDN;
51
+ mapping(uint256 => string) additionalCDNs;
52
+ string preferredRepository;
53
+ mapping(uint256 => string) additionalRepositories;
54
+ string referenceWebsite;
55
+ // mapping from script index to address storing script in bytecode
56
+ mapping(uint256 => address) scriptBytecodeAddresses;
57
+ uint24 additionalCDNCount;
58
+ uint24 additionalRepositoryCount;
59
+ uint24 scriptCount;
60
+ }
61
+
62
+ EnumerableSet.Bytes32Set private _dependencyTypes;
63
+ mapping(bytes32 => Dependency) dependencyDetails;
64
+
65
+ EnumerableSet.AddressSet private _supportedCoreContracts;
66
+ mapping(address => mapping(uint256 => bytes32)) projectDependencyTypeOverrides;
67
+
68
+ modifier onlyNonZeroAddress(address _address) {
69
+ require(_address != address(0), "Must input non-zero address");
70
+ _;
71
+ }
72
+
73
+ modifier onlyNonEmptyString(string memory _string) {
74
+ require(bytes(_string).length != 0, "Must input non-empty string");
75
+ _;
76
+ }
77
+
78
+ modifier onlyAdminACL(bytes4 _selector) {
79
+ require(
80
+ adminACLAllowed(msg.sender, address(this), _selector),
81
+ "Only Admin ACL allowed"
82
+ );
83
+ _;
84
+ }
85
+
86
+ modifier onlySupportedCoreContract(address _coreContractAddress) {
87
+ require(
88
+ _supportedCoreContracts.contains(_coreContractAddress),
89
+ "Core contract not supported"
90
+ );
91
+ _;
92
+ }
93
+
94
+ modifier onlyExistingDependencyType(bytes32 _dependencyType) {
95
+ require(
96
+ _dependencyTypes.contains(_dependencyType),
97
+ "Dependency type does not exist"
98
+ );
99
+ _;
100
+ }
101
+
102
+ /**
103
+ * @notice Initializes contract.
104
+ * @param _adminACLContract Address of admin access control contract, to be
105
+ * set as contract owner.
106
+ */
107
+ function initialize(address _adminACLContract) public initializer {
108
+ __Ownable_init();
109
+ // set AdminACL management contract as owner
110
+ _transferOwnership(_adminACLContract);
111
+ }
112
+
113
+ /**
114
+ * @notice Adds a new dependency.
115
+ * @param _dependencyType Name of dependency type (i.e. "type@version") used to identify dependency.
116
+ * @param _preferredCDN Preferred CDN for dependency.
117
+ * @param _preferredRepository Preferred repository for dependency.
118
+ */
119
+ function addDependency(
120
+ bytes32 _dependencyType,
121
+ string memory _preferredCDN,
122
+ string memory _preferredRepository,
123
+ string memory _referenceWebsite
124
+ ) external onlyAdminACL(this.addDependency.selector) {
125
+ require(
126
+ !_dependencyTypes.contains(_dependencyType),
127
+ "Dependency type already exists"
128
+ );
129
+ require(
130
+ _dependencyType.containsExactCharacterQty(
131
+ AT_CHARACTER_CODE,
132
+ uint8(1)
133
+ ),
134
+ "must contain exactly one @"
135
+ );
136
+
137
+ _dependencyTypes.add(_dependencyType);
138
+ Dependency storage dependencyType = dependencyDetails[_dependencyType];
139
+ dependencyType.preferredCDN = _preferredCDN;
140
+ dependencyType.preferredRepository = _preferredRepository;
141
+ dependencyType.referenceWebsite = _referenceWebsite;
142
+
143
+ emit DependencyAdded(
144
+ _dependencyType,
145
+ _preferredCDN,
146
+ _preferredRepository,
147
+ _referenceWebsite
148
+ );
149
+ }
150
+
151
+ /**
152
+ * @notice Removes a dependency.
153
+ * @param _dependencyType Name of dependency type (i.e. "type@version")
154
+ */
155
+ function removeDependency(
156
+ bytes32 _dependencyType
157
+ )
158
+ external
159
+ onlyAdminACL(this.removeDependency.selector)
160
+ onlyExistingDependencyType(_dependencyType)
161
+ {
162
+ Dependency storage dependency = dependencyDetails[_dependencyType];
163
+ require(
164
+ dependency.additionalCDNCount == 0 &&
165
+ dependency.additionalRepositoryCount == 0 &&
166
+ dependency.scriptCount == 0,
167
+ "Cannot remove dependency with additional CDNs, repositories, or scripts"
168
+ );
169
+
170
+ _dependencyTypes.remove(_dependencyType);
171
+ delete dependencyDetails[_dependencyType];
172
+
173
+ emit DependencyRemoved(_dependencyType);
174
+ }
175
+
176
+ /**
177
+ * @notice Adds a script to dependency `_dependencyType`.
178
+ * @param _dependencyType dependency to be updated.
179
+ * @param _script Script to be added. Required to be a non-empty string,
180
+ * but no further validation is performed.
181
+ */
182
+ function addDependencyScript(
183
+ bytes32 _dependencyType,
184
+ string memory _script
185
+ )
186
+ external
187
+ onlyAdminACL(this.addDependencyScript.selector)
188
+ onlyNonEmptyString(_script)
189
+ onlyExistingDependencyType(_dependencyType)
190
+ {
191
+ Dependency storage dependency = dependencyDetails[_dependencyType];
192
+ // store script in contract bytecode
193
+ dependency.scriptBytecodeAddresses[dependency.scriptCount] = _script
194
+ .writeToBytecode();
195
+ dependency.scriptCount = dependency.scriptCount + 1;
196
+
197
+ emit DependencyScriptUpdated(_dependencyType);
198
+ }
199
+
200
+ /**
201
+ * @notice Updates script for dependencyType `_dependencyType` at script ID `_scriptId`.
202
+ * @param _dependencyType dependency to be updated.
203
+ * @param _scriptId Script ID to be updated.
204
+ * @param _script The updated script value. Required to be a non-empty
205
+ * string, but no further validation is performed.
206
+ */
207
+ function updateDependencyScript(
208
+ bytes32 _dependencyType,
209
+ uint256 _scriptId,
210
+ string memory _script
211
+ )
212
+ external
213
+ onlyAdminACL(this.updateDependencyScript.selector)
214
+ onlyNonEmptyString(_script)
215
+ onlyExistingDependencyType(_dependencyType)
216
+ {
217
+ Dependency storage dependencyType = dependencyDetails[_dependencyType];
218
+ require(
219
+ _scriptId < dependencyType.scriptCount,
220
+ "scriptId out of range"
221
+ );
222
+ // purge old contract bytecode contract from the blockchain state
223
+ // note: Although this does reduce usage of Ethereum state, it does not
224
+ // reduce the gas costs of removal transactions. We believe this is the
225
+ // best behavior at the time of writing, and do not expect this to
226
+ // result in any breaking changes in the future. All current proposals
227
+ // to change the self-destruct opcode are backwards compatible, but may
228
+ // result in not removing the bytecode from the blockchain state. This
229
+ // implementation is compatible with that architecture, as it does not
230
+ // rely on the bytecode being removed from the blockchain state.
231
+ dependencyType.scriptBytecodeAddresses[_scriptId].purgeBytecode();
232
+ // store script in contract bytecode, replacing reference address from
233
+ // the contract that no longer exists with the newly created one
234
+ dependencyType.scriptBytecodeAddresses[_scriptId] = _script
235
+ .writeToBytecode();
236
+
237
+ emit DependencyScriptUpdated(_dependencyType);
238
+ }
239
+
240
+ /**
241
+ * @notice Removes last script from dependency `_dependencyType`.
242
+ * @param _dependencyType dependency to be updated.
243
+ */
244
+ function removeDependencyLastScript(
245
+ bytes32 _dependencyType
246
+ )
247
+ external
248
+ onlyAdminACL(this.removeDependencyLastScript.selector)
249
+ onlyExistingDependencyType(_dependencyType)
250
+ {
251
+ Dependency storage dependency = dependencyDetails[_dependencyType];
252
+ require(dependency.scriptCount > 0, "there are no scripts to remove");
253
+ // purge old contract bytecode contract from the blockchain state
254
+ // note: Although this does reduce usage of Ethereum state, it does not
255
+ // reduce the gas costs of removal transactions. We believe this is the
256
+ // best behavior at the time of writing, and do not expect this to
257
+ // result in any breaking changes in the future. All current proposals
258
+ // to change the self-destruct opcode are backwards compatible, but may
259
+ // result in not removing the bytecode from the blockchain state. This
260
+ // implementation is compatible with that architecture, as it does not
261
+ // rely on the bytecode being removed from the blockchain state.
262
+ dependency
263
+ .scriptBytecodeAddresses[dependency.scriptCount - 1]
264
+ .purgeBytecode();
265
+ // delete reference to contract address that no longer exists
266
+ delete dependency.scriptBytecodeAddresses[dependency.scriptCount - 1];
267
+ unchecked {
268
+ dependency.scriptCount = dependency.scriptCount - 1;
269
+ }
270
+
271
+ emit DependencyScriptUpdated(_dependencyType);
272
+ }
273
+
274
+ /**
275
+ * @notice Updates preferred CDN for dependency `_dependencyType`.
276
+ * @param _dependencyType dependency to be updated.
277
+ * @param _preferredCDN URL for preferred CDN.
278
+ */
279
+ function updateDependencyPreferredCDN(
280
+ bytes32 _dependencyType,
281
+ string memory _preferredCDN
282
+ )
283
+ external
284
+ onlyAdminACL(this.updateDependencyPreferredCDN.selector)
285
+ onlyExistingDependencyType(_dependencyType)
286
+ {
287
+ dependencyDetails[_dependencyType].preferredCDN = _preferredCDN;
288
+
289
+ emit DependencyPreferredCDNUpdated(_dependencyType, _preferredCDN);
290
+ }
291
+
292
+ /**
293
+ * @notice Updates preferred repository for dependency `_dependencyType`.
294
+ * @param _dependencyType dependency to be updated.
295
+ * @param _preferredRepository URL for preferred repository.
296
+ */
297
+ function updateDependencyPreferredRepository(
298
+ bytes32 _dependencyType,
299
+ string memory _preferredRepository
300
+ )
301
+ external
302
+ onlyAdminACL(this.updateDependencyPreferredRepository.selector)
303
+ onlyExistingDependencyType(_dependencyType)
304
+ {
305
+ dependencyDetails[_dependencyType]
306
+ .preferredRepository = _preferredRepository;
307
+
308
+ emit DependencyPreferredRepositoryUpdated(
309
+ _dependencyType,
310
+ _preferredRepository
311
+ );
312
+ }
313
+
314
+ /**
315
+ * @notice Updates project website for dependency `_dependencyType`.
316
+ * @param _dependencyType dependency to be updated.
317
+ * @param _referenceWebsite URL for project website.
318
+ */
319
+ function updateDependencyReferenceWebsite(
320
+ bytes32 _dependencyType,
321
+ string memory _referenceWebsite
322
+ )
323
+ external
324
+ onlyAdminACL(this.updateDependencyReferenceWebsite.selector)
325
+ onlyExistingDependencyType(_dependencyType)
326
+ {
327
+ dependencyDetails[_dependencyType].referenceWebsite = _referenceWebsite;
328
+
329
+ emit DependencyReferenceWebsiteUpdated(
330
+ _dependencyType,
331
+ _referenceWebsite
332
+ );
333
+ }
334
+
335
+ /**
336
+ * @notice Adds a new CDN url to `_dependencyType`.
337
+ * @param _dependencyType dependency to be updated.
338
+ * @param _additionalCDN CDN URL to be added. Required to be a non-empty string,
339
+ * but no further validation is performed.
340
+ */
341
+ function addDependencyAdditionalCDN(
342
+ bytes32 _dependencyType,
343
+ string memory _additionalCDN
344
+ )
345
+ external
346
+ onlyAdminACL(this.addDependencyAdditionalCDN.selector)
347
+ onlyNonEmptyString(_additionalCDN)
348
+ onlyExistingDependencyType(_dependencyType)
349
+ {
350
+ Dependency storage dependency = dependencyDetails[_dependencyType];
351
+
352
+ uint256 additionalCDNCount = uint256(dependency.additionalCDNCount);
353
+ dependency.additionalCDNs[additionalCDNCount] = _additionalCDN;
354
+ dependency.additionalCDNCount = uint24(additionalCDNCount + 1);
355
+
356
+ emit DependencyAdditionalCDNUpdated(
357
+ _dependencyType,
358
+ _additionalCDN,
359
+ additionalCDNCount
360
+ );
361
+ }
362
+
363
+ /**
364
+ * @notice Removes additional CDN for dependency `_dependencyId` at index `_index`.
365
+ * Removal is done by swapping the element to be removed with the last element in the array, then deleting this last element.
366
+ * Assets with indices higher than `_index` can have their indices adjusted as a result of this operation.
367
+ * @param _dependencyType dependency to be updated.
368
+ * @param _index Additional CDN index
369
+ */
370
+ function removeDependencyAdditionalCDNAtIndex(
371
+ bytes32 _dependencyType,
372
+ uint256 _index
373
+ )
374
+ external
375
+ onlyAdminACL(this.removeDependencyAdditionalCDNAtIndex.selector)
376
+ onlyExistingDependencyType(_dependencyType)
377
+ {
378
+ Dependency storage dependency = dependencyDetails[_dependencyType];
379
+
380
+ uint256 additionalCDNCount = dependency.additionalCDNCount;
381
+ require(_index < additionalCDNCount, "Asset index out of range");
382
+
383
+ uint256 lastElementIndex = additionalCDNCount - 1;
384
+
385
+ dependency.additionalCDNs[_index] = dependency.additionalCDNs[
386
+ lastElementIndex
387
+ ];
388
+ delete dependency.additionalCDNs[lastElementIndex];
389
+
390
+ dependency.additionalCDNCount = uint24(lastElementIndex);
391
+
392
+ emit DependencyAdditionalCDNRemoved(_dependencyType, _index);
393
+ }
394
+
395
+ /**
396
+ * @notice Updates additional CDN for dependency `_dependencyType` at `_index`.
397
+ * @param _dependencyType dependency to be updated.
398
+ * @param _index Additional CDN index.
399
+ * @param _additionalCDN New CDN URL.
400
+ */
401
+ function updateDependencyAdditionalCDNAtIndex(
402
+ bytes32 _dependencyType,
403
+ uint256 _index,
404
+ string memory _additionalCDN
405
+ )
406
+ external
407
+ onlyAdminACL(this.updateDependencyAdditionalCDNAtIndex.selector)
408
+ onlyNonEmptyString(_additionalCDN)
409
+ onlyExistingDependencyType(_dependencyType)
410
+ {
411
+ Dependency storage dependency = dependencyDetails[_dependencyType];
412
+ uint24 additionalCDNCount = dependency.additionalCDNCount;
413
+ require(_index < additionalCDNCount, "Asset index out of range");
414
+
415
+ dependency.additionalCDNs[_index] = _additionalCDN;
416
+
417
+ emit DependencyAdditionalCDNUpdated(
418
+ _dependencyType,
419
+ _additionalCDN,
420
+ _index
421
+ );
422
+ }
423
+
424
+ /**
425
+ * @notice Adds a new repository URL to dependency `_dependencyType`.
426
+ * @param _dependencyType dependency to be updated.
427
+ * @param _additionalRepository Repository URL to be added. Required to be a non-empty string,
428
+ * but no further validation is performed.
429
+ */
430
+ function addDependencyAdditionalRepository(
431
+ bytes32 _dependencyType,
432
+ string memory _additionalRepository
433
+ )
434
+ external
435
+ onlyAdminACL(this.addDependencyAdditionalRepository.selector)
436
+ onlyNonEmptyString(_additionalRepository)
437
+ onlyExistingDependencyType(_dependencyType)
438
+ {
439
+ Dependency storage dependency = dependencyDetails[_dependencyType];
440
+ uint256 additionalRepositoryCount = uint256(
441
+ dependency.additionalRepositoryCount
442
+ );
443
+ dependency.additionalRepositories[
444
+ additionalRepositoryCount
445
+ ] = _additionalRepository;
446
+ dependency.additionalRepositoryCount = uint24(
447
+ additionalRepositoryCount + 1
448
+ );
449
+
450
+ emit DependencyAdditionalRepositoryUpdated(
451
+ _dependencyType,
452
+ _additionalRepository,
453
+ additionalRepositoryCount
454
+ );
455
+ }
456
+
457
+ /**
458
+ * @notice Removes additional repository for depenency `_dependencyId` at index `_index`.
459
+ * Removal is done by swapping the element to be removed with the last element in the array, then deleting this last element.
460
+ * Assets with indices higher than `_index` can have their indices adjusted as a result of this operation.
461
+ * @param _dependencyType dependency to be updated.
462
+ * @param _index Additional repository index.
463
+ */
464
+ function removeDependencyAdditionalRepositoryAtIndex(
465
+ bytes32 _dependencyType,
466
+ uint256 _index
467
+ )
468
+ external
469
+ onlyAdminACL(this.removeDependencyAdditionalRepositoryAtIndex.selector)
470
+ onlyExistingDependencyType(_dependencyType)
471
+ {
472
+ Dependency storage dependency = dependencyDetails[_dependencyType];
473
+ uint256 additionalRepositoryCount = uint256(
474
+ dependency.additionalRepositoryCount
475
+ );
476
+ require(_index < additionalRepositoryCount, "Asset index out of range");
477
+
478
+ uint256 lastElementIndex = additionalRepositoryCount - 1;
479
+
480
+ dependency.additionalRepositories[_index] = dependencyDetails[
481
+ _dependencyType
482
+ ].additionalRepositories[lastElementIndex];
483
+ delete dependency.additionalRepositories[lastElementIndex];
484
+
485
+ dependency.additionalRepositoryCount = uint24(lastElementIndex);
486
+
487
+ emit DependencyAdditionalRepositoryRemoved(_dependencyType, _index);
488
+ }
489
+
490
+ /**
491
+ * @notice Updates additional repository for dependency `_dependencyType` at `_index`.
492
+ * @param _dependencyType dependency to be updated.
493
+ * @param _index Additional repository index.
494
+ * @param _additionalRepository New Repository URL.
495
+ */
496
+ function updateDependencyAdditionalRepositoryAtIndex(
497
+ bytes32 _dependencyType,
498
+ uint256 _index,
499
+ string memory _additionalRepository
500
+ )
501
+ external
502
+ onlyAdminACL(this.updateDependencyAdditionalRepositoryAtIndex.selector)
503
+ onlyNonEmptyString(_additionalRepository)
504
+ onlyExistingDependencyType(_dependencyType)
505
+ {
506
+ Dependency storage dependency = dependencyDetails[_dependencyType];
507
+ uint24 additionalRepositoryCount = dependency.additionalRepositoryCount;
508
+ require(_index < additionalRepositoryCount, "Asset index out of range");
509
+
510
+ dependency.additionalRepositories[_index] = _additionalRepository;
511
+
512
+ emit DependencyAdditionalRepositoryUpdated(
513
+ _dependencyType,
514
+ _additionalRepository,
515
+ _index
516
+ );
517
+ }
518
+
519
+ /**
520
+ * @notice Adds a new core contract to the list of supported core contracts.
521
+ * @param _contractAddress Address of the core contract to be added.
522
+ */
523
+ function addSupportedCoreContract(
524
+ address _contractAddress
525
+ )
526
+ external
527
+ onlyAdminACL(this.addSupportedCoreContract.selector)
528
+ onlyNonZeroAddress(_contractAddress)
529
+ {
530
+ require(
531
+ !_supportedCoreContracts.contains(_contractAddress),
532
+ "Contract already supported"
533
+ );
534
+
535
+ _supportedCoreContracts.add(_contractAddress);
536
+
537
+ emit SupportedCoreContractAdded(_contractAddress);
538
+ }
539
+
540
+ /**
541
+ * @notice Removes a core contract from the list of supported core contracts.
542
+ * @param _contractAddress Address of the core contract to be removed.
543
+ */
544
+ function removeSupportedCoreContract(
545
+ address _contractAddress
546
+ )
547
+ external
548
+ onlyAdminACL(this.removeSupportedCoreContract.selector)
549
+ onlySupportedCoreContract(_contractAddress)
550
+ {
551
+ _supportedCoreContracts.remove(_contractAddress);
552
+
553
+ emit SupportedCoreContractRemoved(_contractAddress);
554
+ }
555
+
556
+ /**
557
+ * @notice Overrides the script type and version that
558
+ * would be returned by the core contract (`_contractAddress`)
559
+ * for a given project (`projectId`) with the given dependency
560
+ * type (`_dependencyType`).
561
+ * @param _contractAddress Core contract address.
562
+ * @param _projectId Project to override script type and version for.
563
+ * @param _dependencyType Dependency type to return for project.
564
+ */
565
+ function addProjectDependencyTypeOverride(
566
+ address _contractAddress,
567
+ uint256 _projectId,
568
+ bytes32 _dependencyType
569
+ )
570
+ external
571
+ onlyAdminACL(this.addProjectDependencyTypeOverride.selector)
572
+ onlyExistingDependencyType(_dependencyType)
573
+ onlySupportedCoreContract(_contractAddress)
574
+ {
575
+ projectDependencyTypeOverrides[_contractAddress][
576
+ _projectId
577
+ ] = _dependencyType;
578
+
579
+ emit ProjectDependencyTypeOverrideAdded(
580
+ _contractAddress,
581
+ _projectId,
582
+ _dependencyType
583
+ );
584
+ }
585
+
586
+ /**
587
+ * @notice Removes the script type and version override for a given
588
+ * project (`projectId`) on a given core contract (`_contractAddress`).
589
+ * @param _contractAddress Core contract address.
590
+ * @param _projectId Project to remove override for.
591
+ */
592
+ function removeProjectDependencyTypeOverride(
593
+ address _contractAddress,
594
+ uint256 _projectId
595
+ ) external onlyAdminACL(this.removeProjectDependencyTypeOverride.selector) {
596
+ require(
597
+ projectDependencyTypeOverrides[_contractAddress][_projectId] !=
598
+ bytes32(""),
599
+ "No override set for project"
600
+ );
601
+
602
+ delete projectDependencyTypeOverrides[_contractAddress][_projectId];
603
+
604
+ emit ProjectDependencyTypeOverrideRemoved(_contractAddress, _projectId);
605
+ }
606
+
607
+ /**
608
+ * @notice Returns a list of registered depenency types.
609
+ * @return List of registered depenency types.
610
+ * @dev This is only intended to be called outside of block
611
+ * execution where there is no gas limit.
612
+ */
613
+ function getDependencyTypes() external view returns (string[] memory) {
614
+ string[] memory dependencyTypes = new string[](
615
+ _dependencyTypes.length()
616
+ );
617
+ uint256 numDependencyTypes = _dependencyTypes.length();
618
+
619
+ for (uint256 i = 0; i < numDependencyTypes; i++) {
620
+ dependencyTypes[i] = _dependencyTypes.at(i).toString();
621
+ }
622
+ return dependencyTypes;
623
+ }
624
+
625
+ /**
626
+ * @notice Returns number of registered dependency types
627
+ * @return Number of registered dependencies.
628
+ */
629
+ function getDependencyTypeCount() external view returns (uint256) {
630
+ return _dependencyTypes.length();
631
+ }
632
+
633
+ /**
634
+ * @notice Returns registered depenedency type at index `_index`.
635
+ * @return Registered dependency at `_index`.
636
+ */
637
+ function getDependencyTypeAtIndex(
638
+ uint256 _index
639
+ ) external view returns (string memory) {
640
+ require(_dependencyTypes.length() > _index, "Index out of range");
641
+ return _dependencyTypes.at(_index).toString();
642
+ }
643
+
644
+ /**
645
+ * @notice Returns details for depedency type `_dependencyType`.
646
+ * @param _dependencyType Dependency type to be queried.
647
+ * @return typeAndVersion String representation of `_dependencyType`.
648
+ * (e.g. "p5js(atSymbol)1.0.0")
649
+ * @return preferredCDN Preferred CDN URL for dependency
650
+ * @return additionalCDNCount Count of additional CDN URLs for dependency
651
+ * @return preferredRepository Preferred repository URL for dependency
652
+ * @return additionalRepositoryCount Count of additional repository URLs for dependency
653
+ * @return referenceWebsite Project website URL for dependency
654
+ * @return availableOnChain Whether dependency is available on chain
655
+ * @return scriptCount Count of on-chain scripts for dependency
656
+ */
657
+ function getDependencyDetails(
658
+ bytes32 _dependencyType
659
+ )
660
+ external
661
+ view
662
+ returns (
663
+ string memory typeAndVersion,
664
+ string memory preferredCDN,
665
+ uint24 additionalCDNCount,
666
+ string memory preferredRepository,
667
+ uint24 additionalRepositoryCount,
668
+ string memory referenceWebsite,
669
+ bool availableOnChain,
670
+ uint24 scriptCount
671
+ )
672
+ {
673
+ Dependency storage dependency = dependencyDetails[_dependencyType];
674
+
675
+ return (
676
+ _dependencyType.toString(),
677
+ dependency.preferredCDN,
678
+ dependency.additionalCDNCount,
679
+ dependency.preferredRepository,
680
+ dependency.additionalRepositoryCount,
681
+ dependency.referenceWebsite,
682
+ dependency.scriptCount > 0,
683
+ dependency.scriptCount
684
+ );
685
+ }
686
+
687
+ /**
688
+ * @notice Returns the count of supported core contracts
689
+ * @return Number of supported core contracts.
690
+ */
691
+ function getSupportedCoreContractCount() external view returns (uint256) {
692
+ return _supportedCoreContracts.length();
693
+ }
694
+
695
+ /**
696
+ * @notice Returns the address of the supported core contract at index `_index`.
697
+ * @param _index Index of the core contract to be returned.
698
+ * @return address of the core contract.
699
+ */
700
+ function getSupportedCoreContractAtIndex(
701
+ uint256 _index
702
+ ) external view returns (address) {
703
+ require(
704
+ _supportedCoreContracts.length() > _index,
705
+ "Index out of bounds"
706
+ );
707
+ return _supportedCoreContracts.at(_index);
708
+ }
709
+
710
+ /**
711
+ * @notice Returns a list of supported core contracts.
712
+ * @return List of supported core contracts.
713
+ * @dev This is only intended to be called outside of block
714
+ * execution where there is no gas limit.
715
+ */
716
+ function getSupportedCoreContracts()
717
+ external
718
+ view
719
+ returns (address[] memory)
720
+ {
721
+ uint256 supportedCoreContractCount = _supportedCoreContracts.length();
722
+ address[] memory supportedCoreContracts = new address[](
723
+ supportedCoreContractCount
724
+ );
725
+
726
+ for (uint256 i = 0; i < supportedCoreContractCount; i++) {
727
+ supportedCoreContracts[i] = _supportedCoreContracts.at(i);
728
+ }
729
+
730
+ return supportedCoreContracts;
731
+ }
732
+
733
+ /**
734
+ * @notice Returns the additional CDN URL at index `_index` for dependency `_dependencyType`.
735
+ * @param _dependencyType Dependency type to be queried.
736
+ * @param _index Index of the additional CDN URL to be returned.
737
+ */
738
+ function getDependencyAdditionalCDNAtIndex(
739
+ bytes32 _dependencyType,
740
+ uint256 _index
741
+ ) external view returns (string memory) {
742
+ return dependencyDetails[_dependencyType].additionalCDNs[_index];
743
+ }
744
+
745
+ /**
746
+ * @notice Returns the additional repository URL at index `_index` for dependency `_dependencyType`.
747
+ * @param _dependencyType Dependency type to be queried.
748
+ * @param _index Index of the additional repository URL to be returned.
749
+ */
750
+ function getDependencyAdditionalRepositoryAtIndex(
751
+ bytes32 _dependencyType,
752
+ uint256 _index
753
+ ) external view returns (string memory) {
754
+ return
755
+ dependencyDetails[_dependencyType].additionalRepositories[_index];
756
+ }
757
+
758
+ /**
759
+ * @notice Returns the count of scripts for dependency `_dependencyType`.
760
+ * @param _dependencyType Dependency type to be queried.
761
+ */
762
+ function getDependencyScriptCount(
763
+ bytes32 _dependencyType
764
+ ) external view returns (uint256) {
765
+ return dependencyDetails[_dependencyType].scriptCount;
766
+ }
767
+
768
+ /**
769
+ * @notice Returns address with bytecode containing script for
770
+ * dependency `_dependencyTypes` at script index `_index`.
771
+ */
772
+ function getDependencyScriptBytecodeAddressAtIndex(
773
+ bytes32 _dependencyType,
774
+ uint256 _index
775
+ ) external view returns (address) {
776
+ return
777
+ dependencyDetails[_dependencyType].scriptBytecodeAddresses[_index];
778
+ }
779
+
780
+ /**
781
+ * @notice Returns script for dependency `_dependencyType` at script index `_index`.
782
+ * @param _dependencyType dependency to be queried.
783
+ * @param _index Index of script to be queried.
784
+ */
785
+ function getDependencyScriptAtIndex(
786
+ bytes32 _dependencyType,
787
+ uint256 _index
788
+ ) external view returns (string memory) {
789
+ Dependency storage dependency = dependencyDetails[_dependencyType];
790
+ // If trying to access an out-of-index script, return the empty string.
791
+ if (_index >= dependency.scriptCount) {
792
+ return "";
793
+ }
794
+
795
+ return dependency.scriptBytecodeAddresses[_index].readFromBytecode();
796
+ }
797
+
798
+ /**
799
+ * @notice Returns the dependency type for a given project (`projectId`)
800
+ * on a given core contract (`_contractAddress`). If no override is set,
801
+ * the core contract is called to retrieve the script type and version as
802
+ * dependency type. For any contract earlier than v3, that does not have
803
+ * an override set, this will revert.
804
+ * @param _contractAddress Core contract address.
805
+ * @param _projectId Project to return dependency type for.
806
+ * @return dependencyType Dependency type used by project.
807
+ */
808
+ function getDependencyTypeForProject(
809
+ address _contractAddress,
810
+ uint256 _projectId
811
+ )
812
+ external
813
+ view
814
+ onlySupportedCoreContract(_contractAddress)
815
+ returns (string memory)
816
+ {
817
+ bytes32 dependencyType = projectDependencyTypeOverrides[
818
+ _contractAddress
819
+ ][_projectId];
820
+ if (dependencyType != bytes32(0)) {
821
+ return dependencyType.toString();
822
+ }
823
+
824
+ try
825
+ IDependencyRegistryCompatibleV0(_contractAddress)
826
+ .projectScriptDetails(_projectId)
827
+ returns (string memory scriptTypeAndVersion, string memory, uint256) {
828
+ return scriptTypeAndVersion;
829
+ } catch {
830
+ revert(
831
+ "Contract does not implement projectScriptDetails and has no override set."
832
+ );
833
+ }
834
+ }
835
+
836
+ /**
837
+ * @notice Convenience function that returns whether `_sender` is allowed
838
+ * to call function with selector `_selector` on contract `_contract`, as
839
+ * determined by this contract's current Admin ACL contract. Expected use
840
+ * cases include minter contracts checking if caller is allowed to call
841
+ * admin-gated functions on minter contracts.
842
+ * @param _sender Address of the sender calling function with selector
843
+ * `_selector` on contract `_contract`.
844
+ * @param _contract Address of the contract being called by `_sender`.
845
+ * @param _selector Function selector of the function being called by
846
+ * `_sender`.
847
+ * @return bool Whether `_sender` is allowed to call function with selector
848
+ * `_selector` on contract `_contract`.
849
+ * @dev assumes the Admin ACL contract is the owner of this contract, which
850
+ * is expected to always be true.
851
+ * @dev adminACLContract is expected to either be null address (if owner
852
+ * has renounced ownership), or conform to IAdminACLV0 interface. Check for
853
+ * null address first to avoid revert when admin has renounced ownership.
854
+ */
855
+ function adminACLAllowed(
856
+ address _sender,
857
+ address _contract,
858
+ bytes4 _selector
859
+ ) public returns (bool) {
860
+ return
861
+ owner() != address(0) &&
862
+ adminACLContract.allowed(_sender, _contract, _selector);
863
+ }
864
+
865
+ /**
866
+ * @notice Returns contract owner. Set to deployer's address by default on
867
+ * contract deployment.
868
+ * @return address Address of contract owner.
869
+ * @dev ref: https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable
870
+ * @dev owner role was called `admin` prior to V3 core contract
871
+ */
872
+ function owner()
873
+ public
874
+ view
875
+ override(OwnableUpgradeable)
876
+ returns (address)
877
+ {
878
+ return OwnableUpgradeable.owner();
879
+ }
880
+
881
+ /**
882
+ * @notice Transfers ownership of the contract to a new account (`newOwner`).
883
+ * Internal function without access restriction.
884
+ * @param newOwner New owner.
885
+ * @dev owner role was called `admin` prior to V3 core contract.
886
+ * @dev Overrides and wraps OpenZeppelin's _transferOwnership function to
887
+ * also update adminACLContract for improved introspection.
888
+ */
889
+ function _transferOwnership(address newOwner) internal override {
890
+ OwnableUpgradeable._transferOwnership(newOwner);
891
+ adminACLContract = IAdminACLV0(newOwner);
892
+ }
893
+ }