@openzeppelin/upgrades-core 1.28.0 → 1.30.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.
Files changed (178) hide show
  1. package/dist/call-optional-signature.d.ts +3 -0
  2. package/dist/call-optional-signature.d.ts.map +1 -0
  3. package/dist/call-optional-signature.js +24 -0
  4. package/dist/call-optional-signature.js.map +1 -0
  5. package/dist/cli/validate/build-info-file.d.ts +4 -0
  6. package/dist/cli/validate/build-info-file.d.ts.map +1 -1
  7. package/dist/cli/validate/build-info-file.js +5 -2
  8. package/dist/cli/validate/build-info-file.js.map +1 -1
  9. package/dist/cli/validate/build-info-file.test.js +4 -1
  10. package/dist/cli/validate/build-info-file.test.js.map +1 -1
  11. package/dist/cli/validate/upgradeability-assessment.js +2 -6
  12. package/dist/cli/validate/upgradeability-assessment.js.map +1 -1
  13. package/dist/cli/validate/validations.d.ts.map +1 -1
  14. package/dist/cli/validate/validations.js +5 -4
  15. package/dist/cli/validate/validations.js.map +1 -1
  16. package/dist/impl-address.d.ts.map +1 -1
  17. package/dist/impl-address.js +9 -16
  18. package/dist/impl-address.js.map +1 -1
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +5 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/levenshtein.d.ts +6 -0
  24. package/dist/levenshtein.d.ts.map +1 -1
  25. package/dist/levenshtein.js.map +1 -1
  26. package/dist/solc-api.d.ts +14 -0
  27. package/dist/solc-api.d.ts.map +1 -1
  28. package/dist/standalone.d.ts +4 -1
  29. package/dist/standalone.d.ts.map +1 -1
  30. package/dist/standalone.js +6 -3
  31. package/dist/standalone.js.map +1 -1
  32. package/dist/standalone.test.js +17 -0
  33. package/dist/standalone.test.js.map +1 -1
  34. package/dist/storage/compare.d.ts +2 -1
  35. package/dist/storage/compare.d.ts.map +1 -1
  36. package/dist/storage/compare.js +25 -2
  37. package/dist/storage/compare.js.map +1 -1
  38. package/dist/storage/extract.d.ts +15 -3
  39. package/dist/storage/extract.d.ts.map +1 -1
  40. package/dist/storage/extract.js +48 -21
  41. package/dist/storage/extract.js.map +1 -1
  42. package/dist/storage/index.d.ts.map +1 -1
  43. package/dist/storage/index.js +15 -1
  44. package/dist/storage/index.js.map +1 -1
  45. package/dist/storage/layout.d.ts +1 -0
  46. package/dist/storage/layout.d.ts.map +1 -1
  47. package/dist/storage/layout.js.map +1 -1
  48. package/dist/storage/namespace.d.ts +34 -0
  49. package/dist/storage/namespace.d.ts.map +1 -0
  50. package/dist/storage/namespace.js +191 -0
  51. package/dist/storage/namespace.js.map +1 -0
  52. package/dist/storage/report.js +6 -0
  53. package/dist/storage/report.js.map +1 -1
  54. package/dist/storage-namespaced-conflicts-layout.test.d.ts +2 -0
  55. package/dist/storage-namespaced-conflicts-layout.test.d.ts.map +1 -0
  56. package/dist/storage-namespaced-conflicts-layout.test.js +69 -0
  57. package/dist/storage-namespaced-conflicts-layout.test.js.map +1 -0
  58. package/dist/storage-namespaced-conflicts.test.d.ts +2 -0
  59. package/dist/storage-namespaced-conflicts.test.d.ts.map +1 -0
  60. package/dist/storage-namespaced-conflicts.test.js +45 -0
  61. package/dist/storage-namespaced-conflicts.test.js.map +1 -0
  62. package/dist/storage-namespaced-layout.test.d.ts +2 -0
  63. package/dist/storage-namespaced-layout.test.d.ts.map +1 -0
  64. package/dist/storage-namespaced-layout.test.js +59 -0
  65. package/dist/storage-namespaced-layout.test.js.map +1 -0
  66. package/dist/storage-namespaced-outside-contract.test.d.ts +2 -0
  67. package/dist/storage-namespaced-outside-contract.test.d.ts.map +1 -0
  68. package/dist/storage-namespaced-outside-contract.test.js +22 -0
  69. package/dist/storage-namespaced-outside-contract.test.js.map +1 -0
  70. package/dist/storage-namespaced-solc-versions.test.d.ts +2 -0
  71. package/dist/storage-namespaced-solc-versions.test.d.ts.map +1 -0
  72. package/dist/storage-namespaced-solc-versions.test.js +42 -0
  73. package/dist/storage-namespaced-solc-versions.test.js.map +1 -0
  74. package/dist/storage-namespaced-udvt.test.d.ts +2 -0
  75. package/dist/storage-namespaced-udvt.test.d.ts.map +1 -0
  76. package/dist/storage-namespaced-udvt.test.js +130 -0
  77. package/dist/storage-namespaced-udvt.test.js.map +1 -0
  78. package/dist/storage-namespaced.test.d.ts +2 -0
  79. package/dist/storage-namespaced.test.d.ts.map +1 -0
  80. package/dist/storage-namespaced.test.js +132 -0
  81. package/dist/storage-namespaced.test.js.map +1 -0
  82. package/dist/upgrade-interface-version.d.ts +3 -0
  83. package/dist/upgrade-interface-version.d.ts.map +1 -0
  84. package/dist/upgrade-interface-version.js +25 -0
  85. package/dist/upgrade-interface-version.js.map +1 -0
  86. package/dist/upgrade-interface-version.test.d.ts +2 -0
  87. package/dist/upgrade-interface-version.test.d.ts.map +1 -0
  88. package/dist/upgrade-interface-version.test.js +32 -0
  89. package/dist/upgrade-interface-version.test.js.map +1 -0
  90. package/dist/utils/annotations.d.ts +4 -0
  91. package/dist/utils/annotations.d.ts.map +1 -1
  92. package/dist/utils/annotations.js +9 -1
  93. package/dist/utils/annotations.js.map +1 -1
  94. package/dist/utils/make-namespaced.d.ts +20 -0
  95. package/dist/utils/make-namespaced.d.ts.map +1 -0
  96. package/dist/utils/make-namespaced.js +131 -0
  97. package/dist/utils/make-namespaced.js.map +1 -0
  98. package/dist/utils/make-namespaced.test.d.ts +2 -0
  99. package/dist/utils/make-namespaced.test.d.ts.map +1 -0
  100. package/dist/utils/make-namespaced.test.js +59 -0
  101. package/dist/utils/make-namespaced.test.js.map +1 -0
  102. package/dist/utils/stabilize-layout.d.ts +11 -0
  103. package/dist/utils/stabilize-layout.d.ts.map +1 -1
  104. package/dist/utils/stabilize-layout.js +5 -0
  105. package/dist/utils/stabilize-layout.js.map +1 -1
  106. package/dist/validate/overrides.js +1 -1
  107. package/dist/validate/overrides.js.map +1 -1
  108. package/dist/validate/query.d.ts.map +1 -1
  109. package/dist/validate/query.js +7 -3
  110. package/dist/validate/query.js.map +1 -1
  111. package/dist/validate/report.js +2 -2
  112. package/dist/validate/report.js.map +1 -1
  113. package/dist/validate/run.d.ts +18 -2
  114. package/dist/validate/run.d.ts.map +1 -1
  115. package/dist/validate/run.js +104 -2
  116. package/dist/validate/run.js.map +1 -1
  117. package/dist/validate.test.js +3 -0
  118. package/dist/validate.test.js.map +1 -1
  119. package/package.json +3 -3
  120. package/src/call-optional-signature.ts +20 -0
  121. package/src/cli/cli.test.ts.md +4 -4
  122. package/src/cli/cli.test.ts.snap +0 -0
  123. package/src/cli/validate/build-info-file.test.ts +4 -1
  124. package/src/cli/validate/build-info-file.ts +12 -2
  125. package/src/cli/validate/project-report.test.ts.md +4 -4
  126. package/src/cli/validate/project-report.test.ts.snap +0 -0
  127. package/src/cli/validate/upgradeability-assessment.ts +1 -6
  128. package/src/cli/validate/validate-upgrade-safety.test.ts.md +2 -2
  129. package/src/cli/validate/validate-upgrade-safety.test.ts.snap +0 -0
  130. package/src/cli/validate/validations.test.ts.md +2 -2
  131. package/src/cli/validate/validations.test.ts.snap +0 -0
  132. package/src/cli/validate/validations.ts +6 -5
  133. package/src/impl-address.ts +9 -20
  134. package/src/index.ts +3 -0
  135. package/src/levenshtein.ts +7 -0
  136. package/src/solc-api.ts +14 -0
  137. package/src/standalone.test.ts +26 -0
  138. package/src/standalone.ts +6 -2
  139. package/src/storage/compare.ts +34 -2
  140. package/src/storage/extract.ts +68 -20
  141. package/src/storage/index.ts +22 -1
  142. package/src/storage/layout.ts +1 -0
  143. package/src/storage/namespace.ts +262 -0
  144. package/src/storage/report.ts +8 -0
  145. package/src/storage-0.8.test.ts.md +4 -0
  146. package/src/storage-0.8.test.ts.snap +0 -0
  147. package/src/storage-memory-0.5.test.ts.md +2 -0
  148. package/src/storage-memory-0.5.test.ts.snap +0 -0
  149. package/src/storage-namespaced-conflicts-layout.test.ts +96 -0
  150. package/src/storage-namespaced-conflicts-layout.test.ts.md +53 -0
  151. package/src/storage-namespaced-conflicts-layout.test.ts.snap +0 -0
  152. package/src/storage-namespaced-conflicts.test.ts +54 -0
  153. package/src/storage-namespaced-conflicts.test.ts.md +53 -0
  154. package/src/storage-namespaced-conflicts.test.ts.snap +0 -0
  155. package/src/storage-namespaced-layout.test.ts +77 -0
  156. package/src/storage-namespaced-layout.test.ts.md +67 -0
  157. package/src/storage-namespaced-layout.test.ts.snap +0 -0
  158. package/src/storage-namespaced-outside-contract.test.ts +24 -0
  159. package/src/storage-namespaced-solc-versions.test.ts +59 -0
  160. package/src/storage-namespaced-udvt.test.ts +160 -0
  161. package/src/storage-namespaced.test.ts +146 -0
  162. package/src/storage-namespaced.test.ts.md +89 -0
  163. package/src/storage-namespaced.test.ts.snap +0 -0
  164. package/src/storage.test.ts.md +2 -0
  165. package/src/storage.test.ts.snap +0 -0
  166. package/src/upgrade-interface-version.test.ts +37 -0
  167. package/src/upgrade-interface-version.ts +27 -0
  168. package/src/utils/annotations.ts +8 -0
  169. package/src/utils/make-namespaced.test.ts +74 -0
  170. package/src/utils/make-namespaced.test.ts.md +154 -0
  171. package/src/utils/make-namespaced.test.ts.snap +0 -0
  172. package/src/utils/make-namespaced.ts +154 -0
  173. package/src/utils/stabilize-layout.ts +5 -0
  174. package/src/validate/overrides.ts +1 -1
  175. package/src/validate/query.ts +9 -3
  176. package/src/validate/report.ts +3 -2
  177. package/src/validate/run.ts +109 -2
  178. package/src/validate.test.ts +3 -0
