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.
Files changed (65) hide show
  1. package/CHANGELOG.md +50 -9
  2. package/README.md +219 -111
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +22 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/build-info.d.ts +45 -0
  8. package/dist/build-info.d.ts.map +1 -0
  9. package/dist/build-info.js +319 -0
  10. package/dist/build-info.js.map +1 -0
  11. package/dist/cli.d.ts +25 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +389 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/erc7201.d.ts +88 -0
  16. package/dist/erc7201.d.ts.map +1 -0
  17. package/dist/erc7201.js +509 -0
  18. package/dist/erc7201.js.map +1 -0
  19. package/dist/errors.d.ts +19 -0
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/errors.js +28 -0
  22. package/dist/errors.js.map +1 -1
  23. package/dist/explorer.d.ts.map +1 -1
  24. package/dist/explorer.js +29 -10
  25. package/dist/explorer.js.map +1 -1
  26. package/dist/index.d.ts +6 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +5 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/reconstruct.d.ts +70 -7
  31. package/dist/reconstruct.d.ts.map +1 -1
  32. package/dist/reconstruct.js +157 -20
  33. package/dist/reconstruct.js.map +1 -1
  34. package/dist/record.d.ts +13 -0
  35. package/dist/record.d.ts.map +1 -1
  36. package/dist/record.js +8 -0
  37. package/dist/record.js.map +1 -1
  38. package/dist/report.d.ts +29 -0
  39. package/dist/report.d.ts.map +1 -0
  40. package/dist/report.js +138 -0
  41. package/dist/report.js.map +1 -0
  42. package/dist/resolve.d.ts +16 -0
  43. package/dist/resolve.d.ts.map +1 -1
  44. package/dist/resolve.js +17 -2
  45. package/dist/resolve.js.map +1 -1
  46. package/dist/solc.js +20 -4
  47. package/dist/solc.js.map +1 -1
  48. package/dist/upgrade.d.ts +48 -0
  49. package/dist/upgrade.d.ts.map +1 -0
  50. package/dist/upgrade.js +36 -0
  51. package/dist/upgrade.js.map +1 -0
  52. package/package.json +9 -6
  53. package/src/bin.ts +25 -0
  54. package/src/build-info.ts +405 -0
  55. package/src/cli.ts +459 -0
  56. package/src/erc7201.ts +603 -0
  57. package/src/errors.ts +31 -0
  58. package/src/explorer.ts +40 -11
  59. package/src/index.ts +28 -3
  60. package/src/reconstruct.ts +279 -29
  61. package/src/record.ts +18 -0
  62. package/src/report.ts +186 -0
  63. package/src/resolve.ts +28 -3
  64. package/src/solc.ts +20 -4
  65. package/src/upgrade.ts +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAC;AAEjE,+DAA+D;AAC/D,MAAM,MAAM,KAAK,GAAG,CAClB,MAAM,EAAE,UAAU,CAAC,cAAc,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAC3D,IAAI,EAAE,MAAM,KACT,MAAM,CAAC;AAEZ,eAAO,MAAM,KAAK,EAAE,KAAyB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,GAAE,KAAa,GAAG,MAAM,EAAE,CAM1E;AAYD,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,KAAK,GAAE,KAAa,GAAG,MAAM,EAAE,CAwCrF"}
