@zoralabs/protocol-deployments 0.0.11 → 0.0.13

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 +24 -26
  2. package/CHANGELOG.md +17 -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/tsconfig.json +1 -1
  17. package/tsup.config.ts +5 -5
  18. package/wagmi.config.ts +31 -9
  19. package/.env.anvil +0 -2
  20. package/addresses/1.json +0 -14
  21. package/addresses/10.json +0 -14
  22. package/addresses/11155111.json +0 -9
  23. package/addresses/420.json +0 -14
  24. package/addresses/424.json +0 -11
  25. package/addresses/5.json +0 -14
  26. package/addresses/58008.json +0 -11
  27. package/addresses/7777777.json +0 -15
  28. package/addresses/8453.json +0 -14
  29. package/addresses/84531.json +0 -14
  30. package/addresses/999.json +0 -15
  31. package/addresses/999999999.json +0 -14
  32. package/chainConfigs/1.json +0 -5
  33. package/chainConfigs/10.json +0 -5
  34. package/chainConfigs/11155111.json +0 -4
  35. package/chainConfigs/420.json +0 -5
  36. package/chainConfigs/424.json +0 -5
  37. package/chainConfigs/5.json +0 -5
  38. package/chainConfigs/58008.json +0 -4
  39. package/chainConfigs/7777777.json +0 -5
  40. package/chainConfigs/8453.json +0 -5
  41. package/chainConfigs/84531.json +0 -5
  42. package/chainConfigs/999.json +0 -5
  43. package/chainConfigs/999999999.json +0 -5
  44. package/deterministicConfig/factoryProxy/params.json +0 -10
  45. package/deterministicConfig/factoryProxy/signatures.json +0 -14
  46. package/deterministicConfig/premintExecutorProxy/params.json +0 -10
  47. package/deterministicConfig/premintExecutorProxy/signatures.json +0 -11
  48. package/deterministicConfig/upgradeGate/params.json +0 -7
  49. package/deterministicConfig/upgradeGate/signatures.json +0 -14
  50. package/dist/package/batchPublish.test.d.ts +0 -451
  51. package/dist/package/batchPublish.test.d.ts.map +0 -1
  52. package/dist/package/chainConfigs.d.ts.map +0 -1
  53. package/dist/package/deployment.d.ts.map +0 -1
  54. package/dist/package/index.d.ts.map +0 -1
  55. package/dist/script/copy-deployed-contracts.d.ts +0 -2
  56. package/dist/script/copy-deployed-contracts.d.ts.map +0 -1
  57. package/dist/script/signDeploymentTransactions.d.ts +0 -2
  58. package/dist/script/signDeploymentTransactions.d.ts.map +0 -1
  59. package/foundry.toml +0 -41
  60. package/package/batchPublish.test.ts +0 -327
  61. package/package/chainConfigs.ts +0 -60
  62. package/package/wagmiGenerated.ts +0 -3640
  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,277 +0,0 @@