@@ -0,0 +1,132 @@
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/Namespaced.sol:Example');
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/Namespaced.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/Namespaced.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
+ });
29
+ const dummyDecodeSrc = () => 'file.sol:1';
30
+ test('layout', t => {
31
+ const layout = t.context.extractStorageLayout('Example');
32
+ t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
33
+ });
34
+ test('multiple namespaces', t => {
35
+ const layout = t.context.extractStorageLayout('MultipleNamespaces');
36
+ t.snapshot((0, stabilize_layout_1.stabilizeStorageLayout)(layout));
37
+ });
38
+ test('namespaced upgrade ok', t => {
39
+ const v1 = t.context.extractStorageLayout('Example');
40
+ const v2 = t.context.extractStorageLayout('ExampleV2_Ok');
41
+ const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
42
+ t.deepEqual(comparison, []);
43
+ });
44
+ test('namespaced upgrade bad', t => {
45
+ const v1 = t.context.extractStorageLayout('Example');
46
+ const v2 = t.context.extractStorageLayout('ExampleV2_Bad');
47
+ const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
48
+ t.like(comparison, {
49
+ length: 1,
50
+ 0: {
51
+ kind: 'delete',
52
+ original: {
53
+ contract: 'Example',
54
+ label: 'x',
55
+ type: {
56
+ id: 't_uint256',
57
+ },
58
+ },
59
+ },
60
+ });
61
+ });
62
+ test('recursive struct outer ok', t => {
63
+ const v1 = t.context.extractStorageLayout('RecursiveStruct');
64
+ const v2 = t.context.extractStorageLayout('RecursiveStructV2_Outer_Ok');
65
+ const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
66
+ t.deepEqual(comparison, []);
67
+ });
68
+ test('recursive struct bad', t => {
69
+ const v1 = t.context.extractStorageLayout('RecursiveStruct');
70
+ const v2 = t.context.extractStorageLayout('RecursiveStructV2_Bad');
71
+ const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
72
+ t.like(comparison, {
73
+ length: 1,
74
+ 0: {
75
+ kind: 'typechange',
76
+ change: {
77
+ kind: 'struct members',
78
+ ops: {
79
+ length: 1,
80
+ 0: { kind: 'append' },
81
+ },
82
+ },
83
+ original: { label: 's' },
84
+ updated: { label: 's' },
85
+ },
86
+ });
87
+ });
88
+ test('multiple namespaces and regular variables ok', t => {
89
+ const v1 = t.context.extractStorageLayout('MultipleNamespacesAndRegularVariables');
90
+ const v2 = t.context.extractStorageLayout('MultipleNamespacesAndRegularVariablesV2_Ok');
91
+ const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
92
+ t.deepEqual(comparison, []);
93
+ });
94
+ test('multiple namespaces and regular variables bad', t => {
95
+ const v1 = t.context.extractStorageLayout('MultipleNamespacesAndRegularVariables');
96
+ const v2 = t.context.extractStorageLayout('MultipleNamespacesAndRegularVariablesV2_Bad');
97
+ const comparison = (0, storage_1.getStorageUpgradeErrors)(v1, v2);
98
+ t.like(comparison, {
99
+ length: 5,
100
+ 0: {
101
+ kind: 'insert',
102
+ updated: {
103
+ label: 'c',
104
+ },
105
+ },
106
+ 1: {
107
+ kind: 'layoutchange',
108
+ updated: {
109
+ label: 'a', // layout available for regular variable outside of namespace
110
+ },
111
+ },
112
+ 2: {
113
+ kind: 'layoutchange',
114
+ updated: {
115
+ label: 'b', // layout available for regular variable outside of namespace
116
+ },
117
+ },
118
+ 3: {
119
+ kind: 'insert',
120
+ updated: {
121
+ label: 'c',
122
+ },
123
+ },
124
+ 4: {
125
+ kind: 'insert',
126
+ updated: {
127
+ label: 'c',
128
+ },
129
+ },
130
+ });
131
+ });
132
+ //# sourceMappingURL=storage-namespaced.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-namespaced.test.js","sourceRoot":"","sources":["../src/storage-namespaced.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { EthereumProvider } from './provider';
2
+ export declare function getUpgradeInterfaceVersion(provider: EthereumProvider, address: string): Promise<string | undefined>;
3
+ //# sourceMappingURL=upgrade-interface-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-interface-version.d.ts","sourceRoot":"","sources":["../src/upgrade-interface-version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUpgradeInterfaceVersion = void 0;
4
+ const call_optional_signature_1 = require("./call-optional-signature");
5
+ async function getUpgradeInterfaceVersion(provider, address) {
6
+ const encodedVersion = await (0, call_optional_signature_1.callOptionalSignature)(provider, address, 'UPGRADE_INTERFACE_VERSION()');
7
+ if (encodedVersion !== undefined) {
8
+ // Encoded string
9
+ const buf = Buffer.from(encodedVersion.replace(/^0x/, ''), 'hex');
10
+ // The first 32 bytes represent the offset, which should be 32 for a string
11
+ const offset = parseInt(buf.slice(0, 32).toString('hex'), 16);
12
+ if (offset !== 32) {
13
+ throw new Error(`Unexpected type for UPGRADE_INTERFACE_VERSION at address ${address}. Expected a string`);
14
+ }
15
+ // The next 32 bytes represent the length of the string
16
+ const length = parseInt(buf.slice(32, 64).toString('hex'), 16);
17
+ // The rest is the string itself
18
+ return buf.slice(64, 64 + length).toString('utf8');
19
+ }
20
+ else {
21
+ return undefined;
22
+ }
23
+ }
24
+ exports.getUpgradeInterfaceVersion = getUpgradeInterfaceVersion;
25
+ //# sourceMappingURL=upgrade-interface-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-interface-version.js","sourceRoot":"","sources":["../src/upgrade-interface-version.ts"],"names":[],"mappings":";;;AAAA,uEAAkE;AAG3D,KAAK,UAAU,0BAA0B,CAC9C,QAA0B,EAC1B,OAAe;IAEf,MAAM,cAAc,GAAG,MAAM,IAAA,+CAAqB,EAAC,QAAQ,EAAE,OAAO,EAAE,6BAA6B,CAAC,CAAC;IACrG,IAAI,cAAc,KAAK,SAAS,EAAE;QAChC,iBAAiB;QACjB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAElE,2EAA2E;QAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,MAAM,KAAK,EAAE,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,4DAA4D,OAAO,qBAAqB,CAAC,CAAC;SAC3G;QAED,uDAAuD;QACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/D,gCAAgC;QAChC,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;KACpD;SAAM;QACL,OAAO,SAAS,CAAC;KAClB;AACH,CAAC;AAvBD,gEAuBC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=upgrade-interface-version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-interface-version.test.d.ts","sourceRoot":"","sources":["../src/upgrade-interface-version.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
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 upgrade_interface_version_1 = require("./upgrade-interface-version");
8
+ const hash = '0x1234';
9
+ function makeProviderReturning(result) {
10
+ return { send: (_method, _params) => Promise.resolve(result) };
11
+ }
12
+ function makeProviderError(msg) {
13
+ return {
14
+ send: (_method, _params) => {
15
+ throw new Error(msg);
16
+ },
17
+ };
18
+ }
19
+ (0, ava_1.default)('getUpgradeInterfaceVersion returns version', async (t) => {
20
+ // abi encoding of '5.0.0'
21
+ const provider = makeProviderReturning('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005352e302e30000000000000000000000000000000000000000000000000000000');
22
+ t.is(await (0, upgrade_interface_version_1.getUpgradeInterfaceVersion)(provider, hash), '5.0.0');
23
+ });
24
+ (0, ava_1.default)('getUpgradeInterfaceVersion throws unrelated error', async (t) => {
25
+ const provider = makeProviderError('unrelated error');
26
+ await t.throwsAsync(() => (0, upgrade_interface_version_1.getUpgradeInterfaceVersion)(provider, hash), { message: 'unrelated error' });
27
+ });
28
+ (0, ava_1.default)('getUpgradeInterfaceVersion returns undefined for invalid selector', async (t) => {
29
+ const provider = makeProviderError(`Transaction reverted: function selector was not recognized and there's no fallback function`);
30
+ t.is(await (0, upgrade_interface_version_1.getUpgradeInterfaceVersion)(provider, hash), undefined);
31
+ });
32
+ //# sourceMappingURL=upgrade-interface-version.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-interface-version.test.js","sourceRoot":"","sources":["../src/upgrade-interface-version.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAuB;AAEvB,2EAAyE;AAEzE,MAAM,IAAI,GAAG,QAAQ,CAAC;AAEtB,SAAS,qBAAqB,CAAC,MAAe;IAC5C,OAAO,EAAE,IAAI,EAAE,CAAC,OAAe,EAAE,OAAkB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAsB,CAAC;AACxG,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO;QACL,IAAI,EAAE,CAAC,OAAe,EAAE,OAAkB,EAAE,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;KACkB,CAAC;AACxB,CAAC;AAED,IAAA,aAAI,EAAC,4CAA4C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC3D,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,qBAAqB,CACpC,oMAAoM,CACrM,CAAC;IACF,CAAC,CAAC,EAAE,CAAC,MAAM,IAAA,sDAA0B,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,mDAAmD,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAClE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAA,sDAA0B,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACxG,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,mEAAmE,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAClF,MAAM,QAAQ,GAAG,iBAAiB,CAChC,6FAA6F,CAC9F,CAAC;IACF,CAAC,CAAC,EAAE,CAAC,MAAM,IAAA,sDAA0B,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
@@ -1,4 +1,8 @@
1
1
  import { Node } from 'solidity-ast/node';
