@artblocks/contracts 0.0.1 → 1.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/README.md +30 -11
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
- package/artifacts/contracts/BasicPolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +3 -3
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +2 -2
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/Address.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/Counters.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC165.json +38 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC721.json +322 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC721Enumerable.json +384 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/ERC721ReceiverMock.json +101 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/GenArt721.json +1528 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC165.json +32 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC721.json +316 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC721Enumerable.json +378 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/IERC721Receiver.json +47 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/SafeMath.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV0.sol/Strings.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/Address.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/Counters.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/ERC165.json +38 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/ERC721.json +322 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/GenArt721Core.json +1773 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC165.json +32 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC721.json +316 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/Randomizer.json +26 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/SafeMath.json +10 -0
- package/artifacts/contracts/archive/GenArt721CoreV1.sol/Strings.json +10 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol/MinterDAExpV0.json +575 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol/MinterDAExpV1.json +463 -0
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +15 -15
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +1066 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol/MinterDALinV0.json +551 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol/MinterDALinV1.json +439 -0
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +3 -3
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol/MinterHolderV0.json +622 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +719 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +3 -3
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol/MinterMerkleV0.json +873 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +932 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +984 -0
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +3 -3
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol/MinterSetPriceV0.json +400 -0
- package/artifacts/contracts/{minter-suite/Minters/MinterSetPrice/deprecated → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV1.sol/MinterSetPriceV1.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +3 -3
- package/artifacts/contracts/{minter-suite/Minters/MinterSetPriceERC20/deprecated → archive/minter-suite/Minters/MinterSetPriceERC20}/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +3 -3
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.json +349 -0
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +3 -3
- package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +3 -3
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +2 -2
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +12 -12
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +767 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlement_Mixin.sol/IFilteredMinterDAExpSettlement_Mixin.json +161 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterBaseV0.sol/IMinterBaseV0.json +24 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +6 -0
- package/artifacts/contracts/interfaces/0.8.x/IMintingAPICoreV0.sol/IMintingAPICoreV0.json +185 -0
- package/artifacts/contracts/interfaces/0.8.x/IMintingAPIMinterV0.sol/IMintingAPIMinterV0.json +88 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol/IRandomizerPolyptychV0.json +87 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +1 -1
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +8 -2
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +34 -2
- package/artifacts/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol/MinterBase.json +24 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +1127 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +882 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +858 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +1126 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +1065 -0
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +662 -0
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +1268 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +768 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +697 -0
- package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +1817 -0
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +3 -3
- package/contracts/BasicPolyptychRandomizerV0.sol +126 -0
- package/contracts/BasicRandomizerV2.sol +3 -3
- package/contracts/archive/GenArt721CoreV0.sol +1621 -0
- package/contracts/archive/GenArt721CoreV1.sol +1577 -0
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol +503 -0
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol +442 -0
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV2.sol +3 -3
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExp/MinterDAExpV3.sol +3 -3
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +1026 -0
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol +450 -0
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol +406 -0
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV2.sol +3 -3
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterDALin/MinterDALinV3.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol +540 -0
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol +648 -0
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterHolder/MinterHolderV2.sol +6 -6
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterHolder/MinterHolderV3.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol +523 -0
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol +602 -0
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol +679 -0
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV3.sol +4 -4
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterMerkle/MinterMerkleV4.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol +333 -0
- package/contracts/{minter-suite/Minters/MinterSetPrice/deprecated → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV1.sol +0 -0
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV2.sol +3 -3
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPrice/MinterSetPriceV3.sol +3 -3
- package/contracts/{minter-suite/Minters/MinterSetPriceERC20/deprecated → archive/minter-suite/Minters/MinterSetPriceERC20}/MinterSetPriceERC20V0.sol +0 -0
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol +411 -0
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +3 -3
- package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +3 -3
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +4 -53
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol +21 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlement_Mixin.sol +62 -0
- package/contracts/interfaces/0.8.x/IMinterBaseV0.sol +20 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +6 -0
- package/contracts/interfaces/0.8.x/IMintingAPICoreV0.sol +62 -0
- package/contracts/interfaces/0.8.x/IMintingAPIMinterV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +5 -2
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +18 -0
- package/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol +293 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +1312 -0
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +600 -0
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +552 -0
- package/contracts/minter-suite/Minters/MinterHolderV4.sol +781 -0
- package/contracts/minter-suite/Minters/MinterMerkleV5.sol +717 -0
- package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +998 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +480 -0
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +380 -0
- package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +1979 -0
- package/package.json +8 -2
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +0 -794
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.0;
|
|
5
|
+
|
|
6
|
+
/* Provides an interface definition for compatibility with the Minting API.
|
|
7
|
+
*
|
|
8
|
+
* In order for a core contract to be compatible with the REST API provided
|
|
9
|
+
* at https://minting-api.artblocks.io/ it must implement the interface defined
|
|
10
|
+
* below.
|
|
11
|
+
*/
|
|
12
|
+
interface IMintingAPICoreV0 {
|
|
13
|
+
/**
|
|
14
|
+
* @notice Token ID `_tokenId` minted on project ID `_projectId` to `_to`.
|
|
15
|
+
*/
|
|
16
|
+
event Mint(
|
|
17
|
+
address indexed _to,
|
|
18
|
+
uint256 indexed _tokenId,
|
|
19
|
+
uint256 indexed _projectId
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
// getter function of public variable
|
|
23
|
+
function nextProjectId() external view returns (uint256);
|
|
24
|
+
|
|
25
|
+
function projectDetails(
|
|
26
|
+
uint256 _projectId
|
|
27
|
+
)
|
|
28
|
+
external
|
|
29
|
+
view
|
|
30
|
+
returns (
|
|
31
|
+
string memory projectName,
|
|
32
|
+
string memory artist,
|
|
33
|
+
string memory description,
|
|
34
|
+
string memory website,
|
|
35
|
+
string memory license
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
function projectIdToPricePerTokenInWei(
|
|
39
|
+
uint256 _projectId
|
|
40
|
+
) external view returns (uint256);
|
|
41
|
+
|
|
42
|
+
function projectTokenInfo(
|
|
43
|
+
uint256 _projectId
|
|
44
|
+
)
|
|
45
|
+
external
|
|
46
|
+
view
|
|
47
|
+
returns (
|
|
48
|
+
address,
|
|
49
|
+
uint256,
|
|
50
|
+
uint256,
|
|
51
|
+
uint256,
|
|
52
|
+
bool,
|
|
53
|
+
address,
|
|
54
|
+
uint256,
|
|
55
|
+
string memory,
|
|
56
|
+
address
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
function tokensOfOwner(
|
|
60
|
+
address owner
|
|
61
|
+
) external view returns (uint256[] memory);
|
|
62
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.0;
|
|
5
|
+
|
|
6
|
+
/* Provides an interface definition for compatibility with the Minting API.
|
|
7
|
+
*
|
|
8
|
+
* In order for a minter contract to be compatible with the REST API provided
|
|
9
|
+
* at https://minting-api.artblocks.io/ it must implement the interface defined
|
|
10
|
+
* below.
|
|
11
|
+
*/
|
|
12
|
+
interface IMintingAPIMinterV0 {
|
|
13
|
+
function projectMaxHasBeenInvoked(uint256) external returns (bool);
|
|
14
|
+
|
|
15
|
+
function purchaseTo(
|
|
16
|
+
address _to,
|
|
17
|
+
uint256 _projectId
|
|
18
|
+
) external returns (uint256 _tokenId);
|
|
19
|
+
|
|
20
|
+
function getPriceInfo(
|
|
21
|
+
uint256 _projectId
|
|
22
|
+
)
|
|
23
|
+
external
|
|
24
|
+
view
|
|
25
|
+
returns (
|
|
26
|
+
bool isConfigured,
|
|
27
|
+
uint256 tokenPriceInWei,
|
|
28
|
+
string memory currencySymbol,
|
|
29
|
+
address currencyAddress
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Creatd By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity 0.8.17;
|
|
5
|
+
|
|
6
|
+
import "./IRandomizerV2.sol";
|
|
7
|
+
|
|
8
|
+
interface IRandomizerPolyptychV0 is IRandomizerV2 {
|
|
9
|
+
/**
|
|
10
|
+
* @notice Minter contract at `_contractAddress` allowed to assign token hash seeds.
|
|
11
|
+
*/
|
|
12
|
+
event HashSeedSetterUpdated(address indexed _contractAddress);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @notice Project with ID `_projectId` is enabled/disabled for polyptych minting.
|
|
16
|
+
*/
|
|
17
|
+
event ProjectIsPolyptychUpdated(uint256 _projectId, bool _isPolyptych);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @notice When a core contract calls this, it can be assured that the randomizer
|
|
21
|
+
* will set a bytes32 hash for tokenId `_tokenId` on the core contract. This function
|
|
22
|
+
* may only be called by the contract configured as the `hashSeedSetterContract` via
|
|
23
|
+
* the `setHashSeedSetterContract` available to the core contract admin.
|
|
24
|
+
*/
|
|
25
|
+
function assignTokenHash(uint256 _tokenId) external;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @notice Store the token hash seed for an existing token to be re-used in a polyptych panel.
|
|
29
|
+
*/
|
|
30
|
+
function setPolyptychHashSeed(uint256 _tokenId, bytes12 _hashSeed) external;
|
|
31
|
+
}
|
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
|
|
4
4
|
pragma solidity ^0.8.0;
|
|
5
5
|
|
|
6
|
-
import "./
|
|
6
|
+
import "./IGenArt721CoreContractV3_Base.sol";
|
|
7
7
|
|
|
8
8
|
interface IRandomizerV2 {
|
|
9
9
|
// The core contract that may interact with this randomizer contract.
|
|
10
|
-
function genArt721Core()
|
|
10
|
+
function genArt721Core()
|
|
11
|
+
external
|
|
12
|
+
view
|
|
13
|
+
returns (IGenArt721CoreContractV3_Base);
|
|
11
14
|
|
|
12
15
|
// When a core contract calls this, it can be assured that the randomizer
|
|
13
16
|
// will set a bytes32 hash for tokenId `_tokenId` on the core contract.
|
|
@@ -6,6 +6,8 @@ import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
|
|
|
6
6
|
import "../../interfaces/0.8.x/IAdminACLV0.sol";
|
|
7
7
|
import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
|
|
8
8
|
|
|
9
|
+
import "../../libs/0.8.x/Bytes32Strings.sol";
|
|
10
|
+
|
|
9
11
|
import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
|
|
10
12
|
|
|
11
13
|
pragma solidity 0.8.17;
|
|
@@ -39,6 +41,21 @@ pragma solidity 0.8.17;
|
|
|
39
41
|
contract MinterFilterV1 is IMinterFilterV0 {
|
|
40
42
|
// add Enumerable Map methods
|
|
41
43
|
using EnumerableMap for EnumerableMap.UintToAddressMap;
|
|
44
|
+
// add Bytes32Strings methods
|
|
45
|
+
using Bytes32Strings for bytes32;
|
|
46
|
+
|
|
47
|
+
/// version & type of this core contract
|
|
48
|
+
bytes32 constant MINTER_FILTER_VERSION = "v1.0.1";
|
|
49
|
+
|
|
50
|
+
function minterFilterVersion() external pure returns (string memory) {
|
|
51
|
+
return MINTER_FILTER_VERSION.toString();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
bytes32 constant MINTER_FILTER_TYPE = "MinterFilterV1";
|
|
55
|
+
|
|
56
|
+
function minterFilterType() external pure returns (string memory) {
|
|
57
|
+
return MINTER_FILTER_TYPE.toString();
|
|
58
|
+
}
|
|
42
59
|
|
|
43
60
|
/// Core contract address this minter interacts with
|
|
44
61
|
address public immutable genArt721CoreAddress;
|
|
@@ -106,6 +123,7 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
106
123
|
) onlyNonZeroAddress(_genArt721Address) {
|
|
107
124
|
genArt721CoreAddress = _genArt721Address;
|
|
108
125
|
genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address);
|
|
126
|
+
emit Deployed();
|
|
109
127
|
}
|
|
110
128
|
|
|
111
129
|
/**
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../../interfaces/0.8.x/IMinterBaseV0.sol";
|
|
5
|
+
import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
6
|
+
import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
|
|
7
|
+
import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol";
|
|
8
|
+
|
|
9
|
+
import "@openzeppelin-4.7/contracts/token/ERC20/IERC20.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity ^0.8.0;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Art Blocks Minter Base Class
|
|
15
|
+
* @notice A base class for Art Blocks minter contracts that provides common
|
|
16
|
+
* functionality used across minter contracts.
|
|
17
|
+
* This contract is not intended to be deployed directly, but rather to be
|
|
18
|
+
* inherited by other minter contracts.
|
|
19
|
+
* From a design perspective, this contract is intended to remain simple and
|
|
20
|
+
* easy to understand. It is not intended to cause a complex inheritance tree,
|
|
21
|
+
* and instead should keep minter contracts as readable as possible for
|
|
22
|
+
* collectors and developers.
|
|
23
|
+
* @dev Semantic versioning is used in the solidity file name, and is therefore
|
|
24
|
+
* controlled by contracts importing the appropriate filename version.
|
|
25
|
+
* @author Art Blocks Inc.
|
|
26
|
+
*/
|
|
27
|
+
abstract contract MinterBase is IMinterBaseV0 {
|
|
28
|
+
/// state variable that tracks whether this contract's associated core
|
|
29
|
+
/// contract is an Engine contract, where Engine contracts have an
|
|
30
|
+
/// additional revenue split for the platform provider
|
|
31
|
+
bool public immutable isEngine;
|
|
32
|
+
|
|
33
|
+
// @dev we do not track an initialization state, as the only state variable
|
|
34
|
+
// is immutable, which the compiler enforces to be assigned during
|
|
35
|
+
// construction.
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @notice Initializes contract to ensure state variable `isEngine` is set
|
|
39
|
+
* appropriately based on the minter's associated core contract address.
|
|
40
|
+
* @param genArt721Address Art Blocks core contract address for
|
|
41
|
+
* which this contract will be a minter.
|
|
42
|
+
*/
|
|
43
|
+
constructor(address genArt721Address) {
|
|
44
|
+
// set state variable isEngine
|
|
45
|
+
isEngine = _getV3CoreIsEngine(genArt721Address);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @notice splits ETH funds between sender (if refund), providers,
|
|
50
|
+
* artist, and artist's additional payee for a token purchased on
|
|
51
|
+
* project `_projectId`.
|
|
52
|
+
* WARNING: This function uses msg.value and msg.sender to determine
|
|
53
|
+
* refund amounts, and therefore may not be applicable to all use cases
|
|
54
|
+
* (e.g. do not use with Dutch Auctions with on-chain settlement).
|
|
55
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
56
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
57
|
+
* admin-accepted artist payment addresses.
|
|
58
|
+
* @param projectId Project ID for which funds shall be split.
|
|
59
|
+
* @param pricePerTokenInWei Current price of token, in Wei.
|
|
60
|
+
*/
|
|
61
|
+
function splitFundsETH(
|
|
62
|
+
uint256 projectId,
|
|
63
|
+
uint256 pricePerTokenInWei,
|
|
64
|
+
address genArt721CoreAddress
|
|
65
|
+
) internal {
|
|
66
|
+
if (msg.value > 0) {
|
|
67
|
+
bool success_;
|
|
68
|
+
// send refund to sender
|
|
69
|
+
uint256 refund = msg.value - pricePerTokenInWei;
|
|
70
|
+
if (refund > 0) {
|
|
71
|
+
(success_, ) = msg.sender.call{value: refund}("");
|
|
72
|
+
require(success_, "Refund failed");
|
|
73
|
+
}
|
|
74
|
+
// split revenues
|
|
75
|
+
splitRevenuesETH(
|
|
76
|
+
projectId,
|
|
77
|
+
pricePerTokenInWei,
|
|
78
|
+
genArt721CoreAddress
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @notice splits ETH revenues between providers, artist, and artist's
|
|
85
|
+
* additional payee for revenue generated by project `_projectId`.
|
|
86
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
87
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
88
|
+
* admin-accepted artist payment addresses.
|
|
89
|
+
* @param projectId Project ID for which funds shall be split.
|
|
90
|
+
* @param valueInWei Value to be split, in Wei.
|
|
91
|
+
*/
|
|
92
|
+
function splitRevenuesETH(
|
|
93
|
+
uint256 projectId,
|
|
94
|
+
uint256 valueInWei,
|
|
95
|
+
address genArtCoreContract
|
|
96
|
+
) internal {
|
|
97
|
+
if (valueInWei <= 0) {
|
|
98
|
+
return; // return early
|
|
99
|
+
}
|
|
100
|
+
bool success;
|
|
101
|
+
// split funds between platforms, artist, and artist's
|
|
102
|
+
// additional payee
|
|
103
|
+
uint256 renderProviderRevenue_;
|
|
104
|
+
address payable renderProviderAddress_;
|
|
105
|
+
uint256 artistRevenue_;
|
|
106
|
+
address payable artistAddress_;
|
|
107
|
+
uint256 additionalPayeePrimaryRevenue_;
|
|
108
|
+
address payable additionalPayeePrimaryAddress_;
|
|
109
|
+
if (isEngine) {
|
|
110
|
+
// get engine splits
|
|
111
|
+
uint256 platformProviderRevenue_;
|
|
112
|
+
address payable platformProviderAddress_;
|
|
113
|
+
(
|
|
114
|
+
renderProviderRevenue_,
|
|
115
|
+
renderProviderAddress_,
|
|
116
|
+
platformProviderRevenue_,
|
|
117
|
+
platformProviderAddress_,
|
|
118
|
+
artistRevenue_,
|
|
119
|
+
artistAddress_,
|
|
120
|
+
additionalPayeePrimaryRevenue_,
|
|
121
|
+
additionalPayeePrimaryAddress_
|
|
122
|
+
) = IGenArt721CoreContractV3_Engine(genArtCoreContract)
|
|
123
|
+
.getPrimaryRevenueSplits(projectId, valueInWei);
|
|
124
|
+
// Platform Provider payment (only possible if engine)
|
|
125
|
+
if (platformProviderRevenue_ > 0) {
|
|
126
|
+
(success, ) = platformProviderAddress_.call{
|
|
127
|
+
value: platformProviderRevenue_
|
|
128
|
+
}("");
|
|
129
|
+
require(success, "Platform Provider payment failed");
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
// get flagship splits
|
|
133
|
+
(
|
|
134
|
+
renderProviderRevenue_, // artblocks revenue
|
|
135
|
+
renderProviderAddress_, // artblocks address
|
|
136
|
+
artistRevenue_,
|
|
137
|
+
artistAddress_,
|
|
138
|
+
additionalPayeePrimaryRevenue_,
|
|
139
|
+
additionalPayeePrimaryAddress_
|
|
140
|
+
) = IGenArt721CoreContractV3(genArtCoreContract)
|
|
141
|
+
.getPrimaryRevenueSplits(projectId, valueInWei);
|
|
142
|
+
}
|
|
143
|
+
// Render Provider / Art Blocks payment
|
|
144
|
+
if (renderProviderRevenue_ > 0) {
|
|
145
|
+
(success, ) = renderProviderAddress_.call{
|
|
146
|
+
value: renderProviderRevenue_
|
|
147
|
+
}("");
|
|
148
|
+
require(success, "Render Provider payment failed");
|
|
149
|
+
}
|
|
150
|
+
// artist payment
|
|
151
|
+
if (artistRevenue_ > 0) {
|
|
152
|
+
(success, ) = artistAddress_.call{value: artistRevenue_}("");
|
|
153
|
+
require(success, "Artist payment failed");
|
|
154
|
+
}
|
|
155
|
+
// additional payee payment
|
|
156
|
+
if (additionalPayeePrimaryRevenue_ > 0) {
|
|
157
|
+
(success, ) = additionalPayeePrimaryAddress_.call{
|
|
158
|
+
value: additionalPayeePrimaryRevenue_
|
|
159
|
+
}("");
|
|
160
|
+
require(success, "Additional Payee payment failed");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @notice splits ERC-20 funds between providers, artist, and artist's
|
|
166
|
+
* additional payee, for a token purchased on project `_projectId`.
|
|
167
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
168
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
169
|
+
* admin-accepted artist payment addresses.
|
|
170
|
+
*/
|
|
171
|
+
function splitFundsERC20(
|
|
172
|
+
uint256 projectId,
|
|
173
|
+
uint256 pricePerTokenInWei,
|
|
174
|
+
address currencyAddress,
|
|
175
|
+
address genArtCoreContract
|
|
176
|
+
) internal {
|
|
177
|
+
IERC20 _projectCurrency = IERC20(currencyAddress);
|
|
178
|
+
// split remaining funds between foundation, artist, and artist's
|
|
179
|
+
// additional payee
|
|
180
|
+
uint256 renderProviderRevenue_;
|
|
181
|
+
address payable renderProviderAddress_;
|
|
182
|
+
uint256 artistRevenue_;
|
|
183
|
+
address payable artistAddress_;
|
|
184
|
+
uint256 additionalPayeePrimaryRevenue_;
|
|
185
|
+
address payable additionalPayeePrimaryAddress_;
|
|
186
|
+
if (isEngine) {
|
|
187
|
+
// get engine splits
|
|
188
|
+
uint256 platformProviderRevenue_;
|
|
189
|
+
address payable platformProviderAddress_;
|
|
190
|
+
(
|
|
191
|
+
renderProviderRevenue_,
|
|
192
|
+
renderProviderAddress_,
|
|
193
|
+
platformProviderRevenue_,
|
|
194
|
+
platformProviderAddress_,
|
|
195
|
+
artistRevenue_,
|
|
196
|
+
artistAddress_,
|
|
197
|
+
additionalPayeePrimaryRevenue_,
|
|
198
|
+
additionalPayeePrimaryAddress_
|
|
199
|
+
) = IGenArt721CoreContractV3_Engine(genArtCoreContract)
|
|
200
|
+
.getPrimaryRevenueSplits(projectId, pricePerTokenInWei);
|
|
201
|
+
// Platform Provider payment (only possible if engine)
|
|
202
|
+
if (platformProviderRevenue_ > 0) {
|
|
203
|
+
_projectCurrency.transferFrom(
|
|
204
|
+
msg.sender,
|
|
205
|
+
platformProviderAddress_,
|
|
206
|
+
platformProviderRevenue_
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
} else {
|
|
210
|
+
// get flagship splits
|
|
211
|
+
(
|
|
212
|
+
renderProviderRevenue_, // artblocks revenue
|
|
213
|
+
renderProviderAddress_, // artblocks address
|
|
214
|
+
artistRevenue_,
|
|
215
|
+
artistAddress_,
|
|
216
|
+
additionalPayeePrimaryRevenue_,
|
|
217
|
+
additionalPayeePrimaryAddress_
|
|
218
|
+
) = IGenArt721CoreContractV3(genArtCoreContract)
|
|
219
|
+
.getPrimaryRevenueSplits(projectId, pricePerTokenInWei);
|
|
220
|
+
}
|
|
221
|
+
// Art Blocks payment
|
|
222
|
+
if (renderProviderRevenue_ > 0) {
|
|
223
|
+
_projectCurrency.transferFrom(
|
|
224
|
+
msg.sender,
|
|
225
|
+
renderProviderAddress_,
|
|
226
|
+
renderProviderRevenue_
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
// artist payment
|
|
230
|
+
if (artistRevenue_ > 0) {
|
|
231
|
+
_projectCurrency.transferFrom(
|
|
232
|
+
msg.sender,
|
|
233
|
+
artistAddress_,
|
|
234
|
+
artistRevenue_
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
// additional payee payment
|
|
238
|
+
if (additionalPayeePrimaryRevenue_ > 0) {
|
|
239
|
+
_projectCurrency.transferFrom(
|
|
240
|
+
msg.sender,
|
|
241
|
+
additionalPayeePrimaryAddress_,
|
|
242
|
+
additionalPayeePrimaryRevenue_
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @notice Returns whether a V3 core contract is an Art Blocks Engine
|
|
249
|
+
* contract or not. Return value of false indicates that the core is a
|
|
250
|
+
* flagship contract.
|
|
251
|
+
* @dev this function reverts if a core contract does not return the
|
|
252
|
+
* expected number of return values from getPrimaryRevenueSplits() for
|
|
253
|
+
* either a flagship or engine core contract.
|
|
254
|
+
* @dev this function uses the length of the return data (in bytes) to
|
|
255
|
+
* determine whether the core is an engine or not.
|
|
256
|
+
* @param genArt721CoreV3 The address of the deployed core contract.
|
|
257
|
+
*/
|
|
258
|
+
function _getV3CoreIsEngine(
|
|
259
|
+
address genArt721CoreV3
|
|
260
|
+
) private returns (bool) {
|
|
261
|
+
// call getPrimaryRevenueSplits() on core contract
|
|
262
|
+
bytes memory payload = abi.encodeWithSignature(
|
|
263
|
+
"getPrimaryRevenueSplits(uint256,uint256)",
|
|
264
|
+
0,
|
|
265
|
+
0
|
|
266
|
+
);
|
|
267
|
+
(bool success, bytes memory returnData) = genArt721CoreV3.call(payload);
|
|
268
|
+
require(success, "getPrimaryRevenueSplits() call failed");
|
|
269
|
+
// determine whether core is engine or not, based on return data length
|
|
270
|
+
uint256 returnDataLength = returnData.length;
|
|
271
|
+
if (returnDataLength == 6 * 32) {
|
|
272
|
+
// 6 32-byte words returned if flagship (not engine)
|
|
273
|
+
// @dev 6 32-byte words are expected because the non-engine core
|
|
274
|
+
// contracts return a payout address and uint256 payment value for
|
|
275
|
+
// the artist, and artist's additional payee, and Art Blocks.
|
|
276
|
+
// also note that per Solidity ABI encoding, the address return
|
|
277
|
+
// values are padded to 32 bytes.
|
|
278
|
+
return false;
|
|
279
|
+
} else if (returnDataLength == 8 * 32) {
|
|
280
|
+
// 8 32-byte words returned if engine
|
|
281
|
+
// @dev 8 32-byte words are expected because the engine core
|
|
282
|
+
// contracts return a payout address and uint256 payment value for
|
|
283
|
+
// the artist, artist's additional payee, render provider
|
|
284
|
+
// typically Art Blocks, and platform provider (partner).
|
|
285
|
+
// also note that per Solidity ABI encoding, the address return
|
|
286
|
+
// values are padded to 32 bytes.
|
|
287
|
+
return true;
|
|
288
|
+
} else {
|
|
289
|
+
// unexpected return value length
|
|
290
|
+
revert("Unexpected revenue split bytes");
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|