@pasosdejesus/contract-test 0.1.8 → 0.2.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.
@@ -0,0 +1,51 @@
1
+ import { type CompileSettings } from './solc-parity.js';
2
+ export interface ProjectCompileConfig extends CompileSettings {
3
+ version?: string;
4
+ }
5
+ export interface CompilerChoice {
6
+ kind: 'native' | 'solc-js';
7
+ version: string;
8
+ label: string;
9
+ compile(input: string): string;
10
+ }
11
+ export interface CompileResult {
12
+ app: string;
13
+ compiler: string;
14
+ version: string;
15
+ contracts: number;
16
+ artifacts: string[];
17
+ warnings: string[];
18
+ }
19
+ export declare function findContractsApp(root: string): string | null;
20
+ /** Reads `contracts.config.json`, else the `solidity` block of `hardhat.config`. */
21
+ export declare function readProjectConfig(appDir: string): ProjectCompileConfig;
22
+ export declare function solcJsVersion(solc: {
23
+ version(): string;
24
+ }): string;
25
+ /**
26
+ * Chooses the compiler. The native binary and solc-js must match the pin
27
+ * exactly; when there is no pin the native compiler is preferred, then solc-js.
28
+ */
29
+ export declare function selectCompiler(options: {
30
+ version?: string;
31
+ solc?: string;
32
+ solcJs?: string;
33
+ appDir?: string;
34
+ }): CompilerChoice;
35
+ /** Collects project sources plus every imported file (relative and node_modules). */
36
+ export declare function collectSources(appDir: string): {
37
+ sources: Record<string, string>;
38
+ order: string[];
39
+ };
40
+ export declare function compileProject(options: {
41
+ root?: string;
42
+ solc?: string;
43
+ solcJs?: string;
44
+ version?: string;
45
+ optimize?: boolean;
46
+ runs?: number;
47
+ evmVersion?: string;
48
+ viaIR?: boolean;
49
+ }): CompileResult;
50
+ export declare function runContractCompile(args?: string[]): void;
51
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGtE,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5D;AAUD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAkCtE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,OAAO,IAAI,MAAM,CAAA;CAAE,GAAG,MAAM,CAEjE;AAiBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,cAAc,CAuEjB;AAuBD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAmDnG;AAMD,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,aAAa,CAiEhB;AAoBD,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,IAAI,CAiB/E"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * contract:compile — compile a project's Solidity sources without Hardhat.
3
+ *
4
+ * Compiler selection follows the version **pin**, never the pragma:
5
+ * 1. native `solc` (adJ 7.9 ships 0.8.37) when its version matches the pin;
6
+ * 2. a local soljson build (`--solc-js <file>`) when its version matches;
7
+ * 3. the installed `solc` (solc-js) package when its version matches.
8
+ * Otherwise it stops with an explicit message instead of silently changing the
9
+ * compiler, because the bytecode (and the explorer verification) depends on it.
10
+ *
11
+ * Artifacts use Hardhat's format so `sync-abis.mjs`, typechain and
12
+ * `contract:test` keep consuming them.
13
+ *
14
+ * https://gitlab.com/pasosdeJesus/m/-/work_items/52
15
+ */
16
+ import * as fs from 'fs';
17
+ import * as path from 'path';
18
+ import { spawnSync } from 'child_process';
19
+ import { createRequire } from 'module';
20
+ const require = createRequire(import.meta.url);
21
+ import { globSync } from 'glob';
22
+ import { standardInput } from './solc-parity.js';
23
+ import { info, success, problem, warn } from '@pasosdejesus/m/dist/util/colors.js';
24
+ const CONTRACTS_APPS = ['apps/contracts', 'apps/hardhat', 'hardhat'];
25
+ export function findContractsApp(root) {
26
+ for (const rel of CONTRACTS_APPS) {
27
+ const dir = path.join(root, rel);
28
+ if (!fs.existsSync(dir))
29
+ continue;
30
+ if (fs.existsSync(path.join(dir, 'hardhat.config.ts')) ||
31
+ fs.existsSync(path.join(dir, 'hardhat.config.js')) ||
32
+ fs.existsSync(path.join(dir, 'contracts'))) {
33
+ return dir;
34
+ }
35
+ }
36
+ // Solidity-only project: the sources live in <root>/contracts.
37
+ if (fs.existsSync(path.join(root, 'contracts')))
38
+ return root;
39
+ return null;
40
+ }
41
+ function readJson(file) {
42
+ try {
43
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ /** Reads `contracts.config.json`, else the `solidity` block of `hardhat.config`. */
50
+ export function readProjectConfig(appDir) {
51
+ const explicit = readJson(path.join(appDir, 'contracts.config.json'));
52
+ if (explicit && (typeof explicit.solc === 'string' || typeof explicit.version === 'string')) {
53
+ return {
54
+ version: typeof explicit.solc === 'string' ? explicit.solc : explicit.version,
55
+ optimizer: explicit.optimizer,
56
+ evmVersion: explicit.evmVersion,
57
+ viaIR: explicit.viaIR === true,
58
+ };
59
+ }
60
+ for (const name of ['hardhat.config.ts', 'hardhat.config.js']) {
61
+ const file = path.join(appDir, name);
62
+ if (!fs.existsSync(file))
63
+ continue;
64
+ const text = fs.readFileSync(file, 'utf-8');
65
+ const at = text.search(/solidity\s*:/);
66
+ if (at < 0)
67
+ continue;
68
+ const slice = text.slice(at, at + 2000);
69
+ const stringForm = slice.match(/solidity\s*:\s*['"]([0-9]+\.[0-9]+\.[0-9]+)['"]/);
70
+ const version = slice.match(/version\s*:\s*['"]([0-9]+\.[0-9]+\.[0-9]+)['"]/)?.[1] ?? stringForm?.[1];
71
+ const enabled = slice.match(/optimizer\s*:\s*\{[^}]*enabled\s*:\s*(true|false)/)?.[1];
72
+ const runs = slice.match(/runs\s*:\s*(\d+)/)?.[1];
73
+ const evmVersion = slice.match(/evmVersion\s*:\s*['"]([\w-]+)['"]/)?.[1];
74
+ const viaIR = slice.match(/viaIR\s*:\s*(true|false)/)?.[1];
75
+ return {
76
+ version,
77
+ ...(enabled ? { optimizer: { enabled: enabled === 'true', runs: runs ? Number(runs) : 200 } } : {}),
78
+ ...(evmVersion ? { evmVersion } : {}),
79
+ ...(viaIR === 'true' ? { viaIR: true } : {}),
80
+ };
81
+ }
82
+ return {};
83
+ }
84
+ export function solcJsVersion(solc) {
85
+ return solc.version().split('+')[0].split('.Emscripten')[0];
86
+ }
87
+ function nativeSolcVersion(binary) {
88
+ const run = spawnSync(binary, ['--version'], { encoding: 'utf-8' });
89
+ if (run.status !== 0 || !run.stdout)
90
+ return null;
91
+ const line = run.stdout.split('\n').find((entry) => entry.includes('Version:'));
92
+ return line ? line.replace(/.*Version:\s*/, '').split('+')[0].split('.Emscripten')[0].trim() : null;
93
+ }
94
+ function loadSolcJs(pathOrModule) {
95
+ if (pathOrModule.includes('/') || pathOrModule.endsWith('.js')) {
96
+ const wrapper = require('solc/wrapper');
97
+ return wrapper(fs.readFileSync(pathOrModule));
98
+ }
99
+ return require(pathOrModule);
100
+ }
101
+ /**
102
+ * Chooses the compiler. The native binary and solc-js must match the pin
103
+ * exactly; when there is no pin the native compiler is preferred, then solc-js.
104
+ */
105
+ export function selectCompiler(options) {
106
+ const pin = options.version;
107
+ const candidates = [];
108
+ if (options.solc)
109
+ candidates.push(options.solc);
110
+ if (process.env.SOLC)
111
+ candidates.push(process.env.SOLC);
112
+ candidates.push('solc');
113
+ for (const binary of candidates) {
114
+ const version = nativeSolcVersion(binary);
115
+ if (!version)
116
+ continue;
117
+ if (pin && version !== pin)
118
+ continue;
119
+ return {
120
+ kind: 'native',
121
+ version,
122
+ label: `${binary} (native)`,
123
+ compile: (input) => {
124
+ const run = spawnSync(binary, ['--standard-json', '--base-path', options.appDir ?? process.cwd()], {
125
+ input,
126
+ encoding: 'utf-8',
127
+ maxBuffer: 200 * 1024 * 1024,
128
+ });
129
+ if (!run.stdout)
130
+ throw new Error(run.stderr || `solc exited with ${run.status}`);
131
+ return run.stdout;
132
+ },
133
+ };
134
+ }
135
+ if (options.solcJs) {
136
+ const module = loadSolcJs(options.solcJs);
137
+ const version = solcJsVersion(module);
138
+ if (pin && version !== pin) {
139
+ throw new Error(`solc-js at ${options.solcJs} is ${version}, but the project pins ${pin}`);
140
+ }
141
+ return { kind: 'solc-js', version, label: `${options.solcJs} (solc-js)`, compile: (input) => module.compile(input) };
142
+ }
143
+ // The project's own `solc` wins (it declares the pin); contract-test ships
144
+ // one too so the template compiles out of the box.
145
+ const modules = [];
146
+ if (options.appDir) {
147
+ try {
148
+ const projectRequire = createRequire(path.join(options.appDir, 'package.json'));
149
+ modules.push({ label: 'solc (proyecto)', module: projectRequire('solc') });
150
+ }
151
+ catch {
152
+ // The project does not declare solc; fall through to the bundled one.
153
+ }
154
+ }
155
+ try {
156
+ modules.push({ label: 'solc-js', module: loadSolcJs('solc') });
157
+ }
158
+ catch {
159
+ // Not installed (trimmed install); the error below explains what to do.
160
+ }
161
+ for (const { label, module } of modules) {
162
+ const version = solcJsVersion(module);
163
+ if (!pin || version === pin) {
164
+ return { kind: 'solc-js', version, label: `${label} ${version}`, compile: (input) => module.compile(input) };
165
+ }
166
+ }
167
+ if (modules.length > 0) {
168
+ throw new Error(`the project pins solc ${pin} but the available solc-js are ` +
169
+ `${modules.map((entry) => solcJsVersion(entry.module)).join(', ')}; ` +
170
+ `install solc@${pin} or pass --solc-js <soljson file>`);
171
+ }
172
+ throw new Error(`no compiler for solc ${pin ?? '(unpinned)'}: install the native solc, ` +
173
+ 'run `pnpm add -D solc@<version>`, or pass `--solc-js <soljson file>`');
174
+ }
175
+ function posix(value) {
176
+ return value.split(path.sep).join('/');
177
+ }
178
+ function readRemappings(appDir) {
179
+ for (const name of ['remappings.txt', 'remappings']) {
180
+ const file = path.join(appDir, name);
181
+ if (!fs.existsSync(file))
182
+ continue;
183
+ return fs
184
+ .readFileSync(file, 'utf-8')
185
+ .split('\n')
186
+ .map((line) => line.trim())
187
+ .filter((line) => line && !line.startsWith('#'))
188
+ .map((line) => {
189
+ const [from, to] = line.split('=');
190
+ return [from.trim(), (to ?? '').trim()];
191
+ });
192
+ }
193
+ return [];
194
+ }
195
+ /** Collects project sources plus every imported file (relative and node_modules). */
196
+ export function collectSources(appDir) {
197
+ const sources = {};
198
+ const remappings = readRemappings(appDir);
199
+ const projectRequire = createRequire(path.join(appDir, 'package.json'));
200
+ const queue = [];
201
+ for (const file of globSync('contracts/**/*.sol', { cwd: appDir }).sort()) {
202
+ const key = posix(file);
203
+ queue.push({ key, abs: path.join(appDir, file) });
204
+ }
205
+ if (queue.length === 0)
206
+ throw new Error(`no contracts/**/*.sol under ${appDir}`);
207
+ while (queue.length > 0) {
208
+ const { key, abs } = queue.shift();
209
+ if (sources[key])
210
+ continue;
211
+ const content = fs.readFileSync(abs, 'utf-8');
212
+ sources[key] = content;
213
+ const importRe = /\bimport\s+(?:[^'";]*?\bfrom\s*)?["']([^"']+)["']/g;
214
+ let match;
215
+ while ((match = importRe.exec(content))) {
216
+ let specifier = match[1];
217
+ for (const [from, to] of remappings) {
218
+ if (specifier.startsWith(from)) {
219
+ specifier = to + specifier.slice(from.length);
220
+ break;
221
+ }
222
+ }
223
+ if (sources[specifier])
224
+ continue;
225
+ if (specifier.startsWith('.')) {
226
+ const importedKey = posix(path.posix.normalize(path.posix.join(path.posix.dirname(key), specifier)));
227
+ if (!sources[importedKey]) {
228
+ queue.push({ key: importedKey, abs: path.resolve(path.dirname(abs), specifier) });
229
+ }
230
+ continue;
231
+ }
232
+ let importedAbs = null;
233
+ try {
234
+ importedAbs = projectRequire.resolve(specifier);
235
+ }
236
+ catch {
237
+ const fallback = path.join(appDir, 'node_modules', specifier);
238
+ if (fs.existsSync(fallback))
239
+ importedAbs = fallback;
240
+ }
241
+ if (!importedAbs)
242
+ throw new Error(`${key}: cannot resolve import "${specifier}"`);
243
+ queue.push({ key: specifier, abs: importedAbs });
244
+ }
245
+ }
246
+ return { sources, order: Object.keys(sources).sort() };
247
+ }
248
+ function artifactDir(appDir, sourceName) {
249
+ return path.join(appDir, 'artifacts', sourceName);
250
+ }
251
+ export function compileProject(options) {
252
+ const root = path.resolve(options.root ?? process.cwd());
253
+ const app = findContractsApp(root);
254
+ if (!app)
255
+ throw new Error('no contracts app found (apps/contracts, apps/hardhat or hardhat/)');
256
+ const config = readProjectConfig(app);
257
+ const version = options.version ?? config.version;
258
+ const settings = {
259
+ optimizer: {
260
+ enabled: options.optimize ?? config.optimizer?.enabled ?? false,
261
+ runs: options.runs ?? config.optimizer?.runs ?? 200,
262
+ },
263
+ ...(options.evmVersion ?? config.evmVersion ? { evmVersion: options.evmVersion ?? config.evmVersion } : {}),
264
+ ...(options.viaIR ?? config.viaIR ? { viaIR: options.viaIR ?? config.viaIR } : {}),
265
+ };
266
+ const compiler = selectCompiler({ version, solc: options.solc, solcJs: options.solcJs, appDir: app });
267
+ const { sources, order } = collectSources(app);
268
+ const input = standardInput(sources, settings);
269
+ const output = JSON.parse(compiler.compile(input));
270
+ const errors = (output.errors ?? [])
271
+ .filter((entry) => entry.severity === 'error')
272
+ .map((entry) => entry.formattedMessage);
273
+ if (errors.length > 0)
274
+ throw new Error(`solc errors:\n${errors.join('\n')}`);
275
+ const artifacts = [];
276
+ for (const [sourceName, names] of Object.entries((output.contracts ?? {}))) {
277
+ for (const [name, data] of Object.entries(names)) {
278
+ const dir = artifactDir(app, sourceName);
279
+ fs.mkdirSync(dir, { recursive: true });
280
+ const file = path.join(dir, `${name}.json`);
281
+ fs.writeFileSync(file, JSON.stringify({
282
+ _format: 'hh-sol-artifact-1',
283
+ contractName: name,
284
+ sourceName,
285
+ abi: data.abi ?? [],
286
+ bytecode: `0x${data.evm?.bytecode?.object ?? ''}`,
287
+ deployedBytecode: `0x${data.evm?.deployedBytecode?.object ?? ''}`,
288
+ linkReferences: data.evm?.bytecode?.linkReferences ?? {},
289
+ deployedLinkReferences: data.evm?.deployedBytecode?.linkReferences ?? {},
290
+ }, null, 2));
291
+ artifacts.push(path.relative(root, file));
292
+ }
293
+ }
294
+ const warnings = (output.errors ?? [])
295
+ .filter((entry) => entry.severity === 'warning')
296
+ .map((entry) => entry.formattedMessage);
297
+ return {
298
+ app: app === root ? '.' : path.relative(root, app),
299
+ compiler: compiler.label,
300
+ version: compiler.version,
301
+ contracts: Object.values((output.contracts ?? {}))
302
+ .reduce((total, names) => total + Object.keys(names).length, 0),
303
+ artifacts,
304
+ warnings,
305
+ };
306
+ }
307
+ function parseArgs(args) {
308
+ const options = {};
309
+ for (let index = 0; index < args.length; index++) {
310
+ const arg = args[index];
311
+ if (arg === '--root')
312
+ options.root = args[++index];
313
+ else if (arg === '--solc')
314
+ options.solc = args[++index];
315
+ else if (arg === '--solc-js')
316
+ options.solcJs = args[++index];
317
+ else if (arg === '--solc-version')
318
+ options.version = args[++index];
319
+ else if (arg === '--optimize')
320
+ options.optimize = true;
321
+ else if (arg === '--no-optimize')
322
+ options.optimize = false;
323
+ else if (arg === '--runs')
324
+ options.runs = Number(args[++index]);
325
+ else if (arg === '--evm-version')
326
+ options.evmVersion = args[++index];
327
+ else if (arg === '--via-ir')
328
+ options.viaIR = true;
329
+ else if (arg === '--json')
330
+ options.json = true;
331
+ }
332
+ return options;
333
+ }
334
+ export function runContractCompile(args = process.argv.slice(3)) {
335
+ const options = parseArgs(args);
336
+ try {
337
+ const result = compileProject(options);
338
+ if (options.json) {
339
+ console.log(JSON.stringify(result, null, 2));
340
+ }
341
+ else {
342
+ info(`Compilador: ${result.compiler} (${result.version})`);
343
+ success(` [OK] ${result.contracts} contrato(s) en ${result.artifacts.length} artefacto(s)`);
344
+ for (const warning of result.warnings.slice(0, 5))
345
+ warn(` ${warning.split('\n')[0]}`);
346
+ if (result.warnings.length > 5)
347
+ warn(` … ${result.warnings.length - 5} aviso(s) más`);
348
+ }
349
+ process.exit(0);
350
+ }
351
+ catch (error) {
352
+ problem(error instanceof Error ? error.message : String(error));
353
+ process.exit(1);
354
+ }
355
+ }
356
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,5 +20,12 @@ registerCommands({
20
20
  },
21
21
  description: 'Verify deployment addresses in deployments/ and that sources read them from there',
22
22
  },
23
+ 'contract:compile': {
24
+ handler: async () => {
25
+ const { runContractCompile } = await import('./compile.js');
26
+ runContractCompile();
27
+ },
28
+ description: 'Compile Solidity with native solc or solc-js (no Hardhat), writing Hardhat artifacts',
29
+ },
23
30
  });
24
31
  //# 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;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,gBAAgB,CAAC;IACf,eAAe,EAAE;QACf,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YACvD,MAAM,eAAe,EAAE,CAAA;QACzB,CAAC;QACD,WAAW,EAAE,8EAA8E;KAC5F;IACD,sBAAsB,EAAE;QACtB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC5D,cAAc,EAAE,CAAA;QAClB,CAAC;QACD,WAAW,EAAE,mFAAmF;KACjG;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,gBAAgB,CAAC;IACf,eAAe,EAAE;QACf,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YACvD,MAAM,eAAe,EAAE,CAAA;QACzB,CAAC;QACD,WAAW,EAAE,8EAA8E;KAC5F;IACD,sBAAsB,EAAE;QACtB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC5D,cAAc,EAAE,CAAA;QAClB,CAAC;QACD,WAAW,EAAE,mFAAmF;KACjG;IACD,kBAAkB,EAAE;QAClB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;YAC3D,kBAAkB,EAAE,CAAA;QACtB,CAAC;QACD,WAAW,EAAE,sFAAsF;KACpG;CACF,CAAC,CAAA"}
@@ -0,0 +1,52 @@
1
+ export interface CompileSettings {
2
+ optimizer?: {
3
+ enabled: boolean;
4
+ runs?: number;
5
+ };
6
+ evmVersion?: string;
7
+ viaIR?: boolean;
8
+ }
9
+ export interface ContractOutput {
10
+ abi: unknown[];
11
+ methodIdentifiers: Record<string, string>;
12
+ storageLayout?: unknown;
13
+ bytecode: string;
14
+ deployedBytecode: string;
15
+ }
16
+ export interface Compiled {
17
+ version: string;
18
+ contracts: Record<string, ContractOutput>;
19
+ errors: string[];
20
+ warnings: string[];
21
+ }
22
+ export interface ContractParity {
23
+ contract: string;
24
+ abiEqual: boolean;
25
+ selectorsEqual: boolean;
26
+ storageEqual: boolean;
27
+ bytecodeEqual: boolean;
28
+ deployedEqual: boolean;
29
+ deployedDifferingBytes: number;
30
+ deployedTotalBytes: number;
31
+ missingInCandidate: boolean;
32
+ }
33
+ export interface ParityReport {
34
+ referenceVersion: string;
35
+ candidateVersion: string;
36
+ sameVersion: boolean;
37
+ contracts: ContractParity[];
38
+ ok: boolean;
39
+ }
40
+ export interface SolcJs {
41
+ compile(input: string): string;
42
+ version(): string;
43
+ }
44
+ /** Removes the CBOR metadata blob Solidity appends to bytecode. */
45
+ export declare function stripMetadata(hex: string): string;
46
+ export declare function standardInput(sources: Record<string, string>, settings?: CompileSettings): string;
47
+ export declare function parseOutput(output: string, version: string): Compiled;
48
+ export declare function compileWithSolcJs(solc: SolcJs, input: string): Compiled;
49
+ export declare function compileWithNative(solcPath: string, input: string, basePath: string): Compiled;
50
+ /** Compares ABI, selectors, storage layout and (metadata-stripped) bytecode. */
51
+ export declare function compareCompilers(reference: Compiled, candidate: Compiled): ParityReport;
52
+ //# sourceMappingURL=solc-parity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solc-parity.d.ts","sourceRoot":"","sources":["../src/solc-parity.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,OAAO,EAAE,CAAA;IACd,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACzC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;IACrB,aAAa,EAAE,OAAO,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;IACtB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,EAAE,EAAE,OAAO,CAAA;CACZ;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,OAAO,IAAI,MAAM,CAAA;CAClB;AAkBD,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAE,eAAoB,GAAG,MAAM,CAwBrG;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAqBrE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAEvE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAgB7F;AAyCD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,YAAY,CAavF"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Compare two Solidity compilers (Hardhat's solc-js against the system `solc`
3
+ * of adJ) with the same sources and settings.
4
+ *
5
+ * The goal is to measure fidelity before dropping Hardhat: ABI, selectors and
6
+ * storage layout must match; bytecode must match after stripping the CBOR
7
+ * metadata when both compilers are the same version.
8
+ *
9
+ * https://gitlab.com/pasosdeJesus/m/-/work_items/58
10
+ */
11
+ import { spawnSync } from 'child_process';
12
+ function normalizeHex(value) {
13
+ const raw = value.startsWith('0x') ? value.slice(2) : value;
14
+ return `0x${raw.toLowerCase()}`;
15
+ }
16
+ function stable(value) {
17
+ if (Array.isArray(value))
18
+ return `[${value.map(stable).join(',')}]`;
19
+ if (value && typeof value === 'object') {
20
+ const entries = Object.entries(value)
21
+ .sort(([a], [b]) => a.localeCompare(b))
22
+ .map(([key, item]) => `${JSON.stringify(key)}:${stable(item)}`);
23
+ return `{${entries.join(',')}}`;
24
+ }
25
+ return JSON.stringify(value);
26
+ }
27
+ /** Removes the CBOR metadata blob Solidity appends to bytecode. */
28
+ export function stripMetadata(hex) {
29
+ const raw = hex.startsWith('0x') ? hex.slice(2) : hex;
30
+ if (raw.length < 4 || raw.length % 2 !== 0)
31
+ return raw;
32
+ const length = parseInt(raw.slice(-4), 16);
33
+ if (!Number.isFinite(length))
34
+ return raw;
35
+ const total = (length + 2) * 2;
36
+ if (total > raw.length)
37
+ return raw;
38
+ return raw.slice(0, raw.length - total);
39
+ }
40
+ export function standardInput(sources, settings = {}) {
41
+ return JSON.stringify({
42
+ language: 'Solidity',
43
+ sources: Object.fromEntries(Object.entries(sources).map(([name, content]) => [name, { content }])),
44
+ settings: {
45
+ optimizer: { enabled: settings.optimizer?.enabled ?? false, runs: settings.optimizer?.runs ?? 200 },
46
+ ...(settings.evmVersion ? { evmVersion: settings.evmVersion } : {}),
47
+ ...(settings.viaIR ? { viaIR: true } : {}),
48
+ outputSelection: {
49
+ '*': {
50
+ '*': [
51
+ 'abi',
52
+ 'evm.methodIdentifiers',
53
+ 'evm.bytecode.object',
54
+ 'evm.bytecode.linkReferences',
55
+ 'evm.deployedBytecode.object',
56
+ 'evm.deployedBytecode.linkReferences',
57
+ 'storageLayout',
58
+ 'metadata',
59
+ ],
60
+ },
61
+ },
62
+ },
63
+ });
64
+ }
65
+ export function parseOutput(output, version) {
66
+ const parsed = JSON.parse(output);
67
+ const contracts = {};
68
+ for (const [source, names] of Object.entries((parsed.contracts ?? {}))) {
69
+ for (const [name, data] of Object.entries(names)) {
70
+ contracts[`${source}:${name}`] = {
71
+ abi: data.abi ?? [],
72
+ methodIdentifiers: data.evm?.methodIdentifiers ?? {},
73
+ storageLayout: data.storageLayout,
74
+ bytecode: normalizeHex(data.evm?.bytecode?.object ?? ''),
75
+ deployedBytecode: normalizeHex(data.evm?.deployedBytecode?.object ?? ''),
76
+ };
77
+ }
78
+ }
79
+ const diagnostics = (parsed.errors ?? []);
80
+ return {
81
+ version,
82
+ contracts,
83
+ errors: diagnostics.filter((entry) => entry.severity === 'error').map((entry) => entry.formattedMessage),
84
+ warnings: diagnostics.filter((entry) => entry.severity === 'warning').map((entry) => entry.formattedMessage),
85
+ };
86
+ }
87
+ export function compileWithSolcJs(solc, input) {
88
+ return parseOutput(solc.compile(input), solc.version());
89
+ }
90
+ export function compileWithNative(solcPath, input, basePath) {
91
+ const versionRun = spawnSync(solcPath, ['--version'], { encoding: 'utf-8' });
92
+ const version = (versionRun.stdout ?? '')
93
+ .split('\n')
94
+ .find((line) => line.includes('Version:'))
95
+ ?.replace(/.*Version:\s*/, '')
96
+ .split('.Emscripten')[0]
97
+ .trim() ?? 'unknown';
98
+ const run = spawnSync(solcPath, ['--standard-json', '--base-path', basePath, '--include-path', basePath], { input, encoding: 'utf-8', maxBuffer: 200 * 1024 * 1024 });
99
+ if (!run.stdout)
100
+ throw new Error(run.stderr || `solc exited with ${run.status}`);
101
+ return parseOutput(run.stdout, version);
102
+ }
103
+ function byteDifference(reference, candidate) {
104
+ const a = reference.startsWith('0x') ? reference.slice(2) : reference;
105
+ const b = candidate.startsWith('0x') ? candidate.slice(2) : candidate;
106
+ const total = Math.max(a.length, b.length) / 2;
107
+ let differing = Math.abs(a.length - b.length) / 2;
108
+ for (let index = 0; index < Math.min(a.length, b.length); index += 2) {
109
+ if (a.slice(index, index + 2) !== b.slice(index, index + 2))
110
+ differing++;
111
+ }
112
+ return { differing, total };
113
+ }
114
+ function compareContract(name, reference, candidate) {
115
+ if (!candidate) {
116
+ return {
117
+ contract: name,
118
+ abiEqual: false,
119
+ selectorsEqual: false,
120
+ storageEqual: false,
121
+ bytecodeEqual: false,
122
+ deployedEqual: false,
123
+ deployedDifferingBytes: 0,
124
+ deployedTotalBytes: 0,
125
+ missingInCandidate: true,
126
+ };
127
+ }
128
+ const deployed = byteDifference(stripMetadata(reference.deployedBytecode), stripMetadata(candidate.deployedBytecode));
129
+ return {
130
+ contract: name,
131
+ abiEqual: stable(reference.abi) === stable(candidate.abi),
132
+ selectorsEqual: stable(reference.methodIdentifiers) === stable(candidate.methodIdentifiers),
133
+ storageEqual: stable(reference.storageLayout) === stable(candidate.storageLayout),
134
+ bytecodeEqual: stripMetadata(reference.bytecode) === stripMetadata(candidate.bytecode),
135
+ deployedEqual: deployed.differing === 0,
136
+ deployedDifferingBytes: deployed.differing,
137
+ deployedTotalBytes: deployed.total,
138
+ missingInCandidate: false,
139
+ };
140
+ }
141
+ /** Compares ABI, selectors, storage layout and (metadata-stripped) bytecode. */
142
+ export function compareCompilers(reference, candidate) {
143
+ const names = [...new Set([...Object.keys(reference.contracts), ...Object.keys(candidate.contracts)])].sort();
144
+ const contracts = names.map((name) => compareContract(name, reference.contracts[name], candidate.contracts[name]));
145
+ return {
146
+ referenceVersion: reference.version,
147
+ candidateVersion: candidate.version,
148
+ sameVersion: reference.version.split('+')[0] === candidate.version.split('+')[0],
149
+ contracts,
150
+ ok: reference.errors.length === 0 &&
151
+ candidate.errors.length === 0 &&
152
+ contracts.every((entry) => entry.abiEqual && entry.selectorsEqual && entry.storageEqual),
153
+ };
154
+ }
155
+ //# sourceMappingURL=solc-parity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solc-parity.js","sourceRoot":"","sources":["../src/solc-parity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pasosdejesus/contract-test",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "description": "Hardhat test runner for OpenBSD — Mocha + @ethereumjs/vm EDR fallback",
5
5
  "mEngine": true,
6
6
  "author": "",
@@ -22,24 +22,35 @@
22
22
  "m-engine.json"
23
23
  ],
24
24
  "dependencies": {
25
- "@pasosdejesus/edr": "0.1.2",
25
+ "@pasosdejesus/edr": "0.2.0",
26
26
  "glob": "^13.0.6",
27
- "mocha": "^11.7.6"
27
+ "mocha": "^11.7.6",
28
+ "solc": "0.8.26"
28
29
  },
29
30
  "peerDependencies": {
30
- "@pasosdejesus/m": "^0.35.0",
31
+ "@pasosdejesus/m": "^0.36.0",
31
32
  "ethers": "^6",
32
33
  "viem": "^2"
33
34
  },
34
35
  "devDependencies": {
35
- "typescript": "^5.9.3",
36
- "@types/node": "^20.19.41",
37
36
  "@types/mocha": "^10.0.10",
37
+ "@types/node": "^20.19.41",
38
+ "solc037": "npm:solc@0.8.37",
39
+ "typescript": "^5.9.3",
38
40
  "vitest": "^3.2.6"
39
41
  },
42
+ "peerDependenciesMeta": {
43
+ "ethers": {
44
+ "optional": true
45
+ },
46
+ "viem": {
47
+ "optional": true
48
+ }
49
+ },
40
50
  "scripts": {
41
51
  "build": "test -f dist/index.js || rm -f tsconfig.tsbuildinfo; npx tsc -b",
42
52
  "test": "npx vitest run",
43
- "typecheck": "npx tsc -b --pretty false"
53
+ "typecheck": "npx tsc -b --pretty false",
54
+ "solc-parity": "node scripts/solc-parity.mjs"
44
55
  }
45
56
  }