@openzeppelin/upgrades-core 1.13.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/storage/compare.d.ts +15 -4
- package/dist/storage/compare.d.ts.map +1 -1
- package/dist/storage/compare.js +46 -4
- package/dist/storage/compare.js.map +1 -1
- package/dist/storage/extract.d.ts.map +1 -1
- package/dist/storage/extract.js +39 -19
- package/dist/storage/extract.js.map +1 -1
- package/dist/storage/layout.d.ts +14 -0
- package/dist/storage/layout.d.ts.map +1 -1
- package/dist/storage/layout.js +6 -2
- package/dist/storage/layout.js.map +1 -1
- package/dist/storage/report-rename-retype.test.d.ts +2 -0
- package/dist/storage/report-rename-retype.test.d.ts.map +1 -0
- package/dist/storage/report-rename-retype.test.js +93 -0
- package/dist/storage/report-rename-retype.test.js.map +1 -0
- package/dist/storage/report.d.ts.map +1 -1
- package/dist/storage/report.js +32 -2
- package/dist/storage/report.js.map +1 -1
- package/dist/storage/report.test.js +6 -0
- package/dist/storage/report.test.js.map +1 -1
- package/dist/storage.test.js +10 -2
- package/dist/storage.test.js.map +1 -1
- package/dist/utils/execall.d.ts +2 -0
- package/dist/utils/execall.d.ts.map +1 -0
- package/dist/utils/execall.js +17 -0
- package/dist/utils/execall.js.map +1 -0
- package/package.json +2 -2
- package/src/storage/compare.ts +57 -8
- package/src/storage/extract.ts +42 -29
- package/src/storage/layout.ts +17 -2
- package/src/storage/report-rename-retype.test.ts +106 -0
- package/src/storage/report-rename-retype.test.ts.md +44 -0
- package/src/storage/report-rename-retype.test.ts.snap +0 -0
- package/src/storage/report.test.ts +7 -0
- package/src/storage/report.test.ts.md +11 -0
- package/src/storage/report.test.ts.snap +0 -0
- package/src/storage/report.ts +39 -4
- package/src/storage.test.ts +12 -2
- package/src/storage.test.ts.md +348 -109
- package/src/storage.test.ts.snap +0 -0
- package/src/utils/execall.ts +11 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Operation } from '../levenshtein';
|
|
2
|
-
import { ParsedTypeDetailed
|
|
3
|
-
import { StructMember as _StructMember } from './layout';
|
|
2
|
+
import { ParsedTypeDetailed } from './layout';
|
|
3
|
+
import { StorageItem as _StorageItem, StructMember as _StructMember, StorageField as _StorageField } from './layout';
|
|
4
4
|
import { LayoutCompatibilityReport } from './report';
|
|
5
5
|
export declare type StorageItem = _StorageItem<ParsedTypeDetailed>;
|
|
6
6
|
declare type StructMember = _StructMember<ParsedTypeDetailed>;
|
|
7
|
-
export declare type StorageField =
|
|
7
|
+
export declare type StorageField = _StorageField<ParsedTypeDetailed>;
|
|
8
8
|
export declare type StorageOperation<F extends StorageField> = Operation<F, StorageFieldChange<F>>;
|
|
9
9
|
export declare type EnumOperation = Operation<string, {
|
|
10
10
|
kind: 'replace';
|
|
@@ -16,12 +16,15 @@ declare type StorageFieldChange<F extends StorageField> = ({
|
|
|
16
16
|
} | {
|
|
17
17
|
kind: 'typechange';
|
|
18
18
|
change: TypeChange;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'layoutchange';
|
|
21
|
+
change: LayoutChange;
|
|
19
22
|
}) & {
|
|
20
23
|
original: F;
|
|
21
24
|
updated: F;
|
|
22
25
|
};
|
|
23
26
|
export declare type TypeChange = ({
|
|
24
|
-
kind: 'obvious mismatch' | 'unknown' | 'array grow' | 'array shrink' | 'array dynamic' | 'enum resize' | 'missing members';
|
|
27
|
+
kind: 'obvious mismatch' | 'unknown' | 'array grow' | 'visibility change' | 'array shrink' | 'array dynamic' | 'enum resize' | 'missing members';
|
|
25
28
|
} | {
|
|
26
29
|
kind: 'mapping key' | 'mapping value' | 'array value';
|
|
27
30
|
inner: TypeChange;
|
|
@@ -36,6 +39,12 @@ export declare type TypeChange = ({
|
|
|
36
39
|
original: ParsedTypeDetailed;
|
|
37
40
|
updated: ParsedTypeDetailed;
|
|
38
41
|
};
|
|
42
|
+
export interface LayoutChange {
|
|
43
|
+
uncertain?: boolean;
|
|
44
|
+
slot?: Record<'from' | 'to', string>;
|
|
45
|
+
offset?: Record<'from' | 'to', number>;
|
|
46
|
+
bytes?: Record<'from' | 'to', string>;
|
|
47
|
+
}
|
|
39
48
|
export declare class StorageLayoutComparator {
|
|
40
49
|
readonly unsafeAllowCustomTypes: boolean;
|
|
41
50
|
readonly unsafeAllowRenames: boolean;
|
|
@@ -45,7 +54,9 @@ export declare class StorageLayoutComparator {
|
|
|
45
54
|
constructor(unsafeAllowCustomTypes?: boolean, unsafeAllowRenames?: boolean);
|
|
46
55
|
compareLayouts(original: StorageItem[], updated: StorageItem[]): LayoutCompatibilityReport;
|
|
47
56
|
private layoutLevenshtein;
|
|
57
|
+
getVisibilityChange(original: ParsedTypeDetailed, updated: ParsedTypeDetailed): TypeChange | undefined;
|
|
48
58
|
getFieldChange<F extends StorageField>(original: F, updated: F): StorageFieldChange<F> | undefined;
|
|
59
|
+
getLayoutChange(original: StorageField, updated: StorageField): LayoutChange | undefined;
|
|
49
60
|
getTypeChange(original: ParsedTypeDetailed, updated: ParsedTypeDetailed, { allowAppend }: {
|
|
50
61
|
allowAppend: boolean;
|
|
51
62
|
}): TypeChange | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/storage/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/storage/compare.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/compare.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.StorageLayoutComparator = void 0;
|
|
4
4
|
const levenshtein_1 = require("../levenshtein");
|
|
5
|
-
const error_1 = require("../error");
|
|
6
5
|
const layout_1 = require("./layout");
|
|
6
|
+
const error_1 = require("../error");
|
|
7
7
|
const report_1 = require("./report");
|
|
8
8
|
const assert_1 = require("../utils/assert");
|
|
9
9
|
const is_value_type_1 = require("../utils/is-value-type");
|
|
@@ -28,10 +28,25 @@ class StorageLayoutComparator {
|
|
|
28
28
|
return ops;
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
getVisibilityChange(original, updated) {
|
|
32
|
+
const re = /^t_function_(internal|external)/;
|
|
33
|
+
const originalVisibility = original.head.match(re);
|
|
34
|
+
const updatedVisibility = updated.head.match(re);
|
|
35
|
+
(0, assert_1.assert)(originalVisibility && updatedVisibility);
|
|
36
|
+
if (originalVisibility[0] !== updatedVisibility[0]) {
|
|
37
|
+
return { kind: 'visibility change', original, updated };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
31
40
|
getFieldChange(original, updated) {
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
41
|
+
var _a, _b;
|
|
42
|
+
const nameChange = !this.unsafeAllowRenames && original.label !== ((_a = updated.renamedFrom) !== null && _a !== void 0 ? _a : updated.label);
|
|
43
|
+
const retypedFromOriginal = original.type.item.label === ((_b = updated.retypedFrom) === null || _b === void 0 ? void 0 : _b.trim());
|
|
44
|
+
const typeChange = !retypedFromOriginal && this.getTypeChange(original.type, updated.type, { allowAppend: false });
|
|
45
|
+
const layoutChange = this.getLayoutChange(original, updated);
|
|
46
|
+
if (updated.retypedFrom && layoutChange) {
|
|
47
|
+
return { kind: 'layoutchange', original, updated, change: layoutChange };
|
|
48
|
+
}
|
|
49
|
+
else if (typeChange && nameChange) {
|
|
35
50
|
return { kind: 'replace', original, updated };
|
|
36
51
|
}
|
|
37
52
|
else if (nameChange) {
|
|
@@ -40,6 +55,30 @@ class StorageLayoutComparator {
|
|
|
40
55
|
else if (typeChange) {
|
|
41
56
|
return { kind: 'typechange', change: typeChange, original, updated };
|
|
42
57
|
}
|
|
58
|
+
else if (layoutChange && !layoutChange.uncertain) {
|
|
59
|
+
// Any layout change should be caught earlier as a type change, but we
|
|
60
|
+
// add this check as a safety fallback.
|
|
61
|
+
return { kind: 'layoutchange', original, updated, change: layoutChange };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
getLayoutChange(original, updated) {
|
|
65
|
+
const validPair = ['uint8', 'bool'];
|
|
66
|
+
const knownCompatibleTypes = validPair.includes(original.type.item.label) && validPair.includes(updated.type.item.label);
|
|
67
|
+
if (original.type.item.label == updated.type.item.label || knownCompatibleTypes) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
else if ((0, layout_1.hasLayout)(original) && (0, layout_1.hasLayout)(updated)) {
|
|
71
|
+
const change = (from, to) => (from === to ? undefined : { from, to });
|
|
72
|
+
const slot = change(original.slot, updated.slot);
|
|
73
|
+
const offset = change(original.offset, updated.offset);
|
|
74
|
+
const bytes = change(original.type.item.numberOfBytes, updated.type.item.numberOfBytes);
|
|
75
|
+
if (slot || offset || bytes) {
|
|
76
|
+
return { slot, offset, bytes };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return { uncertain: true };
|
|
81
|
+
}
|
|
43
82
|
}
|
|
44
83
|
getTypeChange(original, updated, { allowAppend }) {
|
|
45
84
|
const key = JSON.stringify({ original: original.id, updated: updated.id, allowAppend });
|
|
@@ -61,6 +100,9 @@ class StorageLayoutComparator {
|
|
|
61
100
|
}
|
|
62
101
|
uncachedGetTypeChange(original, updated, { allowAppend }) {
|
|
63
102
|
var _a, _b, _c, _d;
|
|
103
|
+
if (updated.head.startsWith('t_function')) {
|
|
104
|
+
return this.getVisibilityChange(original, updated);
|
|
105
|
+
}
|
|
64
106
|
if (original.head !== updated.head) {
|
|
65
107
|
return { kind: 'obvious mismatch', original, updated };
|
|
66
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/storage/compare.ts"],"names":[],"mappings":";;;AAAA,gDAAwD;
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/storage/compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAKnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAY,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAKnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAY,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAOtD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAErE;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,kBAAkB,EAC/B,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,eAAe,EACtB,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,GACxC,aAAa,CA8Cf"}
|
package/dist/storage/extract.js
CHANGED
|
@@ -9,6 +9,7 @@ const utils_1 = require("solidity-ast/utils");
|
|
|
9
9
|
const type_id_1 = require("../utils/type-id");
|
|
10
10
|
const map_values_1 = require("../utils/map-values");
|
|
11
11
|
const pick_1 = require("../utils/pick");
|
|
12
|
+
const execall_1 = require("../utils/execall");
|
|
12
13
|
const currentLayoutVersion = '1.1';
|
|
13
14
|
function isCurrentLayoutVersion(layout) {
|
|
14
15
|
return (layout === null || layout === void 0 ? void 0 : layout.layoutVersion) === currentLayoutVersion;
|
|
@@ -21,20 +22,21 @@ function extractStorageLayout(contractDef, decodeSrc, deref, storageLayout) {
|
|
|
21
22
|
var _a;
|
|
22
23
|
return {
|
|
23
24
|
label: m.label,
|
|
24
|
-
members: (_a = m.members) === null || _a === void 0 ? void 0 : _a.map(m =>
|
|
25
|
+
members: (_a = m.members) === null || _a === void 0 ? void 0 : _a.map(m => typeof m === 'string' ? m : (0, pick_1.pick)(m, ['label', 'type', 'offset', 'slot'])),
|
|
26
|
+
numberOfBytes: m.numberOfBytes,
|
|
25
27
|
};
|
|
26
28
|
});
|
|
27
29
|
for (const storage of storageLayout.storage) {
|
|
28
30
|
const origin = getOriginContract(contractDef, storage.astId, deref);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
(0, assert_1.default)(origin, `Did not find variable declaration node for '${storage.label}'`);
|
|
32
|
+
const { varDecl, contract } = origin;
|
|
33
|
+
const { renamedFrom, retypedFrom } = getRetypedRenamed(varDecl);
|
|
34
|
+
// Solc layout doesn't bring members for enums so we get them using the ast method
|
|
35
|
+
loadLayoutType(varDecl, layout, deref);
|
|
36
|
+
const { label, offset, slot, type } = storage;
|
|
37
|
+
const src = decodeSrc(varDecl);
|
|
38
|
+
layout.storage.push({ label, offset, slot, type, contract, src, retypedFrom, renamedFrom });
|
|
39
|
+
layout.flat = true;
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
42
|
else {
|
|
@@ -42,11 +44,14 @@ function extractStorageLayout(contractDef, decodeSrc, deref, storageLayout) {
|
|
|
42
44
|
if ((0, utils_1.isNodeType)('VariableDeclaration', varDecl)) {
|
|
43
45
|
if (!varDecl.constant && varDecl.mutability !== 'immutable') {
|
|
44
46
|
const type = (0, type_id_1.normalizeTypeIdentifier)(typeDescriptions(varDecl).typeIdentifier);
|
|
47
|
+
const { renamedFrom, retypedFrom } = getRetypedRenamed(varDecl);
|
|
45
48
|
layout.storage.push({
|
|
46
49
|
contract: contractDef.name,
|
|
47
50
|
label: varDecl.name,
|
|
48
51
|
type,
|
|
49
52
|
src: decodeSrc(varDecl),
|
|
53
|
+
retypedFrom,
|
|
54
|
+
renamedFrom,
|
|
50
55
|
});
|
|
51
56
|
loadLayoutType(varDecl, layout, deref);
|
|
52
57
|
}
|
|
@@ -83,15 +88,17 @@ function getTypeMembers(typeDef) {
|
|
|
83
88
|
}
|
|
84
89
|
}
|
|
85
90
|
function getOriginContract(contract, astId, deref) {
|
|
86
|
-
for (const id of contract.linearizedBaseContracts
|
|
91
|
+
for (const id of contract.linearizedBaseContracts) {
|
|
87
92
|
const parentContract = deref(['ContractDefinition'], id);
|
|
88
93
|
const varDecl = parentContract.nodes.find(n => n.id == astId);
|
|
89
94
|
if (varDecl && (0, utils_1.isNodeType)('VariableDeclaration', varDecl)) {
|
|
90
|
-
return
|
|
95
|
+
return { varDecl, contract: parentContract.name };
|
|
91
96
|
}
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
function loadLayoutType(varDecl, layout, deref) {
|
|
100
|
+
var _a, _b;
|
|
101
|
+
var _c, _d;
|
|
95
102
|
// Note: A UserDefinedTypeName can also refer to a ContractDefinition but we won't care about those.
|
|
96
103
|
const derefUserDefinedType = deref(['StructDefinition', 'EnumDefinition']);
|
|
97
104
|
(0, assert_1.default)(varDecl.typeName != null);
|
|
@@ -102,14 +109,10 @@ function loadLayoutType(varDecl, layout, deref) {
|
|
|
102
109
|
for (const typeName of typeNames.values()) {
|
|
103
110
|
const { typeIdentifier, typeString: label } = typeDescriptions(typeName);
|
|
104
111
|
const type = (0, type_id_1.normalizeTypeIdentifier)(typeIdentifier);
|
|
105
|
-
|
|
106
|
-
if (type in layout.types && (!hasMembers || layout.types[type].members !== undefined)) {
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
let members;
|
|
112
|
+
(_a = (_c = layout.types)[type]) !== null && _a !== void 0 ? _a : (_c[type] = { label });
|
|
110
113
|
if ('referencedDeclaration' in typeName && !/^t_contract\b/.test(type)) {
|
|
111
114
|
const typeDef = derefUserDefinedType(typeName.referencedDeclaration);
|
|
112
|
-
members = getTypeMembers(typeDef);
|
|
115
|
+
(_b = (_d = layout.types[type]).members) !== null && _b !== void 0 ? _b : (_d.members = getTypeMembers(typeDef));
|
|
113
116
|
// Recursively look for the types referenced in this definition and add them to the queue.
|
|
114
117
|
for (const typeName of findTypeNames(typeDef)) {
|
|
115
118
|
const { typeIdentifier } = typeDescriptions(typeName);
|
|
@@ -118,7 +121,24 @@ function loadLayoutType(varDecl, layout, deref) {
|
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
|
-
layout.types[type] = { label, members };
|
|
122
124
|
}
|
|
123
125
|
}
|
|
126
|
+
function getRetypedRenamed(varDecl) {
|
|
127
|
+
var _a, _b;
|
|
128
|
+
let retypedFrom, renamedFrom;
|
|
129
|
+
if ('documentation' in varDecl) {
|
|
130
|
+
const docs = typeof varDecl.documentation === 'string' ? varDecl.documentation : (_b = (_a = varDecl.documentation) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : '';
|
|
131
|
+
for (const { groups } of (0, execall_1.execall)(/^\s*(?:@(?<title>\w+)(?::(?<tag>[a-z][a-z-]*))? )?(?<args>(?:(?!^\s@\w+)[^])*)/m, docs)) {
|
|
132
|
+
if ((groups === null || groups === void 0 ? void 0 : groups.title) === 'custom') {
|
|
133
|
+
if (groups.tag === 'oz-retyped-from') {
|
|
134
|
+
retypedFrom = groups.args;
|
|
135
|
+
}
|
|
136
|
+
else if (groups.tag === 'oz-renamed-from') {
|
|
137
|
+
renamedFrom = groups.args;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { retypedFrom, renamedFrom };
|
|
143
|
+
}
|
|
124
144
|
//# sourceMappingURL=extract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAQ5B,8CAAyD;AAEzD,8CAA2D;AAG3D,oDAAgD;AAChD,wCAAqC;
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/storage/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/layout.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface StorageLayout {
|
|
|
5
5
|
types: Record<string, TypeItem>;
|
|
6
6
|
flat?: boolean;
|
|
7
7
|
}
|
|
8
|
+
export declare type StorageField<Type = string> = StorageItem<Type> | StructMember<Type>;
|
|
8
9
|
export interface StorageItem<Type = string> {
|
|
9
10
|
astId?: number;
|
|
10
11
|
contract: string;
|
|
@@ -13,15 +14,22 @@ export interface StorageItem<Type = string> {
|
|
|
13
14
|
src: string;
|
|
14
15
|
offset?: number;
|
|
15
16
|
slot?: string;
|
|
17
|
+
retypedFrom?: string;
|
|
18
|
+
renamedFrom?: string;
|
|
16
19
|
}
|
|
17
20
|
export interface TypeItem<Type = string> {
|
|
18
21
|
label: string;
|
|
19
22
|
members?: TypeItemMembers<Type>;
|
|
23
|
+
numberOfBytes?: string;
|
|
20
24
|
}
|
|
21
25
|
export declare type TypeItemMembers<Type = string> = StructMember<Type>[] | EnumMember[];
|
|
22
26
|
export interface StructMember<Type = string> {
|
|
23
27
|
label: string;
|
|
24
28
|
type: Type;
|
|
29
|
+
retypedFrom?: string;
|
|
30
|
+
renamedFrom?: string;
|
|
31
|
+
offset?: number;
|
|
32
|
+
slot?: string;
|
|
25
33
|
}
|
|
26
34
|
export declare type EnumMember = string;
|
|
27
35
|
export interface ParsedTypeDetailed extends ParsedTypeId {
|
|
@@ -32,4 +40,10 @@ export interface ParsedTypeDetailed extends ParsedTypeId {
|
|
|
32
40
|
export declare function getDetailedLayout(layout: StorageLayout): StorageItem<ParsedTypeDetailed>[];
|
|
33
41
|
export declare function isEnumMembers<T>(members: TypeItemMembers<T>): members is EnumMember[];
|
|
34
42
|
export declare function isStructMembers<T>(members: TypeItemMembers<T>): members is StructMember<T>[];
|
|
43
|
+
export declare type StorageFieldWithLayout = StorageField<ParsedTypeDetailed> & Required<Pick<StorageField, 'offset' | 'slot'>> & {
|
|
44
|
+
type: {
|
|
45
|
+
item: Required<Pick<TypeItem, 'numberOfBytes'>>;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export declare function hasLayout(field: StorageField<ParsedTypeDetailed>): field is StorageFieldWithLayout;
|
|
35
49
|
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -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,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,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;
|
|
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,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,oBAAY,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;CACxB;AAED,oBAAY,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,oBAAY,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,CAoC1F;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,oBAAY,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"}
|
package/dist/storage/layout.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isStructMembers = exports.isEnumMembers = exports.getDetailedLayout = void 0;
|
|
3
|
+
exports.hasLayout = exports.isStructMembers = exports.isEnumMembers = exports.getDetailedLayout = void 0;
|
|
4
4
|
const parse_type_id_1 = require("../utils/parse-type-id");
|
|
5
5
|
function getDetailedLayout(layout) {
|
|
6
6
|
const cache = {};
|
|
@@ -28,7 +28,7 @@ function getDetailedLayout(layout) {
|
|
|
28
28
|
// store in cache before recursion below
|
|
29
29
|
cache[parsed.id] = detailed;
|
|
30
30
|
detailed.args = (_a = parsed.args) === null || _a === void 0 ? void 0 : _a.map(addDetailsToParsedType);
|
|
31
|
-
detailed.rets = (_b = parsed.
|
|
31
|
+
detailed.rets = (_b = parsed.rets) === null || _b === void 0 ? void 0 : _b.map(addDetailsToParsedType);
|
|
32
32
|
detailed.item.members =
|
|
33
33
|
(item === null || item === void 0 ? void 0 : item.members) && (isStructMembers(item === null || item === void 0 ? void 0 : item.members) ? item.members.map(parseWithDetails) : item === null || item === void 0 ? void 0 : item.members);
|
|
34
34
|
return detailed;
|
|
@@ -43,4 +43,8 @@ function isStructMembers(members) {
|
|
|
43
43
|
return members.length === 0 || typeof members[0] === 'object';
|
|
44
44
|
}
|
|
45
45
|
exports.isStructMembers = isStructMembers;
|
|
46
|
+
function hasLayout(field) {
|
|
47
|
+
return field.offset !== undefined && field.slot !== undefined && field.type.item.numberOfBytes !== undefined;
|
|
48
|
+
}
|
|
49
|
+
exports.hasLayout = hasLayout;
|
|
46
50
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":";;;AAAA,0DAAmE;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/storage/layout.ts"],"names":[],"mappings":";;;AAAA,0DAAmE;AAuDnE,SAAgB,iBAAiB,CAAC,MAAqB;IACrD,MAAM,KAAK,GAAuC,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE5C,SAAS,gBAAgB,CAA6B,IAAO;QAC3D,MAAM,MAAM,GAAG,IAAA,2BAAW,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACxC,CAAC;IAED,SAAS,sBAAsB,CAAC,MAAoB;;QAClD,IAAI,MAAM,CAAC,EAAE,IAAI,KAAK,EAAE;YACtB,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACzB;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;aACnB;SACF,CAAC;QAEF,wCAAwC;QACxC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;QAE5B,QAAQ,CAAC,IAAI,GAAG,MAAA,MAAM,CAAC,IAAI,0CAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,GAAG,MAAA,MAAM,CAAC,IAAI,0CAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,OAAO;YACnB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,KAAI,CAAC,eAAe,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC;QAEzG,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AApCD,8CAoCC;AAED,SAAgB,aAAa,CAAI,OAA2B;IAC1D,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;AAChE,CAAC;AAFD,sCAEC;AAED,SAAgB,eAAe,CAAI,OAA2B;IAC5D,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;AAChE,CAAC;AAFD,0CAEC;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;AAFD,8BAEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-rename-retype.test.d.ts","sourceRoot":"","sources":["../../src/storage/report-rename-retype.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
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 ast_dereferencer_1 = require("../ast-dereferencer");
|
|
10
|
+
const extract_1 = require("./extract");
|
|
11
|
+
const compare_1 = require("./compare");
|
|
12
|
+
const layout_1 = require("./layout");
|
|
13
|
+
const test = ava_1.default;
|
|
14
|
+
const dummyDecodeSrc = () => 'file.sol:1';
|
|
15
|
+
const testContracts = [
|
|
16
|
+
'contracts/test/RenamedRetyped.sol:RenameV1',
|
|
17
|
+
'contracts/test/RenamedRetyped.sol:RenameV2',
|
|
18
|
+
'contracts/test/RenamedRetyped.sol:RetypeV1',
|
|
19
|
+
'contracts/test/RenamedRetyped.sol:RetypeV2',
|
|
20
|
+
'contracts/test/RenamedRetyped.sol:WronglyReportedRetypeV3',
|
|
21
|
+
'contracts/test/RenamedRetyped.sol:MissmatchingTypeRetypeV4',
|
|
22
|
+
'contracts/test/RenamedRetyped.sol:ConfusingRetypeV1',
|
|
23
|
+
'contracts/test/RenamedRetyped.sol:ConfusingRetypeV2',
|
|
24
|
+
'contracts/test/RenamedRetyped.sol:NonHardcodedRetypeV1',
|
|
25
|
+
'contracts/test/RenamedRetyped.sol:NonHardcodedRetypeV2',
|
|
26
|
+
];
|
|
27
|
+
test.before(async (t) => {
|
|
28
|
+
const contracts = {};
|
|
29
|
+
const deref = {};
|
|
30
|
+
const storageLayout = {};
|
|
31
|
+
for (const contract of testContracts) {
|
|
32
|
+
const buildInfo = await hardhat_1.artifacts.getBuildInfo(contract);
|
|
33
|
+
if (buildInfo === undefined) {
|
|
34
|
+
throw new Error(`Build info not found for contract ${contract}`);
|
|
35
|
+
}
|
|
36
|
+
const solcOutput = buildInfo.output;
|
|
37
|
+
for (const def of (0, utils_1.findAll)('ContractDefinition', solcOutput.sources['contracts/test/RenamedRetyped.sol'].ast)) {
|
|
38
|
+
contracts[def.name] = def;
|
|
39
|
+
deref[def.name] = (0, ast_dereferencer_1.astDereferencer)(solcOutput);
|
|
40
|
+
storageLayout[def.name] = solcOutput.contracts['contracts/test/RenamedRetyped.sol'][def.name].storageLayout;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
t.context.extractStorageLayout = name => (0, extract_1.extractStorageLayout)(contracts[name], dummyDecodeSrc, deref[name], storageLayout[name]);
|
|
44
|
+
});
|
|
45
|
+
function getReport(original, updated) {
|
|
46
|
+
const originalDetailed = (0, layout_1.getDetailedLayout)(original);
|
|
47
|
+
const updatedDetailed = (0, layout_1.getDetailedLayout)(updated);
|
|
48
|
+
const comparator = new compare_1.StorageLayoutComparator();
|
|
49
|
+
return comparator.compareLayouts(originalDetailed, updatedDetailed);
|
|
50
|
+
}
|
|
51
|
+
test('succesful rename', t => {
|
|
52
|
+
const v1 = t.context.extractStorageLayout('RenameV1');
|
|
53
|
+
const v2 = t.context.extractStorageLayout('RenameV2');
|
|
54
|
+
const report = getReport(v1, v2);
|
|
55
|
+
t.true(report.ok);
|
|
56
|
+
t.snapshot(report.explain());
|
|
57
|
+
});
|
|
58
|
+
test('succesful retype', t => {
|
|
59
|
+
const v1 = t.context.extractStorageLayout('RetypeV1');
|
|
60
|
+
const v2 = t.context.extractStorageLayout('RetypeV2');
|
|
61
|
+
const report = getReport(v1, v2);
|
|
62
|
+
t.true(report.ok);
|
|
63
|
+
t.snapshot(report.explain());
|
|
64
|
+
});
|
|
65
|
+
test('wrongly reported retype', t => {
|
|
66
|
+
const v1 = t.context.extractStorageLayout('RetypeV1');
|
|
67
|
+
const v2 = t.context.extractStorageLayout('WronglyReportedRetypeV3');
|
|
68
|
+
const report = getReport(v1, v2);
|
|
69
|
+
t.false(report.ok);
|
|
70
|
+
t.snapshot(report.explain());
|
|
71
|
+
});
|
|
72
|
+
test('rightly reported retype but incompatible new type', t => {
|
|
73
|
+
const v1 = t.context.extractStorageLayout('RetypeV1');
|
|
74
|
+
const v2 = t.context.extractStorageLayout('MissmatchingTypeRetypeV4');
|
|
75
|
+
const report = getReport(v1, v2);
|
|
76
|
+
t.false(report.ok);
|
|
77
|
+
t.snapshot(report.explain());
|
|
78
|
+
});
|
|
79
|
+
test('confusing bad retype', t => {
|
|
80
|
+
const v1 = t.context.extractStorageLayout('ConfusingRetypeV1');
|
|
81
|
+
const v2 = t.context.extractStorageLayout('ConfusingRetypeV2');
|
|
82
|
+
const report = getReport(v1, v2);
|
|
83
|
+
t.false(report.ok);
|
|
84
|
+
t.snapshot(report.explain());
|
|
85
|
+
});
|
|
86
|
+
test('non-hardcoded retype', t => {
|
|
87
|
+
const v1 = t.context.extractStorageLayout('NonHardcodedRetypeV1');
|
|
88
|
+
const v2 = t.context.extractStorageLayout('NonHardcodedRetypeV2');
|
|
89
|
+
const report = getReport(v1, v2);
|
|
90
|
+
t.true(report.ok);
|
|
91
|
+
t.snapshot(report.explain());
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=report-rename-retype.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-rename-retype.test.js","sourceRoot":"","sources":["../../src/storage/report-rename-retype.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAoC;AAEpC,8CAA8D;AAC9D,qCAAoC;AACpC,0DAAsD;AACtD,uCAAiD;AACjD,uCAAoD;AACpD,qCAA4D;AAM5D,MAAM,IAAI,GAAG,aAAwB,CAAC;AAEtC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC;AAC1C,MAAM,aAAa,GAAG;IACpB,4CAA4C;IAC5C,4CAA4C;IAC5C,4CAA4C;IAC5C,4CAA4C;IAC5C,2DAA2D;IAC3D,4DAA4D;IAC5D,qDAAqD;IACrD,qDAAqD;IACrD,wDAAwD;IACxD,wDAAwD;CACzD,CAAC;AAEF,IAAI,CAAC,MAAM,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;IACpB,MAAM,SAAS,GAAuC,EAAE,CAAC;IACzD,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,MAAM,aAAa,GAAkC,EAAE,CAAC;IACxD,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;QACpC,MAAM,SAAS,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;SAClE;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,IAAA,eAAO,EAAC,oBAAoB,EAAE,UAAU,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,EAAE;YAC5G,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAA,kCAAe,EAAC,UAAU,CAAC,CAAC;YAC9C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GACrB,UAAU,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,IAAI,CACnE,CAAC,aAAa,CAAC;SACjB;KACF;IAED,CAAC,CAAC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,EAAE,CACtC,IAAA,8BAAoB,EAAC,SAAS,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5F,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,QAAuB,EAAE,OAAsB;IAChE,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,iCAAuB,EAAE,CAAC;IACjD,OAAO,UAAU,CAAC,cAAc,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC;AAED,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE;IAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE;IAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE;IAClC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE;IAC5D,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE;IAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE;IAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAyD,MAAM,WAAW,CAAC;AAKtH,qBAAa,yBAAyB;IACxB,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE;gBAApC,GAAG,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE;IAEzD,IAAI,EAAE,IAAI,OAAO,CAEhB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,OAAO,CAAC,KAAK,UAAO,GAAG,MAAM;CAiB9B"}
|
package/dist/storage/report.js
CHANGED
|
@@ -21,8 +21,12 @@ class LayoutCompatibilityReport {
|
|
|
21
21
|
explain(color = true) {
|
|
22
22
|
const chalk = new chalk_1.default.Instance({ level: color && chalk_1.default.supportsColor ? chalk_1.default.supportsColor.level : 0 });
|
|
23
23
|
const res = [];
|
|
24
|
-
for (const op of this.ops) {
|
|
24
|
+
for (const [i, op] of this.ops.entries()) {
|
|
25
25
|
const src = 'updated' in op ? op.updated.src : op.original.contract;
|
|
26
|
+
// Only print layoutchange if it's the first op, otherwise we assume it will be explained by previous ops.
|
|
27
|
+
if (op.kind === 'layoutchange' && i !== 0) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
26
30
|
res.push(chalk.bold(src) + ':' + (0, indent_1.indent)(explainStorageOperation(op, { kind: 'layout', allowAppend: true }), 2, 1));
|
|
27
31
|
}
|
|
28
32
|
return res.join('\n\n');
|
|
@@ -44,6 +48,11 @@ function explainStorageOperation(op, ctx) {
|
|
|
44
48
|
return `Renamed ${label(op.original)} to ${label(op.updated)}`;
|
|
45
49
|
case 'replace':
|
|
46
50
|
return `Replaced ${label(op.original)} with ${label(op.updated)} of incompatible type`;
|
|
51
|
+
case 'layoutchange': {
|
|
52
|
+
return (`Layout ${op.change.uncertain ? 'could have changed' : 'changed'} for ${label(op.updated)} ` +
|
|
53
|
+
`(${op.original.type.item.label} -> ${op.updated.type.item.label})\n` +
|
|
54
|
+
describeLayoutTransition(op.change)).trimEnd();
|
|
55
|
+
}
|
|
47
56
|
default: {
|
|
48
57
|
const title = explainBasicOperation(op, t => t.label);
|
|
49
58
|
const hints = [];
|
|
@@ -73,6 +82,8 @@ function explainStorageOperation(op, ctx) {
|
|
|
73
82
|
}
|
|
74
83
|
function explainTypeChange(ch) {
|
|
75
84
|
switch (ch.kind) {
|
|
85
|
+
case 'visibility change':
|
|
86
|
+
return `Bad upgrade ${describeTransition(ch.original, ch.updated)}\nDifferent visibility`;
|
|
76
87
|
case 'obvious mismatch':
|
|
77
88
|
case 'struct members':
|
|
78
89
|
case 'enum members':
|
|
@@ -141,7 +152,15 @@ function explainTypeChangeDetails(ch) {
|
|
|
141
152
|
case 'struct members': {
|
|
142
153
|
const { allowAppend } = ch;
|
|
143
154
|
return (`In ${ch.updated.item.label}\n` +
|
|
144
|
-
(0, itemize_1.itemize)(...ch.ops.
|
|
155
|
+
(0, itemize_1.itemize)(...ch.ops.flatMap((op, i) => {
|
|
156
|
+
if (op.kind === 'layoutchange' && i !== 0) {
|
|
157
|
+
// Only print layoutchange if it's the first op, otherwise we assume it will be explained by previous ops.
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
return [explainStorageOperation(op, { kind: 'struct', allowAppend })];
|
|
162
|
+
}
|
|
163
|
+
})));
|
|
145
164
|
}
|
|
146
165
|
case 'enum members':
|
|
147
166
|
return `In ${ch.updated.item.label}\n` + (0, itemize_1.itemize)(...ch.ops.map(explainEnumOperation));
|
|
@@ -175,6 +194,17 @@ function describeTransition(original, updated) {
|
|
|
175
194
|
return `from ${originalLabel} to ${updatedLabel}`;
|
|
176
195
|
}
|
|
177
196
|
}
|
|
197
|
+
function describeLayoutTransition(change) {
|
|
198
|
+
const res = [];
|
|
199
|
+
for (const k of ['slot', 'offset', 'bytes']) {
|
|
200
|
+
const ch = change[k];
|
|
201
|
+
if (ch) {
|
|
202
|
+
const label = (k === 'bytes' ? 'number of bytes' : k).replace(/^./, c => c.toUpperCase());
|
|
203
|
+
res.push(`${label} changed from ${ch.from} to ${ch.to}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return (0, itemize_1.itemize)(...res);
|
|
207
|
+
}
|
|
178
208
|
function label(variable) {
|
|
179
209
|
return '`' + variable.label + '`';
|
|
180
210
|
}
|