@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,663 @@
1
+ // SPDX-License-Identifier: CC0-1.0
2
+ pragma solidity ^0.8.17;
3
+
4
+ // This is a mock contract to be used in tests.
5
+ // The source code is copied from ETH mainnet, deployed at:0x00000000000076a84fef008cdabe6409d2fe638b
6
+ // Updates are made to imports for compatibility with this repo.
7
+
8
+ import "../../../interfaces/0.8.x/IDelegationRegistry.sol";
9
+ import "@openzeppelin-4.7/contracts/utils/structs/EnumerableSet.sol";
10
+ import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
11
+
12
+ // import {IDelegationRegistry} from "./IDelegationRegistry.sol";
13
+ // import {EnumerableSet} from "openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol";
14
+ // import {ERC165} from "openzeppelin-contracts/contracts/utils/introspection/ERC165.sol";
15
+
16
+ /**
17
+ * @title DelegationRegistry
18
+ * @custom:version 1.0
19
+ * @notice An immutable registry contract to be deployed as a standalone primitive.
20
+ * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations
21
+ * from here and integrate those permissions into their flow.
22
+ * @custom:coauthor foobar (0xfoobar)
23
+ * @custom:coauthor wwchung (manifoldxyz)
24
+ * @custom:coauthor purplehat (artblocks)
25
+ * @custom:coauthor ryley-o (artblocks)
26
+ * @custom:coauthor andy8052 (tessera)
27
+ * @custom:coauthor punk6529 (open metaverse)
28
+ * @custom:coauthor loopify (loopiverse)
29
+ * @custom:coauthor emiliano (nftrentals)
30
+ * @custom:coauthor arran (proof)
31
+ * @custom:coauthor james (collabland)
32
+ * @custom:coauthor john (gnosis safe)
33
+ * @custom:coauthor 0xrusowsky
34
+ */
35
+ contract DelegationRegistry is IDelegationRegistry, ERC165 {
36
+ using EnumerableSet for EnumerableSet.AddressSet;
37
+ using EnumerableSet for EnumerableSet.Bytes32Set;
38
+
39
+ /// @notice The global mapping and single source of truth for delegations
40
+ /// @dev vault -> vaultVersion -> delegationHash
41
+ mapping(address => mapping(uint256 => EnumerableSet.Bytes32Set))
42
+ internal delegations;
43
+
44
+ /// @notice A mapping of wallets to versions (for cheap revocation)
45
+ mapping(address => uint256) internal vaultVersion;
46
+
47
+ /// @notice A mapping of wallets to delegates to versions (for cheap revocation)
48
+ mapping(address => mapping(address => uint256)) internal delegateVersion;
49
+
50
+ /// @notice A secondary mapping to return onchain enumerability of delegations that a given address can perform
51
+ /// @dev delegate -> delegationHashes
52
+ mapping(address => EnumerableSet.Bytes32Set) internal delegationHashes;
53
+
54
+ /// @notice A secondary mapping used to return delegation information about a delegation
55
+ /// @dev delegationHash -> DelegateInfo
56
+ mapping(bytes32 => IDelegationRegistry.DelegationInfo)
57
+ internal delegationInfo;
58
+
59
+ /**
60
+ * @inheritdoc ERC165
61
+ */
62
+ function supportsInterface(
63
+ bytes4 interfaceId
64
+ ) public view virtual override(ERC165) returns (bool) {
65
+ return
66
+ interfaceId == type(IDelegationRegistry).interfaceId ||
67
+ super.supportsInterface(interfaceId);
68
+ }
69
+
70
+ /**
71
+ * ----------- WRITE -----------
72
+ */
73
+
74
+ /**
75
+ * @inheritdoc IDelegationRegistry
76
+ */
77
+ function delegateForAll(address delegate, bool value) external override {
78
+ bytes32 delegationHash = _computeAllDelegationHash(
79
+ msg.sender,
80
+ delegate
81
+ );
82
+ _setDelegationValues(
83
+ delegate,
84
+ delegationHash,
85
+ value,
86
+ IDelegationRegistry.DelegationType.ALL,
87
+ msg.sender,
88
+ address(0),
89
+ 0
90
+ );
91
+ emit IDelegationRegistry.DelegateForAll(msg.sender, delegate, value);
92
+ }
93
+
94
+ /**
95
+ * @inheritdoc IDelegationRegistry
96
+ */
97
+ function delegateForContract(
98
+ address delegate,
99
+ address contract_,
100
+ bool value
101
+ ) external override {
102
+ bytes32 delegationHash = _computeContractDelegationHash(
103
+ msg.sender,
104
+ delegate,
105
+ contract_
106
+ );
107
+ _setDelegationValues(
108
+ delegate,
109
+ delegationHash,
110
+ value,
111
+ IDelegationRegistry.DelegationType.CONTRACT,
112
+ msg.sender,
113
+ contract_,
114
+ 0
115
+ );
116
+ emit IDelegationRegistry.DelegateForContract(
117
+ msg.sender,
118
+ delegate,
119
+ contract_,
120
+ value
121
+ );
122
+ }
123
+
124
+ /**
125
+ * @inheritdoc IDelegationRegistry
126
+ */
127
+ function delegateForToken(
128
+ address delegate,
129
+ address contract_,
130
+ uint256 tokenId,
131
+ bool value
132
+ ) external override {
133
+ bytes32 delegationHash = _computeTokenDelegationHash(
134
+ msg.sender,
135
+ delegate,
136
+ contract_,
137
+ tokenId
138
+ );
139
+ _setDelegationValues(
140
+ delegate,
141
+ delegationHash,
142
+ value,
143
+ IDelegationRegistry.DelegationType.TOKEN,
144
+ msg.sender,
145
+ contract_,
146
+ tokenId
147
+ );
148
+ emit IDelegationRegistry.DelegateForToken(
149
+ msg.sender,
150
+ delegate,
151
+ contract_,
152
+ tokenId,
153
+ value
154
+ );
155
+ }
156
+
157
+ /**
158
+ * @dev Helper function to set all delegation values and enumeration sets
159
+ */
160
+ function _setDelegationValues(
161
+ address delegate,
162
+ bytes32 delegateHash,
163
+ bool value,
164
+ IDelegationRegistry.DelegationType type_,
165
+ address vault,
166
+ address contract_,
167
+ uint256 tokenId
168
+ ) internal {
169
+ if (value) {
170
+ delegations[vault][vaultVersion[vault]].add(delegateHash);
171
+ delegationHashes[delegate].add(delegateHash);
172
+ delegationInfo[delegateHash] = DelegationInfo({
173
+ vault: vault,
174
+ delegate: delegate,
175
+ type_: type_,
176
+ contract_: contract_,
177
+ tokenId: tokenId
178
+ });
179
+ } else {
180
+ delegations[vault][vaultVersion[vault]].remove(delegateHash);
181
+ delegationHashes[delegate].remove(delegateHash);
182
+ delete delegationInfo[delegateHash];
183
+ }
184
+ }
185
+
186
+ /**
187
+ * @dev Helper function to compute delegation hash for wallet delegation
188
+ */
189
+ function _computeAllDelegationHash(
190
+ address vault,
191
+ address delegate
192
+ ) internal view returns (bytes32) {
193
+ uint256 vaultVersion_ = vaultVersion[vault];
194
+ uint256 delegateVersion_ = delegateVersion[vault][delegate];
195
+ return
196
+ keccak256(
197
+ abi.encode(delegate, vault, vaultVersion_, delegateVersion_)
198
+ );
199
+ }
200
+
201
+ /**
202
+ * @dev Helper function to compute delegation hash for contract delegation
203
+ */
204
+ function _computeContractDelegationHash(
205
+ address vault,
206
+ address delegate,
207
+ address contract_
208
+ ) internal view returns (bytes32) {
209
+ uint256 vaultVersion_ = vaultVersion[vault];
210
+ uint256 delegateVersion_ = delegateVersion[vault][delegate];
211
+ return
212
+ keccak256(
213
+ abi.encode(
214
+ delegate,
215
+ vault,
216
+ contract_,
217
+ vaultVersion_,
218
+ delegateVersion_
219
+ )
220
+ );
221
+ }
222
+
223
+ /**
224
+ * @dev Helper function to compute delegation hash for token delegation
225
+ */
226
+ function _computeTokenDelegationHash(
227
+ address vault,
228
+ address delegate,
229
+ address contract_,
230
+ uint256 tokenId
231
+ ) internal view returns (bytes32) {
232
+ uint256 vaultVersion_ = vaultVersion[vault];
233
+ uint256 delegateVersion_ = delegateVersion[vault][delegate];
234
+ return
235
+ keccak256(
236
+ abi.encode(
237
+ delegate,
238
+ vault,
239
+ contract_,
240
+ tokenId,
241
+ vaultVersion_,
242
+ delegateVersion_
243
+ )
244
+ );
245
+ }
246
+
247
+ /**
248
+ * @inheritdoc IDelegationRegistry
249
+ */
250
+ function revokeAllDelegates() external override {
251
+ ++vaultVersion[msg.sender];
252
+ emit IDelegationRegistry.RevokeAllDelegates(msg.sender);
253
+ }
254
+
255
+ /**
256
+ * @inheritdoc IDelegationRegistry
257
+ */
258
+ function revokeDelegate(address delegate) external override {
259
+ _revokeDelegate(delegate, msg.sender);
260
+ }
261
+
262
+ /**
263
+ * @inheritdoc IDelegationRegistry
264
+ */
265
+ function revokeSelf(address vault) external override {
266
+ _revokeDelegate(msg.sender, vault);
267
+ }
268
+
269
+ /**
270
+ * @dev Revoke the `delegate` hotwallet from the `vault` coldwallet.
271
+ */
272
+ function _revokeDelegate(address delegate, address vault) internal {
273
+ ++delegateVersion[vault][delegate];
274
+ // For enumerations, filter in the view functions
275
+ emit IDelegationRegistry.RevokeDelegate(vault, msg.sender);
276
+ }
277
+
278
+ /**
279
+ * ----------- READ -----------
280
+ */
281
+
282
+ /**
283
+ * @inheritdoc IDelegationRegistry
284
+ */
285
+ function getDelegationsByDelegate(
286
+ address delegate
287
+ ) external view returns (IDelegationRegistry.DelegationInfo[] memory info) {
288
+ EnumerableSet.Bytes32Set
289
+ storage potentialDelegationHashes = delegationHashes[delegate];
290
+ uint256 potentialDelegationHashesLength = potentialDelegationHashes
291
+ .length();
292
+ uint256 delegationCount = 0;
293
+ info = new IDelegationRegistry.DelegationInfo[](
294
+ potentialDelegationHashesLength
295
+ );
296
+ for (uint256 i = 0; i < potentialDelegationHashesLength; ) {
297
+ bytes32 delegateHash = potentialDelegationHashes.at(i);
298
+ IDelegationRegistry.DelegationInfo
299
+ memory delegationInfo_ = delegationInfo[delegateHash];
300
+ address vault = delegationInfo_.vault;
301
+ IDelegationRegistry.DelegationType type_ = delegationInfo_.type_;
302
+ bool valid = false;
303
+ if (type_ == IDelegationRegistry.DelegationType.ALL) {
304
+ if (
305
+ delegateHash == _computeAllDelegationHash(vault, delegate)
306
+ ) {
307
+ valid = true;
308
+ }
309
+ } else if (type_ == IDelegationRegistry.DelegationType.CONTRACT) {
310
+ if (
311
+ delegateHash ==
312
+ _computeContractDelegationHash(
313
+ vault,
314
+ delegate,
315
+ delegationInfo_.contract_
316
+ )
317
+ ) {
318
+ valid = true;
319
+ }
320
+ } else if (type_ == IDelegationRegistry.DelegationType.TOKEN) {
321
+ if (
322
+ delegateHash ==
323
+ _computeTokenDelegationHash(
324
+ vault,
325
+ delegate,
326
+ delegationInfo_.contract_,
327
+ delegationInfo_.tokenId
328
+ )
329
+ ) {
330
+ valid = true;
331
+ }
332
+ }
333
+ if (valid) {
334
+ info[delegationCount++] = delegationInfo_;
335
+ }
336
+ unchecked {
337
+ ++i;
338
+ }
339
+ }
340
+ if (potentialDelegationHashesLength > delegationCount) {
341
+ assembly {
342
+ let decrease := sub(
343
+ potentialDelegationHashesLength,
344
+ delegationCount
345
+ )
346
+ mstore(info, sub(mload(info), decrease))
347
+ }
348
+ }
349
+ }
350
+
351
+ /**
352
+ * @inheritdoc IDelegationRegistry
353
+ */
354
+ function getDelegatesForAll(
355
+ address vault
356
+ ) external view returns (address[] memory delegates) {
357
+ return
358
+ _getDelegatesForLevel(
359
+ vault,
360
+ IDelegationRegistry.DelegationType.ALL,
361
+ address(0),
362
+ 0
363
+ );
364
+ }
365
+
366
+ /**
367
+ * @inheritdoc IDelegationRegistry
368
+ */
369
+ function getDelegatesForContract(
370
+ address vault,
371
+ address contract_
372
+ ) external view override returns (address[] memory delegates) {
373
+ return
374
+ _getDelegatesForLevel(
375
+ vault,
376
+ IDelegationRegistry.DelegationType.CONTRACT,
377
+ contract_,
378
+ 0
379
+ );
380
+ }
381
+
382
+ /**
383
+ * @inheritdoc IDelegationRegistry
384
+ */
385
+ function getDelegatesForToken(
386
+ address vault,
387
+ address contract_,
388
+ uint256 tokenId
389
+ ) external view override returns (address[] memory delegates) {
390
+ return
391
+ _getDelegatesForLevel(
392
+ vault,
393
+ IDelegationRegistry.DelegationType.TOKEN,
394
+ contract_,
395
+ tokenId
396
+ );
397
+ }
398
+
399
+ function _getDelegatesForLevel(
400
+ address vault,
401
+ IDelegationRegistry.DelegationType delegationType,
402
+ address contract_,
403
+ uint256 tokenId
404
+ ) internal view returns (address[] memory delegates) {
405
+ EnumerableSet.Bytes32Set storage delegationHashes_ = delegations[vault][
406
+ vaultVersion[vault]
407
+ ];
408
+ uint256 potentialDelegatesLength = delegationHashes_.length();
409
+ uint256 delegatesCount = 0;
410
+ delegates = new address[](potentialDelegatesLength);
411
+ for (uint256 i = 0; i < potentialDelegatesLength; ) {
412
+ bytes32 delegationHash = delegationHashes_.at(i);
413
+ DelegationInfo storage delegationInfo_ = delegationInfo[
414
+ delegationHash
415
+ ];
416
+ if (delegationInfo_.type_ == delegationType) {
417
+ if (delegationType == IDelegationRegistry.DelegationType.ALL) {
418
+ // check delegate version by validating the hash
419
+ if (
420
+ delegationHash ==
421
+ _computeAllDelegationHash(
422
+ vault,
423
+ delegationInfo_.delegate
424
+ )
425
+ ) {
426
+ delegates[delegatesCount++] = delegationInfo_.delegate;
427
+ }
428
+ } else if (
429
+ delegationType ==
430
+ IDelegationRegistry.DelegationType.CONTRACT
431
+ ) {
432
+ if (delegationInfo_.contract_ == contract_) {
433
+ // check delegate version by validating the hash
434
+ if (
435
+ delegationHash ==
436
+ _computeContractDelegationHash(
437
+ vault,
438
+ delegationInfo_.delegate,
439
+ contract_
440
+ )
441
+ ) {
442
+ delegates[delegatesCount++] = delegationInfo_
443
+ .delegate;
444
+ }
445
+ }
446
+ } else if (
447
+ delegationType == IDelegationRegistry.DelegationType.TOKEN
448
+ ) {
449
+ if (
450
+ delegationInfo_.contract_ == contract_ &&
451
+ delegationInfo_.tokenId == tokenId
452
+ ) {
453
+ // check delegate version by validating the hash
454
+ if (
455
+ delegationHash ==
456
+ _computeTokenDelegationHash(
457
+ vault,
458
+ delegationInfo_.delegate,
459
+ contract_,
460
+ tokenId
461
+ )
462
+ ) {
463
+ delegates[delegatesCount++] = delegationInfo_
464
+ .delegate;
465
+ }
466
+ }
467
+ }
468
+ }
469
+ unchecked {
470
+ ++i;
471
+ }
472
+ }
473
+ if (potentialDelegatesLength > delegatesCount) {
474
+ assembly {
475
+ let decrease := sub(potentialDelegatesLength, delegatesCount)
476
+ mstore(delegates, sub(mload(delegates), decrease))
477
+ }
478
+ }
479
+ }
480
+
481
+ /**
482
+ * @inheritdoc IDelegationRegistry
483
+ */
484
+ function getContractLevelDelegations(
485
+ address vault
486
+ )
487
+ external
488
+ view
489
+ returns (
490
+ IDelegationRegistry.ContractDelegation[] memory contractDelegations
491
+ )
492
+ {
493
+ EnumerableSet.Bytes32Set storage delegationHashes_ = delegations[vault][
494
+ vaultVersion[vault]
495
+ ];
496
+ uint256 potentialLength = delegationHashes_.length();
497
+ uint256 delegationCount = 0;
498
+ contractDelegations = new IDelegationRegistry.ContractDelegation[](
499
+ potentialLength
500
+ );
501
+ for (uint256 i = 0; i < potentialLength; ) {
502
+ bytes32 delegationHash = delegationHashes_.at(i);
503
+ DelegationInfo storage delegationInfo_ = delegationInfo[
504
+ delegationHash
505
+ ];
506
+ if (
507
+ delegationInfo_.type_ ==
508
+ IDelegationRegistry.DelegationType.CONTRACT
509
+ ) {
510
+ // check delegate version by validating the hash
511
+ if (
512
+ delegationHash ==
513
+ _computeContractDelegationHash(
514
+ vault,
515
+ delegationInfo_.delegate,
516
+ delegationInfo_.contract_
517
+ )
518
+ ) {
519
+ contractDelegations[delegationCount++] = IDelegationRegistry
520
+ .ContractDelegation({
521
+ contract_: delegationInfo_.contract_,
522
+ delegate: delegationInfo_.delegate
523
+ });
524
+ }
525
+ }
526
+ unchecked {
527
+ ++i;
528
+ }
529
+ }
530
+ if (potentialLength > delegationCount) {
531
+ assembly {
532
+ let decrease := sub(potentialLength, delegationCount)
533
+ mstore(
534
+ contractDelegations,
535
+ sub(mload(contractDelegations), decrease)
536
+ )
537
+ }
538
+ }
539
+ }
540
+
541
+ /**
542
+ * @inheritdoc IDelegationRegistry
543
+ */
544
+ function getTokenLevelDelegations(
545
+ address vault
546
+ )
547
+ external
548
+ view
549
+ returns (IDelegationRegistry.TokenDelegation[] memory tokenDelegations)
550
+ {
551
+ EnumerableSet.Bytes32Set storage delegationHashes_ = delegations[vault][
552
+ vaultVersion[vault]
553
+ ];
554
+ uint256 potentialLength = delegationHashes_.length();
555
+ uint256 delegationCount = 0;
556
+ tokenDelegations = new IDelegationRegistry.TokenDelegation[](
557
+ potentialLength
558
+ );
559
+ for (uint256 i = 0; i < potentialLength; ) {
560
+ bytes32 delegationHash = delegationHashes_.at(i);
561
+ DelegationInfo storage delegationInfo_ = delegationInfo[
562
+ delegationHash
563
+ ];
564
+ if (
565
+ delegationInfo_.type_ ==
566
+ IDelegationRegistry.DelegationType.TOKEN
567
+ ) {
568
+ // check delegate version by validating the hash
569
+ if (
570
+ delegationHash ==
571
+ _computeTokenDelegationHash(
572
+ vault,
573
+ delegationInfo_.delegate,
574
+ delegationInfo_.contract_,
575
+ delegationInfo_.tokenId
576
+ )
577
+ ) {
578
+ tokenDelegations[delegationCount++] = IDelegationRegistry
579
+ .TokenDelegation({
580
+ contract_: delegationInfo_.contract_,
581
+ tokenId: delegationInfo_.tokenId,
582
+ delegate: delegationInfo_.delegate
583
+ });
584
+ }
585
+ }
586
+ unchecked {
587
+ ++i;
588
+ }
589
+ }
590
+ if (potentialLength > delegationCount) {
591
+ assembly {
592
+ let decrease := sub(potentialLength, delegationCount)
593
+ mstore(tokenDelegations, sub(mload(tokenDelegations), decrease))
594
+ }
595
+ }
596
+ }
597
+
598
+ /**
599
+ * @inheritdoc IDelegationRegistry
600
+ */
601
+ function checkDelegateForAll(
602
+ address delegate,
603
+ address vault
604
+ ) public view override returns (bool) {
605
+ bytes32 delegateHash = keccak256(
606
+ abi.encode(
607
+ delegate,
608
+ vault,
609
+ vaultVersion[vault],
610
+ delegateVersion[vault][delegate]
611
+ )
612
+ );
613
+ return delegations[vault][vaultVersion[vault]].contains(delegateHash);
614
+ }
615
+
616
+ /**
617
+ * @inheritdoc IDelegationRegistry
618
+ */
619
+ function checkDelegateForContract(
620
+ address delegate,
621
+ address vault,
622
+ address contract_
623
+ ) public view override returns (bool) {
624
+ bytes32 delegateHash = keccak256(
625
+ abi.encode(
626
+ delegate,
627
+ vault,
628
+ contract_,
629
+ vaultVersion[vault],
630
+ delegateVersion[vault][delegate]
631
+ )
632
+ );
633
+ return
634
+ delegations[vault][vaultVersion[vault]].contains(delegateHash)
635
+ ? true
636
+ : checkDelegateForAll(delegate, vault);
637
+ }
638
+
639
+ /**
640
+ * @inheritdoc IDelegationRegistry
641
+ */
642
+ function checkDelegateForToken(
643
+ address delegate,
644
+ address vault,
645
+ address contract_,
646
+ uint256 tokenId
647
+ ) public view override returns (bool) {
648
+ bytes32 delegateHash = keccak256(
649
+ abi.encode(
650
+ delegate,
651
+ vault,
652
+ contract_,
653
+ tokenId,
654
+ vaultVersion[vault],
655
+ delegateVersion[vault][delegate]
656
+ )
657
+ );
658
+ return
659
+ delegations[vault][vaultVersion[vault]].contains(delegateHash)
660
+ ? true
661
+ : checkDelegateForContract(delegate, vault, contract_);
662
+ }
663
+ }
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ pragma solidity >=0.7.0 <0.9.0;
3
+
4
+ import "@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol";
5
+
6
+ contract GnosisSafeMock is GnosisSafe {}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ pragma solidity >=0.7.0 <0.9.0;
3
+
4
+ import "@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol";
5
+
6
+ contract GnosisSafeProxyFactoryMock is GnosisSafeProxyFactory {}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ pragma solidity >=0.7.0 <0.9.0;
3
+
4
+ import "@gnosis.pm/safe-contracts/contracts/libraries/MultiSend.sol";
5
+
6
+ contract MultiSendMock is MultiSend {}