movehat 0.1.3 → 0.1.4
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/README.md +159 -80
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +40 -3
- package/dist/commands/run.js.map +1 -1
- package/dist/core/AccountManager.d.ts +186 -0
- package/dist/core/AccountManager.d.ts.map +1 -0
- package/dist/core/AccountManager.js +363 -0
- package/dist/core/AccountManager.js.map +1 -0
- package/dist/fork/manager.d.ts +33 -0
- package/dist/fork/manager.d.ts.map +1 -1
- package/dist/fork/manager.js +61 -0
- package/dist/fork/manager.js.map +1 -1
- package/dist/fork/storage.d.ts +10 -0
- package/dist/fork/storage.d.ts.map +1 -1
- package/dist/fork/storage.js +28 -1
- package/dist/fork/storage.js.map +1 -1
- package/dist/helpers/index.d.ts +8 -1
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +4 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/setup.d.ts.map +1 -1
- package/dist/helpers/setup.js +5 -4
- package/dist/helpers/setup.js.map +1 -1
- package/dist/helpers/setupLocalTesting.d.ts +60 -0
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -0
- package/dist/helpers/setupLocalTesting.js +277 -0
- package/dist/helpers/setupLocalTesting.js.map +1 -0
- package/dist/helpers/testFixtures.d.ts +115 -0
- package/dist/helpers/testFixtures.d.ts.map +1 -0
- package/dist/helpers/testFixtures.js +163 -0
- package/dist/helpers/testFixtures.js.map +1 -0
- package/dist/node/LocalNodeManager.d.ts +68 -0
- package/dist/node/LocalNodeManager.d.ts.map +1 -0
- package/dist/node/LocalNodeManager.js +237 -0
- package/dist/node/LocalNodeManager.js.map +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +91 -46
- package/dist/runtime.js.map +1 -1
- package/dist/templates/README.md +17 -4
- package/dist/templates/move/sources/Counter.move +12 -4
- package/dist/templates/tests/Counter.test.ts +98 -57
- package/dist/types/config.d.ts +24 -0
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/commands/run.ts +43 -3
- package/src/core/AccountManager.ts +439 -0
- package/src/fork/manager.ts +74 -0
- package/src/fork/storage.ts +33 -1
- package/src/helpers/index.ts +18 -1
- package/src/helpers/setup.ts +4 -3
- package/src/helpers/setupLocalTesting.ts +335 -0
- package/src/helpers/testFixtures.ts +222 -0
- package/src/node/LocalNodeManager.ts +297 -0
- package/src/runtime.ts +108 -47
- package/src/templates/README.md +17 -4
- package/src/templates/move/sources/Counter.move +12 -4
- package/src/templates/tests/Counter.test.ts +98 -57
- package/src/types/config.ts +32 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/helpers/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,KAAK,EAIN,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/helpers/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,KAAK,EAIN,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAsB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA0BzF;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
|
package/dist/helpers/setup.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Aptos, AptosConfig, } from "@aptos-labs/ts-sdk";
|
|
2
2
|
import { loadUserConfig, resolveNetworkConfig } from "../core/config.js";
|
|
3
|
+
import { AccountManager } from "../core/AccountManager.js";
|
|
3
4
|
export async function setupTestEnvironment(networkName) {
|
|
4
5
|
// Load and resolve config for selected network
|
|
5
6
|
const userConfig = await loadUserConfig();
|
|
@@ -10,8 +11,8 @@ export async function setupTestEnvironment(networkName) {
|
|
|
10
11
|
fullnode: config.rpc,
|
|
11
12
|
});
|
|
12
13
|
const aptos = new Aptos(aptosConfig);
|
|
13
|
-
|
|
14
|
-
const account =
|
|
14
|
+
// Load account using AccountManager
|
|
15
|
+
const account = AccountManager.loadAccountFromPrivateKey(config.privateKey);
|
|
15
16
|
console.log(`✅ Test environment ready`);
|
|
16
17
|
console.log(` Account: ${account.accountAddress.toString()}`);
|
|
17
18
|
console.log(` Network: ${config.network}`);
|
|
@@ -23,6 +24,6 @@ export async function setupTestEnvironment(networkName) {
|
|
|
23
24
|
};
|
|
24
25
|
}
|
|
25
26
|
export function createTestAccount() {
|
|
26
|
-
return
|
|
27
|
+
return AccountManager.createAccount();
|
|
27
28
|
}
|
|
28
29
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/helpers/setup.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/helpers/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,WAAW,GAGZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAoB;IAC7D,+CAA+C;IAC/C,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,OAAO,EAAE,MAAM,CAAC,OAAkB;QAClC,QAAQ,EAAE,MAAM,CAAC,GAAG;KACrB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAErC,oCAAoC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,yBAAyB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAEvC,OAAO;QACL,KAAK;QACL,OAAO;QACP,MAAM;KACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC7B,OAAO,cAAc,CAAC,aAAa,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { MovehatRuntime } from "../types/runtime.js";
|
|
2
|
+
import { ForkManager } from "../fork/manager.js";
|
|
3
|
+
import { LocalNodeManager } from "../node/LocalNodeManager.js";
|
|
4
|
+
import type { LocalTestOptions } from "../types/config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Setup a local testing environment with either a local node or fork server
|
|
7
|
+
*
|
|
8
|
+
* This function provides a complete local testing setup similar to Hardhat:
|
|
9
|
+
*
|
|
10
|
+
* **Local Node Mode** (default, recommended):
|
|
11
|
+
* 1. Starts a full Movement node locally
|
|
12
|
+
* 2. Generates and funds test accounts from local faucet
|
|
13
|
+
* 3. Auto-deploys modules (works because node can process transactions)
|
|
14
|
+
* 4. Returns runtime ready to use
|
|
15
|
+
*
|
|
16
|
+
* **Fork Mode** (faster, read-only):
|
|
17
|
+
* 1. Creates/loads a fork of testnet
|
|
18
|
+
* 2. Starts a fork server
|
|
19
|
+
* 3. Generates and funds accounts (in fork state only)
|
|
20
|
+
* 4. Cannot auto-deploy (fork is read-only)
|
|
21
|
+
* 5. Returns runtime for reading data
|
|
22
|
+
*
|
|
23
|
+
* @param options Configuration options for local testing
|
|
24
|
+
* @returns MovehatRuntime configured for local testing
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Local node mode (default) - Full blockchain, can deploy
|
|
29
|
+
* const mh = await setupLocalTesting({
|
|
30
|
+
* mode: 'local-node',
|
|
31
|
+
* accountLabels: ['alice', 'bob'],
|
|
32
|
+
* autoDeploy: ['counter'], // ✅ Works!
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Fork mode - Fast, read-only
|
|
36
|
+
* const mh = await setupLocalTesting({
|
|
37
|
+
* mode: 'fork',
|
|
38
|
+
* accountLabels: ['alice', 'bob'],
|
|
39
|
+
* autoDeploy: ['counter'], // ❌ Won't work (fork can't deploy)
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function setupLocalTesting(options?: LocalTestOptions): Promise<MovehatRuntime>;
|
|
44
|
+
/**
|
|
45
|
+
* Stop the local testing environment (cleanup)
|
|
46
|
+
*/
|
|
47
|
+
export declare function stopLocalTesting(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get the current fork manager (if fork mode is active)
|
|
50
|
+
*/
|
|
51
|
+
export declare function getCurrentForkManager(): ForkManager | null;
|
|
52
|
+
/**
|
|
53
|
+
* Get the current local node (if local node mode is active)
|
|
54
|
+
*/
|
|
55
|
+
export declare function getCurrentLocalNode(): LocalNodeManager | null;
|
|
56
|
+
/**
|
|
57
|
+
* Reset fork state to initial snapshot (fork mode only)
|
|
58
|
+
*/
|
|
59
|
+
export declare function resetForkState(): Promise<void>;
|
|
60
|
+
//# sourceMappingURL=setupLocalTesting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupLocalTesting.d.ts","sourceRoot":"","sources":["../../src/helpers/setupLocalTesting.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAM3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAgBzB;AA2ND;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpD"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { join } from "path";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import { initRuntime } from "../runtime.js";
|
|
4
|
+
import { ForkManager } from "../fork/manager.js";
|
|
5
|
+
import { ForkServer } from "../fork/server.js";
|
|
6
|
+
import { LocalNodeManager } from "../node/LocalNodeManager.js";
|
|
7
|
+
import { AccountManager } from "../core/AccountManager.js";
|
|
8
|
+
let currentForkServer = null;
|
|
9
|
+
let currentForkManager = null;
|
|
10
|
+
let currentLocalNode = null;
|
|
11
|
+
/**
|
|
12
|
+
* Setup a local testing environment with either a local node or fork server
|
|
13
|
+
*
|
|
14
|
+
* This function provides a complete local testing setup similar to Hardhat:
|
|
15
|
+
*
|
|
16
|
+
* **Local Node Mode** (default, recommended):
|
|
17
|
+
* 1. Starts a full Movement node locally
|
|
18
|
+
* 2. Generates and funds test accounts from local faucet
|
|
19
|
+
* 3. Auto-deploys modules (works because node can process transactions)
|
|
20
|
+
* 4. Returns runtime ready to use
|
|
21
|
+
*
|
|
22
|
+
* **Fork Mode** (faster, read-only):
|
|
23
|
+
* 1. Creates/loads a fork of testnet
|
|
24
|
+
* 2. Starts a fork server
|
|
25
|
+
* 3. Generates and funds accounts (in fork state only)
|
|
26
|
+
* 4. Cannot auto-deploy (fork is read-only)
|
|
27
|
+
* 5. Returns runtime for reading data
|
|
28
|
+
*
|
|
29
|
+
* @param options Configuration options for local testing
|
|
30
|
+
* @returns MovehatRuntime configured for local testing
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // Local node mode (default) - Full blockchain, can deploy
|
|
35
|
+
* const mh = await setupLocalTesting({
|
|
36
|
+
* mode: 'local-node',
|
|
37
|
+
* accountLabels: ['alice', 'bob'],
|
|
38
|
+
* autoDeploy: ['counter'], // ✅ Works!
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // Fork mode - Fast, read-only
|
|
42
|
+
* const mh = await setupLocalTesting({
|
|
43
|
+
* mode: 'fork',
|
|
44
|
+
* accountLabels: ['alice', 'bob'],
|
|
45
|
+
* autoDeploy: ['counter'], // ❌ Won't work (fork can't deploy)
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export async function setupLocalTesting(options = {}) {
|
|
50
|
+
// Default options
|
|
51
|
+
const mode = options.mode || 'local-node'; // Default to local node
|
|
52
|
+
const autoFund = options.autoFund !== false; // default true
|
|
53
|
+
const defaultBalance = options.defaultBalance || 100_000_000; // 100 APT
|
|
54
|
+
const accountLabels = options.accountLabels || ["deployer", "alice", "bob"];
|
|
55
|
+
console.log(`\n🔧 Setting up local testing environment...`);
|
|
56
|
+
console.log(` Mode: ${mode}`);
|
|
57
|
+
console.log(` Accounts: ${accountLabels.join(", ")}\n`);
|
|
58
|
+
if (mode === 'local-node') {
|
|
59
|
+
return await setupWithLocalNode(options, accountLabels, autoFund, defaultBalance);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return await setupWithFork(options, accountLabels, autoFund, defaultBalance);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Setup using local Movement node (full blockchain)
|
|
67
|
+
*/
|
|
68
|
+
async function setupWithLocalNode(options, accountLabels, autoFund, defaultBalance) {
|
|
69
|
+
const nodeTestDir = options.nodeTestDir || join(process.cwd(), ".movehat", "local-node");
|
|
70
|
+
const nodeForceRestart = options.nodeForceRestart !== false; // default true
|
|
71
|
+
const nodeFaucetPort = options.nodeFaucetPort || 8081;
|
|
72
|
+
const nodeApiPort = options.nodeApiPort || 8080;
|
|
73
|
+
const nodeReadyPort = options.nodeReadyPort || 8070;
|
|
74
|
+
const nodeSilent = options.nodeSilent ?? false;
|
|
75
|
+
// 1. Start local node
|
|
76
|
+
const localNode = new LocalNodeManager({
|
|
77
|
+
testDir: nodeTestDir,
|
|
78
|
+
forceRestart: nodeForceRestart,
|
|
79
|
+
faucetPort: nodeFaucetPort,
|
|
80
|
+
apiPort: nodeApiPort,
|
|
81
|
+
readyPort: nodeReadyPort,
|
|
82
|
+
silent: nodeSilent,
|
|
83
|
+
});
|
|
84
|
+
currentLocalNode = localNode;
|
|
85
|
+
const nodeInfo = await localNode.start();
|
|
86
|
+
// 2. Generate accounts with AccountManager
|
|
87
|
+
console.log(`👥 Generating ${accountLabels.length} test accounts...`);
|
|
88
|
+
const accounts = AccountManager.createBatch(accountLabels);
|
|
89
|
+
for (const [label, account] of Object.entries(accounts)) {
|
|
90
|
+
console.log(` ${label}: ${account.accountAddress.toString()}`);
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
// 3. Fund accounts from local faucet
|
|
94
|
+
if (autoFund) {
|
|
95
|
+
const accountsList = Object.values(accounts);
|
|
96
|
+
await localNode.fundAccounts(accountsList, defaultBalance);
|
|
97
|
+
}
|
|
98
|
+
// 4. Initialize runtime pointing to local node
|
|
99
|
+
console.log(`⚙️ Initializing runtime for local network...`);
|
|
100
|
+
const deployerPrivateKey = AccountManager.exportPrivateKeys(["deployer"]).deployer;
|
|
101
|
+
if (!deployerPrivateKey) {
|
|
102
|
+
throw new Error("Failed to get deployer private key");
|
|
103
|
+
}
|
|
104
|
+
const runtime = await initRuntime({
|
|
105
|
+
network: "local",
|
|
106
|
+
configOverride: {
|
|
107
|
+
networks: {
|
|
108
|
+
local: {
|
|
109
|
+
url: `${nodeInfo.rpcUrl}/v1`,
|
|
110
|
+
chainId: "local",
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
accounts: [deployerPrivateKey],
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
console.log(`✓ Runtime initialized\n`);
|
|
117
|
+
// 5. Auto-deploy modules if specified
|
|
118
|
+
if (options.autoDeploy && options.autoDeploy.length > 0) {
|
|
119
|
+
console.log(`📦 Auto-deploying ${options.autoDeploy.length} module(s)...`);
|
|
120
|
+
// Force redeploy in local-node mode (for testing)
|
|
121
|
+
const previousRedeploy = process.env.MH_CLI_REDEPLOY;
|
|
122
|
+
process.env.MH_CLI_REDEPLOY = 'true';
|
|
123
|
+
try {
|
|
124
|
+
for (const moduleName of options.autoDeploy) {
|
|
125
|
+
try {
|
|
126
|
+
console.log(` Deploying ${moduleName}...`);
|
|
127
|
+
await runtime.deployContract(moduleName);
|
|
128
|
+
console.log(` ✓ ${moduleName} deployed`);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error(` ✗ Failed to deploy ${moduleName}: ${error.message}`);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
// Restore previous value
|
|
138
|
+
if (previousRedeploy === undefined) {
|
|
139
|
+
delete process.env.MH_CLI_REDEPLOY;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
process.env.MH_CLI_REDEPLOY = previousRedeploy;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
console.log();
|
|
146
|
+
}
|
|
147
|
+
console.log(`✅ Local testing environment ready!\n`);
|
|
148
|
+
console.log(` Mode: local-node`);
|
|
149
|
+
console.log(` RPC: ${nodeInfo.rpcUrl}/v1`);
|
|
150
|
+
console.log(` Faucet: ${nodeInfo.faucetUrl}`);
|
|
151
|
+
console.log(` Accounts: ${Array.from(accountLabels).join(", ")}`);
|
|
152
|
+
console.log(` Balance per account: ${defaultBalance / 100_000_000} APT\n`);
|
|
153
|
+
return runtime;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Setup using fork server (read-only)
|
|
157
|
+
*/
|
|
158
|
+
async function setupWithFork(options, accountLabels, autoFund, defaultBalance) {
|
|
159
|
+
const forkNetwork = options.forkNetwork || "testnet";
|
|
160
|
+
const forkName = options.forkName || "test-local";
|
|
161
|
+
const forkPort = options.forkPort || 8080;
|
|
162
|
+
const forkResetState = options.forkResetState !== false; // default true
|
|
163
|
+
console.log(` Fork network: ${forkNetwork}`);
|
|
164
|
+
console.log(` Fork name: ${forkName}`);
|
|
165
|
+
console.log(` Server port: ${forkPort}\n`);
|
|
166
|
+
// Warn about auto-deploy in fork mode
|
|
167
|
+
if (options.autoDeploy && options.autoDeploy.length > 0) {
|
|
168
|
+
console.warn(`⚠️ WARNING: Auto-deploy doesn't work in fork mode (read-only).`);
|
|
169
|
+
console.warn(` Switch to 'local-node' mode for deployment support.\n`);
|
|
170
|
+
}
|
|
171
|
+
// 1. Setup fork
|
|
172
|
+
const forkPath = join(process.cwd(), ".movehat", "forks", forkName);
|
|
173
|
+
const forkManager = new ForkManager(forkPath);
|
|
174
|
+
currentForkManager = forkManager;
|
|
175
|
+
const forkExists = existsSync(join(forkPath, "metadata.json"));
|
|
176
|
+
if (!forkExists) {
|
|
177
|
+
console.log(`📸 Creating fork from ${forkNetwork}...`);
|
|
178
|
+
const testnetRpc = "https://testnet.movementnetwork.xyz/v1";
|
|
179
|
+
await forkManager.initialize(testnetRpc, forkNetwork);
|
|
180
|
+
console.log(`✓ Fork created at ${forkPath}\n`);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log(`✓ Loading existing fork from ${forkPath}`);
|
|
184
|
+
forkManager.load();
|
|
185
|
+
if (forkResetState) {
|
|
186
|
+
console.log(`🔄 Resetting fork state...`);
|
|
187
|
+
await forkManager.resetState();
|
|
188
|
+
}
|
|
189
|
+
console.log();
|
|
190
|
+
}
|
|
191
|
+
// 2. Start fork server
|
|
192
|
+
console.log(`🚀 Starting fork server on port ${forkPort}...`);
|
|
193
|
+
const forkServer = new ForkServer(forkPath, forkPort);
|
|
194
|
+
currentForkServer = forkServer;
|
|
195
|
+
await forkServer.start();
|
|
196
|
+
console.log(`✓ Fork server running at http://localhost:${forkPort}\n`);
|
|
197
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
198
|
+
// 3. Generate accounts
|
|
199
|
+
console.log(`👥 Generating ${accountLabels.length} test accounts...`);
|
|
200
|
+
const accounts = AccountManager.createBatch(accountLabels);
|
|
201
|
+
for (const [label, account] of Object.entries(accounts)) {
|
|
202
|
+
console.log(` ${label}: ${account.accountAddress.toString()}`);
|
|
203
|
+
}
|
|
204
|
+
console.log();
|
|
205
|
+
// 4. Fund accounts in fork
|
|
206
|
+
if (autoFund) {
|
|
207
|
+
const addresses = Object.values(accounts).map((acc) => acc.accountAddress.toString());
|
|
208
|
+
await forkManager.fundMultipleAccounts(addresses, defaultBalance);
|
|
209
|
+
}
|
|
210
|
+
// 5. Initialize runtime pointing to fork
|
|
211
|
+
console.log(`⚙️ Initializing runtime for local network...`);
|
|
212
|
+
const deployerPrivateKey = AccountManager.exportPrivateKeys(["deployer"]).deployer;
|
|
213
|
+
if (!deployerPrivateKey) {
|
|
214
|
+
throw new Error("Failed to get deployer private key");
|
|
215
|
+
}
|
|
216
|
+
const runtime = await initRuntime({
|
|
217
|
+
network: "local",
|
|
218
|
+
configOverride: {
|
|
219
|
+
networks: {
|
|
220
|
+
local: {
|
|
221
|
+
url: `http://localhost:${forkPort}/v1`,
|
|
222
|
+
chainId: "local",
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
accounts: [deployerPrivateKey],
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
console.log(`✓ Runtime initialized\n`);
|
|
229
|
+
console.log(`✅ Local testing environment ready!\n`);
|
|
230
|
+
console.log(` Mode: fork (read-only)`);
|
|
231
|
+
console.log(` RPC: http://localhost:${forkPort}/v1`);
|
|
232
|
+
console.log(` Accounts: ${Array.from(accountLabels).join(", ")}`);
|
|
233
|
+
console.log(` Balance per account: ${defaultBalance / 100_000_000} APT\n`);
|
|
234
|
+
return runtime;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Stop the local testing environment (cleanup)
|
|
238
|
+
*/
|
|
239
|
+
export async function stopLocalTesting() {
|
|
240
|
+
console.log(`\n🛑 Stopping local testing environment...`);
|
|
241
|
+
// Stop local node if running
|
|
242
|
+
if (currentLocalNode) {
|
|
243
|
+
await currentLocalNode.stop();
|
|
244
|
+
currentLocalNode = null;
|
|
245
|
+
}
|
|
246
|
+
// Stop fork server if running
|
|
247
|
+
if (currentForkServer) {
|
|
248
|
+
await currentForkServer.stop();
|
|
249
|
+
currentForkServer = null;
|
|
250
|
+
currentForkManager = null;
|
|
251
|
+
}
|
|
252
|
+
console.log(`✓ Environment stopped\n`);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get the current fork manager (if fork mode is active)
|
|
256
|
+
*/
|
|
257
|
+
export function getCurrentForkManager() {
|
|
258
|
+
return currentForkManager;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get the current local node (if local node mode is active)
|
|
262
|
+
*/
|
|
263
|
+
export function getCurrentLocalNode() {
|
|
264
|
+
return currentLocalNode;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Reset fork state to initial snapshot (fork mode only)
|
|
268
|
+
*/
|
|
269
|
+
export async function resetForkState() {
|
|
270
|
+
if (currentForkManager) {
|
|
271
|
+
await currentForkManager.resetState();
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
console.warn("Warning: No active fork manager to reset");
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=setupLocalTesting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupLocalTesting.js","sourceRoot":"","sources":["../../src/helpers/setupLocalTesting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Account } from "@aptos-labs/ts-sdk";
|
|
2
|
+
import type { MovehatRuntime } from "../types/runtime.js";
|
|
3
|
+
import type { MoveContract } from "../core/contract.js";
|
|
4
|
+
import type { LocalTestOptions } from "../types/config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Test fixture with pre-configured accounts and contracts
|
|
7
|
+
*
|
|
8
|
+
* @template TModules - Union type of module names for type-safe contract access
|
|
9
|
+
*/
|
|
10
|
+
export interface TestFixture<TModules extends string = string> {
|
|
11
|
+
/** Movehat runtime instance */
|
|
12
|
+
mh: MovehatRuntime;
|
|
13
|
+
/** Named accounts (deployer, alice, bob, etc.) */
|
|
14
|
+
accounts: {
|
|
15
|
+
deployer: Account;
|
|
16
|
+
alice: Account;
|
|
17
|
+
bob: Account;
|
|
18
|
+
[key: string]: Account;
|
|
19
|
+
};
|
|
20
|
+
/** Deployed contracts by module name - type-safe based on modules parameter */
|
|
21
|
+
contracts: Record<TModules, MoveContract>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Setup a complete test fixture with local fork, accounts, and deployed contracts
|
|
25
|
+
*
|
|
26
|
+
* This is the recommended way to setup tests in movehat. It provides:
|
|
27
|
+
* - Local fork server (no testnet required)
|
|
28
|
+
* - Pre-funded labeled accounts
|
|
29
|
+
* - Auto-deployment of specified modules
|
|
30
|
+
* - Contract instances ready to use
|
|
31
|
+
*
|
|
32
|
+
* @param modules Array of module names to auto-deploy
|
|
33
|
+
* @param accountLabels Optional array of account labels (defaults to ['alice', 'bob'])
|
|
34
|
+
* @param options Optional LocalTestOptions for advanced configuration
|
|
35
|
+
* @returns TestFixture with runtime, accounts, and contracts
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* import { setupTestFixture } from "movehat/helpers";
|
|
40
|
+
*
|
|
41
|
+
* describe("Counter Contract", () => {
|
|
42
|
+
* let fixture: TestFixture;
|
|
43
|
+
*
|
|
44
|
+
* before(async function () {
|
|
45
|
+
* this.timeout(60000); // Allow time for fork + deployment
|
|
46
|
+
*
|
|
47
|
+
* fixture = await setupTestFixture(['counter'], ['alice', 'bob']);
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* it("should initialize with value 0", async () => {
|
|
51
|
+
* const counter = fixture.contracts.counter;
|
|
52
|
+
* const value = await counter.view<number>("get", [
|
|
53
|
+
* fixture.accounts.deployer.accountAddress.toString()
|
|
54
|
+
* ]);
|
|
55
|
+
*
|
|
56
|
+
* expect(value).to.equal(0);
|
|
57
|
+
* });
|
|
58
|
+
*
|
|
59
|
+
* it("alice can increment counter", async () => {
|
|
60
|
+
* const tx = await fixture.contracts.counter.call(
|
|
61
|
+
* fixture.accounts.alice,
|
|
62
|
+
* "increment",
|
|
63
|
+
* []
|
|
64
|
+
* );
|
|
65
|
+
*
|
|
66
|
+
* expect(tx.success).to.be.true;
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* after(async () => {
|
|
70
|
+
* await teardownTestFixture();
|
|
71
|
+
* });
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function setupTestFixture<TModules extends readonly string[]>(modules: TModules, accountLabels?: string[], options?: Partial<LocalTestOptions>): Promise<TestFixture<TModules[number]>>;
|
|
76
|
+
/**
|
|
77
|
+
* Teardown test fixture and cleanup resources
|
|
78
|
+
*
|
|
79
|
+
* Call this in your test suite's `after` hook to properly cleanup:
|
|
80
|
+
* - Stops fork server
|
|
81
|
+
* - Clears account pool
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* after(async () => {
|
|
86
|
+
* await teardownTestFixture();
|
|
87
|
+
* });
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare function teardownTestFixture(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Create a minimal test fixture without auto-deployment
|
|
93
|
+
* Useful when you want to deploy contracts manually in tests
|
|
94
|
+
*
|
|
95
|
+
* @param accountLabels Account labels to create (defaults to ['alice', 'bob'])
|
|
96
|
+
* @param options Optional LocalTestOptions
|
|
97
|
+
* @returns Partial TestFixture (without contracts)
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* let fixture: Partial<TestFixture>;
|
|
102
|
+
*
|
|
103
|
+
* before(async function () {
|
|
104
|
+
* this.timeout(30000);
|
|
105
|
+
* fixture = await setupMinimalFixture(['alice', 'bob', 'charlie']);
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* it("should deploy contract manually", async () => {
|
|
109
|
+
* await fixture.mh!.deployContract("counter");
|
|
110
|
+
* // ...
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare function setupMinimalFixture(accountLabels?: string[], options?: Partial<LocalTestOptions>): Promise<Omit<TestFixture, "contracts">>;
|
|
115
|
+
//# sourceMappingURL=testFixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testFixtures.d.ts","sourceRoot":"","sources":["../../src/helpers/testFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM;IAC3D,+BAA+B;IAC/B,EAAE,EAAE,cAAc,CAAC;IAEnB,kDAAkD;IAClD,QAAQ,EAAE;QACR,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IAEF,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,SAAS,SAAS,MAAM,EAAE,EACvE,OAAO,EAAE,QAAQ,EACjB,aAAa,GAAE,MAAM,EAAqB,EAC1C,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAsDxC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUzD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,GAAE,MAAM,EAAqB,EAC1C,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CA6BzC"}
|