movehat 0.0.6-alpha.0 → 0.0.8-alpha.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/README.md +70 -27
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +79 -8
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/init.js +7 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/test.js +4 -4
- package/dist/commands/test.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +50 -8
- package/dist/core/config.js.map +1 -1
- package/dist/templates/README.md +55 -26
- package/dist/templates/move/Move.toml +2 -0
- package/dist/templates/movehat.config.ts +10 -0
- package/dist/templates/package.json +1 -1
- package/dist/templates/tests/Counter.test.ts +47 -50
- package/package.json +1 -1
- package/src/commands/compile.ts +93 -8
- package/src/commands/init.ts +7 -7
- package/src/commands/test.ts +4 -4
- package/src/core/config.ts +54 -10
- package/src/templates/README.md +55 -26
- package/src/templates/move/Move.toml +2 -0
- package/src/templates/movehat.config.ts +10 -0
- package/src/templates/package.json +1 -1
- package/src/templates/tests/Counter.test.ts +47 -50
- /package/dist/templates/move/{Counter.move → sources/Counter.move} +0 -0
- /package/src/templates/move/{Counter.move → sources/Counter.move} +0 -0
package/README.md
CHANGED
|
@@ -7,12 +7,26 @@
|
|
|
7
7
|
|
|
8
8
|
## Features
|
|
9
9
|
|
|
10
|
+
- **Auto-detection of Named Addresses** - Automatically detects and configures addresses from Move code (like Hardhat)
|
|
10
11
|
- **Quick Start** - Scaffold new Move projects in seconds
|
|
11
12
|
- **TypeScript Testing** - Write integration tests with familiar tools (Mocha, Chai)
|
|
12
13
|
- **Built-in Helpers** - Interact with contracts easily
|
|
13
14
|
- **Movement CLI Integration** - Seamless compilation and deployment
|
|
14
15
|
- **Hot Reload** - Test changes instantly with watch mode
|
|
15
16
|
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
Before installing Movehat, ensure you have:
|
|
20
|
+
|
|
21
|
+
- **Node.js v18+** - [Download](https://nodejs.org/)
|
|
22
|
+
- **Movement CLI** - **REQUIRED** for compiling Move contracts
|
|
23
|
+
|
|
24
|
+
Install from: [Movement CLI Installation Guide](https://docs.movementnetwork.xyz/devs/movementCLI)
|
|
25
|
+
|
|
26
|
+
Verify: `movement --version`
|
|
27
|
+
|
|
28
|
+
**⚠️ Without Movement CLI:** Compilation will fail with "movement: command not found"
|
|
29
|
+
|
|
16
30
|
## Installation
|
|
17
31
|
|
|
18
32
|
```bash
|
|
@@ -33,16 +47,15 @@ cd my-move-project
|
|
|
33
47
|
# Install dependencies
|
|
34
48
|
npm install
|
|
35
49
|
|
|
36
|
-
# Compile contracts
|
|
50
|
+
# Compile contracts (auto-detects named addresses)
|
|
37
51
|
npx movehat compile
|
|
38
52
|
|
|
39
|
-
# Deploy contracts
|
|
40
|
-
npx movehat deploy
|
|
41
|
-
|
|
42
53
|
# Run tests
|
|
43
54
|
npm test
|
|
44
55
|
```
|
|
45
56
|
|
|
57
|
+
**Note:** Movehat automatically detects named addresses from your Move files, so no manual configuration is needed for compilation!
|
|
58
|
+
|
|
46
59
|
## Project Structure
|
|
47
60
|
|
|
48
61
|
```
|
|
@@ -70,8 +83,11 @@ export default {
|
|
|
70
83
|
account: process.env.MH_ACCOUNT || "",
|
|
71
84
|
privateKey: process.env.MH_PRIVATE_KEY || "",
|
|
72
85
|
moveDir: "./move",
|
|
86
|
+
|
|
87
|
+
// Named addresses are auto-detected from your Move files
|
|
88
|
+
// Only specify if you need specific production addresses
|
|
73
89
|
namedAddresses: {
|
|
74
|
-
counter:
|
|
90
|
+
// Optional: counter: "0xYourProductionAddress",
|
|
75
91
|
},
|
|
76
92
|
};
|
|
77
93
|
```
|
|
@@ -86,41 +102,58 @@ MH_NETWORK=testnet
|
|
|
86
102
|
|
|
87
103
|
## Writing Tests
|
|
88
104
|
|
|
105
|
+
Movehat uses **Transaction Simulation** for testing - no real blockchain or gas costs required:
|
|
106
|
+
|
|
89
107
|
```typescript
|
|
90
108
|
import { describe, it, before } from "mocha";
|
|
91
109
|
import { expect } from "chai";
|
|
92
|
-
import {
|
|
93
|
-
import type { TestEnvironment, MoveContract } from "movehat/helpers";
|
|
110
|
+
import { getMovehat, type MovehatRuntime } from "movehat";
|
|
94
111
|
|
|
95
112
|
describe("Counter Contract", () => {
|
|
96
|
-
let
|
|
97
|
-
let
|
|
113
|
+
let mh: MovehatRuntime;
|
|
114
|
+
let contractAddress: string;
|
|
98
115
|
|
|
99
116
|
before(async function () {
|
|
100
117
|
this.timeout(30000);
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
);
|
|
118
|
+
|
|
119
|
+
// Initialize Movehat Runtime Environment
|
|
120
|
+
// Uses Movement testnet by default with auto-generated test accounts
|
|
121
|
+
mh = await getMovehat();
|
|
122
|
+
contractAddress = mh.account.accountAddress.toString();
|
|
107
123
|
});
|
|
108
124
|
|
|
109
|
-
it("should
|
|
125
|
+
it("should initialize counter using simulation", async function () {
|
|
110
126
|
this.timeout(30000);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
127
|
+
|
|
128
|
+
// Build transaction
|
|
129
|
+
const transaction = await mh.aptos.transaction.build.simple({
|
|
130
|
+
sender: mh.account.accountAddress,
|
|
131
|
+
data: {
|
|
132
|
+
function: `${contractAddress}::counter::init`,
|
|
133
|
+
functionArguments: []
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Simulate transaction (no gas cost, instant)
|
|
138
|
+
const [simulation] = await mh.aptos.transaction.simulate.simple({
|
|
139
|
+
signerPublicKey: mh.account.publicKey,
|
|
140
|
+
transaction
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// Verify simulation succeeded
|
|
144
|
+
expect(simulation.success).to.be.true;
|
|
145
|
+
console.log(`Gas used: ${simulation.gas_used}`);
|
|
120
146
|
});
|
|
121
147
|
});
|
|
122
148
|
```
|
|
123
149
|
|
|
150
|
+
**Benefits of Transaction Simulation:**
|
|
151
|
+
- No blockchain or fork server required
|
|
152
|
+
- Instant test execution
|
|
153
|
+
- No gas costs
|
|
154
|
+
- Perfect for TDD and CI/CD
|
|
155
|
+
- Uses Movement testnet with auto-generated accounts by default
|
|
156
|
+
|
|
124
157
|
## Writing Deployment Scripts
|
|
125
158
|
|
|
126
159
|
```typescript
|
|
@@ -213,10 +246,20 @@ npx movehat deploy # Deploy contracts
|
|
|
213
246
|
npx movehat test # Run tests
|
|
214
247
|
```
|
|
215
248
|
|
|
216
|
-
##
|
|
249
|
+
## System Requirements
|
|
217
250
|
|
|
251
|
+
**Required:**
|
|
218
252
|
- Node.js v18+
|
|
219
|
-
-
|
|
253
|
+
- Movement CLI - **REQUIRED** ([Installation Guide](https://docs.movementnetwork.xyz/devs/movementCLI))
|
|
254
|
+
- npm or pnpm
|
|
255
|
+
|
|
256
|
+
**What fails without Movement CLI:**
|
|
257
|
+
- `movehat compile` → "movement: command not found"
|
|
258
|
+
- Contract building and deployment will not work
|
|
259
|
+
|
|
260
|
+
**Recommended:**
|
|
261
|
+
- Git
|
|
262
|
+
- VS Code with Move syntax extension
|
|
220
263
|
|
|
221
264
|
## Documentation
|
|
222
265
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAsFA,wBAA8B,cAAc,kBAkF3C"}
|
package/dist/commands/compile.js
CHANGED
|
@@ -3,6 +3,61 @@ import path from "path";
|
|
|
3
3
|
import { exec } from "child_process";
|
|
4
4
|
import { loadUserConfig } from "../core/config.js";
|
|
5
5
|
import { validateAndEscapePath, escapeShellArg } from "../core/shell.js";
|
|
6
|
+
/**
|
|
7
|
+
* Recursively find all .move files in a directory
|
|
8
|
+
* @param dir - Directory to search
|
|
9
|
+
* @param maxDepth - Maximum recursion depth (default: 10)
|
|
10
|
+
* @param currentDepth - Current recursion depth (internal use)
|
|
11
|
+
*/
|
|
12
|
+
function findMoveFiles(dir, maxDepth = 10, currentDepth = 0) {
|
|
13
|
+
const files = [];
|
|
14
|
+
// Prevent infinite loops from excessive recursion
|
|
15
|
+
if (currentDepth > maxDepth) {
|
|
16
|
+
return files;
|
|
17
|
+
}
|
|
18
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
const fullPath = path.join(dir, entry.name);
|
|
21
|
+
if (entry.isDirectory()) {
|
|
22
|
+
// Skip symlinks to prevent directory traversal and infinite loops
|
|
23
|
+
if (entry.isSymbolicLink()) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
files.push(...findMoveFiles(fullPath, maxDepth, currentDepth + 1));
|
|
27
|
+
}
|
|
28
|
+
else if (entry.name.endsWith('.move')) {
|
|
29
|
+
files.push(fullPath);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return files;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extract named addresses used in Move files
|
|
36
|
+
* Looks for patterns like: module <address>::<module_name>
|
|
37
|
+
*/
|
|
38
|
+
function extractNamedAddresses(moveDir) {
|
|
39
|
+
const addresses = new Set();
|
|
40
|
+
const moveFiles = findMoveFiles(moveDir);
|
|
41
|
+
for (const file of moveFiles) {
|
|
42
|
+
let content = fs.readFileSync(file, 'utf-8');
|
|
43
|
+
// Strip comments to avoid false positives
|
|
44
|
+
// Remove block comments /* ... */ (non-greedy, handles newlines)
|
|
45
|
+
content = content.replace(/\/\*[\s\S]*?\*\//g, ' ');
|
|
46
|
+
// Remove line comments // ... to end of line
|
|
47
|
+
content = content.replace(/\/\/.*$/gm, ' ');
|
|
48
|
+
// Match: module <address>::<module_name>
|
|
49
|
+
const moduleRegex = /module\s+([a-zA-Z_][a-zA-Z0-9_]*)::/g;
|
|
50
|
+
let match;
|
|
51
|
+
while ((match = moduleRegex.exec(content)) !== null) {
|
|
52
|
+
const address = match[1];
|
|
53
|
+
// Skip standard addresses
|
|
54
|
+
if (address !== 'std' && address !== 'aptos_framework' && address !== 'aptos_std') {
|
|
55
|
+
addresses.add(address);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return addresses;
|
|
60
|
+
}
|
|
6
61
|
function run(command, cwd) {
|
|
7
62
|
return new Promise((resolve, reject) => {
|
|
8
63
|
exec(command, { cwd }, (error, stdout, stderr) => {
|
|
@@ -22,17 +77,27 @@ export default async function compileCommand() {
|
|
|
22
77
|
try {
|
|
23
78
|
// Compile is network-independent - only uses global config
|
|
24
79
|
const userConfig = await loadUserConfig();
|
|
25
|
-
console.log("
|
|
80
|
+
console.log("Compiling Move contracts...");
|
|
26
81
|
const moveDir = path.resolve(process.cwd(), userConfig.moveDir || "./move");
|
|
27
82
|
if (!fs.existsSync(moveDir)) {
|
|
28
|
-
console.error(
|
|
83
|
+
console.error(`Move directory not found: ${moveDir}`);
|
|
29
84
|
console.error(` Update movehat.config.ts -> moveDir`);
|
|
30
85
|
return;
|
|
31
86
|
}
|
|
32
87
|
// Validate and escape to prevent command injection
|
|
33
88
|
const safeMoveDir = validateAndEscapePath(moveDir, "Move directory");
|
|
34
|
-
//
|
|
35
|
-
const
|
|
89
|
+
// Auto-detect named addresses from Move files
|
|
90
|
+
const detectedAddresses = extractNamedAddresses(moveDir);
|
|
91
|
+
// Merge user-configured addresses with auto-detected ones
|
|
92
|
+
const namedAddresses = { ...(userConfig.namedAddresses ?? {}) };
|
|
93
|
+
const autoAssignedAddresses = [];
|
|
94
|
+
// For any detected address not in config, use a dev address
|
|
95
|
+
for (const addr of detectedAddresses) {
|
|
96
|
+
if (!namedAddresses[addr]) {
|
|
97
|
+
namedAddresses[addr] = "0xcafe"; // Dev address for compilation
|
|
98
|
+
autoAssignedAddresses.push(addr);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
36
101
|
let namedAddressesArg = "";
|
|
37
102
|
if (Object.keys(namedAddresses).length > 0) {
|
|
38
103
|
// Validate and escape each address name and value
|
|
@@ -56,15 +121,21 @@ export default async function compileCommand() {
|
|
|
56
121
|
}
|
|
57
122
|
const command = `movement move build --package-dir ${safeMoveDir} ${namedAddressesArg}`.trim();
|
|
58
123
|
console.log(` Move directory: ${moveDir}`);
|
|
59
|
-
if (
|
|
60
|
-
console.log(`
|
|
124
|
+
if (detectedAddresses.size > 0) {
|
|
125
|
+
console.log(` Detected addresses: ${Array.from(detectedAddresses).join(", ")}`);
|
|
126
|
+
}
|
|
127
|
+
if (Object.keys(userConfig.namedAddresses ?? {}).length > 0) {
|
|
128
|
+
console.log(` Configured addresses: ${Object.keys(userConfig.namedAddresses).join(", ")}`);
|
|
129
|
+
}
|
|
130
|
+
if (autoAssignedAddresses.length > 0) {
|
|
131
|
+
console.log(` Auto-assigned dev address (0xcafe): ${autoAssignedAddresses.join(", ")}`);
|
|
61
132
|
}
|
|
62
133
|
console.log();
|
|
63
134
|
await run(command, moveDir);
|
|
64
|
-
console.log("
|
|
135
|
+
console.log("Compilation finished successfully.");
|
|
65
136
|
}
|
|
66
137
|
catch (err) {
|
|
67
|
-
console.error("
|
|
138
|
+
console.error("Compilation failed:", err.message ?? err);
|
|
68
139
|
process.exit(1);
|
|
69
140
|
}
|
|
70
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzE,SAAS,GAAG,CAAC,OAAe,EAAE,GAAW;IACvC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC/C,IAAI,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,cAAc;IAC1C,IAAI,CAAC;QACH,2DAA2D;QAC3D,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -18,7 +18,7 @@ export default async function initCommand(projectName) {
|
|
|
18
18
|
});
|
|
19
19
|
// If the user cancels (Ctrl+C), exit
|
|
20
20
|
if (!response.projectName) {
|
|
21
|
-
console.log('\
|
|
21
|
+
console.log('\nProject initialization cancelled.');
|
|
22
22
|
process.exit(0);
|
|
23
23
|
}
|
|
24
24
|
projectName = response.projectName;
|
|
@@ -29,7 +29,7 @@ export default async function initCommand(projectName) {
|
|
|
29
29
|
try {
|
|
30
30
|
await fs.mkdir(projectPath, { recursive: true });
|
|
31
31
|
const templatesDir = path.join(__dirname, "..", "templates");
|
|
32
|
-
console.log("
|
|
32
|
+
console.log("Creating project structure...");
|
|
33
33
|
await copyFile(path.join(templatesDir, "package.json"), path.join(projectPath, "package.json"), { projectName: projectName });
|
|
34
34
|
await copyFile(path.join(templatesDir, "tsconfig.json"), path.join(projectPath, "tsconfig.json"));
|
|
35
35
|
await copyFile(path.join(templatesDir, ".mocharc.json"), path.join(projectPath, ".mocharc.json"));
|
|
@@ -38,16 +38,16 @@ export default async function initCommand(projectName) {
|
|
|
38
38
|
await copyFile(path.join(templatesDir, "gitignore"), path.join(projectPath, ".gitignore"));
|
|
39
39
|
await copyFile(path.join(templatesDir, "README.md"), path.join(projectPath, "README.md"), { projectName: projectName });
|
|
40
40
|
// 3. Copiar carpeta move/
|
|
41
|
-
console.log("
|
|
41
|
+
console.log("Setting up Move project...");
|
|
42
42
|
await copyDir(path.join(templatesDir, "move"), path.join(projectPath, "move"), { projectName: projectName });
|
|
43
43
|
// 4. Copiar scripts/
|
|
44
|
-
console.log("
|
|
44
|
+
console.log("Adding deployment scripts...");
|
|
45
45
|
await copyDir(path.join(templatesDir, "scripts"), path.join(projectPath, "scripts"));
|
|
46
46
|
// 5. Copiar tests/
|
|
47
|
-
console.log("
|
|
47
|
+
console.log("Adding test files...");
|
|
48
48
|
await copyDir(path.join(templatesDir, "tests"), path.join(projectPath, "tests"));
|
|
49
|
-
console.log("\
|
|
50
|
-
console.log("
|
|
49
|
+
console.log("\nProject created successfully!\n");
|
|
50
|
+
console.log("Next steps:\n");
|
|
51
51
|
console.log(` cd ${projectName}`);
|
|
52
52
|
console.log(` cp .env.example .env`);
|
|
53
53
|
console.log(` # Edit .env with your credentials`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CAAC,WAAoB;IAC5D,mCAAmC;IACnC,kBAAkB,EAAE,CAAC;IAErB,uBAAuB;IACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/test.js
CHANGED
|
@@ -4,15 +4,15 @@ import { existsSync } from "fs";
|
|
|
4
4
|
export default async function testCommand() {
|
|
5
5
|
const testDir = join(process.cwd(), "tests");
|
|
6
6
|
if (!existsSync(testDir)) {
|
|
7
|
-
console.error("
|
|
7
|
+
console.error("No tests directory found.");
|
|
8
8
|
console.error(" Create a 'tests' directory with your TypeScript test files.");
|
|
9
9
|
process.exit(1);
|
|
10
10
|
}
|
|
11
|
-
console.log("
|
|
11
|
+
console.log("Running TypeScript tests with Mocha...\n");
|
|
12
12
|
// Find mocha from project's node_modules
|
|
13
13
|
const mochaPath = join(process.cwd(), "node_modules", ".bin", "mocha");
|
|
14
14
|
if (!existsSync(mochaPath)) {
|
|
15
|
-
console.error("
|
|
15
|
+
console.error("Mocha not found in project dependencies.");
|
|
16
16
|
console.error(" Install it with: npm install --save-dev mocha");
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
@@ -28,7 +28,7 @@ export default async function testCommand() {
|
|
|
28
28
|
process.exit(code || 0);
|
|
29
29
|
});
|
|
30
30
|
child.on("error", (error) => {
|
|
31
|
-
console.error(
|
|
31
|
+
console.error(`Failed to run tests: ${error.message}`);
|
|
32
32
|
process.exit(1);
|
|
33
33
|
});
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,yCAAyC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oCAAoC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE;QACjC,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,yBAAyB;SAC1B;KACF,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;;;GAMG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAyDjE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;;;GAMG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAyDjE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAoHxB"}
|
package/dist/core/config.js
CHANGED
|
@@ -62,16 +62,34 @@ export async function loadUserConfig() {
|
|
|
62
62
|
*/
|
|
63
63
|
export async function resolveNetworkConfig(userConfig, networkName) {
|
|
64
64
|
// Determine which network to use
|
|
65
|
+
// Default to "testnet" for testing with simulation
|
|
65
66
|
const selectedNetwork = networkName ||
|
|
66
67
|
process.env.MH_CLI_NETWORK ||
|
|
67
68
|
process.env.MH_DEFAULT_NETWORK ||
|
|
68
69
|
userConfig.defaultNetwork ||
|
|
69
70
|
"testnet";
|
|
70
71
|
// Check if network exists in config
|
|
71
|
-
|
|
72
|
+
let networkConfig = userConfig.networks[selectedNetwork];
|
|
73
|
+
// Special case: Auto-generate config for testnet (public test network)
|
|
74
|
+
// This provides a better dev experience - no local setup required
|
|
75
|
+
if (!networkConfig && selectedNetwork === "testnet") {
|
|
76
|
+
networkConfig = {
|
|
77
|
+
url: "https://testnet.movementnetwork.xyz/v1",
|
|
78
|
+
chainId: "testnet",
|
|
79
|
+
};
|
|
80
|
+
console.log(`testnet not found in config - using default Movement testnet configuration`);
|
|
81
|
+
}
|
|
82
|
+
// Special case: Auto-generate config for local fork server
|
|
83
|
+
if (!networkConfig && selectedNetwork === "local") {
|
|
84
|
+
networkConfig = {
|
|
85
|
+
url: "http://localhost:8080/v1",
|
|
86
|
+
chainId: "local",
|
|
87
|
+
};
|
|
88
|
+
console.log(`Local network not found in config - using default fork server configuration`);
|
|
89
|
+
}
|
|
72
90
|
if (!networkConfig) {
|
|
73
91
|
const availableNetworks = Object.keys(userConfig.networks).join(", ");
|
|
74
|
-
throw new Error(`Network '${selectedNetwork}' not found in configuration.\nAvailable networks: ${availableNetworks}`);
|
|
92
|
+
throw new Error(`Network '${selectedNetwork}' not found in configuration.\nAvailable networks: ${availableNetworks}, testnet (auto-generated), local (auto-generated)`);
|
|
75
93
|
}
|
|
76
94
|
// Get accounts using Hardhat-style resolution:
|
|
77
95
|
// 1. Network-specific accounts (if defined)
|
|
@@ -91,13 +109,37 @@ export async function resolveNetworkConfig(userConfig, networkName) {
|
|
|
91
109
|
if (accounts.length === 0 && process.env.PRIVATE_KEY) {
|
|
92
110
|
accounts = [process.env.PRIVATE_KEY];
|
|
93
111
|
}
|
|
94
|
-
// 4. Validate we have at least one account
|
|
112
|
+
// 4. Validate we have at least one account (unless using testnet/local)
|
|
95
113
|
if (accounts.length === 0 || !accounts[0]) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
114
|
+
// Special case: Auto-generate test accounts for testing networks
|
|
115
|
+
// testnet = public Movement test network (recommended)
|
|
116
|
+
// local = local fork server
|
|
117
|
+
if (selectedNetwork === "testnet" || selectedNetwork === "local") {
|
|
118
|
+
// Security: Using a deterministic test account (like Hardhat's default accounts)
|
|
119
|
+
// This is SAFE because:
|
|
120
|
+
// 1. Only used for testnet/local (never mainnet - that throws error below)
|
|
121
|
+
// 2. Perfect for transaction simulation (no real funds)
|
|
122
|
+
// 3. Deterministic = consistent test results
|
|
123
|
+
const testPrivateKey = "0x0000000000000000000000000000000000000000000000000000000000000001";
|
|
124
|
+
accounts = [testPrivateKey];
|
|
125
|
+
console.log(`\n[TESTNET] Using auto-generated test account (safe for testing only)`);
|
|
126
|
+
console.log(`[TESTNET] For mainnet, set PRIVATE_KEY in .env\n`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// For any other network (especially mainnet), REQUIRE explicit configuration
|
|
130
|
+
// This prevents accidentally using the test key on production networks
|
|
131
|
+
throw new Error(`Network '${selectedNetwork}' has no accounts configured.\n` +
|
|
132
|
+
`\n` +
|
|
133
|
+
`SECURITY: This network requires explicit account configuration.\n` +
|
|
134
|
+
`\n` +
|
|
135
|
+
`Options:\n` +
|
|
136
|
+
` 1. Set PRIVATE_KEY in your .env file (recommended for ${selectedNetwork})\n` +
|
|
137
|
+
` 2. Add 'accounts: ["0x..."]' globally in movehat.config.ts\n` +
|
|
138
|
+
` 3. Add 'accounts: ["0x..."]' to the '${selectedNetwork}' network config\n` +
|
|
139
|
+
`\n` +
|
|
140
|
+
`For testing without configuration, use:\n` +
|
|
141
|
+
` movehat <command> --network testnet (auto-generates safe test accounts)`);
|
|
142
|
+
}
|
|
101
143
|
}
|
|
102
144
|
// Merge named addresses (network-specific overrides global)
|
|
103
145
|
const mergedNamedAddresses = {
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,gDAAgD;IAChD,MAAM,aAAa,GAAG;QACpB,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC;QAC9B,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC;KAC/B,CAAC;IAEF,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,IAAI,YAAY,CAAC;QAEjB,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,2DAA2D;YAC3D,oCAAoC;YACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,QAAQ,EAAE,CAAC;YAE9B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;gBACjD,YAAY,GAAG,MAAM,MAAM,CAAC,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;oBAAS,CAAC;gBACT,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YACjD,YAAY,GAAG,MAAM,MAAM,CAAC,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,OAA4B,CAAC;QAE7D,qCAAqC;QACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,MAAM,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAA6B,EAC7B,WAAoB;IAEpB,iCAAiC;IACjC,MAAM,eAAe,GACnB,WAAW;QACX,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,UAAU,CAAC,cAAc;QACzB,SAAS,CAAC;IAEZ,oCAAoC;IACpC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/templates/README.md
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
# {{
|
|
1
|
+
# {{projectName}}
|
|
2
2
|
|
|
3
3
|
A Move smart contract project built with Movehat.
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- [
|
|
7
|
+
**Required:**
|
|
8
|
+
- **Node.js v18+** - [Download](https://nodejs.org/)
|
|
9
|
+
- **Movement CLI** - **REQUIRED** for compiling contracts
|
|
10
|
+
|
|
11
|
+
Install: [Movement CLI Installation Guide](https://docs.movementnetwork.xyz/devs/movementCLI)
|
|
12
|
+
|
|
13
|
+
Verify: `movement --version`
|
|
14
|
+
|
|
15
|
+
**⚠️ Important:** Without Movement CLI, compilation will fail!
|
|
9
16
|
|
|
10
17
|
## Getting Started
|
|
11
18
|
|
|
@@ -25,41 +32,36 @@ cp .env.example .env
|
|
|
25
32
|
|
|
26
33
|
Edit `.env`:
|
|
27
34
|
```
|
|
28
|
-
|
|
29
|
-
MH_ACCOUNT=your_account_address_here
|
|
30
|
-
MH_NETWORK=testnet
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### 3. Update Move.toml
|
|
34
|
-
|
|
35
|
-
Edit `move/Move.toml` and set the `counter` address to your account address:
|
|
36
|
-
|
|
37
|
-
```toml
|
|
38
|
-
[addresses]
|
|
39
|
-
counter = "0xYOUR_ACCOUNT_ADDRESS"
|
|
35
|
+
PRIVATE_KEY=your_private_key_here
|
|
40
36
|
```
|
|
41
37
|
|
|
42
|
-
###
|
|
38
|
+
### 3. Compile contracts
|
|
43
39
|
|
|
44
40
|
```bash
|
|
45
41
|
npm run compile
|
|
46
42
|
```
|
|
47
43
|
|
|
48
|
-
|
|
44
|
+
**How it works:**
|
|
45
|
+
- Movehat automatically detects named addresses from your Move files
|
|
46
|
+
- No need to manually configure addresses in `Move.toml`
|
|
47
|
+
- Just add any new `.move` file and it will compile automatically (like Hardhat!)
|
|
49
48
|
|
|
50
|
-
|
|
51
|
-
npx tsx scripts/deploy-counter.ts
|
|
52
|
-
```
|
|
49
|
+
### 4. Run tests
|
|
53
50
|
|
|
54
|
-
Or use the Movement CLI directly:
|
|
55
51
|
```bash
|
|
56
|
-
|
|
52
|
+
npm test
|
|
57
53
|
```
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
**How it works:**
|
|
56
|
+
- Tests use **Transaction Simulation** - no real blockchain required
|
|
57
|
+
- Runs instantly without gas costs
|
|
58
|
+
- Uses Movement testnet by default with auto-generated test accounts
|
|
59
|
+
- Perfect for TDD and CI/CD workflows
|
|
60
|
+
|
|
61
|
+
### 5. Deploy (optional)
|
|
60
62
|
|
|
61
63
|
```bash
|
|
62
|
-
|
|
64
|
+
npx movehat run scripts/deploy-counter.ts
|
|
63
65
|
```
|
|
64
66
|
|
|
65
67
|
## Project Structure
|
|
@@ -80,10 +82,37 @@ npm test
|
|
|
80
82
|
|
|
81
83
|
## Available Commands
|
|
82
84
|
|
|
83
|
-
- `npm run compile` - Compile Move contracts
|
|
85
|
+
- `npm run compile` - Compile Move contracts (auto-detects addresses)
|
|
84
86
|
- `npm test` - Run integration tests
|
|
85
87
|
- `npm run test:watch` - Run tests in watch mode
|
|
86
|
-
- `npx
|
|
88
|
+
- `npx movehat run scripts/deploy-counter.ts` - Deploy and initialize counter
|
|
89
|
+
|
|
90
|
+
## How Named Addresses Work
|
|
91
|
+
|
|
92
|
+
Movehat automatically detects named addresses from your Move code:
|
|
93
|
+
|
|
94
|
+
```move
|
|
95
|
+
module counter::counter { // ← "counter" is auto-detected
|
|
96
|
+
// ...
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- **For development:** Movehat uses temp addresses (`0xcafe`) automatically
|
|
101
|
+
- **For production:** Specify real addresses in `movehat.config.ts`
|
|
102
|
+
|
|
103
|
+
**Adding new contracts:**
|
|
104
|
+
1. Create `move/sources/MyContract.move`
|
|
105
|
+
2. Write: `module mycontract::mycontract { ... }`
|
|
106
|
+
3. Run `npm run compile`
|
|
107
|
+
4. It just works! (like Hardhat)
|
|
108
|
+
|
|
109
|
+
## Troubleshooting
|
|
110
|
+
|
|
111
|
+
| Error | Solution |
|
|
112
|
+
|-------|----------|
|
|
113
|
+
| `movement: command not found` | Install Movement CLI (see Prerequisites) |
|
|
114
|
+
| `Cannot find package 'dotenv'` | Run `npm install` |
|
|
115
|
+
| Compilation failed | Ensure Movement CLI is installed: `movement --version` |
|
|
87
116
|
|
|
88
117
|
## Learn More
|
|
89
118
|
|