@zoralabs/protocol-deployments 0.0.6 → 0.0.7-prerelease.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.
@@ -10,13 +10,13 @@ $ wagmi generate
10
10
  ✔ Writing to package/wagmiGenerated.ts
11
11
  $ node script/bundle-chainConfigs.mjs && yarn prettier
12
12
  $ prettier --write 'package/**/*.ts' 'script/**/*.ts' 'wagmi.config.ts'
13
- package/batchPublish.test.ts 230ms
13
+ package/batchPublish.test.ts 227ms
14
14
  package/chainConfigs.ts 14ms
15
- package/deployment.ts 14ms
16
- package/index.ts 3ms
17
- package/wagmiGenerated.ts 383ms
18
- script/copy-deployed-contracts.ts 40ms
19
- script/signDeploymentTransactions.ts 43ms
15
+ package/deployment.ts 17ms
16
+ package/index.ts 4ms
17
+ package/wagmiGenerated.ts 375ms
18
+ script/copy-deployed-contracts.ts 43ms
19
+ script/signDeploymentTransactions.ts 42ms
20
20
  wagmi.config.ts 14ms
21
21
  CLI Building entry: package/index.ts
22
22
  CLI Using tsconfig: tsconfig.json
@@ -31,4 +31,4 @@ wagmi.config.ts 14ms
31
31
  CJS ⚡️ Build success in 24ms
32
32
  ESM dist/index.js 98.00 KB
33
33
  ESM dist/index.js.map 192.96 KB
34
- ESM ⚡️ Build success in 24ms
34
+ ESM ⚡️ Build success in 25ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @zoralabs/premint-sdk
2
2
 
3
+ ## 0.0.7-prerelease.0
4
+
5
+ ### Patch Changes
6
+
7
+ - dba9bb0: Updated determinstic preminter deployment script to not fail if already deployed
8
+ - 4c4ae23: Deployed 2.5.1 to zora sepolia and zora goerli
9
+
3
10
  ## 0.0.6
4
11
 
5
12
  ### Patch Changes
@@ -1,14 +1,14 @@
1
1
  {
2
- "CONTRACT_1155_IMPL": "0xcD7230AFfBC8C720aE607e0Bc386fbCAF5C34C2E",
3
- "CONTRACT_1155_IMPL_VERSION": "2.4.0",
4
- "FACTORY_IMPL": "0x869Be2EaE4AB30Cf319a46B5dE50Ac203c8784Aa",
2
+ "CONTRACT_1155_IMPL": "0xa2669e686fa4192166daEa69F269b262636eE198",
3
+ "CONTRACT_1155_IMPL_VERSION": "2.5.1",
4
+ "FACTORY_IMPL": "0x30ed75ffaDF6215A3190d43ec505750a70B29fAc",
5
5
  "FACTORY_PROXY": "0x777777C338d93e2C7adf08D102d45CA7CC4Ed021",
6
6
  "FIXED_PRICE_SALE_STRATEGY": "0x04E2516A2c207E84a1839755675dfd8eF6302F0a",
7
7
  "MERKLE_MINT_SALE_STRATEGY": "0xf48172CA3B6068B20eE4917Eb27b5472f1f272C7",
8
- "PREMINTER_IMPL": "0x6E2AbBcd82935bFC68A1d5d2c96372b13b65eD9C",
8
+ "PREMINTER_IMPL": "0x37A7c717c3EDA58e4ec7F424B2A46934Fd8f8468",
9
9
  "PREMINTER_PROXY": "0x7777773606e7e46C8Ba8B98C08f5cD218e31d340",
10
10
  "REDEEM_MINTER_FACTORY": "0x78964965cF77850224513a367f899435C5B69174",
11
11
  "UPGRADE_GATE": "0xbC50029836A59A4E5e1Bb8988272F46ebA0F9900",
12
- "timestamp": 1699570171,
13
- "commit": "385e4932"
12
+ "timestamp": 1700533625,
13
+ "commit": "8c57238e"
14
14
  }