2
+ /**
3
+ * Whether the given doc string has an annotation tag.
4
+ */
5
+ export declare function hasAnnotationTag(doc: string, tag: string): boolean;
2
6
  /**
3
7
  * Get args from the doc string matching the given tag.
4
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/utils/annotations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,YAuB5F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,UAM1C"}
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/utils/annotations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,YAuB5F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,UAM1C"}
@@ -1,7 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDocumentation = exports.getAnnotationArgs = void 0;
3
+ exports.getDocumentation = exports.getAnnotationArgs = exports.hasAnnotationTag = void 0;
4
4
  const execall_1 = require("./execall");
5
+ /**
6
+ * Whether the given doc string has an annotation tag.
7
+ */
8
+ function hasAnnotationTag(doc, tag) {
9
+ const regex = new RegExp(`^\\s*(@custom:${tag})(\\s|$)`, 'm');
10
+ return regex.test(doc);
11
+ }
12
+ exports.hasAnnotationTag = hasAnnotationTag;
5
13
  /**
6
14
  * Get args from the doc string matching the given tag.
7
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/utils/annotations.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAGpC;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,GAAW,EAAE,GAAW,EAAE,aAAiC;IAC3F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,IAAA,iBAAO,EAC9B,kFAAkF,EAClF,GAAG,CACJ,EAAE;QACD,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE;YAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;aAC1C;SACF;KACF;IAED,IAAI,aAAa,KAAK,SAAS,EAAE;QAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACnB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,6BAA6B,GAAG,EAAE,CAAC,CAAC;aACpE;QACH,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAvBD,8CAuBC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAU;IACzC,IAAI,eAAe,IAAI,IAAI,EAAE;QAC3B,OAAO,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC;KACrG;SAAM;QACL,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAND,4CAMC"}
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/utils/annotations.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAGpC;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAW,EAAE,GAAW;IACvD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,iBAAiB,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAHD,4CAGC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,GAAW,EAAE,GAAW,EAAE,aAAiC;IAC3F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,IAAA,iBAAO,EAC9B,kFAAkF,EAClF,GAAG,CACJ,EAAE;QACD,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE;YAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;aAC1C;SACF;KACF;IAED,IAAI,aAAa,KAAK,SAAS,EAAE;QAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACnB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,6BAA6B,GAAG,EAAE,CAAC,CAAC;aACpE;QACH,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAvBD,8CAuBC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAU;IACzC,IAAI,eAAe,IAAI,IAAI,EAAE;QAC3B,OAAO,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC;KACrG;SAAM;QACL,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAND,4CAMC"}
@@ -0,0 +1,20 @@
1
+ import { SolcInput, SolcOutput } from '../solc-api';
2
+ /**
3
+ * Makes a modified version of the solc input to add state variables in each contract for namespaced struct definitions,
4
+ * so that the compiler will generate their types in the storage layout.
5
+ *
6
+ * This makes the following modifications to the input:
7
+ * - Adds a state variable for each namespaced struct definition
8
+ * - Deletes all contracts' functions since they are not needed for storage layout
9
+ * - Deletes all contracts' modifiers, variables, and parent constructor invocations to avoid compilation errors due to deleted functions and constructors
10
+ * - Deletes all using for directives (at file level and in contracts) since they may reference deleted functions
11
+ * - Converts all free functions and constants (at file level) to dummy variables (do not delete them since they might be imported by other files)
12
+ *
13
+ * Also sets the outputSelection to only include storageLayout and ast, since the other outputs are not needed.
14
+ *
15
+ * @param input The original solc input.
16
+ * @param output The original solc output.
17
+ * @returns The modified solc input with storage layout that includes namespaced type information.
18
+ */
19
+ export declare function makeNamespacedInput(input: SolcInput, output: SolcOutput): SolcInput;
20
+ //# sourceMappingURL=make-namespaced.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-namespaced.d.ts","sourceRoot":"","sources":["../../src/utils/make-namespaced.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWpD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAqEnF"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeNamespacedInput = void 0;
4
+ const utils_1 = require("solidity-ast/utils");
5
+ const namespace_1 = require("../storage/namespace");
6
+ const assert_1 = require("./assert");
7
+ const OUTPUT_SELECTION = {
8
+ '*': {
9
+ '*': ['storageLayout'],
10
+ '': ['ast'],
11
+ },
12
+ };
13
+ /**
14
+ * Makes a modified version of the solc input to add state variables in each contract for namespaced struct definitions,
15
+ * so that the compiler will generate their types in the storage layout.
16
+ *
17
+ * This makes the following modifications to the input:
18
+ * - Adds a state variable for each namespaced struct definition
19
+ * - Deletes all contracts' functions since they are not needed for storage layout
20
+ * - Deletes all contracts' modifiers, variables, and parent constructor invocations to avoid compilation errors due to deleted functions and constructors
21
+ * - Deletes all using for directives (at file level and in contracts) since they may reference deleted functions
22
+ * - Converts all free functions and constants (at file level) to dummy variables (do not delete them since they might be imported by other files)
23
+ *
24
+ * Also sets the outputSelection to only include storageLayout and ast, since the other outputs are not needed.
25
+ *
26
+ * @param input The original solc input.
27
+ * @param output The original solc output.
28
+ * @returns The modified solc input with storage layout that includes namespaced type information.
29
+ */
30
+ function makeNamespacedInput(input, output) {
31
+ const modifiedSources = {};
32
+ for (const [sourcePath] of Object.entries(input.sources)) {
33
+ const source = input.sources[sourcePath];
34
+ if (source.content === undefined) {
35
+ modifiedSources[sourcePath] = source;
36
+ continue;
37
+ }
38
+ const orig = Buffer.from(source.content, 'utf8');
39
+ const modifications = [];
40
+ for (const node of output.sources[sourcePath].ast.nodes) {
41
+ if ((0, utils_1.isNodeType)('ContractDefinition', node)) {
42
+ const contractDef = node;
43
+ // Remove any calls to parent constructors from the inheritance list
44
+ const inherits = contractDef.baseContracts;
45
+ for (const inherit of inherits) {
46
+ if (Array.isArray(inherit.arguments)) {
47
+ (0, assert_1.assert)(inherit.baseName.name !== undefined);
48
+ modifications.push(makeReplace(inherit, orig, inherit.baseName.name));
49
+ }
50
+ }
51
+ const contractNodes = contractDef.nodes;
52
+ for (const contractNode of contractNodes) {
53
+ if ((0, utils_1.isNodeType)('FunctionDefinition', contractNode) ||
54
+ (0, utils_1.isNodeType)('ModifierDefinition', contractNode) ||
55
+ (0, utils_1.isNodeType)('VariableDeclaration', contractNode)) {
56
+ if (contractNode.documentation) {
57
+ modifications.push(makeDelete(contractNode.documentation, orig));
58
+ }
59
+ modifications.push(makeDelete(contractNode, orig));
60
+ }
61
+ else if ((0, utils_1.isNodeType)('UsingForDirective', contractNode)) {
62
+ modifications.push(makeDelete(contractNode, orig));
63
+ }
64
+ else if ((0, utils_1.isNodeType)('StructDefinition', contractNode)) {
65
+ const storageLocation = (0, namespace_1.getStorageLocationAnnotation)(contractNode);
66
+ if (storageLocation !== undefined) {
67
+ const structName = contractNode.name;
68
+ const variableName = `$${structName}_${(Math.random() * 1e6).toFixed(0)}`;
69
+ const insertText = ` ${structName} ${variableName};`;
70
+ modifications.push(makeInsertAfter(contractNode, insertText));
71
+ }
72
+ }
73
+ }
74
+ }
75
+ else if ((0, utils_1.isNodeType)('FunctionDefinition', node) || (0, utils_1.isNodeType)('VariableDeclaration', node)) {
76
+ if (node.documentation) {
77
+ modifications.push(makeDelete(node.documentation, orig));
78
+ }
79
+ // Replace with a dummy variable of arbitrary type
80
+ const name = node.name;
81
+ const insertText = `uint256 constant ${name} = 0;`;
82
+ modifications.push(makeReplace(node, orig, insertText));
83
+ }
84
+ else if ((0, utils_1.isNodeType)('UsingForDirective', node)) {
85
+ modifications.push(makeDelete(node, orig));
86
+ }
87
+ }
88
+ modifiedSources[sourcePath] = { ...source, content: getModifiedSource(orig, modifications) };
89
+ }
90
+ return { ...input, sources: modifiedSources, settings: { ...input.settings, outputSelection: OUTPUT_SELECTION } };
91
+ }
92
+ exports.makeNamespacedInput = makeNamespacedInput;
93
+ function getPositions(node) {
94
+ const [start, length] = node.src.split(':').map(Number);
95
+ const end = start + length;
96
+ return { start, end };
97
+ }
98
+ function makeReplace(node, orig, text) {
99
+ // Replace is a delete and insert
100
+ const { start, end } = makeDelete(node, orig);
101
+ return { start, end, text };
102
+ }
103
+ function makeInsertAfter(node, text) {
104
+ const { end } = getPositions(node);
105
+ return { start: end, end, text };
106
+ }
107
+ function makeDelete(node, orig) {
108
+ const positions = getPositions(node);
109
+ let end = positions.end;
110
+ // If the next character is a semicolon for variables, skip over it
111
+ if ((0, utils_1.isNodeType)('VariableDeclaration', node) && end + 1 < orig.length && orig.toString('utf8', end, end + 1) === ';') {
112
+ end += 1;
113
+ }
114
+ return { start: positions.start, end };
115
+ }
116
+ function getModifiedSource(orig, modifications) {
117
+ let result = '';
118
+ let copyFromIndex = 0;
119
+ for (const modification of modifications) {
120
+ (0, assert_1.assert)(modification.start >= copyFromIndex);
121
+ result += orig.toString('utf8', copyFromIndex, modification.start);
122
+ if (modification.text !== undefined) {
123
+ result += modification.text;
124
+ }
125
+ copyFromIndex = modification.end;
126
+ }
127
+ (0, assert_1.assert)(copyFromIndex <= orig.length);
128
+ result += orig.toString('utf8', copyFromIndex);
129
+ return result;
130
+ }
131
+ //# sourceMappingURL=make-namespaced.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-namespaced.js","sourceRoot":"","sources":["../../src/utils/make-namespaced.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=make-namespaced.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-namespaced.test.d.ts","sourceRoot":"","sources":["../../src/utils/make-namespaced.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
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 hardhat_1 = require("hardhat");
8
+ const task_names_1 = require("hardhat/builtin-tasks/task-names");
9
+ const make_namespaced_1 = require("./make-namespaced");
10
+ (0, ava_1.default)('make namespaced input', async (t) => {
11
+ const origBuildInfo = await hardhat_1.artifacts.getBuildInfo('contracts/test/NamespacedToModify.sol:Example');
12
+ await testMakeNamespaced(origBuildInfo, t, '0.8.20');
13
+ });
14
+ (0, ava_1.default)('make namespaced input - solc 0.7', async (t) => {
15
+ // The nameNamespacedInput function must work for different solc versions, since it is called before we check whether namespaces are used with solc >= 0.8.20
16
+ const origBuildInfo = await hardhat_1.artifacts.getBuildInfo('contracts/test/NamespacedToModify07.sol:HasFunction');
17
+ await testMakeNamespaced(origBuildInfo, t, '0.7.6');
18
+ });
19
+ async function testMakeNamespaced(origBuildInfo, t, solcVersion) {
20
+ if (origBuildInfo === undefined) {
21
+ throw new Error('Build info not found');
22
+ }
23
+ // Inefficient, but we want to test that we don't actually modify the original input object
24
+ const origInput = JSON.parse(JSON.stringify(origBuildInfo.input));
25
+ const modifiedInput = (0, make_namespaced_1.makeNamespacedInput)(origBuildInfo.input, origBuildInfo.output);
26
+ normalizeStateVariableNames(modifiedInput);
27
+ t.snapshot(modifiedInput);
28
+ t.deepEqual(origBuildInfo.input, origInput);
29
+ t.notDeepEqual(modifiedInput, origInput);
30
+ // Run hardhat compile on the modified input and make sure it has no errors
31
+ const modifiedOutput = await hardhatCompile(modifiedInput, solcVersion);
32
+ t.is(modifiedOutput.errors, undefined);
33
+ }
34
+ function normalizeStateVariableNames(input) {
35
+ for (const source of Object.values(input.sources)) {
36
+ if (source.content !== undefined) {
37
+ source.content = source.content.replace(/\$MainStorage_\d{1,6};/g, '$MainStorage_random;');
38
+ }
39
+ }
40
+ }
41
+ async function hardhatCompile(input, solcVersion) {
42
+ const solcBuild = await (0, hardhat_1.run)(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOLC_BUILD, {
43
+ quiet: true,
44
+ solcVersion,
45
+ });
46
+ if (solcBuild.isSolcJs) {
47
+ return await (0, hardhat_1.run)(task_names_1.TASK_COMPILE_SOLIDITY_RUN_SOLCJS, {
48
+ input,
49
+ solcJsPath: solcBuild.compilerPath,
50
+ });
51
+ }
52
+ else {
53
+ return await (0, hardhat_1.run)(task_names_1.TASK_COMPILE_SOLIDITY_RUN_SOLC, {
54
+ input,
55
+ solcPath: solcBuild.compilerPath,
56
+ });
57
+ }
58
+ }
59
+ //# sourceMappingURL=make-namespaced.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-namespaced.test.js","sourceRoot":"","sources":["../../src/utils/make-namespaced.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAA6C;AAC7C,qCAAyC;AACzC,iEAI0C;AAE1C,uDAAwD;AAKxD,IAAA,aAAI,EAAC,uBAAuB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACtC,MAAM,aAAa,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,+CAA+C,CAAC,CAAC;IACpG,MAAM,kBAAkB,CAAC,aAAa,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAA,aAAI,EAAC,kCAAkC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACjD,6JAA6J;IAC7J,MAAM,aAAa,GAAG,MAAM,mBAAS,CAAC,YAAY,CAAC,qDAAqD,CAAC,CAAC;IAC1G,MAAM,kBAAkB,CAAC,aAAa,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,kBAAkB,CAC/B,aAAoC,EACpC,CAA4B,EAC5B,WAAmB;IAEnB,IAAI,aAAa,KAAK,SAAS,EAAE;QAC/B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;KACzC;IAED,2FAA2F;IAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAElE,MAAM,aAAa,GAAG,IAAA,qCAAmB,EAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrF,2BAA2B,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAE1B,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAEzC,2EAA2E;IAC3E,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAgB;IACnD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QACjD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;YAChC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,CAAC;SAC5F;KACF;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,KAAgB,EAAE,WAAmB;IACjE,MAAM,SAAS,GAAc,MAAM,IAAA,aAAG,EAAC,iDAAoC,EAAE;QAC3E,KAAK,EAAE,IAAI;QACX,WAAW;KACZ,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,QAAQ,EAAE;QACtB,OAAO,MAAM,IAAA,aAAG,EAAC,6CAAgC,EAAE;YACjD,KAAK;YACL,UAAU,EAAE,SAAS,CAAC,YAAY;SACnC,CAAC,CAAC;KACJ;SAAM;QACL,OAAO,MAAM,IAAA,aAAG,EAAC,2CAA8B,EAAE;YAC/C,KAAK;YACL,QAAQ,EAAE,SAAS,CAAC,YAAY;SACjC,CAAC,CAAC;KACJ;AACH,CAAC"}
@@ -24,5 +24,16 @@ export declare function stabilizeStorageLayout(layout: StorageLayout): {
24
24
  numberOfBytes?: string | undefined;
25
25
  underlying?: string | undefined;
26
26
  })[][];
