@openzeppelin/upgrades-core 1.20.2 → 1.20.4

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 (34) hide show
  1. package/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
  2. package/artifacts/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol/BeaconProxy.dbg.json +1 -1
  3. package/artifacts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
  4. package/artifacts/build-info.json +10 -10
  5. package/dist/manifest-storage-layout.test.js +6 -6
  6. package/dist/manifest-storage-layout.test.js.map +1 -1
  7. package/dist/standalone.test.js +6 -0
  8. package/dist/standalone.test.js.map +1 -1
  9. package/dist/storage/compare.d.ts.map +1 -1
  10. package/dist/storage/compare.js +5 -1
  11. package/dist/storage/compare.js.map +1 -1
  12. package/dist/storage-0.8.test.js +9 -13
  13. package/dist/storage-0.8.test.js.map +1 -1
  14. package/dist/validate/data.d.ts +1 -1
  15. package/dist/validate/data.d.ts.map +1 -1
  16. package/dist/validate/data.js +1 -1
  17. package/dist/validate/query.d.ts +16 -1
  18. package/dist/validate/query.d.ts.map +1 -1
  19. package/dist/validate/query.js +49 -22
  20. package/dist/validate/query.js.map +1 -1
  21. package/dist/validate/run.d.ts.map +1 -1
  22. package/dist/validate/run.js +17 -13
  23. package/dist/validate/run.js.map +1 -1
  24. package/dist/validate.test.js +8 -0
  25. package/dist/validate.test.js.map +1 -1
  26. package/package.json +3 -3
  27. package/src/manifest-storage-layout.test.ts +8 -6
  28. package/src/standalone.test.ts +11 -0
  29. package/src/storage/compare.ts +9 -1
  30. package/src/storage-0.8.test.ts +10 -13
  31. package/src/validate/data.ts +2 -2
  32. package/src/validate/query.ts +51 -22
  33. package/src/validate/run.ts +19 -13
  34. package/src/validate.test.ts +13 -0
@@ -114,6 +114,10 @@ function skipCheck(error: string, node: Node): boolean {
114
114
  return getAllowed(node).includes(error);
115
115
  }
116
116
 
117
+ function getFullyQualifiedName(source: string, contractName: string) {
118
+ return `${source}:${contractName}`;
119
+ }
120
+
117
121
  export function validate(solcOutput: SolcOutput, decodeSrc: SrcDecoder, solcVersion?: string): ValidationRunData {
118
122
  const validation: ValidationRunData = {};
119
123
  const fromId: Record<number, string> = {};
@@ -128,7 +132,7 @@ export function validate(solcOutput: SolcOutput, decodeSrc: SrcDecoder, solcVers
128
132
  const version = bytecode.object === '' ? undefined : getVersion(bytecode.object);
129
133
  const linkReferences = extractLinkReferences(bytecode);
130
134
 
131
- validation[contractName] = {
135
+ validation[getFullyQualifiedName(source, contractName)] = {
132
136
  src: contractName,
133
137
  version,
134
138
  inherit: [],
@@ -145,17 +149,19 @@ export function validate(solcOutput: SolcOutput, decodeSrc: SrcDecoder, solcVers
145
149
  }
146
150
 
147
151
  for (const contractDef of findAll('ContractDefinition', solcOutput.sources[source].ast)) {
148
- fromId[contractDef.id] = contractDef.name;
152
+ const key = getFullyQualifiedName(source, contractDef.name);
153
+
154
+ fromId[contractDef.id] = key;
149
155
 
150
156
  // May be undefined in case of duplicate contract names in Truffle
151
157
  const bytecode = solcOutput.contracts[source][contractDef.name]?.evm.bytecode;
152
158
 
153
- if (contractDef.name in validation && bytecode !== undefined) {
154
- inheritIds[contractDef.name] = contractDef.linearizedBaseContracts.slice(1);
155
- libraryIds[contractDef.name] = getReferencedLibraryIds(contractDef);
159
+ if (key in validation && bytecode !== undefined) {
160
+ inheritIds[key] = contractDef.linearizedBaseContracts.slice(1);
161
+ libraryIds[key] = getReferencedLibraryIds(contractDef);
156
162
 
157
- validation[contractDef.name].src = decodeSrc(contractDef);
158
- validation[contractDef.name].errors = [
163
+ validation[key].src = decodeSrc(contractDef);
164
+ validation[key].errors = [
159
165
  ...getConstructorErrors(contractDef, decodeSrc),
160
166
  ...getOpcodeErrors(contractDef, decodeSrc),
161
167
  ...getStateVariableErrors(contractDef, decodeSrc),
@@ -164,25 +170,25 @@ export function validate(solcOutput: SolcOutput, decodeSrc: SrcDecoder, solcVers
164
170
  ...getLinkingErrors(contractDef, bytecode),
165
171
  ];
166
172
 
167
- validation[contractDef.name].layout = extractStorageLayout(
173
+ validation[key].layout = extractStorageLayout(
168
174
  contractDef,
169
175
  decodeSrc,
170
176
  deref,
171
177
  solcOutput.contracts[source][contractDef.name].storageLayout,
172
178
  );
173
- validation[contractDef.name].methods = [...findAll('FunctionDefinition', contractDef)]
179
+ validation[key].methods = [...findAll('FunctionDefinition', contractDef)]
174
180
  .filter(fnDef => ['external', 'public'].includes(fnDef.visibility))
175
181
  .map(fnDef => getFunctionSignature(fnDef, deref));
176
182
  }
177
183
  }
178
184
  }
179
185
 
180
- for (const contractName in inheritIds) {
181
- validation[contractName].inherit = inheritIds[contractName].map(id => fromId[id]);
186
+ for (const key in inheritIds) {
187
+ validation[key].inherit = inheritIds[key].map(id => fromId[id]);
182
188
  }
183
189
 
184
- for (const contractName in libraryIds) {
185
- validation[contractName].libraries = libraryIds[contractName].map(id => fromId[id]);
190
+ for (const key in libraryIds) {
191
+ validation[key].libraries = libraryIds[key].map(id => fromId[id]);
186
192
  }
187
193
 
188
194
  return validation;
@@ -133,3 +133,16 @@ testValid('UsesExplicitSafeExternalLibraryNatspec', 'transparent', true);
133
133
  testValid('UsesExplicitUnsafeInternalLibraryNatspec', 'transparent', true);
134
134
  testValid('UsesExplicitUnsafeExternalLibraryNatspec', 'transparent', true);
135
135
  testValid('TransitiveLibraryIsUnsafe', 'transparent', false);
136
+
137
+ testValid('contracts/test/ValidationsSameNameSafe.sol:SameName', 'transparent', true);
138
+ testValid('contracts/test/ValidationsSameNameUnsafe.sol:SameName', 'transparent', false);
139
+
140
+ test('ambiguous name', t => {
141
+ const error = t.throws(() => getContractVersion(t.context.validation, 'SameName'));
142
+ t.is(
143
+ error?.message,
144
+ 'Contract SameName is ambiguous. Use one of the following:\n' +
145
+ 'contracts/test/ValidationsSameNameSafe.sol:SameName\n' +
146
+ 'contracts/test/ValidationsSameNameUnsafe.sol:SameName',
147
+ );
148
+ });