@@ -1,14 +1,14 @@
1
1
  {
2
- "CONTRACT_1155_IMPL": "0xC6899816663891D7493939d74d83cb7f2BBcBB16",
3
- "CONTRACT_1155_IMPL_VERSION": "2.4.0",
4
- "FACTORY_IMPL": "0xA2d5B3C1feb801c0A1CF083Ee17d939A5E5D2464",
2
+ "CONTRACT_1155_IMPL": "0xF3a46845548bE811Ce37e65153563f4a0AaEbe31",
3
+ "CONTRACT_1155_IMPL_VERSION": "2.5.1",
4
+ "FACTORY_IMPL": "0xF7e49F97E82cc38ACd82E303F37Fe046f5a190B5",
5
5
  "FACTORY_PROXY": "0x777777C338d93e2C7adf08D102d45CA7CC4Ed021",
6
6
  "FIXED_PRICE_SALE_STRATEGY": "0x6d28164C3CE04A190D5F9f0f8881fc807EAD975A",
7
7
  "MERKLE_MINT_SALE_STRATEGY": "0x5e5fD4b758076BAD940db0284b711A67E8a3B88c",
8
- "PREMINTER_IMPL": "0x4e10791d56a6E90b4b7E2840Fa96DD4fB273F3F2",
8
+ "PREMINTER_IMPL": "0x37A7c717c3EDA58e4ec7F424B2A46934Fd8f8468",
9
9
  "PREMINTER_PROXY": "0x7777773606e7e46C8Ba8B98C08f5cD218e31d340",
10
10
  "REDEEM_MINTER_FACTORY": "0x25cFb6dd9cDE8425e781d6718a29Ccbca3F038d6",
11
11
  "UPGRADE_GATE": "0x0000000000000000000000000000000000000000",
12
- "timestamp": 1700087849,
13
- "commit": "a2700107"
12
+ "timestamp": 1700531325,
13
+ "commit": "fdd3d044"
14
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoralabs/protocol-deployments",
3
- "version": "0.0.6",
3
+ "version": "0.0.7-prerelease.0",
4
4
  "repository": "https://github.com/ourzora/zora-protocol",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -8,8 +8,9 @@ import {ZoraDeployerBase} from "../src/ZoraDeployerBase.sol";
8
8
  import {Deployment} from "../src/DeploymentConfig.sol";
9
9
  import {ZoraDeployerUtils} from "../src/ZoraDeployerUtils.sol";
10
10
  import {DeploymentTestingUtils} from "../src/DeploymentTestingUtils.sol";
11
+ import {IZoraCreator1155PremintExecutor} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155PremintExecutor.sol";
11
12
 
12
- contract DeployProxiesToNewChain is ZoraDeployerBase, DeploymentTestingUtils {
13
+ contract DeployProxiesToNewChain is ZoraDeployerBase {
13
14
  function run() public returns (string memory) {
14
15
  Deployment memory deployment = getDeployment();
15
16
 
@@ -31,7 +32,14 @@ contract DeployProxiesToNewChain is ZoraDeployerBase, DeploymentTestingUtils {
31
32
 
32
33
  console2.log("testing premint");
33
34
 
34
- signAndExecutePremint(deployment.preminterProxy, vm.envAddress("TEST_PREMINT_FUNDS_RECIPIENT"));
35
+ address fundsRecipient = vm.envAddress("TEST_PREMINT_FUNDS_RECIPIENT");
36
+ IZoraCreator1155PremintExecutor.MintArguments memory mintArguments = IZoraCreator1155PremintExecutor.MintArguments({
37
+ mintRecipient: fundsRecipient,
38
+ mintComment: "",
39
+ mintReferral: fundsRecipient
40
+ });
41
+
42
+ signAndExecutePremintV2(deployment.preminterProxy, vm.envAddress("TEST_PREMINT_FUNDS_RECIPIENT"), mintArguments);
35
43
 
36
44
  vm.stopBroadcast();
37
45
 
@@ -0,0 +1,35 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.17;
3
+
4
+ import "forge-std/Script.sol";
5
+ import "forge-std/console2.sol";
6
+
7
+ import {ZoraDeployerBase} from "../src/ZoraDeployerBase.sol";
8
+ import {Deployment} from "../src/DeploymentConfig.sol";
9
+ import {ZoraDeployerUtils} from "../src/ZoraDeployerUtils.sol";
10
+ import {IZoraCreator1155PremintExecutor} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155PremintExecutor.sol";
11
+
12
+ contract DeployTestContracts is ZoraDeployerBase {
13
+ function run() public returns (string memory) {
14
+ Deployment memory deployment = getDeployment();
15
+
16
+ vm.startBroadcast();
17
+
18
+ ZoraDeployerUtils.deployTestContractForVerification(deployment.factoryProxy, makeAddr("admin"));
19
+
20
+ address fundsRecipient = vm.envAddress("DEPLOYER");
21
+ IZoraCreator1155PremintExecutor.MintArguments memory mintArguments = IZoraCreator1155PremintExecutor.MintArguments({
22
+ mintRecipient: fundsRecipient,
23
+ mintComment: "",
24
+ mintReferral: fundsRecipient
25
+ });
26
+
27
+ signAndExecutePremintV2(deployment.preminterProxy, fundsRecipient, mintArguments);
28
+
29
+ vm.stopBroadcast();
30
+
31
+ // now test signing and executing premint
32
+
33
+ return getDeploymentJSON(deployment);
34
+ }
35
+ }
@@ -6,56 +6,138 @@ import {IMinter1155} from "@zoralabs/zora-1155-contracts/src/interfaces/IMinter1
6
6
  import {IZoraCreator1155PremintExecutor} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155PremintExecutor.sol";
7
7
  import {ZoraCreator1155PremintExecutorImpl} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155PremintExecutorImpl.sol";
8
8
  import {ZoraCreator1155FactoryImpl} from "@zoralabs/zora-1155-contracts/src/factory/ZoraCreator1155FactoryImpl.sol";
9
- import {ZoraCreator1155Attribution, ContractCreationConfig, PremintConfigV2, TokenCreationConfigV2} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155Attribution.sol";
9
+ import {ZoraCreator1155Attribution, ContractCreationConfig, PremintConfigV2, TokenCreationConfigV2, PremintConfig, TokenCreationConfig} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155Attribution.sol";
10
+ import {ScriptDeploymentConfig} from "./DeploymentConfig.sol";
10
11
  import {ZoraCreator1155Impl} from "@zoralabs/zora-1155-contracts/src/nft/ZoraCreator1155Impl.sol";
11
12
 
12
13
  contract DeploymentTestingUtils is Script {
13
- function signAndExecutePremint(address premintExecutorProxyAddress, address payoutRecipient) internal {
14
- console2.log("preminter proxy", premintExecutorProxyAddress);
15
-
14
+ function createAndSignPremintV1(
15
+ address premintExecutorProxyAddress,
16
+ address payoutRecipient
17
+ )
18
+ internal
19
+ returns (
20
+ ContractCreationConfig memory contractConfig,
21
+ IZoraCreator1155PremintExecutor preminterAtProxy,
22
+ PremintConfig memory premintConfig,
23
+ bytes memory signature
24
+ )
25
+ {
16
26
  (address creator, uint256 creatorPrivateKey) = makeAddrAndKey("creator");
17
- IZoraCreator1155PremintExecutor preminterAtProxy = IZoraCreator1155PremintExecutor(premintExecutorProxyAddress);
18
-
19
- IMinter1155 fixedPriceMinter = ZoraCreator1155FactoryImpl(address(preminterAtProxy.zora1155Factory())).fixedPriceMinter();
27
+ preminterAtProxy = IZoraCreator1155PremintExecutor(premintExecutorProxyAddress);
20
28
 
21
- PremintConfigV2 memory premintConfig = PremintConfigV2({
22
- tokenConfig: TokenCreationConfigV2({
29
+ premintConfig = PremintConfig({
30
+ tokenConfig: TokenCreationConfig({
23
31
  tokenURI: "blah.token",
24
32
  maxSupply: 10,
25
33
  maxTokensPerAddress: 5,
26
34
  pricePerToken: 0,
27
35
  mintStart: 0,
28
36
  mintDuration: 0,
37
+ royaltyMintSchedule: 0,
29
38
  royaltyBPS: 100,
30
- payoutRecipient: payoutRecipient,
31
- fixedPriceMinter: address(fixedPriceMinter),
32
- createReferral: address(0)
39
+ royaltyRecipient: payoutRecipient,
40
+ fixedPriceMinter: address(ZoraCreator1155FactoryImpl(address(preminterAtProxy.zora1155Factory())).fixedPriceMinter())
33
41
  }),
34
- uid: 100,
42
+ uid: 101,
35
43
  version: 0,
36
44
  deleted: false
37
45
  });
38
46
 
39
47
  // now interface with proxy preminter - sign and execute the premint
40
- ContractCreationConfig memory contractConfig = ContractCreationConfig({contractAdmin: creator, contractName: "blah", contractURI: "blah.contract"});
48
+ contractConfig = ContractCreationConfig({contractAdmin: creator, contractName: "blahb", contractURI: "blah.contract"});
41
49
  address deterministicAddress = preminterAtProxy.getContractAddress(contractConfig);
42
50
 
51
+ signature = signPremint(premintConfig, deterministicAddress, creatorPrivateKey);
52
+ }
53
+
54
+ function signAndExecutePremintV1(
55
+ address premintExecutorProxyAddress,
56
+ address payoutRecipient,
57
+ IZoraCreator1155PremintExecutor.MintArguments memory mintArguments
58
+ ) internal {
59
+ (
60
+ ContractCreationConfig memory contractConfig,
61
+ IZoraCreator1155PremintExecutor preminterAtProxy,
62
+ PremintConfig memory premintConfig,
63
+ bytes memory signature
64
+ ) = createAndSignPremintV1(premintExecutorProxyAddress, payoutRecipient);
65
+
43
66
  uint256 quantityToMint = 1;
44
67
 
45
- address mintRecipient = creator;
68
+ // execute the premint
69
+ IZoraCreator1155PremintExecutor.PremintResult memory premintResult = preminterAtProxy.premintV1{value: mintFee(quantityToMint)}(
70
+ contractConfig,
71
+ premintConfig,
72
+ signature,
73
+ quantityToMint,
74
+ mintArguments
75
+ );
76
+
77
+ require(ZoraCreator1155Impl(premintResult.contractAddress).delegatedTokenId(premintConfig.uid) == premintResult.tokenId, "token id mismatch");
78
+ }
79
+
80
+ function createAndSignPremintV2(
81
+ address premintExecutorProxyAddress,
82
+ address payoutRecipient
83
+ )
84
+ internal
85
+ returns (
86
+ ContractCreationConfig memory contractConfig,
87
+ IZoraCreator1155PremintExecutor preminterAtProxy,
88
+ PremintConfigV2 memory premintConfig,
89
+ bytes memory signature
90
+ )
91
+ {
92
+ (address creator, uint256 creatorPrivateKey) = makeAddrAndKey("creator");
93
+ preminterAtProxy = IZoraCreator1155PremintExecutor(premintExecutorProxyAddress);
46
94
 
47
- IZoraCreator1155PremintExecutor.MintArguments memory mintArguments = IZoraCreator1155PremintExecutor.MintArguments({
48
- mintRecipient: mintRecipient,
49
- mintComment: "",
50
- mintReferral: address(0)
95
+ premintConfig = PremintConfigV2({
96
+ tokenConfig: TokenCreationConfigV2({
97
+ tokenURI: "blah.token",
98
+ maxSupply: 100,
99
+ maxTokensPerAddress: 50,
100
+ pricePerToken: 0,
101
+ mintStart: 0,
102
+ mintDuration: 0,
103
+ royaltyBPS: 100,
104
+ payoutRecipient: payoutRecipient,
105
+ fixedPriceMinter: address(ZoraCreator1155FactoryImpl(address(preminterAtProxy.zora1155Factory())).fixedPriceMinter()),
106
+ createReferral: creator
107
+ }),
108
+ uid: 100,
109
+ version: 0,
110
+ deleted: false
51
111
  });
52
112
 
53
- bytes memory signature = signPremint(premintConfig, deterministicAddress, creatorPrivateKey);
113
+ // now interface with proxy preminter - sign and execute the premint
114
+ contractConfig = ContractCreationConfig({contractAdmin: creator, contractName: "blahb", contractURI: "blah.contract"});
115
+ address deterministicAddress = preminterAtProxy.getContractAddress(contractConfig);
116
+
117
+ signature = signPremint(premintConfig, deterministicAddress, creatorPrivateKey);
118
+ }
54
119
 
120
+ function signAndExecutePremintV2(
121
+ address premintExecutorProxyAddress,
122
+ address payoutRecipient,
123
+ IZoraCreator1155PremintExecutor.MintArguments memory mintArguments
124
+ ) internal {
125
+ (
126
+ ContractCreationConfig memory contractConfig,
127
+ IZoraCreator1155PremintExecutor preminterAtProxy,
128
+ PremintConfigV2 memory premintConfig,
129
+ bytes memory signature
130
+ ) = createAndSignPremintV2(premintExecutorProxyAddress, payoutRecipient);
131
+
132
+ uint256 quantityToMint = 1;
55
133
  // execute the premint
56
- uint256 tokenId = preminterAtProxy.premintV2{value: 0.000777 ether}(contractConfig, premintConfig, signature, quantityToMint, mintArguments).tokenId;
134
+ uint256 tokenId = preminterAtProxy
135
+ .premintV2{value: mintFee(quantityToMint)}(contractConfig, premintConfig, signature, quantityToMint, mintArguments).tokenId;
57
136
 
58
- require(ZoraCreator1155Impl(deterministicAddress).delegatedTokenId(premintConfig.uid) == tokenId, "token id not created for uid");
137
+ require(
138
+ ZoraCreator1155Impl(preminterAtProxy.getContractAddress(contractConfig)).delegatedTokenId(premintConfig.uid) == tokenId,
139
+ "token id not created for uid"
140
+ );
59
141
  }
60
142
 
61
143
  function signPremint(PremintConfigV2 memory premintConfig, address deterministicAddress, uint256 privateKey) private view returns (bytes memory signature) {
@@ -67,4 +149,18 @@ contract DeploymentTestingUtils is Script {
67
149
  (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, digest);
68
150
  return abi.encodePacked(r, s, v);
69
151
  }
152
+
153
+ function mintFee(uint256 quantityToMint) internal pure returns (uint256) {
154
+ return quantityToMint * 0.000777 ether;
155
+ }
156
+
157
+ function signPremint(PremintConfig memory premintConfig, address deterministicAddress, uint256 privateKey) private view returns (bytes memory signature) {
158
+ bytes32 signatureVersion = ZoraCreator1155Attribution.HASHED_VERSION_1;
159
+ bytes32 structHash = ZoraCreator1155Attribution.hashPremint(premintConfig);
160
+ // sign the premint
161
+ bytes32 digest = ZoraCreator1155Attribution.premintHashedTypeDataV4(structHash, deterministicAddress, signatureVersion, block.chainid);
162
+
163
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, digest);
164
+ return abi.encodePacked(r, s, v);
165
+ }
70
166
  }
@@ -199,13 +199,9 @@ contract DeterministicDeployerScript is Script {
199
199
  bytes32 proxyDeployerSalt = params.proxyDeployerSalt;
200
200
  bytes memory proxyDeployerCreationCode = params.proxyDeployerCreationCode;
201
201
 
202
- if (ZoraDeployerUtils.IMMUTABLE_CREATE2_FACTORY.hasBeenDeployed(proxyDeployerAddress)) {
203
- factoryDeployer = DeterministicProxyDeployer(proxyDeployerAddress);
204
- } else {
205
- factoryDeployer = DeterministicProxyDeployer(ZoraDeployerUtils.IMMUTABLE_CREATE2_FACTORY.safeCreate2(proxyDeployerSalt, proxyDeployerCreationCode));
206
- }
202
+ ZoraDeployerUtils.getOrImmutable2Create(proxyDeployerAddress, proxyDeployerSalt, proxyDeployerCreationCode);
207
203
 
208
- if (address(factoryDeployer) != params.proxyDeployerAddress) revert MismatchedAddress(params.proxyDeployerAddress, address(factoryDeployer));
204
+ factoryDeployer = DeterministicProxyDeployer(proxyDeployerAddress);
209
205
  }
210
206
 
211
207
  function deployDeterministicProxy(string memory proxyName, address implementation, address owner, uint256 chain) internal returns (address) {
@@ -13,9 +13,10 @@ import {ZoraDeployerUtils} from "./ZoraDeployerUtils.sol";
13
13
  import {IMinter1155} from "@zoralabs/zora-1155-contracts/src/interfaces/IMinter1155.sol";
14
14
  import {DeterministicDeployerScript} from "./DeterministicDeployerScript.sol";
15
15
  import {ZoraCreator1155FactoryImpl} from "@zoralabs/zora-1155-contracts/src/factory/ZoraCreator1155FactoryImpl.sol";
16
+ import {DeploymentTestingUtils} from "./DeploymentTestingUtils.sol";
16
17
 
17
18
  /// @notice Deployment drops for base where
18
- abstract contract ZoraDeployerBase is ScriptDeploymentConfig, DeterministicDeployerScript {
19
+ abstract contract ZoraDeployerBase is DeploymentTestingUtils, ScriptDeploymentConfig, DeterministicDeployerScript {
19
20
  using stdJson for string;
20
21
 
21
22
  /// @notice File used for demo metadata on verification test mint
@@ -17,6 +17,7 @@ import {ZoraCreatorRedeemMinterFactory} from "@zoralabs/zora-1155-contracts/src/
17
17
  import {Create2} from "@openzeppelin/contracts/utils/Create2.sol";
18
18
  import {ICreatorRoyaltiesControl} from "@zoralabs/zora-1155-contracts/src/interfaces/ICreatorRoyaltiesControl.sol";
19
19
  import {UpgradeGate} from "@zoralabs/zora-1155-contracts/src/upgrades/UpgradeGate.sol";
20
+ import {UUPSUpgradeable} from "@zoralabs/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol";
20
21
 
21
22
  struct Create2Deployment {
22
23
  address deployerAddress;
@@ -117,12 +118,13 @@ library ZoraDeployerUtils {
117
118
  // create preminter implementation
118
119
  bytes memory creationCode = abi.encodePacked(type(ZoraCreator1155PremintExecutorImpl).creationCode, abi.encode(factoryProxyAddress));
119
120
 
120
- address preminterImplementation = IMMUTABLE_CREATE2_FACTORY.safeCreate2(
121
- bytes32(0x0000000000000000000000000000000000000000668d7f9ec18e35000dbaba0e),
122
- creationCode
123
- );
121
+ bytes32 salt = bytes32(0x0000000000000000000000000000000000000000668d7f9ec18e35000dbaba0e);
122
+
123
+ address determinsticAddress = ZoraDeployerUtils.getImmutableCreate2Address(salt, creationCode);
124
124
 
125
- return preminterImplementation;
125
+ ZoraDeployerUtils.getOrImmutable2Create(determinsticAddress, salt, creationCode);
126
+
127
+ return determinsticAddress;
126
128
  }
127
129
 
128
130
  function deterministicFactoryDeployerAddress() internal view returns (address) {
@@ -152,6 +154,24 @@ library ZoraDeployerUtils {
152
154
  );
153
155
  }
154
156
 
157
+ error MismatchedAddress(address expected, address actual);
158
+
159
+ function getImmutableCreate2Address(bytes32 salt, bytes memory creationCode) internal pure returns (address) {
160
+ return Create2.computeAddress(salt, keccak256(creationCode), address(IMMUTABLE_CREATE2_FACTORY));
161
+ }
162
+
163
+ function getOrImmutable2Create(address expectedAddress, bytes32 salt, bytes memory creationCode) internal returns (bool contractWasCreated) {
164
+ if (IMMUTABLE_CREATE2_FACTORY.hasBeenDeployed(expectedAddress)) {
165
+ return false;
166
+ } else {
167
+ address result = ZoraDeployerUtils.IMMUTABLE_CREATE2_FACTORY.safeCreate2(salt, creationCode);
168
+
169
+ if (result != expectedAddress) revert MismatchedAddress(expectedAddress, result);
170
+
171
+ return true;
172
+ }
173
+ }
174
+
155
175
  /// @notice Deploy a test contract for etherscan auto-verification
156
176
  /// @param factoryProxy Factory address to use
157
177
  /// @param admin Admin owner address to use
@@ -174,25 +194,18 @@ library ZoraDeployerUtils {
174
194
  );
175
195
  }
176
196
 
177
- function getUpgradeCalldata(Deployment memory deployment) internal returns (bytes memory upgradeCalldata) {
178
- // create 1155 proxy from deployment factory proxy address
179
- ZoraCreator1155FactoryImpl factory = ZoraCreator1155FactoryImpl(deployment.factoryProxy);
180
-
181
- address owner = factory.owner();
182
-
197
+ function getUpgradeCalldata(address targetImpl) internal pure returns (bytes memory upgradeCalldata) {
183
198
  // simulate upgrade call
184
- upgradeCalldata = abi.encodeWithSelector(factory.upgradeTo.selector, deployment.factoryImpl);
199
+ upgradeCalldata = abi.encodeWithSelector(UUPSUpgradeable.upgradeTo.selector, targetImpl);
185
200
  }
186
201
 
187
- function simulateUpgrade(Deployment memory deployment) internal returns (address target, bytes memory upgradeCalldata) {
202
+ function simulateUpgrade(address targetProxy, address targetImpl) internal returns (bytes memory upgradeCalldata) {
188
203
  // console log update information
189
204
 
190
- upgradeCalldata = getUpgradeCalldata(deployment);
205
+ upgradeCalldata = getUpgradeCalldata(targetImpl);
191
206
 
192
- target = deployment.factoryProxy;
193
207
  // upgrade the factory proxy to the new implementation
194
-
195
- (bool success, ) = target.call(upgradeCalldata);
208
+ (bool success, ) = targetProxy.call(upgradeCalldata);
196
209
 
197
210
  require(success, "upgrade failed");
198
211
  }
@@ -3,10 +3,13 @@ pragma solidity 0.8.17;
3
3
 
4
4
  import "forge-std/Test.sol";
5
5
  import {ZoraCreator1155FactoryImpl} from "@zoralabs/zora-1155-contracts/src/factory/ZoraCreator1155FactoryImpl.sol";
6
+ import {ZoraCreator1155PremintExecutorImpl} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155PremintExecutorImpl.sol";
6
7
  import {ForkDeploymentConfig, Deployment, ChainConfig} from "../src/DeploymentConfig.sol";
7
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";
8
11
 
9
- contract UpgradesTest is ForkDeploymentConfig, Test {
12
+ contract UpgradesTest is ForkDeploymentConfig, DeploymentTestingUtils, Test {
10
13
  /// @notice gets the chains to do fork tests on, by reading environment var FORK_TEST_CHAINS.
11
14
  /// Chains are by name, and must match whats under `rpc_endpoints` in the foundry.toml
12
15
  function getForkTestChains() private view returns (string[] memory result) {
@@ -18,8 +21,41 @@ contract UpgradesTest is ForkDeploymentConfig, Test {
18
21
  }
19
22
  }
20
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
+ console2.log(upgradeNeeded);
54
+ }
55
+ }
56
+
21
57
  /// @notice checks which chains need an upgrade, simulated the upgrade, and gets the upgrade calldata
22
- function simulate1155UpgradeOnFork(string memory chainName) private {
58
+ function simulateUpgradeOnFork(string memory chainName) private {
23
59
  // create and select the fork, which will be used for all subsequent calls
24
60
  vm.createSelectFork(vm.rpcUrl(chainName));
25
61
 
@@ -29,32 +65,68 @@ contract UpgradesTest is ForkDeploymentConfig, Test {
29
65
 
30
66
  address creator = makeAddr("creator");
31
67
 
32
- vm.startPrank(chainConfig.factoryOwner);
68
+ (bool is1155UpgradeNeeded, address targetProxy1155, address targetImpl1155) = determine1155Upgrade(deployment);
69
+ (bool preminterUpgradeNeeded, address targetPreminterProxy, address targetPremintImpl) = determinePreminterUpgrade(deployment);
33
70
 
34
- address currentImplementation = ZoraCreator1155FactoryImpl(deployment.factoryProxy).implementation();
71
+ if (!is1155UpgradeNeeded && !preminterUpgradeNeeded) {
72
+ return;
73
+ }
74
+
75
+ console2.log("====== upgrade needed ======");
76
+ console2.log("chain:", chainName);
77
+ console2.log("upgrade owner:", chainConfig.factoryOwner);
78
+
79
+ if (is1155UpgradeNeeded) {
80
+ console2.log("-- 1155 upgrade needed --");
81
+ vm.prank(chainConfig.factoryOwner);
82
+ bytes memory factory1155UpgradeCalldata = ZoraDeployerUtils.simulateUpgrade(targetProxy1155, targetImpl1155);
83
+ vm.prank(creator);
84
+ ZoraDeployerUtils.deployTestContractForVerification(targetProxy1155, creator);
85
+
86
+ console2.log("1155 upgrade target:", targetProxy1155);
87
+ console2.log("upgrade calldata:");
88
+ console.logBytes(factory1155UpgradeCalldata);
89
+ console2.log("upgrade to address:", targetImpl1155);
90
+ console2.log("upgrade to version:", ZoraCreator1155FactoryImpl(targetImpl1155).contractVersion());
91
+ console2.log("------------------------");
92
+ }
93
+
94
+ // hack - for now, only check on zora sepolia or goerli
95
+ if (preminterUpgradeNeeded) {
96
+ console2.log("-- preminter upgrade needed --");
97
+ console2.log("preminter upgrade target:", targetPreminterProxy);
98
+ vm.prank(chainConfig.factoryOwner);
99
+ bytes memory preminterUpgradeCalldata = ZoraDeployerUtils.simulateUpgrade(deployment.preminterProxy, deployment.preminterImpl);
100
+
101
+ address collector = makeAddr("collector");
102
+ address mintReferral = makeAddr("referral");
103
+ vm.deal(collector, 10 ether);
35
104
 
36
- if (currentImplementation != deployment.factoryImpl) {
37
- address targetImpl = deployment.factoryImpl;
38
- (address target, bytes memory upgradeCalldata) = ZoraDeployerUtils.simulateUpgrade(deployment);
105
+ IZoraCreator1155PremintExecutor.MintArguments memory mintArguments = IZoraCreator1155PremintExecutor.MintArguments({
106
+ mintRecipient: collector,
107
+ mintComment: "",
108
+ mintReferral: mintReferral
109
+ });
39
110
 
40
- ZoraDeployerUtils.deployTestContractForVerification(deployment.factoryProxy, creator);
111
+ vm.startPrank(collector);
112
+ signAndExecutePremintV1(targetPreminterProxy, makeAddr("payoutRecipientA"), mintArguments);
113
+ signAndExecutePremintV2(targetPreminterProxy, makeAddr("payoutRecipientB"), mintArguments);
114
+
115
+ vm.stopPrank();
41
116
 
42
- console2.log("=== 1155 upgrade needed ===");
43
- console2.log("chain:", chainName);
44
- console2.log("upgrade owner:", chainConfig.factoryOwner);
45
- console2.log("upgrade target:", target);
46
117
  console2.log("upgrade calldata:");
47
- console.logBytes(upgradeCalldata);
48
- console2.log("upgrade to address:", targetImpl);
49
- console2.log("upgrade to version:", ZoraCreator1155FactoryImpl(targetImpl).contractVersion());
50
- console2.log("=====================\n");
118
+ console.logBytes(preminterUpgradeCalldata);
119
+ console2.log("upgrade to address:", targetPremintImpl);
120
+ console2.log("------------------------");
51
121
  }
122
+
123
+ console2.log("=================\n");
52
124
  }
53
125
 
54
126
  function test_fork_simulateUpgrades() external {
55
127
  string[] memory forkTestChains = getForkTestChains();
56
128
  for (uint256 i = 0; i < forkTestChains.length; i++) {
57
- simulate1155UpgradeOnFork(forkTestChains[i]);
129
+ simulateUpgradeOnFork(forkTestChains[i]);
58
130
  }
59
131
  }
60
132
  }