@pasosdejesus/contract-test 0.1.6 → 0.1.7

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,54 @@
1
+ export type CheckDeployCode = 'ADDRESS_INVALID' | 'ADDRESS_ZERO' | 'NETWORK_MISMATCH' | 'FIELD_INVALID' | 'FIELD_MISSING' | 'DEPLOYMENTS_DIR_MISSING' | 'DEPLOYMENT_MISSING' | 'ENV_FALLBACK' | 'ADDRESS_LITERAL';
2
+ export type Severity = 'error' | 'warn';
3
+ export declare const CODES: ReadonlyArray<{
4
+ code: CheckDeployCode;
5
+ severity: Severity;
6
+ means: string;
7
+ }>;
8
+ export interface Finding {
9
+ code: CheckDeployCode;
10
+ severity: Severity;
11
+ file: string;
12
+ message: string;
13
+ }
14
+ export interface CheckOptions {
15
+ network?: string;
16
+ deploymentsDir?: string;
17
+ noLiterals?: boolean;
18
+ }
19
+ export interface CheckReport {
20
+ ok: boolean;
21
+ network: string;
22
+ contractsApp: string | null;
23
+ webApp: string | null;
24
+ deploymentsDir: string | null;
25
+ deployments: string[];
26
+ findings: Finding[];
27
+ notes: string[];
28
+ }
29
+ export declare function findContractsApp(root: string): string | null;
30
+ export declare function findWebApp(root: string, contractsApp: string | null): string | null;
31
+ /** Splits the arguments of a call starting right after its opening parenthesis. */
32
+ export declare function splitArgs(content: string, start: number): string[];
33
+ /**
34
+ * Resolves the expression that holds the deployments directory: a literal,
35
+ * an inline `path.join(...)`, a const, or a zero-argument helper such as
36
+ * `getDeploymentsDir()` that returns one of those.
37
+ */
38
+ export declare function resolveDirExpr(content: string, expr: string | null): string | null;
39
+ /** Resolves `path.join(process.cwd(), '..', 'hardhat', 'deployments')` and friends. */
40
+ export declare function resolvePathExpr(expr: string | undefined, appDir: string, fileDir: string): string | null;
41
+ interface CallSite {
42
+ file: string;
43
+ kind: string;
44
+ networkExpr: string | null;
45
+ dirExpr: string | null;
46
+ envExpr: string | null;
47
+ optsExpr: string | null;
48
+ }
49
+ /** Finds helper calls and the argument each signature puts in every slot. */
50
+ export declare function findCallSites(file: string, content: string): CallSite[];
51
+ export declare function checkDeployments(root: string, options?: CheckOptions): CheckReport;
52
+ export declare function runCheckDeploy(args?: string[]): void;
53
+ export {};
54
+ //# sourceMappingURL=check-deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-deploy.d.ts","sourceRoot":"","sources":["../src/check-deploy.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,yBAAyB,GACzB,oBAAoB,GACpB,cAAc,GACd,iBAAiB,CAAA;AAErB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;AAEvC,eAAO,MAAM,KAAK,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAU7F,CAAA;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,eAAe,CAAA;IACrB,QAAQ,EAAE,QAAQ,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAkBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAYnF;AAuBD,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BlE;AA0BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAYlF;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBxG;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAevE;AAkMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAoDtF;AAqBD,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,IAAI,CAmC3E"}
@@ -0,0 +1,526 @@
1
+ /**
2
+ * contract:checkdeploy — verifies deployment addresses and how the project reads them.
3
+ *
4
+ * Read-only: it does not deploy, write files or touch the network. See
5
+ * https://gitlab.com/pasosdeJesus/m/-/work_items/60
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { globSync } from 'glob';
10
+ import { readDeployment } from '@pasosdejesus/m/blockchain/deployments';
11
+ import { info, success, problem, warn } from '@pasosdejesus/m/dist/util/colors.js';
12
+ export const CODES = [
13
+ { code: 'ADDRESS_INVALID', severity: 'error', means: 'address is not 0x + 40 hex chars' },
14
+ { code: 'ADDRESS_ZERO', severity: 'error', means: 'address is 0x000…000' },
15
+ { code: 'NETWORK_MISMATCH', severity: 'error', means: 'the "network" field differs from the file name' },
16
+ { code: 'FIELD_INVALID', severity: 'error', means: 'unreadable JSON or a field with the wrong type' },
17
+ { code: 'FIELD_MISSING', severity: 'warn', means: 'the JSON lacks fields the Deployment type promises' },
18
+ { code: 'DEPLOYMENTS_DIR_MISSING', severity: 'error', means: 'sources read a deployments directory that does not exist' },
19
+ { code: 'DEPLOYMENT_MISSING', severity: 'error', means: 'a source call resolves no deployment for the network' },
20
+ { code: 'ENV_FALLBACK', severity: 'warn', means: 'the address comes from an environment variable, not deployments' },
21
+ { code: 'ADDRESS_LITERAL', severity: 'warn', means: 'a source file hardcodes a contract address' },
22
+ ];
23
+ const ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
24
+ const ZERO_RE = /^0x0{40}$/;
25
+ const DEPLOYMENT_FIELDS = ['contract', 'chainId', 'network', 'transactionHash', 'deployedAt'];
26
+ function isDir(dir) {
27
+ try {
28
+ return fs.statSync(dir).isDirectory();
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ function hasFile(dir, names) {
35
+ return names.some((name) => fs.existsSync(path.join(dir, name)));
36
+ }
37
+ export function findContractsApp(root) {
38
+ for (const rel of ['apps/contracts', 'apps/hardhat', 'hardhat']) {
39
+ const dir = path.join(root, rel);
40
+ if (!isDir(dir))
41
+ continue;
42
+ if (hasFile(dir, ['hardhat.config.ts', 'hardhat.config.js']) || isDir(path.join(dir, 'contracts')))
43
+ return rel;
44
+ }
45
+ return null;
46
+ }
47
+ export function findWebApp(root, contractsApp) {
48
+ for (const rel of ['apps/web', 'apps/nextjs']) {
49
+ if (isDir(path.join(root, rel)))
50
+ return rel;
51
+ }
52
+ const appsDir = path.join(root, 'apps');
53
+ if (!isDir(appsDir))
54
+ return null;
55
+ for (const entry of fs.readdirSync(appsDir, { withFileTypes: true })) {
56
+ const rel = path.join('apps', entry.name);
57
+ if (!entry.isDirectory() || rel === contractsApp)
58
+ continue;
59
+ return rel;
60
+ }
61
+ return null;
62
+ }
63
+ function readEnvFiles(root) {
64
+ const values = {};
65
+ for (const rel of ['apps/.env', 'apps/.env.local', '.env', '.env.local']) {
66
+ const file = path.join(root, rel);
67
+ if (!fs.existsSync(file))
68
+ continue;
69
+ for (const line of fs.readFileSync(file, 'utf-8').split('\n')) {
70
+ const match = line.match(/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
71
+ if (!match)
72
+ continue;
73
+ const value = match[2].trim().replace(/^(['"])(.*)\1$/, '$2');
74
+ if (!(match[1] in values))
75
+ values[match[1]] = value;
76
+ }
77
+ }
78
+ return values;
79
+ }
80
+ function envValue(root, name) {
81
+ const value = readEnvFiles(root)[name];
82
+ if (value)
83
+ return value;
84
+ return process.env[name] || undefined;
85
+ }
86
+ /** Splits the arguments of a call starting right after its opening parenthesis. */
87
+ export function splitArgs(content, start) {
88
+ const args = [];
89
+ let depth = 0;
90
+ let current = '';
91
+ let quote = null;
92
+ for (let i = start; i < content.length; i++) {
93
+ const char = content[i];
94
+ if (quote) {
95
+ current += char;
96
+ if (char === quote && content[i - 1] !== '\\')
97
+ quote = null;
98
+ continue;
99
+ }
100
+ if (char === "'" || char === '"' || char === '`') {
101
+ quote = char;
102
+ current += char;
103
+ continue;
104
+ }
105
+ if (char === '(' || char === '[' || char === '{')
106
+ depth++;
107
+ if (char === ')' || char === ']' || char === '}') {
108
+ if (depth === 0 && char === ')')
109
+ break;
110
+ depth--;
111
+ }
112
+ if (char === ',' && depth === 0) {
113
+ args.push(current.trim());
114
+ current = '';
115
+ continue;
116
+ }
117
+ current += char;
118
+ }
119
+ if (current.trim())
120
+ args.push(current.trim());
121
+ return args;
122
+ }
123
+ function literal(expr) {
124
+ if (!expr)
125
+ return null;
126
+ const trimmed = expr.trim();
127
+ const quoted = trimmed.match(/^(['"`])([^'"`]*)\1$/);
128
+ return quoted && !quoted[2].includes('${') ? quoted[2] : null;
129
+ }
130
+ function constValue(content, name) {
131
+ const match = content.match(new RegExp(`(?:const|let|var)\\s+${name}\\s*=\\s*(['"\`])([^'"\`]*)\\1`));
132
+ return match ? match[2] : null;
133
+ }
134
+ /** Resolves an identifier to the expression it was declared with (literal or one-line path.join). */
135
+ function constExpr(content, name) {
136
+ const join = content.match(new RegExp(`(?:const|let|var)\\s+${name}\\s*=\\s*(path\\.join\\([^\\n]*\\))`));
137
+ if (join)
138
+ return join[1];
139
+ const value = constValue(content, name);
140
+ return value === null ? null : `'${value}'`;
141
+ }
142
+ function isIdentifier(expr) {
143
+ return /^[A-Za-z_$][\w$]*$/.test(expr.trim());
144
+ }
145
+ /**
146
+ * Resolves the expression that holds the deployments directory: a literal,
147
+ * an inline `path.join(...)`, a const, or a zero-argument helper such as
148
+ * `getDeploymentsDir()` that returns one of those.
149
+ */
150
+ export function resolveDirExpr(content, expr) {
151
+ if (!expr)
152
+ return null;
153
+ const trimmed = expr.trim();
154
+ const call = trimmed.match(/^([A-Za-z_$][\w$]*)\(\)$/);
155
+ if (call) {
156
+ const fn = content.match(new RegExp(`function\\s+${call[1]}\\s*\\([^)]*\\)[^{]*\\{\\s*return\\s+(path\\.join\\([^\\n]*\\)|['"\`][^'"\`]*['"\`])`));
157
+ return fn ? fn[1] : null;
158
+ }
159
+ if (isIdentifier(trimmed))
160
+ return constExpr(content, trimmed);
161
+ return trimmed;
162
+ }
163
+ /** Resolves `path.join(process.cwd(), '..', 'hardhat', 'deployments')` and friends. */
164
+ export function resolvePathExpr(expr, appDir, fileDir) {
165
+ if (!expr)
166
+ return null;
167
+ const trimmed = expr.trim();
168
+ const join = trimmed.match(/^path\.join\(([\s\S]*)\)$/);
169
+ if (!join) {
170
+ const direct = literal(trimmed);
171
+ return direct === null ? null : path.resolve(appDir, direct);
172
+ }
173
+ const parts = splitArgs(join[1], 0);
174
+ const resolved = [];
175
+ for (const part of parts) {
176
+ const value = part.trim();
177
+ if (value === 'process.cwd()') {
178
+ resolved.push(appDir);
179
+ continue;
180
+ }
181
+ if (value === '__dirname' || value === 'import.meta.dirname') {
182
+ resolved.push(fileDir);
183
+ continue;
184
+ }
185
+ const direct = literal(value);
186
+ if (direct === null)
187
+ return null;
188
+ resolved.push(direct);
189
+ }
190
+ return path.resolve(resolved[0] ?? appDir, ...resolved.slice(1));
191
+ }
192
+ /** Finds helper calls and the argument each signature puts in every slot. */
193
+ export function findCallSites(file, content) {
194
+ const sites = [];
195
+ const callRe = /\b(readDeployment|getContractAddress|getCeloCredentialsAddress|getBaseCredentialsAddress)\s*\(/g;
196
+ let match;
197
+ while ((match = callRe.exec(content))) {
198
+ const name = match[1];
199
+ const args = splitArgs(content, match.index + match[0].length);
200
+ const slot = name === 'readDeployment'
201
+ ? { networkExpr: args[0], dirExpr: args[1], envExpr: null, optsExpr: args[2] }
202
+ : name === 'getContractAddress'
203
+ ? { networkExpr: args[0], dirExpr: args[2], envExpr: args[1], optsExpr: args[3] }
204
+ : { networkExpr: null, dirExpr: args[0], envExpr: null, optsExpr: args[1] };
205
+ sites.push({ file, kind: name, ...slot });
206
+ }
207
+ return sites;
208
+ }
209
+ function resolveNetwork(expr, content, fallback) {
210
+ if (!expr)
211
+ return fallback;
212
+ const direct = literal(expr);
213
+ if (direct)
214
+ return direct;
215
+ if (expr.trim().startsWith('getNetwork('))
216
+ return fallback;
217
+ const fromConst = constValue(content, expr.trim());
218
+ return fromConst ?? fallback;
219
+ }
220
+ function parseOptions(expr, content) {
221
+ if (!expr)
222
+ return {};
223
+ const opts = {};
224
+ const contract = expr.match(/contract\s*:\s*([^,}\s]+)/);
225
+ const version = expr.match(/version\s*:\s*([^,}\s]+)/);
226
+ if (contract) {
227
+ const value = literal(contract[1]) ?? constValue(content, contract[1]);
228
+ if (value)
229
+ opts.contract = value;
230
+ }
231
+ if (version) {
232
+ const value = literal(version[1]) ?? constValue(content, version[1]);
233
+ if (value)
234
+ opts.version = value;
235
+ }
236
+ return opts;
237
+ }
238
+ function envVarFor(site, content) {
239
+ const direct = literal(site.envExpr);
240
+ if (direct)
241
+ return direct;
242
+ if (site.envExpr) {
243
+ const fromConst = constValue(content, site.envExpr.trim());
244
+ if (fromConst)
245
+ return fromConst;
246
+ }
247
+ if (site.kind === 'getCeloCredentialsAddress')
248
+ return 'NEXT_PUBLIC_PDJCREDENTIALS_CELO_ADDRESS';
249
+ if (site.kind === 'getBaseCredentialsAddress')
250
+ return 'NEXT_PUBLIC_PDJCREDENTIALS_BASE_ADDRESS';
251
+ return null;
252
+ }
253
+ function sourceFiles(root) {
254
+ return globSync('**/*.{ts,tsx,js,mjs}', {
255
+ cwd: root,
256
+ ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/*.test.*', '**/tests/**', '**/deployments/**'],
257
+ });
258
+ }
259
+ function validateDeployments(root, addresses) {
260
+ const findings = [];
261
+ const files = globSync('**/deployments/**/*.json', {
262
+ cwd: root,
263
+ ignore: ['**/node_modules/**', '**/.pnpm/**', '**/ignition/**', '**/.next/**'],
264
+ }).sort();
265
+ for (const rel of files) {
266
+ const file = rel.split(path.sep).join('/');
267
+ let data;
268
+ try {
269
+ data = JSON.parse(fs.readFileSync(path.join(root, rel), 'utf-8'));
270
+ }
271
+ catch {
272
+ findings.push({ code: 'FIELD_INVALID', severity: 'error', file, message: `${file}: JSON inválido` });
273
+ continue;
274
+ }
275
+ const address = typeof data.address === 'string' ? data.address : '';
276
+ if (!ADDRESS_RE.test(address)) {
277
+ findings.push({ code: 'ADDRESS_INVALID', severity: 'error', file, message: `${file}: address "${address}" no es 0x + 40 hex` });
278
+ }
279
+ else {
280
+ addresses.add(address.toLowerCase());
281
+ if (ZERO_RE.test(address)) {
282
+ findings.push({ code: 'ADDRESS_ZERO', severity: 'error', file, message: `${file}: address es la dirección cero` });
283
+ }
284
+ }
285
+ const filenameNetwork = path.basename(file, '.json');
286
+ if (typeof data.network === 'string' && data.network !== filenameNetwork) {
287
+ findings.push({
288
+ code: 'NETWORK_MISMATCH',
289
+ severity: 'error',
290
+ file,
291
+ message: `${file}: "network" es ${data.network} y el archivo se llama ${filenameNetwork}.json`,
292
+ });
293
+ }
294
+ if (data.chainId !== undefined && typeof data.chainId !== 'number') {
295
+ findings.push({ code: 'FIELD_INVALID', severity: 'error', file, message: `${file}: chainId no es numérico` });
296
+ }
297
+ const missing = DEPLOYMENT_FIELDS.filter((field) => data[field] === undefined);
298
+ if (missing.length > 0) {
299
+ findings.push({
300
+ code: 'FIELD_MISSING',
301
+ severity: 'warn',
302
+ file,
303
+ message: `${file}: faltan ${missing.join(', ')}`,
304
+ });
305
+ }
306
+ }
307
+ return { files, findings };
308
+ }
309
+ function checkCallSites(root, webApp, network, findings) {
310
+ const appAbs = path.join(root, webApp);
311
+ let firstExisting = null;
312
+ for (const rel of sourceFiles(appAbs)) {
313
+ const abs = path.join(appAbs, rel);
314
+ const content = fs.readFileSync(abs, 'utf-8');
315
+ if (!content.includes('blockchain/deployments'))
316
+ continue;
317
+ const file = `${webApp.split(path.sep).join('/')}/${rel.split(path.sep).join('/')}`;
318
+ for (const site of findCallSites(file, content)) {
319
+ const dirExpr = resolveDirExpr(content, site.dirExpr) ?? site.dirExpr;
320
+ const dir = resolvePathExpr(dirExpr ?? undefined, appAbs, path.dirname(abs));
321
+ if (!dir)
322
+ continue;
323
+ if (!isDir(dir)) {
324
+ findings.push({
325
+ code: 'DEPLOYMENTS_DIR_MISSING',
326
+ severity: 'error',
327
+ file,
328
+ message: `${file}: ${site.kind} lee ${path.relative(root, dir)} y ese directorio no existe`,
329
+ });
330
+ continue;
331
+ }
332
+ if (!firstExisting)
333
+ firstExisting = path.relative(root, dir);
334
+ const opts = parseOptions(site.optsExpr, content);
335
+ const callNetwork = resolveNetwork(site.networkExpr, content, network);
336
+ if (readDeployment(callNetwork, dir, opts))
337
+ continue;
338
+ const envName = envVarFor(site, content);
339
+ if (envName && envValue(root, envName)) {
340
+ findings.push({
341
+ code: 'ENV_FALLBACK',
342
+ severity: 'warn',
343
+ file,
344
+ message: `${file}: ${opts.contract ?? 'el contrato'} ${callNetwork} no está en deployments; se usa ${envName} del entorno`,
345
+ });
346
+ }
347
+ else {
348
+ findings.push({
349
+ code: 'DEPLOYMENT_MISSING',
350
+ severity: 'error',
351
+ file,
352
+ message: `${file}: ${opts.contract ?? 'el contrato'} ${callNetwork} no se resuelve en ${path.relative(root, dir)}${envName ? ` ni en ${envName}` : ''}`,
353
+ });
354
+ }
355
+ }
356
+ }
357
+ return firstExisting;
358
+ }
359
+ function allowList(root) {
360
+ const all = new Set();
361
+ const byFile = {};
362
+ const file = path.join(root, 'contract-check.json');
363
+ if (!fs.existsSync(file))
364
+ return { all, byFile };
365
+ try {
366
+ const data = JSON.parse(fs.readFileSync(file, 'utf-8'));
367
+ const list = data.allowAddresses;
368
+ if (Array.isArray(list))
369
+ for (const address of list)
370
+ all.add(String(address).toLowerCase());
371
+ if (list && typeof list === 'object' && !Array.isArray(list)) {
372
+ for (const [key, values] of Object.entries(list)) {
373
+ if (!Array.isArray(values))
374
+ continue;
375
+ byFile[key] = new Set(values.map((value) => String(value).toLowerCase()));
376
+ }
377
+ }
378
+ }
379
+ catch {
380
+ // An unreadable allow list is ignored; literals simply stay reported.
381
+ }
382
+ return { all, byFile };
383
+ }
384
+ function checkLiterals(root, webApp, known, findings) {
385
+ const { all, byFile } = allowList(root);
386
+ const appAbs = path.join(root, webApp);
387
+ for (const rel of sourceFiles(appAbs)) {
388
+ const file = `${webApp.split(path.sep).join('/')}/${rel.split(path.sep).join('/')}`;
389
+ const content = fs.readFileSync(path.join(appAbs, rel), 'utf-8');
390
+ const literals = new Set(content.match(/0x[0-9a-fA-F]{40}/g) ?? []);
391
+ for (const address of literals) {
392
+ const lower = address.toLowerCase();
393
+ if (known.has(lower) || all.has(lower))
394
+ continue;
395
+ if (byFile[file]?.has(lower) || byFile['*']?.has(lower))
396
+ continue;
397
+ if (ZERO_RE.test(lower))
398
+ continue;
399
+ findings.push({
400
+ code: 'ADDRESS_LITERAL',
401
+ severity: 'warn',
402
+ file,
403
+ message: `${file}: ${address} está escrita en el código; leela con @pasosdejesus/m/blockchain/deployments o declárala en contract-check.json`,
404
+ });
405
+ }
406
+ }
407
+ }
408
+ export function checkDeployments(root, options = {}) {
409
+ const notes = [];
410
+ const findings = [];
411
+ const contractsApp = findContractsApp(root);
412
+ const webApp = findWebApp(root, contractsApp);
413
+ const network = options.network || envValue(root, 'NEXT_PUBLIC_NETWORK') || 'celoSepolia';
414
+ if (!contractsApp) {
415
+ notes.push('No hay app de contratos (apps/contracts, apps/hardhat o hardhat/): nada que verificar.');
416
+ return {
417
+ ok: true,
418
+ network,
419
+ contractsApp: null,
420
+ webApp,
421
+ deploymentsDir: null,
422
+ deployments: [],
423
+ findings,
424
+ notes,
425
+ };
426
+ }
427
+ const addresses = new Set();
428
+ const { files, findings: validation } = validateDeployments(root, addresses);
429
+ findings.push(...validation);
430
+ const explicitDir = options.deploymentsDir ? path.resolve(root, options.deploymentsDir) : null;
431
+ const inferredDir = webApp ? checkCallSites(root, webApp, network, findings) : null;
432
+ const candidates = [
433
+ explicitDir,
434
+ inferredDir ? path.join(root, inferredDir) : null,
435
+ path.join(root, contractsApp, 'deployments'),
436
+ path.join(root, 'apps/contracts/deployments'),
437
+ path.join(root, 'apps/hardhat/deployments'),
438
+ ];
439
+ const deploymentsDir = candidates.find((dir) => dir && isDir(dir)) ?? null;
440
+ if (webApp && !options.noLiterals)
441
+ checkLiterals(root, webApp, addresses, findings);
442
+ if (deploymentsDir && files.length === 0) {
443
+ notes.push(`${path.relative(root, deploymentsDir)} no tiene JSON de despliegue.`);
444
+ }
445
+ const errors = findings.filter((finding) => finding.severity === 'error');
446
+ return {
447
+ ok: errors.length === 0,
448
+ network,
449
+ contractsApp,
450
+ webApp,
451
+ deploymentsDir: deploymentsDir ? path.relative(root, deploymentsDir) : null,
452
+ deployments: files,
453
+ findings,
454
+ notes,
455
+ };
456
+ }
457
+ function parseArgs(args) {
458
+ const options = {};
459
+ let root = process.cwd();
460
+ let json = false;
461
+ let strict = false;
462
+ let listCodes = false;
463
+ for (let i = 0; i < args.length; i++) {
464
+ const arg = args[i];
465
+ if (arg === '--json')
466
+ json = true;
467
+ else if (arg === '--strict')
468
+ strict = true;
469
+ else if (arg === '--list-codes')
470
+ listCodes = true;
471
+ else if (arg === '--no-literals')
472
+ options.noLiterals = true;
473
+ else if (arg === '--network')
474
+ options.network = args[++i];
475
+ else if (arg === '--deployments')
476
+ options.deploymentsDir = args[++i];
477
+ else if (arg === '--root')
478
+ root = path.resolve(args[++i] ?? '.');
479
+ }
480
+ return { options, root, json, strict, listCodes };
481
+ }
482
+ export function runCheckDeploy(args = process.argv.slice(3)) {
483
+ const parsed = parseArgs(args);
484
+ if (parsed.listCodes) {
485
+ for (const entry of CODES)
486
+ console.log(` ${entry.code.padEnd(24)} ${entry.severity.padEnd(5)} ${entry.means}`);
487
+ return;
488
+ }
489
+ const report = checkDeployments(parsed.root, parsed.options);
490
+ const errors = report.findings.filter((finding) => finding.severity === 'error');
491
+ const warnings = report.findings.filter((finding) => finding.severity === 'warn');
492
+ if (parsed.json) {
493
+ console.log(JSON.stringify({
494
+ ok: report.ok && (!parsed.strict || warnings.length === 0),
495
+ network: report.network,
496
+ deploymentsDir: report.deploymentsDir,
497
+ deployments: report.deployments,
498
+ findings: report.findings,
499
+ }, null, 2));
500
+ }
501
+ else {
502
+ info(`Red: ${report.network}${report.webApp ? ` · web: ${report.webApp}` : ''}${report.contractsApp ? ` · contratos: ${report.contractsApp}` : ''}`);
503
+ if (report.deploymentsDir)
504
+ info(`Deployments: ${report.deploymentsDir} (${report.deployments.length} JSON)`);
505
+ for (const note of report.notes)
506
+ info(` ${note}`);
507
+ for (const finding of report.findings) {
508
+ const line = ` [${finding.severity === 'error' ? 'FAIL' : 'WARN'}] ${finding.code}: ${finding.message}`;
509
+ if (finding.severity === 'error')
510
+ problem(line);
511
+ else
512
+ warn(line);
513
+ }
514
+ if (report.findings.length === 0)
515
+ success(' [OK] direcciones de despliegue y su uso conformes');
516
+ const summary = `${report.findings.length} hallazgo(s): ${errors.length} error(es), ${warnings.length} aviso(s)`;
517
+ if (errors.length > 0 || (parsed.strict && warnings.length > 0))
518
+ problem(`contract:checkdeploy: ${summary}`);
519
+ else
520
+ success(`contract:checkdeploy: ${summary}`);
521
+ }
522
+ if (errors.length > 0 || (parsed.strict && warnings.length > 0))
523
+ process.exit(1);
524
+ process.exit(0);
525
+ }
526
+ //# sourceMappingURL=check-deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-deploy.js","sourceRoot":"","sources":["../src/check-deploy.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @pasosdejesus/contract-test — Hardhat test runner for OpenBSD/adJ.
3
3
  *
4
- * Registers the `contract:test` command into @pasosdejesus/m via the plugin system.
5
- * Lazy-loads the runner and @pasosdejesus/edr only when the command is invoked.
4
+ * Registers `contract:test` and `contract:checkdeploy` into @pasosdejesus/m via
5
+ * the plugin system. Both lazy-load their implementation only when invoked.
6
6
  */
7
7
  import { registerCommands } from '@pasosdejesus/m/plugin';
8
8
  registerCommands({
@@ -12,6 +12,13 @@ registerCommands({
12
12
  await runContractTest();
13
13
  },
14
14
  description: 'Run Hardhat-compatible tests using @ethereumjs/vm (EDR fallback for OpenBSD)',
15
- }
15
+ },
16
+ 'contract:checkdeploy': {
17
+ handler: async () => {
18
+ const { runCheckDeploy } = await import('./check-deploy.js');
19
+ runCheckDeploy();
20
+ },
21
+ description: 'Verify deployment addresses in deployments/ and that sources read them from there',
22
+ },
16
23
  });
17
24
  //# 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;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;CACF,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pasosdejesus/contract-test",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Hardhat test runner for OpenBSD — Mocha + @ethereumjs/vm EDR fallback",
5
5
  "mEngine": true,
6
6
  "author": "",
@@ -27,7 +27,7 @@
27
27
  "mocha": "^11.7.6"
28
28
  },
29
29
  "peerDependencies": {
30
- "@pasosdejesus/m": "^0.34.0",
30
+ "@pasosdejesus/m": "^0.34.1",
31
31
  "ethers": "^6",
32
32
  "viem": "^2"
33
33
  },