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
package/dist/explorer.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * rebuilding from them means guessing; the bytecode proof would reject a wrong
7
7
  * guess, but refusing up front gives a clearer error.
8
8
  */
9
- import { LayoutUnavailableError } from "./errors.js";
9
+ import { errorCode, LayoutUnavailableError, printable } from "./errors.js";
10
10
  export const ETHERSCAN_V2_API_URL = "https://api.etherscan.io/v2/api";
11
11
  const RATE_LIMIT = /rate limit/i;
12
12
  // Key problems are the user's to fix and must surface; anything else the
@@ -43,7 +43,7 @@ async function requestWithRetry(url, fetchImpl) {
43
43
  }
44
44
  catch (e) {
45
45
  // Messages never include the URL, which carries the API key.
46
- throw new LayoutUnavailableError(`Explorer unreachable: ${e.message}`);
46
+ throw new LayoutUnavailableError(`Explorer unreachable (${errorCode(e)}).`);
47
47
  }
48
48
  if (res.status === 429 && retry) {
49
49
  await backoff(attempt);
@@ -69,7 +69,10 @@ async function requestWithRetry(url, fetchImpl) {
69
69
  }
70
70
  return entry;
71
71
  }
72
- const detail = typeof body.result === "string" ? body.result : (body.message ?? "unknown error");
72
+ // One line: a line break could draw a verdict of its own under the error.
73
+ const detail = printable(String(typeof body.result === "string" ? body.result : (body.message ?? "unknown error")))
74
+ .replace(/\s+/g, " ")
75
+ .slice(0, 300);
73
76
  // Before the key check: Etherscan's rate-limit message mentions the API key.
