Skip to content

Commit 696e20f

Browse files
authored
Fix ASTDereferencerError when validating initializers (#1118)
1 parent 19b866c commit 696e20f

File tree

5 files changed

+29
-4
lines changed

5 files changed

+29
-4
lines changed

packages/core/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 1.42.1 (2025-01-24)
4+
5+
- Fix `ASTDereferencerError` when validating initializers.
6+
37
## 1.42.0 (2025-01-23)
48

59
- Update dependencies. ([#1096](https://github.com/OpenZeppelin/openzeppelin-upgrades/pull/1096))

packages/core/contracts/test/ValidationsInitializer.sol

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,21 @@ contract InitializationOrder_UnsafeAllowDuplicate_But_WrongOrder is A, B, C, Par
263263
}
264264
}
265265

266+
contract WithRequire_Ok is Parent__OnlyInitializingModifier {
267+
uint y;
268+
function initialize(bool foo) initializer public {
269+
require(foo, "foo should be true");
270+
__Parent_init();
271+
}
272+
}
273+
274+
contract WithRequire_Bad is Parent__OnlyInitializingModifier {
275+
uint y;
276+
function initialize(bool foo) initializer public {
277+
require(foo, "foo should be true");
278+
}
279+
}
280+
266281
// ==== Initializer visibility ====
267282

268283
abstract contract Parent_Private is Initializable {

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@openzeppelin/upgrades-core",
3-
"version": "1.42.0",
3+
"version": "1.42.1",
44
"description": "",
55
"repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/core",
66
"license": "MIT",

packages/core/src/validate-initializers.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ testAccepts('InitializationOrder_Duplicate_UnsafeAllow_Call', 'transparent');
124124
testOverride('InitializationOrder_Duplicate_Bad', 'transparent', { unsafeAllow: ['duplicate-initializer-call'] });
125125
testAccepts('InitializationOrder_UnsafeAllowDuplicate_But_WrongOrder', 'transparent'); // warn 'Expected initializers to be called for parent contracts in the following order: A, B, C'
126126

127+
testAccepts('WithRequire_Ok', 'transparent');
128+
testRejects('WithRequire_Bad', 'transparent', {
129+
contains: ['Missing initializer calls for one or more parent contracts: `Parent__OnlyInitializingModifier`'],
130+
count: 1,
131+
});
132+
127133
testAccepts('Child_Of_Private_Ok', 'transparent');
128134
testAccepts('Child_Of_Public_Ok', 'transparent');
129135
testRejects('Child_Of_Public_MissingCall_Bad', 'transparent', {

packages/core/src/validate/run/initializer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ function getParentsNotInitializedByOtherParents(
124124
(fnCall.expression.nodeType === 'Identifier' || fnCall.expression.nodeType === 'MemberAccess')
125125
) {
126126
const referencedFn = fnCall.expression.referencedDeclaration;
127-
if (referencedFn) {
127+
if (referencedFn && referencedFn > 0) {
128128
const earlierParents = remainingParents.slice(0, remainingParents.indexOf(parent));
129129
const callsEarlierParentInitializer = earlierParents.find(base =>
130130
parentNameToInitializersMap.get(base)!.some(init => init.id === referencedFn),
@@ -177,7 +177,7 @@ function* getInitializerCallExceptions(
177177
) {
178178
let recursiveFunctionIds: number[] = [];
179179
const referencedFn = fnCall.expression.referencedDeclaration;
180-
if (referencedFn) {
180+
if (referencedFn && referencedFn > 0) {
181181
recursiveFunctionIds = getRecursiveFunctionIds(referencedFn, deref);
182182
}
183183

@@ -284,7 +284,7 @@ function getRecursiveFunctionIds(referencedFn: number, deref: ASTDereferencer, v
284284
(fnCall.expression.nodeType === 'Identifier' || fnCall.expression.nodeType === 'MemberAccess')
285285
) {
286286
const referencedId = fnCall.expression.referencedDeclaration;
287-
if (referencedId) {
287+
if (referencedId && referencedId > 0) {
288288
result.push(...getRecursiveFunctionIds(referencedId, deref, visited));
289289
}
290290
}

0 commit comments

Comments
 (0)