@openzeppelin/upgrades-core 1.42.2 → 1.44.0
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/artifacts/@openzeppelin/contracts-v5/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +3 -3
- package/artifacts/@openzeppelin/contracts-v5/proxy/beacon/BeaconProxy.sol/BeaconProxy.json +3 -3
- package/artifacts/@openzeppelin/contracts-v5/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json +2 -2
- package/artifacts/@openzeppelin/contracts-v5/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +2 -2
- package/artifacts/@openzeppelin/contracts-v5/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +2 -2
- package/artifacts/@openzeppelin/contracts-v5/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +3 -3
- package/artifacts/build-info-v5.json +5159 -2886
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +1 -0
- package/dist/provider.js.map +1 -1
- package/dist/solidity-version.json +1 -1
- package/dist/storage/extract.d.ts.map +1 -1
- package/dist/storage/extract.js +14 -0
- package/dist/storage/extract.js.map +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +23 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/layout.d.ts +1 -0
- package/dist/storage/layout.d.ts.map +1 -1
- package/dist/storage/layout.js.map +1 -1
- package/dist/storage/namespace.d.ts.map +1 -1
- package/dist/storage/namespace.js +47 -1
- package/dist/storage/namespace.js.map +1 -1
- package/dist/storage-custom-layout.test.d.ts +2 -0
- package/dist/storage-custom-layout.test.d.ts.map +1 -0
- package/dist/storage-custom-layout.test.js +314 -0
- package/dist/storage-custom-layout.test.js.map +1 -0
- package/dist/utils/erc7201.d.ts +10 -0
- package/dist/utils/erc7201.d.ts.map +1 -0
- package/dist/utils/erc7201.js +24 -0
- package/dist/utils/erc7201.js.map +1 -0
- package/dist/utils/erc7201.test.d.ts +2 -0
- package/dist/utils/erc7201.test.d.ts.map +1 -0
- package/dist/utils/erc7201.test.js +11 -0
- package/dist/utils/erc7201.test.js.map +1 -0
- package/dist/utils/integer-literals.d.ts +15 -0
- package/dist/utils/integer-literals.d.ts.map +1 -0
- package/dist/utils/integer-literals.js +34 -0
- package/dist/utils/integer-literals.js.map +1 -0
- package/dist/utils/integer-literals.test.d.ts +2 -0
- package/dist/utils/integer-literals.test.d.ts.map +1 -0
- package/dist/utils/integer-literals.test.js +57 -0
- package/dist/utils/integer-literals.test.js.map +1 -0
- package/dist/utils/make-namespaced.d.ts.map +1 -1
- package/dist/utils/make-namespaced.js +4 -0
- package/dist/utils/make-namespaced.js.map +1 -1
- package/dist/utils/make-namespaced.test.js +4 -0
- package/dist/utils/make-namespaced.test.js.map +1 -1
- package/dist/utils/stabilize-layout.d.ts +1 -0
- package/dist/utils/stabilize-layout.d.ts.map +1 -1
- package/dist/utils/stabilize-layout.js +1 -0
- package/dist/utils/stabilize-layout.js.map +1 -1
- package/dist/validate/run/initializer.d.ts.map +1 -1
- package/dist/validate/run/initializer.js +42 -10
- package/dist/validate/run/initializer.js.map +1 -1
- package/dist/validate-initializers.test.js +23 -5
- package/dist/validate-initializers.test.js.map +1 -1
- package/package.json +7 -4
- package/src/provider.ts +1 -0
- package/src/solidity-version.json +1 -1
- package/src/storage/extract.ts +21 -0
- package/src/storage/index.ts +29 -0
- package/src/storage/layout.ts +1 -0
- package/src/storage/namespace.ts +67 -1
- package/src/storage-0.8.test.ts.md +4 -0
- package/src/storage-0.8.test.ts.snap +0 -0
- package/src/storage-custom-layout.test.ts +358 -0
- package/src/storage-custom-layout.test.ts.md +353 -0
- package/src/storage-custom-layout.test.ts.snap +0 -0
- package/src/storage-memory-0.5.test.ts.md +2 -0
- package/src/storage-memory-0.5.test.ts.snap +0 -0
- package/src/storage-namespaced-layout.test.ts.md +1 -0
- package/src/storage-namespaced-layout.test.ts.snap +0 -0
- package/src/storage-namespaced.test.ts.md +2 -0
- package/src/storage-namespaced.test.ts.snap +0 -0
- package/src/storage.test.ts.md +2 -0
- package/src/storage.test.ts.snap +0 -0
- package/src/utils/erc7201.test.ts +10 -0
- package/src/utils/erc7201.ts +25 -0
- package/src/utils/integer-literals.test.ts +73 -0
- package/src/utils/integer-literals.ts +29 -0
- package/src/utils/make-namespaced.test.ts +7 -0
- package/src/utils/make-namespaced.test.ts.md +50 -0
- package/src/utils/make-namespaced.test.ts.snap +0 -0
- package/src/utils/make-namespaced.ts +5 -0
- package/src/utils/stabilize-layout.ts +1 -0
- package/src/validate/run/initializer.ts +65 -19
- package/src/validate-initializers.test.ts +28 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-namespaced.test.js","sourceRoot":"","sources":["../../src/utils/make-namespaced.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"make-namespaced.test.js","sourceRoot":"","sources":["../../src/utils/make-namespaced.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stabilize-layout.d.ts","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa
|
|
1
|
+
{"version":3,"file":"stabilize-layout.d.ts","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stabilize-layout.js","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"stabilize-layout.js","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":";;AAIA,wDAkBC;AArBD,8CAAkD;AAClD,uCAAoD;AAEpD,SAAgB,sBAAsB,CAAC,MAAqB;IAC1D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACvD,MAAM,OAAO,GACX,IAAI,CAAC,OAAO;gBACZ,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,OAAO,CAAC;oBAC1B,CAAC,CAAC,IAAI,CAAC,OAAO;oBACd,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,IAAA,iCAAuB,EAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC;QACF,UAAU,EAAE,MAAM,CAAC,UAAU;YAC3B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;gBACpD,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1F,CAAC,CAAC;YACJ,CAAC,CAAC,SAAS;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializer.d.ts","sourceRoot":"","sources":["../../../src/validate/run/initializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"initializer.d.ts","sourceRoot":"","sources":["../../../src/validate/run/initializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,cAAc,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAW,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,8BAA8B,EAA+B,MAAM,QAAQ,CAAC;AAIrF;;;;;;GAMG;AACH,wBAAiB,wBAAwB,CACvC,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,UAAU,GACpB,SAAS,CAAC,8BAA8B,CAAC,CA4C3C"}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getInitializerExceptions = getInitializerExceptions;
|
|
4
4
|
const utils_1 = require("solidity-ast/utils");
|
|
5
5
|
const run_1 = require("../run");
|
|
6
|
+
const annotations_1 = require("../../utils/annotations");
|
|
7
|
+
const log_1 = require("../../utils/log");
|
|
6
8
|
/**
|
|
7
9
|
* Reports if this contract is non-abstract and any of the following are true:
|
|
8
10
|
* - 1. Missing initializer: This contract does not appear to have an initializer, but parent contracts require initialization.
|
|
@@ -15,10 +17,10 @@ function* getInitializerExceptions(contractDef, deref, decodeSrc) {
|
|
|
15
17
|
return;
|
|
16
18
|
}
|
|
17
19
|
const linearizedParentContracts = getLinearizedParentContracts(contractDef, deref);
|
|
18
|
-
const parentNameToInitializersMap = getParentNameToInitializersMap(linearizedParentContracts);
|
|
20
|
+
const parentNameToInitializersMap = getParentNameToInitializersMap(linearizedParentContracts, decodeSrc);
|
|
19
21
|
const remainingParents = getParentsNotInitializedByOtherParents(parentNameToInitializersMap);
|
|
20
22
|
if (remainingParents.length > 0) {
|
|
21
|
-
const contractInitializers = getPossibleInitializers(contractDef, false);
|
|
23
|
+
const contractInitializers = getPossibleInitializers(contractDef, false, decodeSrc);
|
|
22
24
|
// Report if there is no initializer but parents need initialization
|
|
23
25
|
if (checkNeedsInitialization(remainingParents, parentNameToInitializersMap) &&
|
|
24
26
|
contractInitializers.length === 0 &&
|
|
@@ -48,10 +50,10 @@ function getLinearizedParentContracts(contractDef, deref) {
|
|
|
48
50
|
* Gets a map of parent contract names to their possible initializers.
|
|
49
51
|
* If a parent contract has no initializers, it is not included in the map.
|
|
50
52
|
*/
|
|
51
|
-
function getParentNameToInitializersMap(linearizedParentContracts) {
|
|
53
|
+
function getParentNameToInitializersMap(linearizedParentContracts, decodeSrc) {
|
|
52
54
|
const map = new Map();
|
|
53
55
|
for (const parent of linearizedParentContracts) {
|
|
54
|
-
const initializers = getPossibleInitializers(parent, true);
|
|
56
|
+
const initializers = getPossibleInitializers(parent, true, decodeSrc);
|
|
55
57
|
if (initializers.length > 0) {
|
|
56
58
|
map.set(parent.name, initializers);
|
|
57
59
|
}
|
|
@@ -240,20 +242,50 @@ function getRecursiveFunctionIds(deref, functionDef, visited) {
|
|
|
240
242
|
return result;
|
|
241
243
|
}
|
|
242
244
|
/**
|
|
243
|
-
* Get all functions that
|
|
244
|
-
*
|
|
245
|
+
* Get all functions that are annotated as initializers or are inferred to be initializers.
|
|
246
|
+
* Logs a note if any reinitializer is found.
|
|
245
247
|
*/
|
|
246
|
-
function getPossibleInitializers(contractDef, isParentContract) {
|
|
248
|
+
function getPossibleInitializers(contractDef, isParentContract, decodeSrc) {
|
|
247
249
|
const fns = [...(0, utils_1.findAll)('FunctionDefinition', contractDef)];
|
|
248
|
-
return fns.filter(
|
|
249
|
-
|
|
250
|
+
return fns.filter((fnDef) => {
|
|
251
|
+
const validateAsInitializer = hasValidateAsInitializerAnnotation(fnDef, decodeSrc);
|
|
252
|
+
if (!validateAsInitializer && fnDef.modifiers.some(modifier => 'reinitializer' === modifier.modifierName.name)) {
|
|
253
|
+
(0, log_1.logNote)(`Reinitializers are not included in validations by default`, [
|
|
254
|
+
`${decodeSrc(fnDef)}: If you want to validate this function as an initializer, annotate it with '@custom:oz-upgrades-validate-as-initializer'`,
|
|
255
|
+
]);
|
|
256
|
+
}
|
|
257
|
+
return inferPossibleInitializer(fnDef, validateAsInitializer, isParentContract);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
function hasValidateAsInitializerAnnotation(node, decodeSrc) {
|
|
261
|
+
const doc = (0, annotations_1.getDocumentation)(node);
|
|
262
|
+
const tag = 'oz-upgrades-validate-as-initializer';
|
|
263
|
+
const validateAsInitializer = (0, annotations_1.hasAnnotationTag)(doc, tag);
|
|
264
|
+
if (validateAsInitializer) {
|
|
265
|
+
const annotationArgs = (0, annotations_1.getAnnotationArgs)(doc, tag);
|
|
266
|
+
if (annotationArgs.length !== 0) {
|
|
267
|
+
throw new Error(`${decodeSrc(node)}: @custom:${tag} annotation must not have any arguments`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return validateAsInitializer;
|
|
271
|
+
}
|
|
272
|
+
function hasInitializerNameOrModifier(fnDef) {
|
|
273
|
+
return (fnDef.modifiers.some(modifier => ['initializer', 'onlyInitializing'].includes(modifier.modifierName.name)) ||
|
|
274
|
+
['initialize', 'initializer'].includes(fnDef.name));
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Infers whether a function could be an initializer. Does not include private functions.
|
|
278
|
+
* For parent contracts, only internal and public functions which contain statements are included.
|
|
279
|
+
*/
|
|
280
|
+
function inferPossibleInitializer(fnDef, validateAsInitializer, isParentContract) {
|
|
281
|
+
return ((validateAsInitializer || hasInitializerNameOrModifier(fnDef)) &&
|
|
250
282
|
// Skip virtual functions without a body, since that indicates an abstract function and is not itself an initializer
|
|
251
283
|
!(fnDef.virtual && !fnDef.body) &&
|
|
252
284
|
// Ignore private functions, since they cannot be called outside the contract
|
|
253
285
|
fnDef.visibility !== 'private' &&
|
|
254
286
|
// For parent contracts, only internal and public functions which contain statements need to be called
|
|
255
287
|
(isParentContract
|
|
256
|
-
? fnDef.body?.statements?.length && (fnDef.visibility === 'internal' || fnDef.visibility === 'public')
|
|
288
|
+
? Boolean(fnDef.body?.statements?.length) && (fnDef.visibility === 'internal' || fnDef.visibility === 'public')
|
|
257
289
|
: true));
|
|
258
290
|
}
|
|
259
291
|
//# sourceMappingURL=initializer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializer.js","sourceRoot":"","sources":["../../../src/validate/run/initializer.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"initializer.js","sourceRoot":"","sources":["../../../src/validate/run/initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,9 +64,15 @@ testRejects('MissingInitializer_Bad', 'transparent', {
|
|
|
64
64
|
});
|
|
65
65
|
testAccepts('MissingInitializer_UnsafeAllow_Contract', 'transparent');
|
|
66
66
|
testOverride('MissingInitializer_Bad', 'transparent', { unsafeAllow: ['missing-initializer'] });
|
|
67
|
+
testAccepts('ValidateAsInitializer_Ok', 'transparent');
|
|
68
|
+
testRejects('Reinitializer_NotDetected', 'transparent', {
|
|
69
|
+
contains: ['Missing initializer'],
|
|
70
|
+
count: 1,
|
|
71
|
+
});
|
|
72
|
+
testAccepts('Reinitializer_ValidateAsInitializer_Ok', 'transparent');
|
|
67
73
|
testAccepts('InitializationOrder_Ok', 'transparent');
|
|
68
74
|
testAccepts('InitializationOrder_Ok_2', 'transparent');
|
|
69
|
-
testAccepts('InitializationOrder_WrongOrder_Bad', 'transparent'); // warn 'Expected
|
|
75
|
+
testAccepts('InitializationOrder_WrongOrder_Bad', 'transparent'); // warn 'Expected: A, B, C'
|
|
70
76
|
testAccepts('InitializationOrder_WrongOrder_UnsafeAllow_Contract', 'transparent');
|
|
71
77
|
testAccepts('InitializationOrder_WrongOrder_UnsafeAllow_Function', 'transparent');
|
|
72
78
|
testOverride('InitializationOrder_WrongOrder_Bad', 'transparent', { unsafeAllow: ['incorrect-initializer-order'] }); // skips the warning
|
|
@@ -85,7 +91,19 @@ testAccepts('InitializationOrder_Duplicate_UnsafeAllow_Contract', 'transparent')
|
|
|
85
91
|
testAccepts('InitializationOrder_Duplicate_UnsafeAllow_Function', 'transparent');
|
|
86
92
|
testAccepts('InitializationOrder_Duplicate_UnsafeAllow_Call', 'transparent');
|
|
87
93
|
testOverride('InitializationOrder_Duplicate_Bad', 'transparent', { unsafeAllow: ['duplicate-initializer-call'] });
|
|
88
|
-
testAccepts('InitializationOrder_UnsafeAllowDuplicate_But_WrongOrder', 'transparent'); // warn 'Expected
|
|
94
|
+
testAccepts('InitializationOrder_UnsafeAllowDuplicate_But_WrongOrder', 'transparent'); // warn 'Expected: A, B, C'
|
|
95
|
+
testAccepts('InitializationOrder_ValidateAsInitializer_Ok', 'transparent');
|
|
96
|
+
testAccepts('InitializationOrder_ValidateAsInitializer_WrongOrder', 'transparent'); // warn 'Expected: A, B, C, Parent_ValidateAsInitializer'
|
|
97
|
+
testRejects('InitializationOrder_ValidateAsInitializer_MissingCall', 'transparent', {
|
|
98
|
+
contains: ['Missing initializer calls for one or more parent contracts: `Parent_ValidateAsInitializer`'],
|
|
99
|
+
count: 1,
|
|
100
|
+
});
|
|
101
|
+
testRejects('InitializationOrder_ValidateAsInitializer_DuplicateCall', 'transparent', {
|
|
102
|
+
contains: ['Duplicate calls found to initializer `parentAssumeInit` for contract `Parent_ValidateAsInitializer`'],
|
|
103
|
+
count: 1,
|
|
104
|
+
});
|
|
105
|
+
testAccepts('Parent_ValidateAsInitializer_External_Ok', 'transparent');
|
|
106
|
+
testAccepts('Child_Of_ValidateAsInitializer_External_Ok', 'transparent');
|
|
89
107
|
testAccepts('WithRequire_Ok', 'transparent');
|
|
90
108
|
testRejects('WithRequire_Bad', 'transparent', {
|
|
91
109
|
contains: ['Missing initializer calls for one or more parent contracts: `Parent__OnlyInitializingModifier`'],
|
|
@@ -137,11 +155,11 @@ testRejects('TransitiveChild_Bad_Parent', 'transparent', {
|
|
|
137
155
|
'Missing initializer calls for one or more parent contracts: `TransitiveGrandparent2`', // occurs twice: missing initializer for child, missing initializer for parent
|
|
138
156
|
],
|
|
139
157
|
count: 2,
|
|
140
|
-
}); // warn 'Expected
|
|
158
|
+
}); // warn 'Expected: TransitiveGrandparent2, TransitiveParent_Bad'
|
|
141
159
|
testRejects('TransitiveChild_Bad_Order', 'transparent', {
|
|
142
160
|
contains: ['Missing initializer calls for one or more parent contracts: `TransitiveGrandparent2`'],
|
|
143
161
|
count: 1,
|
|
144
|
-
}); // warn 'Expected
|
|
162
|
+
}); // warn 'Expected: TransitiveGrandparent2, TransitiveParent_Bad'
|
|
145
163
|
testRejects('TransitiveChild_Good_Order_Bad_Parent', 'transparent', {
|
|
146
164
|
contains: ['Missing initializer calls for one or more parent contracts: `TransitiveGrandparent2`'],
|
|
147
165
|
count: 1,
|
|
@@ -174,7 +192,7 @@ testAccepts('Recursive_Ok', 'transparent');
|
|
|
174
192
|
testAccepts('ERC20_Ok', 'uups');
|
|
175
193
|
testRejects('ERC20_Bad', 'uups', {
|
|
176
194
|
contains: [
|
|
177
|
-
'Missing initializer calls for one or more parent contracts: `ERC20Upgradeable,
|
|
195
|
+
'Missing initializer calls for one or more parent contracts: `ERC20Upgradeable, OwnableUpgradeable, ERC20PermitUpgradeable`',
|
|
178
196
|
],
|
|
179
197
|
count: 1,
|
|
180
198
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-initializers.test.js","sourceRoot":"","sources":["../src/validate-initializers.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAoC;AACpC,qCAAoC;AAEpC,yCAOoB;AACpB,+CAAuD;AAMvD,MAAM,IAAI,GAAG,aAAwB,CAAC;AAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;IACpB,MAAM,SAAS,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAErF,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAmB,CAAC;IAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;QACpC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;QAClC,MAAM,SAAS,GAAG,IAAA,oCAAsB,EAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAA,mBAAQ,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,IAAY,EAAE,IAA+B;IAChE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAOD,SAAS,WAAW,CAAC,IAAY,EAAE,IAA+B,EAAE,
|
|
1
|
+
{"version":3,"file":"validate-initializers.test.js","sourceRoot":"","sources":["../src/validate-initializers.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAoC;AACpC,qCAAoC;AAEpC,yCAOoB;AACpB,+CAAuD;AAMvD,MAAM,IAAI,GAAG,aAAwB,CAAC;AAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;IACpB,MAAM,SAAS,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAErF,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAmB,CAAC;IAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;QACpC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;QAClC,MAAM,SAAS,GAAG,IAAA,oCAAsB,EAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAA,mBAAQ,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,IAAY,EAAE,IAA+B;IAChE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAOD,SAAS,WAAW,CAAC,IAAY,EAAE,IAA+B,EAAE,cAA8B;IAChG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,IAA+B,EAC/B,IAAuB,EACvB,cAA+B;IAE/B,MAAM,WAAW,GAAG,cAAc,KAAK,SAAS,CAAC;IAEjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;QACjB,MAAM,OAAO,GAAG,IAAA,6BAAkB,EAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,IAAA,4BAAiB,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClG,IAAI,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAqB,CAAC;YAC1D,CAAC,CAAC,IAAI,CACJ,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,KAAK,EAC5C,YAAY,cAAc,CAAC,KAAK,gBAAgB,KAAK,CAAC,MAAM,CAAC,MAAM,MAAM,KAAK,CAAC,OAAO,EAAE,CACzF,CAAC;YACF,CAAC,CAAC,IAAI,CACJ,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC9D,KAAK,CAAC,OAAO,CACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,WAAW,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;AAExD,WAAW,CAAC,iCAAiC,EAAE,aAAa,CAAC,CAAC;AAC9D,WAAW,CAAC,kCAAkC,EAAE,aAAa,EAAE;IAC7D,QAAQ,EAAE,CAAC,0FAA0F,CAAC;IACtG,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,2CAA2C,EAAE,aAAa,CAAC,CAAC;AAExE,WAAW,CAAC,sCAAsC,EAAE,aAAa,CAAC,CAAC;AACnE,WAAW,CAAC,uCAAuC,EAAE,aAAa,EAAE;IAClE,QAAQ,EAAE,CAAC,gGAAgG,CAAC;IAC5G,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AAEH,WAAW,CAAC,wBAAwB,EAAE,aAAa,EAAE;IACnD,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,yCAAyC,EAAE,aAAa,CAAC,CAAC;AACtE,YAAY,CAAC,wBAAwB,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAEhG,WAAW,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;AAEvD,WAAW,CAAC,2BAA2B,EAAE,aAAa,EAAE;IACtD,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,wCAAwC,EAAE,aAAa,CAAC,CAAC;AAErE,WAAW,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;AACrD,WAAW,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;AAEvD,WAAW,CAAC,oCAAoC,EAAE,aAAa,CAAC,CAAC,CAAC,2BAA2B;AAC7F,WAAW,CAAC,qDAAqD,EAAE,aAAa,CAAC,CAAC;AAClF,WAAW,CAAC,qDAAqD,EAAE,aAAa,CAAC,CAAC;AAClF,YAAY,CAAC,oCAAoC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB;AAEzI,WAAW,CAAC,qCAAqC,EAAE,aAAa,EAAE;IAChE,QAAQ,EAAE,CAAC,iEAAiE,CAAC;IAC7E,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,sDAAsD,EAAE,aAAa,CAAC,CAAC;AACnF,WAAW,CAAC,sDAAsD,EAAE,aAAa,CAAC,CAAC;AACnF,YAAY,CAAC,qCAAqC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;AAElH,WAAW,CAAC,mCAAmC,EAAE,aAAa,EAAE;IAC9D,QAAQ,EAAE,CAAC,kEAAkE,CAAC;IAC9E,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,oDAAoD,EAAE,aAAa,CAAC,CAAC;AACjF,WAAW,CAAC,oDAAoD,EAAE,aAAa,CAAC,CAAC;AACjF,WAAW,CAAC,gDAAgD,EAAE,aAAa,CAAC,CAAC;AAC7E,YAAY,CAAC,mCAAmC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;AAClH,WAAW,CAAC,yDAAyD,EAAE,aAAa,CAAC,CAAC,CAAC,2BAA2B;AAElH,WAAW,CAAC,8CAA8C,EAAE,aAAa,CAAC,CAAC;AAC3E,WAAW,CAAC,sDAAsD,EAAE,aAAa,CAAC,CAAC,CAAC,yDAAyD;AAC7I,WAAW,CAAC,uDAAuD,EAAE,aAAa,EAAE;IAClF,QAAQ,EAAE,CAAC,4FAA4F,CAAC;IACxG,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,yDAAyD,EAAE,aAAa,EAAE;IACpF,QAAQ,EAAE,CAAC,qGAAqG,CAAC;IACjH,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AAEH,WAAW,CAAC,0CAA0C,EAAE,aAAa,CAAC,CAAC;AACvE,WAAW,CAAC,4CAA4C,EAAE,aAAa,CAAC,CAAC;AAEzE,WAAW,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC7C,WAAW,CAAC,iBAAiB,EAAE,aAAa,EAAE;IAC5C,QAAQ,EAAE,CAAC,gGAAgG,CAAC;IAC5G,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AAEH,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;AAClD,WAAW,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;AACjD,WAAW,CAAC,iCAAiC,EAAE,aAAa,EAAE;IAC5D,QAAQ,EAAE,CAAC,6EAA6E,CAAC;IACzF,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAC;AACnD,WAAW,CAAC,uBAAuB,EAAE,aAAa,EAAE;IAClD,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,mCAAmC,EAAE,aAAa,EAAE;IAC9D,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,iCAAiC,EAAE,aAAa,CAAC,CAAC;AAC9D,WAAW,CAAC,mCAAmC,EAAE,aAAa,CAAC,CAAC;AAChE,WAAW,CAAC,mCAAmC,EAAE,aAAa,CAAC,CAAC;AAChE,WAAW,CAAC,mCAAmC,EAAE,aAAa,CAAC,CAAC;AAChE,WAAW,CAAC,8BAA8B,EAAE,aAAa,EAAE;IACzD,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,+CAA+C,EAAE,aAAa,EAAE;IAC1E,QAAQ,EAAE,CAAC,8FAA8F,CAAC;IAC1G,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AAEH,WAAW,CAAC,gDAAgD,EAAE,aAAa,EAAE;IAC3E,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,yCAAyC,EAAE,aAAa,EAAE;IACpE,QAAQ,EAAE,CAAC,+EAA+E,CAAC;IAC3F,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAC;AAEzD,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;AAClD,WAAW,CAAC,sBAAsB,EAAE,aAAa,EAAE;IACjD,QAAQ,EAAE,CAAC,sFAAsF,CAAC;IAClG,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,4BAA4B,EAAE,aAAa,EAAE;IACvD,QAAQ,EAAE;QACR,sFAAsF,EAAE,8EAA8E;KACvK;IACD,KAAK,EAAE,CAAC;CACT,CAAC,CAAC,CAAC,gEAAgE;AACpE,WAAW,CAAC,2BAA2B,EAAE,aAAa,EAAE;IACtD,QAAQ,EAAE,CAAC,sFAAsF,CAAC;IAClG,KAAK,EAAE,CAAC;CACT,CAAC,CAAC,CAAC,gEAAgE;AACpE,WAAW,CAAC,uCAAuC,EAAE,aAAa,EAAE;IAClE,QAAQ,EAAE,CAAC,sFAAsF,CAAC;IAClG,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,yBAAyB,EAAE,aAAa,EAAE;IACpD,QAAQ,EAAE;QACR,4GAA4G;KAC7G;IACD,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AAEH,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACzC,WAAW,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAC9C,WAAW,CAAC,kBAAkB,EAAE,aAAa,EAAE;IAC7C,QAAQ,EAAE,CAAC,kFAAkF,CAAC;IAC9F,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AAEH,WAAW,CAAC,iBAAiB,EAAE,aAAa,EAAE;IAC5C,QAAQ,EAAE,CAAC,sEAAsE,CAAC;IAClF,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,wBAAwB,EAAE,aAAa,EAAE;IACnD,QAAQ,EAAE,CAAC,sFAAsF,CAAC;IAClG,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,eAAe,EAAE,aAAa,EAAE;IAC1C,QAAQ,EAAE,CAAC,sEAAsE,CAAC;IAClF,KAAK,EAAE,CAAC;CACT,CAAC,CAAC;AACH,WAAW,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAE3C,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAChC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE;IAC/B,QAAQ,EAAE;QACR,4HAA4H;KAC7H;IACD,KAAK,EAAE,CAAC;CACT,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openzeppelin/upgrades-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.44.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": "https://github.com/OpenZeppelin/openzeppelin-upgrades/tree/master/packages/core",
|
|
6
6
|
"license": "MIT",
|
|
@@ -34,7 +34,9 @@
|
|
|
34
34
|
"compile:contracts": "hardhat compile",
|
|
35
35
|
"copyfiles": "node scripts/copy-build-info-v5.js && bash scripts/copy-legacy-artifacts.sh",
|
|
36
36
|
"prepare": "yarn clean && yarn compile && yarn copyfiles",
|
|
37
|
-
"
|
|
37
|
+
"pretest": "tsc -b && hardhat compile --force && yarn copyfiles",
|
|
38
|
+
"test": "ava",
|
|
39
|
+
"test:update-snapshots": "yarn test --update-snapshots",
|
|
38
40
|
"test:watch": "hardhat compile --force && yarn copyfiles && fgbg 'ava --watch' 'tsc -b --watch' --",
|
|
39
41
|
"version": "node ../../scripts/bump-changelog.js",
|
|
40
42
|
"cli": "node ./dist/cli/cli.js"
|
|
@@ -45,7 +47,7 @@
|
|
|
45
47
|
"devDependencies": {
|
|
46
48
|
"@ava/typescript": "^5.0.0",
|
|
47
49
|
"@nomicfoundation/hardhat-ethers": "^3.0.5",
|
|
48
|
-
"@openzeppelin/contracts": "5.0
|
|
50
|
+
"@openzeppelin/contracts": "5.3.0",
|
|
49
51
|
"@openzeppelin/upgrades-core-legacy": "npm:@openzeppelin/upgrades-core@1.31.3",
|
|
50
52
|
"@types/debug": "^4.1.5",
|
|
51
53
|
"@types/minimist": "^1.2.5",
|
|
@@ -65,11 +67,12 @@
|
|
|
65
67
|
"cbor": "^10.0.0",
|
|
66
68
|
"chalk": "^4.1.0",
|
|
67
69
|
"compare-versions": "^6.0.0",
|
|
70
|
+
"bignumber.js": "^9.1.2",
|
|
68
71
|
"debug": "^4.1.1",
|
|
69
72
|
"ethereumjs-util": "^7.0.3",
|
|
70
73
|
"minimist": "^1.2.7",
|
|
71
74
|
"proper-lockfile": "^4.1.1",
|
|
72
|
-
"solidity-ast": "^0.4.
|
|
75
|
+
"solidity-ast": "^0.4.60",
|
|
73
76
|
"minimatch": "^9.0.5"
|
|
74
77
|
}
|
|
75
78
|
}
|
package/src/provider.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"0.8.
|
|
1
|
+
"0.8.29"
|
package/src/storage/extract.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { mapValues } from '../utils/map-values';
|
|
|
15
15
|
import { pick } from '../utils/pick';
|
|
16
16
|
import { execall } from '../utils/execall';
|
|
17
17
|
import { loadNamespaces } from './namespace';
|
|
18
|
+
import { UpgradesError } from '../error';
|
|
18
19
|
|
|
19
20
|
const currentLayoutVersion = '1.2';
|
|
20
21
|
|
|
@@ -37,6 +38,8 @@ export function extractStorageLayout(
|
|
|
37
38
|
): StorageLayout {
|
|
38
39
|
const layout: StorageLayout = { storage: [], types: {}, layoutVersion: currentLayoutVersion, flat: false };
|
|
39
40
|
|
|
41
|
+
loadBaseSlot(contractDef, decodeSrc, layout);
|
|
42
|
+
|
|
40
43
|
// The namespaced context will contain the types of namespaces that may not be included
|
|
41
44
|
// in the original storage layout.
|
|
42
45
|
// Some types will be present in both and they must be exactly equivalent.
|
|
@@ -101,6 +104,24 @@ export function extractStorageLayout(
|
|
|
101
104
|
return layout;
|
|
102
105
|
}
|
|
103
106
|
|
|
107
|
+
function loadBaseSlot(contractDef: ContractDefinition, decodeSrc: SrcDecoder, layout: StorageLayout) {
|
|
108
|
+
if (contractDef.storageLayout !== undefined) {
|
|
109
|
+
if (contractDef.storageLayout.baseSlotExpression.nodeType !== 'Literal') {
|
|
110
|
+
const src = decodeSrc(contractDef.storageLayout.baseSlotExpression);
|
|
111
|
+
|
|
112
|
+
// TODO when Slang supports Solidity 0.8.29, use it to parse the expression (of any node type) into a string, then just save it to `layout.baseSlot`.
|
|
113
|
+
// Then when comparing layouts in `storage/index.ts`, it will only be used when detailed storage layout is not available, and the comparison
|
|
114
|
+
// can be changed to a string comparison when `layout.baseSlot` not an integer literal.
|
|
115
|
+
throw new UpgradesError(
|
|
116
|
+
`${src}: Custom storage layout expression with node type ${contractDef.storageLayout.baseSlotExpression.nodeType} is not currently supported`,
|
|
117
|
+
() =>
|
|
118
|
+
'Please report this at https://zpl.in/upgrades/report and include the `layout at` expression from your contract.',
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
layout.baseSlot = contractDef.storageLayout.baseSlotExpression.value ?? undefined;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
104
125
|
const findTypeNames = findAll([
|
|
105
126
|
'ArrayTypeName',
|
|
106
127
|
'ElementaryTypeName',
|
package/src/storage/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { StorageOperation, StorageItem, StorageLayoutComparator } from './compar
|
|
|
6
6
|
import { LayoutCompatibilityReport } from './report';
|
|
7
7
|
import { ValidationOptions, withValidationDefaults } from '../validate/overrides';
|
|
8
8
|
import { logNote, logWarning } from '../utils/log';
|
|
9
|
+
import { normalizeUint256Literal } from '../utils/integer-literals';
|
|
9
10
|
|
|
10
11
|
export function assertStorageUpgradeSafe(
|
|
11
12
|
original: StorageLayout,
|
|
@@ -36,11 +37,39 @@ export function assertStorageUpgradeSafe(
|
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
function validateBaseSlotUnchanged(original: StorageLayout, updated: StorageLayout) {
|
|
41
|
+
const origNormalized = normalizeUint256Literal(original.baseSlot);
|
|
42
|
+
const updatedNormalized = normalizeUint256Literal(updated.baseSlot);
|
|
43
|
+
|
|
44
|
+
if (origNormalized !== updatedNormalized) {
|
|
45
|
+
throw new UpgradesError(
|
|
46
|
+
`Base slot for custom storage layout changed from ${origNormalized} to ${updatedNormalized}`,
|
|
47
|
+
() => `\
|
|
48
|
+
Do not change the base slot during upgrades when using custom storage layout.
|
|
49
|
+
|
|
50
|
+
If you need to change the base slot, ensure you also do the following:
|
|
51
|
+
1. Adjust all storage variables to continue using their original slots.
|
|
52
|
+
2. Configure your Solidity compiler options to include storage layouts according to https://docs.openzeppelin.com/upgrades-plugins/api-core#compile_contracts_with_storage_layouts
|
|
53
|
+
3. Recompile both the original and updated contracts.
|
|
54
|
+
4. Run the storage layout check again.`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
39
59
|
export function getStorageUpgradeReport(
|
|
40
60
|
original: StorageLayout,
|
|
41
61
|
updated: StorageLayout,
|
|
42
62
|
opts: Required<ValidationOptions>,
|
|
43
63
|
): LayoutCompatibilityReport {
|
|
64
|
+
if (opts.unsafeSkipStorageCheck) {
|
|
65
|
+
return new LayoutCompatibilityReport([]);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (original.storage.some(item => item.slot === undefined) || updated.storage.some(item => item.slot === undefined)) {
|
|
69
|
+
// Compiler was not configured to output detailed storage layout with slot information
|
|
70
|
+
validateBaseSlotUnchanged(original, updated);
|
|
71
|
+
}
|
|
72
|
+
|
|
44
73
|
const originalDetailed = getDetailedLayout(original);
|
|
45
74
|
const updatedDetailed = getDetailedLayout(updated);
|
|
46
75
|
const originalDetailedNamespaces = getDetailedNamespacedLayout(original);
|
package/src/storage/layout.ts
CHANGED
package/src/storage/namespace.ts
CHANGED
|
@@ -8,6 +8,9 @@ import { Node } from 'solidity-ast/node';
|
|
|
8
8
|
import { CompilationContext, getTypeMembers, loadLayoutType } from './extract';
|
|
9
9
|
import { UpgradesError } from '../error';
|
|
10
10
|
import * as versions from 'compare-versions';
|
|
11
|
+
import { normalizeUint256Literal } from '../utils/integer-literals';
|
|
12
|
+
import { calculateERC7201StorageLocation, ERC7201_FORMULA_PREFIX } from '../utils/erc7201';
|
|
13
|
+
import { logWarning } from '../utils/log';
|
|
11
14
|
|
|
12
15
|
/**
|
|
13
16
|
* Loads a contract's namespaces and namespaced type information into the storage layout.
|
|
@@ -57,8 +60,10 @@ export function loadNamespaces(
|
|
|
57
60
|
);
|
|
58
61
|
}
|
|
59
62
|
|
|
63
|
+
warnIfCustomLayoutAndNamespacesFound(namespacesWithSrc, decodeSrc, origContext.contractDef);
|
|
64
|
+
|
|
60
65
|
// Add to layout without the namespaced structs' src locations, since those are no longer needed
|
|
61
|
-
// as they were only used to give duplicate namespace errors above.
|
|
66
|
+
// as they were only used to give duplicate namespace errors in `addContractNamespacesWithSrc` above.
|
|
62
67
|
layout.namespaces = Object.fromEntries(
|
|
63
68
|
Object.entries(namespacesWithSrc).map(([id, namespaceWithSrc]) => [id, namespaceWithSrc.namespace]),
|
|
64
69
|
);
|
|
@@ -78,6 +83,19 @@ Use a unique namespace id for each struct annotated with '@custom:storage-locati
|
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
85
|
|
|
86
|
+
class CustomLayoutClashWithNamespaceError extends UpgradesError {
|
|
87
|
+
constructor(id: string, contractName: string, src: string) {
|
|
88
|
+
super(
|
|
89
|
+
`Custom layout for contract ${contractName} clashes with the storage location for namespace ${id}`,
|
|
90
|
+
() => `\
|
|
91
|
+
The namespace ${id} is defined in a struct at the following location:
|
|
92
|
+
- ${src}
|
|
93
|
+
|
|
94
|
+
Specify a different custom layout for the contract or use a different namespace for the struct.`,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
81
99
|
/**
|
|
82
100
|
* Namespaced storage items, along with the original source location of the namespace struct.
|
|
83
101
|
*/
|
|
@@ -130,6 +148,8 @@ function addContractNamespacesWithSrc(
|
|
|
130
148
|
origSrc,
|
|
131
149
|
);
|
|
132
150
|
} else {
|
|
151
|
+
checkCustomLayoutClashWithNamespace(origContractDef, storageLocation, leastDerivedContractName, origSrc);
|
|
152
|
+
|
|
133
153
|
namespacesWithSrc[storageLocation] = {
|
|
134
154
|
namespace: getNamespacedStorageItems(node, decodeSrc, layout, contractContext, origContractDef),
|
|
135
155
|
src: origSrc,
|
|
@@ -140,6 +160,52 @@ function addContractNamespacesWithSrc(
|
|
|
140
160
|
}
|
|
141
161
|
}
|
|
142
162
|
|
|
163
|
+
/**
|
|
164
|
+
* Checks if a custom layout's base slot clashes with a namespace's base slot, and throws an error if it does.
|
|
165
|
+
*
|
|
166
|
+
* @param contractDef The contract definition to check.
|
|
167
|
+
* @param storageLocation The namespace storage location string, e.g. `erc7201:<NAMESPACE_ID>`.
|
|
168
|
+
* @param contractName The name of the contract.
|
|
169
|
+
* @param src The original source location of the struct with the namespace.
|
|
170
|
+
* @throws CustomLayoutClashWithNamespaceError if the custom layout clashes with the namespace.
|
|
171
|
+
*/
|
|
172
|
+
function checkCustomLayoutClashWithNamespace(
|
|
173
|
+
contractDef: ContractDefinition,
|
|
174
|
+
storageLocation: string,
|
|
175
|
+
contractName: string,
|
|
176
|
+
src: string,
|
|
177
|
+
) {
|
|
178
|
+
if (contractDef.storageLayout !== undefined && storageLocation.startsWith(ERC7201_FORMULA_PREFIX)) {
|
|
179
|
+
const namespaceId = storageLocation.substring(ERC7201_FORMULA_PREFIX.length);
|
|
180
|
+
const calculatedStorageLocation = calculateERC7201StorageLocation(namespaceId);
|
|
181
|
+
if (contractDef.storageLayout.baseSlotExpression.nodeType === 'Literal') {
|
|
182
|
+
const baseSlotNormalized = normalizeUint256Literal(contractDef.storageLayout.baseSlotExpression.value); // TODO: when Solidity supports an erc7201 helper function, also check that for clash
|
|
183
|
+
if (baseSlotNormalized === calculatedStorageLocation) {
|
|
184
|
+
throw new CustomLayoutClashWithNamespaceError(storageLocation, contractName, src);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function warnIfCustomLayoutAndNamespacesFound(
|
|
191
|
+
namespacesWithSrc: Record<string, NamespaceWithSrc>,
|
|
192
|
+
decodeSrc: SrcDecoder,
|
|
193
|
+
origContractDef: ContractDefinition,
|
|
194
|
+
) {
|
|
195
|
+
// TODO: when Solidity supports an erc7201 helper function, only give this warning if the custom storage layout is not using the erc7201 helper function
|
|
196
|
+
if (Object.entries(namespacesWithSrc).length > 0 && origContractDef.storageLayout !== undefined) {
|
|
197
|
+
const contractName = origContractDef.canonicalName ?? origContractDef.name;
|
|
198
|
+
logWarning(
|
|
199
|
+
`${decodeSrc(origContractDef.storageLayout)}: Ensure custom storage layout does not overlap with namespaced storage layout.`,
|
|
200
|
+
[
|
|
201
|
+
`Contract \`${contractName}\` has both custom storage layout and namespaces.`,
|
|
202
|
+
'The Upgrades Plugin validates that they do not use the same base slot, but does not check for overlaps.',
|
|
203
|
+
"Ensure the base slot for the contract's `layout at` specifier is chosen such that its storage variables do not overlap with any namespaces.",
|
|
204
|
+
],
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
143
209
|
/**
|
|
144
210
|
* Gets the storage location string from the `@custom:storage-location` annotation.
|
|
145
211
|
*
|
|
@@ -9,6 +9,7 @@ Generated by [AVA](https://avajs.dev).
|
|
|
9
9
|
> Snapshot 1
|
|
10
10
|
|
|
11
11
|
{
|
|
12
|
+
baseSlot: undefined,
|
|
12
13
|
namespaces: [],
|
|
13
14
|
storage: [
|
|
14
15
|
{
|
|
@@ -47,6 +48,7 @@ Generated by [AVA](https://avajs.dev).
|
|
|
47
48
|
> Snapshot 1
|
|
48
49
|
|
|
49
50
|
{
|
|
51
|
+
baseSlot: undefined,
|
|
50
52
|
namespaces: [],
|
|
51
53
|
storage: [
|
|
52
54
|
{
|
|
@@ -85,6 +87,7 @@ Generated by [AVA](https://avajs.dev).
|
|
|
85
87
|
> Snapshot 1
|
|
86
88
|
|
|
87
89
|
{
|
|
90
|
+
baseSlot: undefined,
|
|
88
91
|
namespaces: [],
|
|
89
92
|
storage: [
|
|
90
93
|
{
|
|
@@ -120,6 +123,7 @@ Generated by [AVA](https://avajs.dev).
|
|
|
120
123
|
> Snapshot 1
|
|
121
124
|
|
|
122
125
|
{
|
|
126
|
+
baseSlot: undefined,
|
|
123
127
|
namespaces: [],
|
|
124
128
|
storage: [
|
|
125
129
|
{
|
|
Binary file
|