74
77
  if (RATE_LIMIT.test(detail)) {
75
78
  if (retry) {
@@ -86,6 +89,9 @@ async function requestWithRetry(url, fetchImpl) {
86
89
  function backoff(attempt) {
87
90
  return new Promise((r) => setTimeout(r, 1000 * attempt));
88
91
  }
92
+ // Control characters other than tabs and line breaks (\v, \f and \r included).
93
+ // eslint-disable-next-line no-control-regex
94
+ const CONTROL = /[\u0000-\u0008\u000e-\u001f\u007f-\u009f]/;
89
95
  /** Exported for tests. */
90
96
  export function parseSourceCodeEntry(entry, address) {
91
97
  const raw = entry.SourceCode ?? "";
@@ -94,21 +100,34 @@ export function parseSourceCodeEntry(entry, address) {
94
100
  }
95
101
  const compilerVersion = entry.CompilerVersion ?? "";
96
102
  if (!compilerVersion.startsWith("v0.")) {
97
- throw new LayoutUnavailableError(`Contract ${address} was verified with "${compilerVersion}"; only Solidity is supported.`);
103
+ throw new LayoutUnavailableError(`Contract ${address} was verified with "${printable(compilerVersion).slice(0, 80)}"; ` +
104
+ "only Solidity is supported.");
98
105
  }
99
106
  if (!/^v\d+\.\d+\.\d+(?:-nightly\.\d+\.\d+\.\d+|-pre\.\d+)?\+commit\.[0-9a-f]+$/.test(compilerVersion)) {
100
- throw new LayoutUnavailableError(`Contract ${address} reports an unrecognized compiler version "${compilerVersion}".`);
107
+ throw new LayoutUnavailableError(`Contract ${address} reports an unrecognized compiler version ` +
108
+ `"${printable(compilerVersion).slice(0, 80)}".`);
101
109
  }
102
110
  const input = parseStandardJson(raw);
103
111
  if (input === undefined) {
104
112
  throw new LayoutUnavailableError(`Contract ${address} is verified as flattened or multi-file source, not standard-json. ` +
105
113
  `Its compiler settings cannot be reconstructed exactly.`);
106
114
  }
107
- return {
108
- input,
109
- solcLongVersion: compilerVersion.slice(1),
110
- contractName: entry.ContractName ?? "",
111
- };
115
+ // Names, paths and source text (annotations, quoted by solc) reach the
116
+ // screen; real source holds no control characters but tabs and line breaks.
117
+ const contractName = entry.ContractName ?? "";
118
+ const sources = Object.values(input.sources);
119
+ // Every source inline: solc would fetch `urls` itself.
120
+ if (sources.some((s) => typeof s?.content !== "string")) {
121
+ throw new LayoutUnavailableError(`Contract ${address} is verified with sources that are not inline (urls); only content is read.`);
122
+ }
123
+ const contents = sources.map((s) => s.content);
124
+ if (
125
+ // Names and paths are printed on one line: no whitespace but a space.
126
+ [contractName, ...Object.keys(input.sources)].some((s) => printable(s) !== s || /[^\S ]/.test(s)) ||
127
+ contents.some((s) => CONTROL.test(s))) {
128
+ throw new LayoutUnavailableError(`Contract ${address} is verified with control characters in its name, paths or source.`);
129
+ }
130
+ return { input, solcLongVersion: compilerVersion.slice(1), contractName };
112
131
  }
113
132
  // Etherscan wraps standard-json in an extra pair of braces (`{{...}}`); some
114
133
  // compatible explorers return it unwrapped.
@@ -1 +1 @@
1
- {"version":3,"file":"explorer.js","sourceRoot":"","sources":["../src/explorer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"explorer.js","sourceRoot":"","sources":["../src/explorer.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,8 +4,11 @@ export { parseRecord, verifyRecord, type LayoutRecord } from "./record.js";
4
4
  export { readProxy, readImplementation, readCode, readChainId, type EthProvider, type ProxyState, } from "./chain.js";
5
5
  export { fetchVerifiedSource, ETHERSCAN_V2_API_URL, type ExplorerConfig, type VerifiedSource, } from "./explorer.js";
6
6
  export { getSolc, type SolcOptions, type SolcRunner } from "./solc.js";
7
- export { layoutFromSource } from "./reconstruct.js";
7
+ export { findBuildInfo, type BuildInfoOptions, type BuildInfoContract } from "./build-info.js";
8
+ export { checkNamespaces, type NamespaceCheck, type NamespacePair, type NamespaceSlot, } from "./erc7201.js";
9
+ export { checkUpgrade, type UpgradeCheck, type UpgradeOptions, type UpgradeSide, } from "./upgrade.js";
10
+ export { analyzeSource, analyzeBuild, type BuildAnalysis, type BuildCompiler, SAFETY_ERROR_KINDS, type SourceAnalysis, type SafetyOptions, type SafetyReport, type SafetyError, type SafetyErrorKind, type ProxyKind, } from "./reconstruct.js";
8
11
  export { compareDeployedBytecode, isProvingMatch, type DeployedBytecodeMatch, type ProvingMatch, type ImmutableReferences, } from "./bytecode.js";
9
- export { LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
10
- export type { SolcInput, StorageLayout } from "@openzeppelin/upgrades-core";
12
+ export { IncompleteBuildError, LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
13
+ export type { SolcInput, SolcOutput, StorageLayout } from "@openzeppelin/upgrades-core";
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjG,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -4,7 +4,10 @@ export { parseRecord, verifyRecord } from "./record.js";
4
4
  export { readProxy, readImplementation, readCode, readChainId, } from "./chain.js";
5
5
  export { fetchVerifiedSource, ETHERSCAN_V2_API_URL, } from "./explorer.js";
6
6
  export { getSolc } from "./solc.js";
7
- export { layoutFromSource } from "./reconstruct.js";
7
+ export { findBuildInfo } from "./build-info.js";
8
+ export { checkNamespaces, } from "./erc7201.js";
9
+ export { checkUpgrade, } from "./upgrade.js";
10
+ export { analyzeSource, analyzeBuild, SAFETY_ERROR_KINDS, } from "./reconstruct.js";
8
11
  export { compareDeployedBytecode, isProvingMatch, } from "./bytecode.js";
9
- export { LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
12
+ export { IncompleteBuildError, LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
10
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAuC,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,GAKhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,WAAW,GAGZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GAGrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAqC,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,cAAc,GAIf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAuC,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,GAKhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,WAAW,GAGZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GAGrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAqC,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,aAAa,EAAiD,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EACL,eAAe,GAIhB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,GAIb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,YAAY,EAGZ,kBAAkB,GAOnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,cAAc,GAIf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
@@ -6,22 +6,85 @@
6
6
  * the local build (full compile, namespaced second pass, `validate()`,
7
7
  * `getStorageLayout`), so both sides of a comparison are extracted identically.
8
8
  */
9
- import { type SolcInput, type StorageLayout } from "@openzeppelin/upgrades-core";
9
+ import { type ProxyDeployment, type SolcInput, type SolcOutput, type StorageLayout } from "@openzeppelin/upgrades-core";
10
10
  import { type ProvingMatch } from "./bytecode.js";
11
+ import { type NamespaceSlot } from "./erc7201.js";
11
12
  import type { VerifiedSource } from "./explorer.js";
12
13
  import type { SolcRunner } from "./solc.js";
13
- export interface ReconstructedLayout {
14
+ export interface ReconstructedLayout extends SourceAnalysis {
14
15
  /** Fully qualified name, `source.sol:Contract`. */
15
16
  contract: string;
16
17
  compiler: string;
17
18
  bytecodeMatch: ProvingMatch;
18
- layout: StorageLayout;
19
19
  }
20
20
  export declare function reconstructLayout(source: VerifiedSource, solc: SolcRunner, onchainCode: string): Promise<ReconstructedLayout>;
21
+ export type ProxyKind = ProxyDeployment["kind"];
22
+ /**
23
+ * OpenZeppelin's safety error kinds, without the deprecated struct-definition
24
+ * and enum-definition, which the check never reports. Listed here, not taken
25
+ * from OpenZeppelin, so its releases cannot change this API unseen; a test
26
+ * compares the two.
27
+ */
28
+ export declare const SAFETY_ERROR_KINDS: readonly ["state-variable-assignment", "state-variable-immutable", "external-library-linking", "constructor", "delegatecall", "selfdestruct", "missing-public-upgradeto", "internal-function-storage", "missing-initializer", "missing-initializer-call", "duplicate-initializer-call", "incorrect-initializer-order"];
29
+ export type SafetyErrorKind = (typeof SAFETY_ERROR_KINDS)[number];
30
+ export interface SafetyError {
31
+ /** OpenZeppelin's error kind, such as `constructor`. */
32
+ kind: SafetyErrorKind;
33
+ /** Where, as `file.sol:line`. */
34
+ src: string;
35
+ }
36
+ export interface SafetyOptions {
37
+ /**
38
+ * The proxy being upgraded; only `uups` requires an `upgradeToAndCall`.
39
+ * Required: the new contract's own `kind` would let a UUPS implementation
40
+ * that lost its upgrade function pass.
41
+ */
42
+ kind: ProxyKind;
43
+ /** Error kinds to accept anyway (OZ's `unsafeAllow`). Prefer NatSpec exceptions in the source. */
44
+ unsafeAllow?: SafetyErrorKind[];
45
+ }
46
+ export interface SafetyReport {
47
+ ok: boolean;
48
+ errors: SafetyError[];
49
+ /** OpenZeppelin's description of each error; `color` (default true) adds terminal colors. */
50
+ explain(color?: boolean): string;
51
+ }
52
+ export interface SourceAnalysis {
53
+ layout: StorageLayout;
54
+ /** `uups` when the contract has `upgradeTo` or `upgradeToAndCall`, else `transparent`. */
55
+ kind: Exclude<ProxyKind, "beacon">;
56
+ /**
57
+ * The slot each ERC-7201 namespace really uses, read from the code
58
+ * (`$.slot := LOCATION`); OpenZeppelin trusts the annotation alone.
59
+ */
60
+ namespaces: NamespaceSlot[];
61
+ /**
62
+ * OpenZeppelin's safety check (constructors, `selfdestruct`,
63
+ * `delegatecall`, initial values, immutables, initializers), honoring
64
+ * `@custom:oz-upgrades-unsafe-allow` in the source.
65
+ */
66
+ safety(options: SafetyOptions): SafetyReport;
67
+ }
68
+ /**
69
+ * The layout of `contract` (`source.sol:Name`) in `input`, its ERC-7201 slots
70
+ * and OpenZeppelin's safety check, from one compile. No bytecode proof: only
71
+ * for sources whose provenance is already known, such as a project's own build info.
72
+ */
73
+ export declare function analyzeSource(input: SolcInput, solc: BuildCompiler, contract: string): Promise<SourceAnalysis>;
74
+ /** The compiler for OpenZeppelin's namespaced pass: a `SolcRunner`, or a build tool's. */
75
+ export type BuildCompiler = Pick<SolcRunner, "longVersion" | "compile">;
76
+ export interface BuildAnalysis {
77
+ /** The analysis of one contract in the build, `source.sol:Name`. */
78
+ contract(contract: string): SourceAnalysis;
79
+ }
21
80
  /**
22
- * The layout of `contract` (`source.sol:Name`) in `input`, with no bytecode
23
- * proof. Only for sources whose provenance is already known, such as a
24
- * project's own build-info.
81
+ * `analyzeSource` for a build you already compiled, such as a build tool's,
82
+ * without compiling it again: one namespaced pass and one validation serve
83
+ * every contract in it. `output` must hold every source's `ast` and, for each
84
+ * contract, its `metadata`, `storageLayout` (an interface or library may lack
85
+ * it) and `evm.bytecode` (`object`, `linkReferences`); without them it throws
86
+ * `IncompleteBuildError`. The metadata proves `output` was compiled from
87
+ * `input`'s sources by `compiler`'s version (not with its settings).
25
88
  */
26
- export declare function layoutFromSource(input: SolcInput, solc: SolcRunner, contract: string): Promise<StorageLayout>;
89
+ export declare function analyzeBuild(input: SolcInput, output: SolcOutput, compiler: BuildCompiler): Promise<BuildAnalysis>;
27
90
  //# sourceMappingURL=reconstruct.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reconstruct.d.ts","sourceRoot":"","sources":["../src/reconstruct.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAOL,KAAK,SAAS,EAEd,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;CACvB;AAoBD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAiB9B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAIxB"}
1
+ {"version":3,"file":"reconstruct.d.ts","sourceRoot":"","sources":["../src/reconstruct.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAWL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,YAAY,CAAC;CAC7B;AAqBD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAiB9B;AAED,MAAM,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;AAIhD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,wTAarB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,IAAI,EAAE,eAAe,CAAC;IACtB,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB,kGAAkG;IAClG,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,6FAA6F;IAC7F,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,0FAA0F;IAC1F,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnC;;;OAGG;IACH,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED,0FAA0F;AAC1F,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CAIxB"}
@@ -6,9 +6,10 @@
6
6
  * the local build (full compile, namespaced second pass, `validate()`,
7
7
  * `getStorageLayout`), so both sides of a comparison are extracted identically.
8
8
  */
9
- import { getStorageLayout, isNamespaceSupported, makeNamespacedInput, solcInputOutputDecoder, trySanitizeNatSpec, validate, } from "@openzeppelin/upgrades-core";
9
+ import { getErrors, getStorageLayout, hashBytecode, inferProxyKind, isNamespaceSupported, makeNamespacedInput, solcInputOutputDecoder, trySanitizeNatSpec, UpgradeableContractErrorReport, validate, } from "@openzeppelin/upgrades-core";
10
10
  import { compareDeployedBytecode, isProvingMatch } from "./bytecode.js";
11
- import { LayoutIntegrityError } from "./errors.js";
11
+ import { namespaceSlots } from "./erc7201.js";
12
+ import { IncompleteBuildError, LayoutIntegrityError, printable } from "./errors.js";
12
13
  // validate() reads evm.bytecode for every contract, so codegen is requested
13
14
  // for all of them. A verified input holds only the target's dependency graph.
14
15
  const FULL_SELECTION = {
@@ -19,6 +20,7 @@ const FULL_SELECTION = {
19
20
  "evm.bytecode.linkReferences",
20
21
  "evm.deployedBytecode.object",
21
22
  "evm.deployedBytecode.immutableReferences",
23
+ "metadata",
22
24
  ],
23
25
  "": ["ast"],
24
26
  },
@@ -33,36 +35,171 @@ export async function reconstructLayout(source, solc, onchainCode) {
33
35
  contract,
34
36
  compiler: source.solcLongVersion,
35
37
  bytecodeMatch,
36
- layout: await extractLayout(input, output, solc, contract),
38
+ ...(await analyzeBuild(input, output, solc)).contract(contract),
37
39
  };
38
40
  }
39
41
  /**
40
- * The layout of `contract` (`source.sol:Name`) in `input`, with no bytecode
41
- * proof. Only for sources whose provenance is already known, such as a
42
- * project's own build-info.
42
+ * OpenZeppelin's safety error kinds, without the deprecated struct-definition
43
+ * and enum-definition, which the check never reports. Listed here, not taken
44
+ * from OpenZeppelin, so its releases cannot change this API unseen; a test
45
+ * compares the two.
43
46
  */
44
- export async function layoutFromSource(input, solc, contract) {
47
+ export const SAFETY_ERROR_KINDS = [
48
+ "state-variable-assignment",
49
+ "state-variable-immutable",
50
+ "external-library-linking",
51
+ "constructor",
52
+ "delegatecall",
53
+ "selfdestruct",
54
+ "missing-public-upgradeto",
55
+ "internal-function-storage",
56
+ "missing-initializer",
57
+ "missing-initializer-call",
58
+ "duplicate-initializer-call",
59
+ "incorrect-initializer-order",
60
+ ];
61
+ /**
62
+ * The layout of `contract` (`source.sol:Name`) in `input`, its ERC-7201 slots
63
+ * and OpenZeppelin's safety check, from one compile. No bytecode proof: only
64
+ * for sources whose provenance is already known, such as a project's own build info.
65
+ */
66
+ export async function analyzeSource(input, solc, contract) {
45
67
  const selected = withOutputSelection(input, FULL_SELECTION);
46
68
  const output = await compileOrThrow(solc, selected, "source");
47
- return extractLayout(selected, output, solc, contract);
69
+ return (await analyzeBuild(selected, output, solc)).contract(contract);
48
70
  }
49
- async function extractLayout(input, output, solc, contract) {
50
- const solcVersion = solc.longVersion.split("+")[0];
51
- let namespacedOutput;
52
- if (isNamespaceSupported(solcVersion)) {
53
- let namespacedInput = makeNamespacedInput(input, output, solcVersion);
54
- namespacedInput = await trySanitizeNatSpec(namespacedInput, solcVersion);
55
- namespacedOutput = await compileOrThrow(solc, withOutputSelection(namespacedInput, LAYOUT_SELECTION), "namespaced pass");
71
+ /**
72
+ * `analyzeSource` for a build you already compiled, such as a build tool's,
73
+ * without compiling it again: one namespaced pass and one validation serve
74
+ * every contract in it. `output` must hold every source's `ast` and, for each
75
+ * contract, its `metadata`, `storageLayout` (an interface or library may lack
76
+ * it) and `evm.bytecode` (`object`, `linkReferences`); without them it throws
77
+ * `IncompleteBuildError`. The metadata proves `output` was compiled from
78
+ * `input`'s sources by `compiler`'s version (not with its settings).
79
+ */
80
+ export async function analyzeBuild(input, output, compiler) {
81
+ checkBuild(input, output, compiler.longVersion);
82
+ const runData = await validateBuild(input, output, compiler);
83
+ return { contract: (contract) => analyzeContract(runData, output, contract) };
84
+ }
85
+ /**
86
+ * The analysis reads layouts from `output` and edits `input` at the offsets in
87
+ * `output`'s ASTs, so the two must be one build, complete: an output from other
88
+ * sources could pass a changed layout, and one without an AST would leave every
89
+ * namespace unassigned, compared by annotation alone. Anything else is refused.
90
+ */
91
+ function checkBuild(input, output, longVersion) {
92
+ if (output.sources === undefined && Object.hasOwn(output, "_format")) {
93
+ throw new Error("The compiler output is wrapped in a build info file; pass its output field " +
94
+ "(Hardhat 3 writes { _format, output } to <id>.output.json).");
95
+ }
96
+ const paths = Object.keys(input.sources);
97
+ const outputPaths = Object.keys(output.sources ?? {});
98
+ if (paths.length !== outputPaths.length ||
99
+ paths.some((path) => !Object.hasOwn(output.sources, path))) {
100
+ throw new Error("The compiler output does not hold the same sources as the input.");
101
+ }
102
+ for (const path of paths) {
103
+ if (typeof input.sources[path].content !== "string") {
104
+ throw new Error(`The compiler input has no content for ${path}.`);
105
+ }
106
+ const ast = output.sources[path].ast;
107
+ if (ast === undefined) {
108
+ throw new IncompleteBuildError(`The compiler output has no ast for ${path}; it needs every source's ast.`);
109
+ }
110
+ for (const node of ast.nodes ?? []) {
111
+ if (node.nodeType !== "ContractDefinition")
112
+ continue;
113
+ const name = `${path}:${String(node.name)}`;
114
+ const c = output.contracts?.[path]?.[String(node.name)];
115
+ if (c === undefined)
116
+ throw new IncompleteBuildError(`The compiler output has no contract output for ${name}.`);
117
+ // Neither can hold state, and some tools (Foundry) leave their layout out.
118
+ const stateless = node.contractKind === "interface" || node.contractKind === "library";
119
+ if (typeof c.metadata !== "string" ||
120
+ (c.storageLayout === undefined && !stateless) ||
121
+ typeof c.evm?.bytecode?.object !== "string" ||
122
+ typeof c.evm.bytecode.linkReferences !== "object") {
123
+ throw new IncompleteBuildError(`The compiler output for ${name} lacks metadata, storageLayout or evm.bytecode ` +
124
+ `(object, linkReferences); compile with them in outputSelection.`);
125
+ }
126
+ proveSameBuild(input, path, name, c.metadata, longVersion);
127
+ }
128
+ }
129
+ }
130
+ function proveSameBuild(input, path, name, metadata, longVersion) {
131
+ let parsed;
132
+ try {
133
+ parsed = JSON.parse(metadata);
134
+ }
135
+ catch {
136
+ throw new LayoutIntegrityError(`The metadata for ${name} is not JSON.`);
137
+ }
138
+ const [version, commit] = String(parsed.compiler?.version).split("+");
139
+ const [wanted, wantedCommit] = longVersion.split("+");
140
+ if (version !== wanted ||
141
+ (commit !== undefined && wantedCommit !== undefined && commit !== wantedCommit)) {
142
+ throw new LayoutIntegrityError(`${name} was compiled by solc ${String(parsed.compiler?.version)}, not ${longVersion}.`);
143
+ }
144
+ // Its own source at least: metadata that lists none would prove nothing.
145
+ const sources = { [path]: {}, ...parsed.sources };
146
+ for (const [source, { keccak256 }] of Object.entries(sources)) {
147
+ const content = input.sources[source]?.content;
148
+ const hash = content === undefined ? undefined : "0x" + hashBytecode(Buffer.from(content).toString("hex"));
149
+ if (hash !== keccak256) {
150
+ throw new LayoutIntegrityError(`The compiler output for ${name} was not compiled from this input (${source} differs).`);
151
+ }
152
+ }
153
+ }
154
+ function analyzeContract(runData, output, contract) {
155
+ const colon = contract.lastIndexOf(":");
156
+ if (output.contracts?.[contract.slice(0, colon)]?.[contract.slice(colon + 1)] === undefined) {
157
+ throw new Error(`${contract} is not in the compiler input. Name it as source.sol:Contract, with the ` +
158
+ `source path exactly as the input has it (Hardhat 3 starts it with project/).`);
56
159
  }
57
- const runData = validate(output, solcInputOutputDecoder(input, output), solcVersion, input, namespacedOutput);
58
160
  const version = runData[contract]?.version;
59
161
  if (version === undefined) {
60
- throw new LayoutIntegrityError(`${contract} compiled to no bytecode; cannot derive its layout.`);
162
+ throw new LayoutIntegrityError(`${contract} compiled to no bytecode (an abstract contract or interface?); ` +
163
+ `cannot derive its layout.`);
61
164
  }
62
165
  // OZ looks the contract up by bytecode version and takes the first match, so
63
166
  // two contracts with identical code (possible without a source hash) could
64
- // swap layouts. Listing the target first makes the lookup land on it.
65
- return getStorageLayout({ [contract]: runData[contract], ...runData }, version);
167
+ // swap layouts or safety errors. Listing the target first makes every lookup land on it.
168
+ const data = { [contract]: runData[contract], ...runData };
169
+ // A copy: OpenZeppelin's layout points into the run data that every call shares.
170
+ const layout = structuredClone(getStorageLayout(data, version));
171
+ return {
172
+ layout,
173
+ // Typed as any ProxyKind, but only ever uups or transparent.
174
+ kind: inferProxyKind(data, version),
175
+ namespaces: namespaceSlots(output, contract, Object.keys(layout.namespaces ?? {})),
176
+ safety({ kind, unsafeAllow = [] }) {
177
+ // OpenZeppelin ignores a kind it does not know, so a typo would accept nothing silently.
178
+ const unknown = unsafeAllow.find((k) => !SAFETY_ERROR_KINDS.includes(k));
179
+ if (unknown !== undefined) {
180
+ throw new Error(`Unknown unsafeAllow error kind "${String(unknown)}". Known: ${SAFETY_ERROR_KINDS.join(", ")}.`);
181
+ }
182
+ // A copy: OpenZeppelin appends to the array it is given.
183
+ const opts = { kind, unsafeAllow: [...unsafeAllow] };
184
+ // The deprecated kinds are never reported, so every error has a SafetyErrorKind.
185
+ const errors = getErrors(data, version, opts);
186
+ return {
187
+ ok: errors.length === 0,
188
+ errors,
189
+ explain: (color) => new UpgradeableContractErrorReport(errors).explain(color),
190
+ };
191
+ },
192
+ };
193
+ }
194
+ async function validateBuild(input, output, compiler) {
195
+ const solcVersion = compiler.longVersion.split("+")[0];
196
+ let namespacedOutput;
197
+ if (isNamespaceSupported(solcVersion)) {
198
+ let namespacedInput = makeNamespacedInput(input, output, solcVersion);
199
+ namespacedInput = await trySanitizeNatSpec(namespacedInput, solcVersion);
200
+ namespacedOutput = await compileOrThrow(compiler, withOutputSelection(namespacedInput, LAYOUT_SELECTION), "namespaced pass");
201
+ }
202
+ return validate(output, solcInputOutputDecoder(input, output), solcVersion, input, namespacedOutput);
66
203
  }
67
204
  /**
68
205
  * Finds the compiled contract that matches the deployed code. The verified
@@ -121,7 +258,7 @@ async function compileOrThrow(solc, input, what) {
121
258
  const output = await solc.compile(input);
122
259
  const errors = (output.errors ?? []).filter((e) => e.severity === "error");
123
260
  if (errors.length > 0) {
124
- throw new LayoutIntegrityError(`solc ${solc.longVersion} failed to compile the ${what}: ${errors[0].formattedMessage}`);
261
+ throw new LayoutIntegrityError(`solc ${solc.longVersion} failed to compile the ${what}: ${printable(String(errors[0].formattedMessage))}`);
125
262
  }
126
263
  return output;
127
264
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../src/reconstruct.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../src/reconstruct.ts"],"names":[],"mappings":"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"}
package/dist/record.d.ts CHANGED
@@ -10,6 +10,8 @@
10
10
  import type { StorageLayout } from "@openzeppelin/upgrades-core";
11
11
  import { type ProvingMatch } from "./bytecode.js";
12
12
  import { type EthProvider } from "./chain.js";
13
+ import { type NamespaceSlot } from "./erc7201.js";
14
+ import type { SourceAnalysis } from "./reconstruct.js";
13
15
  /**
14
16
  * Deployed code never changes, so a record cannot go stale for its chain and
15
17
  * address. `codeSha256` binds it to the exact runtime code it was proven
@@ -30,6 +32,17 @@ export interface LayoutRecord {
30
32
  source: "explorer" | "local-compile";
31
33
  recordedAt: string;
32
34
  layout: StorageLayout;
35
+ /**
36
+ * The proxy kind this code implies: `uups` when it has `upgradeTo` or
37
+ * `upgradeToAndCall`, else `transparent`. Pass `beacon` to the safety check
38
+ * instead when a beacon serves it. Absent in older records.
39
+ */
40
+ kind?: SourceAnalysis["kind"];
41
+ /**
42
+ * The slot each ERC-7201 namespace in `layout` really uses. Without it,
43
+ * `checkNamespaces` reports the record's namespaces as unread.
44
+ */
45
+ namespaces?: NamespaceSlot[];
33
46
  }
34
47
  /**
35
48
  * Checks a loaded record without touching the chain: its format, its shape,
@@ -1 +1 @@
1
- {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGjF;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,CAAC,CAAC;IACV,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,YAAY,CAAC;IAC5B,+FAA+F;IAC/F,MAAM,EAAE,UAAU,GAAG,eAAe,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;CACvB;AAKD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CA0C1E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,YAAY,CAAC,CA0BvB"}
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,CAAC,CAAC;IACV,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,YAAY,CAAC;IAC5B,+FAA+F;IAC/F,MAAM,EAAE,UAAU,GAAG,eAAe,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAKD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CA+C1E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,YAAY,CAAC,CA0BvB"}
package/dist/record.js CHANGED
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { isProvingMatch } from "./bytecode.js";
11
11
  import { codeSha256, readChainId, readCode } from "./chain.js";
12
+ import { slotsMisfit } from "./erc7201.js";
12
13
  import { LayoutIntegrityError, LayoutUnavailableError } from "./errors.js";
13
14
  const ADDRESS = /^0x[0-9a-f]{40}$/;
14
15
  const SHA256 = /^[0-9a-f]{64}$/;
@@ -51,6 +52,13 @@ export function parseRecord(value, address) {
51
52
  r.layout.types === null) {
52
53
  throw malformed("layout");
53
54
  }
55
+ if (r.kind !== undefined && r.kind !== "uups" && r.kind !== "transparent") {
56
+ throw malformed("kind");
57
+ }
58
+ if (slotsMisfit(r.layout, undefined) !== undefined)
59
+ throw malformed("layout");
60
+ if (slotsMisfit(r.layout, r.namespaces) !== undefined)
61
+ throw malformed("namespaces");
54
62
  if (typeof r.bytecodeMatch !== "string" || !isProvingMatch(r.bytecodeMatch)) {
55
63
  throw new LayoutIntegrityError(`The layout record for ${who} rests on a "${String(r.bytecodeMatch)}" match, which does ` +
56
64
  `not prove a storage layout.`);
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAqB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,WAAW,EAAsB,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAmC3E,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,OAAgB;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,oBAAoB,CAAC,wCAAwC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,CAAC,GAAG,KAA8B,CAAC;IACzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC7E,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAClC,IAAI,oBAAoB,CAAC,yBAAyB,GAAG,+BAA+B,KAAK,GAAG,CAAC,CAAC;IAEhG,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1F,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC,OAAkB,IAAI,CAAC;QAAE,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/F,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;QACnE,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7F,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5F,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe;QAAE,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAAE,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IACpE,IACE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,CAAC,CAAC,MAAM,KAAK,IAAI;QACjB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAChC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ;QAClC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EACvB,CAAC;QACD,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC1E,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,SAAS;QAAE,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9E,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS;QAAE,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IACrF,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,GAAG,gBAAgB,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,sBAAsB;YACvF,6BAA6B,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,CAAC,CAAC,OAAO,mBAAmB,OAAO,CAAC,WAAW,EAAE,GAAG,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,CAAiB,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAqB,EACrB,OAAe,EACf,KAAc;IAEd,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,MAAM,CAAC,OAAO,sBAAsB,MAAM,CAAC,OAAO,WAAW;YACpF,SAAS,OAAO,GAAG,CACtB,CAAC;IACJ,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,+EAA+E;QAC/E,IAAI,CAAC,CAAC,CAAC,YAAY,sBAAsB,CAAC;YAAE,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,MAAM,CAAC,OAAO,oDAAoD,CAC5F,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,MAAM,CAAC,OAAO,+CAA+C;YACpF,4BAA4B,CAC/B,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,29 @@
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
+ import type { NamespacePair } from "./erc7201.js";
7
+ /** Node's `util.styleText`, or `plain` when colors are off. */
8
+ export type Paint = (format: Parameters<typeof import("node:util").styleText>[0], text: string) => string;
9
+ export declare const plain: Paint;
10
+ export type CheckStatus = "pass" | "fail" | "skip";
11
+ export interface Check {
12
+ name: string;
13
+ status: CheckStatus;
14
+ summary: string;
15
+ /** Multi-line explanation shown under the check, such as OpenZeppelin's report. */
16
+ details?: string;
17
+ }
18
+ /** One line per check, names aligned, details indented under their check. */
19
+ export declare function checkLines(checks: Check[], paint?: Paint): string[];
20
+ /** How many namespaces are compared by annotation alone because no code assigns them. */
21
+ export declare function unassignedCount(pairs: NamespacePair[]): number;
22
+ /**
23
+ * A grid for each namespace whose slot is in question on either side: the
24
+ * annotation, the slot it implies and the slot the code uses, for old and new,
25
+ * with a sentence saying what that means. Namespaces that line up, or that no
26
+ * code assigns on either side, are left out.
27
+ */
28
+ export declare function namespaceLines(pairs: NamespacePair[], paint?: Paint): string[];
29
+ //# sourceMappingURL=report.d.ts.map