@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,695 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IRandomizer.sol";
|
|
5
|
+
import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
|
|
6
|
+
|
|
7
|
+
import "@openzeppelin-4.5/contracts/utils/Strings.sol";
|
|
8
|
+
|
|
9
|
+
import "@openzeppelin-4.5/contracts/token/ERC721/ERC721.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity 0.8.9;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Powered by Art Blocks ERC-721 core contract.
|
|
15
|
+
* @author Art Blocks Inc.
|
|
16
|
+
*/
|
|
17
|
+
contract GenArt721CoreV2_PBAB is ERC721, IGenArt721CoreV2_PBAB {
|
|
18
|
+
/// randomizer contract
|
|
19
|
+
IRandomizer public randomizerContract;
|
|
20
|
+
|
|
21
|
+
struct Project {
|
|
22
|
+
string name;
|
|
23
|
+
string artist;
|
|
24
|
+
string description;
|
|
25
|
+
string website;
|
|
26
|
+
string license;
|
|
27
|
+
string projectBaseURI;
|
|
28
|
+
uint256 invocations;
|
|
29
|
+
uint256 maxInvocations;
|
|
30
|
+
string scriptJSON;
|
|
31
|
+
mapping(uint256 => string) scripts;
|
|
32
|
+
uint256 scriptCount;
|
|
33
|
+
string ipfsHash;
|
|
34
|
+
bool active;
|
|
35
|
+
bool locked;
|
|
36
|
+
bool paused;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
uint256 constant ONE_MILLION = 1_000_000;
|
|
40
|
+
mapping(uint256 => Project) projects;
|
|
41
|
+
|
|
42
|
+
//All financial functions are stripped from struct for visibility
|
|
43
|
+
mapping(uint256 => address payable) public projectIdToArtistAddress;
|
|
44
|
+
mapping(uint256 => string) public projectIdToCurrencySymbol;
|
|
45
|
+
mapping(uint256 => address) public projectIdToCurrencyAddress;
|
|
46
|
+
mapping(uint256 => uint256) public projectIdToPricePerTokenInWei;
|
|
47
|
+
mapping(uint256 => address payable) public projectIdToAdditionalPayee;
|
|
48
|
+
mapping(uint256 => uint256) public projectIdToAdditionalPayeePercentage;
|
|
49
|
+
mapping(uint256 => uint256)
|
|
50
|
+
public projectIdToSecondaryMarketRoyaltyPercentage;
|
|
51
|
+
|
|
52
|
+
address payable public renderProviderAddress;
|
|
53
|
+
/// Percentage of mint revenue allocated to render provider
|
|
54
|
+
uint256 public renderProviderPercentage = 10;
|
|
55
|
+
|
|
56
|
+
mapping(uint256 => uint256) public tokenIdToProjectId;
|
|
57
|
+
mapping(uint256 => bytes32) public tokenIdToHash;
|
|
58
|
+
mapping(bytes32 => uint256) public hashToTokenId;
|
|
59
|
+
|
|
60
|
+
/// admin for contract
|
|
61
|
+
address public admin;
|
|
62
|
+
/// true if address is whitelisted
|
|
63
|
+
mapping(address => bool) public isWhitelisted;
|
|
64
|
+
/// true if minter is whitelisted
|
|
65
|
+
mapping(address => bool) public isMintWhitelisted;
|
|
66
|
+
|
|
67
|
+
/// next project ID to be created
|
|
68
|
+
uint256 public nextProjectId;
|
|
69
|
+
|
|
70
|
+
modifier onlyValidTokenId(uint256 _tokenId) {
|
|
71
|
+
require(_exists(_tokenId), "Token ID does not exist");
|
|
72
|
+
_;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
modifier onlyUnlocked(uint256 _projectId) {
|
|
76
|
+
require(!projects[_projectId].locked, "Only if unlocked");
|
|
77
|
+
_;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
modifier onlyArtist(uint256 _projectId) {
|
|
81
|
+
require(
|
|
82
|
+
msg.sender == projectIdToArtistAddress[_projectId],
|
|
83
|
+
"Only artist"
|
|
84
|
+
);
|
|
85
|
+
_;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
modifier onlyAdmin() {
|
|
89
|
+
require(msg.sender == admin, "Only admin");
|
|
90
|
+
_;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
modifier onlyWhitelisted() {
|
|
94
|
+
require(isWhitelisted[msg.sender], "Only whitelisted");
|
|
95
|
+
_;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
modifier onlyArtistOrWhitelisted(uint256 _projectId) {
|
|
99
|
+
require(
|
|
100
|
+
isWhitelisted[msg.sender] ||
|
|
101
|
+
msg.sender == projectIdToArtistAddress[_projectId],
|
|
102
|
+
"Only artist or whitelisted"
|
|
103
|
+
);
|
|
104
|
+
_;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @notice Initializes contract.
|
|
109
|
+
* @param _tokenName Name of token.
|
|
110
|
+
* @param _tokenSymbol Token symbol.
|
|
111
|
+
* @param _randomizerContract Randomizer contract.
|
|
112
|
+
* @param _startingProjectId The initial next project ID.
|
|
113
|
+
* @dev _startingProjectId should be set to a value much, much less than
|
|
114
|
+
* max(uint256) to avoid overflow when adding to it.
|
|
115
|
+
*/
|
|
116
|
+
constructor(
|
|
117
|
+
string memory _tokenName,
|
|
118
|
+
string memory _tokenSymbol,
|
|
119
|
+
address _randomizerContract,
|
|
120
|
+
uint256 _startingProjectId
|
|
121
|
+
) ERC721(_tokenName, _tokenSymbol) {
|
|
122
|
+
admin = msg.sender;
|
|
123
|
+
isWhitelisted[msg.sender] = true;
|
|
124
|
+
renderProviderAddress = payable(msg.sender);
|
|
125
|
+
randomizerContract = IRandomizer(_randomizerContract);
|
|
126
|
+
// initialize next project ID
|
|
127
|
+
nextProjectId = _startingProjectId;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @notice Mints a token from project `_projectId` and sets the
|
|
132
|
+
* token's owner to `_to`.
|
|
133
|
+
* @param _to Address to be the minted token's owner.
|
|
134
|
+
* @param _projectId Project ID to mint a token on.
|
|
135
|
+
* @param _by Purchaser of minted token.
|
|
136
|
+
* @dev sender must be a whitelisted minter
|
|
137
|
+
*/
|
|
138
|
+
function mint(
|
|
139
|
+
address _to,
|
|
140
|
+
uint256 _projectId,
|
|
141
|
+
address _by
|
|
142
|
+
) external returns (uint256 _tokenId) {
|
|
143
|
+
require(
|
|
144
|
+
isMintWhitelisted[msg.sender],
|
|
145
|
+
"Must mint from whitelisted minter contract."
|
|
146
|
+
);
|
|
147
|
+
require(
|
|
148
|
+
projects[_projectId].invocations + 1 <=
|
|
149
|
+
projects[_projectId].maxInvocations,
|
|
150
|
+
"Must not exceed max invocations"
|
|
151
|
+
);
|
|
152
|
+
require(
|
|
153
|
+
projects[_projectId].active ||
|
|
154
|
+
_by == projectIdToArtistAddress[_projectId],
|
|
155
|
+
"Project must exist and be active"
|
|
156
|
+
);
|
|
157
|
+
require(
|
|
158
|
+
!projects[_projectId].paused ||
|
|
159
|
+
_by == projectIdToArtistAddress[_projectId],
|
|
160
|
+
"Purchases are paused."
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
uint256 tokenId = _mintToken(_to, _projectId);
|
|
164
|
+
|
|
165
|
+
return tokenId;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function _mintToken(
|
|
169
|
+
address _to,
|
|
170
|
+
uint256 _projectId
|
|
171
|
+
) internal returns (uint256 _tokenId) {
|
|
172
|
+
uint256 tokenIdToBe = (_projectId * ONE_MILLION) +
|
|
173
|
+
projects[_projectId].invocations;
|
|
174
|
+
|
|
175
|
+
projects[_projectId].invocations = projects[_projectId].invocations + 1;
|
|
176
|
+
|
|
177
|
+
bytes32 hash = keccak256(
|
|
178
|
+
abi.encodePacked(
|
|
179
|
+
projects[_projectId].invocations,
|
|
180
|
+
block.number,
|
|
181
|
+
blockhash(block.number - 1),
|
|
182
|
+
randomizerContract.returnValue()
|
|
183
|
+
)
|
|
184
|
+
);
|
|
185
|
+
tokenIdToHash[tokenIdToBe] = hash;
|
|
186
|
+
hashToTokenId[hash] = tokenIdToBe;
|
|
187
|
+
|
|
188
|
+
_mint(_to, tokenIdToBe);
|
|
189
|
+
|
|
190
|
+
tokenIdToProjectId[tokenIdToBe] = _projectId;
|
|
191
|
+
|
|
192
|
+
emit Mint(_to, tokenIdToBe, _projectId);
|
|
193
|
+
|
|
194
|
+
return tokenIdToBe;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @notice Updates contract admin to `_adminAddress`.
|
|
199
|
+
*/
|
|
200
|
+
function updateAdmin(address _adminAddress) public onlyAdmin {
|
|
201
|
+
admin = _adminAddress;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* @notice Updates render provider address to `_renderProviderAddress`.
|
|
206
|
+
*/
|
|
207
|
+
function updateRenderProviderAddress(
|
|
208
|
+
address payable _renderProviderAddress
|
|
209
|
+
) public onlyAdmin {
|
|
210
|
+
renderProviderAddress = _renderProviderAddress;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @notice Updates render provider mint revenue percentage to
|
|
215
|
+
* `_renderProviderPercentage`.
|
|
216
|
+
*/
|
|
217
|
+
function updateRenderProviderPercentage(
|
|
218
|
+
uint256 _renderProviderPercentage
|
|
219
|
+
) public onlyAdmin {
|
|
220
|
+
require(_renderProviderPercentage <= 25, "Max of 25%");
|
|
221
|
+
renderProviderPercentage = _renderProviderPercentage;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* @notice Whitelists `_address`.
|
|
226
|
+
*/
|
|
227
|
+
function addWhitelisted(address _address) public onlyAdmin {
|
|
228
|
+
isWhitelisted[_address] = true;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* @notice Revokes whitelisting of `_address`.
|
|
233
|
+
*/
|
|
234
|
+
function removeWhitelisted(address _address) public onlyAdmin {
|
|
235
|
+
isWhitelisted[_address] = false;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @notice Whitelists minter `_address`.
|
|
240
|
+
*/
|
|
241
|
+
function addMintWhitelisted(address _address) public onlyAdmin {
|
|
242
|
+
isMintWhitelisted[_address] = true;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* @notice Revokes whitelisting of minter `_address`.
|
|
247
|
+
*/
|
|
248
|
+
function removeMintWhitelisted(address _address) public onlyAdmin {
|
|
249
|
+
isMintWhitelisted[_address] = false;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* @notice Updates randomizer to `_randomizerAddress`.
|
|
254
|
+
*/
|
|
255
|
+
function updateRandomizerAddress(
|
|
256
|
+
address _randomizerAddress
|
|
257
|
+
) public onlyWhitelisted {
|
|
258
|
+
randomizerContract = IRandomizer(_randomizerAddress);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @notice Locks project `_projectId`.
|
|
263
|
+
*/
|
|
264
|
+
function toggleProjectIsLocked(
|
|
265
|
+
uint256 _projectId
|
|
266
|
+
) public onlyWhitelisted onlyUnlocked(_projectId) {
|
|
267
|
+
projects[_projectId].locked = true;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* @notice Toggles project `_projectId` as active/inactive.
|
|
272
|
+
*/
|
|
273
|
+
function toggleProjectIsActive(uint256 _projectId) public onlyWhitelisted {
|
|
274
|
+
projects[_projectId].active = !projects[_projectId].active;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* @notice Updates artist of project `_projectId` to `_artistAddress`.
|
|
279
|
+
*/
|
|
280
|
+
function updateProjectArtistAddress(
|
|
281
|
+
uint256 _projectId,
|
|
282
|
+
address payable _artistAddress
|
|
283
|
+
) public onlyArtistOrWhitelisted(_projectId) {
|
|
284
|
+
projectIdToArtistAddress[_projectId] = _artistAddress;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* @notice Toggles paused state of project `_projectId`.
|
|
289
|
+
*/
|
|
290
|
+
function toggleProjectIsPaused(
|
|
291
|
+
uint256 _projectId
|
|
292
|
+
) public onlyArtist(_projectId) {
|
|
293
|
+
projects[_projectId].paused = !projects[_projectId].paused;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* @notice Adds new project `_projectName` by `_artistAddress`.
|
|
298
|
+
* @param _projectName Project name.
|
|
299
|
+
* @param _artistAddress Artist's address.
|
|
300
|
+
* @param _pricePerTokenInWei Price to mint a token, in Wei.
|
|
301
|
+
*/
|
|
302
|
+
function addProject(
|
|
303
|
+
string memory _projectName,
|
|
304
|
+
address payable _artistAddress,
|
|
305
|
+
uint256 _pricePerTokenInWei
|
|
306
|
+
) public onlyWhitelisted {
|
|
307
|
+
uint256 projectId = nextProjectId;
|
|
308
|
+
projectIdToArtistAddress[projectId] = _artistAddress;
|
|
309
|
+
projects[projectId].name = _projectName;
|
|
310
|
+
projectIdToCurrencySymbol[projectId] = "ETH";
|
|
311
|
+
projectIdToPricePerTokenInWei[projectId] = _pricePerTokenInWei;
|
|
312
|
+
projects[projectId].paused = true;
|
|
313
|
+
projects[projectId].maxInvocations = ONE_MILLION;
|
|
314
|
+
nextProjectId = nextProjectId + 1;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* @notice Updates payment currency of project `_projectId` to be
|
|
319
|
+
* `_currencySymbol`.
|
|
320
|
+
* @param _projectId Project ID to update.
|
|
321
|
+
* @param _currencySymbol Currency symbol.
|
|
322
|
+
* @param _currencyAddress Currency address.
|
|
323
|
+
*/
|
|
324
|
+
function updateProjectCurrencyInfo(
|
|
325
|
+
uint256 _projectId,
|
|
326
|
+
string memory _currencySymbol,
|
|
327
|
+
address _currencyAddress
|
|
328
|
+
) public onlyArtist(_projectId) {
|
|
329
|
+
projectIdToCurrencySymbol[_projectId] = _currencySymbol;
|
|
330
|
+
projectIdToCurrencyAddress[_projectId] = _currencyAddress;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* @notice Updates price per token of project `_projectId` to be
|
|
335
|
+
* '_pricePerTokenInWei`, in Wei.
|
|
336
|
+
*/
|
|
337
|
+
function updateProjectPricePerTokenInWei(
|
|
338
|
+
uint256 _projectId,
|
|
339
|
+
uint256 _pricePerTokenInWei
|
|
340
|
+
) public onlyArtist(_projectId) {
|
|
341
|
+
projectIdToPricePerTokenInWei[_projectId] = _pricePerTokenInWei;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* @notice Updates name of project `_projectId` to be `_projectName`.
|
|
346
|
+
*/
|
|
347
|
+
function updateProjectName(
|
|
348
|
+
uint256 _projectId,
|
|
349
|
+
string memory _projectName
|
|
350
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
351
|
+
projects[_projectId].name = _projectName;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @notice Updates artist name for project `_projectId` to be
|
|
356
|
+
* `_projectArtistName`.
|
|
357
|
+
*/
|
|
358
|
+
function updateProjectArtistName(
|
|
359
|
+
uint256 _projectId,
|
|
360
|
+
string memory _projectArtistName
|
|
361
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
362
|
+
projects[_projectId].artist = _projectArtistName;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* @notice Updates additional payee for project `_projectId` to be
|
|
367
|
+
* `_additionalPayee`, receiving `_additionalPayeePercentage` percent
|
|
368
|
+
* of artist mint and royalty revenues.
|
|
369
|
+
*/
|
|
370
|
+
function updateProjectAdditionalPayeeInfo(
|
|
371
|
+
uint256 _projectId,
|
|
372
|
+
address payable _additionalPayee,
|
|
373
|
+
uint256 _additionalPayeePercentage
|
|
374
|
+
) public onlyArtist(_projectId) {
|
|
375
|
+
require(_additionalPayeePercentage <= 100, "Max of 100%");
|
|
376
|
+
projectIdToAdditionalPayee[_projectId] = _additionalPayee;
|
|
377
|
+
projectIdToAdditionalPayeePercentage[
|
|
378
|
+
_projectId
|
|
379
|
+
] = _additionalPayeePercentage;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* @notice Updates artist secondary market royalties for project
|
|
384
|
+
* `_projectId` to be `_secondMarketRoyalty` percent.
|
|
385
|
+
*/
|
|
386
|
+
function updateProjectSecondaryMarketRoyaltyPercentage(
|
|
387
|
+
uint256 _projectId,
|
|
388
|
+
uint256 _secondMarketRoyalty
|
|
389
|
+
) public onlyArtist(_projectId) {
|
|
390
|
+
require(_secondMarketRoyalty <= 100, "Max of 100%");
|
|
391
|
+
projectIdToSecondaryMarketRoyaltyPercentage[
|
|
392
|
+
_projectId
|
|
393
|
+
] = _secondMarketRoyalty;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* @notice Updates description of project `_projectId`.
|
|
398
|
+
*/
|
|
399
|
+
function updateProjectDescription(
|
|
400
|
+
uint256 _projectId,
|
|
401
|
+
string memory _projectDescription
|
|
402
|
+
) public onlyArtist(_projectId) {
|
|
403
|
+
projects[_projectId].description = _projectDescription;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* @notice Updates website of project `_projectId` to be `_projectWebsite`.
|
|
408
|
+
*/
|
|
409
|
+
function updateProjectWebsite(
|
|
410
|
+
uint256 _projectId,
|
|
411
|
+
string memory _projectWebsite
|
|
412
|
+
) public onlyArtist(_projectId) {
|
|
413
|
+
projects[_projectId].website = _projectWebsite;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* @notice Updates license for project `_projectId`.
|
|
418
|
+
*/
|
|
419
|
+
function updateProjectLicense(
|
|
420
|
+
uint256 _projectId,
|
|
421
|
+
string memory _projectLicense
|
|
422
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
423
|
+
projects[_projectId].license = _projectLicense;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* @notice Updates maximum invocations for project `_projectId` to
|
|
428
|
+
* `_maxInvocations`.
|
|
429
|
+
*/
|
|
430
|
+
function updateProjectMaxInvocations(
|
|
431
|
+
uint256 _projectId,
|
|
432
|
+
uint256 _maxInvocations
|
|
433
|
+
) public onlyArtist(_projectId) {
|
|
434
|
+
require(
|
|
435
|
+
(!projects[_projectId].locked ||
|
|
436
|
+
_maxInvocations < projects[_projectId].maxInvocations),
|
|
437
|
+
"Only if unlocked"
|
|
438
|
+
);
|
|
439
|
+
require(
|
|
440
|
+
_maxInvocations > projects[_projectId].invocations,
|
|
441
|
+
"You must set max invocations greater than current invocations"
|
|
442
|
+
);
|
|
443
|
+
require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1000000");
|
|
444
|
+
projects[_projectId].maxInvocations = _maxInvocations;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* @notice Adds a script to project `_projectId`.
|
|
449
|
+
* @param _projectId Project to be updated.
|
|
450
|
+
* @param _script Script to be added.
|
|
451
|
+
*/
|
|
452
|
+
function addProjectScript(
|
|
453
|
+
uint256 _projectId,
|
|
454
|
+
string memory _script
|
|
455
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
456
|
+
projects[_projectId].scripts[
|
|
457
|
+
projects[_projectId].scriptCount
|
|
458
|
+
] = _script;
|
|
459
|
+
projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* @notice Updates script for project `_projectId` at script ID `_scriptId`.
|
|
464
|
+
* @param _projectId Project to be updated.
|
|
465
|
+
* @param _scriptId Script ID to be updated.
|
|
466
|
+
* @param _script Script to be added.
|
|
467
|
+
*/
|
|
468
|
+
function updateProjectScript(
|
|
469
|
+
uint256 _projectId,
|
|
470
|
+
uint256 _scriptId,
|
|
471
|
+
string memory _script
|
|
472
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
473
|
+
require(
|
|
474
|
+
_scriptId < projects[_projectId].scriptCount,
|
|
475
|
+
"scriptId out of range"
|
|
476
|
+
);
|
|
477
|
+
projects[_projectId].scripts[_scriptId] = _script;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* @notice Removes last script from project `_projectId`.
|
|
482
|
+
*/
|
|
483
|
+
function removeProjectLastScript(
|
|
484
|
+
uint256 _projectId
|
|
485
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
486
|
+
require(
|
|
487
|
+
projects[_projectId].scriptCount > 0,
|
|
488
|
+
"there are no scripts to remove"
|
|
489
|
+
);
|
|
490
|
+
delete projects[_projectId].scripts[
|
|
491
|
+
projects[_projectId].scriptCount - 1
|
|
492
|
+
];
|
|
493
|
+
projects[_projectId].scriptCount = projects[_projectId].scriptCount - 1;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* @notice Updates script json for project `_projectId`.
|
|
498
|
+
*/
|
|
499
|
+
function updateProjectScriptJSON(
|
|
500
|
+
uint256 _projectId,
|
|
501
|
+
string memory _projectScriptJSON
|
|
502
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
503
|
+
projects[_projectId].scriptJSON = _projectScriptJSON;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* @notice Updates ipfs hash for project `_projectId`.
|
|
508
|
+
*/
|
|
509
|
+
function updateProjectIpfsHash(
|
|
510
|
+
uint256 _projectId,
|
|
511
|
+
string memory _ipfsHash
|
|
512
|
+
) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
|
|
513
|
+
projects[_projectId].ipfsHash = _ipfsHash;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* @notice Updates base URI for project `_projectId` to `_newBaseURI`.
|
|
518
|
+
*/
|
|
519
|
+
function updateProjectBaseURI(
|
|
520
|
+
uint256 _projectId,
|
|
521
|
+
string memory _newBaseURI
|
|
522
|
+
) public onlyArtist(_projectId) {
|
|
523
|
+
projects[_projectId].projectBaseURI = _newBaseURI;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* @notice Returns project details for project `_projectId`.
|
|
528
|
+
* @param _projectId Project to be queried.
|
|
529
|
+
* @return projectName Name of project
|
|
530
|
+
* @return artist Artist of project
|
|
531
|
+
* @return description Project description
|
|
532
|
+
* @return website Project website
|
|
533
|
+
* @return license Project license
|
|
534
|
+
*/
|
|
535
|
+
function projectDetails(
|
|
536
|
+
uint256 _projectId
|
|
537
|
+
)
|
|
538
|
+
public
|
|
539
|
+
view
|
|
540
|
+
returns (
|
|
541
|
+
string memory projectName,
|
|
542
|
+
string memory artist,
|
|
543
|
+
string memory description,
|
|
544
|
+
string memory website,
|
|
545
|
+
string memory license
|
|
546
|
+
)
|
|
547
|
+
{
|
|
548
|
+
projectName = projects[_projectId].name;
|
|
549
|
+
artist = projects[_projectId].artist;
|
|
550
|
+
description = projects[_projectId].description;
|
|
551
|
+
website = projects[_projectId].website;
|
|
552
|
+
license = projects[_projectId].license;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* @notice Returns project token information for project `_projectId`.
|
|
557
|
+
* @param _projectId Project to be queried.
|
|
558
|
+
* @return artistAddress Project Artist's address
|
|
559
|
+
* @return pricePerTokenInWei Price to mint a token, in Wei
|
|
560
|
+
* @return invocations Current number of invocations
|
|
561
|
+
* @return maxInvocations Maximum allowed invocations
|
|
562
|
+
* @return active Boolean representing if project is currently active
|
|
563
|
+
* @return additionalPayee Additional payee address
|
|
564
|
+
* @return additionalPayeePercentage Percentage of artist revenue
|
|
565
|
+
* to be sent to the additional payee's address
|
|
566
|
+
* @return currency Symbol of project's currency
|
|
567
|
+
* @return currencyAddress Address of project's currency
|
|
568
|
+
*/
|
|
569
|
+
function projectTokenInfo(
|
|
570
|
+
uint256 _projectId
|
|
571
|
+
)
|
|
572
|
+
public
|
|
573
|
+
view
|
|
574
|
+
returns (
|
|
575
|
+
address artistAddress,
|
|
576
|
+
uint256 pricePerTokenInWei,
|
|
577
|
+
uint256 invocations,
|
|
578
|
+
uint256 maxInvocations,
|
|
579
|
+
bool active,
|
|
580
|
+
address additionalPayee,
|
|
581
|
+
uint256 additionalPayeePercentage,
|
|
582
|
+
string memory currency,
|
|
583
|
+
address currencyAddress
|
|
584
|
+
)
|
|
585
|
+
{
|
|
586
|
+
artistAddress = projectIdToArtistAddress[_projectId];
|
|
587
|
+
pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
|
|
588
|
+
invocations = projects[_projectId].invocations;
|
|
589
|
+
maxInvocations = projects[_projectId].maxInvocations;
|
|
590
|
+
active = projects[_projectId].active;
|
|
591
|
+
additionalPayee = projectIdToAdditionalPayee[_projectId];
|
|
592
|
+
additionalPayeePercentage = projectIdToAdditionalPayeePercentage[
|
|
593
|
+
_projectId
|
|
594
|
+
];
|
|
595
|
+
currency = projectIdToCurrencySymbol[_projectId];
|
|
596
|
+
currencyAddress = projectIdToCurrencyAddress[_projectId];
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* @notice Returns script information for project `_projectId`.
|
|
601
|
+
* @param _projectId Project to be queried.
|
|
602
|
+
* @return scriptJSON Project's script json
|
|
603
|
+
* @return scriptCount Count of scripts for project
|
|
604
|
+
* @return ipfsHash IPFS hash for project
|
|
605
|
+
* @return locked Boolean representing if project is locked
|
|
606
|
+
* @return paused Boolean representing if project is paused
|
|
607
|
+
*/
|
|
608
|
+
function projectScriptInfo(
|
|
609
|
+
uint256 _projectId
|
|
610
|
+
)
|
|
611
|
+
public
|
|
612
|
+
view
|
|
613
|
+
returns (
|
|
614
|
+
string memory scriptJSON,
|
|
615
|
+
uint256 scriptCount,
|
|
616
|
+
string memory ipfsHash,
|
|
617
|
+
bool locked,
|
|
618
|
+
bool paused
|
|
619
|
+
)
|
|
620
|
+
{
|
|
621
|
+
scriptJSON = projects[_projectId].scriptJSON;
|
|
622
|
+
scriptCount = projects[_projectId].scriptCount;
|
|
623
|
+
ipfsHash = projects[_projectId].ipfsHash;
|
|
624
|
+
locked = projects[_projectId].locked;
|
|
625
|
+
paused = projects[_projectId].paused;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* @notice Returns script for project `_projectId` at script index `_index`.
|
|
630
|
+
*/
|
|
631
|
+
function projectScriptByIndex(
|
|
632
|
+
uint256 _projectId,
|
|
633
|
+
uint256 _index
|
|
634
|
+
) public view returns (string memory) {
|
|
635
|
+
return projects[_projectId].scripts[_index];
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* @notice Returns base URI for project `_projectId`.
|
|
640
|
+
*/
|
|
641
|
+
function projectURIInfo(
|
|
642
|
+
uint256 _projectId
|
|
643
|
+
) public view returns (string memory projectBaseURI) {
|
|
644
|
+
projectBaseURI = projects[_projectId].projectBaseURI;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* @notice Gets royalty data for token ID `_tokenId`.
|
|
649
|
+
* @param _tokenId Token ID to be queried.
|
|
650
|
+
* @return artistAddress Artist's payment address
|
|
651
|
+
* @return additionalPayee Additional payee's payment address
|
|
652
|
+
* @return additionalPayeePercentage Percentage of artist revenue
|
|
653
|
+
* to be sent to the additional payee's address
|
|
654
|
+
* @return royaltyFeeByID Total royalty percentage to be sent to
|
|
655
|
+
* combination of artist and additional payee
|
|
656
|
+
*/
|
|
657
|
+
function getRoyaltyData(
|
|
658
|
+
uint256 _tokenId
|
|
659
|
+
)
|
|
660
|
+
public
|
|
661
|
+
view
|
|
662
|
+
returns (
|
|
663
|
+
address artistAddress,
|
|
664
|
+
address additionalPayee,
|
|
665
|
+
uint256 additionalPayeePercentage,
|
|
666
|
+
uint256 royaltyFeeByID
|
|
667
|
+
)
|
|
668
|
+
{
|
|
669
|
+
artistAddress = projectIdToArtistAddress[tokenIdToProjectId[_tokenId]];
|
|
670
|
+
additionalPayee = projectIdToAdditionalPayee[
|
|
671
|
+
tokenIdToProjectId[_tokenId]
|
|
672
|
+
];
|
|
673
|
+
additionalPayeePercentage = projectIdToAdditionalPayeePercentage[
|
|
674
|
+
tokenIdToProjectId[_tokenId]
|
|
675
|
+
];
|
|
676
|
+
royaltyFeeByID = projectIdToSecondaryMarketRoyaltyPercentage[
|
|
677
|
+
tokenIdToProjectId[_tokenId]
|
|
678
|
+
];
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/**
|
|
682
|
+
* @notice Gets token URI for token ID `_tokenId`.
|
|
683
|
+
*/
|
|
684
|
+
function tokenURI(
|
|
685
|
+
uint256 _tokenId
|
|
686
|
+
) public view override onlyValidTokenId(_tokenId) returns (string memory) {
|
|
687
|
+
return
|
|
688
|
+
string(
|
|
689
|
+
abi.encodePacked(
|
|
690
|
+
projects[tokenIdToProjectId[_tokenId]].projectBaseURI,
|
|
691
|
+
Strings.toString(_tokenId)
|
|
692
|
+
)
|
|
693
|
+
);
|
|
694
|
+
}
|
|
695
|
+
}
|