27
+ namespaces: (string | {
28
+ type: string;
29
+ astId?: number | undefined;
30
+ contract: string;
31
+ label: string;
32
+ src: string;
33
+ offset?: number | undefined;
34
+ slot?: string | undefined;
35
+ retypedFrom?: string | undefined;
36
+ renamedFrom?: string | undefined;
37
+ }[])[][] | undefined;
27
38
  };
28
39
  //# sourceMappingURL=stabilize-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stabilize-layout.d.ts","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;EAY3D"}
1
+ {"version":3,"file":"stabilize-layout.d.ts","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB3D"}
@@ -13,6 +13,11 @@ function stabilizeStorageLayout(layout) {
13
13
  : item.members.map(m => ({ ...m, type: (0, type_id_1.stabilizeTypeIdentifier)(m.type) })));
14
14
  return [(0, type_id_1.stabilizeTypeIdentifier)(type), { ...item, members }];
15
15
  }),
16
+ namespaces: layout.namespaces
17
+ ? Object.entries(layout.namespaces).map(([ns, items]) => {
18
+ return [ns, items.map(item => ({ ...item, type: (0, type_id_1.stabilizeTypeIdentifier)(item.type) }))];
19
+ })
20
+ : undefined,
16
21
  };
17
22
  }
18
23
  exports.stabilizeStorageLayout = stabilizeStorageLayout;
