@zoralabs/protocol-deployments 0.0.5 → 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.
@@ -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
+
125
+ ZoraDeployerUtils.getOrImmutable2Create(determinsticAddress, salt, creationCode);
124
126
 
125
- return preminterImplementation;
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
@@ -173,4 +193,20 @@ library ZoraDeployerUtils {
173
193
  )
174
194
  );
175
195
  }
196
+
197
+ function getUpgradeCalldata(address targetImpl) internal pure returns (bytes memory upgradeCalldata) {
198
+ // simulate upgrade call
199
+ upgradeCalldata = abi.encodeWithSelector(UUPSUpgradeable.upgradeTo.selector, targetImpl);
200
+ }
201
+
202
+ function simulateUpgrade(address targetProxy, address targetImpl) internal returns (bytes memory upgradeCalldata) {
203
+ // console log update information
204
+
205
+ upgradeCalldata = getUpgradeCalldata(targetImpl);
206
+
207
+ // upgrade the factory proxy to the new implementation
208
+ (bool success, ) = targetProxy.call(upgradeCalldata);
209
+
210
+ require(success, "upgrade failed");
211
+ }
176
212
  }
@@ -0,0 +1,132 @@
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
+ console2.log(upgradeNeeded);
54
+ }
55
+ }
56
+
57
+ /// @notice checks which chains need an upgrade, simulated the upgrade, and gets the upgrade calldata
58
+ function simulateUpgradeOnFork(string memory chainName) private {
59
+ // create and select the fork, which will be used for all subsequent calls
60
+ vm.createSelectFork(vm.rpcUrl(chainName));
61
+
62
+ Deployment memory deployment = getDeployment();
63
+
64
+ ChainConfig memory chainConfig = getChainConfig();
65
+
66
+ address creator = makeAddr("creator");
67
+
68
+ (bool is1155UpgradeNeeded, address targetProxy1155, address targetImpl1155) = determine1155Upgrade(deployment);
69
+ (bool preminterUpgradeNeeded, address targetPreminterProxy, address targetPremintImpl) = determinePreminterUpgrade(deployment);
70
+
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);
104
+
105
+ IZoraCreator1155PremintExecutor.MintArguments memory mintArguments = IZoraCreator1155PremintExecutor.MintArguments({
106
+ mintRecipient: collector,
107
+ mintComment: "",
108
+ mintReferral: mintReferral
109
+ });
110
+
111
+ vm.startPrank(collector);
112
+ signAndExecutePremintV1(targetPreminterProxy, makeAddr("payoutRecipientA"), mintArguments);
113
+ signAndExecutePremintV2(targetPreminterProxy, makeAddr("payoutRecipientB"), mintArguments);
114
+
115
+ vm.stopPrank();
116
+
117
+ console2.log("upgrade calldata:");
118
+ console.logBytes(preminterUpgradeCalldata);
119
+ console2.log("upgrade to address:", targetPremintImpl);
120
+ console2.log("------------------------");
121
+ }
122
+
123
+ console2.log("=================\n");
124
+ }
125
+
126
+ function test_fork_simulateUpgrades() external {
127
+ string[] memory forkTestChains = getForkTestChains();
128
+ for (uint256 i = 0; i < forkTestChains.length; i++) {
129
+ simulateUpgradeOnFork(forkTestChains[i]);
130
+ }
131
+ }
132
+ }
@@ -76,7 +76,12 @@ contract ZoraCreator1155PreminterForkTest is ForkDeploymentConfig, Test {
76
76
  uint256 privateKey,
77
77
  uint256 chainId
78
78
  ) private pure returns (bytes memory) {
79
- bytes32 digest = ZoraCreator1155Attribution.premintHashedTypeDataV4(premintConfig, contractAddress, chainId);
79
+ bytes32 digest = ZoraCreator1155Attribution.premintHashedTypeDataV4(
80
+ ZoraCreator1155Attribution.hashPremint(premintConfig),
81
+ contractAddress,
82
+ ZoraCreator1155Attribution.HASHED_VERSION_1,
83
+ chainId
84
+ );
80
85
 
81
86
  // 3. Sign the digest
82
87
  // create a signature with the digest for the params