@artblocks/contracts 1.0.1 → 1.0.2
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 +8 -1
- package/README.md +42 -157
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +2229 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +2 -2
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterSEAV0.sol/IFilteredMinterSEAV0.json +1032 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +149 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +149 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +130 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +1066 -0
- package/artifacts/contracts/interfaces/0.8.x/IWETH.sol/IWETH.json +55 -0
- package/artifacts/contracts/libs/integration-refs/weth9/weth9.sol/WETH9_.json +295 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +130 -0
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSEAV0.sol/MinterSEAV0.json +1310 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +2 -2
- package/artifacts/contracts/mock/DeadReceiverBidderMock.sol/DeadReceiverBidderMock.json +33 -0
- package/artifacts/contracts/mock/GasLimitReceiverBidderMock.sol/GasLimitReceiverBidderMock.json +46 -0
- package/artifacts/contracts/mock/GasLimitReceiverMock.sol/GasLimitReceiverMock.json +28 -0
- package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +2 -2
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +51 -0
- package/artifacts/contracts/{BasicRandomizer.sol → randomizer/BasicRandomizer.sol}/BasicRandomizer.json +3 -3
- package/artifacts/contracts/randomizer/BasicRandomizerBase_v0_0_0.sol/RandomizerBase.json +10 -0
- package/artifacts/contracts/randomizer/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
- package/artifacts/contracts/randomizer/RandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +2 -2
- package/contracts/DependencyRegistryV0.sol +74 -113
- package/contracts/GenArt721CoreV3.sol +124 -171
- package/contracts/GenArt721CoreV3_Engine.sol +136 -198
- package/contracts/GenArt721CoreV3_Engine_Flex.sol +2274 -0
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +147 -176
- package/contracts/interfaces/0.8.x/IFilteredMinterSEAV0.sol +145 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +39 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +0 -3
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol +132 -0
- package/contracts/interfaces/0.8.x/IWETH.sol +11 -0
- package/contracts/libs/integration-refs/weth9/weth9.sol +763 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +35 -47
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +26 -34
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +16 -21
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +15 -17
- package/contracts/minter-suite/Minters/MinterHolderV4.sol +19 -19
- package/contracts/minter-suite/Minters/MinterMerkleV5.sol +13 -15
- package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +23 -23
- package/contracts/minter-suite/Minters/MinterSEAV0.sol +1224 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +11 -11
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +9 -10
- package/contracts/mock/DeadReceiverBidderMock.sol +23 -0
- package/contracts/mock/GasLimitReceiverBidderMock.sol +23 -0
- package/contracts/mock/GasLimitReceiverMock.sol +19 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +2 -11
- package/contracts/mock/ReentrancySEAMock.sol +36 -0
- package/contracts/{BasicRandomizer.sol → randomizer/BasicRandomizer.sol} +1 -1
- package/contracts/randomizer/BasicRandomizerBase_v0_0_0.sol +23 -0
- package/contracts/{BasicPolyptychRandomizerV0.sol → randomizer/PolyptychRandomizerV0.sol} +19 -28
- package/contracts/{BasicRandomizerV2.sol → randomizer/RandomizerV2.sol} +5 -13
- package/package.json +27 -14
- package/artifacts/contracts/BasicPolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +0 -229
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +0 -102
|
@@ -76,13 +76,12 @@ contract MinterSetPriceERC20V4 is
|
|
|
76
76
|
// /// projectId => currency address - supersedes any defined core value
|
|
77
77
|
// mapping(uint256 => address) private projectIdToCurrencyAddress;
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
function _onlyArtist(uint256 _projectId) internal view {
|
|
80
80
|
require(
|
|
81
81
|
msg.sender ==
|
|
82
82
|
genArtCoreContract_Base.projectIdToArtistAddress(_projectId),
|
|
83
83
|
"Only Artist"
|
|
84
84
|
);
|
|
85
|
-
_;
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
/**
|
|
@@ -151,9 +150,8 @@ contract MinterSetPriceERC20V4 is
|
|
|
151
150
|
* @dev this enables gas reduction after maxInvocations have been reached -
|
|
152
151
|
* core contracts shall still enforce a maxInvocation check during mint.
|
|
153
152
|
*/
|
|
154
|
-
function setProjectMaxInvocations(
|
|
155
|
-
|
|
156
|
-
) public onlyArtist(_projectId) {
|
|
153
|
+
function setProjectMaxInvocations(uint256 _projectId) public {
|
|
154
|
+
_onlyArtist(_projectId);
|
|
157
155
|
uint256 maxInvocations;
|
|
158
156
|
uint256 invocations;
|
|
159
157
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -185,7 +183,8 @@ contract MinterSetPriceERC20V4 is
|
|
|
185
183
|
function manuallyLimitProjectMaxInvocations(
|
|
186
184
|
uint256 _projectId,
|
|
187
185
|
uint256 _maxInvocations
|
|
188
|
-
) external
|
|
186
|
+
) external {
|
|
187
|
+
_onlyArtist(_projectId);
|
|
189
188
|
// CHECKS
|
|
190
189
|
// ensure that the manually set maxInvocations is not greater than what is set on the core contract
|
|
191
190
|
uint256 maxInvocations;
|
|
@@ -216,9 +215,8 @@ contract MinterSetPriceERC20V4 is
|
|
|
216
215
|
* @notice Warning: Disabling purchaseTo is not supported on this minter.
|
|
217
216
|
* This method exists purely for interface-conformance purposes.
|
|
218
217
|
*/
|
|
219
|
-
function togglePurchaseToDisabled(
|
|
220
|
-
|
|
221
|
-
) external view onlyArtist(_projectId) {
|
|
218
|
+
function togglePurchaseToDisabled(uint256 _projectId) external view {
|
|
219
|
+
_onlyArtist(_projectId);
|
|
222
220
|
revert("Action not supported");
|
|
223
221
|
}
|
|
224
222
|
|
|
@@ -273,7 +271,8 @@ contract MinterSetPriceERC20V4 is
|
|
|
273
271
|
function updatePricePerTokenInWei(
|
|
274
272
|
uint256 _projectId,
|
|
275
273
|
uint256 _pricePerTokenInWei
|
|
276
|
-
) external
|
|
274
|
+
) external {
|
|
275
|
+
_onlyArtist(_projectId);
|
|
277
276
|
require(_pricePerTokenInWei > 0, "Price may not be 0");
|
|
278
277
|
ProjectConfig storage _projectConfig = projectConfig[_projectId];
|
|
279
278
|
_projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
|
|
@@ -302,7 +301,8 @@ contract MinterSetPriceERC20V4 is
|
|
|
302
301
|
uint256 _projectId,
|
|
303
302
|
string memory _currencySymbol,
|
|
304
303
|
address _currencyAddress
|
|
305
|
-
) external
|
|
304
|
+
) external {
|
|
305
|
+
_onlyArtist(_projectId);
|
|
306
306
|
// require null address if symbol is "ETH"
|
|
307
307
|
require(
|
|
308
308
|
(keccak256(abi.encodePacked(_currencySymbol)) ==
|
|
@@ -61,13 +61,12 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
61
61
|
|
|
62
62
|
mapping(uint256 => ProjectConfig) public projectConfig;
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
function _onlyArtist(uint256 _projectId) internal view {
|
|
65
65
|
require(
|
|
66
66
|
msg.sender ==
|
|
67
67
|
genArtCoreContract_Base.projectIdToArtistAddress(_projectId),
|
|
68
68
|
"Only Artist"
|
|
69
69
|
);
|
|
70
|
-
_;
|
|
71
70
|
}
|
|
72
71
|
|
|
73
72
|
/**
|
|
@@ -104,9 +103,8 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
104
103
|
* @dev this enables gas reduction after maxInvocations have been reached -
|
|
105
104
|
* core contracts shall still enforce a maxInvocation check during mint.
|
|
106
105
|
*/
|
|
107
|
-
function setProjectMaxInvocations(
|
|
108
|
-
|
|
109
|
-
) public onlyArtist(_projectId) {
|
|
106
|
+
function setProjectMaxInvocations(uint256 _projectId) public {
|
|
107
|
+
_onlyArtist(_projectId);
|
|
110
108
|
uint256 maxInvocations;
|
|
111
109
|
uint256 invocations;
|
|
112
110
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -138,7 +136,8 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
138
136
|
function manuallyLimitProjectMaxInvocations(
|
|
139
137
|
uint256 _projectId,
|
|
140
138
|
uint256 _maxInvocations
|
|
141
|
-
) external
|
|
139
|
+
) external {
|
|
140
|
+
_onlyArtist(_projectId);
|
|
142
141
|
// CHECKS
|
|
143
142
|
// ensure that the manually set maxInvocations is not greater than what is set on the core contract
|
|
144
143
|
uint256 maxInvocations;
|
|
@@ -169,9 +168,8 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
169
168
|
* @notice Warning: Disabling purchaseTo is not supported on this minter.
|
|
170
169
|
* This method exists purely for interface-conformance purposes.
|
|
171
170
|
*/
|
|
172
|
-
function togglePurchaseToDisabled(
|
|
173
|
-
|
|
174
|
-
) external view onlyArtist(_projectId) {
|
|
171
|
+
function togglePurchaseToDisabled(uint256 _projectId) external view {
|
|
172
|
+
_onlyArtist(_projectId);
|
|
175
173
|
revert("Action not supported");
|
|
176
174
|
}
|
|
177
175
|
|
|
@@ -228,7 +226,8 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
228
226
|
function updatePricePerTokenInWei(
|
|
229
227
|
uint256 _projectId,
|
|
230
228
|
uint256 _pricePerTokenInWei
|
|
231
|
-
) external
|
|
229
|
+
) external {
|
|
230
|
+
_onlyArtist(_projectId);
|
|
232
231
|
ProjectConfig storage _projectConfig = projectConfig[_projectId];
|
|
233
232
|
_projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
|
|
234
233
|
_projectConfig.priceIsConfigured = true;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
|
|
3
|
+
pragma solidity 0.8.17;
|
|
4
|
+
|
|
5
|
+
import {DeadReceiverMock} from "./DeadReceiverMock.sol";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @notice This reverts when receiving Ether.
|
|
9
|
+
* Also exposes a createBidOnAuction function to create a bid on an auction
|
|
10
|
+
* of a serial English auction minter.
|
|
11
|
+
* @dev Mock contract for testing purposes.
|
|
12
|
+
*/
|
|
13
|
+
contract DeadReceiverBidderMock is DeadReceiverMock {
|
|
14
|
+
function createBidOnAuction(
|
|
15
|
+
address minter,
|
|
16
|
+
uint256 tokenId
|
|
17
|
+
) external payable {
|
|
18
|
+
(bool success, ) = minter.call{value: msg.value}(
|
|
19
|
+
abi.encodeWithSignature("createBid(uint256)", tokenId)
|
|
20
|
+
);
|
|
21
|
+
require(success, "DeadReceiverBidderMock: call failed");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
|
|
3
|
+
pragma solidity 0.8.17;
|
|
4
|
+
|
|
5
|
+
import {GasLimitReceiverMock} from "./GasLimitReceiverMock.sol";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @notice This reverts when receiving Ether.
|
|
9
|
+
* Also exposes a createBidOnAuction function to create a bid on an auction
|
|
10
|
+
* of a serial English auction minter.
|
|
11
|
+
* @dev Mock contract for testing purposes.
|
|
12
|
+
*/
|
|
13
|
+
contract GasLimitReceiverBidderMock is GasLimitReceiverMock {
|
|
14
|
+
function createBidOnAuction(
|
|
15
|
+
address minter,
|
|
16
|
+
uint256 tokenId
|
|
17
|
+
) external payable {
|
|
18
|
+
(bool success, ) = minter.call{value: msg.value}(
|
|
19
|
+
abi.encodeWithSignature("createBid(uint256)", tokenId)
|
|
20
|
+
);
|
|
21
|
+
require(success, "GasLimitReceiverBidderMock: call failed");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
|
|
3
|
+
pragma solidity 0.8.17;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @notice This uses all gas when receiving Ether, useful when testing denial
|
|
7
|
+
* of service attacks.
|
|
8
|
+
* @dev Mock contract for testing purposes.
|
|
9
|
+
*/
|
|
10
|
+
contract GasLimitReceiverMock {
|
|
11
|
+
string public a = "a string in storage.";
|
|
12
|
+
|
|
13
|
+
receive() external payable {
|
|
14
|
+
// infinite loop to burn all available gas
|
|
15
|
+
while (true) {
|
|
16
|
+
a = string.concat(a, " A longer string in storage to burn gas.");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
pragma solidity 0.8.17;
|
|
5
5
|
|
|
6
|
-
import "../
|
|
6
|
+
import "../randomizer/RandomizerV2.sol";
|
|
7
7
|
|
|
8
8
|
/// @title RandomizerV2_NoAssignMock
|
|
9
9
|
/// @notice WARNING - This is a mock contract. Do not use it in production.
|
|
@@ -20,16 +20,7 @@ contract RandomizerV2_NoAssignMock is BasicRandomizerV2 {
|
|
|
20
20
|
// on the core contract. Used for test purposes only.
|
|
21
21
|
// @dev WARNING - THIS IS NOT SECURE AND SHOULD NOT BE USED IN PRODUCTION.
|
|
22
22
|
function actuallyAssignTokenHash(uint256 _tokenId) external {
|
|
23
|
-
|
|
24
|
-
bytes32 hash = keccak256(
|
|
25
|
-
abi.encodePacked(
|
|
26
|
-
_tokenId,
|
|
27
|
-
block.number,
|
|
28
|
-
blockhash(block.number - 1),
|
|
29
|
-
time,
|
|
30
|
-
(time % 200) + 1
|
|
31
|
-
)
|
|
32
|
-
);
|
|
23
|
+
bytes32 hash = _getPseudorandom(_tokenId);
|
|
33
24
|
genArt721Core.setTokenHash_8PT(_tokenId, hash);
|
|
34
25
|
}
|
|
35
26
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../interfaces/0.8.x/IFilteredMinterSEAV0.sol";
|
|
5
|
+
|
|
6
|
+
pragma solidity ^0.8.0;
|
|
7
|
+
|
|
8
|
+
contract ReentrancySEAAutoBidderMock {
|
|
9
|
+
uint256 public targetTokenId;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
@notice This function can be called to induce controlled reentrency attacks
|
|
13
|
+
on AB minter filter suite.
|
|
14
|
+
Note that _priceToPay should be > project price per token to induce refund,
|
|
15
|
+
making reentrency possible via fallback function.
|
|
16
|
+
*/
|
|
17
|
+
function attack(
|
|
18
|
+
uint256 _targetTokenId,
|
|
19
|
+
address _minterContractAddress,
|
|
20
|
+
uint256 _initialBidValue
|
|
21
|
+
) external payable {
|
|
22
|
+
targetTokenId = _targetTokenId;
|
|
23
|
+
IFilteredMinterSEAV0(_minterContractAddress).createBid{
|
|
24
|
+
value: _initialBidValue
|
|
25
|
+
}(_targetTokenId);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// receiver is called when minter sends refunded Ether to this contract, when outbid
|
|
29
|
+
receive() external payable {
|
|
30
|
+
// auto-rebid
|
|
31
|
+
uint256 newBidValue = (msg.value * 110) / 100;
|
|
32
|
+
IFilteredMinterSEAV0(msg.sender).createBid{value: newBidValue}(
|
|
33
|
+
targetTokenId
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Creatd By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity 0.8.17;
|
|
5
|
+
|
|
6
|
+
abstract contract RandomizerBase {
|
|
7
|
+
// base class that returns
|
|
8
|
+
function _getPseudorandom(
|
|
9
|
+
uint256 _tokenId
|
|
10
|
+
) internal virtual returns (bytes32) {
|
|
11
|
+
uint256 time = block.timestamp;
|
|
12
|
+
return
|
|
13
|
+
keccak256(
|
|
14
|
+
abi.encodePacked(
|
|
15
|
+
_tokenId,
|
|
16
|
+
block.number,
|
|
17
|
+
blockhash(block.number - 1),
|
|
18
|
+
time,
|
|
19
|
+
(time % 200) + 1
|
|
20
|
+
)
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
pragma solidity 0.8.17;
|
|
5
5
|
|
|
6
|
-
import "
|
|
7
|
-
import "
|
|
6
|
+
import "../interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
7
|
+
import "../interfaces/0.8.x/IRandomizerPolyptychV0.sol";
|
|
8
|
+
import "./BasicRandomizerBase_v0_0_0.sol";
|
|
8
9
|
|
|
9
10
|
import "@openzeppelin-4.7/contracts/access/Ownable.sol";
|
|
10
11
|
|
|
@@ -23,7 +24,11 @@ import "@openzeppelin-4.7/contracts/access/Ownable.sol";
|
|
|
23
24
|
* Once the contract is configured, it will enable newly-minted tokens to use a copy of the hash
|
|
24
25
|
* seed from a previously-minted token.
|
|
25
26
|
*/
|
|
26
|
-
contract BasicPolyptychRandomizerV0 is
|
|
27
|
+
contract BasicPolyptychRandomizerV0 is
|
|
28
|
+
IRandomizerPolyptychV0,
|
|
29
|
+
RandomizerBase,
|
|
30
|
+
Ownable
|
|
31
|
+
{
|
|
27
32
|
// The core contract that may interact with this randomizer contract.
|
|
28
33
|
IGenArt721CoreContractV3_Base public genArt721Core;
|
|
29
34
|
|
|
@@ -46,26 +51,23 @@ contract BasicPolyptychRandomizerV0 is IRandomizerPolyptychV0, Ownable {
|
|
|
46
51
|
|
|
47
52
|
// modifier to restrict access to only AdminACL allowed calls
|
|
48
53
|
// @dev defers which ACL contract is used to the core contract
|
|
49
|
-
|
|
54
|
+
function _onlyCoreAdminACL(bytes4 _selector) internal {
|
|
50
55
|
require(
|
|
51
56
|
genArt721Core.adminACLAllowed(msg.sender, address(this), _selector),
|
|
52
57
|
"Only Core AdminACL allowed"
|
|
53
58
|
);
|
|
54
|
-
_;
|
|
55
59
|
}
|
|
56
60
|
|
|
57
|
-
|
|
61
|
+
function _onlyArtist(uint256 _projectId) internal view {
|
|
58
62
|
require(
|
|
59
63
|
msg.sender == genArt721Core.projectIdToArtistAddress(_projectId),
|
|
60
64
|
"Only Artist"
|
|
61
65
|
);
|
|
62
|
-
_;
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
// Allows the owner of the core contract to set the minter that is allowed to assign hash seeds
|
|
66
|
-
function setHashSeedSetterContract(
|
|
67
|
-
|
|
68
|
-
) external onlyCoreAdminACL(this.setHashSeedSetterContract.selector) {
|
|
69
|
+
function setHashSeedSetterContract(address _contractAddress) external {
|
|
70
|
+
_onlyCoreAdminACL(this.setHashSeedSetterContract.selector);
|
|
69
71
|
hashSeedSetterContract = _contractAddress;
|
|
70
72
|
emit HashSeedSetterUpdated(_contractAddress);
|
|
71
73
|
}
|
|
@@ -74,9 +76,8 @@ contract BasicPolyptychRandomizerV0 is IRandomizerPolyptychV0, Ownable {
|
|
|
74
76
|
* @notice Allows the owner of the core contract to configure a project as a polyptych
|
|
75
77
|
* @param _projectId - The ID of the project that has a polyptych panel (second, third, etc.)
|
|
76
78
|
*/
|
|
77
|
-
function toggleProjectIsPolyptych(
|
|
78
|
-
|
|
79
|
-
) external onlyArtist(_projectId) {
|
|
79
|
+
function toggleProjectIsPolyptych(uint256 _projectId) external {
|
|
80
|
+
_onlyArtist(_projectId);
|
|
80
81
|
projectIsPolyptych[_projectId] = !projectIsPolyptych[_projectId];
|
|
81
82
|
emit ProjectIsPolyptychUpdated(
|
|
82
83
|
_projectId,
|
|
@@ -104,23 +105,13 @@ contract BasicPolyptychRandomizerV0 is IRandomizerPolyptychV0, Ownable {
|
|
|
104
105
|
// will set a bytes32 hash for tokenId `_tokenId` on the core contract.
|
|
105
106
|
function assignTokenHash(uint256 _tokenId) external virtual {
|
|
106
107
|
require(msg.sender == address(genArt721Core), "Only core may call");
|
|
107
|
-
|
|
108
|
+
bytes32 hash;
|
|
108
109
|
if (projectIsPolyptych[_tokenId / ONE_MILLION]) {
|
|
109
|
-
|
|
110
|
-
require(seededHash != 0, "Only non-zero hash seed");
|
|
111
|
-
genArt721Core.setTokenHash_8PT(_tokenId, seededHash);
|
|
110
|
+
hash = polyptychHashSeeds[_tokenId];
|
|
112
111
|
} else {
|
|
113
|
-
|
|
114
|
-
bytes32 hash = keccak256(
|
|
115
|
-
abi.encodePacked(
|
|
116
|
-
_tokenId,
|
|
117
|
-
block.number,
|
|
118
|
-
blockhash(block.number - 1),
|
|
119
|
-
time,
|
|
120
|
-
(time % 200) + 1
|
|
121
|
-
)
|
|
122
|
-
);
|
|
123
|
-
genArt721Core.setTokenHash_8PT(_tokenId, hash);
|
|
112
|
+
hash = _getPseudorandom(_tokenId);
|
|
124
113
|
}
|
|
114
|
+
require(hash != 0, "Only non-zero hash seed");
|
|
115
|
+
genArt721Core.setTokenHash_8PT(_tokenId, hash);
|
|
125
116
|
}
|
|
126
117
|
}
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
|
|
4
4
|
pragma solidity 0.8.17;
|
|
5
5
|
|
|
6
|
-
import "
|
|
7
|
-
import "
|
|
6
|
+
import "../interfaces/0.8.x/IRandomizerV2.sol";
|
|
7
|
+
import "../interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
8
|
+
import "./BasicRandomizerBase_v0_0_0.sol";
|
|
8
9
|
|
|
9
10
|
import "@openzeppelin-4.7/contracts/access/Ownable.sol";
|
|
10
11
|
|
|
11
|
-
contract BasicRandomizerV2 is IRandomizerV2, Ownable {
|
|
12
|
+
contract BasicRandomizerV2 is IRandomizerV2, RandomizerBase, Ownable {
|
|
12
13
|
// The core contract that may interact with this randomizer contract.
|
|
13
14
|
IGenArt721CoreContractV3_Base public genArt721Core;
|
|
14
15
|
|
|
@@ -21,16 +22,7 @@ contract BasicRandomizerV2 is IRandomizerV2, Ownable {
|
|
|
21
22
|
// will set a bytes32 hash for tokenId `_tokenId` on the core contract.
|
|
22
23
|
function assignTokenHash(uint256 _tokenId) external virtual {
|
|
23
24
|
require(msg.sender == address(genArt721Core), "Only core may call");
|
|
24
|
-
|
|
25
|
-
bytes32 hash = keccak256(
|
|
26
|
-
abi.encodePacked(
|
|
27
|
-
_tokenId,
|
|
28
|
-
block.number,
|
|
29
|
-
blockhash(block.number - 1),
|
|
30
|
-
time,
|
|
31
|
-
(time % 200) + 1
|
|
32
|
-
)
|
|
33
|
-
);
|
|
25
|
+
bytes32 hash = _getPseudorandom(_tokenId);
|
|
34
26
|
genArt721Core.setTokenHash_8PT(_tokenId, hash);
|
|
35
27
|
}
|
|
36
28
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artblocks/contracts",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Smart contracts used by Art Blocks",
|
|
5
5
|
"files": [
|
|
6
6
|
"/contracts/**/*.sol",
|
|
@@ -18,8 +18,12 @@
|
|
|
18
18
|
"format": "prettier --write 'contracts/**/*.sol' && prettier --write 'scripts/**/*.ts' && prettier --write 'test/**/*.ts'",
|
|
19
19
|
"lint": "prettier --check 'contracts/**/*.sol' && prettier --check 'scripts/**/*.ts' && prettier --check 'test/**/*.ts' && npx eslint 'test/**/*.ts'",
|
|
20
20
|
"remix": "remixd -s ./ --remix-ide https://remix.ethereum.org",
|
|
21
|
-
"
|
|
22
|
-
"
|
|
21
|
+
"codegen:dev": "NODE_ENV=dev yarn graphql-codegen --require dotenv/config --config ./graphql.config.js dotenv_config_path=./.env",
|
|
22
|
+
"codegen:staging": "NODE_ENV=staging yarn graphql-codegen --require dotenv/config --config ./graphql.config.js dotenv_config_path=./.env",
|
|
23
|
+
"codegen:mainnet": "NODE_ENV=mainnet yarn graphql-codegen --require dotenv/config --config ./graphql.config.js dotenv_config_path=./.env",
|
|
24
|
+
"deploy:dev:v3-engine": "yarn codegen:dev && NODE_ENV=dev yarn hardhat run --network goerli scripts/engine/V3/generic-engine-deployer.ts",
|
|
25
|
+
"deploy:staging:v3-engine": "yarn codegen:staging && NODE_ENV=staging yarn hardhat run --network goerli scripts/engine/V3/generic-engine-deployer.ts",
|
|
26
|
+
"deploy:mainnet:v3-engine": "yarn codegen:mainnet && NODE_ENV=mainnet yarn hardhat run --network mainnet scripts/engine/V3/generic-engine-deployer.ts",
|
|
23
27
|
"deploy:goerli:minter": "yarn hardhat run --network goerli scripts/minter-deployments/generic-minter-deployer-v3core.ts",
|
|
24
28
|
"deploy:mainnet:minter": "yarn hardhat run --network mainnet scripts/minter-deployments/generic-minter-deployer-v3core.ts"
|
|
25
29
|
},
|
|
@@ -38,37 +42,43 @@
|
|
|
38
42
|
"@gnosis.pm/safe-core-sdk-types": "^1.7.0",
|
|
39
43
|
"@gnosis.pm/safe-ethers-lib": "1.1.0",
|
|
40
44
|
"@gnosis.pm/safe-service-client": "^1.4.0",
|
|
45
|
+
"@graphql-codegen/cli": "^3.0.0",
|
|
46
|
+
"@graphql-codegen/typescript": "^3.0.0",
|
|
47
|
+
"@graphql-codegen/typescript-document-nodes": "^3.0.0",
|
|
48
|
+
"@graphql-codegen/typescript-operations": "^3.0.0",
|
|
49
|
+
"@graphql-codegen/typescript-urql": "^3.7.3",
|
|
50
|
+
"@nomicfoundation/hardhat-network-helpers": "^1.0.8",
|
|
41
51
|
"@nomiclabs/hardhat-ethers": "^2.2.1",
|
|
42
52
|
"@nomiclabs/hardhat-etherscan": "^3.1.4",
|
|
43
|
-
"@nomiclabs/hardhat-solhint": "^
|
|
53
|
+
"@nomiclabs/hardhat-solhint": "^3.0.0",
|
|
44
54
|
"@nomiclabs/hardhat-truffle5": "^2.0.7",
|
|
45
55
|
"@nomiclabs/hardhat-waffle": "^2.0.3",
|
|
46
56
|
"@nomiclabs/hardhat-web3": "^2.0.0",
|
|
47
57
|
"@openzeppelin/hardhat-upgrades": "^1.22.0",
|
|
48
58
|
"@openzeppelin/test-helpers": "^0.5.16",
|
|
49
|
-
"@remix-project/remixd": "^0.
|
|
59
|
+
"@remix-project/remixd": "^0.6.12",
|
|
50
60
|
"@typechain/ethers-v5": "^6.0.5",
|
|
51
|
-
"@types/jest": "^
|
|
52
|
-
"@types/mocha": "^
|
|
61
|
+
"@types/jest": "^29.4.0",
|
|
62
|
+
"@types/mocha": "^10.0.1",
|
|
53
63
|
"@types/prompt": "^1.1.5",
|
|
54
64
|
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
|
55
65
|
"@typescript-eslint/parser": "^5.48.0",
|
|
56
|
-
"aws-sdk-client-mock": "^
|
|
66
|
+
"aws-sdk-client-mock": "^2.1.1",
|
|
57
67
|
"chai": "^4.3.7",
|
|
58
68
|
"coveralls": "^3.1.1",
|
|
59
|
-
"dotenv": "^
|
|
69
|
+
"dotenv": "^16.0.3",
|
|
60
70
|
"eslint": "^8.31.0",
|
|
61
71
|
"eslint-plugin-mocha": "^10.1.0",
|
|
62
|
-
"ethereum-waffle": "^
|
|
72
|
+
"ethereum-waffle": "^4.0.10",
|
|
63
73
|
"ethers": "^5.7.2",
|
|
64
74
|
"hardhat": "^2.12.5",
|
|
65
75
|
"hardhat-contract-sizer": "^2.6.1",
|
|
66
76
|
"hardhat-docgen": "^1.3.0",
|
|
67
77
|
"hardhat-gas-reporter": "^1.0.9",
|
|
68
|
-
"husky": "^
|
|
78
|
+
"husky": "^8.0.3",
|
|
69
79
|
"istanbul-combine": "^0.3.0",
|
|
70
80
|
"keccak256": "^1.0.6",
|
|
71
|
-
"merkletreejs": "^0.
|
|
81
|
+
"merkletreejs": "^0.3.9",
|
|
72
82
|
"prettier": "^2.8.1",
|
|
73
83
|
"prettier-plugin-solidity": "^1.1.1",
|
|
74
84
|
"prompt": "^1.3.0",
|
|
@@ -76,7 +86,7 @@
|
|
|
76
86
|
"solidity-coverage": "^0.8.0",
|
|
77
87
|
"ts-node": "^9.1.1",
|
|
78
88
|
"typechain": "^4.0.3",
|
|
79
|
-
"typescript": "^
|
|
89
|
+
"typescript": "^5.0.2"
|
|
80
90
|
},
|
|
81
91
|
"author": "Art Blocks, Inc",
|
|
82
92
|
"license": "LGPL-3.0-only",
|
|
@@ -84,6 +94,9 @@
|
|
|
84
94
|
"@openzeppelin-0.5/contracts": "npm:@openzeppelin/contracts@2.5.1",
|
|
85
95
|
"@openzeppelin-4.5/contracts": "npm:@openzeppelin/contracts@4.5.0",
|
|
86
96
|
"@openzeppelin-4.7/contracts": "npm:@openzeppelin/contracts@4.7.1",
|
|
87
|
-
"@openzeppelin-4.8/contracts-upgradeable": "npm:@openzeppelin/contracts-upgradeable@4.8.0"
|
|
97
|
+
"@openzeppelin-4.8/contracts-upgradeable": "npm:@openzeppelin/contracts-upgradeable@4.8.0",
|
|
98
|
+
"@urql/exchange-retry": "^1.0.0",
|
|
99
|
+
"graphql": "^16.6.0",
|
|
100
|
+
"urql": "^3.0.3"
|
|
88
101
|
}
|
|
89
102
|
}
|