@zoralabs/protocol-deployments 0.0.11 → 0.0.12

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 (38) hide show
  1. package/.turbo/turbo-build.log +14 -15
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +1 -1
  4. package/addresses/1.json +5 -6
  5. package/addresses/10.json +5 -6
  6. package/addresses/11155111.json +11 -7
  7. package/addresses/420.json +6 -7
  8. package/addresses/5.json +6 -6
  9. package/addresses/7777777.json +5 -7
  10. package/addresses/8453.json +5 -6
  11. package/addresses/84531.json +7 -7
  12. package/addresses/999.json +6 -8
  13. package/addresses/999999999.json +6 -6
  14. package/chainConfigs/11155111.json +3 -2
  15. package/deterministicConfig/factoryProxy/signatures.json +1 -1
  16. package/deterministicConfig/premintExecutorProxy/signatures.json +1 -0
  17. package/deterministicConfig/upgradeGate/signatures.json +1 -1
  18. package/dist/index.cjs +42 -66
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +42 -66
  21. package/dist/index.js.map +1 -1
  22. package/dist/package/batchPublish.test.d.ts +19 -18
  23. package/dist/package/batchPublish.test.d.ts.map +1 -1
  24. package/dist/package/chainConfigs.d.ts +1 -0
  25. package/dist/package/chainConfigs.d.ts.map +1 -1
  26. package/dist/package/wagmiGenerated.d.ts +64 -48
  27. package/dist/package/wagmiGenerated.d.ts.map +1 -1
  28. package/foundry.toml +6 -6
  29. package/package/batchPublish.test.ts +4 -4
  30. package/package/wagmiGenerated.ts +59 -42
  31. package/package.json +21 -21
  32. package/remappings.txt +9 -9
  33. package/script/DeployMintersAndImplementations.s.sol +0 -2
  34. package/script/copy-deployed-contracts.ts +38 -18
  35. package/script/signDeploymentTransactions.ts +83 -58
  36. package/src/ZoraDeployerBase.sol +0 -1
  37. package/wagmi.config.ts +1 -1
  38. package/package/chainConfigs.ts +0 -60
@@ -32,18 +32,20 @@ async function signAndSaveSignatures({
32
32
  turnkeyAccount,
33
33
  chainConfigs,
34
34
  proxyName,
35
+ chainId,
35
36
  }: {
36
37
  turnkeyAccount: LocalAccount;
37
38
  chainConfigs: ChainConfig[];
38
39
  proxyName: "factoryProxy" | "premintExecutorProxy";
40
+ chainId: number;
39
41
  }) {
40
42
  const configFolder = path.resolve(
41
43
  __dirname,
42
- `../deterministicConfig/${proxyName}/`
44
+ `../deterministicConfig/${proxyName}/`,
43
45
  );
44
46
  const configFile = path.join(configFolder, "params.json");
45
47
  const deterministicDeployConfig = JSON.parse(
46
- await readFile(configFile, "utf-8")
48
+ await readFile(configFile, "utf-8"),
47
49
  );
48
50
 
49
51
  const deploymentConfig: DeterministicDeploymentConfig = {
@@ -54,31 +56,34 @@ async function signAndSaveSignatures({
54
56
  proxyCreationCode: deterministicDeployConfig.proxyCreationCode as Address,
55
57
  };
56
58
 
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
- })
59
+ const chainConfig = chainConfigs.find((x) => x.chainId === chainId);
60
+
61
+ if (!chainConfig) {
62
+ return;
63
+ }
64
+
65
+ const signature = await signDeployFactory({
66
+ account: turnkeyAccount,
67
+ implementationAddress: chainConfig.implementationAddress,
68
+ owner: chainConfig.owner,
69
+ chainId: chainConfig.chainId,
70
+ deterministicDeploymentConfig: deploymentConfig,
71
+ });
72
+
73
+ const existingSignatures = JSON.parse(
74
+ await readFile(path.join(configFolder, "signatures.json"), "utf-8"),
70
75
  );
71
76
 
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
+ const updated = {
78
+ ...existingSignatures,
79
+ [chainId]: signature,
80
+ };
77
81
 
82
+ // aggregate above to object of key value pair indexed by chain id as number:
78
83
  // write as json to ../deterministicConfig/factoryDeploySignatures.json:
79
84
  await writeFile(
80
85
  path.join(configFolder, "signatures.json"),
81
- JSON.stringify(byChainId, null, 2)
86
+ JSON.stringify(updated, null, 2),
82
87
  );
83
88
  }
