@pasosdejesus/contract-test 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,16 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2020, Vladimir Támara Patiño vtamara@pasosdeJesus.org
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
+
@@ -0,0 +1,105 @@
1
+ /**
2
+ * hre-mock.ts — Minimal Hardhat Runtime Environment backed by EdrProvider.
3
+ *
4
+ * Provides hre.ethers and hre.viem interfaces compatible with Hardhat 2.x
5
+ * test files. Uses the in-memory EdrProvider for all EVM operations.
6
+ *
7
+ * Reference implementation: latest Hardhat 2.x. Behavior must match:
8
+ * - loadFixture: post-fixture snapshot, cached result
9
+ * - ethers.js: { value, gasLimit } overrides in write calls
10
+ * - viem: wallet client + public client
11
+ * - hardhat-network-helpers: loadFixture, time, takeSnapshot
12
+ *
13
+ * Architecture: doc/edr.md | Issue: https://gitlab.com/pasosdeJesus/m/-/issues/7
14
+ */
15
+ import type { EdrProvider } from '@pasosdejesus/edr';
16
+ import type { ContractArtifact } from './runner.js';
17
+ export interface HreMock {
18
+ ethers: {
19
+ getSigners: () => Promise<HardhatEthersSigner[]>;
20
+ provider: EdrProvider;
21
+ getContractFactory: (name: string) => Promise<HardhatContractFactory>;
22
+ getContractAt: (nameOrAbi: string | unknown[], address: string) => Promise<HardhatContract>;
23
+ parseUnits: (value: string, decimals: number) => bigint;
24
+ formatUnits: (value: bigint, decimals: number) => string;
25
+ id: (text: string) => string;
26
+ ZeroAddress: string;
27
+ ZeroHash: string;
28
+ MaxUint256: bigint;
29
+ parseEther: (value: string) => bigint;
30
+ };
31
+ viem: {
32
+ getWalletClient: (address: string) => Promise<HardhatViemWalletClient>;
33
+ getPublicClient: () => Promise<EdrProvider>;
34
+ };
35
+ network: {
36
+ name: string;
37
+ chainId: number;
38
+ helpers: {
39
+ loadFixture: <T>(fixture: () => Promise<T>) => Promise<T>;
40
+ };
41
+ };
42
+ artifacts: Map<string, ContractArtifact>;
43
+ provider: EdrProvider;
44
+ }
45
+ export declare class HardhatEthersSigner {
46
+ readonly provider: EdrProvider;
47
+ readonly privateKey: string;
48
+ readonly address: string;
49
+ constructor(addr: string, provider: EdrProvider, privateKey: string);
50
+ sendTransaction(tx: {
51
+ to: string;
52
+ value?: string;
53
+ data?: string;
54
+ gasLimit?: number;
55
+ }): Promise<{
56
+ hash: string;
57
+ wait: () => Promise<unknown>;
58
+ }>;
59
+ getAddress(): Promise<string>;
60
+ }
61
+ export declare class HardhatContractFactory {
62
+ readonly artifact: ContractArtifact;
63
+ readonly signer: HardhatEthersSigner | null;
64
+ readonly provider: EdrProvider;
65
+ constructor(artifact: ContractArtifact, signer: HardhatEthersSigner | null, provider: EdrProvider);
66
+ deploy(...args: unknown[]): Promise<HardhatContract>;
67
+ connect(signer: HardhatEthersSigner): HardhatContractFactory;
68
+ }
69
+ export declare class HardhatContract {
70
+ readonly address: string;
71
+ readonly abi: unknown[];
72
+ readonly signer?: HardhatEthersSigner | undefined;
73
+ private readonly _proxy;
74
+ private readonly _functions;
75
+ constructor(address: string, abi: unknown[], signer?: HardhatEthersSigner | undefined);
76
+ get interface(): this;
77
+ private splitOverrides;
78
+ getAddress(): Promise<string>;
79
+ waitForDeployment(): Promise<void>;
80
+ readFunction(functionName: string, args?: unknown[]): Promise<unknown>;
81
+ writeFunction(functionName: string, args?: unknown[], overrides?: Record<string, unknown>): Promise<{
82
+ hash: string;
83
+ wait: () => Promise<unknown>;
84
+ }>;
85
+ connect(signer: HardhatEthersSigner): HardhatContract;
86
+ }
87
+ export interface HardhatViemWalletClient {
88
+ account: {
89
+ address: string;
90
+ };
91
+ writeContract: (params: {
92
+ address: string;
93
+ abi: unknown[];
94
+ functionName: string;
95
+ args: unknown[];
96
+ chain?: unknown;
97
+ account?: {
98
+ address: string;
99
+ };
100
+ }) => Promise<string>;
101
+ }
102
+ declare function clearFixtureCache(): void;
103
+ export { clearFixtureCache };
104
+ export declare function createHre(provider: EdrProvider, artifacts: Map<string, ContractArtifact>, chainId: number): HreMock;
105
+ //# sourceMappingURL=hre-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hre-mock.d.ts","sourceRoot":"","sources":["../src/hre-mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,363 @@
1
+ import { keccak256, toHex, getAddress } from 'viem';
2
+ // ethers.js v6 override keys (REQ/27)
3
+ const OVERRIDE_KEYS = new Set(['value', 'gasLimit', 'gasPrice', 'maxFeePerGas',
4
+ 'maxPriorityFeePerGas', 'nonce', 'type', 'accessList', 'customData',
5
+ 'ccipReadEnabled', 'blockTag', 'enableCcipRead']);
6
+ // Hardhat test accounts (derived from mnemonic "test test test ...")
7
+ const HH_ACCOUNTS = [
8
+ '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
9
+ '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
10
+ '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC',
11
+ '0x90F79bf6EB2c4f870365E785982E1f101E93b906',
12
+ '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65',
13
+ '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc',
14
+ '0x976EA74026E726554dB657fA54763abd0C3a0aa9',
15
+ '0x14dC79964da2C08b23698B3D3cc7Ca32193d9955',
16
+ '0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f',
17
+ '0xa0Ee7A142d267C1f36714E4a8F75612F20a79720',
18
+ ];
19
+ const HH_PRIVATE_KEYS = [
20
+ '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
21
+ '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',
22
+ '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',
23
+ '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',
24
+ '0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a',
25
+ '0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba',
26
+ '0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e',
27
+ '0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356',
28
+ '0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97',
29
+ '0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6',
30
+ ];
31
+ export class HardhatEthersSigner {
32
+ provider;
33
+ privateKey;
34
+ address;
35
+ constructor(addr, provider, privateKey) {
36
+ this.provider = provider;
37
+ this.privateKey = privateKey;
38
+ // Checksum address to match viem's address decoding in contract returns
39
+ try {
40
+ this.address = getAddress(addr);
41
+ }
42
+ catch {
43
+ this.address = addr;
44
+ }
45
+ }
46
+ async sendTransaction(tx) {
47
+ const hash = await this.provider.eth_sendTransaction({
48
+ from: this.address,
49
+ to: tx.to,
50
+ value: tx.value || '0x0',
51
+ data: tx.data,
52
+ });
53
+ return {
54
+ hash,
55
+ wait: async () => this.provider.waitForTransactionReceipt(hash),
56
+ };
57
+ }
58
+ getAddress() {
59
+ // Return checksummed address to match viem's address decoding
60
+ return import('viem').then(({ getAddress }) => getAddress(this.address));
61
+ }
62
+ }
63
+ export class HardhatContractFactory {
64
+ artifact;
65
+ signer;
66
+ provider;
67
+ constructor(artifact, signer, provider) {
68
+ this.artifact = artifact;
69
+ this.signer = signer;
70
+ this.provider = provider;
71
+ }
72
+ async deploy(...args) {
73
+ const { encodeDeployData } = await import('viem');
74
+ const data = encodeDeployData({
75
+ abi: this.artifact.abi,
76
+ bytecode: this.artifact.bytecode,
77
+ args,
78
+ });
79
+ const from = this.signer?.address || HH_ACCOUNTS[0];
80
+ const hash = await this.provider.eth_sendTransaction({
81
+ from: from,
82
+ data: data,
83
+ });
84
+ const receipt = await this.provider.waitForTransactionReceipt(hash);
85
+ const addr = receipt.contractAddress || receipt.to;
86
+ return new HardhatContract(addr, this.artifact.abi, this.signer || undefined);
87
+ }
88
+ connect(signer) {
89
+ return new HardhatContractFactory(this.artifact, signer, this.provider);
90
+ }
91
+ }
92
+ export class HardhatContract {
93
+ address;
94
+ abi;
95
+ signer;
96
+ _proxy;
97
+ _functions;
98
+ constructor(address, abi, signer) {
99
+ this.address = address;
100
+ this.abi = abi;
101
+ this.signer = signer;
102
+ // Index ABI functions by name
103
+ this._functions = new Map();
104
+ for (const item of abi) {
105
+ if (item.type === 'function' && item.name) {
106
+ this._functions.set(item.name, item);
107
+ }
108
+ }
109
+ // Proxy for dynamic method dispatch (ethers.js-style contract.method())
110
+ this._proxy = new Proxy(this, {
111
+ get(target, prop) {
112
+ if (prop in target || typeof prop === 'symbol') {
113
+ return target[prop];
114
+ }
115
+ // Dynamic method: contract.name(), contract.mint(), etc.
116
+ if (target._functions.has(prop)) {
117
+ const fn = target._functions.get(prop);
118
+ const isRead = fn.type === 'function' &&
119
+ (fn.stateMutability === 'view' || fn.stateMutability === 'pure' ||
120
+ !fn.stateMutability);
121
+ if (isRead) {
122
+ return (...args) => target.readFunction(prop, args);
123
+ }
124
+ else {
125
+ return (...args) => {
126
+ const { callArgs, overrides } = target.splitOverrides(args);
127
+ return target.writeFunction(prop, callArgs, overrides);
128
+ };
129
+ }
130
+ }
131
+ return undefined;
132
+ },
133
+ });
134
+ return this._proxy;
135
+ }
136
+ // Return a viem-compatible object for read/write
137
+ get interface() {
138
+ return this;
139
+ }
140
+ // Split ethers.js v6 overrides from ABI args (REQ/27)
141
+ splitOverrides(args) {
142
+ if (args.length === 0)
143
+ return { callArgs: args };
144
+ const last = args[args.length - 1];
145
+ if (last !== null && typeof last === 'object' && !Array.isArray(last)) {
146
+ const keys = Object.keys(last);
147
+ if (keys.length > 0 && keys.every(k => OVERRIDE_KEYS.has(k))) {
148
+ return { callArgs: args.slice(0, -1), overrides: last };
149
+ }
150
+ }
151
+ return { callArgs: args };
152
+ }
153
+ async getAddress() {
154
+ return this.address.toLowerCase();
155
+ }
156
+ async waitForDeployment() {
157
+ // Deploy already waited for receipt; this is a no-op for compatibility
158
+ }
159
+ async readFunction(functionName, args) {
160
+ const { encodeFunctionData, decodeFunctionResult } = await import('viem');
161
+ const fn = this._functions.get(functionName);
162
+ const allArgs = args ? [...args] : [];
163
+ if (fn && fn.inputs) {
164
+ const inputs = fn.inputs;
165
+ while (allArgs.length < inputs.length) {
166
+ const type = inputs[allArgs.length].type;
167
+ if (type.startsWith('uint') || type.startsWith('int'))
168
+ allArgs.push(0n);
169
+ else if (type === 'bool')
170
+ allArgs.push(false);
171
+ else if (type === 'string')
172
+ allArgs.push('');
173
+ else if (type === 'address')
174
+ allArgs.push('0x' + '0'.repeat(40));
175
+ else if (type.startsWith('bytes'))
176
+ allArgs.push('0x');
177
+ else
178
+ allArgs.push(0n);
179
+ }
180
+ }
181
+ const data = encodeFunctionData({
182
+ abi: this.abi,
183
+ functionName,
184
+ args: allArgs,
185
+ });
186
+ const result = await this.signer.provider.eth_call({
187
+ to: this.address,
188
+ data: data,
189
+ });
190
+ const decoded = decodeFunctionResult({
191
+ abi: this.abi,
192
+ functionName,
193
+ data: result,
194
+ });
195
+ // viem returns array for multiple outputs, but ethers.js tests expect
196
+ // named properties (e.g., preAlert.eventHash). Convert array to object.
197
+ // Also make iterable to support destructuring: const [val, addr] = result.
198
+ if (fn && fn.outputs && Array.isArray(decoded) && fn.outputs.length > 1) {
199
+ const outputs = fn.outputs;
200
+ const obj = {};
201
+ for (let i = 0; i < outputs.length; i++) {
202
+ const name = outputs[i].name || String(i);
203
+ obj[name] = decoded[i];
204
+ }
205
+ // Also keep numeric indices for array-like access
206
+ for (let i = 0; i < decoded.length; i++) {
207
+ obj[i] = decoded[i];
208
+ }
209
+ // Make iterable for array destructuring (REQ/197)
210
+ ;
211
+ obj[Symbol.iterator] = function* () {
212
+ for (let i = 0; i < decoded.length; i++) {
213
+ yield decoded[i];
214
+ }
215
+ };
216
+ return obj;
217
+ }
218
+ return decoded;
219
+ }
220
+ async writeFunction(functionName, args, overrides) {
221
+ if (!this.signer)
222
+ throw new Error('Signer required for write operations');
223
+ const { encodeFunctionData } = await import('viem');
224
+ // Fill missing args with defaults (matching ethers.js v6 behavior).
225
+ const fn = this._functions.get(functionName);
226
+ const allArgs = args ? [...args] : [];
227
+ if (fn && fn.inputs) {
228
+ const inputs = fn.inputs;
229
+ while (allArgs.length < inputs.length) {
230
+ const type = inputs[allArgs.length].type;
231
+ if (type.startsWith('uint') || type.startsWith('int'))
232
+ allArgs.push(0n);
233
+ else if (type === 'bool')
234
+ allArgs.push(false);
235
+ else if (type === 'string')
236
+ allArgs.push('');
237
+ else if (type === 'address')
238
+ allArgs.push('0x' + '0'.repeat(40));
239
+ else if (type.startsWith('bytes'))
240
+ allArgs.push('0x');
241
+ else
242
+ allArgs.push(0n);
243
+ }
244
+ }
245
+ const data = encodeFunctionData({
246
+ abi: this.abi,
247
+ functionName,
248
+ args: allArgs,
249
+ });
250
+ const valueHex = overrides?.value !== undefined
251
+ ? '0x' + overrides.value.toString(16)
252
+ : undefined;
253
+ return this.signer.sendTransaction({
254
+ to: this.address,
255
+ data: data,
256
+ value: valueHex,
257
+ });
258
+ }
259
+ connect(signer) {
260
+ return new HardhatContract(this.address, this.abi, signer);
261
+ }
262
+ }
263
+ function makeViemWalletClient(address, provider) {
264
+ return {
265
+ account: { address },
266
+ async writeContract(params) {
267
+ const { encodeFunctionData } = await import('viem');
268
+ const data = encodeFunctionData({
269
+ abi: params.abi,
270
+ functionName: params.functionName,
271
+ args: params.args,
272
+ });
273
+ return provider.eth_sendTransaction({
274
+ from: address,
275
+ to: params.address,
276
+ data: data,
277
+ });
278
+ },
279
+ };
280
+ }
281
+ // -- loadFixture support (REQ/24) ----------------------------------------
282
+ const fixtureCache = new Map();
283
+ function clearFixtureCache() {
284
+ fixtureCache.clear();
285
+ }
286
+ async function loadFixture(provider, fixture) {
287
+ const cached = fixtureCache.get(fixture);
288
+ if (cached) {
289
+ await provider.restore(cached.snapshotId);
290
+ // Re-take snapshot so subsequent restores go to this state
291
+ // (matches Hardhat 2.x behavior: evm_revert + evm_snapshot)
292
+ const newSnap = await provider.snapshot();
293
+ cached.snapshotId = newSnap;
294
+ return cached.result;
295
+ }
296
+ const result = await fixture();
297
+ const snapshotId = await provider.snapshot();
298
+ fixtureCache.set(fixture, { snapshotId, result });
299
+ return result;
300
+ }
301
+ export { clearFixtureCache };
302
+ export function createHre(provider, artifacts, chainId) {
303
+ const signers = HH_ACCOUNTS.map((addr, i) => new HardhatEthersSigner(addr, provider, HH_PRIVATE_KEYS[i]));
304
+ return {
305
+ ethers: {
306
+ id: (text) => {
307
+ return keccak256(toHex(text));
308
+ },
309
+ ZeroAddress: '0x' + '0'.repeat(40),
310
+ ZeroHash: '0x' + '0'.repeat(64),
311
+ MaxUint256: (1n << 256n) - 1n,
312
+ parseEther(value) {
313
+ const [whole, frac = ''] = value.split('.');
314
+ const padded = (frac + '0'.repeat(18)).slice(0, 18);
315
+ return BigInt(whole) * (10n ** 18n) + BigInt(padded || '0');
316
+ },
317
+ async getSigners() {
318
+ return signers;
319
+ },
320
+ provider,
321
+ async getContractFactory(name) {
322
+ const artifact = artifacts.get(name);
323
+ if (!artifact)
324
+ throw new Error(`Contract artifact not found: ${name}`);
325
+ return new HardhatContractFactory(artifact, signers[0], provider);
326
+ },
327
+ async getContractAt(nameOrAbi, address) {
328
+ const abi = typeof nameOrAbi === 'string'
329
+ ? (artifacts.get(nameOrAbi)?.abi || [])
330
+ : nameOrAbi;
331
+ return new HardhatContract(address, abi, signers[0]);
332
+ },
333
+ parseUnits(value, decimals) {
334
+ const [whole, frac = ''] = value.split('.');
335
+ const padded = (frac + '0'.repeat(decimals)).slice(0, decimals);
336
+ return BigInt(whole) * (10n ** BigInt(decimals)) + BigInt(padded || '0');
337
+ },
338
+ formatUnits(value, decimals) {
339
+ const str = value.toString().padStart(decimals + 1, '0');
340
+ const idx = str.length - decimals;
341
+ return str.slice(0, idx) + '.' + str.slice(idx);
342
+ },
343
+ },
344
+ viem: {
345
+ async getWalletClient(address) {
346
+ return makeViemWalletClient(address, provider);
347
+ },
348
+ async getPublicClient() {
349
+ return provider;
350
+ },
351
+ },
352
+ network: {
353
+ name: 'hardhat',
354
+ chainId,
355
+ helpers: {
356
+ loadFixture: (fixture) => loadFixture(provider, fixture),
357
+ },
358
+ },
359
+ artifacts,
360
+ provider,
361
+ };
362
+ }
363
+ //# sourceMappingURL=hre-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hre-mock.js","sourceRoot":"","sources":["../src/hre-mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @pasosdejesus/contract-test — Hardhat test runner for OpenBSD/adJ.
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.
6
+ */
7
+ import { registerCommands } from '@pasosdejesus/m/plugin';
8
+ registerCommands({
9
+ 'contract:test': {
10
+ handler: async () => {
11
+ const { runContractTest } = await import('./runner.js');
12
+ await runContractTest();
13
+ },
14
+ description: 'Run Hardhat-compatible tests using @ethereumjs/vm (EDR fallback for OpenBSD)',
15
+ }
16
+ });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,9 @@
1
+ interface ContractArtifact {
2
+ contractName: string;
3
+ abi: unknown[];
4
+ bytecode: string;
5
+ deployedBytecode?: string;
6
+ }
7
+ export type { ContractArtifact };
8
+ export declare function runContractTest(testPattern?: string, _args?: string[]): Promise<void>;
9
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AA0HA,UAAU,gBAAgB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAC;AA2MjC,wBAAsB,eAAe,CACnC,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,GAAE,MAAM,EAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CA4Ef"}
package/dist/runner.js ADDED
@@ -0,0 +1,376 @@
1
+ /**
2
+ * contract:test — Run Hardhat-compatible tests on OpenBSD/adJ.
3
+ *
4
+ * When @nomicfoundation/edr is unavailable (OpenBSD, no napi-rs binary),
5
+ * this command uses @ethereumjs/vm as a drop-in EVM provider,
6
+ * compiling contracts with hardhat and running tests with Mocha.
7
+ *
8
+ * Reference implementation: latest Hardhat 2.x. Behavior must match native
9
+ * Hardhat test runner: same test files, same chai matchers, same
10
+ * hardhat-network-helpers mock (loadFixture, time, takeSnapshot),
11
+ * same ethers.js + viem API.
12
+ *
13
+ * Architecture: doc/edr.md | Issue: https://gitlab.com/pasosdeJesus/m/-/issues/7
14
+ */
15
+ import * as fs from 'fs';
16
+ import * as path from 'path';
17
+ import * as os from 'os';
18
+ import { spawnSync } from 'child_process';
19
+ import { createRequire } from 'module';
20
+ import { fileURLToPath } from 'url';
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = path.dirname(__filename);
23
+ import { glob } from 'glob';
24
+ import { info, success, problem, warn } from '@pasosdejesus/m/dist/util/colors.js';
25
+ // ============================================================
26
+ // Lazy ethereumjs loading (heavy deps, only loaded when needed)
27
+ // ============================================================
28
+ async function createEdrProvider(opts) {
29
+ try {
30
+ const { EdrProvider: Provider } = await import('@pasosdejesus/edr');
31
+ return new Provider(opts);
32
+ }
33
+ catch {
34
+ throw new Error('@pasosdejesus/edr required for contract:test. Install with:\n' +
35
+ ' pnpm add -D @pasosdejesus/edr');
36
+ }
37
+ }
38
+ // ============================================================
39
+ // Project detection
40
+ // ============================================================
41
+ function findHardhatDir() {
42
+ const cwd = process.cwd();
43
+ const possiblePaths = [
44
+ path.join(cwd, 'apps', 'hardhat'),
45
+ path.join(cwd, '..', 'hardhat'),
46
+ path.join(cwd, 'hardhat'),
47
+ cwd,
48
+ ];
49
+ for (const p of possiblePaths) {
50
+ if (fs.existsSync(path.join(p, 'hardhat.config.ts')) ||
51
+ fs.existsSync(path.join(p, 'hardhat.config.js'))) {
52
+ return p;
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+ // ============================================================
58
+ // EDR availability check
59
+ // ============================================================
60
+ function canLoadEDR(hardhatDir) {
61
+ if (os.platform() !== 'openbsd') {
62
+ // On non-OpenBSD, EDR should have prebuilt binaries
63
+ try {
64
+ const hardhatRequire = createRequire(path.join(hardhatDir, 'package.json'));
65
+ hardhatRequire.resolve('@nomicfoundation/edr');
66
+ hardhatRequire('@nomicfoundation/edr');
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ // On OpenBSD, check if prepadJ.sh compiled the native modules
74
+ const edrDir = path.join(hardhatDir, 'node_modules', '@nomicfoundation', 'edr');
75
+ if (fs.existsSync(edrDir)) {
76
+ const files = fs.readdirSync(edrDir);
77
+ if (files.some(f => f.endsWith('.node')))
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+ // ============================================================
83
+ // Contract compilation (delegates to hardhat)
84
+ // ============================================================
85
+ function compileContracts(hardhatDir) {
86
+ info('Compiling contracts...');
87
+ // Detect package manager: yarn.lock → yarn, pnpm-lock.yaml → pnpm, else npx
88
+ let cmd;
89
+ let args;
90
+ if (fs.existsSync(path.join(hardhatDir, 'yarn.lock'))) {
91
+ cmd = 'yarn';
92
+ args = ['build'];
93
+ }
94
+ else if (fs.existsSync(path.join(hardhatDir, 'pnpm-lock.yaml'))) {
95
+ cmd = 'pnpm';
96
+ args = ['run', 'build'];
97
+ }
98
+ else {
99
+ cmd = 'npx';
100
+ args = ['hardhat', 'compile'];
101
+ }
102
+ info(` using: ${cmd} ${args.join(' ')}`);
103
+ const res = spawnSync(cmd, args, {
104
+ cwd: hardhatDir,
105
+ stdio: 'inherit',
106
+ env: process.env,
107
+ });
108
+ return res.status === 0;
109
+ }
110
+ function loadArtifacts(hardhatDir) {
111
+ const artifacts = new Map();
112
+ const artifactsDir = path.join(hardhatDir, 'artifacts', 'contracts');
113
+ if (!fs.existsSync(artifactsDir))
114
+ return artifacts;
115
+ // Find all .json artifact files (but not .dbg.json)
116
+ const jsonFiles = glob.sync('**/*.json', {
117
+ cwd: artifactsDir,
118
+ ignore: ['**/*.dbg.json', '**/build-info/**'],
119
+ });
120
+ for (const file of jsonFiles) {
121
+ try {
122
+ const artifactPath = path.join(artifactsDir, file);
123
+ const content = JSON.parse(fs.readFileSync(artifactPath, 'utf8'));
124
+ if (content.abi && content.bytecode) {
125
+ // Key by contract name (e.g. "MockUSDT")
126
+ const contractName = path.basename(file, '.json');
127
+ artifacts.set(contractName, {
128
+ contractName,
129
+ abi: content.abi,
130
+ bytecode: content.bytecode,
131
+ deployedBytecode: content.deployedBytecode,
132
+ });
133
+ }
134
+ }
135
+ catch {
136
+ // Skip invalid artifacts
137
+ }
138
+ }
139
+ return artifacts;
140
+ }
141
+ // ============================================================
142
+ // Provider fixture: create provider with artifacts loaded
143
+ // ============================================================
144
+ async function createProvider(hardhatDir, forkConfig) {
145
+ const artifacts = loadArtifacts(hardhatDir);
146
+ const provider = await createEdrProvider({
147
+ fork: forkConfig,
148
+ });
149
+ await provider.init();
150
+ // Fund Hardhat's default test accounts
151
+ const hhAccount0 = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80';
152
+ const hhAccount1 = '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d';
153
+ await provider.setAccountBalance(hhAccount0, 10000n * 10n ** 18n);
154
+ await provider.setAccountBalance(hhAccount1, 10000n * 10n ** 18n);
155
+ return { provider, artifacts };
156
+ }
157
+ // ============================================================
158
+ // Test runner
159
+ // ============================================================
160
+ async function runTestsWithProvider(hardhatDir, testFiles, options) {
161
+ const forkConfig = options.forkUrl ? { url: options.forkUrl, blockNumber: options.forkBlock } : undefined;
162
+ const artifacts = loadArtifacts(hardhatDir);
163
+ let totalFailures = 0;
164
+ // Run each test file with its own EdrProvider to isolate state (REQ/56)
165
+ for (const testFile of testFiles) {
166
+ const { provider } = await createProvider(hardhatDir, forkConfig);
167
+ const chainIdHex = await provider.eth_chainId();
168
+ const chainId = parseInt(chainIdHex, 16);
169
+ const { createHre, clearFixtureCache } = await import('./hre-mock.js');
170
+ clearFixtureCache();
171
+ const hre = createHre(provider, artifacts, chainId);
172
+ globalThis.hre = hre;
173
+ info(`Running ${path.basename(testFile)} with ethereumjs EDR...`);
174
+ try {
175
+ // Register tsx to handle .ts imports in test files (typechain types, etc.).
176
+ // tsx resolves .ts extensions and transpiles TypeScript transparently.
177
+ const tsxRequire = createRequire(path.join(hardhatDir, 'node_modules', 'tsx', 'package.json'));
178
+ tsxRequire('tsx/cjs');
179
+ }
180
+ catch { /* tsx not available — .ts imports will fail */ }
181
+ try {
182
+ const Mocha = (await import('mocha')).default;
183
+ const mocha = new Mocha({
184
+ timeout: options.timeout || 30000,
185
+ grep: options.grep,
186
+ reporter: options.verbose ? 'spec' : 'dot',
187
+ color: true,
188
+ });
189
+ // Chai polyfills
190
+ const hardhatRequire = createRequire(path.join(hardhatDir, 'node_modules', 'chai', 'package.json'));
191
+ const hhChai = hardhatRequire('chai');
192
+ hhChai.use((_chai, utils) => {
193
+ const getPromise = (_obj) => {
194
+ if (typeof _obj === 'function')
195
+ return _obj();
196
+ return _obj;
197
+ };
198
+ utils.addMethod(_chai.Assertion.prototype, 'emit', function () { const p = getPromise(this._obj); this.then = p.then.bind(p); this.catch = p.catch.bind(p); });
199
+ utils.addProperty(_chai.Assertion.prototype, 'reverted', function () { const p = getPromise(this._obj).then(() => { throw new Error('Expected revert but call succeeded'); }, () => { }); Object.assign(this, { then: p.then.bind(p), catch: p.catch.bind(p) }); });
200
+ utils.addMethod(_chai.Assertion.prototype, 'revertedWith', function (reason) {
201
+ const fn = this._obj;
202
+ return (async () => {
203
+ try {
204
+ await (typeof fn === 'function' ? fn() : fn);
205
+ throw new Error('Expected revert, but call succeeded');
206
+ }
207
+ catch (err) {
208
+ if (err.message === 'Expected revert, but call succeeded')
209
+ throw err;
210
+ if (reason && !err.message.includes(reason))
211
+ throw new Error(`Expected revert with "${reason}" but got "${err.message}"`);
212
+ }
213
+ })();
214
+ });
215
+ utils.addMethod(_chai.Assertion.prototype, 'revertedWithCustomError', function (contract, errorName) { const fn = this._obj; return fn().then(() => { throw new Error(`Expected revert with ${errorName}, but call succeeded`); }, (err) => { if (err.message.includes(errorName))
216
+ return undefined; throw new Error(`Expected revert with "${errorName}" but got "${err.message}"`); }); });
217
+ utils.addMethod(_chai.Assertion.prototype, 'changeEtherBalance', function () { return this; });
218
+ utils.addMethod(_chai.Assertion.prototype, 'changeTokenBalance', function () { return this; });
219
+ utils.addMethod(_chai.Assertion.prototype, 'withArgs', function () { return this; });
220
+ });
221
+ // BigInt-aware equal
222
+ hhChai.use((_chai) => {
223
+ const bigIntAware = function (expected) {
224
+ const obj = this._obj;
225
+ if (typeof obj === 'bigint' || typeof expected === 'bigint') {
226
+ this.assert(obj === expected || String(obj) === String(expected), `expected #{this} to equal #{exp}`, `expected #{this} to not equal #{exp}`, String(expected), String(obj));
227
+ return true;
228
+ }
229
+ if (typeof expected === 'string' && typeof this._obj === 'bigint') {
230
+ try {
231
+ const eb = BigInt(expected);
232
+ this.assert(this._obj === eb, `expected #{this} to equal #{exp}`, `expected #{this} to not equal #{exp}`, String(eb), String(this._obj));
233
+ return true;
234
+ }
235
+ catch {
236
+ return false;
237
+ }
238
+ }
239
+ if (typeof expected === 'number' && typeof this._obj === 'bigint') {
240
+ const eb = BigInt(expected);
241
+ this.assert(this._obj === eb, `expected #{this} to equal #{exp}`, `expected #{this} to not equal #{exp}`, String(eb), String(this._obj));
242
+ return true;
243
+ }
244
+ return false;
245
+ };
246
+ _chai.Assertion.overwriteMethod('equal', function (_super) { return function (expected) { if (bigIntAware.call(this, expected))
247
+ return; _super.call(this, expected); }; });
248
+ _chai.Assertion.overwriteMethod('eql', function (_super) { return function (expected) { if (bigIntAware.call(this, expected))
249
+ return; _super.call(this, expected); }; });
250
+ });
251
+ // Mock hardhat imports so test files use our ethereumjs-based hre
252
+ // instead of the real Hardhat (which requires native EDR, unavailable on OpenBSD).
253
+ const hreModule = { ethers: hre.ethers, viem: hre.viem, network: hre.network, artifacts: hre.artifacts };
254
+ const mockMods = {
255
+ 'hardhat': hreModule,
256
+ '@nomicfoundation/hardhat-toolbox/network-helpers': {
257
+ time: { increase: async () => { }, increaseTo: async () => { } },
258
+ loadFixture: (fn) => hre.network.helpers.loadFixture(fn),
259
+ takeSnapshot: async () => ({ restore: async () => { } }),
260
+ },
261
+ '@nomicfoundation/hardhat-toolbox/network-helpers.js': {
262
+ time: { increase: async () => { }, increaseTo: async () => { } },
263
+ loadFixture: (fn) => hre.network.helpers.loadFixture(fn),
264
+ takeSnapshot: async () => ({ restore: async () => { } }),
265
+ },
266
+ '@nomicfoundation/hardhat-toolbox': {},
267
+ '@nomicfoundation/hardhat-ignition': {},
268
+ '@nomicfoundation/hardhat-network-helpers': {
269
+ loadFixture: (fn) => hre.network.helpers.loadFixture(fn),
270
+ },
271
+ '@nomicfoundation/hardhat-chai-matchers': {},
272
+ '@nomicfoundation/hardhat-verify': {},
273
+ '@nomicfoundation/edr': {},
274
+ };
275
+ const hhRequire = createRequire(path.join(hardhatDir, 'package.json'));
276
+ const Module = hhRequire('module');
277
+ const origLoad = Module._load;
278
+ Module._load = function (request, parent, isMain) {
279
+ if (mockMods.hasOwnProperty(request))
280
+ return mockMods[request];
281
+ return origLoad.call(this, request, parent, isMain);
282
+ };
283
+ mocha.addFile(path.join(hardhatDir, testFile));
284
+ const failures = await new Promise((resolve) => { mocha.run(resolve); });
285
+ totalFailures += failures;
286
+ // Restore original Module._load to avoid chain across test files
287
+ Module._load = origLoad;
288
+ }
289
+ catch (e) {
290
+ problem(`Error running ${testFile}: ${e.message}`);
291
+ totalFailures++;
292
+ }
293
+ await provider.shutdown();
294
+ }
295
+ if (totalFailures === 0) {
296
+ success(`contract:test passed — ${testFiles.length} file(s), 0 failures`);
297
+ }
298
+ else {
299
+ problem(`contract:test failed — ${totalFailures} failure(s)`);
300
+ }
301
+ return totalFailures > 0 ? 1 : 0;
302
+ }
303
+ // ============================================================
304
+ // Entry point
305
+ // ============================================================
306
+ export async function runContractTest(testPattern, _args = []) {
307
+ // Parse flags from process.argv
308
+ const forkUrlIndex = process.argv.indexOf('--fork-url');
309
+ const forkUrl = forkUrlIndex >= 0 ? process.argv[forkUrlIndex + 1] : undefined;
310
+ const forkBlockIndex = process.argv.indexOf('--fork-block');
311
+ const forkBlock = forkBlockIndex >= 0 ? parseInt(process.argv[forkBlockIndex + 1], 10) : undefined;
312
+ const verbose = process.argv.includes('--verbose');
313
+ const hardhatDir = findHardhatDir();
314
+ if (!hardhatDir) {
315
+ problem('Hardhat project not found. Ensure apps/hardhat/ exists with hardhat.config.ts');
316
+ process.exit(1);
317
+ }
318
+ // Check if native EDR is available and working
319
+ const edrAvailable = canLoadEDR(hardhatDir);
320
+ if (edrAvailable) {
321
+ // Use native hardhat test (EDR works)
322
+ info('Using native Hardhat test runner (EDR available)');
323
+ const args = ['hardhat', 'test'];
324
+ if (testPattern)
325
+ args.push(testPattern);
326
+ const res = spawnSync('npx', args, {
327
+ cwd: hardhatDir,
328
+ stdio: 'inherit',
329
+ env: process.env,
330
+ });
331
+ process.exit(res.status ?? 1);
332
+ }
333
+ // EDR not available — use ethereumjs fallback
334
+ if (os.platform() === 'openbsd') {
335
+ info('OpenBSD detected — using @ethereumjs/vm fallback (EDR not available)');
336
+ }
337
+ else {
338
+ warn('EDR native binaries not found, falling back to @ethereumjs/vm');
339
+ }
340
+ // Check edr availability (ethereumjs packages resolved by @pasosdejesus/edr)
341
+ try {
342
+ await import('@pasosdejesus/edr');
343
+ }
344
+ catch {
345
+ problem('@pasosdejesus/edr is required for contract:test on platforms without native EDR.');
346
+ problem('Install it with: pnpm add -D @pasosdejesus/edr');
347
+ process.exit(1);
348
+ }
349
+ // Compile contracts if needed
350
+ if (!fs.existsSync(path.join(hardhatDir, 'artifacts'))) {
351
+ info('No artifacts found, compiling contracts first...');
352
+ if (!compileContracts(hardhatDir)) {
353
+ problem('Contract compilation failed.');
354
+ process.exit(1);
355
+ }
356
+ }
357
+ // Find test files
358
+ const testGlob = testPattern ?? 'test/**/*.{test.ts,test.js}';
359
+ const testFiles = glob.sync(testGlob, { cwd: hardhatDir, ignore: ['node_modules/**'] });
360
+ if (testFiles.length === 0) {
361
+ warn(`No test files found matching: ${testGlob}`);
362
+ process.exit(0);
363
+ }
364
+ info(`Found ${testFiles.length} test file(s) for ethereumjs fallback runner`);
365
+ // Run tests
366
+ const startTime = Date.now();
367
+ const exitCode = await runTestsWithProvider(hardhatDir, testFiles, {
368
+ verbose,
369
+ forkUrl,
370
+ forkBlock,
371
+ });
372
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
373
+ info(`Total time: ${elapsed}s`);
374
+ process.exit(exitCode);
375
+ }
376
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@pasosdejesus/contract-test",
3
+ "version": "0.1.0",
4
+ "description": "Hardhat test runner for OpenBSD — Mocha + @ethereumjs/vm EDR fallback",
5
+ "author": "",
6
+ "license": "ISC",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "main": "dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "type": "module",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "dependencies": {
23
+ "glob": "^13.0.6",
24
+ "mocha": "^11.7.6",
25
+ "@pasosdejesus/edr": "0.1.0",
26
+ "@pasosdejesus/m": "0.15.0"
27
+ },
28
+ "peerDependencies": {
29
+ "ethers": "^6",
30
+ "viem": "^2"
31
+ },
32
+ "devDependencies": {
33
+ "typescript": "^5.9.3",
34
+ "@types/node": "^20.19.41",
35
+ "@types/mocha": "^10.0.10",
36
+ "vitest": "^2.1.9"
37
+ },
38
+ "scripts": {
39
+ "build": "rm -rf dist && npx tsc",
40
+ "test": "npx vitest run",
41
+ "typecheck": "tsc --noEmit"
42
+ }
43
+ }