@zoralabs/protocol-deployments 0.0.11 → 0.0.14-MINT.0

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.
Files changed (91) hide show
  1. package/.turbo/turbo-build.log +18 -20
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +3 -9
  4. package/dist/{package/chainConfigs.d.ts → chainConfigs.d.ts} +5 -3
  5. package/dist/chainConfigs.d.ts.map +1 -0
  6. package/dist/deployment.d.ts.map +1 -0
  7. package/dist/index.cjs +68 -61
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +64 -57
  11. package/dist/index.js.map +1 -1
  12. package/dist/{package/wagmiGenerated.d.ts → wagmiGenerated.d.ts} +158 -68
  13. package/dist/{package/wagmiGenerated.d.ts.map → wagmiGenerated.d.ts.map} +1 -1
  14. package/package.json +18 -30
  15. package/{script → scripts}/bundle-chainConfigs.mjs +9 -7
  16. package/{package → src}/chainConfigs.ts +12 -10
  17. package/{package → src}/wagmiGenerated.ts +107 -54
  18. package/tsconfig.json +1 -1
  19. package/tsup.config.ts +5 -5
  20. package/wagmi.config.ts +31 -9
  21. package/.env.anvil +0 -2
  22. package/addresses/1.json +0 -14
  23. package/addresses/10.json +0 -14
  24. package/addresses/11155111.json +0 -9
  25. package/addresses/420.json +0 -14
  26. package/addresses/424.json +0 -11
  27. package/addresses/5.json +0 -14
  28. package/addresses/58008.json +0 -11
  29. package/addresses/7777777.json +0 -15
  30. package/addresses/8453.json +0 -14
  31. package/addresses/84531.json +0 -14
  32. package/addresses/999.json +0 -15
  33. package/addresses/999999999.json +0 -14
  34. package/chainConfigs/1.json +0 -5
  35. package/chainConfigs/10.json +0 -5
  36. package/chainConfigs/11155111.json +0 -4
  37. package/chainConfigs/420.json +0 -5
  38. package/chainConfigs/424.json +0 -5
  39. package/chainConfigs/5.json +0 -5
  40. package/chainConfigs/58008.json +0 -4
  41. package/chainConfigs/7777777.json +0 -5
  42. package/chainConfigs/8453.json +0 -5
  43. package/chainConfigs/84531.json +0 -5
  44. package/chainConfigs/999.json +0 -5
  45. package/chainConfigs/999999999.json +0 -5
  46. package/deterministicConfig/factoryProxy/params.json +0 -10
  47. package/deterministicConfig/factoryProxy/signatures.json +0 -14
  48. package/deterministicConfig/premintExecutorProxy/params.json +0 -10
  49. package/deterministicConfig/premintExecutorProxy/signatures.json +0 -11
  50. package/deterministicConfig/upgradeGate/params.json +0 -7
  51. package/deterministicConfig/upgradeGate/signatures.json +0 -14
  52. package/dist/package/batchPublish.test.d.ts +0 -451
  53. package/dist/package/batchPublish.test.d.ts.map +0 -1
  54. package/dist/package/chainConfigs.d.ts.map +0 -1
  55. package/dist/package/deployment.d.ts.map +0 -1
  56. package/dist/package/index.d.ts.map +0 -1
  57. package/dist/script/copy-deployed-contracts.d.ts +0 -2
  58. package/dist/script/copy-deployed-contracts.d.ts.map +0 -1
  59. package/dist/script/signDeploymentTransactions.d.ts +0 -2
  60. package/dist/script/signDeploymentTransactions.d.ts.map +0 -1
  61. package/foundry.toml +0 -41
  62. package/package/batchPublish.test.ts +0 -327
  63. package/remappings.txt +0 -9
  64. package/script/CalculateDeterministicParams.s.sol +0 -84
  65. package/script/DeployMintersAndImplementations.s.sol +0 -31
  66. package/script/DeployNew1155Impl.s.sol +0 -24
  67. package/script/DeployNewImplementation.s.sol +0 -26
  68. package/script/DeployPreminterImpl.s.sol +0 -23
  69. package/script/DeployProxiesToNewChain.s.sol +0 -50
  70. package/script/DeployTestContracts.s.sol +0 -35
  71. package/script/DeployUpgradeGate.s.sol +0 -27
  72. package/script/Upgrade.s.sol +0 -83
  73. package/script/UpgradePreminter.s.sol +0 -34
  74. package/script/copy-deployed-contracts.ts +0 -66
  75. package/script/signDeploymentTransactions.ts +0 -277
  76. package/src/DeploymentConfig.sol +0 -124
  77. package/src/DeploymentTestingUtils.sol +0 -166
  78. package/src/DeterministicDeployerScript.sol +0 -249
  79. package/src/DeterministicProxyDeployer.sol +0 -139
  80. package/src/IImmutableCreate2Factory.sol +0 -59
  81. package/src/Zora1155PremintFixtures.sol +0 -75
  82. package/src/ZoraDeployerBase.sol +0 -145
  83. package/src/ZoraDeployerUtils.sol +0 -212
  84. package/test/NewFactoryProxyDeployer.t.sol +0 -127
  85. package/test/UpgradesTest.t.sol +0 -222
  86. package/test/ZoraCreator1155Factory_Fork.t.sol +0 -149
  87. package/test/ZoraCreator1155PremintExecutorForkTest.t.sol +0 -205
  88. /package/dist/{package/deployment.d.ts → deployment.d.ts} +0 -0
  89. /package/dist/{package/index.d.ts → index.d.ts} +0 -0
  90. /package/{package → src}/deployment.ts +0 -0
  91. /package/{package → src}/index.ts +0 -0
