@openzeppelin/upgrades-core 1.18.0 → 1.19.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/dist/levenshtein.d.ts +4 -1
- package/dist/levenshtein.d.ts.map +1 -1
- package/dist/levenshtein.js +1 -1
- package/dist/levenshtein.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -1
- package/dist/storage/compare.d.ts +21 -3
- package/dist/storage/compare.d.ts.map +1 -1
- package/dist/storage/compare.js +80 -17
- package/dist/storage/compare.js.map +1 -1
- package/dist/storage/gap.d.ts +18 -0
- package/dist/storage/gap.d.ts.map +1 -0
- package/dist/storage/gap.js +29 -0
- package/dist/storage/gap.js.map +1 -0
- package/dist/storage/report-gap.test.d.ts +2 -0
- package/dist/storage/report-gap.test.d.ts.map +1 -0
- package/dist/storage/report-gap.test.js +106 -0
- package/dist/storage/report-gap.test.js.map +1 -0
- package/dist/storage/report-rename-retype.test.js +24 -0
- package/dist/storage/report-rename-retype.test.js.map +1 -1
- package/dist/storage/report.d.ts +1 -1
- package/dist/storage/report.d.ts.map +1 -1
- package/dist/storage/report.js +59 -10
- package/dist/storage/report.js.map +1 -1
- package/dist/storage.test.js +421 -2
- package/dist/storage.test.js.map +1 -1
- package/dist/validate/data.js +25 -5
- package/dist/validate/data.js.map +1 -1
- package/package.json +3 -3
- package/src/levenshtein.ts +4 -2
- package/src/provider.ts +2 -0
- package/src/storage/compare.ts +88 -18
- package/src/storage/gap.ts +26 -0
- package/src/storage/report-gap.test.ts +119 -0
- package/src/storage/report-gap.test.ts.md +59 -0
- package/src/storage/report-gap.test.ts.snap +0 -0
- package/src/storage/report-rename-retype.test.ts +27 -0
- package/src/storage/report-rename-retype.test.ts.md +7 -0
- package/src/storage/report-rename-retype.test.ts.snap +0 -0
- package/src/storage/report.test.ts.md +1 -4
- package/src/storage/report.test.ts.snap +0 -0
- package/src/storage/report.ts +83 -12
- package/src/storage.test.ts +466 -2
- package/src/storage.test.ts.snap +0 -0
- package/src/validate/data.ts +1 -1
- package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +0 -160
package/dist/storage/report.js
CHANGED
|
@@ -5,9 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.LayoutCompatibilityReport = void 0;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const compare_1 = require("./compare");
|
|
8
9
|
const itemize_1 = require("../utils/itemize");
|
|
9
10
|
const indent_1 = require("../utils/indent");
|
|
10
11
|
const assert_1 = require("../utils/assert");
|
|
12
|
+
const gap_1 = require("./gap");
|
|
11
13
|
class LayoutCompatibilityReport {
|
|
12
14
|
constructor(ops) {
|
|
13
15
|
this.ops = ops;
|
|
@@ -33,25 +35,61 @@ class LayoutCompatibilityReport {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
exports.LayoutCompatibilityReport = LayoutCompatibilityReport;
|
|
38
|
+
function getExpectedGapSize(original, updated) {
|
|
39
|
+
const origEnd = (0, compare_1.storageFieldEnd)(original);
|
|
40
|
+
const updatedStart = (0, compare_1.storageFieldBegin)(updated);
|
|
41
|
+
const origNumBytes = original.type.item.numberOfBytes;
|
|
42
|
+
const origTail = original.type.tail;
|
|
43
|
+
if (origEnd === undefined || updatedStart === undefined || origNumBytes === undefined || origTail === undefined) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const bytesPerItem = BigInt(origNumBytes) / BigInt(parseInt(origTail, 10));
|
|
47
|
+
const expectedSizeBytes = origEnd - updatedStart;
|
|
48
|
+
return expectedSizeBytes / bytesPerItem;
|
|
49
|
+
}
|
|
50
|
+
function suggestGapSize(original, updated) {
|
|
51
|
+
const expectedSize = getExpectedGapSize(original, updated);
|
|
52
|
+
if (expectedSize !== undefined) {
|
|
53
|
+
return `Set __gap array to size ${expectedSize}`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
36
59
|
function explainStorageOperation(op, ctx) {
|
|
37
60
|
switch (op.kind) {
|
|
61
|
+
case 'shrinkgap':
|
|
38
62
|
case 'typechange': {
|
|
39
|
-
const basic = explainTypeChange(op.change);
|
|
63
|
+
const basic = explainTypeChange(op.change, op.original, op.updated);
|
|
40
64
|
const details = ctx.kind === 'layout' // explain details for layout only
|
|
41
65
|
? new Set(getAllTypeChanges(op.change)
|
|
42
66
|
.map(explainTypeChangeDetails)
|
|
43
67
|
.filter((d) => d !== undefined))
|
|
44
68
|
: [];
|
|
45
|
-
|
|
69
|
+
const hints = [];
|
|
70
|
+
if ((0, gap_1.isGap)(op.original) && op.change.kind === 'array shrink') {
|
|
71
|
+
hints.push(suggestGapSize(op.original, op.updated));
|
|
72
|
+
}
|
|
73
|
+
return printWithHints({
|
|
74
|
+
title: `Upgraded ${label(op.updated)} to an incompatible type\n` + (0, itemize_1.itemize)(basic, ...details),
|
|
75
|
+
hints,
|
|
76
|
+
});
|
|
46
77
|
}
|
|
78
|
+
case 'finishgap':
|
|
79
|
+
return `Converted end of storage gap ${label(op.original)} to ${label(op.updated)}`;
|
|
47
80
|
case 'rename':
|
|
48
81
|
return `Renamed ${label(op.original)} to ${label(op.updated)}`;
|
|
49
82
|
case 'replace':
|
|
50
83
|
return `Replaced ${label(op.original)} with ${label(op.updated)} of incompatible type`;
|
|
51
84
|
case 'layoutchange': {
|
|
52
|
-
|
|
85
|
+
const title = `Layout ${op.change.uncertain ? 'could have changed' : 'changed'} for ${label(op.updated)} ` +
|
|
53
86
|
`(${op.original.type.item.label} -> ${op.updated.type.item.label})\n` +
|
|
54
|
-
describeLayoutTransition(op.change)
|
|
87
|
+
describeLayoutTransition(op.change);
|
|
88
|
+
const hints = [];
|
|
89
|
+
if ((0, gap_1.isGap)(op.original)) {
|
|
90
|
+
hints.push(suggestGapSize(op.original, op.updated));
|
|
91
|
+
}
|
|
92
|
+
return printWithHints({ title, hints });
|
|
55
93
|
}
|
|
56
94
|
default: {
|
|
57
95
|
const title = explainBasicOperation(op, t => t.label);
|
|
@@ -76,11 +114,14 @@ function explainStorageOperation(op, ctx) {
|
|
|
76
114
|
break;
|
|
77
115
|
}
|
|
78
116
|
}
|
|
79
|
-
return
|
|
117
|
+
return printWithHints({ title, hints });
|
|
80
118
|
}
|
|
81
119
|
}
|
|
82
120
|
}
|
|
83
|
-
function
|
|
121
|
+
function printWithHints(result) {
|
|
122
|
+
return (result.title + '\n' + (0, itemize_1.itemizeWith)('>', ...result.hints)).trimEnd();
|
|
123
|
+
}
|
|
124
|
+
function explainTypeChange(ch, original, updated) {
|
|
84
125
|
switch (ch.kind) {
|
|
85
126
|
case 'visibility change':
|
|
86
127
|
return `Bad upgrade ${describeTransition(ch.original, ch.updated)}\nDifferent visibility`;
|
|
@@ -91,17 +132,25 @@ function explainTypeChange(ch) {
|
|
|
91
132
|
case 'enum resize':
|
|
92
133
|
return `Bad upgrade ${describeTransition(ch.original, ch.updated)}\nDifferent representation sizes`;
|
|
93
134
|
case 'mapping key':
|
|
94
|
-
return `In key of ${ch.updated.item.label}\n` + (0, itemize_1.itemize)(explainTypeChange(ch.inner));
|
|
135
|
+
return `In key of ${ch.updated.item.label}\n` + (0, itemize_1.itemize)(explainTypeChange(ch.inner, original, updated));
|
|
95
136
|
case 'mapping value':
|
|
96
137
|
case 'array value':
|
|
97
|
-
return `In ${ch.updated.item.label}\n` + (0, itemize_1.itemize)(explainTypeChange(ch.inner));
|
|
138
|
+
return `In ${ch.updated.item.label}\n` + (0, itemize_1.itemize)(explainTypeChange(ch.inner, original, updated));
|
|
98
139
|
case 'array shrink':
|
|
99
140
|
case 'array grow': {
|
|
100
141
|
(0, assert_1.assert)(ch.original.tail && ch.updated.tail);
|
|
101
142
|
const originalSize = parseInt(ch.original.tail, 10);
|
|
102
143
|
const updatedSize = parseInt(ch.updated.tail, 10);
|
|
103
|
-
|
|
104
|
-
|
|
144
|
+
if ((0, gap_1.isGap)(original)) {
|
|
145
|
+
const note = ch.kind === 'array shrink'
|
|
146
|
+
? 'Size decrease must match with corresponding variable inserts'
|
|
147
|
+
: 'Size cannot increase';
|
|
148
|
+
return `Bad storage gap resize from ${originalSize} to ${updatedSize}\n${note}`;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const note = ch.kind === 'array shrink' ? 'Size cannot decrease' : 'Size cannot increase here';
|
|
152
|
+
return `Bad array resize from ${originalSize} to ${updatedSize}\n${note}`;
|
|
153
|
+
}
|
|
105
154
|
}
|
|
106
155
|
case 'array dynamic': {
|
|
107
156
|
(0, assert_1.assert)(ch.original.tail && ch.updated.tail);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA2B;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.test.js
CHANGED
|
@@ -54,7 +54,7 @@ test('storage upgrade delete', t => {
|
|
|
54
54
|
const v2 = t.context.extractStorageLayout('StorageUpgrade_Delete_V2');
|
|
55
55
|
const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
|
|
56
56
|
t.like(comparison, {
|
|
57
|
-
length:
|
|
57
|
+
length: 2,
|
|
58
58
|
0: {
|
|
59
59
|
kind: 'delete',
|
|
60
60
|
original: {
|
|
@@ -65,6 +65,23 @@ test('storage upgrade delete', t => {
|
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
67
|
},
|
|
68
|
+
1: {
|
|
69
|
+
kind: 'layoutchange',
|
|
70
|
+
original: {
|
|
71
|
+
label: 'x2',
|
|
72
|
+
type: {
|
|
73
|
+
id: 't_address',
|
|
74
|
+
},
|
|
75
|
+
slot: '1',
|
|
76
|
+
},
|
|
77
|
+
updated: {
|
|
78
|
+
label: 'x2',
|
|
79
|
+
type: {
|
|
80
|
+
id: 't_address',
|
|
81
|
+
},
|
|
82
|
+
slot: '0',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
68
85
|
});
|
|
69
86
|
});
|
|
70
87
|
test('storage upgrade replace', t => {
|
|
@@ -160,7 +177,7 @@ test('storage upgrade with structs', t => {
|
|
|
160
177
|
change: {
|
|
161
178
|
kind: 'struct members',
|
|
162
179
|
ops: {
|
|
163
|
-
length:
|
|
180
|
+
length: 3,
|
|
164
181
|
0: { kind: 'delete' },
|
|
165
182
|
},
|
|
166
183
|
},
|
|
@@ -429,6 +446,408 @@ test('storage upgrade with embedded enum inside struct type', t => {
|
|
|
429
446
|
const v2 = t.context.extractStorageLayout('StorageUpgrade_StructEnum_V2');
|
|
430
447
|
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2), []);
|
|
431
448
|
});
|
|
449
|
+
test('storage upgrade with gap', t => {
|
|
450
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_Gap_V1');
|
|
451
|
+
const v2_Ok = t.context.extractStorageLayout('StorageUpgrade_Gap_V2_Ok');
|
|
452
|
+
const v2_Bad1 = t.context.extractStorageLayout('StorageUpgrade_Gap_V2_Bad1');
|
|
453
|
+
const v2_Bad2 = t.context.extractStorageLayout('StorageUpgrade_Gap_V2_Bad2');
|
|
454
|
+
const v2_Bad3 = t.context.extractStorageLayout('StorageUpgrade_Gap_V2_Bad3');
|
|
455
|
+
const v2_Bad4 = t.context.extractStorageLayout('StorageUpgrade_Gap_V2_Bad4');
|
|
456
|
+
const v2_Bad5 = t.context.extractStorageLayout('StorageUpgrade_Gap_V2_Bad5');
|
|
457
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2_Ok), []);
|
|
458
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad1), {
|
|
459
|
+
length: 2,
|
|
460
|
+
0: {
|
|
461
|
+
kind: 'layoutchange',
|
|
462
|
+
change: {
|
|
463
|
+
slot: {
|
|
464
|
+
from: '2',
|
|
465
|
+
to: '3',
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
original: { label: '__gap' },
|
|
469
|
+
updated: { label: '__gap' },
|
|
470
|
+
},
|
|
471
|
+
1: {
|
|
472
|
+
kind: 'layoutchange',
|
|
473
|
+
change: {
|
|
474
|
+
slot: {
|
|
475
|
+
from: '50',
|
|
476
|
+
to: '51',
|
|
477
|
+
},
|
|
478
|
+
},
|
|
479
|
+
original: { label: 'z' },
|
|
480
|
+
updated: { label: 'z' },
|
|
481
|
+
},
|
|
482
|
+
});
|
|
483
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad2), {
|
|
484
|
+
length: 2,
|
|
485
|
+
0: {
|
|
486
|
+
kind: 'delete',
|
|
487
|
+
original: { label: 'b' },
|
|
488
|
+
},
|
|
489
|
+
1: {
|
|
490
|
+
kind: 'typechange',
|
|
491
|
+
change: { kind: 'array grow' },
|
|
492
|
+
},
|
|
493
|
+
});
|
|
494
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad3), {
|
|
495
|
+
length: 2,
|
|
496
|
+
0: {
|
|
497
|
+
kind: 'typechange',
|
|
498
|
+
change: { kind: 'array shrink' },
|
|
499
|
+
},
|
|
500
|
+
1: {
|
|
501
|
+
kind: 'layoutchange',
|
|
502
|
+
change: {
|
|
503
|
+
slot: {
|
|
504
|
+
from: '50',
|
|
505
|
+
to: '49',
|
|
506
|
+
},
|
|
507
|
+
},
|
|
508
|
+
original: { label: 'z' },
|
|
509
|
+
updated: { label: 'z' },
|
|
510
|
+
},
|
|
511
|
+
});
|
|
512
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad4), {
|
|
513
|
+
length: 2,
|
|
514
|
+
0: {
|
|
515
|
+
kind: 'typechange',
|
|
516
|
+
change: { kind: 'array shrink' },
|
|
517
|
+
},
|
|
518
|
+
1: {
|
|
519
|
+
kind: 'layoutchange',
|
|
520
|
+
change: {
|
|
521
|
+
slot: {
|
|
522
|
+
from: '50',
|
|
523
|
+
to: '49',
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
original: { label: 'z' },
|
|
527
|
+
updated: { label: 'z' },
|
|
528
|
+
},
|
|
529
|
+
});
|
|
530
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad5), {
|
|
531
|
+
length: 2,
|
|
532
|
+
0: {
|
|
533
|
+
kind: 'typechange',
|
|
534
|
+
change: { kind: 'array shrink' },
|
|
535
|
+
original: { label: '__gap' },
|
|
536
|
+
updated: { label: '__gap' },
|
|
537
|
+
},
|
|
538
|
+
1: {
|
|
539
|
+
kind: 'layoutchange',
|
|
540
|
+
change: {
|
|
541
|
+
slot: {
|
|
542
|
+
from: '50',
|
|
543
|
+
to: '51',
|
|
544
|
+
},
|
|
545
|
+
},
|
|
546
|
+
original: { label: 'z' },
|
|
547
|
+
updated: { label: 'z' },
|
|
548
|
+
},
|
|
549
|
+
});
|
|
550
|
+
});
|
|
551
|
+
test('storage upgrade with bytes32 gap', t => {
|
|
552
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V1');
|
|
553
|
+
const v2_Ok = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V2_Ok');
|
|
554
|
+
const v2_Bad1 = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V2_Bad1');
|
|
555
|
+
const v2_Bad2 = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V2_Bad2');
|
|
556
|
+
const v2_Bad3 = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V2_Bad3');
|
|
557
|
+
const v2_Bad4 = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V2_Bad4');
|
|
558
|
+
const v2_Bad5 = t.context.extractStorageLayout('StorageUpgrade_Bytes32Gap_V2_Bad5');
|
|
559
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2_Ok), []);
|
|
560
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad1), {
|
|
561
|
+
length: 2,
|
|
562
|
+
0: {
|
|
563
|
+
kind: 'layoutchange',
|
|
564
|
+
change: {
|
|
565
|
+
slot: {
|
|
566
|
+
from: '2',
|
|
567
|
+
to: '3',
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
original: { label: '__gap' },
|
|
571
|
+
updated: { label: '__gap' },
|
|
572
|
+
},
|
|
573
|
+
1: {
|
|
574
|
+
kind: 'layoutchange',
|
|
575
|
+
change: {
|
|
576
|
+
slot: {
|
|
577
|
+
from: '50',
|
|
578
|
+
to: '51',
|
|
579
|
+
},
|
|
580
|
+
},
|
|
581
|
+
original: { label: 'z' },
|
|
582
|
+
updated: { label: 'z' },
|
|
583
|
+
},
|
|
584
|
+
});
|
|
585
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad2), {
|
|
586
|
+
length: 2,
|
|
587
|
+
0: {
|
|
588
|
+
kind: 'delete',
|
|
589
|
+
original: { label: 'b' },
|
|
590
|
+
},
|
|
591
|
+
1: {
|
|
592
|
+
kind: 'typechange',
|
|
593
|
+
change: { kind: 'array grow' },
|
|
594
|
+
},
|
|
595
|
+
});
|
|
596
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad3), {
|
|
597
|
+
length: 2,
|
|
598
|
+
0: {
|
|
599
|
+
kind: 'typechange',
|
|
600
|
+
change: { kind: 'array shrink' },
|
|
601
|
+
},
|
|
602
|
+
1: {
|
|
603
|
+
kind: 'layoutchange',
|
|
604
|
+
change: {
|
|
605
|
+
slot: {
|
|
606
|
+
from: '50',
|
|
607
|
+
to: '49',
|
|
608
|
+
},
|
|
609
|
+
},
|
|
610
|
+
original: { label: 'z' },
|
|
611
|
+
updated: { label: 'z' },
|
|
612
|
+
},
|
|
613
|
+
});
|
|
614
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad4), {
|
|
615
|
+
length: 2,
|
|
616
|
+
0: {
|
|
617
|
+
kind: 'typechange',
|
|
618
|
+
change: { kind: 'array shrink' },
|
|
619
|
+
},
|
|
620
|
+
1: {
|
|
621
|
+
kind: 'layoutchange',
|
|
622
|
+
change: {
|
|
623
|
+
slot: {
|
|
624
|
+
from: '50',
|
|
625
|
+
to: '49',
|
|
626
|
+
},
|
|
627
|
+
},
|
|
628
|
+
original: { label: 'z' },
|
|
629
|
+
updated: { label: 'z' },
|
|
630
|
+
},
|
|
631
|
+
});
|
|
632
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad5), {
|
|
633
|
+
length: 2,
|
|
634
|
+
0: {
|
|
635
|
+
kind: 'typechange',
|
|
636
|
+
change: { kind: 'array shrink' },
|
|
637
|
+
original: { label: '__gap' },
|
|
638
|
+
updated: { label: '__gap' },
|
|
639
|
+
},
|
|
640
|
+
1: {
|
|
641
|
+
kind: 'layoutchange',
|
|
642
|
+
change: {
|
|
643
|
+
slot: {
|
|
644
|
+
from: '50',
|
|
645
|
+
to: '51',
|
|
646
|
+
},
|
|
647
|
+
},
|
|
648
|
+
original: { label: 'z' },
|
|
649
|
+
updated: { label: 'z' },
|
|
650
|
+
},
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
test('storage upgrade with multiple items consuming a gap', t => {
|
|
654
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_MultiConsumeGap_V1');
|
|
655
|
+
const v2_Ok = t.context.extractStorageLayout('StorageUpgrade_MultiConsumeGap_V2_Ok');
|
|
656
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2_Ok), []);
|
|
657
|
+
});
|
|
658
|
+
test('storage upgrade that consumes gap and inherited gap', t => {
|
|
659
|
+
const v1a = t.context.extractStorageLayout('StorageUpgrade_EndGap_V1a');
|
|
660
|
+
const v1b = t.context.extractStorageLayout('StorageUpgrade_EndGap_V1b');
|
|
661
|
+
const v1c = t.context.extractStorageLayout('StorageUpgrade_EndGap_V1c');
|
|
662
|
+
const v2a = t.context.extractStorageLayout('StorageUpgrade_EndGap_V2a');
|
|
663
|
+
const v2b = t.context.extractStorageLayout('StorageUpgrade_EndGap_V2b');
|
|
664
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1a, v2a), []);
|
|
665
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1b, v2a), {
|
|
666
|
+
length: 1,
|
|
667
|
+
0: {
|
|
668
|
+
kind: 'delete',
|
|
669
|
+
original: { label: '__gap' },
|
|
670
|
+
},
|
|
671
|
+
});
|
|
672
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1c, v2a), {
|
|
673
|
+
length: 2,
|
|
674
|
+
0: {
|
|
675
|
+
kind: 'delete',
|
|
676
|
+
original: { label: '__gap' },
|
|
677
|
+
},
|
|
678
|
+
1: {
|
|
679
|
+
kind: 'delete',
|
|
680
|
+
original: { label: 'b' },
|
|
681
|
+
},
|
|
682
|
+
});
|
|
683
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1b, v2b), []);
|
|
684
|
+
});
|
|
685
|
+
test('storage upgrade that consumes gap and inherited gap with smaller data type', t => {
|
|
686
|
+
const v1a = t.context.extractStorageLayout('StorageUpgrade_EndGap_Uint128_V1a');
|
|
687
|
+
const v1b = t.context.extractStorageLayout('StorageUpgrade_EndGap_Uint128_V1b');
|
|
688
|
+
const v1c = t.context.extractStorageLayout('StorageUpgrade_EndGap_Uint128_V1c');
|
|
689
|
+
const v2a = t.context.extractStorageLayout('StorageUpgrade_EndGap_Uint128_V2a');
|
|
690
|
+
const v2b = t.context.extractStorageLayout('StorageUpgrade_EndGap_Uint128_V2b');
|
|
691
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1a, v2a), []);
|
|
692
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1b, v2a), {
|
|
693
|
+
length: 1,
|
|
694
|
+
0: {
|
|
695
|
+
kind: 'delete',
|
|
696
|
+
original: { label: '__gap' },
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1c, v2a), {
|
|
700
|
+
length: 2,
|
|
701
|
+
0: {
|
|
702
|
+
kind: 'delete',
|
|
703
|
+
original: { label: '__gap' },
|
|
704
|
+
},
|
|
705
|
+
1: {
|
|
706
|
+
kind: 'delete',
|
|
707
|
+
original: { label: 'b' },
|
|
708
|
+
},
|
|
709
|
+
});
|
|
710
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1b, v2b), []);
|
|
711
|
+
});
|
|
712
|
+
test('storage upgrade with different typed gaps', t => {
|
|
713
|
+
const uint256gap_address_v1 = t.context.extractStorageLayout('StorageUpgrade_Uint256Gap_Address_V1');
|
|
714
|
+
const uint256gap_address_v2 = t.context.extractStorageLayout('StorageUpgrade_Uint256Gap_Address_V2');
|
|
715
|
+
const address_v1 = t.context.extractStorageLayout('StorageUpgrade_AddressGap_V1');
|
|
716
|
+
const address_v2 = t.context.extractStorageLayout('StorageUpgrade_AddressGap_V2');
|
|
717
|
+
const uint128_v1 = t.context.extractStorageLayout('StorageUpgrade_Uint128Gap_V1');
|
|
718
|
+
const uint128_v2_ok = t.context.extractStorageLayout('StorageUpgrade_Uint128Gap_V2_Ok');
|
|
719
|
+
const uint128_v2b_ok = t.context.extractStorageLayout('StorageUpgrade_Uint128Gap_V2b_Ok');
|
|
720
|
+
const uint128_v2_bad = t.context.extractStorageLayout('StorageUpgrade_Uint128Gap_V2_Bad');
|
|
721
|
+
const bool_v1 = t.context.extractStorageLayout('StorageUpgrade_BoolGap_V1');
|
|
722
|
+
const bool_v2_ok = t.context.extractStorageLayout('StorageUpgrade_BoolGap_V2_Ok');
|
|
723
|
+
const bool_v2_bad = t.context.extractStorageLayout('StorageUpgrade_BoolGap_V2_Bad');
|
|
724
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(uint256gap_address_v1, uint256gap_address_v2), []);
|
|
725
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(address_v1, address_v2), []);
|
|
726
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(uint128_v1, uint128_v2_ok), []);
|
|
727
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(uint128_v1, uint128_v2b_ok), []);
|
|
728
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(uint128_v1, uint128_v2_bad), {
|
|
729
|
+
length: 2,
|
|
730
|
+
0: {
|
|
731
|
+
kind: 'layoutchange',
|
|
732
|
+
change: {
|
|
733
|
+
slot: {
|
|
734
|
+
from: '1',
|
|
735
|
+
to: '2',
|
|
736
|
+
},
|
|
737
|
+
},
|
|
738
|
+
original: { label: '__gap' },
|
|
739
|
+
updated: { label: '__gap' },
|
|
740
|
+
},
|
|
741
|
+
1: {
|
|
742
|
+
kind: 'layoutchange',
|
|
743
|
+
change: {
|
|
744
|
+
slot: {
|
|
745
|
+
from: '26',
|
|
746
|
+
to: '27',
|
|
747
|
+
},
|
|
748
|
+
},
|
|
749
|
+
original: { label: 'z' },
|
|
750
|
+
updated: { label: 'z' },
|
|
751
|
+
},
|
|
752
|
+
});
|
|
753
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(bool_v1, bool_v2_ok), []);
|
|
754
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(bool_v1, bool_v2_bad), {
|
|
755
|
+
length: 2,
|
|
756
|
+
0: {
|
|
757
|
+
kind: 'typechange',
|
|
758
|
+
change: { kind: 'array shrink' },
|
|
759
|
+
original: { label: '__gap' },
|
|
760
|
+
updated: { label: '__gap' },
|
|
761
|
+
},
|
|
762
|
+
1: {
|
|
763
|
+
kind: 'typechange',
|
|
764
|
+
change: { kind: 'obvious mismatch' },
|
|
765
|
+
original: { label: 'z' },
|
|
766
|
+
updated: { label: 'z' },
|
|
767
|
+
},
|
|
768
|
+
});
|
|
769
|
+
});
|
|
770
|
+
test('storage upgrade with one element gap', t => {
|
|
771
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_Gap_One_Element_V1');
|
|
772
|
+
const v2_Ok = t.context.extractStorageLayout('StorageUpgrade_Gap_One_Element_V2_Ok');
|
|
773
|
+
const v2b_Ok = t.context.extractStorageLayout('StorageUpgrade_Gap_One_Element_V2b_Ok');
|
|
774
|
+
const v2_Bad = t.context.extractStorageLayout('StorageUpgrade_Gap_One_Element_V2_Bad');
|
|
775
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2_Ok), []);
|
|
776
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2b_Ok), []);
|
|
777
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad), {
|
|
778
|
+
length: 2,
|
|
779
|
+
0: {
|
|
780
|
+
kind: 'layoutchange',
|
|
781
|
+
change: {
|
|
782
|
+
slot: {
|
|
783
|
+
from: '2',
|
|
784
|
+
to: '3',
|
|
785
|
+
},
|
|
786
|
+
},
|
|
787
|
+
original: { label: '__gap' },
|
|
788
|
+
updated: { label: '__gap' },
|
|
789
|
+
},
|
|
790
|
+
1: {
|
|
791
|
+
kind: 'layoutchange',
|
|
792
|
+
change: {
|
|
793
|
+
slot: {
|
|
794
|
+
from: '3',
|
|
795
|
+
to: '4',
|
|
796
|
+
},
|
|
797
|
+
},
|
|
798
|
+
original: { label: 'z' },
|
|
799
|
+
updated: { label: 'z' },
|
|
800
|
+
},
|
|
801
|
+
});
|
|
802
|
+
});
|
|
803
|
+
test('storage upgrade with bool non-array named as __gap', t => {
|
|
804
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_Gap_Bool_Not_Array_V1');
|
|
805
|
+
const v2_Bad = t.context.extractStorageLayout('StorageUpgrade_Gap_Bool_Not_Array_V2_Bad');
|
|
806
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad), {
|
|
807
|
+
length: 1,
|
|
808
|
+
0: {
|
|
809
|
+
kind: 'rename',
|
|
810
|
+
original: { label: '__gap' },
|
|
811
|
+
updated: { label: 'c' },
|
|
812
|
+
},
|
|
813
|
+
});
|
|
814
|
+
});
|
|
815
|
+
test('storage upgrade with uint256 non-array named as __gap', t => {
|
|
816
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_Gap_Uint256_Not_Array_V1');
|
|
817
|
+
const v2_Bad = t.context.extractStorageLayout('StorageUpgrade_Gap_Uint256_Not_Array_V2_Bad');
|
|
818
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad), {
|
|
819
|
+
length: 1,
|
|
820
|
+
0: {
|
|
821
|
+
kind: 'rename',
|
|
822
|
+
original: { label: '__gap' },
|
|
823
|
+
updated: { label: 'c' },
|
|
824
|
+
},
|
|
825
|
+
});
|
|
826
|
+
});
|
|
827
|
+
test('storage upgrade with struct gap', t => {
|
|
828
|
+
const v1 = t.context.extractStorageLayout('StorageUpgrade_StructGap_V1');
|
|
829
|
+
const v2_Ok = t.context.extractStorageLayout('StorageUpgrade_StructGap_V2_Ok');
|
|
830
|
+
const v2_Bad = t.context.extractStorageLayout('StorageUpgrade_StructGap_V2_Bad');
|
|
831
|
+
t.deepEqual((0, storage_1.getStorageUpgradeErrors)(v1, v2_Ok), []);
|
|
832
|
+
t.like((0, storage_1.getStorageUpgradeErrors)(v1, v2_Bad), {
|
|
833
|
+
length: 3,
|
|
834
|
+
0: {
|
|
835
|
+
kind: 'typechange',
|
|
836
|
+
original: { label: 'store_mapping' },
|
|
837
|
+
updated: { label: 'store_mapping' },
|
|
838
|
+
},
|
|
839
|
+
1: {
|
|
840
|
+
kind: 'typechange',
|
|
841
|
+
original: { label: 'store_fixed_array' },
|
|
842
|
+
updated: { label: 'store_fixed_array' },
|
|
843
|
+
},
|
|
844
|
+
2: {
|
|
845
|
+
kind: 'typechange',
|
|
846
|
+
original: { label: 'store_dynamic_array' },
|
|
847
|
+
updated: { label: 'store_dynamic_array' },
|
|
848
|
+
},
|
|
849
|
+
});
|
|
850
|
+
});
|
|
432
851
|
function stabilizeStorageLayout(layout) {
|
|
433
852
|
return {
|
|
434
853
|
storage: layout.storage.map(s => ({ ...s, type: (0, type_id_1.stabilizeTypeIdentifier)(s.type) })),
|