84
89
 
@@ -86,6 +91,7 @@ async function signAndSaveUpgradeGate({
86
91
  turnkeyAccount,
87
92
  chainConfigs,
88
93
  proxyName,
94
+ chainId,
89
95
  }: {
90
96
  turnkeyAccount: LocalAccount;
91
97
  chainConfigs: {
@@ -93,14 +99,16 @@ async function signAndSaveUpgradeGate({
93
99
  owner: Address;
94
100
  }[];
95
101
  proxyName: "upgradeGate";
102
+ chainId: number;
96
103
  }) {
97
104
  const configFolder = path.resolve(
98
105
  __dirname,
99
- `../deterministicConfig/${proxyName}/`
106
+ `../deterministicConfig/${proxyName}/`,
100
107
  );
101
108
  const configFile = path.join(configFolder, "params.json");
109
+
102
110
  const deterministicDeployConfig = JSON.parse(
103
- await readFile(configFile, "utf-8")
111
+ await readFile(configFile, "utf-8"),
104
112
  );
105
113
 
106
114
  const deploymentConfig: GenericDeploymentConfiguration = {
@@ -113,47 +121,48 @@ async function signAndSaveUpgradeGate({
113
121
  deterministicDeployConfig.proxyDeployerAddress! as Address,
114
122
  };
115
123
 
116
- const upgradeGateAbi = parseAbi([
117
- // ^? const abi: readonly [{ name: "balanceOf"; type: "function"; stateMutability:...
118
- "function initialize(address owner)",
119
- ]);
124
+ const upgradeGateAbi = parseAbi(["function initialize(address owner)"]);
120
125
 
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
- });
126
+ const chainConfig = chainConfigs.find((x) => x.chainId === chainId);
128
127
 
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
- })
128
+ if (!chainConfig) {
129
+ throw new Error(`No chain config found for chain id ${chainId}`);
130
+ }
131
+
132
+ const initCall = encodeFunctionData({
133
+ abi: upgradeGateAbi,
134
+ functionName: "initialize",
135
+ args: [chainConfig.owner],
136
+ });
137
+
138
+ console.log("signing", { turnkeyAccount, deploymentConfig });
139
+
140
+ const signature = await signGenericDeploy({
141
+ account: turnkeyAccount,
142
+ chainId: chainConfig.chainId,
143
+ config: deploymentConfig,
144
+ initCall,
145
+ });
146
+
147
+ const existingSignatures = JSON.parse(
148
+ await readFile(path.join(configFolder, "signatures.json"), "utf-8"),
139
149
  );
140
150
 
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 });
151
+ const updated = {
152
+ ...existingSignatures,
153
+ [chainId]: signature,
154
+ };
146
155
 
147
156
  // write as json to ../deterministicConfig/factoryDeploySignatures.json:
148
157
  await writeFile(
149
158
  path.join(configFolder, "signatures.json"),
150
- JSON.stringify(byChainId, null, 2)
159
+ JSON.stringify(updated, null, 2),
151
160
  );
152
161
  }
153
162
 
154
163
  const getChainConfigs = async () => {
155
164
  const chainConfigsFiles = await glob(
156
- path.resolve(__dirname, "../chainConfigs/*.json")
165
+ path.resolve(__dirname, "../chainConfigs/*.json"),
157
166
  );
158
167
 
159
168
  const chainConfigs = await Promise.all(
@@ -167,7 +176,7 @@ const getChainConfigs = async () => {
167
176
  chainId,
168
177
  owner: fileContents["FACTORY_OWNER"]! as Address,
169
178
  };
170
- })
179
+ }),
171
180
  );
172
181
 
173
182
  return chainConfigs;