1
- import { createAccount } from "@turnkey/viem";
2
- import { TurnkeyClient } from "@turnkey/http";
3
- import { Address, encodeFunctionData, parseAbi, LocalAccount, Hex } from "viem";
4
- import { ApiKeyStamper } from "@turnkey/api-key-stamper";
5
- import { glob } from "glob";
6
- import * as path from "path";
7
- import * as dotenv from "dotenv";
8
- import { writeFile, readFile } from "fs/promises";
9
- import {
10
- ConfiguredSalt,
11
- DeterministicDeploymentConfig,
12
- GenericDeploymentConfiguration,
13
- signDeployFactory,
14
- signGenericDeploy,
15
- } from "../package/deployment";
16
- import { fileURLToPath } from "url";
17
- import { dirname } from "path";
18
-
19
- const __filename = fileURLToPath(import.meta.url);
20
- const __dirname = dirname(__filename);
21
-
22
- // Load environment variables from `.env.local`
23
- dotenv.config({ path: path.resolve(__dirname, "../.env") });
24
-
25
- type ChainConfig = {
26
- chainId: number;
27
- implementationAddress: Address;
28
- owner: Address;
29
- };
30
-
31
- async function signAndSaveSignatures({
32
- turnkeyAccount,
33
- chainConfigs,
34
- proxyName,
35
- }: {
36
- turnkeyAccount: LocalAccount;
37
- chainConfigs: ChainConfig[];
38
- proxyName: "factoryProxy" | "premintExecutorProxy";
39
- }) {
40
- const configFolder = path.resolve(
41
- __dirname,
42
- `../deterministicConfig/${proxyName}/`
43
- );
44
- const configFile = path.join(configFolder, "params.json");
45
- const deterministicDeployConfig = JSON.parse(
46
- await readFile(configFile, "utf-8")
47
- );
48
-
49
- const deploymentConfig: DeterministicDeploymentConfig = {
50
- proxyDeployerAddress:
51
- deterministicDeployConfig.proxyDeployerAddress as Address,
52
- proxySalt: deterministicDeployConfig.proxySalt as ConfiguredSalt,
53
- proxyShimSalt: deterministicDeployConfig.proxyShimSalt as ConfiguredSalt,
54
- proxyCreationCode: deterministicDeployConfig.proxyCreationCode as Address,
55
- };
56
-
57
- const signedConfigs = await Promise.all(
58
- chainConfigs.map(async (chainConfig) => {
59
- return {
60
- chainId: chainConfig.chainId,
61
- signature: await signDeployFactory({
62
- account: turnkeyAccount,
63
- implementationAddress: chainConfig.implementationAddress,
64
- owner: chainConfig.owner,
65
- chainId: chainConfig.chainId,
66
- deterministicDeploymentConfig: deploymentConfig,
67
- }),
68
- };
69
- })
70
- );
71
-
72
- // aggregate above to object of key value pair indexed by chain id as number:
73
- const byChainId = signedConfigs.reduce((acc, { chainId, signature }) => {
74
- acc[chainId] = signature;
75
- return acc;
76
- }, {} as { [key: number]: string });
77
-
78
- // write as json to ../deterministicConfig/factoryDeploySignatures.json:
79
- await writeFile(
80
- path.join(configFolder, "signatures.json"),
81
- JSON.stringify(byChainId, null, 2)
82
- );
83
- }
84
-
85
- async function signAndSaveUpgradeGate({
86
- turnkeyAccount,
87
- chainConfigs,
88
- proxyName,
89
- }: {
90
- turnkeyAccount: LocalAccount;
91
- chainConfigs: {
92
- chainId: number;
93
- owner: Address;
94
- }[];
95
- proxyName: "upgradeGate";
96
- }) {
97
- const configFolder = path.resolve(
98
- __dirname,
99
- `../deterministicConfig/${proxyName}/`
100
- );
101
- const configFile = path.join(configFolder, "params.json");
102
- const deterministicDeployConfig = JSON.parse(
103
- await readFile(configFile, "utf-8")
104
- );
105
-
106
- const deploymentConfig: GenericDeploymentConfiguration = {
107
- creationCode: deterministicDeployConfig.creationCode! as Hex,
108
- salt: deterministicDeployConfig.salt! as Hex,
109
- deployerAddress: deterministicDeployConfig.deployerAddress! as Address,
110
- upgradeGateAddress:
111
- deterministicDeployConfig.upgradeGateAddress! as Address,
112
- proxyDeployerAddress:
113
- deterministicDeployConfig.proxyDeployerAddress! as Address,
114
- };
115
-
116
- const upgradeGateAbi = parseAbi([
117
- // ^? const abi: readonly [{ name: "balanceOf"; type: "function"; stateMutability:...
118
- "function initialize(address owner)",
119
- ]);
120
-
121
- const signedConfigs = await Promise.all(
122
- chainConfigs.map(async (chainConfig) => {
123
- const initCall = encodeFunctionData({
124
- abi: upgradeGateAbi,
125
- functionName: "initialize",
126
- args: [chainConfig.owner],
127
- });
128
-
129
- return {
130
- chainId: chainConfig.chainId,
131
- signature: await signGenericDeploy({
132
- account: turnkeyAccount,
133
- chainId: chainConfig.chainId,
134
- config: deploymentConfig,
135
- initCall,
136
- }),
137
- };
138
- })
139
- );
140
-
141
- // aggregate above to object of key value pair indexed by chain id as number:
142
- const byChainId = signedConfigs.reduce((acc, { chainId, signature }) => {
143
- acc[chainId] = signature;
144
- return acc;
145
- }, {} as { [key: number]: string });
146
-
147
- // write as json to ../deterministicConfig/factoryDeploySignatures.json:
148
- await writeFile(
149
- path.join(configFolder, "signatures.json"),
150
- JSON.stringify(byChainId, null, 2)
151
- );
152
- }
153
-
154
- const getChainConfigs = async () => {
155
- const chainConfigsFiles = await glob(
156
- path.resolve(__dirname, "../chainConfigs/*.json")
157
- );
158
-
159
- const chainConfigs = await Promise.all(
160
- chainConfigsFiles.map(async (chainConfigFile) => {
161
- const chainId = parseInt(path.basename(chainConfigFile).split(".")[0]!);
162
-
163
- // read file and process JSON contents:
164
- const fileContents = await import(chainConfigFile);
165
-
166
- return {
167
- chainId,
168
- owner: fileContents["FACTORY_OWNER"]! as Address,
169
- };
170
- })
171
- );
172
-
173
- return chainConfigs;
174
- };
175
-
176
- const getFactoryImplConfigs = async () => {
177
- const addresseFiles = await glob(
178
- path.resolve(__dirname, "../addresses/*.json")
179
- );
180
-
181
- const chainConfigs = await Promise.all(
182
- addresseFiles.map(async (addressConfigFile) => {
183
- const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]!);
184
-
185
- // read file and process JSON contents:
186
- const fileContents = await import(addressConfigFile);
187
-
188
- // read chain config file as json, which is located at: ../chainConfigs/${chainId}.json:
189
- const chainConfig = await import(
190
- path.resolve(__dirname, `../chainConfigs/${chainId}.json`)
191
- );
192
-
193
- return {
194
- chainId,
195
- implementationAddress: fileContents["FACTORY_IMPL"] as Address,
196
- owner: chainConfig["FACTORY_OWNER"] as Address,
197
- };
198
- })
199
- );
200
-
201
- return chainConfigs;
202
- };
203
-
204
- const getPreminterImplConfigs = async () => {
205
- const addresseFiles = await glob(
206
- path.resolve(__dirname, "../addresses/*.json")
207
- );
208
-
209
- const chainConfigs = await Promise.all(
210
- addresseFiles.map(async (addressConfigFile) => {
211
- const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]!);
212
-
213
- // read file and process JSON contents:
214
- const fileContents = await import(addressConfigFile);
215
-
216
- // read chain config file as json, which is located at: ../chainConfigs/${chainId}.json:
217
- const chainConfig = await import(
218
- path.resolve(__dirname, `../chainConfigs/${chainId}.json`)
219
- );
220
-
221
- return {
222
- chainId,
223
- implementationAddress: fileContents["PREMINTER_IMPL"] as Address,
224
- owner: chainConfig["FACTORY_OWNER"] as Address,
225
- };
226
- })
227
- );
228
-
229
- return chainConfigs.filter((x) => x.implementationAddress !== undefined);
230
- };
231
-
232
- async function main() {
233
- // Create a Turnkey HTTP client with API key credentials
234
- const httpClient = new TurnkeyClient(
235
- {
236
- baseUrl: "https://api.turnkey.com",
237
- },
238
- // This uses API key credentials.
239
- // If you're using passkeys, use `@turnkey/webauthn-stamper` to collect webauthn signatures:
240
- new ApiKeyStamper({
241
- apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY!,
242
- apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY!,
243
- })
244
- );
245
-
246
- // Create the Viem custom account
247
- const turnkeyAccount = await createAccount({
248
- client: httpClient,
249
- organizationId: process.env.TURNKEY_ORGANIZATION_ID!,
250
- privateKeyId: process.env.TURNKEY_PRIVATE_KEY_ID!,
251
- // optional; will be fetched from Turnkey if not provided
252
- ethereumAddress: process.env.TURNKEY_TARGET_ADDRESS!,
253
- });
254
-
255
- await signAndSaveSignatures({
256
- turnkeyAccount,
257
- chainConfigs: await getFactoryImplConfigs(),
258
- proxyName: "factoryProxy",
259
- });
260
-
261
- await signAndSaveSignatures({
262
- turnkeyAccount,
263
- chainConfigs: await getPreminterImplConfigs(),
264
- proxyName: "premintExecutorProxy",
265
- });
266
-
267
- await signAndSaveUpgradeGate({
268
- turnkeyAccount,
269
- chainConfigs: await getChainConfigs(),
270
- proxyName: "upgradeGate",
271
- });
272
- }
273
-
274
- main().catch((error) => {
275
- console.error(error);
276
- process.exit(1);
277
- });
@@ -1,124 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.17;
3
-
4
- import "forge-std/Test.sol";
5
- import {CommonBase} from "forge-std/Base.sol";
6
- import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
7
- import {Script} from "forge-std/Script.sol";
8
-
9
- /// @notice Chain configuration for constants set manually during deploy. Does not get written to after deploys.
10
- struct ChainConfig {
11
- /// @notice The user that owns the factory proxy. Allows ability to upgrade for new implementations deployed.
12
- address factoryOwner;
13
- /// @notice Mint fee recipient user
14
- address mintFeeRecipient;
15
- /// @notice Protocol rewards contract address
16
- address protocolRewards;
17
- }
18
-
19
- /// @notice Deployment addresses – set to new deployed addresses by the scripts.
20
- struct Deployment {
21
- /// @notice Fixed price minter strategy configuration contract
22
- address fixedPriceSaleStrategy;
23
- /// @notice Merkle minter strategy (formerly presale) configuration
24
- address merkleMintSaleStrategy;
25
- /// @notice Redeem minter factory contract for redeem sales configurations
26
- address redeemMinterFactory;
27
- /// @notice Implementation contract for the 1155 contract
28
- address contract1155Impl;
29
- /// @notice Implementation contract version for the 1155 contract
30
- string contract1155ImplVersion;
31
- /// @notice Factory implementation contract that is the impl for the above proxy.
32
- address factoryImpl;
33
- /// @notice Factory proxy contract that creates zora drops style NFT contracts
34
- address factoryProxy;
35
- /// @notice Preminter proxy contract address
36
- address preminterImpl;
37
- /// @notice Preminter implementation contract address
38
- address preminterProxy;
39
- /// @notice Upgrade gate
40
- address upgradeGate;
41
- }
42
-
43
- abstract contract DeploymentConfig is Script {
44
- using stdJson for string;
45
-
46
- /// @notice ChainID convenience getter
47
- /// @return id chainId
48
- function chainId() internal view virtual returns (uint256 id);
49
-
50
- ///
51
- // These are the JSON key constants to standardize writing and reading configuration
52
- ///
53
-
54
- string constant FACTORY_OWNER = "FACTORY_OWNER";
55
- string constant MINT_FEE_RECIPIENT = "MINT_FEE_RECIPIENT";
56
- string constant PROTOCOL_REWARDS = "PROTOCOL_REWARDS";
57
-
58
- string constant FIXED_PRICE_SALE_STRATEGY = "FIXED_PRICE_SALE_STRATEGY";
59
- string constant MERKLE_MINT_SALE_STRATEGY = "MERKLE_MINT_SALE_STRATEGY";
60
- string constant REDEEM_MINTER_FACTORY = "REDEEM_MINTER_FACTORY";
61
- string constant CONTRACT_1155_IMPL = "CONTRACT_1155_IMPL";
62
- string constant CONTRACT_1155_IMPL_VERSION = "CONTRACT_1155_IMPL_VERSION";
63
- string constant FACTORY_IMPL = "FACTORY_IMPL";
64
- string constant FACTORY_PROXY = "FACTORY_PROXY";
65
- string constant PREMINTER_PROXY = "PREMINTER_PROXY";
66
- string constant PREMINTER_IMPL = "PREMINTER_IMPL";
67
- string constant UPGRADE_GATE = "UPGRADE_GATE";
68
-
69
- /// @notice Return a prefixed key for reading with a ".".
70
- /// @param key key to prefix
71
- /// @return prefixed key
72
- function getKeyPrefix(string memory key) internal pure returns (string memory) {
73
- return string.concat(".", key);
74
- }
75
-
76
- /// @notice Returns the chain configuration struct from the JSON configuration file
77
- /// @return chainConfig structure
78
- function getChainConfig() internal view returns (ChainConfig memory chainConfig) {
79
- string memory json = vm.readFile(string.concat("chainConfigs/", Strings.toString(chainId()), ".json"));
80
- chainConfig.factoryOwner = json.readAddress(getKeyPrefix(FACTORY_OWNER));
81
- chainConfig.mintFeeRecipient = json.readAddress(getKeyPrefix(MINT_FEE_RECIPIENT));
82
- chainConfig.protocolRewards = json.readAddress(getKeyPrefix(PROTOCOL_REWARDS));
83
- }
84
-
85
- function readAddressOrDefaultToZero(string memory json, string memory key) internal view returns (address addr) {
86
- string memory keyPrefix = getKeyPrefix(key);
87
-
88
- if (vm.keyExists(json, keyPrefix)) {
89
- addr = json.readAddress(keyPrefix);
90
- } else {
91
- addr = address(0);
92
- }
93
- }
94
-
95
- /// @notice Get the deployment configuration struct from the JSON configuration file
96
- /// @return deployment deployment configuration structure
97
- function getDeployment() internal view returns (Deployment memory deployment) {
98
- string memory json = vm.readFile(string.concat("addresses/", Strings.toString(chainId()), ".json"));
99
- deployment.fixedPriceSaleStrategy = readAddressOrDefaultToZero(json, FIXED_PRICE_SALE_STRATEGY);
100
- deployment.merkleMintSaleStrategy = readAddressOrDefaultToZero(json, MERKLE_MINT_SALE_STRATEGY);
101
- deployment.redeemMinterFactory = readAddressOrDefaultToZero(json, REDEEM_MINTER_FACTORY);
102
- deployment.contract1155Impl = readAddressOrDefaultToZero(json, CONTRACT_1155_IMPL);
103
- deployment.contract1155ImplVersion = json.readString(getKeyPrefix(CONTRACT_1155_IMPL_VERSION));
104
- deployment.factoryImpl = readAddressOrDefaultToZero(json, FACTORY_IMPL);
105
- deployment.factoryProxy = readAddressOrDefaultToZero(json, FACTORY_PROXY);
106
- deployment.preminterImpl = readAddressOrDefaultToZero(json, PREMINTER_IMPL);
107
- deployment.preminterProxy = readAddressOrDefaultToZero(json, PREMINTER_PROXY);
108
- deployment.upgradeGate = readAddressOrDefaultToZero(json, UPGRADE_GATE);
109
- }
110
- }
111
-
112
- contract ForkDeploymentConfig is DeploymentConfig {
113
- function chainId() internal view override returns (uint256 id) {
114
- return block.chainid;
115
- }
116
- }
117
-
118
- contract ScriptDeploymentConfig is DeploymentConfig {
119
- function chainId() internal view override returns (uint256 id) {
120
- assembly {
121
- id := chainid()
122
- }
123
- }
124
- }
@@ -1,166 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.13;
3
-
4
- import "forge-std/Script.sol";
5
- import {IMinter1155} from "@zoralabs/zora-1155-contracts/src/interfaces/IMinter1155.sol";
6
- import {IZoraCreator1155PremintExecutor} from "@zoralabs/zora-1155-contracts/src/interfaces/IZoraCreator1155PremintExecutor.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 {ZoraCreator1155Attribution, ContractCreationConfig, PremintConfigV2, TokenCreationConfigV2, PremintConfig, TokenCreationConfig} from "@zoralabs/zora-1155-contracts/src/delegation/ZoraCreator1155Attribution.sol";
10
- import {ScriptDeploymentConfig} from "./DeploymentConfig.sol";
11
- import {ZoraCreator1155Impl} from "@zoralabs/zora-1155-contracts/src/nft/ZoraCreator1155Impl.sol";
12
-
13
- contract DeploymentTestingUtils is Script {
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
- {
26
- (address creator, uint256 creatorPrivateKey) = makeAddrAndKey("creator");
27
- preminterAtProxy = IZoraCreator1155PremintExecutor(premintExecutorProxyAddress);
28
-
29
- premintConfig = PremintConfig({
30
- tokenConfig: TokenCreationConfig({
31
- tokenURI: "blah.token",
32
- maxSupply: 10,
33
- maxTokensPerAddress: 5,
34
- pricePerToken: 0,
35
- mintStart: 0,
36
- mintDuration: 0,
37
- royaltyMintSchedule: 0,
38
- royaltyBPS: 100,
39
- royaltyRecipient: payoutRecipient,
40
- fixedPriceMinter: address(ZoraCreator1155FactoryImpl(address(preminterAtProxy.zora1155Factory())).fixedPriceMinter())
41
- }),
42
- uid: 101,
43
- version: 0,
44
- deleted: false
45
- });
46
-
47
- // now interface with proxy preminter - sign and execute the premint
48
- contractConfig = ContractCreationConfig({contractAdmin: creator, contractName: "blahb", contractURI: "blah.contract"});
49
- address deterministicAddress = preminterAtProxy.getContractAddress(contractConfig);
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
-
66
- uint256 quantityToMint = 1;
67
-
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(payable(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);
94
-
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
111
- });
112
-
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
- }
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;
133
- // execute the premint
134
- uint256 tokenId = preminterAtProxy
135
- .premintV2{value: mintFee(quantityToMint)}(contractConfig, premintConfig, signature, quantityToMint, mintArguments).tokenId;
136
-
137
- require(
138
- ZoraCreator1155Impl(payable(preminterAtProxy.getContractAddress(contractConfig))).delegatedTokenId(premintConfig.uid) == tokenId,
139
- "token id not created for uid"
140
- );
141
- }
142
-
143
- function signPremint(PremintConfigV2 memory premintConfig, address deterministicAddress, uint256 privateKey) private view returns (bytes memory signature) {
144
- bytes32 signatureVersion = ZoraCreator1155Attribution.HASHED_VERSION_2;
145
- bytes32 structHash = ZoraCreator1155Attribution.hashPremint(premintConfig);
146
- // sign the premint
147
- bytes32 digest = ZoraCreator1155Attribution.premintHashedTypeDataV4(structHash, deterministicAddress, signatureVersion, block.chainid);
148
-
149
- (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, digest);
150
- return abi.encodePacked(r, s, v);
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
- }
166
- }