@@ -1 +1 @@
1
- {"version":3,"file":"stabilize-layout.js","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":";;;AACA,8CAAkD;AAClD,uCAAoD;AAEpD,SAAgB,sBAAsB,CAAC,MAAqB;IAC1D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACvD,MAAM,OAAO,GACX,IAAI,CAAC,OAAO;gBACZ,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,OAAO,CAAC;oBAC1B,CAAC,CAAC,IAAI,CAAC,OAAO;oBACd,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,IAAA,iCAAuB,EAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAZD,wDAYC"}
1
+ {"version":3,"file":"stabilize-layout.js","sourceRoot":"","sources":["../../src/utils/stabilize-layout.ts"],"names":[],"mappings":";;;AACA,8CAAkD;AAClD,uCAAoD;AAEpD,SAAgB,sBAAsB,CAAC,MAAqB;IAC1D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACvD,MAAM,OAAO,GACX,IAAI,CAAC,OAAO;gBACZ,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,OAAO,CAAC;oBAC1B,CAAC,CAAC,IAAI,CAAC,OAAO;oBACd,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,IAAA,iCAAuB,EAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC;QACF,UAAU,EAAE,MAAM,CAAC,UAAU;YAC3B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;gBACpD,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAA,iCAAuB,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1F,CAAC,CAAC;YACJ,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAjBD,wDAiBC"}
@@ -28,7 +28,7 @@ exports.ValidationErrorUnsafeMessages = {
28
28
  selfdestruct: [`You are using the \`unsafeAllow.selfdestruct\` flag.`],
29
29
  'missing-public-upgradeto': [
30
30
  `You are using the \`unsafeAllow.missing-public-upgradeto\` flag with uups proxy.`,
31
- `Not having a public upgradeTo function in your implementation can break upgradeability.`,
31
+ `Not having a public upgradeTo or upgradeToAndCall function in your implementation can break upgradeability.`,
32
32
  `Some implementation might check that onchain, and cause the upgrade to revert.`,
33
33
  ],
34
34
  };