package/dist/report.js ADDED
@@ -0,0 +1,138 @@
1
+ /**
2
+ * The CLI's report: the ERC-7201 namespace grid and the check list. Pure
3
+ * functions from results to lines, so the layout is tested as text. Colors
4
+ * come from `paint`, applied after alignment so they never shift a column.
5
+ */
6
+ export const plain = (_, text) => text;
7
+ const MARK = { pass: "✓", fail: "✗", skip: "-" };
8
+ const TONE = { pass: "green", fail: "red", skip: "yellow" };
9
+ /** One line per check, names aligned, details indented under their check. */
10
+ export function checkLines(checks, paint = plain) {
11
+ const width = Math.max(...checks.map((c) => c.name.length));
12
+ return checks.flatMap((c) => [
13
+ `${paint(TONE[c.status], MARK[c.status])} ${paint("bold", c.name.padEnd(width))} ${c.summary}`,
14
+ ...(c.details?.split("\n").map((line) => ` ${line}`) ?? []),
15
+ ]);
16
+ }
17
+ // A pair with nothing in question: no problem, and each side matches its
18
+ // annotation or is not assigned at all, except data the new code stops assigning.
19
+ // A side that is absent is not a problem here; OpenZeppelin reports a deleted namespace.
20
+ function quiet({ old, next, problem }) {
21
+ const plain = (s) => s === undefined || s.status === "match" || s.status === "unused";
22
+ const dropped = old?.actual !== undefined && next?.status === "unused";
23
+ return problem === undefined && plain(old) && plain(next) && !dropped;
24
+ }
25
+ /** How many namespaces are compared by annotation alone because no code assigns them. */
26
+ export function unassignedCount(pairs) {
27
+ return pairs.filter((p) => quiet(p) && [p.old, p.next].some((s) => s?.status === "unused"))
28
+ .length;
29
+ }
30
+ /**
31
+ * A grid for each namespace whose slot is in question on either side: the
32
+ * annotation, the slot it implies and the slot the code uses, for old and new,
33
+ * with a sentence saying what that means. Namespaces that line up, or that no
34
+ * code assigns on either side, are left out.
35
+ */
36
+ export function namespaceLines(pairs, paint = plain) {
37
+ const blocks = pairs
38
+ .filter((p) => !quiet(p))
39
+ .map((p) => {
40
+ const fmt = formatter([p.old, p.next]);
41
+ return {
42
+ rows: [
43
+ ...(p.old !== undefined ? [row("old", p.old, fmt)] : []),
44
+ ...(p.next !== undefined ? [row("new", p.next, fmt)] : []),
45
+ ],
46
+ meaning: meaning(p, fmt),
47
+ tone: (p.problem === undefined
48
+ ? "dim"
49
+ : p.problem === "unread"
50
+ ? "yellow"
51
+ : "red"),
52
+ };
53
+ });
54
+ if (blocks.length === 0)
55
+ return [];
56
+ const header = {
57
+ side: "",
58
+ id: "annotation",
59
+ implied: "slot from annotation",
60
+ inCode: "slot in code",
61
+ mark: "",
62
+ tone: "dim",
63
+ };
64
+ const all = [header, ...blocks.flatMap((b) => b.rows)];
65
+ const width = (key) => Math.max(...all.map((r) => r[key].length));
66
+ const cells = (r) => ` ${r.side.padEnd(5)}${r.id.padEnd(width("id"))} ${r.implied.padEnd(width("implied"))} ` +
67
+ r.inCode.padEnd(width("inCode"));
68
+ const line = (r) => `${cells(r)} ${paint(r.tone, r.mark)}`;
69
+ return [
70
+ paint("bold", "ERC-7201 namespaces"),
71
+ paint("dim", cells(header).trimEnd()),
72
+ ...blocks.flatMap((b) => [...b.rows.map(line), ` ${paint(b.tone, b.meaning)}`]),
73
+ ];
74
+ }
75
+ function row(side, s, fmt) {
76
+ return {
77
+ side,
78
+ id: s.namespace.slice("erc7201:".length),
79
+ implied: fmt(s.expected),
80
+ inCode: s.status === "conflict"
81
+ ? "several"
82
+ : s.status === "unused"
83
+ ? "none"
84
+ : s.actual !== undefined
85
+ ? fmt(s.actual)
86
+ : "not read",
87
+ mark: {
88
+ match: "✓",
89
+ mismatch: "✗ annotation does not match code",
90
+ conflict: "✗ code uses more than one slot",
91
+ unused: "· not assigned in code",
92
+ unread: "? slot in code not read",
93
+ }[s.status],
94
+ tone: { match: "green", mismatch: "red", conflict: "red", unused: "dim", unread: "yellow" }[s.status],
95
+ };
96
+ }
97
+ function meaning({ old, next, problem }, fmt) {
98
+ switch (problem) {
99
+ case "conflict":
100
+ return "The new code assigns more than one slot to this namespace; it must use one.";
101
+ case "moved":
102
+ return (`The new code moves this namespace from ${fmt(old.actual)} to ${fmt(next.actual)}: ` +
103
+ "its data would be left behind. Keep the slot the deployed code uses, under an annotation that matches it.");
104
+ case "mismatch":
105
+ return old === undefined || old.status === "unused"
106
+ ? "The new code keeps this namespace in a different slot than its annotation says. Fix one of the two before deploying."
107
+ : "The storage did not move, but the new annotation does not match its code. Fix it before deploying.";
108
+ case "dropped":
109
+ return (`The new code stops assigning this namespace while its data is at ${fmt(old.actual)}, ` +
110
+ `not at ${fmt(old.expected)} where its annotation points: a later version that follows ` +
111
+ "the annotation would miss it. Correct the annotation to match the data first.");
112
+ case "unread":
113
+ return old !== undefined && old.actual === undefined && old.status !== "unused"
114
+ ? "The old slot is not known (not read from its code, or missing from an older record), so this namespace could not be checked."
115
+ : "The slot in the new code could not be read (set from a value slotdiff does not evaluate), so this namespace could not be checked.";
116
+ }
117
+ // The only unused case shown without a problem: the new code stops assigning old data.
118
+ if (next?.status === "unused" && old?.actual !== undefined) {
119
+ return `The new code no longer assigns this namespace; its data stays at ${fmt(old.actual)}.`;
120
+ }
121
+ return next !== undefined
122
+ ? "Same slot in code on both sides: the storage did not move. Compared as one namespace."
123
+ : "The deployed annotation does not match its code, and no namespace in the new code uses its slot.";
124
+ }
125
+ /**
126
+ * Short slots for a block, unless two different slots in it would then look
127
+ * the same: a hand-written constant can share both ends with another.
128
+ */
129
+ function formatter(sides) {
130
+ const slots = new Set(sides.flatMap((s) => (s === undefined ? [] : [s.expected, s.actual ?? s.expected])));
131
+ const shorts = new Set([...slots].map(short));
132
+ return shorts.size === slots.size ? short : (slot) => slot;
133
+ }
134
+ /** `0x5ea2…5c00`: enough to tell slots apart; slotdiff does the comparing. */
135
+ function short(slot) {
136
+ return `${slot.slice(0, 6)}…${slot.slice(-4)}`;
137
+ }
138
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
package/dist/resolve.d.ts CHANGED
@@ -11,6 +11,7 @@ import type { StorageLayout } from "@openzeppelin/upgrades-core";
11
11
  import { type DeployedBytecodeMatch, type ImmutableReferences } from "./bytecode.js";
