@openzeppelin/upgrades-core 1.43.0 → 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/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-initializers.test.js +1 -1
- package/dist/validate-initializers.test.js.map +1 -1
- package/package.json +7 -4
- 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-initializers.test.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"0.8.
|
|
1
|
+
"0.8.29"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EAEd,mBAAmB,EACnB,QAAQ,EACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,YAAY,EAA6B,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EAEd,mBAAmB,EACnB,QAAQ,EACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,YAAY,EAA6B,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAS5C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAErE;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,kBAAkB,EAC/B,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,eAAe,EACtB,aAAa,CAAC,EAAE,aAAa,EAC7B,iBAAiB,CAAC,EAAE,kBAAkB,GACrC,aAAa,CAmEf;AAuCD,KAAK,cAAc,CACjB,CAAC,SAAS,cAAc,GAAG,gBAAgB,EAC3C,CAAC,SAAS,KAAK,GAAG,UAAU,IAC1B,CAAC,SAAS,cAAc,GAAG,UAAU,EAAE,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAE9F,wBAAgB,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAClH,wBAAgB,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,gBAAgB,EAAE,CAAC,SAAS,KAAK,GAAG,UAAU,EACtG,OAAO,EAAE,CAAC,EACV,aAAa,EAAE;KAAG,CAAC,IAAI,CAAC,GAAG,IAAI;CAAE,GAChC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAmCxB,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,QAkClH"}
|
package/dist/storage/extract.js
CHANGED
|
@@ -15,12 +15,14 @@ const map_values_1 = require("../utils/map-values");
|
|
|
15
15
|
const pick_1 = require("../utils/pick");
|
|
16
16
|
const execall_1 = require("../utils/execall");
|
|
17
17
|
const namespace_1 = require("./namespace");
|
|
18
|
+
const error_1 = require("../error");
|
|
18
19
|
const currentLayoutVersion = '1.2';
|
|
19
20
|
function isCurrentLayoutVersion(layout) {
|
|
20
21
|
return layout?.layoutVersion === currentLayoutVersion;
|
|
21
22
|
}
|
|
22
23
|
function extractStorageLayout(contractDef, decodeSrc, deref, storageLayout, namespacedContext) {
|
|
23
24
|
const layout = { storage: [], types: {}, layoutVersion: currentLayoutVersion, flat: false };
|
|
25
|
+
loadBaseSlot(contractDef, decodeSrc, layout);
|
|
24
26
|
// The namespaced context will contain the types of namespaces that may not be included
|
|
25
27
|
// in the original storage layout.
|
|
26
28
|
// Some types will be present in both and they must be exactly equivalent.
|
|
@@ -79,6 +81,18 @@ function extractStorageLayout(contractDef, decodeSrc, deref, storageLayout, name
|
|
|
79
81
|
(0, namespace_1.loadNamespaces)(decodeSrc, layout, origContext, namespacedContext);
|
|
80
82
|
return layout;
|
|
81
83
|
}
|
|
84
|
+
function loadBaseSlot(contractDef, decodeSrc, layout) {
|
|
85
|
+
if (contractDef.storageLayout !== undefined) {
|
|
86
|
+
if (contractDef.storageLayout.baseSlotExpression.nodeType !== 'Literal') {
|
|
87
|
+
const src = decodeSrc(contractDef.storageLayout.baseSlotExpression);
|
|
88
|
+
// 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`.
|
|
89
|
+
// Then when comparing layouts in `storage/index.ts`, it will only be used when detailed storage layout is not available, and the comparison
|
|
90
|
+
// can be changed to a string comparison when `layout.baseSlot` not an integer literal.
|
|
91
|
+
throw new error_1.UpgradesError(`${src}: Custom storage layout expression with node type ${contractDef.storageLayout.baseSlotExpression.nodeType} is not currently supported`, () => 'Please report this at https://zpl.in/upgrades/report and include the `layout at` expression from your contract.');
|
|
92
|
+
}
|
|
93
|
+
layout.baseSlot = contractDef.storageLayout.baseSlotExpression.value ?? undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
82
96
|
const findTypeNames = (0, utils_1.findAll)([
|
|
83
97
|
'ArrayTypeName',
|
|
84
98
|
'ElementaryTypeName',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,uBAAuB,CAAC;AAIlF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,sBAAsB,EAAE,OAAO,GAC9B,IAAI,CAAC;AAER,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAChC,IAAI,CAAC;AAsCR,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAChC,yBAAyB,CAiC3B;AAeD,qBAAa,oBAAqB,SAAQ,aAAa;IACzC,QAAQ,CAAC,MAAM,EAAE,yBAAyB;gBAAjC,MAAM,EAAE,yBAAyB;CAGvD;AAGD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAWjC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -22,8 +22,10 @@ __exportStar(require("./compat"), exports);
|
|
|
22
22
|
const error_1 = require("../error");
|
|
23
23
|
const layout_1 = require("./layout");
|
|
24
24
|
const compare_1 = require("./compare");
|
|
25
|
+
const report_1 = require("./report");
|
|
25
26
|
const overrides_1 = require("../validate/overrides");
|
|
26
27
|
const log_1 = require("../utils/log");
|
|
28
|
+
const integer_literals_1 = require("../utils/integer-literals");
|
|
27
29
|
function assertStorageUpgradeSafe(original, updated, opts = false) {
|
|
28
30
|
if (typeof opts === 'boolean') {
|
|
29
31
|
const unsafeAllowCustomTypes = opts;
|
|
@@ -34,7 +36,28 @@ function assertStorageUpgradeSafe(original, updated, opts = false) {
|
|
|
34
36
|
throw new StorageUpgradeErrors(report);
|
|
35
37
|
}
|
|
36
38
|
}
|
|
39
|
+
function validateBaseSlotUnchanged(original, updated) {
|
|
40
|
+
const origNormalized = (0, integer_literals_1.normalizeUint256Literal)(original.baseSlot);
|
|
41
|
+
const updatedNormalized = (0, integer_literals_1.normalizeUint256Literal)(updated.baseSlot);
|
|
42
|
+
if (origNormalized !== updatedNormalized) {
|
|
43
|
+
throw new error_1.UpgradesError(`Base slot for custom storage layout changed from ${origNormalized} to ${updatedNormalized}`, () => `\
|
|
44
|
+
Do not change the base slot during upgrades when using custom storage layout.
|
|
45
|
+
|
|
46
|
+
If you need to change the base slot, ensure you also do the following:
|
|
47
|
+
1. Adjust all storage variables to continue using their original slots.
|
|
48
|
+
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
|
|
49
|
+
3. Recompile both the original and updated contracts.
|
|
50
|
+
4. Run the storage layout check again.`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
37
53
|
function getStorageUpgradeReport(original, updated, opts) {
|
|
54
|
+
if (opts.unsafeSkipStorageCheck) {
|
|
55
|
+
return new report_1.LayoutCompatibilityReport([]);
|
|
56
|
+
}
|
|
57
|
+
if (original.storage.some(item => item.slot === undefined) || updated.storage.some(item => item.slot === undefined)) {
|
|
58
|
+
// Compiler was not configured to output detailed storage layout with slot information
|
|
59
|
+
validateBaseSlotUnchanged(original, updated);
|
|
60
|
+
}
|
|
38
61
|
const originalDetailed = (0, layout_1.getDetailedLayout)(original);
|
|
39
62
|
const updatedDetailed = (0, layout_1.getDetailedLayout)(updated);
|
|
40
63
|
const originalDetailedNamespaces = getDetailedNamespacedLayout(original);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/layout.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface StorageLayout {
|
|
|
6
6
|
types: Record<string, TypeItem>;
|
|
7
7
|
flat?: boolean;
|
|
8
8
|
namespaces?: Record<string, StorageItem[]>;
|
|
9
|
+
baseSlot?: string;
|
|
9
10
|
}
|
|
10
11
|
export type StorageField<Type = string> = StorageItem<Type> | StructMember<Type>;
|
|
11
12
|
export interface StorageItem<Type = string> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAOnE,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAOnE,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,CAAC,IAAI,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AAEjF,MAAM,WAAW,WAAW,CAAC,IAAI,GAAG,MAAM;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ,CAAC,IAAI,GAAG,MAAM;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,CAAC,IAAI,GAAG,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;AAEjF,MAAM,WAAW,YAAY,CAAC,IAAI,GAAG,MAAM;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAyC1F;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,UAAU,EAAE,CAErF;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAE5F;AAED,MAAM,MAAM,sBAAsB,GAAG,YAAY,CAAC,kBAAkB,CAAC,GACnE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAElH,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,kBAAkB,CAAC,GAAG,KAAK,IAAI,sBAAsB,CAElG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":";;AA2DA,8CAyCC;AAED,sCAEC;AAED,0CAEC;AAKD,8BAEC;AAnHD,0DAAmE;AA2DnE,SAAgB,iBAAiB,CAAC,MAAqB;IACrD,MAAM,KAAK,GAAuC,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAEhD,SAAS,oBAAoB,CAA6B,IAAO;QAC/D,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,SAAS,kBAAkB,CAAC,MAAc;QACxC,MAAM,MAAM,GAAG,IAAA,2BAAW,EAAC,MAAM,CAAC,CAAC;QACnC,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,sBAAsB,CAAC,MAAoB;QAClD,IAAI,MAAM,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAuB;YACnC,GAAG,MAAM;YACT,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,GAAG,IAAI;gBACP,OAAO,EAAE,SAAS;gBAClB,UAAU,EAAE,SAAS;aACtB;SACF,CAAC;QAEF,wCAAwC;QACxC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;QAE5B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,OAAO;YACnB,IAAI,EAAE,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7G,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5G,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAI,OAA2B;IAC1D,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;AAChE,CAAC;AAED,SAAgB,eAAe,CAAI,OAA2B;IAC5D,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;AAChE,CAAC;AAKD,SAAgB,SAAS,CAAC,KAAuC;IAC/D,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC;AAC/G,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/storage/namespace.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,aAAa,EAA6B,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAkC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/storage/namespace.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,aAAa,EAA6B,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAkC,MAAM,WAAW,CAAC;AAO/E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,kBAAkB,EAC/B,iBAAiB,CAAC,EAAE,kBAAkB,QAiCvC;AA2ID;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,IAAI,sBAStD;AAwGD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,WAEvD"}
|
|
@@ -36,6 +36,9 @@ const annotations_1 = require("../utils/annotations");
|
|
|
36
36
|
const extract_1 = require("./extract");
|
|
37
37
|
const error_1 = require("../error");
|
|
38
38
|
const versions = __importStar(require("compare-versions"));
|
|
39
|
+
const integer_literals_1 = require("../utils/integer-literals");
|
|
40
|
+
const erc7201_1 = require("../utils/erc7201");
|
|
41
|
+
const log_1 = require("../utils/log");
|
|
39
42
|
/**
|
|
40
43
|
* Loads a contract's namespaces and namespaced type information into the storage layout.
|
|
41
44
|
*
|
|
@@ -66,8 +69,9 @@ function loadNamespaces(decodeSrc, layout, origContext, namespacedContext) {
|
|
|
66
69
|
const contractContext = { ...context, contractDef };
|
|
67
70
|
addContractNamespacesWithSrc(namespacesWithSrc, decodeSrc, layout, contractContext, origContractDef, origContext.contractDef.canonicalName ?? origContext.contractDef.name);
|
|
68
71
|
}
|
|
72
|
+
warnIfCustomLayoutAndNamespacesFound(namespacesWithSrc, decodeSrc, origContext.contractDef);
|
|
69
73
|
// Add to layout without the namespaced structs' src locations, since those are no longer needed
|
|
70
|
-
// as they were only used to give duplicate namespace errors above.
|
|
74
|
+
// as they were only used to give duplicate namespace errors in `addContractNamespacesWithSrc` above.
|
|
71
75
|
layout.namespaces = Object.fromEntries(Object.entries(namespacesWithSrc).map(([id, namespaceWithSrc]) => [id, namespaceWithSrc.namespace]));
|
|
72
76
|
}
|
|
73
77
|
class DuplicateNamespaceError extends error_1.UpgradesError {
|
|
@@ -80,6 +84,15 @@ The namespace ${id} was found in structs at the following locations:
|
|
|
80
84
|
Use a unique namespace id for each struct annotated with '@custom:storage-location erc7201:<NAMESPACE_ID>' in your contract and its inherited contracts.`);
|
|
81
85
|
}
|
|
82
86
|
}
|
|
87
|
+
class CustomLayoutClashWithNamespaceError extends error_1.UpgradesError {
|
|
88
|
+
constructor(id, contractName, src) {
|
|
89
|
+
super(`Custom layout for contract ${contractName} clashes with the storage location for namespace ${id}`, () => `\
|
|
90
|
+
The namespace ${id} is defined in a struct at the following location:
|
|
91
|
+
- ${src}
|
|
92
|
+
|
|
93
|
+
Specify a different custom layout for the contract or use a different namespace for the struct.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
83
96
|
/**
|
|
84
97
|
* Gets the contract definition for the given referenced id.
|
|
85
98
|
*/
|
|
@@ -111,6 +124,7 @@ function addContractNamespacesWithSrc(namespacesWithSrc, decodeSrc, layout, cont
|
|
|
111
124
|
throw new DuplicateNamespaceError(storageLocation, leastDerivedContractName, namespacesWithSrc[storageLocation].src, origSrc);
|
|
112
125
|
}
|
|
113
126
|
else {
|
|
127
|
+
checkCustomLayoutClashWithNamespace(origContractDef, storageLocation, leastDerivedContractName, origSrc);
|
|
114
128
|
namespacesWithSrc[storageLocation] = {
|
|
115
129
|
namespace: getNamespacedStorageItems(node, decodeSrc, layout, contractContext, origContractDef),
|
|
116
130
|
src: origSrc,
|
|
@@ -120,6 +134,38 @@ function addContractNamespacesWithSrc(namespacesWithSrc, decodeSrc, layout, cont
|
|
|
120
134
|
}
|
|
121
135
|
}
|
|
122
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Checks if a custom layout's base slot clashes with a namespace's base slot, and throws an error if it does.
|
|
139
|
+
*
|
|
140
|
+
* @param contractDef The contract definition to check.
|
|
141
|
+
* @param storageLocation The namespace storage location string, e.g. `erc7201:<NAMESPACE_ID>`.
|
|
142
|
+
* @param contractName The name of the contract.
|
|
143
|
+
* @param src The original source location of the struct with the namespace.
|
|
144
|
+
* @throws CustomLayoutClashWithNamespaceError if the custom layout clashes with the namespace.
|
|
145
|
+
*/
|
|
146
|
+
function checkCustomLayoutClashWithNamespace(contractDef, storageLocation, contractName, src) {
|
|
147
|
+
if (contractDef.storageLayout !== undefined && storageLocation.startsWith(erc7201_1.ERC7201_FORMULA_PREFIX)) {
|
|
148
|
+
const namespaceId = storageLocation.substring(erc7201_1.ERC7201_FORMULA_PREFIX.length);
|
|
149
|
+
const calculatedStorageLocation = (0, erc7201_1.calculateERC7201StorageLocation)(namespaceId);
|
|
150
|
+
if (contractDef.storageLayout.baseSlotExpression.nodeType === 'Literal') {
|
|
151
|
+
const baseSlotNormalized = (0, integer_literals_1.normalizeUint256Literal)(contractDef.storageLayout.baseSlotExpression.value); // TODO: when Solidity supports an erc7201 helper function, also check that for clash
|
|
152
|
+
if (baseSlotNormalized === calculatedStorageLocation) {
|
|
153
|
+
throw new CustomLayoutClashWithNamespaceError(storageLocation, contractName, src);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function warnIfCustomLayoutAndNamespacesFound(namespacesWithSrc, decodeSrc, origContractDef) {
|
|
159
|
+
// TODO: when Solidity supports an erc7201 helper function, only give this warning if the custom storage layout is not using the erc7201 helper function
|
|
160
|
+
if (Object.entries(namespacesWithSrc).length > 0 && origContractDef.storageLayout !== undefined) {
|
|
161
|
+
const contractName = origContractDef.canonicalName ?? origContractDef.name;
|
|
162
|
+
(0, log_1.logWarning)(`${decodeSrc(origContractDef.storageLayout)}: Ensure custom storage layout does not overlap with namespaced storage layout.`, [
|
|
163
|
+
`Contract \`${contractName}\` has both custom storage layout and namespaces.`,
|
|
164
|
+
'The Upgrades Plugin validates that they do not use the same base slot, but does not check for overlaps.',
|
|
165
|
+
"Ensure the base slot for the contract's `layout at` specifier is chosen such that its storage variables do not overlap with any namespaces.",
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
123
169
|
/**
|
|
124
170
|
* Gets the storage location string from the `@custom:storage-location` annotation.
|
|
125
171
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/storage/namespace.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/storage/namespace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-custom-layout.test.d.ts","sourceRoot":"","sources":["../src/storage-custom-layout.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ava_1 = __importDefault(require("ava"));
|
|
7
|
+
const utils_1 = require("solidity-ast/utils");
|
|
8
|
+
const hardhat_1 = require("hardhat");
|
|
9
|
+
const storage_1 = require("./storage");
|
|
10
|
+
const extract_1 = require("./storage/extract");
|
|
11
|
+
const stabilize_layout_1 = require("./utils/stabilize-layout");
|
|
12
|
+
const test = ava_1.default;
|
|
13
|
+
test.before(async (t) => {
|
|
14
|
+
const buildInfo = await hardhat_1.artifacts.getBuildInfo('contracts/test/CustomLayout.sol:CustomLayout');
|
|
15
|
+
if (buildInfo === undefined) {
|
|
16
|
+
throw new Error('Build info not found');
|
|
17
|
+
}
|
|
18
|
+
const solcOutput = buildInfo.output;
|
|
19
|
+
const contracts = {};
|
|
20
|
+
const storageLayouts = {};
|
|
21
|
+
for (const def of (0, utils_1.findAll)('ContractDefinition', solcOutput.sources['contracts/test/CustomLayout.sol'].ast)) {
|
|
22
|
+
contracts[def.name] = def;
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
24
|
+
storageLayouts[def.name] = solcOutput.contracts['contracts/test/CustomLayout.sol'][def.name].storageLayout;
|
|
25
|
+
}
|
|
26
|
+
const deref = (0, utils_1.astDereferencer)(solcOutput);
|
|
27
|
+
t.context.extractStorageLayout = name => (0, extract_1.extractStorageLayout)(contracts[name], dummyDecodeSrc, deref, storageLayouts[name]);
|
|
28
|
+
// For testing fallback behavior when storage layout is missing from compilation output
|
|
29
|
+
t.context.extractStorageLayoutFallback = name => (0, extract_1.extractStorageLayout)(contracts[name], dummyDecodeSrc, deref, undefined);
|
|
30
|
+
});
|
|
31
|
+
const dummyDecodeSrc = () => 'file.sol:1';
|
|
32
|
+
test('CustomLayout', t => {
|
|
33
|
+
const layout = t.context.extractStorageLayout('CustomLayout');
|
|
34
|
+
t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
|
|
35
|
+
});
|
|
36
|
+
test('CustomLayout - fallback', t => {
|
|
37
|
+
const layout = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
38
|
+
t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
|
|
39
|
+
});
|
|
40
|
+
test('CustomLayout same root - ok', t => {
|
|
41
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
42
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Same_Root_Ok');
|
|
43
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
44
|
+
t.deepEqual(comparison, []);
|
|
45
|
+
});
|
|
46
|
+
test('CustomLayout same root - fallback - ok', t => {
|
|
47
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
48
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Same_Root_Ok');
|
|
49
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
50
|
+
t.deepEqual(comparison, []);
|
|
51
|
+
});
|
|
52
|
+
test('CustomLayout same root decimal - ok', t => {
|
|
53
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
54
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Same_Root_Decimal_Ok');
|
|
55
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
56
|
+
t.deepEqual(comparison, []);
|
|
57
|
+
});
|
|
58
|
+
test('CustomLayout same root decimal - fallback - ok', t => {
|
|
59
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
60
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Same_Root_Decimal_Ok');
|
|
61
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
62
|
+
t.deepEqual(comparison, []);
|
|
63
|
+
});
|
|
64
|
+
test('CustomLayout same root scientific notation - ok', t => {
|
|
65
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
66
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Same_Root_ScientificNotation_Ok');
|
|
67
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
68
|
+
t.deepEqual(comparison, []);
|
|
69
|
+
});
|
|
70
|
+
test('CustomLayout same root scientific notation - fallback - ok', t => {
|
|
71
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
72
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Same_Root_ScientificNotation_Ok');
|
|
73
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
74
|
+
t.deepEqual(comparison, []);
|
|
75
|
+
});
|
|
76
|
+
test('CustomLayout changed root - bad', t => {
|
|
77
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
78
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Changed_Root_Bad');
|
|
79
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
80
|
+
t.like(comparison, {
|
|
81
|
+
length: 2,
|
|
82
|
+
0: {
|
|
83
|
+
kind: 'layoutchange',
|
|
84
|
+
change: {
|
|
85
|
+
slot: {
|
|
86
|
+
from: '1',
|
|
87
|
+
to: '2',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
original: { label: 'x' },
|
|
91
|
+
updated: { label: 'x' },
|
|
92
|
+
},
|
|
93
|
+
1: {
|
|
94
|
+
kind: 'layoutchange',
|
|
95
|
+
change: {
|
|
96
|
+
slot: {
|
|
97
|
+
from: '2',
|
|
98
|
+
to: '3',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
original: { label: 'y' },
|
|
102
|
+
updated: { label: 'y' },
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
test('CustomLayout changed root - fallback - bad', t => {
|
|
107
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
108
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_Root_Bad');
|
|
109
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
110
|
+
t.snapshot(error?.message);
|
|
111
|
+
});
|
|
112
|
+
test('CustomLayout changed root decimal - bad', t => {
|
|
113
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
114
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Changed_Root_Decimal_Bad');
|
|
115
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
116
|
+
t.like(comparison, {
|
|
117
|
+
length: 2,
|
|
118
|
+
0: {
|
|
119
|
+
kind: 'layoutchange',
|
|
120
|
+
change: {
|
|
121
|
+
slot: {
|
|
122
|
+
from: '1',
|
|
123
|
+
to: '2',
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
original: { label: 'x' },
|
|
127
|
+
updated: { label: 'x' },
|
|
128
|
+
},
|
|
129
|
+
1: {
|
|
130
|
+
kind: 'layoutchange',
|
|
131
|
+
change: {
|
|
132
|
+
slot: {
|
|
133
|
+
from: '2',
|
|
134
|
+
to: '3',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
original: { label: 'y' },
|
|
138
|
+
updated: { label: 'y' },
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
test('CustomLayout changed root decimal - fallback - bad', t => {
|
|
143
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
144
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_Root_Decimal_Bad');
|
|
145
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
146
|
+
t.snapshot(error?.message);
|
|
147
|
+
});
|
|
148
|
+
test('CustomLayout changed root scientific notation - bad', t => {
|
|
149
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
150
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Changed_Root_ScientificNotation_Bad');
|
|
151
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
152
|
+
t.like(comparison, {
|
|
153
|
+
length: 2,
|
|
154
|
+
0: {
|
|
155
|
+
kind: 'layoutchange',
|
|
156
|
+
change: {
|
|
157
|
+
slot: {
|
|
158
|
+
from: '1',
|
|
159
|
+
to: '20000000000',
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
original: { label: 'x' },
|
|
163
|
+
updated: { label: 'x' },
|
|
164
|
+
},
|
|
165
|
+
1: {
|
|
166
|
+
kind: 'layoutchange',
|
|
167
|
+
change: {
|
|
168
|
+
slot: {
|
|
169
|
+
from: '2',
|
|
170
|
+
to: '20000000001',
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
original: { label: 'y' },
|
|
174
|
+
updated: { label: 'y' },
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
test('CustomLayout changed root scientific notation - fallback - bad', t => {
|
|
179
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
180
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_Root_ScientificNotation_Bad');
|
|
181
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
182
|
+
t.snapshot(error?.message);
|
|
183
|
+
});
|
|
184
|
+
test('CustomLayout changed to default - bad', t => {
|
|
185
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
186
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Changed_To_Default_Bad');
|
|
187
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
188
|
+
t.like(comparison, {
|
|
189
|
+
length: 2,
|
|
190
|
+
0: {
|
|
191
|
+
kind: 'layoutchange',
|
|
192
|
+
change: {
|
|
193
|
+
slot: {
|
|
194
|
+
from: '1',
|
|
195
|
+
to: '0',
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
original: { label: 'x' },
|
|
199
|
+
updated: { label: 'x' },
|
|
200
|
+
},
|
|
201
|
+
1: {
|
|
202
|
+
kind: 'layoutchange',
|
|
203
|
+
change: {
|
|
204
|
+
slot: {
|
|
205
|
+
from: '2',
|
|
206
|
+
to: '1',
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
original: { label: 'y' },
|
|
210
|
+
updated: { label: 'y' },
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
test('CustomLayout changed to default - fallback - bad', t => {
|
|
215
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
216
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_To_Default_Bad');
|
|
217
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
218
|
+
t.snapshot(error?.message);
|
|
219
|
+
});
|
|
220
|
+
test('CustomLayout changed root - ok', t => {
|
|
221
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
222
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Changed_Root_Ok');
|
|
223
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
224
|
+
t.deepEqual(comparison, []);
|
|
225
|
+
});
|
|
226
|
+
test('CustomLayout changed root - fallback - bad (no layout info)', t => {
|
|
227
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
228
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_Root_Ok');
|
|
229
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
230
|
+
t.snapshot(error?.message);
|
|
231
|
+
});
|
|
232
|
+
test('CustomLayout changed root - fallback - unsafeSkipStorageCheck', t => {
|
|
233
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
234
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_Root_Ok');
|
|
235
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2, { unsafeSkipStorageCheck: true });
|
|
236
|
+
t.deepEqual(comparison, []);
|
|
237
|
+
});
|
|
238
|
+
test('CustomLayout changed to default - ok', t => {
|
|
239
|
+
const v1 = t.context.extractStorageLayout('CustomLayout');
|
|
240
|
+
const v2 = t.context.extractStorageLayout('CustomLayout_Changed_To_Default_Ok');
|
|
241
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
242
|
+
t.deepEqual(comparison, []);
|
|
243
|
+
});
|
|
244
|
+
test('CustomLayout changed to default - fallback - bad (no layout info)', t => {
|
|
245
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
246
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_To_Default_Ok');
|
|
247
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
248
|
+
t.snapshot(error?.message);
|
|
249
|
+
});
|
|
250
|
+
test('CustomLayout changed to default - fallback - unsafeSkipStorageCheck', t => {
|
|
251
|
+
const v1 = t.context.extractStorageLayoutFallback('CustomLayout');
|
|
252
|
+
const v2 = t.context.extractStorageLayoutFallback('CustomLayout_Changed_To_Default_Ok');
|
|
253
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2, { unsafeSkipStorageCheck: true });
|
|
254
|
+
t.deepEqual(comparison, []);
|
|
255
|
+
});
|
|
256
|
+
test('CustomLayout unsupported node type', t => {
|
|
257
|
+
const error = t.throws(() => t.context.extractStorageLayout('CustomLayout_Unsupported_Node_Type'));
|
|
258
|
+
t.snapshot(error?.message);
|
|
259
|
+
});
|
|
260
|
+
test('Namespaced - default to custom layout without regular variables - ok', t => {
|
|
261
|
+
const v1 = t.context.extractStorageLayout('Namespaced_Default_Layout');
|
|
262
|
+
const v2 = t.context.extractStorageLayout('Namespaced_Custom_Layout_Unaffected');
|
|
263
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
264
|
+
t.deepEqual(comparison, []);
|
|
265
|
+
});
|
|
266
|
+
test('Namespaced - default to custom layout without regular variables - fallback - ok', t => {
|
|
267
|
+
const v1 = t.context.extractStorageLayoutFallback('Namespaced_Default_Layout');
|
|
268
|
+
const v2 = t.context.extractStorageLayoutFallback('Namespaced_Custom_Layout_Unaffected');
|
|
269
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
270
|
+
t.deepEqual(comparison, []);
|
|
271
|
+
});
|
|
272
|
+
test('Namespaced - custom layout clash', t => {
|
|
273
|
+
const error = t.throws(() => t.context.extractStorageLayout('Namespaced_Custom_Layout_Clash'));
|
|
274
|
+
t.snapshot(error?.message);
|
|
275
|
+
});
|
|
276
|
+
test('Namespaced - custom layout clash decimal', t => {
|
|
277
|
+
const error = t.throws(() => t.context.extractStorageLayout('Namespaced_Custom_Layout_Clash_Decimal'));
|
|
278
|
+
t.snapshot(error?.message);
|
|
279
|
+
});
|
|
280
|
+
test('Namespaced - custom layout clash extra colon', t => {
|
|
281
|
+
const error = t.throws(() => t.context.extractStorageLayout('Namespaced_Custom_Layout_Clash_Extra_Colon'));
|
|
282
|
+
t.snapshot(error?.message);
|
|
283
|
+
});
|
|
284
|
+
test('CustomLayout no namespace formula - ok', t => {
|
|
285
|
+
const layout = t.context.extractStorageLayout('CustomLayout_No_Namespace_Formula');
|
|
286
|
+
t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
|
|
287
|
+
});
|
|
288
|
+
test('CustomLayout unknown namespace formula - ok', t => {
|
|
289
|
+
const layout = t.context.extractStorageLayout('CustomLayout_Unknown_Namespace_Formula');
|
|
290
|
+
t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
|
|
291
|
+
});
|
|
292
|
+
test('CustomLayout multiple namespaces', t => {
|
|
293
|
+
const layout = t.context.extractStorageLayout('CustomLayout_Multiple_Namespaces');
|
|
294
|
+
t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
|
|
295
|
+
});
|
|
296
|
+
test('Gap - changed root - ok', t => {
|
|
297
|
+
const v1 = t.context.extractStorageLayout('Gap');
|
|
298
|
+
const v2 = t.context.extractStorageLayout('Gap_Changed_Root_Ok');
|
|
299
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
300
|
+
t.deepEqual(comparison, []);
|
|
301
|
+
});
|
|
302
|
+
test('Gap - changed root - fallback - bad (no layout info)', t => {
|
|
303
|
+
const v1 = t.context.extractStorageLayoutFallback('Gap');
|
|
304
|
+
const v2 = t.context.extractStorageLayoutFallback('Gap_Changed_Root_Ok');
|
|
305
|
+
const error = t.throws(() => (0, storage_1.getStorageUpgradeErrors)(v1, v2));
|
|
306
|
+
t.snapshot(error?.message);
|
|
307
|
+
});
|
|
308
|
+
test('Gap - changed root - fallback - unsafeSkipStorageCheck', t => {
|
|
309
|
+
const v1 = t.context.extractStorageLayoutFallback('Gap');
|
|
310
|
+
const v2 = t.context.extractStorageLayoutFallback('Gap_Changed_Root_Ok');
|
|
311
|
+
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2, { unsafeSkipStorageCheck: true });
|
|
312
|
+
t.deepEqual(comparison, []);
|
|
313
|
+
});
|
|
314
|
+
//# sourceMappingURL=storage-custom-layout.test.js.map
|