@@ -1 +1 @@
1
- {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/validate/overrides.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/validate/overrides.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/validate/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,cAAc,EAA2B,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CASvG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAkB5F;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAqBnH;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa,CAItF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,GAAG,aAAa,CAiBvG;AAED,wBAAiB,iCAAiC,CAChD,IAAI,EAAE,cAAc,EACpB,sBAAsB,EAAE,MAAM,GAC7B,SAAS,CAAC,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAUxC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkBlF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,iBAAsB,GAAG,eAAe,EAAE,CAiBjH;AA0BD,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAG7E;AAED,wBAAgB,SAAS,CAAC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAG7F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAQ9F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,kBAAkB,EAAE,kBAAkB,WAExE"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/validate/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,cAAc,EAA2B,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CASvG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAkB5F;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAqBnH;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa,CAItF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,GAAG,aAAa,CAmBvG;AAED,wBAAiB,iCAAiC,CAChD,IAAI,EAAE,cAAc,EACpB,sBAAsB,EAAE,MAAM,GAC7B,SAAS,CAAC,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAUxC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkBlF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,iBAAsB,GAAG,eAAe,EAAE,CAoBjH;AA0BD,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAG7E;AAED,wBAAgB,SAAS,CAAC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAG7F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAQ9F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,kBAAkB,EAAE,kBAAkB,WAExE"}
@@ -8,6 +8,7 @@ const overrides_1 = require("./overrides");
8
8
  const error_1 = require("./error");