12
12
  import { type EthProvider } from "./chain.js";
13
13
  import { type ExplorerConfig } from "./explorer.js";
14
+ import { type ProxyKind, type ReconstructedLayout } from "./reconstruct.js";
14
15
  import { type LayoutRecord } from "./record.js";
15
16
  import { type SolcOptions } from "./solc.js";
16
17
  export interface ResolveOptions {
@@ -23,11 +24,23 @@ export interface ResolveOptions {
23
24
  * your own saved record first (`verifyRecord`) to skip that.
24
25
  */
25
26
  export declare function resolveLayout(provider: EthProvider, address: string, options: ResolveOptions): Promise<LayoutRecord>;
27
+ /**
28
+ * `resolveLayout` plus the analysis of the verified source: the proxy kind,
29
+ * inferred from the code as OpenZeppelin recommends (not from the admin slot,
30
+ * which a UUPS proxy can have set), the ERC-7201 slots and the safety check.
31
+ * Internal, for the CLI.
32
+ */
33
+ export declare function rebuild(provider: EthProvider, address: string, options: ResolveOptions): Promise<{
34
+ record: LayoutRecord;
35
+ analysis: ReconstructedLayout;
36
+ }>;
26
37
  export interface ProxyLayout {
27
38
  /** The implementation the proxy runs now. */
28
39
  implementation: string;
29
40
  /** Set for a beacon proxy. */
30
41
  beacon?: string;
42
+ /** The proxy's kind, for `checkUpgrade`: `beacon` behind a beacon, else the record's. */
43
+ kind: ProxyKind;
31
44
  record: LayoutRecord;
32
45
  }
33
46
  /** `resolveLayout` for whatever implementation `proxy` runs right now (ERC-1967 or beacon). */
@@ -39,6 +52,9 @@ export interface LocalBuild {
39
52
  layout: StorageLayout;
40
53
  deployedBytecode: string;
41
54
  immutableReferences?: ImmutableReferences;
55
+ /** From `analyzeSource`, so the record carries them (see `LayoutRecord`). */
56
+ kind?: LayoutRecord["kind"];
57
+ namespaces?: LayoutRecord["namespaces"];
42
58
  }
43
59
  export interface LocalBuildResult {
44
60
  bytecodeMatch: DeployedBytecodeMatch;
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAgD,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5F,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAED,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,+FAA+F;AAC/F,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,WAAW,CAAC,CAStB;AAED,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,qBAAqB,CAAC;IACrC,gFAAgF;IAChF,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAgD,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5F,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAqB,KAAK,SAAS,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,CAAC,CA4BlE;AAED,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,+FAA+F;AAC/F,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,WAAW,CAAC,CAUtB;AAED,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,6EAA6E;IAC7E,IAAI,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5B,UAAU,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,qBAAqB,CAAC;IACrC,gFAAgF;IAChF,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,gBAAgB,CAAC,CA0B3B"}
package/dist/resolve.js CHANGED
@@ -20,6 +20,15 @@ import { getSolc } from "./solc.js";
20
20
  * your own saved record first (`verifyRecord`) to skip that.
21
21
  */
22
22
  export async function resolveLayout(provider, address, options) {
23
+ return (await rebuild(provider, address, options)).record;
24
+ }
25
+ /**
26
+ * `resolveLayout` plus the analysis of the verified source: the proxy kind,
27
+ * inferred from the code as OpenZeppelin recommends (not from the admin slot,
28
+ * which a UUPS proxy can have set), the ERC-7201 slots and the safety check.
29
+ * Internal, for the CLI.
30
+ */
31
+ export async function rebuild(provider, address, options) {
23
32
  const lower = address.toLowerCase();
24
33
  if (!canQueryExplorer(options.explorer)) {
25
34
  throw new LayoutUnavailableError(`Cannot rebuild the layout of ${lower}: the explorer needs an apiKey or an apiUrl.`);
@@ -29,7 +38,7 @@ export async function resolveLayout(provider, address, options) {
29
38
  const source = await fetchVerifiedSource(chainId, lower, options.explorer);
30
39
  const solc = await getSolc(source.solcLongVersion, options.solc);
31
40
  const rebuilt = await reconstructLayout(source, solc, code);
32
- return {
41
+ const record = {
33
42
  format: 1,
34
43
  address: lower,
35
44
  chainId,
@@ -40,7 +49,10 @@ export async function resolveLayout(provider, address, options) {
40
49
  source: "explorer",
41
50
  recordedAt: new Date().toISOString(),
42
51
  layout: rebuilt.layout,
52
+ kind: rebuilt.kind,
53
+ namespaces: rebuilt.namespaces,
43
54
  };
55
+ return { record, analysis: rebuilt };
44
56
  }
45
57
  /** `resolveLayout` for whatever implementation `proxy` runs right now (ERC-1967 or beacon). */
46
58
  export async function resolveProxyLayout(provider, proxy, options) {
@@ -49,7 +61,8 @@ export async function resolveProxyLayout(provider, proxy, options) {
49
61
  throw new LayoutUnavailableError(`${proxy} has no ERC-1967 implementation or beacon slot set on this chain.`);
50
62
  }
51
63
  const record = await resolveLayout(provider, state.implementation, options);
52
- return { ...state, record };
64
+ // A rebuilt record always has its kind.
65
+ return { ...state, kind: state.beacon !== undefined ? "beacon" : record.kind, record };
53
66
  }
54
67
  /**
55
68
  * Makes a record from a local build of the code at `address`, but only after
@@ -73,6 +86,8 @@ export async function proveLocalBuild(provider, address, build) {
73
86
  source: "local-compile",
74
87
  recordedAt: new Date().toISOString(),
75
88
  layout: build.layout,
89
+ ...(build.kind !== undefined ? { kind: build.kind } : {}),
90
+ ...(build.namespaces !== undefined ? { namespaces: build.namespaces } : {}),
76
91
  };
77
92
  // A record this returns must load back through parseRecord, so check it now.
78
93
  return { bytecodeMatch, record: parseRecord(JSON.parse(JSON.stringify(record)), lower) };
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
package/dist/solc.js CHANGED
@@ -13,9 +13,9 @@
13
13
  */
14
14
  import { spawn } from "node:child_process";
15
15
  import { createHash, randomUUID } from "node:crypto";
16
- import { access, chmod, mkdir, readdir, rename, writeFile } from "node:fs/promises";
16
+ import { access, chmod, mkdir, mkdtemp, readdir, rename, rm, writeFile } from "node:fs/promises";
17
17
  import { constants } from "node:fs";
18
- import { homedir } from "node:os";
18
+ import { homedir, tmpdir } from "node:os";
19
19
  import { join } from "node:path";
20
20
  import { LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
21
21
  const BINARIES_URL = "https://binaries.soliditylang.org";
@@ -108,6 +108,10 @@ async function findBuild(platform, version, fetchImpl) {
108
108
  if (build === undefined) {
109
109
  throw new LayoutUnavailableError(`solc ${version} has no native ${platform} build.`);
110
110
  }
111
+ // Both become paths: a release is matched by prefix, so its long version comes from the list.
112
+ if (!SOLC_VERSION.test(build.longVersion) || !/^[\w.+-]+$/.test(build.path)) {
113
+ throw new LayoutUnavailableError(`The solc build list has a malformed entry for ${version}.`);
114
+ }
111
115
  // Old Windows releases (up to 0.7.1) ship as zip archives, not executables.
112
116
  if (build.path.endsWith(".zip")) {
113
117
  throw new LayoutUnavailableError(`solc ${build.longVersion} for ${platform} ships as a zip archive; pass a compiler via solc.resolvePath.`);
@@ -130,9 +134,21 @@ async function download(platform, build, dest, fetchImpl) {
130
134
  await chmod(tmp, 0o755);
131
135
  await rename(tmp, dest);
132
136
  }
133
- function runSolc(path, input) {
137
+ // solc reads imports it is not given from its working directory, so it runs in
138
+ // an empty one: verified source could otherwise import, and quote in an error,
139
+ // any file under the caller's (an .env, say).
140
+ async function runSolc(path, input) {
141
+ const cwd = await mkdtemp(join(tmpdir(), "slotdiff-solc-"));
142
+ try {
143
+ return await runSolcIn(cwd, path, input);
144
+ }
145
+ finally {
146
+ await rm(cwd, { recursive: true, force: true });
147
+ }
148
+ }
149
+ function runSolcIn(cwd, path, input) {
134
150
  return new Promise((resolve, reject) => {
135
- const child = spawn(path, ["--standard-json"], { stdio: ["pipe", "pipe", "pipe"] });
151
+ const child = spawn(path, ["--standard-json"], { cwd, stdio: ["pipe", "pipe", "pipe"] });
136
152
  const out = [];
137
153
  const err = [];
138
154
  child.stdout.on("data", (d) => out.push(d));
package/dist/solc.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"solc.js","sourceRoot":"","sources":["../src/solc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solc.js","sourceRoot":"","sources":["../src/solc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The whole upgrade check in one call, as the CLI runs it: the storage layout,
3
+ * the ERC-7201 slots and OpenZeppelin's safety rules, with one verdict.
4
+ */
5
+ import type { StorageLayout } from "@openzeppelin/upgrades-core";
6
+ import { type DiffOptions, type LayoutReport } from "./diff.js";
7
+ import { type NamespaceCheck, type NamespaceSlot } from "./erc7201.js";
8
+ import type { ProxyKind, SafetyErrorKind, SafetyReport, SourceAnalysis } from "./reconstruct.js";
9
+ export interface UpgradeOptions extends DiffOptions {
10
+ /** Error kinds to accept anyway (OZ's `unsafeAllow`). Prefer NatSpec exceptions in the source. */
11
+ unsafeAllow?: SafetyErrorKind[];
12
+ /** Skip the safety rules; the layout and slots are still checked. */
13
+ skipSafety?: boolean;
14
+ }
15
+ /** A layout with the slot of each namespace, such as a `LayoutRecord` or a `SourceAnalysis`. */
16
+ export interface UpgradeSide {
17
+ layout: StorageLayout;
18
+ /** Without them, the namespaces are unchecked. */
19
+ namespaces?: NamespaceSlot[];
20
+ }
21
+ export interface UpgradeCheck {
22
+ /** OpenZeppelin's comparison, with each namespace paired by the slot in code. */
23
+ layout: LayoutReport;
24
+ namespaces: NamespaceCheck;
25
+ /** Absent with `skipSafety`: then `pass` covers the layout and slots only. */
26
+ safety?: SafetyReport;
27
+ /**
28
+ * `fail`: a check failed. `unchecked`: none failed, but an ERC-7201 slot
29
+ * could not be read (`unread` in `namespaces`). `pass`: every check that ran passed.
30
+ */
31
+ result: "pass" | "fail" | "unchecked";
32
+ }
33
+ /**
34
+ * Whether `next` can replace `old` behind a proxy. `old.kind` is the kind of
35
+ * the proxy being upgraded (`beacon` when a beacon serves it): taking it from
36
+ * `next` would let a UUPS implementation that lost its upgrade function pass.
37
+ * `old` may be a `SourceAnalysis`, or a `LayoutRecord` with its `kind` given.
38
+ * With `skipSafety`, `next` may be a record too, and `old.kind` is not needed.
39
+ */
40
+ export declare function checkUpgrade(old: UpgradeSide & {
41
+ kind: ProxyKind;
42
+ }, next: SourceAnalysis, options?: UpgradeOptions): UpgradeCheck;
43
+ export declare function checkUpgrade(old: UpgradeSide & {
44
+ kind?: ProxyKind;
45
+ }, next: UpgradeSide, options: UpgradeOptions & {
46
+ skipSafety: true;
47
+ }): UpgradeCheck;
48
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEjG,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,kGAAkG;IAClG,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,gGAAgG;AAChG,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,cAAc,CAAC;IAC3B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;CACvC;AAID;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,WAAW,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,EACtC,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,cAAc,GACvB,YAAY,CAAC;AAChB,wBAAgB,YAAY,CAC1B,GAAG,EAAE,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,EACvC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,cAAc,GAAG;IAAE,UAAU,EAAE,IAAI,CAAA;CAAE,GAC7C,YAAY,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The whole upgrade check in one call, as the CLI runs it: the storage layout,
3
+ * the ERC-7201 slots and OpenZeppelin's safety rules, with one verdict.
4
+ */
5
+ import { diffLayouts } from "./diff.js";
6
+ import { checkNamespaces } from "./erc7201.js";
7
+ const PROXY_KINDS = ["uups", "transparent", "beacon"];
8
+ export function checkUpgrade(old, next, options = {}) {
9
+ if (!options.skipSafety) {
10
+ // Checked here for JavaScript callers: OpenZeppelin treats an unknown kind as uups.
11
+ if (!PROXY_KINDS.includes(old.kind)) {
12
+ throw new Error(`checkUpgrade needs the kind of the proxy being upgraded (${PROXY_KINDS.join(", ")}), ` +
13
+ `got ${JSON.stringify(old.kind)}.`);
14
+ }
15
+ if (typeof next.safety !== "function") {
16
+ throw new Error("checkUpgrade needs an analysis of next (analyzeSource), or skipSafety.");
17
+ }
18
+ }
19
+ // OpenZeppelin matches namespaces by annotation; pairing them by slot first
20
+ // makes it compare the structs of the same storage.
21
+ const namespaces = checkNamespaces(old, next);
22
+ const layout = diffLayouts(namespaces.layout, next.layout, {
23
+ unsafeAllowRenames: options.unsafeAllowRenames,
24
+ });
25
+ const safety = options.skipSafety
26
+ ? undefined
27
+ : next.safety({ kind: old.kind, unsafeAllow: options.unsafeAllow });
28
+ // A failure outranks an unread slot, so a known problem is never reported as merely unchecked.
29
+ const result = !layout.ok || namespaces.result === "fail" || safety?.ok === false
30
+ ? "fail"
31
+ : namespaces.result === "unchecked"
32
+ ? "unchecked"
33
+ : "pass";
34
+ return { layout, namespaces, ...(safety !== undefined ? { safety } : {}), result };
35
+ }
36
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAuC,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,eAAe,EAA2C,MAAM,cAAc,CAAC;AA8BxF,MAAM,WAAW,GAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAmBzE,MAAM,UAAU,YAAY,CAC1B,GAAuC,EACvC,IAAyD,EACzD,UAA0B,EAAE;IAE5B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,oFAAoF;QACpF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAc,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,4DAA4D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;gBACrF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CACrC,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,4EAA4E;IAC5E,oDAAoD;IACpD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;QACzD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC/C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,CAAC,MAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAK,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxE,+FAA+F;IAC/F,MAAM,MAAM,GACV,CAAC,MAAM,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,EAAE,EAAE,KAAK,KAAK;QAChE,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,WAAW;YACjC,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AACrF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slotdiff",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.3.0",
4
4
  "description": "Storage layout diff for upgradeable Solidity contracts: compare a local build or a live deployment against another",
5
5
  "license": "MIT",
6
6
  "author": "Rohit Solia (https://github.com/rokso)",
@@ -15,6 +15,9 @@
15
15
  "type": "module",
16
16
  "main": "./dist/index.js",
17
17
  "types": "./dist/index.d.ts",
18
+ "bin": {
19
+ "slotdiff": "./dist/bin.js"
20
+ },
18
21
  "exports": {
19
22
  ".": {
20
23
  "types": "./dist/index.d.ts",
@@ -50,13 +53,13 @@
50
53
  "eslint": "^10.2.0",
51
54
  "eslint-config-prettier": "^10.1.8",
52
55
  "globals": "^17.5.0",
53
- "prettier": "^3.8.2",
54
- "typescript": "^5.7.0",
56
+ "prettier": "^3.9.10",
57
+ "typescript": "^6.0.3",
55
58
  "typescript-eslint": "^8.58.2",
56
- "vitest": "^4.1.0"
59
+ "vitest": "^5.0.3"
57
60
  },
58
61
  "engines": {
59
- "node": ">=22.12.0"
62
+ "node": ">=22.13.0"
60
63
  },
61
64
  "keywords": [
62
65
  "ethereum",
@@ -64,7 +67,7 @@
64
67
  "upgradeable",
65
68
  "proxy",
66
69
  "storage-layout",
67
- "upgrade-safety",
70
+ "erc7201",
68
71
  "foundry",
69
72
  "hardhat"
70
73
  ],
package/src/bin.ts ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { styleText } from "node:util";
3
+ import { run } from "./cli.js";
4
+
5
+ // A reader that stops early, such as `| head`, is not an error.
6
+ process.stdout.on("error", (e: NodeJS.ErrnoException) => {
7
+ if (e.code !== "EPIPE") throw e;
8
+ process.exit();
9
+ });
10
+
11
+ run(process.argv.slice(2), {
12
+ stdout: (line) => console.log(line),
13
+ stderr: (line) => console.error(line),
14
+ tty: process.stdout.isTTY === true,
15
+ // Node's own rules for color: a terminal that has them, NO_COLOR, FORCE_COLOR.
16
+ color: styleText("red", "x", { stream: process.stdout }) !== "x",
17
+ }).then(
18
+ (code) => {
19
+ process.exitCode = code;
20
+ },
21
+ (e: unknown) => {
22
+ console.error(e);
23
+ process.exitCode = 2;
24
+ },
25
+ );