@@ -175,7 +184,7 @@ const getChainConfigs = async () => {
175
184
 
176
185
  const getFactoryImplConfigs = async () => {
177
186
  const addresseFiles = await glob(
178
- path.resolve(__dirname, "../addresses/*.json")
187
+ path.resolve(__dirname, "../addresses/*.json"),
179
188
  );
180
189
 
181
190
  const chainConfigs = await Promise.all(
@@ -195,7 +204,7 @@ const getFactoryImplConfigs = async () => {
195
204
  implementationAddress: fileContents["FACTORY_IMPL"] as Address,
196
205
  owner: chainConfig["FACTORY_OWNER"] as Address,
197
206
  };
198
- })
207
+ }),
199
208
  );
200
209
 
201
210
  return chainConfigs;
@@ -203,7 +212,7 @@ const getFactoryImplConfigs = async () => {
203
212
 
204
213
  const getPreminterImplConfigs = async () => {
205
214
  const addresseFiles = await glob(
206
- path.resolve(__dirname, "../addresses/*.json")
215
+ path.resolve(__dirname, "../addresses/*.json"),
207
216
  );
208
217
 
209
218
  const chainConfigs = await Promise.all(
@@ -223,12 +232,23 @@ const getPreminterImplConfigs = async () => {
223
232
  implementationAddress: fileContents["PREMINTER_IMPL"] as Address,
224
233
  owner: chainConfig["FACTORY_OWNER"] as Address,
225
234
  };
226
- })
235
+ }),
227
236
  );
228
237
 
229
238
  return chainConfigs.filter((x) => x.implementationAddress !== undefined);
230
239
  };
231
240
 
241
+ function getChainIdPositionalArg() {
242
+ // parse chain id as first argument:
243
+ const chainIdArg = process.argv[2];
244
+
245
+ if (!chainIdArg) {
246
+ throw new Error("Must provide chain id as first argument");
247
+ }
248
+
249
+ return parseInt(chainIdArg);
250
+ }
251
+
232
252
  async function main() {
233
253
  // Create a Turnkey HTTP client with API key credentials
234
254
  const httpClient = new TurnkeyClient(
@@ -240,34 +260,39 @@ async function main() {
240
260
  new ApiKeyStamper({
241
261
  apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY!,
242
262
  apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY!,
243
- })
263
+ }),
244
264
  );
245
265
 
246
266
  // Create the Viem custom account
247
267
  const turnkeyAccount = await createAccount({
248
268
  client: httpClient,
249
269
  organizationId: process.env.TURNKEY_ORGANIZATION_ID!,
250
- privateKeyId: process.env.TURNKEY_PRIVATE_KEY_ID!,
270
+ signWith: process.env.TURNKEY_PRIVATE_KEY_ID!,
251
271
  // optional; will be fetched from Turnkey if not provided
252
272
  ethereumAddress: process.env.TURNKEY_TARGET_ADDRESS!,
253
273
  });
254
274
 
275
+ const chainId = getChainIdPositionalArg();
276
+
255
277
  await signAndSaveSignatures({
256
278
  turnkeyAccount,
257
279
  chainConfigs: await getFactoryImplConfigs(),
258
280
  proxyName: "factoryProxy",
281
+ chainId,
259
282
  });
260
283
 
261
284
  await signAndSaveSignatures({
262
285
  turnkeyAccount,
263
286
  chainConfigs: await getPreminterImplConfigs(),
264
287
  proxyName: "premintExecutorProxy",
288
+ chainId,
265
289
  });
266
290
 
267
291
  await signAndSaveUpgradeGate({
268
292
  turnkeyAccount,
269
293
  chainConfigs: await getChainConfigs(),
270
294
  proxyName: "upgradeGate",
295
+ chainId,
271
296
  });
272
297
  }
273
298
 
@@ -37,7 +37,6 @@ abstract contract ZoraDeployerBase is DeploymentTestingUtils, ScriptDeploymentCo
37
37
  vm.serializeAddress(deploymentJsonKey, PREMINTER_IMPL, deployment.preminterImpl);
38
38
  vm.serializeAddress(deploymentJsonKey, UPGRADE_GATE, deployment.upgradeGate);
39
39
  deploymentJson = vm.serializeAddress(deploymentJsonKey, FACTORY_PROXY, deployment.factoryProxy);
40
- console2.log(deploymentJson);
41
40
  }
42
41
 
