@artblocks/contracts 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +10 -0
- package/LICENSE +165 -0
- package/README.md +286 -0
- package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +164 -0
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +248 -0
- package/artifacts/contracts/BasicRandomizer.sol/BasicRandomizer.json +24 -0
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +1020 -0
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +1928 -0
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1942 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +1708 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +1410 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +1436 -0
- package/artifacts/contracts/engine/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +437 -0
- package/artifacts/contracts/engine/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +508 -0
- package/artifacts/contracts/engine/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +381 -0
- package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +109 -0
- package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +109 -0
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +1902 -0
- package/artifacts/contracts/interfaces/0.5.x/IBonusContract.sol/IBonusContract.json +47 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +413 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +392 -0
- package/artifacts/contracts/interfaces/0.5.x/IRandomizer.sol/IRandomizer.json +26 -0
- package/artifacts/contracts/interfaces/0.8.x/IAdminACLV0.sol/IAdminACLV0.json +122 -0
- package/artifacts/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +59 -0
- package/artifacts/contracts/interfaces/0.8.x/IBonusContract.sol/IBonusContract.json +43 -0
- package/artifacts/contracts/interfaces/0.8.x/IDelegationRegistry.sol/IDelegationRegistry.json +510 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +53 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +350 -0
- package/artifacts/contracts/interfaces/0.8.x/IEngineRegistryV0.sol/IEngineRegistryV0.json +85 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +730 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +311 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +617 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +292 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +598 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +355 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +368 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +674 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +551 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +564 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +601 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV0.sol/IFilteredMinterV0.json +216 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV1.sol/IFilteredMinterV1.json +485 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV2.sol/IFilteredMinterV2.json +522 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +299 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +609 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +448 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +649 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +362 -0
- package/artifacts/contracts/interfaces/0.8.x/IManifold.sol/IManifold.json +35 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +192 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizer.sol/IRandomizer.json +24 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +37 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC165.json +38 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +322 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +1773 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC165.json +32 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721.json +316 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +10 -0
- package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +338 -0
- package/artifacts/contracts/libs/0.5.x/CustomERC721Metadata.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/libs/0.5.x/IERC20.sol/IERC20.json +206 -0
- package/artifacts/contracts/libs/0.5.x/SafeMath.sol/SafeMath.json +10 -0
- package/artifacts/contracts/libs/0.5.x/Strings.sol/Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/BytecodeStorage.sol/BytecodeStorage.json +10 -0
- package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +357 -0
- package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +529 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +1037 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +172 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +24 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +342 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +322 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +550 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +856 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +1053 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +526 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +832 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +1100 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +1002 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +1039 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +365 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +671 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol/MinterSetPriceV1.json +288 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +436 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +742 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +461 -0
- package/artifacts/contracts/mock/BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json +194 -0
- package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +15 -0
- package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +292 -0
- package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +165 -0
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +128 -0
- package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +118 -0
- package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +87 -0
- package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +82 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +208 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +301 -0
- package/contracts/AdminACLV0.sol +103 -0
- package/contracts/AdminACLV1.sol +193 -0
- package/contracts/BasicRandomizer.sol +23 -0
- package/contracts/BasicRandomizerV2.sol +36 -0
- package/contracts/DependencyRegistryV0.sol +893 -0
- package/contracts/GenArt721CoreV3.sol +2001 -0
- package/contracts/GenArt721CoreV3_Engine.sol +2061 -0
- package/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol +887 -0
- package/contracts/engine/GenArt721CoreV2_PBAB.sol +695 -0
- package/contracts/engine/GenArt721CoreV2_PRTNR.sol +749 -0
- package/contracts/engine/GenArt721MinterBurner_PBAB.sol +467 -0
- package/contracts/engine/GenArt721MinterDAExp_PBAB.sol +614 -0
- package/contracts/engine/GenArt721Minter_PBAB.sol +420 -0
- package/contracts/engine-registry/EngineRegistryV0.sol +72 -0
- package/contracts/engine-registry/future/EngineRegistryV1.sol +86 -0
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +1989 -0
- package/contracts/interfaces/0.5.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol +91 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol +92 -0
- package/contracts/interfaces/0.5.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IAdminACLV0.sol +51 -0
- package/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol +34 -0
- package/contracts/interfaces/0.8.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +221 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +95 -0
- package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +38 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +70 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol +35 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol +32 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol +68 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol +37 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV0.sol +74 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV1.sol +127 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV2.sol +30 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol +73 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol +79 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +127 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +80 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol +91 -0
- package/contracts/interfaces/0.8.x/IManifold.sol +24 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +47 -0
- package/contracts/interfaces/0.8.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +15 -0
- package/contracts/legacy/GenArt721CoreV1.sol +1593 -0
- package/contracts/legacy/GenArt721LegacyMinter.sol +275 -0
- package/contracts/libs/0.5.x/CustomERC721Metadata.sol +52 -0
- package/contracts/libs/0.5.x/IERC20.sol +96 -0
- package/contracts/libs/0.5.x/SafeMath.sol +98 -0
- package/contracts/libs/0.5.x/Strings.sol +92 -0
- package/contracts/libs/0.8.x/BytecodeStorage.sol +314 -0
- package/contracts/libs/0.8.x/Bytes32Strings.sol +66 -0
- package/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol +514 -0
- package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +663 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol +6 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +291 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +320 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +571 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +622 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1066 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +527 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +576 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +749 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +798 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +682 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +733 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +350 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +401 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol +274 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +491 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +542 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol +470 -0
- package/contracts/mock/BytecodeTextCR_DMock.sol +184 -0
- package/contracts/mock/DeadReceiverMock.sol +13 -0
- package/contracts/mock/ERC20Mock.sol +11 -0
- package/contracts/mock/MockAdminACLV0.sol +65 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +43 -0
- package/contracts/mock/ReentrancyHolderMock.sol +50 -0
- package/contracts/mock/ReentrancyMerkleMock.sol +64 -0
- package/contracts/mock/ReentrancyMock.sol +44 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +168 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +221 -0
- package/package.json +83 -0
|
@@ -0,0 +1,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
|
+
}
|