@@ -1,222 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.17;
3
-
4
- import "forge-std/Test.sol";
5
- import {ZoraCreator1155FactoryImpl} from "@zoralabs/zora-1155-contracts/src/factory/ZoraCreator1155FactoryImpl.sol";
6
- import {ZoraCreator1155PremintExecutorImpl} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155PremintExecutorImpl.sol";
7
- import {ForkDeploymentConfig, Deployment, ChainConfig} from "../src/DeploymentConfig.sol";
8
- import {ZoraDeployerUtils} from "../src/ZoraDeployerUtils.sol";
9
- import {DeploymentTestingUtils} from "../src/DeploymentTestingUtils.sol";
10
- import {IZoraCreator1155PremintExecutor} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155PremintExecutor.sol";
11
-
12
- contract UpgradesTest is ForkDeploymentConfig, DeploymentTestingUtils, Test {
13
- /// @notice gets the chains to do fork tests on, by reading environment var FORK_TEST_CHAINS.
14
- /// Chains are by name, and must match whats under `rpc_endpoints` in the foundry.toml
15
- function getForkTestChains() private view returns (string[] memory result) {
16
- try vm.envString("FORK_TEST_CHAINS", ",") returns (string[] memory forkTestChains) {
17
- result = forkTestChains;
18
- } catch {
19
- console.log("could not get fork test chains - make sure the environment variable FORK_TEST_CHAINS is set");
20
- result = new string[](0);
21
- }
22
- }
23
-
24
- function determine1155Upgrade(Deployment memory deployment) private view returns (bool upgradeNeeded, address targetProxy, address targetImpl) {
25
- targetProxy = deployment.factoryProxy;
26
- targetImpl = deployment.factoryImpl;
27
- address currentImplementation = ZoraCreator1155FactoryImpl(targetProxy).implementation();
28
-
29
- upgradeNeeded = targetImpl != currentImplementation;
30
- }
31
-
32
- function determinePreminterUpgrade(Deployment memory deployment) private returns (bool upgradeNeeded, address targetProxy, address targetImpl) {
33
- targetProxy = deployment.preminterProxy;
34
- targetImpl = deployment.preminterImpl;
35
-
36
- // right now we cannot call "implementation" on contract since it doesn't exist yet, so we check if deployed impl meets the v1 impl we know
37
- address preminterV1ImplAddress = 0x6E2AbBcd82935bFC68A1d5d2c96372b13b65eD9C;
38
-
39
- // if the target impl is still the v1 impl, it didnt have a method to check impl so we can't call it, also we know its still v1 impl so we don't need to upgrade
40
- if (targetImpl == preminterV1ImplAddress) {
41
- upgradeNeeded = false;
42
- } else {
43
- // if doesnt have implementation method, then we know upgrade is needed
44
- (bool success, bytes memory data) = deployment.preminterProxy.call(abi.encodePacked(ZoraCreator1155PremintExecutorImpl.implementation.selector));
45
-
46
- if (!success) {
47
- upgradeNeeded = true;
48
- } else {
49
- address currentImplementation = abi.decode(data, (address));
50
- upgradeNeeded = currentImplementation != targetImpl;
51
- }
52
- }
53
- }
54
-
55
- function _buildSafeUrl(address safe, address target, bytes memory cd) internal view returns (string memory) {
56
- address[] memory targets = new address[](1);
57
- targets[0] = target;
58
-
59
- bytes[] memory calldatas = new bytes[](1);
60
- calldatas[0] = cd;
61
-
62
- return _buildBatchSafeUrl(safe, targets, calldatas);
63
- }
64
-
65
- // pipe delimiter is url encoded | which is %7C
66
- string constant PIPE_DELIMITER = "%7C";
67
-
68
- function _buildBatchSafeUrl(address safe, address[] memory targets, bytes[] memory cd) internal view returns (string memory) {
69
- string memory targetsString = "";
70
-
71
- for (uint256 i = 0; i < targets.length; i++) {
72
- targetsString = string.concat(targetsString, vm.toString(targets[i]));
73
-
74
- if (i < targets.length - 1) {
75
- targetsString = string.concat(targetsString, PIPE_DELIMITER);
76
- }
77
- }
78
-
79
- string memory calldataString = "";
80
-
81
- for (uint256 i = 0; i < cd.length; i++) {
82
- calldataString = string.concat(calldataString, vm.toString(cd[i]));
83
-
84
- if (i < cd.length - 1) {
85
- calldataString = string.concat(calldataString, PIPE_DELIMITER);
86
- }
87
- }
88
-
89
- string memory valuesString = "";
90
-
91
- for (uint256 i = 0; i < cd.length; i++) {
92
- valuesString = string.concat(valuesString, "0");
93
-
94
- if (i < cd.length - 1) {
95
- valuesString = string.concat(valuesString, PIPE_DELIMITER);
96
- }
97
- }
98
-
99
- // sample url: https://ourzora.github.io/smol-safe/${chainId}/${safeAddress}&target={pipeDelimitedTargets}&calldata={pipeDelimitedCalldata}&value={pipeDelimitedValues}
100
- string memory targetUrl = "https://ourzora.github.io/smol-safe/#safe/";
101
- targetUrl = string.concat(targetUrl, vm.toString(block.chainid));
102
- targetUrl = string.concat(targetUrl, "/");
103
- targetUrl = string.concat(targetUrl, vm.toString(safe));
104
- targetUrl = string.concat(targetUrl, "/new");
105
- targetUrl = string.concat(targetUrl, "?");
106
- targetUrl = string.concat(targetUrl, "targets=");
107
- targetUrl = string.concat(targetUrl, targetsString);
108
- targetUrl = string.concat(targetUrl, "&calldatas=");
109
- targetUrl = string.concat(targetUrl, calldataString);
110
- targetUrl = string.concat(targetUrl, "&values=");
111
- targetUrl = string.concat(targetUrl, valuesString);
112
-
113
- return targetUrl;
114
- }
115
-
116
- /// @notice checks which chains need an upgrade, simulated the upgrade, and gets the upgrade calldata
117
- function simulateUpgradeOnFork(string memory chainName) private {
118
- // create and select the fork, which will be used for all subsequent calls
119
- vm.createSelectFork(vm.rpcUrl(chainName));
120
-
121
- Deployment memory deployment = getDeployment();
122
-
123
- ChainConfig memory chainConfig = getChainConfig();
124
-
125
- address creator = makeAddr("creator");
126
-
127
- (bool is1155UpgradeNeeded, address targetProxy1155, address targetImpl1155) = determine1155Upgrade(deployment);
128
- (bool preminterUpgradeNeeded, address targetPreminterProxy, address targetPremintImpl) = determinePreminterUpgrade(deployment);
129
-
130
- if (!is1155UpgradeNeeded && !preminterUpgradeNeeded) {
131
- return;
132
- }
133
-
134
- console2.log("====== upgrade needed ======");
135
- console2.log("chain:", chainName);
136
- console2.log("upgrade owner:", chainConfig.factoryOwner);
137
-
138
- bytes memory factory1155UpgradeCalldata;
139
-
140
- if (is1155UpgradeNeeded) {
141
- console2.log("-- 1155 upgrade needed --");
142
- vm.prank(chainConfig.factoryOwner);
143
- factory1155UpgradeCalldata = ZoraDeployerUtils.simulateUpgrade(targetProxy1155, targetImpl1155);
144
- vm.prank(creator);
145
- ZoraDeployerUtils.deployTestContractForVerification(targetProxy1155, creator);
146
-
147
- console2.log("1155 upgrade target:", targetProxy1155);
148
- console2.log("upgrade calldata:");
149
- console.logBytes(factory1155UpgradeCalldata);
150
- {
151
- console2.log("upgrade to address:", targetImpl1155);
152
- console2.log("upgrade to version:", ZoraCreator1155FactoryImpl(targetImpl1155).contractVersion());
153
- if (!preminterUpgradeNeeded) {
154
- console2.log("smol safe upgrade url: ", _buildSafeUrl(chainConfig.factoryOwner, targetProxy1155, factory1155UpgradeCalldata));
155
- }
156
- console2.log("------------------------");
157
- }
158
- }
159
-
160
- address factoryOwner = chainConfig.factoryOwner;
161
- bytes memory preminterUpgradeCalldata;
162
-
163
- // hack - for now, only check on zora sepolia or goerli
164
- if (preminterUpgradeNeeded) {
165
- console2.log("-- preminter upgrade needed --");
166
- console2.log("preminter upgrade target:", targetPreminterProxy);
167
- vm.prank(factoryOwner);
168
- preminterUpgradeCalldata = ZoraDeployerUtils.simulateUpgrade(deployment.preminterProxy, deployment.preminterImpl);
169
-
170
- address collector = makeAddr("collector");
171
- address mintReferral = makeAddr("referral");
172
- vm.deal(collector, 10 ether);
173
-
174
- address[] memory mintRewardsRecipients = new address[](1);
175
- mintRewardsRecipients[0] = mintReferral;
176
-
177
- IZoraCreator1155PremintExecutor.MintArguments memory mintArguments = IZoraCreator1155PremintExecutor.MintArguments({
178
- mintRecipient: collector,
179
- mintComment: "",
180
- mintRewardsRecipients: mintRewardsRecipients
181
- });
182
-
183
- vm.startPrank(collector);
184
- signAndExecutePremintV1(targetPreminterProxy, makeAddr("payoutRecipientA"), mintArguments);
185
- signAndExecutePremintV2(targetPreminterProxy, makeAddr("payoutRecipientB"), mintArguments);
186
-
187
- vm.stopPrank();
188
-
189
- {
190
- console2.log("upgrade calldata:");
191
- console.logBytes(preminterUpgradeCalldata);
192
- console2.log("upgrade to address:", targetPremintImpl);
193
- if (!is1155UpgradeNeeded) {
194
- console2.log("smol safe upgrade url: ", _buildSafeUrl(factoryOwner, targetPreminterProxy, preminterUpgradeCalldata));
195
- }
196
- console2.log("------------------------");
197
- }
198
- }
199
-
200
- // if both needed:
201
- if (is1155UpgradeNeeded && preminterUpgradeNeeded) {
202
- address[] memory targets = new address[](2);
203
- targets[0] = targetProxy1155;
204
- targets[1] = targetPreminterProxy;
205
-
206
- bytes[] memory calldatas = new bytes[](2);
207
- calldatas[0] = factory1155UpgradeCalldata;
208
- calldatas[1] = preminterUpgradeCalldata;
209
-
210
- console2.log("multi-upgrade smol safe upgrade url: ", _buildBatchSafeUrl(factoryOwner, targets, calldatas));
211
- }
212
-
213
- console2.log("=================\n");
214
- }
215
-
216
- function test_fork_simulateUpgrades() external {
217
- string[] memory forkTestChains = getForkTestChains();
218
- for (uint256 i = 0; i < forkTestChains.length; i++) {
219
- simulateUpgradeOnFork(forkTestChains[i]);
220
- }
221
- }
222
- }
@@ -1,149 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.17;
3
-
4
- import "forge-std/Test.sol";
5
- import {IZoraCreator1155Factory} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155Factory.sol";
6
- import {ZoraCreator1155FactoryImpl} from "@zoralabs/zora-1155-contracts/src/factory/ZoraCreator1155FactoryImpl.sol";
7
- import {IZoraCreator1155Errors} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155Errors.sol";
8
- import {IZoraCreator1155} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155.sol";
9
- import {ZoraCreator1155Impl} from "@zoralabs/zora-1155-contracts/src/nft/ZoraCreator1155Impl.sol";
10
- import {IMinter1155} from "@zoralabs/zora-1155-contracts/src/interfaces/IMinter1155.sol";
11
- import {IOwnable} from "@zoralabs/zora-1155-contracts/src/interfaces/IOwnable.sol";
12
- import {ICreatorRoyaltiesControl} from "@zoralabs/zora-1155-contracts/src/interfaces/ICreatorRoyaltiesControl.sol";
13
- import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
14
- import {ZoraCreatorFixedPriceSaleStrategy} from "@zoralabs/zora-1155-contracts/src/minters/fixed-price/ZoraCreatorFixedPriceSaleStrategy.sol";
15
- import {ForkDeploymentConfig, Deployment} from "../src/DeploymentConfig.sol";
16
-
17
- contract ZoraCreator1155FactoryForkTest is ForkDeploymentConfig, Test {
18
- uint256 constant quantityToMint = 3;
19
- uint256 constant tokenMaxSupply = 100;
20
- uint32 constant royaltyMintSchedule = 10;
21
- uint32 constant royaltyBPS = 100;
22
- uint256 constant mintFee = 0.000777 ether;
23
-
24
- address collector;
25
- address creator;
26
-
27
- uint256 public constant PERMISSION_BIT_MINTER = 2 ** 2;
28
-
29
- function setUp() external {
30
- creator = vm.addr(1);
31
- collector = vm.addr(2);
32
- }
33
-
34
- /// @notice gets the chains to do fork tests on, by reading environment var FORK_TEST_CHAINS.
35
- /// Chains are by name, and must match whats under `rpc_endpoints` in the foundry.toml
36
- function getForkTestChains() private view returns (string[] memory result) {
37
- try vm.envString("FORK_TEST_CHAINS", ",") returns (string[] memory forkTestChains) {
38
- result = forkTestChains;
39
- } catch {
40
- console.log("could not get fork test chains - make sure the environment variable FORK_TEST_CHAINS is set");
41
- result = new string[](0);
42
- }
43
- }
44
-
45
- function _setupToken(IZoraCreator1155 target, IMinter1155 fixedPrice, uint96 tokenPrice) private returns (uint256 tokenId) {
46
- string memory tokenURI = "ipfs://token";
47
-
48
- tokenId = target.setupNewToken(tokenURI, tokenMaxSupply);
49
-
50
- target.addPermission(tokenId, address(fixedPrice), PERMISSION_BIT_MINTER);
51
-
52
- target.callSale(
53
- tokenId,
54
- fixedPrice,
55
- abi.encodeWithSelector(
56
- ZoraCreatorFixedPriceSaleStrategy.setSale.selector,
57
- tokenId,
58
- ZoraCreatorFixedPriceSaleStrategy.SalesConfig({
59
- pricePerToken: tokenPrice,
60
- saleStart: 0,
61
- saleEnd: type(uint64).max,
62
- maxTokensPerAddress: 0,
63
- fundsRecipient: address(0)
64
- })
65
- )
66
- );
67
- }
68
-
69
- function _createErc1155Contract(IZoraCreator1155Factory factory) private returns (IZoraCreator1155 target) {
70
- // create the contract, with no toekns
71
- bytes[] memory initSetup = new bytes[](0);
72
-
73
- address admin = creator;
74
- string memory contractURI = "ipfs://asdfasdf";
75
- string memory name = "Test";
76
- address royaltyRecipient = creator;
77
-
78
- address deployedAddress = factory.createContract(
79
- contractURI,
80
- name,
81
- ICreatorRoyaltiesControl.RoyaltyConfiguration({
82
- royaltyBPS: royaltyBPS,
83
- royaltyRecipient: royaltyRecipient,
84
- royaltyMintSchedule: royaltyMintSchedule
85
- }),
86
- payable(admin),
87
- initSetup
88
- );
89
-
90
- target = IZoraCreator1155(deployedAddress);
91
-
92
- // ** 2. Setup a new token with the fixed price sales strategy **
93
- }
94
-
95
- function mintTokenAtFork(IZoraCreator1155Factory factory) internal {
96
- uint96 tokenPrice = 1 ether;
97
- IMinter1155 fixedPrice = factory.defaultMinters()[0];
98
- // now create a contract with the factory
99
- vm.startPrank(creator);
100
-
101
- // ** 1. Create the erc1155 contract **
102
- IZoraCreator1155 target = _createErc1155Contract(factory);
103
-
104
- // ** 2. Setup a new token with the fixed price sales strategy and the token price **
105
- uint256 tokenId = _setupToken(target, fixedPrice, tokenPrice);
106
-
107
- // ** 3. Mint on that contract **
108
-
109
- // mint 3 tokens
110
- uint256 valueToSend = quantityToMint * (tokenPrice + mintFee);
111
-
112
- // mint the token
113
- vm.deal(collector, valueToSend);
114
- vm.startPrank(collector);
115
- ZoraCreator1155Impl(payable(address(target))).mintWithRewards{value: valueToSend}(fixedPrice, tokenId, quantityToMint, abi.encode(collector), address(0));
116
-
117
- uint256 balance = ZoraCreator1155Impl(payable(address(target))).balanceOf(collector, tokenId);
118
-
119
- assertEq(balance, quantityToMint, "balance mismatch");
120
- }
121
-
122
- function testTheFork(string memory chainName) private {
123
- console.log("testing on fork: ", chainName);
124
-
125
- // create and select the fork, which will be used for all subsequent calls
126
- // it will also affect the current block chain id based on the rpc url returned
127
- vm.createSelectFork(vm.rpcUrl(chainName));
128
-
129
- Deployment memory deployment = getDeployment();
130
-
131
- address factoryAddress = deployment.factoryProxy;
132
- ZoraCreator1155FactoryImpl factory = ZoraCreator1155FactoryImpl(factoryAddress);
133
-
134
- assertEq(getChainConfig().factoryOwner, IOwnable(factoryAddress).owner(), string.concat("configured owner incorrect on: ", chainName));
135
-
136
- // make sure that the address from the factory matches the stored fixed price address
137
- // sanity check - check minters match config
138
- assertEq(address(factory.merkleMinter()), deployment.merkleMintSaleStrategy, "merkle minter incorrect");
139
- assertEq(address(factory.fixedPriceMinter()), deployment.fixedPriceSaleStrategy, "fixed priced minter incorrect");
140
- assertEq(address(factory.redeemMinterFactory()), deployment.redeemMinterFactory, "redeem minter not correct");
141
- }
142
-
143
- function test_fork_canCreateContractAndMint() external {
144
- string[] memory forkTestChains = getForkTestChains();
145
- for (uint256 i = 0; i < forkTestChains.length; i++) {
146
- testTheFork(forkTestChains[i]);
147
- }
148
- }
149
- }
@@ -1,205 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.17;
3
-
4
- import "forge-std/Test.sol";
5
- import {ForkDeploymentConfig} from "../src/DeploymentConfig.sol";
6
- import {ZoraCreator1155Attribution, ContractCreationConfig, PremintConfig, PremintConfigV2, TokenCreationConfig} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155Attribution.sol";
7
- import {ZoraCreator1155PremintExecutorImpl} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155PremintExecutorImpl.sol";
8
- import {ZoraCreator1155FactoryImpl} from "@zoralabs/zora-1155-contracts/src/factory/ZoraCreator1155FactoryImpl.sol";
9
- import {IZoraCreator1155PremintExecutor} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155PremintExecutor.sol";
10
- import {Zora1155PremintFixtures} from "../src/Zora1155PremintFixtures.sol";
11
-
12
- contract ZoraCreator1155PreminterForkTest is ForkDeploymentConfig, Test {
13
- ZoraCreator1155FactoryImpl factory;
14
- ZoraCreator1155PremintExecutorImpl preminter;
15
- uint256 mintFeeAmount = 0.000777 ether;
16
- address creator;
17
- uint256 creatorPrivateKey;
18
- address payoutRecipient = makeAddr("payoutRecipient");
19
- address minter = makeAddr("minter");
20
-
21
- ContractCreationConfig contractConfig;
22
- PremintConfig premintConfig;
23
- PremintConfigV2 premintConfigV2;
24
- address createReferral = makeAddr("creatReferral");
25
-
26
- /// @notice gets the chains to do fork tests on, by reading environment var FORK_TEST_CHAINS.
27
- /// Chains are by name, and must match whats under `rpc_endpoints` in the foundry.toml
28
- function getForkTestChains() private view returns (string[] memory result) {
29
- try vm.envString("FORK_TEST_CHAINS", ",") returns (string[] memory forkTestChains) {
30
- result = forkTestChains;
31
- } catch {
32
- console.log("could not get fork test chains - make sure the environment variable FORK_TEST_CHAINS is set");
33
- result = new string[](0);
34
- }
35
- }
36
-
37
- function setupPremint() private {
38
- // get contract hash, which is unique per contract creation config, and can be used
39
- // retrieve the address created for a contract
40
- address preminterAddress = getDeployment().preminterProxy;
41
-
42
- // override local preminter to use the addresses from the chain
43
- factory = ZoraCreator1155FactoryImpl(getDeployment().factoryProxy);
44
- preminter = ZoraCreator1155PremintExecutorImpl(preminterAddress);
45
-
46
- (creator, creatorPrivateKey) = makeAddrAndKey("creator");
47
-
48
- contractConfig = Zora1155PremintFixtures.makeDefaultContractCreationConfig(creator);
49
-
50
- premintConfig = Zora1155PremintFixtures.makeDefaultV1PremintConfig(factory.fixedPriceMinter(), payoutRecipient);
51
- premintConfigV2 = Zora1155PremintFixtures.makeDefaultV2PremintConfig(factory.fixedPriceMinter(), payoutRecipient, createReferral);
52
- }
53
-
54
- function equals(string memory str1, string memory str2) public pure returns (bool) {
55
- return keccak256(abi.encodePacked(str1)) == keccak256(abi.encodePacked(str2));
56
- }
57
-
58
- function test_fork_legacyPremint_successfullyMintsPremintTokens() external {
59
- string[] memory forkTestChains = getForkTestChains();
60
- for (uint256 i = 0; i < forkTestChains.length; i++) {
61
- string memory chainName = forkTestChains[i];
62
-
63
- console.log("testing on fork: ", chainName);
64
-
65
- // create and select the fork, which will be used for all subsequent calls
66
- // it will also affect the current block chain id based on the rpc url returned
67
- vm.createSelectFork(vm.rpcUrl(chainName));
68
-
69
- setupPremint();
70
-
71
- _signAndExecutePremintLegacy(creatorPrivateKey, minter, 1, "test comment");
72
- }
73
- }
74
-
75
- function test_fork_premintV1_successfullyMintsPremintTokens() external {
76
- string[] memory forkTestChains = getForkTestChains();
77
- for (uint256 i = 0; i < forkTestChains.length; i++) {
78
- string memory chainName = forkTestChains[i];
79
-
80
- if (!_chainSupportsPremintV2(chainName)) {
81
- console.log("skipping chain, does not support v1 premint: ", chainName);
82
- continue;
83
- }
84
-
85
- console.log("testing on fork: ", chainName);
86
-
87
- // it will also affect the current block chain id based on the rpc url returned
88
- vm.createSelectFork(vm.rpcUrl(chainName));
89
-
90
- setupPremint();
91
-
92
- _signAndExecutePremintV1(creatorPrivateKey, minter, 1, "test comment");
93
- }
94
- }
95
-
96
- function test_fork_premintV2_successfullyMintsPremintTokens() external {
97
- string[] memory forkTestChains = getForkTestChains();
98
- for (uint256 i = 0; i < forkTestChains.length; i++) {
99
- string memory chainName = forkTestChains[i];
100
-
101
- if (!_chainSupportsPremintV2(chainName)) {
102
- console.log("skipping chain, does not support v2 premint: ", chainName);
103
- continue;
104
- }
105
-
106
- console.log("testing on fork: ", chainName);
107
-
108
- // it will also affect the current block chain id based on the rpc url returned
109
- vm.createSelectFork(vm.rpcUrl(chainName));
110
-
111
- setupPremint();
112
-
113
- _signAndExecutePremintV2(creatorPrivateKey, minter, 0, "test comment");
114
- }
115
- }
116
-
117
- function _chainSupportsPremintV2(string memory chainName) private pure returns (bool) {
118
- // for now we know that only goerli and sepolia have v2 premint deployed
119
- return (equals(chainName, "zora_sepolia") || equals(chainName, "zora_goerli"));
120
- }
121
-
122
- function _signAndExecutePremintLegacy(
123
- uint256 privateKey,
124
- address executor,
125
- uint256 quantityToMint,
126
- string memory comment
127
- ) private returns (uint256 newTokenId) {
128
- bytes memory signature = _signPremintV1(preminter.getContractAddress(contractConfig), privateKey, block.chainid);
129
-
130
- uint256 mintCost = mintFeeAmount * quantityToMint;
131
- vm.deal(executor, mintCost);
132
-
133
- // now call the premint function, using the same config that was used to generate the digest, and the signature
134
- vm.prank(executor);
135
- newTokenId = preminter.premint{value: mintCost}(contractConfig, premintConfig, signature, quantityToMint, comment);
136
- }
137
-
138
- function _signAndExecutePremintV1(uint256 privateKey, address executor, uint256 quantityToMint, string memory comment) private {
139
- bytes memory signature = _signPremintV1(preminter.getContractAddress(contractConfig), privateKey, block.chainid);
140
-
141
- uint256 mintCost = mintFeeAmount * quantityToMint;
142
- vm.deal(executor, mintCost);
143
-
144
- // now call the premint function, using the same config that was used to generate the digest, and the signature
145
- vm.prank(executor);
146
- preminter.premintV1{value: mintCost}(
147
- contractConfig,
148
- premintConfig,
149
- signature,
150
- quantityToMint,
151
- IZoraCreator1155PremintExecutor.MintArguments({mintRecipient: executor, mintComment: comment, mintRewardsRecipients: new address[](0)})
152
- );
153
- }
154
-
155
- function _signPremintV1(address contractAddress, uint256 privateKey, uint256 chainId) private view returns (bytes memory) {
156
- bytes32 digest = ZoraCreator1155Attribution.premintHashedTypeDataV4(
157
- ZoraCreator1155Attribution.hashPremint(premintConfig),
158
- contractAddress,
159
- ZoraCreator1155Attribution.HASHED_VERSION_1,
160
- chainId
161
- );
162
-
163
- // 3. Sign the digest
164
- // create a signature with the digest for the params
165
- return _sign(privateKey, digest);
166
- }
167
-
168
- function _signAndExecutePremintV2(uint256 privateKey, address executor, uint256 quantityToMint, string memory comment) private {
169
- bytes memory signature = _signPremintV2(preminter.getContractAddress(contractConfig), privateKey, block.chainid);
170
-
171
- uint256 mintCost = mintFeeAmount * quantityToMint;
172
- vm.deal(executor, mintCost);
173
-
174
- // now call the premint function, using the same config that was used to generate the digest, and the signature
175
- vm.prank(executor);
176
- preminter.premintV2{value: mintCost}(
177
- contractConfig,
178
- premintConfigV2,
179
- signature,
180
- quantityToMint,
181
- IZoraCreator1155PremintExecutor.MintArguments({mintRecipient: executor, mintComment: comment, mintRewardsRecipients: new address[](0)})
182
- );
183
- }
184
-
185
- function _signPremintV2(address contractAddress, uint256 privateKey, uint256 chainId) private view returns (bytes memory) {
186
- bytes32 digest = ZoraCreator1155Attribution.premintHashedTypeDataV4(
187
- ZoraCreator1155Attribution.hashPremint(premintConfigV2),
188
- contractAddress,
189
- ZoraCreator1155Attribution.HASHED_VERSION_2,
190
- chainId
191
- );
192
-
193
- // 3. Sign the digest
194
- // create a signature with the digest for the params
195
- return _sign(privateKey, digest);
196
- }
197
-
198
- function _sign(uint256 privateKey, bytes32 digest) private pure returns (bytes memory) {
199
- // sign the message
200
- (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, digest);
201
-
202
- // combine into a single bytes array
203
- return abi.encodePacked(r, s, v);
204
- }
205
- }
File without changes
File without changes
File without changes