@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,420 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
|
|
5
|
+
import "../interfaces/0.8.x/IBonusContract.sol";
|
|
6
|
+
|
|
7
|
+
import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol";
|
|
8
|
+
import "@openzeppelin-4.5/contracts/utils/Strings.sol";
|
|
9
|
+
import "@openzeppelin-4.5/contracts/interfaces/IERC20.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity 0.8.9;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Powered by Art Blocks minter contract that allows tokens to be
|
|
15
|
+
* minted with ETH or any ERC-20 token.
|
|
16
|
+
* @author Art Blocks Inc.
|
|
17
|
+
*/
|
|
18
|
+
contract GenArt721Minter_PBAB is ReentrancyGuard {
|
|
19
|
+
/// PBAB core contract this minter may interact with.
|
|
20
|
+
IGenArt721CoreV2_PBAB public genArtCoreContract;
|
|
21
|
+
|
|
22
|
+
uint256 constant ONE_MILLION = 1_000_000;
|
|
23
|
+
|
|
24
|
+
address payable public ownerAddress;
|
|
25
|
+
uint256 public ownerPercentage;
|
|
26
|
+
|
|
27
|
+
mapping(uint256 => bool) public projectIdToBonus;
|
|
28
|
+
mapping(uint256 => address) public projectIdToBonusContractAddress;
|
|
29
|
+
mapping(uint256 => bool) public contractFilterProject;
|
|
30
|
+
mapping(address => mapping(uint256 => uint256)) public projectMintCounter;
|
|
31
|
+
mapping(uint256 => uint256) public projectMintLimit;
|
|
32
|
+
mapping(uint256 => bool) public projectMaxHasBeenInvoked;
|
|
33
|
+
mapping(uint256 => uint256) public projectMaxInvocations;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @notice Initializes contract to be a Minter for PBAB core contract at
|
|
37
|
+
* address `_genArt721Address`.
|
|
38
|
+
*/
|
|
39
|
+
constructor(address _genArt721Address) ReentrancyGuard() {
|
|
40
|
+
genArtCoreContract = IGenArt721CoreV2_PBAB(_genArt721Address);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @notice Gets your balance of the ERC-20 token currently set
|
|
45
|
+
* as the payment currency for project `_projectId`.
|
|
46
|
+
* @param _projectId Project ID to be queried.
|
|
47
|
+
* @return balance Balance of ERC-20
|
|
48
|
+
*/
|
|
49
|
+
function getYourBalanceOfProjectERC20(
|
|
50
|
+
uint256 _projectId
|
|
51
|
+
) public view returns (uint256) {
|
|
52
|
+
uint256 balance = IERC20(
|
|
53
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
54
|
+
).balanceOf(msg.sender);
|
|
55
|
+
return balance;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @notice Gets your allowance for this minter of the ERC-20
|
|
60
|
+
* token currently set as the payment currency for project
|
|
61
|
+
* `_projectId`.
|
|
62
|
+
* @param _projectId Project ID to be queried.
|
|
63
|
+
* @return remaining Remaining allowance of ERC-20
|
|
64
|
+
*/
|
|
65
|
+
function checkYourAllowanceOfProjectERC20(
|
|
66
|
+
uint256 _projectId
|
|
67
|
+
) public view returns (uint256) {
|
|
68
|
+
uint256 remaining = IERC20(
|
|
69
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
70
|
+
).allowance(msg.sender, address(this));
|
|
71
|
+
return remaining;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @notice Sets the mint limit of a single purchaser for project
|
|
76
|
+
* `_projectId` to `_limit`.
|
|
77
|
+
* @param _projectId Project ID to set the mint limit for.
|
|
78
|
+
* @param _limit Number of times a given address may mint the project's
|
|
79
|
+
* tokens.
|
|
80
|
+
*/
|
|
81
|
+
function setProjectMintLimit(uint256 _projectId, uint8 _limit) public {
|
|
82
|
+
require(
|
|
83
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
84
|
+
"can only be set by admin"
|
|
85
|
+
);
|
|
86
|
+
projectMintLimit[_projectId] = _limit;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @notice Sets the maximum invocations of project `_projectId` based
|
|
91
|
+
* on the value currently defined in the core contract.
|
|
92
|
+
* @param _projectId Project ID to set the maximum invocations for.
|
|
93
|
+
* @dev also checks and may refresh projectMaxHasBeenInvoked for project
|
|
94
|
+
*/
|
|
95
|
+
function setProjectMaxInvocations(uint256 _projectId) public {
|
|
96
|
+
require(
|
|
97
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
98
|
+
"can only be set by admin"
|
|
99
|
+
);
|
|
100
|
+
uint256 maxInvocations;
|
|
101
|
+
uint256 invocations;
|
|
102
|
+
(, , invocations, maxInvocations, , , , , ) = genArtCoreContract
|
|
103
|
+
.projectTokenInfo(_projectId);
|
|
104
|
+
projectMaxInvocations[_projectId] = maxInvocations;
|
|
105
|
+
if (invocations < maxInvocations) {
|
|
106
|
+
projectMaxHasBeenInvoked[_projectId] = false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @notice Sets the owner address to `_ownerAddress`.
|
|
112
|
+
* @param _ownerAddress New owner address.
|
|
113
|
+
*/
|
|
114
|
+
function setOwnerAddress(address payable _ownerAddress) public {
|
|
115
|
+
require(
|
|
116
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
117
|
+
"can only be set by admin"
|
|
118
|
+
);
|
|
119
|
+
ownerAddress = _ownerAddress;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @notice Sets the owner mint revenue to `_ownerPercentage` percent.
|
|
124
|
+
* @param _ownerPercentage New owner percentage.
|
|
125
|
+
*/
|
|
126
|
+
function setOwnerPercentage(uint256 _ownerPercentage) public {
|
|
127
|
+
require(
|
|
128
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
129
|
+
"can only be set by admin"
|
|
130
|
+
);
|
|
131
|
+
ownerPercentage = _ownerPercentage;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @notice Toggles if contracts are allowed to mint tokens for
|
|
136
|
+
* project `_projectId`.
|
|
137
|
+
* @param _projectId Project ID to be toggled.
|
|
138
|
+
*/
|
|
139
|
+
function toggleContractFilter(uint256 _projectId) public {
|
|
140
|
+
require(
|
|
141
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
142
|
+
"can only be set by admin"
|
|
143
|
+
);
|
|
144
|
+
contractFilterProject[_projectId] = !contractFilterProject[_projectId];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @notice Toggles if bonus contract for project `_projectId`.
|
|
149
|
+
* @param _projectId Project ID to be toggled.
|
|
150
|
+
*/
|
|
151
|
+
function artistToggleBonus(uint256 _projectId) public {
|
|
152
|
+
require(
|
|
153
|
+
msg.sender ==
|
|
154
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId),
|
|
155
|
+
"can only be set by artist"
|
|
156
|
+
);
|
|
157
|
+
projectIdToBonus[_projectId] = !projectIdToBonus[_projectId];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @notice Sets bonus contract for project `_projectId` to
|
|
162
|
+
* `_bonusContractAddress`.
|
|
163
|
+
* @param _projectId Project ID to be toggled.
|
|
164
|
+
* @param _bonusContractAddress Bonus contract.
|
|
165
|
+
*/
|
|
166
|
+
function artistSetBonusContractAddress(
|
|
167
|
+
uint256 _projectId,
|
|
168
|
+
address _bonusContractAddress
|
|
169
|
+
) public {
|
|
170
|
+
require(
|
|
171
|
+
msg.sender ==
|
|
172
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId),
|
|
173
|
+
"can only be set by artist"
|
|
174
|
+
);
|
|
175
|
+
projectIdToBonusContractAddress[_projectId] = _bonusContractAddress;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @notice Purchases a token from project `_projectId`.
|
|
180
|
+
* @param _projectId Project ID to mint a token on.
|
|
181
|
+
* @return _tokenId Token ID of minted token
|
|
182
|
+
*/
|
|
183
|
+
function purchase(
|
|
184
|
+
uint256 _projectId
|
|
185
|
+
) public payable returns (uint256 _tokenId) {
|
|
186
|
+
return purchaseTo(msg.sender, _projectId);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* @notice Purchases a token from project `_projectId` and sets
|
|
191
|
+
* the token's owner to `_to`.
|
|
192
|
+
* @param _to Address to be the new token's owner.
|
|
193
|
+
* @param _projectId Project ID to mint a token on.
|
|
194
|
+
* @return _tokenId Token ID of minted token
|
|
195
|
+
*/
|
|
196
|
+
function purchaseTo(
|
|
197
|
+
address _to,
|
|
198
|
+
uint256 _projectId
|
|
199
|
+
) public payable nonReentrant returns (uint256 _tokenId) {
|
|
200
|
+
// CHECKS
|
|
201
|
+
require(
|
|
202
|
+
!projectMaxHasBeenInvoked[_projectId],
|
|
203
|
+
"Maximum number of invocations reached"
|
|
204
|
+
);
|
|
205
|
+
// if contract filter is active prevent calls from another contract
|
|
206
|
+
if (contractFilterProject[_projectId]) {
|
|
207
|
+
require(msg.sender == tx.origin, "No Contract Buys");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// limit mints per address by project
|
|
211
|
+
if (projectMintLimit[_projectId] > 0) {
|
|
212
|
+
require(
|
|
213
|
+
projectMintCounter[msg.sender][_projectId] <
|
|
214
|
+
projectMintLimit[_projectId],
|
|
215
|
+
"Reached minting limit"
|
|
216
|
+
);
|
|
217
|
+
// EFFECTS
|
|
218
|
+
projectMintCounter[msg.sender][_projectId]++;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
uint256 tokenId = genArtCoreContract.mint(_to, _projectId, msg.sender);
|
|
222
|
+
|
|
223
|
+
// What if this overflows, since default value of uint256 is 0?
|
|
224
|
+
// That is intended, so that by default the minter allows infinite
|
|
225
|
+
// transactions, allowing the `genArtCoreContract` to stop minting
|
|
226
|
+
// `uint256 tokenInvocation = tokenId % ONE_MILLION;`
|
|
227
|
+
if (
|
|
228
|
+
projectMaxInvocations[_projectId] > 0 &&
|
|
229
|
+
tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1
|
|
230
|
+
) {
|
|
231
|
+
projectMaxHasBeenInvoked[_projectId] = true;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// INTERACTIONS
|
|
235
|
+
// bonus contract
|
|
236
|
+
if (projectIdToBonus[_projectId]) {
|
|
237
|
+
require(
|
|
238
|
+
IBonusContract(projectIdToBonusContractAddress[_projectId])
|
|
239
|
+
.bonusIsActive(),
|
|
240
|
+
"bonus must be active"
|
|
241
|
+
);
|
|
242
|
+
IBonusContract(projectIdToBonusContractAddress[_projectId])
|
|
243
|
+
.triggerBonus(msg.sender);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// validate and split funds
|
|
247
|
+
if (
|
|
248
|
+
keccak256(
|
|
249
|
+
abi.encodePacked(
|
|
250
|
+
genArtCoreContract.projectIdToCurrencySymbol(_projectId)
|
|
251
|
+
)
|
|
252
|
+
) != keccak256(abi.encodePacked("ETH"))
|
|
253
|
+
) {
|
|
254
|
+
require(
|
|
255
|
+
msg.value == 0,
|
|
256
|
+
"this project accepts a different currency and cannot accept ETH"
|
|
257
|
+
);
|
|
258
|
+
require(
|
|
259
|
+
IERC20(
|
|
260
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
261
|
+
).allowance(msg.sender, address(this)) >=
|
|
262
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(
|
|
263
|
+
_projectId
|
|
264
|
+
),
|
|
265
|
+
"Insufficient Funds Approved for TX"
|
|
266
|
+
);
|
|
267
|
+
require(
|
|
268
|
+
IERC20(
|
|
269
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
270
|
+
).balanceOf(msg.sender) >=
|
|
271
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(
|
|
272
|
+
_projectId
|
|
273
|
+
),
|
|
274
|
+
"Insufficient balance."
|
|
275
|
+
);
|
|
276
|
+
_splitFundsERC20(_projectId);
|
|
277
|
+
} else {
|
|
278
|
+
require(
|
|
279
|
+
msg.value >=
|
|
280
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(
|
|
281
|
+
_projectId
|
|
282
|
+
),
|
|
283
|
+
"Must send minimum value to mint!"
|
|
284
|
+
);
|
|
285
|
+
_splitFundsETH(_projectId);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return tokenId;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @dev splits ETH funds between sender (if refund), foundation,
|
|
293
|
+
* artist, and artist's additional payee for a token purchased on
|
|
294
|
+
* project `_projectId`.
|
|
295
|
+
* @dev utilizes transfer() to send ETH, so access lists may need to be
|
|
296
|
+
* populated when purchasing tokens.
|
|
297
|
+
*/
|
|
298
|
+
function _splitFundsETH(uint256 _projectId) internal {
|
|
299
|
+
if (msg.value > 0) {
|
|
300
|
+
uint256 pricePerTokenInWei = genArtCoreContract
|
|
301
|
+
.projectIdToPricePerTokenInWei(_projectId);
|
|
302
|
+
uint256 refund = msg.value -
|
|
303
|
+
genArtCoreContract.projectIdToPricePerTokenInWei(_projectId);
|
|
304
|
+
if (refund > 0) {
|
|
305
|
+
(bool success_, ) = msg.sender.call{value: refund}("");
|
|
306
|
+
require(success_, "Refund failed");
|
|
307
|
+
}
|
|
308
|
+
uint256 renderProviderAmount = (pricePerTokenInWei *
|
|
309
|
+
genArtCoreContract.renderProviderPercentage()) / 100;
|
|
310
|
+
if (renderProviderAmount > 0) {
|
|
311
|
+
(bool success_, ) = genArtCoreContract
|
|
312
|
+
.renderProviderAddress()
|
|
313
|
+
.call{value: renderProviderAmount}("");
|
|
314
|
+
require(success_, "Renderer payment failed");
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
|
|
318
|
+
|
|
319
|
+
uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
|
|
320
|
+
if (ownerFunds > 0) {
|
|
321
|
+
(bool success_, ) = ownerAddress.call{value: ownerFunds}("");
|
|
322
|
+
require(success_, "Owner payment failed");
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
uint256 projectFunds = pricePerTokenInWei -
|
|
326
|
+
renderProviderAmount -
|
|
327
|
+
ownerFunds;
|
|
328
|
+
uint256 additionalPayeeAmount;
|
|
329
|
+
if (
|
|
330
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
331
|
+
_projectId
|
|
332
|
+
) > 0
|
|
333
|
+
) {
|
|
334
|
+
additionalPayeeAmount =
|
|
335
|
+
(projectFunds *
|
|
336
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
337
|
+
_projectId
|
|
338
|
+
)) /
|
|
339
|
+
100;
|
|
340
|
+
if (additionalPayeeAmount > 0) {
|
|
341
|
+
(bool success_, ) = genArtCoreContract
|
|
342
|
+
.projectIdToAdditionalPayee(_projectId)
|
|
343
|
+
.call{value: additionalPayeeAmount}("");
|
|
344
|
+
require(success_, "Additional payment failed");
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
uint256 creatorFunds = projectFunds - additionalPayeeAmount;
|
|
348
|
+
if (creatorFunds > 0) {
|
|
349
|
+
(bool success_, ) = genArtCoreContract
|
|
350
|
+
.projectIdToArtistAddress(_projectId)
|
|
351
|
+
.call{value: creatorFunds}("");
|
|
352
|
+
require(success_, "Artist payment failed");
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* @dev splits ERC-20 funds between render provider, owner, artist, and
|
|
359
|
+
* artist's additional payee, for a token purchased on project
|
|
360
|
+
`_projectId`.
|
|
361
|
+
*/
|
|
362
|
+
function _splitFundsERC20(uint256 _projectId) internal {
|
|
363
|
+
uint256 pricePerTokenInWei = genArtCoreContract
|
|
364
|
+
.projectIdToPricePerTokenInWei(_projectId);
|
|
365
|
+
uint256 renderProviderAmount = (pricePerTokenInWei *
|
|
366
|
+
genArtCoreContract.renderProviderPercentage()) / 100;
|
|
367
|
+
if (renderProviderAmount > 0) {
|
|
368
|
+
IERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
|
|
369
|
+
.transferFrom(
|
|
370
|
+
msg.sender,
|
|
371
|
+
genArtCoreContract.renderProviderAddress(),
|
|
372
|
+
renderProviderAmount
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
|
|
376
|
+
|
|
377
|
+
uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
|
|
378
|
+
if (ownerFunds > 0) {
|
|
379
|
+
IERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
|
|
380
|
+
.transferFrom(msg.sender, ownerAddress, ownerFunds);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
uint256 projectFunds = pricePerTokenInWei -
|
|
384
|
+
renderProviderAmount -
|
|
385
|
+
ownerFunds;
|
|
386
|
+
uint256 additionalPayeeAmount;
|
|
387
|
+
if (
|
|
388
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
389
|
+
_projectId
|
|
390
|
+
) > 0
|
|
391
|
+
) {
|
|
392
|
+
additionalPayeeAmount =
|
|
393
|
+
(projectFunds *
|
|
394
|
+
genArtCoreContract.projectIdToAdditionalPayeePercentage(
|
|
395
|
+
_projectId
|
|
396
|
+
)) /
|
|
397
|
+
100;
|
|
398
|
+
if (additionalPayeeAmount > 0) {
|
|
399
|
+
IERC20(
|
|
400
|
+
genArtCoreContract.projectIdToCurrencyAddress(_projectId)
|
|
401
|
+
).transferFrom(
|
|
402
|
+
msg.sender,
|
|
403
|
+
genArtCoreContract.projectIdToAdditionalPayee(
|
|
404
|
+
_projectId
|
|
405
|
+
),
|
|
406
|
+
additionalPayeeAmount
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
uint256 creatorFunds = projectFunds - additionalPayeeAmount;
|
|
411
|
+
if (creatorFunds > 0) {
|
|
412
|
+
IERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
|
|
413
|
+
.transferFrom(
|
|
414
|
+
msg.sender,
|
|
415
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId),
|
|
416
|
+
creatorFunds
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity 0.8.17;
|
|
4
|
+
|
|
5
|
+
import "../interfaces/0.8.x/IEngineRegistryV0.sol";
|
|
6
|
+
import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @title Engine Registry contract, V0.
|
|
10
|
+
* @author Art Blocks Inc.
|
|
11
|
+
* @notice Privileged Roles and Ownership:
|
|
12
|
+
* This contract intentionally has no owners or admins, and is intended
|
|
13
|
+
* to be deployed with a permissioned `deployerAddress` that may speak
|
|
14
|
+
* to this registry. If in the future multiple deployer addresses are
|
|
15
|
+
* needed to interact with this registry, a new registry version with
|
|
16
|
+
* more complex logic should be implemented and deployed to replace this.
|
|
17
|
+
*/
|
|
18
|
+
contract EngineRegistryV0 is IEngineRegistryV0, ERC165 {
|
|
19
|
+
/// configuration variable (determined at time of deployment)
|
|
20
|
+
/// that determines what address may perform registration actions.
|
|
21
|
+
address internal immutable deployerAddress;
|
|
22
|
+
|
|
23
|
+
/// internal mapping for managing known list of registered contracts.
|
|
24
|
+
mapping(address => bool) internal registeredContractAddresses;
|
|
25
|
+
|
|
26
|
+
constructor() {
|
|
27
|
+
// The deployer of the registry becomes the permissioned deployer for speaking to the registry.
|
|
28
|
+
deployerAddress = tx.origin;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @inheritdoc IEngineRegistryV0
|
|
33
|
+
*/
|
|
34
|
+
function registerContract(
|
|
35
|
+
address _contractAddress,
|
|
36
|
+
bytes32 _coreVersion,
|
|
37
|
+
bytes32 _coreType
|
|
38
|
+
) external {
|
|
39
|
+
// CHECKS
|
|
40
|
+
// Validate against `tx.origin` rather than `msg.sender` as it is intended that this registration be
|
|
41
|
+
// performed in an automated fashion *at the time* of contract deployment for the `_contractAddress`.
|
|
42
|
+
require(
|
|
43
|
+
tx.origin == deployerAddress,
|
|
44
|
+
"Only allowed deployer-address TX origin"
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// EFFECTS
|
|
48
|
+
emit ContractRegistered(_contractAddress, _coreVersion, _coreType);
|
|
49
|
+
registeredContractAddresses[_contractAddress] = true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @inheritdoc IEngineRegistryV0
|
|
54
|
+
*/
|
|
55
|
+
function unregisterContract(address _contractAddress) external {
|
|
56
|
+
// CHECKS
|
|
57
|
+
// Validate against `tx.origin` rather than `msg.sender` for consistency with the above approach,
|
|
58
|
+
// as we expect in usage of this contract `msg.sender == tx.origin` to be a true assessment.
|
|
59
|
+
require(
|
|
60
|
+
tx.origin == deployerAddress,
|
|
61
|
+
"Only allowed deployer-address TX origin"
|
|
62
|
+
);
|
|
63
|
+
require(
|
|
64
|
+
registeredContractAddresses[_contractAddress],
|
|
65
|
+
"Only unregister already registered contracts"
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// EFFECTS
|
|
69
|
+
emit ContractUnregistered(_contractAddress);
|
|
70
|
+
registeredContractAddresses[_contractAddress] = false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
pragma solidity 0.8.17;
|
|
4
|
+
|
|
5
|
+
import "../../interfaces/0.8.x/IEngineRegistryV0.sol";
|
|
6
|
+
import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @title Engine Registry contract, V1.
|
|
10
|
+
* @author Art Blocks Inc.
|
|
11
|
+
* @notice Privileged Roles and Ownership:
|
|
12
|
+
* This contract intentionally has no owners or admins, and is intended
|
|
13
|
+
* to be deployed with a permissioned `deployerAddress` that may speak
|
|
14
|
+
* to this registry. If in the future multiple deployer addresses are
|
|
15
|
+
* needed to interact with this registry, a new registry version with
|
|
16
|
+
* more complex logic should be implemented and deployed to replace this.
|
|
17
|
+
* @dev TODO This contract contains only minor security improvements relative
|
|
18
|
+
* to the V0 version, and is intended to only be deployed in the future if an
|
|
19
|
+
* upgrade to the registry is needed. The V0 version should be considered the
|
|
20
|
+
* canonical version of the registry while this future version is not yet
|
|
21
|
+
* deployed.
|
|
22
|
+
*/
|
|
23
|
+
contract EngineRegistryV1 is IEngineRegistryV0, ERC165 {
|
|
24
|
+
/// configuration variable (determined at time of deployment)
|
|
25
|
+
/// that determines what address may perform registration actions.
|
|
26
|
+
address internal immutable deployerAddress;
|
|
27
|
+
|
|
28
|
+
/// internal mapping for managing known list of registered contracts.
|
|
29
|
+
mapping(address => bool) internal registeredContractAddresses;
|
|
30
|
+
|
|
31
|
+
constructor() {
|
|
32
|
+
// The deployer of the registry becomes the permissioned deployer for speaking to the registry.
|
|
33
|
+
deployerAddress = tx.origin;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @inheritdoc IEngineRegistryV0
|
|
38
|
+
*/
|
|
39
|
+
function registerContract(
|
|
40
|
+
address _contractAddress,
|
|
41
|
+
bytes32 _coreVersion,
|
|
42
|
+
bytes32 _coreType
|
|
43
|
+
) external {
|
|
44
|
+
// CHECKS
|
|
45
|
+
// Validate against `tx.origin` rather than `msg.sender` as it is intended that this registration be
|
|
46
|
+
// performed in an automated fashion *at the time* of contract deployment for the `_contractAddress`.
|
|
47
|
+
require(
|
|
48
|
+
tx.origin == deployerAddress,
|
|
49
|
+
"Only allowed deployer-address TX origin"
|
|
50
|
+
);
|
|
51
|
+
// Prevent registration of a contract by an unrelated contract
|
|
52
|
+
require(
|
|
53
|
+
msg.sender == _contractAddress || msg.sender == deployerAddress,
|
|
54
|
+
"Only call by deployerAddress or _contractAddress"
|
|
55
|
+
);
|
|
56
|
+
// EFFECTS
|
|
57
|
+
registeredContractAddresses[_contractAddress] = true;
|
|
58
|
+
emit ContractRegistered(_contractAddress, _coreVersion, _coreType);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @inheritdoc IEngineRegistryV0
|
|
63
|
+
*/
|
|
64
|
+
function unregisterContract(address _contractAddress) external {
|
|
65
|
+
// CHECKS
|
|
66
|
+
// Validate against `tx.origin` rather than `msg.sender` for consistency with the above approach,
|
|
67
|
+
// as we expect in usage of this contract `msg.sender == tx.origin` to be a true assessment.
|
|
68
|
+
require(
|
|
69
|
+
tx.origin == deployerAddress,
|
|
70
|
+
"Only allowed deployer-address TX origin"
|
|
71
|
+
);
|
|
72
|
+
// Prevent unregistration of a contract by an unrelated contract
|
|
73
|
+
require(
|
|
74
|
+
msg.sender == _contractAddress || msg.sender == deployerAddress,
|
|
75
|
+
"Only call by deployerAddress or _contractAddress"
|
|
76
|
+
);
|
|
77
|
+
require(
|
|
78
|
+
registeredContractAddresses[_contractAddress],
|
|
79
|
+
"Only unregister already registered contracts"
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// EFFECTS
|
|
83
|
+
registeredContractAddresses[_contractAddress] = false;
|
|
84
|
+
emit ContractUnregistered(_contractAddress);
|
|
85
|
+
}
|
|
86
|
+
}
|