@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 +16 -0
- package/dist/hre-mock.d.ts +105 -0
- package/dist/hre-mock.d.ts.map +1 -0
- package/dist/hre-mock.js +363 -0
- package/dist/hre-mock.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/runner.d.ts +9 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +376 -0
- package/dist/runner.js.map +1 -0
- package/package.json +43 -0
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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"}
|
package/dist/hre-mock.js
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -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
|
+
}
|