43
42
  function deployMinters(Deployment memory deployment) internal {
package/wagmi.config.ts CHANGED
@@ -43,7 +43,7 @@ const getAddresses = () => {
43
43
 
44
44
  for (const addressesFile of addressesFiles) {
45
45
  const jsonAddress = JSON.parse(
46
- readFileSync(`./addresses/${addressesFile}`, "utf-8")
46
+ readFileSync(`./addresses/${addressesFile}`, "utf-8"),
47
47
  ) as {
48
48
  FIXED_PRICE_SALE_STRATEGY: Address;
49
49
  MERKLE_MINT_SALE_STRATEGY: Address;
@@ -1,60 +0,0 @@
1
- export const chainConfigs = {
2
- [1]: {
3
- FACTORY_OWNER: "0xDB392f4391462d60B8B4413ef72018Ab595Af9D0",
4
- MINT_FEE_RECIPIENT: "0xd1d1D4e36117aB794ec5d4c78cBD3a8904E691D0",
5
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
6
- },
7
- [10]: {
8
- FACTORY_OWNER: "0x4c7f7b6067fac9a737ecf2ca1a733fc85dd65a2b",
9
- MINT_FEE_RECIPIENT: "0x7A810DCd0f8d83B20212326813Db6EF7E9FD030c",
10
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
11
- },
12
- [11155111]: {
13
- FACTORY_OWNER: "0xE51051a204afb2fC071A2406914cdEA5638e5018",
14
- MINT_FEE_RECIPIENT: "0xE51051a204afb2fC071A2406914cdEA5638e5018",
15
- },
16
- [420]: {
17
- FACTORY_OWNER: "0xbb45052B2260707655Dfd916a416264f5981192c",
18
- MINT_FEE_RECIPIENT: "0x5dEe21327CD7CD6725C2578DA1c3E5bb2D2D34b2",
19
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
20
- },
21
- [424]: {
22
- FACTORY_OWNER: "0x8fbC66d36cceB3Ad69B4d672756da54CcFec1cD2",
23
- MINT_FEE_RECIPIENT: "0x95FD5d77B206cCc0B1f7D7A4077fbE8eb4fC31eF",
24
- PROTOCOL_REWARDS: "0x7777777A456fF23D9b6851184472c08FBDa73e32",
25
- },
26
- [5]: {
27
- FACTORY_OWNER: "0xDC498668B5e6CC518fD58A2ADBF614Fd3A13D3a0",
28
- MINT_FEE_RECIPIENT: "0x9444390c01Dd5b7249E53FAc31290F7dFF53450D",
29
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
30
- },
31
- [58008]: {
32
- FACTORY_OWNER: "0xfAe426B462f4Bc9857ED28D8473Fb85192f23E9b",
33
- MINT_FEE_RECIPIENT: "0x917D86f1eBD1d9f59Dae1C00e5Af7f8689299EC4",
34
- },
35
- [7777777]: {
36
- FACTORY_OWNER: "0xdEA20c96253dc2d64897D2b8d27A8d935dE74955",
37
- MINT_FEE_RECIPIENT: "0xEcfc2ee50409E459c554a2b0376F882Ce916D853",
38
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
39
- },
40
- [8453]: {
41
- FACTORY_OWNER: "0x004d6611884B4A661749B64b2ADc78505c3e1AB3",
42
- MINT_FEE_RECIPIENT: "0x7bf90111Ad7C22bec9E9dFf8A01A44713CC1b1B6",
43
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
44
- },
45
- [84531]: {
46
- FACTORY_OWNER: "0x02539E813cA450C2c7334e885423f4A899a063Fe",
47
- MINT_FEE_RECIPIENT: "0x02539E813cA450C2c7334e885423f4A899a063Fe",
48
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
49
- },
50
- [999]: {
51
- FACTORY_OWNER: "0xE84DBB2B25F761751231a9D0DAfbdD4dC3aa8252",
52
- MINT_FEE_RECIPIENT: "0xE84DBB2B25F761751231a9D0DAfbdD4dC3aa8252",
53
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
54
- },
55
- [999999999]: {
56
- FACTORY_OWNER: "0xdae22ce69Afcb7f4bc37D32E267645722949DE0E",
57
- MINT_FEE_RECIPIENT: "0xdae22ce69Afcb7f4bc37D32E267645722949DE0E",
58
- PROTOCOL_REWARDS: "0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B",
59
- },
60
- };