slotdiff 0.1.0-alpha.1 → 0.3.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/CHANGELOG.md +50 -9
- package/README.md +219 -111
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +22 -0
- package/dist/bin.js.map +1 -0
- package/dist/build-info.d.ts +45 -0
- package/dist/build-info.d.ts.map +1 -0
- package/dist/build-info.js +319 -0
- package/dist/build-info.js.map +1 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +389 -0
- package/dist/cli.js.map +1 -0
- package/dist/erc7201.d.ts +88 -0
- package/dist/erc7201.d.ts.map +1 -0
- package/dist/erc7201.js +509 -0
- package/dist/erc7201.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -1
- package/dist/explorer.d.ts.map +1 -1
- package/dist/explorer.js +29 -10
- package/dist/explorer.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/reconstruct.d.ts +70 -7
- package/dist/reconstruct.d.ts.map +1 -1
- package/dist/reconstruct.js +157 -20
- package/dist/reconstruct.js.map +1 -1
- package/dist/record.d.ts +13 -0
- package/dist/record.d.ts.map +1 -1
- package/dist/record.js +8 -0
- package/dist/record.js.map +1 -1
- package/dist/report.d.ts +29 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +138 -0
- package/dist/report.js.map +1 -0
- package/dist/resolve.d.ts +16 -0
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +17 -2
- package/dist/resolve.js.map +1 -1
- package/dist/solc.js +20 -4
- package/dist/solc.js.map +1 -1
- package/dist/upgrade.d.ts +48 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +36 -0
- package/dist/upgrade.js.map +1 -0
- package/package.json +9 -6
- package/src/bin.ts +25 -0
- package/src/build-info.ts +405 -0
- package/src/cli.ts +459 -0
- package/src/erc7201.ts +603 -0
- package/src/errors.ts +31 -0
- package/src/explorer.ts +40 -11
- package/src/index.ts +28 -3
- package/src/reconstruct.ts +279 -29
- package/src/record.ts +18 -0
- package/src/report.ts +186 -0
- package/src/resolve.ts +28 -3
- package/src/solc.ts +20 -4
- package/src/upgrade.ts +91 -0
package/dist/erc7201.js
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC-7201 namespaces by the slot the code really uses.
|
|
3
|
+
*
|
|
4
|
+
* OpenZeppelin matches namespaces by their `@custom:storage-location
|
|
5
|
+
* erc7201:<id>` annotation and never checks the `bytes32` slot the code assigns
|
|
6
|
+
* (`assembly { $.slot := LOCATION }`). The two can disagree. A changed
|
|
7
|
+
* constant behind an unchanged annotation moves the storage while the layout
|
|
8
|
+
* check passes; a corrected annotation over an unchanged constant leaves the
|
|
9
|
+
* storage in place while the check reports a deleted namespace. Reading the
|
|
10
|
+
* slot from the AST catches the first and fixes the second.
|
|
11
|
+
*/
|
|
12
|
+
import { styleText } from "node:util";
|
|
13
|
+
import { LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
|
|
14
|
+
import { namespaceLines, plain } from "./report.js";
|
|
15
|
+
// Not exported from the package index; the package has no exports map, and
|
|
16
|
+
// all exist since 1.46.0, the lowest version slotdiff accepts.
|
|
17
|
+
import { getStorageLocationAnnotation } from "@openzeppelin/upgrades-core/dist/storage/namespace.js";
|
|
18
|
+
import { calculateERC7201StorageLocation } from "@openzeppelin/upgrades-core/dist/utils/erc7201.js";
|
|
19
|
+
import { resolveBaseSlot } from "@openzeppelin/upgrades-core/dist/utils/erc7201-builtin.js";
|
|
20
|
+
import { normalizeUint256Literal, toBytes32Hex, } from "@openzeppelin/upgrades-core/dist/utils/integer-literals.js";
|
|
21
|
+
/**
|
|
22
|
+
* How each of `namespaces` (`erc7201:<id>` keys of `contract`'s layout,
|
|
23
|
+
* `source.sol:Name`) is assigned in `output`. Only structs declared in the
|
|
24
|
+
* contract or its bases count, as for OpenZeppelin: a sibling contract in the
|
|
25
|
+
* same build (a V1 next to its V2, a test copy) may declare the same id.
|
|
26
|
+
*/
|
|
27
|
+
export function namespaceSlots(output, contract, namespaces) {
|
|
28
|
+
const colon = contract.lastIndexOf(":");
|
|
29
|
+
// Most derived first, as solc lists them: the order virtual calls resolve in.
|
|
30
|
+
let linearized = [];
|
|
31
|
+
walk(output.sources?.[contract.slice(0, colon)]?.ast, (node) => {
|
|
32
|
+
if (node.nodeType === "ContractDefinition" && node.name === contract.slice(colon + 1)) {
|
|
33
|
+
linearized = node.linearizedBaseContracts;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const bases = new Set(linearized);
|
|
37
|
+
// Only code the contract can run counts: its bases (minus the functions they
|
|
38
|
+
// override), libraries and free functions, not a sibling contract (a test
|
|
39
|
+
// harness) in the same files.
|
|
40
|
+
const byId = new Map();
|
|
41
|
+
const touched = new Set();
|
|
42
|
+
const overridden = new Set();
|
|
43
|
+
for (const source of Object.values(output.sources ?? {})) {
|
|
44
|
+
walk(source.ast, (node) => {
|
|
45
|
+
if (typeof node.id === "number")
|
|
46
|
+
byId.set(node.id, node);
|
|
47
|
+
// Any Solidity use of a local after its declaration, so a local is read
|
|
48
|
+
// only when nothing but assembly reads it.
|
|
49
|
+
if (node.nodeType === "Identifier")
|
|
50
|
+
touched.add(node.referencedDeclaration);
|
|
51
|
+
if (node.nodeType === "FunctionDefinition" && bases.has(node.scope)) {
|
|
52
|
+
for (const base of (node.baseFunctions ?? []))
|
|
53
|
+
overridden.add(base);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// An overridden function can still run (through `super` or `Base.f()`), so
|
|
58
|
+
// its assembly is set aside: it never gives a slot, but it keeps a namespace
|
|
59
|
+
// it assigns from passing as unused.
|
|
60
|
+
const assemblies = [];
|
|
61
|
+
const setAside = [];
|
|
62
|
+
for (const source of Object.values(output.sources ?? {})) {
|
|
63
|
+
walk(source.ast, (node) => {
|
|
64
|
+
const sibling = node.nodeType === "ContractDefinition" &&
|
|
65
|
+
node.contractKind !== "library" &&
|
|
66
|
+
!bases.has(node.id);
|
|
67
|
+
if (sibling)
|
|
68
|
+
return false;
|
|
69
|
+
if (overridden.has(node.id)) {
|
|
70
|
+
walk(node, (inner) => {
|
|
71
|
+
if (inner.nodeType === "InlineAssembly")
|
|
72
|
+
setAside.push(inner);
|
|
73
|
+
});
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (node.nodeType === "InlineAssembly")
|
|
77
|
+
assemblies.push(node);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const ctx = { byId, linearized, bases, touched };
|
|
81
|
+
// Struct id → every slot value assigned to a pointer of that struct (undefined: unreadable).
|
|
82
|
+
const assigned = new Map();
|
|
83
|
+
// Structs assigned a slot only in set-aside code, and whether any pointer
|
|
84
|
+
// that is not a struct (a mapping or an array) is assigned one.
|
|
85
|
+
const hidden = new Set();
|
|
86
|
+
let untyped = false;
|
|
87
|
+
const unannotated = (struct) => {
|
|
88
|
+
const node = byId.get(struct);
|
|
89
|
+
return node === undefined || getStorageLocationAnnotation(node) === undefined;
|
|
90
|
+
};
|
|
91
|
+
for (const assembly of setAside) {
|
|
92
|
+
forEachSlotAssignment(assembly, byId, (struct) => {
|
|
93
|
+
if (struct === undefined)
|
|
94
|
+
untyped = true;
|
|
95
|
+
else
|
|
96
|
+
hidden.add(struct);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
for (const assembly of assemblies) {
|
|
100
|
+
const refs = (assembly.externalReferences ?? []);
|
|
101
|
+
const declarationAt = (src) => refs.find((r) => r.src === src)?.declaration ?? -1;
|
|
102
|
+
walk(assembly.AST, (node) => {
|
|
103
|
+
if (node.nodeType !== "YulAssignment")
|
|
104
|
+
return;
|
|
105
|
+
for (const target of node.variableNames) {
|
|
106
|
+
if (typeof target.name !== "string")
|
|
107
|
+
continue;
|
|
108
|
+
if (!target.name.endsWith(".slot")) {
|
|
109
|
+
touched.add(declarationAt(target.src));
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const pointer = byId.get(declarationAt(target.src));
|
|
113
|
+
const struct = pointer?.typeName?.referencedDeclaration;
|
|
114
|
+
if (typeof struct !== "number") {
|
|
115
|
+
untyped = true;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const value = node.value;
|
|
119
|
+
const slot = value.nodeType === "YulLiteral"
|
|
120
|
+
? value.kind === "number"
|
|
121
|
+
? normalize(value.value)
|
|
122
|
+
: undefined
|
|
123
|
+
: resolveDecl(ctx, byId.get(declarationAt(value.src)));
|
|
124
|
+
assigned.set(struct, [...(assigned.get(struct) ?? []), slot]);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
const structsOf = (namespace) => [...byId.values()].filter((n) => n.nodeType === "StructDefinition" &&
|
|
129
|
+
bases.has(n.scope) &&
|
|
130
|
+
getStorageLocationAnnotation(n) === namespace);
|
|
131
|
+
// Storage placed through any other struct (a library's Layout, annotated or
|
|
132
|
+
// not, or a struct with no annotation) is in no layout OpenZeppelin builds,
|
|
133
|
+
// so a change to it would pass unseen. A slot passed in (StorageSlot) is not known.
|
|
134
|
+
const namespaced = new Set(namespaces.flatMap((n) => structsOf(n).map((s) => s.id)));
|
|
135
|
+
for (const [id, slots] of assigned) {
|
|
136
|
+
if (namespaced.has(id) || slots.every((s) => s === undefined))
|
|
137
|
+
continue;
|
|
138
|
+
const struct = byId.get(id);
|
|
139
|
+
const scope = byId.get(struct?.scope)?.name;
|
|
140
|
+
throw new LayoutUnavailableError(`${contract} keeps storage at a fixed slot through ${[scope, struct?.name].filter(Boolean).join(".")}, ` +
|
|
141
|
+
"which is not an ERC-7201 namespace of the contract or its bases (a @custom:storage-location " +
|
|
142
|
+
"struct declared there): its fields are in no layout slotdiff compares, so it cannot check them.");
|
|
143
|
+
}
|
|
144
|
+
return namespaces.map((namespace) => {
|
|
145
|
+
const expected = calculateERC7201StorageLocation(namespace.slice("erc7201:".length));
|
|
146
|
+
const structs = structsOf(namespace);
|
|
147
|
+
const slots = structs.flatMap((n) => assigned.get(n.id) ?? []);
|
|
148
|
+
const known = [...new Set(slots.filter((s) => s !== undefined))];
|
|
149
|
+
if (slots.length === 0) {
|
|
150
|
+
// Unused only when nothing could be placing it: no assignment in
|
|
151
|
+
// set-aside code, none to a struct nested in it, none to an untyped pointer.
|
|
152
|
+
const nested = new Set(structs.flatMap((n) => [...nestedStructs(n, byId)]));
|
|
153
|
+
const own = new Set(structs.map((n) => n.id));
|
|
154
|
+
const placed = untyped ||
|
|
155
|
+
[...hidden].some(unannotated) ||
|
|
156
|
+
[...own, ...nested].some((id) => hidden.has(id)) ||
|
|
157
|
+
[...nested].some((id) => !own.has(id) && assigned.has(id));
|
|
158
|
+
return { namespace, expected, status: placed ? "unread" : "unused" };
|
|
159
|
+
}
|
|
160
|
+
if (known.length > 1)
|
|
161
|
+
return { namespace, expected, status: "conflict" };
|
|
162
|
+
if (slots.includes(undefined)) {
|
|
163
|
+
return { namespace, expected, status: "unread" };
|
|
164
|
+
}
|
|
165
|
+
const actual = known[0];
|
|
166
|
+
return actual === expected
|
|
167
|
+
? { namespace, expected, actual, status: "match" }
|
|
168
|
+
: { namespace, expected, actual, status: "mismatch" };
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Checks ERC-7201 namespaces by the slot the code uses, not the annotation
|
|
173
|
+
* OpenZeppelin goes by. An old and a new namespace are the same storage when
|
|
174
|
+
* the code uses the same slot (under the same annotation first), failing that
|
|
175
|
+
* when they share an annotation, and failing that when the new annotation
|
|
176
|
+
* names the slot where the old data is. A namespace of either layout missing
|
|
177
|
+
* from that side's `namespaces` (or all of them, when it is absent) is unread.
|
|
178
|
+
* Pass `layout` to `diffLayouts` in place of `old.layout`.
|
|
179
|
+
*/
|
|
180
|
+
export function checkNamespaces(old, next) {
|
|
181
|
+
const unpaired = new Set(slotsOf(old, "old"));
|
|
182
|
+
const pairs = slotsOf(next, "new").map((n) => ({ next: n }));
|
|
183
|
+
const sameSlot = (o, n) => o.actual !== undefined && n.actual !== undefined && same(o.actual, n.actual);
|
|
184
|
+
const rules = [
|
|
185
|
+
(o, n) => sameSlot(o, n) && o.namespace === n.namespace,
|
|
186
|
+
sameSlot,
|
|
187
|
+
(o, n) => o.namespace === n.namespace,
|
|
188
|
+
(o, n) => o.actual !== undefined && same(o.actual, n.expected),
|
|
189
|
+
];
|
|
190
|
+
// Rule by rule over every namespace, so a weaker rule never takes a pair from a stronger one.
|
|
191
|
+
for (const rule of rules) {
|
|
192
|
+
for (const pair of pairs) {
|
|
193
|
+
const o = pair.old ?? [...unpaired].find((o) => rule(o, pair.next));
|
|
194
|
+
if (o !== undefined && unpaired.delete(o))
|
|
195
|
+
pair.old = o;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
for (const o of unpaired)
|
|
199
|
+
pairs.push({ old: o });
|
|
200
|
+
for (const pair of pairs)
|
|
201
|
+
pair.problem = problemOf(pair);
|
|
202
|
+
// Renamed all at once, so two namespaces can swap names.
|
|
203
|
+
const renames = new Map(pairs.flatMap((p) => p.old !== undefined && p.next !== undefined ? [[p.old.namespace, p.next.namespace]] : []));
|
|
204
|
+
const oldNames = Object.keys(old.layout.namespaces ?? {});
|
|
205
|
+
const renamed = oldNames.map((name) => renames.get(name) ?? name);
|
|
206
|
+
// On a clash (an old namespace that stays keeps the name another would take)
|
|
207
|
+
// nothing is renamed: OpenZeppelin then reports the moved one as deleted.
|
|
208
|
+
const layout = new Set(renamed).size < renamed.length || renamed.every((to, i) => to === oldNames[i])
|
|
209
|
+
? old.layout
|
|
210
|
+
: {
|
|
211
|
+
...old.layout,
|
|
212
|
+
namespaces: Object.fromEntries(oldNames.map((name, i) => [renamed[i], old.layout.namespaces[name]])),
|
|
213
|
+
};
|
|
214
|
+
const problems = pairs.map((p) => p.problem);
|
|
215
|
+
return {
|
|
216
|
+
layout,
|
|
217
|
+
pairs,
|
|
218
|
+
result: problems.some((p) => p !== undefined && p !== "unread")
|
|
219
|
+
? "fail"
|
|
220
|
+
: problems.includes("unread")
|
|
221
|
+
? "unchecked"
|
|
222
|
+
: "pass",
|
|
223
|
+
// Colored by default, as OpenZeppelin's reports are.
|
|
224
|
+
explain: (color = true) => namespaceLines(pairs, color ? (format, text) => styleText(format, text, { validateStream: false }) : plain).join("\n"),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* One slot per namespace of `side.layout`. A namespace with no slot (a record
|
|
229
|
+
* from before slots were recorded) is unread, never left to OpenZeppelin's
|
|
230
|
+
* annotation-only match.
|
|
231
|
+
*/
|
|
232
|
+
function slotsOf(side, which) {
|
|
233
|
+
const misfit = slotsMisfit(side.layout, side.namespaces);
|
|
234
|
+
if (misfit !== undefined) {
|
|
235
|
+
throw new LayoutIntegrityError(`The ${which} namespace slots do not fit its layout: ${misfit}.`);
|
|
236
|
+
}
|
|
237
|
+
const given = side.namespaces ?? [];
|
|
238
|
+
const seen = new Set(given.map((n) => n.namespace));
|
|
239
|
+
return [
|
|
240
|
+
...given,
|
|
241
|
+
...Object.keys(side.layout.namespaces ?? {})
|
|
242
|
+
.filter((namespace) => !seen.has(namespace))
|
|
243
|
+
.map((namespace) => ({
|
|
244
|
+
namespace,
|
|
245
|
+
expected: calculateERC7201StorageLocation(namespace.slice("erc7201:".length)),
|
|
246
|
+
status: "unread",
|
|
247
|
+
})),
|
|
248
|
+
];
|
|
249
|
+
}
|
|
250
|
+
// `<formula>:<id>`, as OpenZeppelin keys namespaces. Never a name like
|
|
251
|
+
// `__proto__`, which a plain object lookup would resolve on its prototype.
|
|
252
|
+
const NAMESPACE_KEY = /^[\w.-]+:\S/;
|
|
253
|
+
const SLOT = /^0x[0-9a-f]{64}$/i;
|
|
254
|
+
/**
|
|
255
|
+
* Why `namespaces` cannot be the slots of `layout`'s namespaces, or undefined
|
|
256
|
+
* when they can (or are absent). A slot for a namespace the layout lacks, or a
|
|
257
|
+
* second one for the same namespace, could take another's place when
|
|
258
|
+
* namespaces are paired, so either is refused. Internal, shared with records.
|
|
259
|
+
*/
|
|
260
|
+
export function slotsMisfit(layout, namespaces) {
|
|
261
|
+
const names = Object.keys(layout.namespaces ?? {});
|
|
262
|
+
const odd = names.find((name) => !NAMESPACE_KEY.test(name));
|
|
263
|
+
if (odd !== undefined)
|
|
264
|
+
return `${JSON.stringify(odd)} is not a storage location`;
|
|
265
|
+
if (namespaces === undefined)
|
|
266
|
+
return undefined;
|
|
267
|
+
if (!Array.isArray(namespaces))
|
|
268
|
+
return "they are not a list";
|
|
269
|
+
const seen = new Set();
|
|
270
|
+
for (const slot of namespaces) {
|
|
271
|
+
if (!isSlot(slot))
|
|
272
|
+
return "a slot is malformed";
|
|
273
|
+
if (!names.includes(slot.namespace))
|
|
274
|
+
return `${slot.namespace} is not in the layout`;
|
|
275
|
+
if (seen.has(slot.namespace))
|
|
276
|
+
return `${slot.namespace} appears twice`;
|
|
277
|
+
seen.add(slot.namespace);
|
|
278
|
+
}
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
// Well formed, and consistent with its status.
|
|
282
|
+
function isSlot(value) {
|
|
283
|
+
const n = value;
|
|
284
|
+
if (typeof n !== "object" ||
|
|
285
|
+
n === null ||
|
|
286
|
+
typeof n.namespace !== "string" ||
|
|
287
|
+
typeof n.expected !== "string" ||
|
|
288
|
+
!SLOT.test(n.expected) ||
|
|
289
|
+
(n.actual !== undefined && (typeof n.actual !== "string" || !SLOT.test(n.actual)))) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
const read = n.actual !== undefined;
|
|
293
|
+
const same = read && BigInt(n.actual) === BigInt(n.expected);
|
|
294
|
+
return n.status === "match"
|
|
295
|
+
? same
|
|
296
|
+
: n.status === "mismatch"
|
|
297
|
+
? read && !same
|
|
298
|
+
: (n.status === "unread" || n.status === "conflict" || n.status === "unused") && !read;
|
|
299
|
+
}
|
|
300
|
+
function problemOf({ old, next }) {
|
|
301
|
+
if (next?.status === "conflict")
|
|
302
|
+
return "conflict";
|
|
303
|
+
if (old?.actual !== undefined && next?.actual !== undefined && !same(old.actual, next.actual)) {
|
|
304
|
+
return "moved";
|
|
305
|
+
}
|
|
306
|
+
if (next?.status === "mismatch")
|
|
307
|
+
return "mismatch";
|
|
308
|
+
// Only the deployed code knows where the data really is; once no code assigns
|
|
309
|
+
// the namespace, a later version that follows the wrong annotation would pass.
|
|
310
|
+
if (old?.status === "mismatch" && next?.status === "unused")
|
|
311
|
+
return "dropped";
|
|
312
|
+
// An unused namespace has no data of that version to move: compared by annotation, as OpenZeppelin does.
|
|
313
|
+
const unknown = (s) => s !== undefined && s.actual === undefined && s.status !== "unused";
|
|
314
|
+
if (unknown(old) || next?.status === "unread") {
|
|
315
|
+
return "unread";
|
|
316
|
+
}
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
// Calls `found` with the struct id of each pointer assigned a `.slot` in
|
|
320
|
+
// `assembly`, or undefined for a pointer that is not a struct.
|
|
321
|
+
function forEachSlotAssignment(assembly, byId, found) {
|
|
322
|
+
const refs = (assembly.externalReferences ?? []);
|
|
323
|
+
walk(assembly.AST, (node) => {
|
|
324
|
+
if (node.nodeType !== "YulAssignment")
|
|
325
|
+
return;
|
|
326
|
+
for (const target of node.variableNames) {
|
|
327
|
+
if (typeof target.name !== "string" || !target.name.endsWith(".slot"))
|
|
328
|
+
continue;
|
|
329
|
+
const pointer = byId.get(refs.find((r) => r.src === target.src)?.declaration ?? -1);
|
|
330
|
+
const struct = pointer?.typeName?.referencedDeclaration;
|
|
331
|
+
found(typeof struct === "number" ? struct : undefined);
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
// Every struct that `struct` holds, at any depth (in members, mappings and arrays).
|
|
336
|
+
function nestedStructs(struct, byId) {
|
|
337
|
+
const found = new Set();
|
|
338
|
+
const visit = (node) => walk(node, (n) => {
|
|
339
|
+
if (n.nodeType !== "UserDefinedTypeName")
|
|
340
|
+
return;
|
|
341
|
+
const target = byId.get(n.referencedDeclaration);
|
|
342
|
+
if (target?.nodeType === "StructDefinition" && !found.has(target.id)) {
|
|
343
|
+
found.add(target.id);
|
|
344
|
+
visit(target);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
visit(struct);
|
|
348
|
+
return found;
|
|
349
|
+
}
|
|
350
|
+
function same(a, b) {
|
|
351
|
+
return BigInt(a) === BigInt(b);
|
|
352
|
+
}
|
|
353
|
+
// Visits every node; a visitor returning false skips the node's children.
|
|
354
|
+
function walk(node, visit) {
|
|
355
|
+
if (Array.isArray(node)) {
|
|
356
|
+
for (const child of node)
|
|
357
|
+
walk(child, visit);
|
|
358
|
+
}
|
|
359
|
+
else if (typeof node === "object" && node !== null) {
|
|
360
|
+
if (visit(node) === false)
|
|
361
|
+
return;
|
|
362
|
+
for (const child of Object.values(node))
|
|
363
|
+
walk(child, visit);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* The value of a constant, an immutable set where it is declared, or a local
|
|
368
|
+
* that only assembly reads. A state variable's initial value is not read: it
|
|
369
|
+
* lives in the implementation's storage, not the proxy's.
|
|
370
|
+
*/
|
|
371
|
+
function resolveDecl(ctx, decl, depth = 0) {
|
|
372
|
+
if (decl === undefined)
|
|
373
|
+
return undefined;
|
|
374
|
+
if (decl.stateVariable === true) {
|
|
375
|
+
if (decl.mutability !== "constant" && decl.mutability !== "immutable")
|
|
376
|
+
return undefined;
|
|
377
|
+
return resolveExpr(ctx, decl.value, depth);
|
|
378
|
+
}
|
|
379
|
+
if (ctx.touched.has(decl.id))
|
|
380
|
+
return undefined;
|
|
381
|
+
return resolveExpr(ctx, initialValue(ctx.byId, decl), depth);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* The value of an expression: a reference to a constant or local, a call to a
|
|
385
|
+
* no-argument function that returns one (OpenZeppelin's Initializable reads
|
|
386
|
+
* its slot from `_initializableStorageSlot()`), the ERC-7201 formula, a
|
|
387
|
+
* number literal or `erc7201("id")`.
|
|
388
|
+
*/
|
|
389
|
+
function resolveExpr(ctx, e, depth) {
|
|
390
|
+
if (e === undefined || depth > 8)
|
|
391
|
+
return undefined;
|
|
392
|
+
if (e.nodeType === "Identifier") {
|
|
393
|
+
return resolveDecl(ctx, ctx.byId.get(e.referencedDeclaration), depth + 1);
|
|
394
|
+
}
|
|
395
|
+
if (e.nodeType === "FunctionCall" && e.kind === "functionCall") {
|
|
396
|
+
const callee = e.expression;
|
|
397
|
+
const fn = ctx.byId.get(callee.referencedDeclaration);
|
|
398
|
+
if (callee.nodeType !== "Identifier" || fn?.nodeType !== "FunctionDefinition")
|
|
399
|
+
return undefined;
|
|
400
|
+
if (e.arguments.length > 0)
|
|
401
|
+
return undefined;
|
|
402
|
+
return resolveExpr(ctx, returned(override(ctx, fn)), depth + 1);
|
|
403
|
+
}
|
|
404
|
+
const id = formulaId(e);
|
|
405
|
+
if (id !== undefined)
|
|
406
|
+
return calculateERC7201StorageLocation(id);
|
|
407
|
+
// OpenZeppelin would read any other literal, such as `hex"..."`, as a number.
|
|
408
|
+
if (e.nodeType === "Literal" && e.kind !== "number")
|
|
409
|
+
return undefined;
|
|
410
|
+
try {
|
|
411
|
+
return resolveBaseSlot(e);
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* The implementation an internal call to `fn` reaches: the most derived
|
|
419
|
+
* override of a virtual function in the bases, or `fn` itself (a free or
|
|
420
|
+
* library function, which nothing overrides).
|
|
421
|
+
*/
|
|
422
|
+
function override(ctx, fn) {
|
|
423
|
+
if (fn.virtual !== true || !ctx.bases.has(fn.scope))
|
|
424
|
+
return fn;
|
|
425
|
+
for (const contract of ctx.linearized) {
|
|
426
|
+
for (const node of ctx.byId.values()) {
|
|
427
|
+
if (node.nodeType === "FunctionDefinition" &&
|
|
428
|
+
node.scope === contract &&
|
|
429
|
+
node.name === fn.name &&
|
|
430
|
+
node.parameters.parameters.length === 0 &&
|
|
431
|
+
node.body) {
|
|
432
|
+
return node;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return fn;
|
|
437
|
+
}
|
|
438
|
+
// The expression of a function whose body is a single `return <expression>;`
|
|
439
|
+
// and that has no modifier, which could skip it.
|
|
440
|
+
function returned(fn) {
|
|
441
|
+
if (fn.modifiers?.length)
|
|
442
|
+
return undefined;
|
|
443
|
+
const statements = fn.body?.statements;
|
|
444
|
+
return statements?.length === 1 && statements[0].nodeType === "Return"
|
|
445
|
+
? statements[0].expression
|
|
446
|
+
: undefined;
|
|
447
|
+
}
|
|
448
|
+
// A local variable's value is on the statement that declares it.
|
|
449
|
+
function initialValue(byId, decl) {
|
|
450
|
+
for (const node of byId.values()) {
|
|
451
|
+
if (node.nodeType !== "VariableDeclarationStatement")
|
|
452
|
+
continue;
|
|
453
|
+
const declarations = node.declarations;
|
|
454
|
+
if (declarations.length === 1 && declarations[0]?.id === decl.id)
|
|
455
|
+
return node.initialValue;
|
|
456
|
+
}
|
|
457
|
+
return undefined;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* The id in the ERC-7201 formula written out in Solidity,
|
|
461
|
+
* `keccak256(abi.encode(uint256(keccak256("id")) - 1)) & ~bytes32(uint256(0xff))`,
|
|
462
|
+
* with an optional `bytes("id")`. Anything else is not recognized.
|
|
463
|
+
*/
|
|
464
|
+
function formulaId(e) {
|
|
465
|
+
if (e.nodeType !== "BinaryOperation" || e.operator !== "&")
|
|
466
|
+
return undefined;
|
|
467
|
+
const mask = e.rightExpression;
|
|
468
|
+
const masked = arg(arg(mask.nodeType === "UnaryOperation" ? mask.subExpression : undefined, "bytes32"), "uint256");
|
|
469
|
+
if (masked?.nodeType !== "Literal" || normalize(masked.value) !== toBytes32Hex(0xffn)) {
|
|
470
|
+
return undefined;
|
|
471
|
+
}
|
|
472
|
+
const minus = arg(arg(e.leftExpression, "keccak256"), "abi.encode");
|
|
473
|
+
if (minus?.nodeType !== "BinaryOperation" || minus.operator !== "-")
|
|
474
|
+
return undefined;
|
|
475
|
+
const one = minus.rightExpression;
|
|
476
|
+
if (one.nodeType !== "Literal" || one.value !== "1")
|
|
477
|
+
return undefined;
|
|
478
|
+
let id = arg(arg(minus.leftExpression, "uint256"), "keccak256");
|
|
479
|
+
if (id?.nodeType === "FunctionCall")
|
|
480
|
+
id = arg(id, "bytes");
|
|
481
|
+
return id?.nodeType === "Literal" && id.kind === "string" ? id.value : undefined;
|
|
482
|
+
}
|
|
483
|
+
// The single argument of a call to `name` (a function, `abi.encode`, or a type conversion).
|
|
484
|
+
function arg(call, name) {
|
|
485
|
+
if (call?.nodeType !== "FunctionCall")
|
|
486
|
+
return undefined;
|
|
487
|
+
const callee = call.expression;
|
|
488
|
+
const calleeName = callee.nodeType === "Identifier"
|
|
489
|
+
? callee.name
|
|
490
|
+
: callee.nodeType === "MemberAccess"
|
|
491
|
+
? `${callee.expression.name}.${callee.memberName}`
|
|
492
|
+
: callee.nodeType === "ElementaryTypeNameExpression"
|
|
493
|
+
? callee.typeName.name
|
|
494
|
+
: undefined;
|
|
495
|
+
const args = call.arguments;
|
|
496
|
+
return calleeName === name && args.length === 1 ? args[0] : undefined;
|
|
497
|
+
}
|
|
498
|
+
// A number literal as a slot, or undefined when it is not one.
|
|
499
|
+
function normalize(value) {
|
|
500
|
+
if (typeof value !== "string")
|
|
501
|
+
return undefined;
|
|
502
|
+
try {
|
|
503
|
+
return normalizeUint256Literal(value);
|
|
504
|
+
}
|
|
505
|
+
catch {
|
|
506
|
+
return undefined;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=erc7201.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc7201.js","sourceRoot":"","sources":["../src/erc7201.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -15,4 +15,23 @@ export declare class LayoutUnavailableError extends Error {
|
|
|
15
15
|
export declare class LayoutIntegrityError extends Error {
|
|
16
16
|
constructor(message: string);
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A build is missing output the analysis needs (an AST, metadata, a storage
|
|
20
|
+
* layout or bytecode). Yours to fix, by compiling again with them selected
|
|
21
|
+
* (`hardhat compile --force` once the outputs are configured, say).
|
|
22
|
+
*/
|
|
23
|
+
export declare class IncompleteBuildError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Text from outside (an explorer, an RPC endpoint, solc quoting verified
|
|
28
|
+
* source) without control characters, so it cannot move the cursor or recolor
|
|
29
|
+
* a terminal. Tabs and line breaks stay.
|
|
30
|
+
*/
|
|
31
|
+
export declare function printable(text: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* A network error's code (ECONNREFUSED, ENOTFOUND), never its message: fetch
|
|
34
|
+
* quotes the URL in some messages, and URLs carry API keys.
|
|
35
|
+
*/
|
|
36
|
+
export declare function errorCode(e: unknown): string;
|
|
18
37
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAG5C"}
|
package/dist/errors.js
CHANGED
|
@@ -21,4 +21,32 @@ export class LayoutIntegrityError extends Error {
|
|
|
21
21
|
this.name = "LayoutIntegrityError";
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* A build is missing output the analysis needs (an AST, metadata, a storage
|
|
26
|
+
* layout or bytecode). Yours to fix, by compiling again with them selected
|
|
27
|
+
* (`hardhat compile --force` once the outputs are configured, say).
|
|
28
|
+
*/
|
|
29
|
+
export class IncompleteBuildError extends Error {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = "IncompleteBuildError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Text from outside (an explorer, an RPC endpoint, solc quoting verified
|
|
37
|
+
* source) without control characters, so it cannot move the cursor or recolor
|
|
38
|
+
* a terminal. Tabs and line breaks stay.
|
|
39
|
+
*/
|
|
40
|
+
export function printable(text) {
|
|
41
|
+
// eslint-disable-next-line no-control-regex
|
|
42
|
+
return text.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f]/g, " ");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A network error's code (ECONNREFUSED, ENOTFOUND), never its message: fetch
|
|
46
|
+
* quotes the URL in some messages, and URLs carry API keys.
|
|
47
|
+
*/
|
|
48
|
+
export function errorCode(e) {
|
|
49
|
+
const code = e.cause?.code;
|
|
50
|
+
return typeof code === "string" ? code : "network error";
|
|
51
|
+
}
|
|
24
52
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,4CAA4C;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,MAAM,IAAI,GAAI,CAAoC,CAAC,KAAK,EAAE,IAAI,CAAC;IAC/D,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;AAC3D,CAAC"}
|
package/dist/explorer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../src/explorer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,oGAAoG;IACpG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,SAAS,GAAG,CACf,GAAG,EAAE,MAAM,KACR,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC;AAQxE,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEhE;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,SAAS,GAAE,SAAiB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAgBzB;
|
|
1
|
+
{"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../src/explorer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,oGAAoG;IACpG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,SAAS,GAAG,CACf,GAAG,EAAE,MAAM,KACR,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC;AAQxE,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEhE;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,SAAS,GAAE,SAAiB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAiED,0BAA0B;AAC1B,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAyD5F"}
|