@openzeppelin/upgrades-core 1.32.0-alpha.0 → 1.32.1

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.
package/src/impl-store.ts CHANGED
@@ -72,12 +72,10 @@ async function fetchOrDeployGeneric<T extends Deployment, U extends T = T>(
72
72
  );
73
73
  if (updated !== stored) {
74
74
  if (merge && deployment.merge) {
75
- // only check primary addresses for clashes, since the address could already exist in an allAddresses field
76
- // but the above updated and stored objects are different instances representing the same entry
77
- await checkForAddressClash(provider, data, updated, false);
75
+ await checkForAddressClash(provider, data, updated, true);
78
76
  deployment.merge(updated);
79
77
  } else {
80
- await checkForAddressClash(provider, data, updated, true);
78
+ await checkForAddressClash(provider, data, updated, false);
81
79
  deployment.set(updated);
82
80
  }
83
81
  await manifest.write(data);
@@ -172,12 +170,17 @@ export async function fetchOrDeployGetDeployment<T extends ImplDeployment>(
172
170
  const implLens = (versionWithoutMetadata: string) =>
173
171
  lens(`implementation ${versionWithoutMetadata}`, 'implementation', data => ({
174
172
  get: () => data.impls[versionWithoutMetadata],
175
- set: (value?: ImplDeployment) => (data.impls[versionWithoutMetadata] = value),
176
- merge: (value?: ImplDeployment) => {
173
+ set: (value?: ImplDeployment & RemoteDeploymentId) => (data.impls[versionWithoutMetadata] = value),
174
+ merge: (value?: ImplDeployment & RemoteDeploymentId) => {
177
175
  const existing = data.impls[versionWithoutMetadata];
178
176
  if (existing !== undefined && value !== undefined) {
179
177
  const { address, allAddresses } = mergeAddresses(existing, value);
180
- data.impls[versionWithoutMetadata] = { ...existing, address, allAddresses };
178
+ data.impls[versionWithoutMetadata] = {
179
+ ...existing,
180
+ address,
181
+ allAddresses,
182
+ remoteDeploymentId: value.remoteDeploymentId,
183
+ };
181
184
  } else {
182
185
  data.impls[versionWithoutMetadata] = value;
183
186
  }
@@ -223,14 +226,23 @@ async function checkForAddressClash(
223
226
  provider: EthereumProvider,
224
227
  data: ManifestData,
225
228
  updated: Deployment & RemoteDeploymentId,
226
- checkAllAddresses: boolean,
229
+ merge: boolean,
227
230
  ): Promise<void> {
228
- const clash = lookupDeployment(data, updated.address, checkAllAddresses);
229
- if (clash !== undefined) {
230
- if (await isDevelopmentNetwork(provider)) {
231
+ let clash;
232
+ const findClash = () => lookupDeployment(data, updated.address, !merge);
233
+
234
+ if (await isDevelopmentNetwork(provider)) {
235
+ // Look for clashes so that we can delete deployments from older runs.
236
+ // `merge` only checks primary addresses for clashes, since the address could already exist in an allAddresses field
237
+ // but the updated and stored objects are different instances representing the same entry.
238
+ clash = findClash();
239
+ if (clash !== undefined) {
231
240
  debug('deleting a previous deployment at address', updated.address);
232
241
  clash.set(undefined);
233
- } else {
242
+ }
243
+ } else if (!merge) {
244
+ clash = findClash();
245
+ if (clash !== undefined) {
234
246
  const existing = clash.get();
235
247
  // it's a clash if there is no deployment id or if deployment ids don't match
236
248
  if (
@@ -238,13 +250,12 @@ async function checkForAddressClash(
238
250
  (existing.remoteDeploymentId === undefined || existing.remoteDeploymentId !== updated.remoteDeploymentId)
239
251
  ) {
240
252
  throw new Error(
241
- `The following deployment clashes with an existing one at ${updated.address}\n\n` +
242
- JSON.stringify(updated, null, 2) +
243
- `\n\n`,
253
+ `The deployment clashes with an existing one at ${updated.address}.\n\n` +
254
+ `Deployments: ${JSON.stringify({ existing, updated }, null, 2)}\n\n`,
244
255
  );
245
256
  }
246
257
  }
247
- }
258
+ } // else, merge indicates that the user is force-importing or redeploying an implementation, so we simply allow merging the entries
248
259
  }
249
260
 
250
261
  function lookupDeployment(