9
9
  const data_1 = require("./data");
10
10
  const upgradeToSignature = 'upgradeTo(address)';
11
+ const upgradeToAndCallSignature = 'upgradeToAndCall(address,bytes)';
11
12
  function assertUpgradeSafe(data, version, opts) {
12
13
  const dataV3 = (0, data_1.normalizeValidationData)(data);
13
14
  const [fullContractName] = getContractNameAndRunValidation(dataV3, version);
@@ -83,10 +84,12 @@ function unfoldStorageLayout(runData, fullContractName) {
83
84
  solcVersion,
84
85
  storage: c.layout.storage,
85
86
  types: c.layout.types,
87
+ namespaces: c.layout.namespaces,
86
88
  };
87
89
  }
88
90
  else {
89
- const layout = { solcVersion, storage: [], types: {} };
91
+ // Namespaces are pre-flattened
92
+ const layout = { solcVersion, storage: [], types: {}, namespaces: c.layout.namespaces };
90
93
  for (const name of [fullContractName].concat(c.inherit)) {
91
94
  layout.storage.unshift(...runData[name].layout.storage);
92
95
  Object.assign(layout.types, runData[name].layout.types);
@@ -128,7 +131,8 @@ function getErrors(data, version, opts = {}) {
128
131
  const c = runValidation[fullContractName];
129
132
  const errors = getAllErrors(runValidation, fullContractName);
130
133
  const selfAndInheritedMethods = getAllMethods(runValidation, fullContractName);
131
- if (!selfAndInheritedMethods.includes(upgradeToSignature)) {
134
+ if (!selfAndInheritedMethods.includes(upgradeToSignature) &&
135
+ !selfAndInheritedMethods.includes(upgradeToAndCallSignature)) {
132
136
  errors.push({
133
137
  src: c.src,
134
138
  kind: 'missing-public-upgradeto',
@@ -163,7 +167,7 @@ function isUpgradeSafe(data, version) {
163
167
  exports.isUpgradeSafe = isUpgradeSafe;
164
168
  function inferUUPS(runValidation, fullContractName) {
165
169
  const methods = getAllMethods(runValidation, fullContractName);
166
- return methods.includes(upgradeToSignature);
170
+ return methods.includes(upgradeToSignature) || methods.includes(upgradeToAndCallSignature);
167
171
  }
168
172
  exports.inferUUPS = inferUUPS;
169
173
  function inferProxyKind(data, version) {