movehat 0.2.1 → 0.2.3
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/dist/__tests__/deployContract.test.js +56 -47
- package/dist/__tests__/deployContract.test.js.map +1 -1
- package/dist/__tests__/exports.test.d.ts +2 -0
- package/dist/__tests__/exports.test.d.ts.map +1 -0
- package/dist/__tests__/exports.test.js +30 -0
- package/dist/__tests__/exports.test.js.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +4 -3
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -1
- package/dist/__tests__/fixtures/sigint-deploy-harness.js +8 -7
- package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -1
- package/dist/__tests__/fork/api.test.js +5 -0
- package/dist/__tests__/fork/api.test.js.map +1 -1
- package/dist/__tests__/fork/api.timeout.test.d.ts +2 -0
- package/dist/__tests__/fork/api.timeout.test.d.ts.map +1 -0
- package/dist/__tests__/fork/api.timeout.test.js +98 -0
- package/dist/__tests__/fork/api.timeout.test.js.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/compile.toml-mutation.test.d.ts +2 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.d.ts.map +1 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.js +69 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.js.map +1 -0
- package/dist/commands/__tests__/init.test.js +73 -11
- package/dist/commands/__tests__/init.test.js.map +1 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +19 -10
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/init.d.ts +22 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +55 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/test.js +12 -19
- package/dist/commands/test.js.map +1 -1
- package/dist/core/AccountManager.d.ts.map +1 -1
- package/dist/core/AccountManager.js +14 -2
- package/dist/core/AccountManager.js.map +1 -1
- package/dist/core/Publisher.d.ts.map +1 -1
- package/dist/core/Publisher.js +72 -82
- package/dist/core/Publisher.js.map +1 -1
- package/dist/core/__tests__/AccountManager.global-state.test.d.ts +2 -0
- package/dist/core/__tests__/AccountManager.global-state.test.d.ts.map +1 -0
- package/dist/core/__tests__/AccountManager.global-state.test.js +69 -0
- package/dist/core/__tests__/AccountManager.global-state.test.js.map +1 -0
- package/dist/core/__tests__/movementProfile.test.d.ts +2 -0
- package/dist/core/__tests__/movementProfile.test.d.ts.map +1 -0
- package/dist/core/__tests__/movementProfile.test.js +112 -0
- package/dist/core/__tests__/movementProfile.test.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +14 -10
- package/dist/core/config.js.map +1 -1
- package/dist/core/deployments.d.ts.map +1 -1
- package/dist/core/deployments.js +4 -2
- package/dist/core/deployments.js.map +1 -1
- package/dist/core/movementProfile.d.ts +55 -22
- package/dist/core/movementProfile.d.ts.map +1 -1
- package/dist/core/movementProfile.js +77 -99
- package/dist/core/movementProfile.js.map +1 -1
- package/dist/fork/__tests__/server.cors.test.d.ts +2 -0
- package/dist/fork/__tests__/server.cors.test.d.ts.map +1 -0
- package/dist/fork/__tests__/server.cors.test.js +79 -0
- package/dist/fork/__tests__/server.cors.test.js.map +1 -0
- package/dist/fork/api.d.ts +9 -1
- package/dist/fork/api.d.ts.map +1 -1
- package/dist/fork/api.js +37 -7
- package/dist/fork/api.js.map +1 -1
- package/dist/fork/manager.js +10 -10
- package/dist/fork/manager.js.map +1 -1
- package/dist/fork/server.d.ts +20 -1
- package/dist/fork/server.d.ts.map +1 -1
- package/dist/fork/server.js +40 -24
- package/dist/fork/server.js.map +1 -1
- package/dist/fork/test.d.ts.map +1 -1
- package/dist/fork/test.js +3 -2
- package/dist/fork/test.js.map +1 -1
- package/dist/harness/Harness.d.ts +6 -2
- package/dist/harness/Harness.d.ts.map +1 -1
- package/dist/harness/Harness.js +8 -2
- package/dist/harness/Harness.js.map +1 -1
- package/dist/harness/codeObject.d.ts.map +1 -1
- package/dist/harness/codeObject.js +41 -41
- package/dist/harness/codeObject.js.map +1 -1
- package/dist/harness/script.d.ts +3 -3
- package/dist/harness/script.d.ts.map +1 -1
- package/dist/harness/script.js +42 -35
- package/dist/harness/script.js.map +1 -1
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.d.ts +2 -0
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.d.ts.map +1 -0
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.js +172 -0
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.js.map +1 -0
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
- package/dist/helpers/setupLocalTesting.js +31 -5
- package/dist/helpers/setupLocalTesting.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.d.ts +8 -0
- package/dist/node/LocalNodeManager.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.js +70 -23
- package/dist/node/LocalNodeManager.js.map +1 -1
- package/dist/node/__tests__/LocalNodeManager.api-port.test.d.ts +2 -0
- package/dist/node/__tests__/LocalNodeManager.api-port.test.d.ts.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.api-port.test.js +55 -0
- package/dist/node/__tests__/LocalNodeManager.api-port.test.js.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.test.js +114 -14
- package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -1
- package/dist/templates/move/Move.toml +1 -1
- package/dist/templates/move/sources/Counter.move +31 -4
- package/dist/templates/scripts/deploy-counter.ts +10 -0
- package/dist/types/config.d.ts +8 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/ui/__tests__/logger.test.d.ts +2 -0
- package/dist/ui/__tests__/logger.test.d.ts.map +1 -0
- package/dist/ui/__tests__/logger.test.js +75 -0
- package/dist/ui/__tests__/logger.test.js.map +1 -0
- package/dist/ui/formatters.d.ts +0 -16
- package/dist/ui/formatters.d.ts.map +1 -1
- package/dist/ui/formatters.js +1 -1
- package/dist/ui/formatters.js.map +1 -1
- package/dist/ui/logger.d.ts +41 -0
- package/dist/ui/logger.d.ts.map +1 -1
- package/dist/ui/logger.js +49 -0
- package/dist/ui/logger.js.map +1 -1
- package/dist/ui/spinner.d.ts +25 -0
- package/dist/ui/spinner.d.ts.map +1 -1
- package/dist/ui/spinner.js +44 -0
- package/dist/ui/spinner.js.map +1 -1
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.d.ts +2 -0
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.d.ts.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.js +43 -0
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.js.map +1 -0
- package/dist/utils/childProcessAdapter.d.ts +7 -0
- package/dist/utils/childProcessAdapter.d.ts.map +1 -1
- package/dist/utils/childProcessAdapter.js +20 -2
- package/dist/utils/childProcessAdapter.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/deployContract.test.ts +59 -50
- package/src/__tests__/exports.test.ts +32 -0
- package/src/__tests__/fixtures/sigint-deploy-harness.ts +8 -7
- package/src/__tests__/fork/api.test.ts +5 -0
- package/src/__tests__/fork/api.timeout.test.ts +150 -0
- package/src/cli.ts +4 -0
- package/src/commands/__tests__/compile.toml-mutation.test.ts +77 -0
- package/src/commands/__tests__/init.test.ts +96 -11
- package/src/commands/compile.ts +24 -15
- package/src/commands/init.ts +77 -6
- package/src/commands/test.ts +12 -19
- package/src/core/AccountManager.ts +18 -1
- package/src/core/Publisher.ts +103 -107
- package/src/core/__tests__/AccountManager.global-state.test.ts +83 -0
- package/src/core/__tests__/movementProfile.test.ts +131 -0
- package/src/core/config.ts +18 -11
- package/src/core/deployments.ts +5 -4
- package/src/core/movementProfile.ts +75 -127
- package/src/fork/__tests__/server.cors.test.ts +101 -0
- package/src/fork/api.ts +69 -10
- package/src/fork/manager.ts +10 -10
- package/src/fork/server.ts +59 -24
- package/src/fork/test.ts +3 -2
- package/src/harness/Harness.ts +11 -2
- package/src/harness/codeObject.ts +45 -48
- package/src/harness/script.ts +47 -43
- package/src/helpers/__tests__/setupLocalTesting.fork-network.test.ts +212 -0
- package/src/helpers/setupLocalTesting.ts +39 -5
- package/src/index.ts +9 -1
- package/src/node/LocalNodeManager.ts +87 -26
- package/src/node/__tests__/LocalNodeManager.api-port.test.ts +62 -0
- package/src/node/__tests__/LocalNodeManager.test.ts +144 -17
- package/src/templates/move/Move.toml +1 -1
- package/src/templates/move/sources/Counter.move +31 -4
- package/src/templates/scripts/deploy-counter.ts +10 -0
- package/src/types/config.ts +8 -1
- package/src/ui/__tests__/logger.test.ts +89 -0
- package/src/ui/formatters.ts +1 -1
- package/src/ui/logger.ts +62 -0
- package/src/ui/spinner.ts +47 -0
- package/src/utils/__tests__/childProcessAdapter.maxBuffer.test.ts +51 -0
- package/src/utils/childProcessAdapter.ts +32 -2
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { randomUUID } from "crypto";
|
|
1
|
+
import { PrivateKey, PrivateKeyVariants } from "@aptos-labs/ts-sdk";
|
|
4
2
|
import { extractNamedAddresses } from "../commands/compile.js";
|
|
5
3
|
import { saveDeployment, loadDeployment, validateSafeName, } from "../core/deployments.js";
|
|
6
|
-
import { validatePathSafety
|
|
4
|
+
import { validatePathSafety } from "../core/shell.js";
|
|
7
5
|
import { CliExecutionError, ModuleAlreadyDeployedError, PostPublishError, } from "../errors.js";
|
|
8
6
|
import { runCli } from "../utils/runCli.js";
|
|
9
7
|
import { parseTxHash } from "../utils/parseCliOutput.js";
|
|
10
|
-
import { logger } from "../ui/index.js";
|
|
11
|
-
import {
|
|
8
|
+
import { logger, isVerbose } from "../ui/index.js";
|
|
9
|
+
import { writeTempKeyFile, removeKeyFile, removeKeyFileSyncBestEffort, ensureSignalHandler, cleanupCallbacks, } from "../core/movementProfile.js";
|
|
12
10
|
/**
|
|
13
11
|
* Deploy a Move package as a code object via `movement move deploy-object`.
|
|
14
12
|
*
|
|
@@ -97,9 +95,7 @@ async function executeMovementMoveObject(opts) {
|
|
|
97
95
|
}
|
|
98
96
|
}
|
|
99
97
|
const dir = opts.packageDir || config.moveDir;
|
|
100
|
-
const profile = `movehat-deploy-${randomUUID().slice(0, 8)}`;
|
|
101
98
|
const safeDir = validatePathSafety(dir, "package directory");
|
|
102
|
-
const safeProfile = validateProfileSafety(profile);
|
|
103
99
|
logger.step(`${subcommand === "deploy-object" ? "Deploying" : "Upgrading"} module "${moduleName}" from ${dir}...`);
|
|
104
100
|
try {
|
|
105
101
|
const deployerAddress = account.accountAddress.toString();
|
|
@@ -130,26 +126,24 @@ async function executeMovementMoveObject(opts) {
|
|
|
130
126
|
args: ["move", "build", "--package-dir", safeDir, ...namedAddrArgs],
|
|
131
127
|
timeoutMs: 120000,
|
|
132
128
|
}, { adapter: opts.adapter });
|
|
133
|
-
if (buildResult.stdout)
|
|
134
|
-
|
|
135
|
-
//
|
|
136
|
-
// raw
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
//
|
|
143
|
-
|
|
129
|
+
if (isVerbose() && buildResult.stdout)
|
|
130
|
+
logger.info(buildResult.stdout.trim(), 2);
|
|
131
|
+
// Format the private key into AIP-80 shape so the Movement CLI
|
|
132
|
+
// doesn't emit its raw-hex deprecation warning. `formatPrivateKey`
|
|
133
|
+
// is idempotent for already-prefixed inputs.
|
|
134
|
+
const formattedPrivateKey = PrivateKey.formatPrivateKey(config.privateKey, PrivateKeyVariants.Ed25519);
|
|
135
|
+
// Pass the private key via a 0o600 temp file (--private-key-file)
|
|
136
|
+
// and the on-chain address via --sender-account. This avoids the
|
|
137
|
+
// CLI's profile-yaml lookup entirely — no CWD / HOME / .aptos /
|
|
138
|
+
// .movement dance, no CLI-variant dependency.
|
|
139
|
+
const keyFilePath = writeTempKeyFile(formattedPrivateKey);
|
|
140
|
+
// Register SIGINT-safe sync cleanup BEFORE invoking the CLI so
|
|
141
|
+
// the private key never persists on disk after an abnormal exit.
|
|
142
|
+
// The signal-handler path uses the best-effort variant because the
|
|
143
|
+
// event loop is dead and we cannot logger.warning.
|
|
144
144
|
ensureSignalHandler();
|
|
145
|
-
const syncCleanup = () =>
|
|
145
|
+
const syncCleanup = () => removeKeyFileSyncBestEffort(keyFilePath);
|
|
146
146
|
cleanupCallbacks.add(syncCleanup);
|
|
147
|
-
await withYamlLock(() => addProfile(movementConfigPath, profile, {
|
|
148
|
-
private_key: cleanPrivateKey,
|
|
149
|
-
public_key: account.publicKey.toString(),
|
|
150
|
-
account: deployerAddress,
|
|
151
|
-
rest_url: config.rpc,
|
|
152
|
-
}));
|
|
153
147
|
let deployOut = "";
|
|
154
148
|
try {
|
|
155
149
|
logger.step(`Running 'movement move ${subcommand}'${subcommand === "upgrade-object" ? "" : " (this may take a moment)"}...`);
|
|
@@ -167,8 +161,10 @@ async function executeMovementMoveObject(opts) {
|
|
|
167
161
|
safeDir,
|
|
168
162
|
"--url",
|
|
169
163
|
config.rpc,
|
|
170
|
-
"--
|
|
171
|
-
|
|
164
|
+
"--private-key-file",
|
|
165
|
+
keyFilePath,
|
|
166
|
+
"--sender-account",
|
|
167
|
+
deployerAddress,
|
|
172
168
|
"--assume-yes",
|
|
173
169
|
...includedArtifacts,
|
|
174
170
|
...namedAddrArgs,
|
|
@@ -177,20 +173,24 @@ async function executeMovementMoveObject(opts) {
|
|
|
177
173
|
timeoutMs: 180000, // 3 min — deploy-object can be slow with chunked publishing.
|
|
178
174
|
}, { adapter: opts.adapter });
|
|
179
175
|
deployOut = result.stdout;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
176
|
+
// Both streams gated behind isVerbose(); see §9 — stream channel
|
|
177
|
+
// is not by itself a failure signal. Real failures throw via
|
|
178
|
+
// CliExecutionError and are surfaced from the catch below.
|
|
179
|
+
if (isVerbose() && result.stdout)
|
|
180
|
+
logger.info(result.stdout.trim(), 2);
|
|
181
|
+
if (isVerbose() && result.stderr)
|
|
182
|
+
logger.info(result.stderr.trim(), 2);
|
|
184
183
|
}
|
|
185
184
|
finally {
|
|
186
|
-
//
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
185
|
+
// Unlink via the observable helper — emit a warning if the file
|
|
186
|
+
// could not be removed AND still exists on disk (private key
|
|
187
|
+
// would persist silently otherwise). ENOENT and races are
|
|
188
|
+
// treated as benign success.
|
|
189
|
+
const cleanupErr = removeKeyFile(keyFilePath);
|
|
190
|
+
if (cleanupErr) {
|
|
191
|
+
logger.warning(`Failed to remove temp key file '${keyFilePath}': ${cleanupErr.message}. ` +
|
|
192
|
+
`The file has mode 0o600 but should be removed manually: rm ${keyFilePath}`);
|
|
193
|
+
}
|
|
194
194
|
cleanupCallbacks.delete(syncCleanup);
|
|
195
195
|
}
|
|
196
196
|
// Parse object address (for deploy-object) and txHash (both flows).
|
|
@@ -232,7 +232,7 @@ async function executeMovementMoveObject(opts) {
|
|
|
232
232
|
}
|
|
233
233
|
if (error instanceof CliExecutionError) {
|
|
234
234
|
if (error.stdoutPreview)
|
|
235
|
-
|
|
235
|
+
logger.info(error.stdoutPreview, 2);
|
|
236
236
|
logger.error(`Failed to ${subcommand === "deploy-object" ? "deploy" : "upgrade"} module: ${error.message}\n${error.stderr}`);
|
|
237
237
|
}
|
|
238
238
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeObject.js","sourceRoot":"","sources":["../../src/harness/codeObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"codeObject.js","sourceRoot":"","sources":["../../src/harness/codeObject.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/script.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ import type { RunMoveScriptOptions, MoveScriptResult } from "../types/harness.js
|
|
|
8
8
|
* - `.mv` compiled bytecode → `--compiled-script-path`
|
|
9
9
|
*
|
|
10
10
|
* Reuses Publisher's security model via the shared `movementProfile`
|
|
11
|
-
* helpers: per-
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* helpers: per-invocation temp key file (0o600), SIGINT-safe sync
|
|
12
|
+
* cleanup, `--private-key-file` auth (key never appears in `ps`
|
|
13
|
+
* output or in the user's `~/.aptos/config.yaml`).
|
|
14
14
|
*
|
|
15
15
|
* Returns {@link MoveScriptResult}. `txHash` is guaranteed; `success`
|
|
16
16
|
* and `vmStatus` are best-effort parsed from the CLI's Result JSON.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/harness/script.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/harness/script.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAc7B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA2I3B"}
|
package/dist/harness/script.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { existsSync } from "fs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { validatePathSafety, validateProfileSafety } from "../core/shell.js";
|
|
2
|
+
import { extname } from "path";
|
|
3
|
+
import { PrivateKey, PrivateKeyVariants } from "@aptos-labs/ts-sdk";
|
|
4
|
+
import { validatePathSafety } from "../core/shell.js";
|
|
6
5
|
import { CliExecutionError } from "../errors.js";
|
|
7
6
|
import { runCli } from "../utils/runCli.js";
|
|
8
7
|
import { parseTxHash } from "../utils/parseCliOutput.js";
|
|
9
|
-
import { logger } from "../ui/index.js";
|
|
10
|
-
import {
|
|
8
|
+
import { logger, isVerbose } from "../ui/index.js";
|
|
9
|
+
import { writeTempKeyFile, removeKeyFile, removeKeyFileSyncBestEffort, ensureSignalHandler, cleanupCallbacks, } from "../core/movementProfile.js";
|
|
11
10
|
/**
|
|
12
11
|
* Execute a Move script via `movement move run-script`.
|
|
13
12
|
*
|
|
@@ -16,9 +15,9 @@ import { withYamlLock, addProfile, removeProfile, removeProfileSync, ensureSigna
|
|
|
16
15
|
* - `.mv` compiled bytecode → `--compiled-script-path`
|
|
17
16
|
*
|
|
18
17
|
* Reuses Publisher's security model via the shared `movementProfile`
|
|
19
|
-
* helpers: per-
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* helpers: per-invocation temp key file (0o600), SIGINT-safe sync
|
|
19
|
+
* cleanup, `--private-key-file` auth (key never appears in `ps`
|
|
20
|
+
* output or in the user's `~/.aptos/config.yaml`).
|
|
22
21
|
*
|
|
23
22
|
* Returns {@link MoveScriptResult}. `txHash` is guaranteed; `success`
|
|
24
23
|
* and `vmStatus` are best-effort parsed from the CLI's Result JSON.
|
|
@@ -48,25 +47,25 @@ export async function runMoveScript(runtime, options) {
|
|
|
48
47
|
throw new Error(`Harness.runMoveScript: script not found at '${options.scriptPath}'.`);
|
|
49
48
|
}
|
|
50
49
|
const safeScriptPath = validatePathSafety(options.scriptPath, "script path");
|
|
51
|
-
const profile = `movehat-script-${randomUUID().slice(0, 8)}`;
|
|
52
|
-
const safeProfile = validateProfileSafety(profile);
|
|
53
50
|
logger.step(`Running Move script '${options.scriptPath}' on ${config.network}...`);
|
|
54
51
|
try {
|
|
55
52
|
const deployerAddress = account.accountAddress.toString();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
// Format the private key into AIP-80 shape before writing to the
|
|
54
|
+
// temp key file. `formatPrivateKey` is idempotent for already-
|
|
55
|
+
// prefixed inputs.
|
|
56
|
+
const formattedPrivateKey = PrivateKey.formatPrivateKey(config.privateKey, PrivateKeyVariants.Ed25519);
|
|
57
|
+
// Pass the private key via a 0o600 temp file (--private-key-file)
|
|
58
|
+
// and the on-chain address via --sender-account. Avoids the CLI's
|
|
59
|
+
// profile-yaml lookup chain entirely (no CWD / HOME / .aptos /
|
|
60
|
+
// .movement dance, no CLI-variant dependency).
|
|
61
|
+
const keyFilePath = writeTempKeyFile(formattedPrivateKey);
|
|
62
|
+
// SIGINT-safe sync cleanup BEFORE the CLI call so the private key
|
|
63
|
+
// never persists on disk after an abnormal exit. The signal-handler
|
|
64
|
+
// path uses the best-effort variant because the event loop is dead
|
|
65
|
+
// and we cannot logger.warning.
|
|
61
66
|
ensureSignalHandler();
|
|
62
|
-
const syncCleanup = () =>
|
|
67
|
+
const syncCleanup = () => removeKeyFileSyncBestEffort(keyFilePath);
|
|
63
68
|
cleanupCallbacks.add(syncCleanup);
|
|
64
|
-
await withYamlLock(() => addProfile(movementConfigPath, profile, {
|
|
65
|
-
private_key: cleanPrivateKey,
|
|
66
|
-
public_key: account.publicKey.toString(),
|
|
67
|
-
account: deployerAddress,
|
|
68
|
-
rest_url: config.rpc,
|
|
69
|
-
}));
|
|
70
69
|
let scriptOut = "";
|
|
71
70
|
try {
|
|
72
71
|
const typeArgsFragment = options.typeArgs && options.typeArgs.length > 0
|
|
@@ -80,8 +79,10 @@ export async function runMoveScript(runtime, options) {
|
|
|
80
79
|
args: [
|
|
81
80
|
"move",
|
|
82
81
|
"run-script",
|
|
83
|
-
"--
|
|
84
|
-
|
|
82
|
+
"--private-key-file",
|
|
83
|
+
keyFilePath,
|
|
84
|
+
"--sender-account",
|
|
85
|
+
deployerAddress,
|
|
85
86
|
"--url",
|
|
86
87
|
config.rpc,
|
|
87
88
|
"--assume-yes",
|
|
@@ -93,17 +94,23 @@ export async function runMoveScript(runtime, options) {
|
|
|
93
94
|
timeoutMs: 120000,
|
|
94
95
|
}, { adapter: options.adapter });
|
|
95
96
|
scriptOut = result.stdout;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
// Both streams gated behind isVerbose(); Movement CLI uses
|
|
98
|
+
// stderr for progress messages too. Real failures throw via
|
|
99
|
+
// CliExecutionError and are surfaced from the catch below.
|
|
100
|
+
if (isVerbose() && result.stdout)
|
|
101
|
+
logger.info(result.stdout.trim(), 2);
|
|
102
|
+
if (isVerbose() && result.stderr)
|
|
103
|
+
logger.info(result.stderr.trim(), 2);
|
|
100
104
|
}
|
|
101
105
|
finally {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
// Observable cleanup — emit a warning if the unlink failed and
|
|
107
|
+
// the file is still on disk (private key would persist silently
|
|
108
|
+
// otherwise).
|
|
109
|
+
const cleanupErr = removeKeyFile(keyFilePath);
|
|
110
|
+
if (cleanupErr) {
|
|
111
|
+
logger.warning(`Failed to remove temp key file '${keyFilePath}': ${cleanupErr.message}. ` +
|
|
112
|
+
`The file has mode 0o600 but should be removed manually: rm ${keyFilePath}`);
|
|
113
|
+
}
|
|
107
114
|
cleanupCallbacks.delete(syncCleanup);
|
|
108
115
|
}
|
|
109
116
|
const txHash = parseTxHash(scriptOut);
|
|
@@ -124,7 +131,7 @@ export async function runMoveScript(runtime, options) {
|
|
|
124
131
|
catch (error) {
|
|
125
132
|
if (error instanceof CliExecutionError) {
|
|
126
133
|
if (error.stdoutPreview)
|
|
127
|
-
|
|
134
|
+
logger.info(error.stdoutPreview, 2);
|
|
128
135
|
logger.error(`Failed to run Move script: ${error.message}\n${error.stderr}`);
|
|
129
136
|
}
|
|
130
137
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/harness/script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/harness/script.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupLocalTesting.fork-network.test.d.ts","sourceRoot":"","sources":["../../../src/helpers/__tests__/setupLocalTesting.fork-network.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
const initializeCalls = [];
|
|
6
|
+
vi.mock("../../fork/manager.js", async () => {
|
|
7
|
+
const fs = await import("node:fs");
|
|
8
|
+
return {
|
|
9
|
+
ForkManager: class {
|
|
10
|
+
forkPath;
|
|
11
|
+
metadata = null;
|
|
12
|
+
constructor(forkPath) {
|
|
13
|
+
this.forkPath = forkPath;
|
|
14
|
+
}
|
|
15
|
+
async initialize(nodeUrl, networkName, apiKey) {
|
|
16
|
+
const entry = { nodeUrl };
|
|
17
|
+
if (networkName !== undefined)
|
|
18
|
+
entry.networkName = networkName;
|
|
19
|
+
if (apiKey !== undefined)
|
|
20
|
+
entry.apiKey = apiKey;
|
|
21
|
+
initializeCalls.push(entry);
|
|
22
|
+
this.metadata = { network: networkName ?? "custom", nodeUrl };
|
|
23
|
+
}
|
|
24
|
+
load() {
|
|
25
|
+
const raw = fs.readFileSync(`${this.forkPath}/metadata.json`, "utf-8");
|
|
26
|
+
this.metadata = JSON.parse(raw);
|
|
27
|
+
}
|
|
28
|
+
getMetadata() {
|
|
29
|
+
if (!this.metadata) {
|
|
30
|
+
throw new Error("Fork not initialized");
|
|
31
|
+
}
|
|
32
|
+
return this.metadata;
|
|
33
|
+
}
|
|
34
|
+
setApiKey() { }
|
|
35
|
+
async resetState() { }
|
|
36
|
+
async fundAccount() { }
|
|
37
|
+
async fundMultipleAccounts() { }
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
vi.mock("../../fork/server.js", () => {
|
|
42
|
+
return {
|
|
43
|
+
ForkServer: class {
|
|
44
|
+
constructor(_p, _port) { }
|
|
45
|
+
async start() { }
|
|
46
|
+
async stop() { }
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
vi.mock("../../runtime.js", () => ({
|
|
51
|
+
initRuntime: vi.fn(async () => ({})),
|
|
52
|
+
}));
|
|
53
|
+
vi.mock("../../core/AccountManager.js", () => {
|
|
54
|
+
let _seq = 0;
|
|
55
|
+
return {
|
|
56
|
+
AccountManager: {
|
|
57
|
+
createBatch(labels) {
|
|
58
|
+
const out = {};
|
|
59
|
+
for (const l of labels) {
|
|
60
|
+
_seq++;
|
|
61
|
+
const addr = "0x" + _seq.toString(16).padStart(64, "0");
|
|
62
|
+
out[l] = { accountAddress: { toString: () => addr } };
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
},
|
|
66
|
+
exportPrivateKeys(_labels) {
|
|
67
|
+
return { deployer: "0x" + "1".repeat(64) };
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
// Imported after mocks so vi.hoisted ordering applies.
|
|
73
|
+
import { setupLocalTesting } from "../setupLocalTesting.js";
|
|
74
|
+
import { logger } from "../../ui/index.js";
|
|
75
|
+
describe("F1 — setupLocalTesting honors forkNetwork", () => {
|
|
76
|
+
let cwdBackup;
|
|
77
|
+
let tmpRoot;
|
|
78
|
+
beforeEach(() => {
|
|
79
|
+
initializeCalls.length = 0;
|
|
80
|
+
cwdBackup = process.cwd();
|
|
81
|
+
tmpRoot = mkdtempSync(join(tmpdir(), "movehat-f1-"));
|
|
82
|
+
process.chdir(tmpRoot);
|
|
83
|
+
vi.spyOn(logger, "step").mockImplementation(() => undefined);
|
|
84
|
+
vi.spyOn(logger, "success").mockImplementation(() => undefined);
|
|
85
|
+
vi.spyOn(logger, "plain").mockImplementation(() => undefined);
|
|
86
|
+
vi.spyOn(logger, "newline").mockImplementation(() => undefined);
|
|
87
|
+
vi.spyOn(logger, "warning").mockImplementation(() => undefined);
|
|
88
|
+
vi.spyOn(logger, "error").mockImplementation(() => undefined);
|
|
89
|
+
});
|
|
90
|
+
afterEach(() => {
|
|
91
|
+
process.chdir(cwdBackup);
|
|
92
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
93
|
+
vi.restoreAllMocks();
|
|
94
|
+
});
|
|
95
|
+
it("uses the mainnet RPC when forkNetwork = 'mainnet'", async () => {
|
|
96
|
+
await setupLocalTesting({
|
|
97
|
+
mode: "fork",
|
|
98
|
+
forkNetwork: "mainnet",
|
|
99
|
+
accountLabels: ["deployer"],
|
|
100
|
+
autoFund: false,
|
|
101
|
+
});
|
|
102
|
+
expect(initializeCalls).toHaveLength(1);
|
|
103
|
+
const call = initializeCalls[0];
|
|
104
|
+
expect(call.networkName).toBe("mainnet");
|
|
105
|
+
expect(call.nodeUrl).not.toMatch(/testnet/i);
|
|
106
|
+
expect(call.nodeUrl).toMatch(/mainnet/i);
|
|
107
|
+
});
|
|
108
|
+
it("uses the testnet RPC when forkNetwork = 'testnet'", async () => {
|
|
109
|
+
await setupLocalTesting({
|
|
110
|
+
mode: "fork",
|
|
111
|
+
forkNetwork: "testnet",
|
|
112
|
+
accountLabels: ["deployer"],
|
|
113
|
+
autoFund: false,
|
|
114
|
+
});
|
|
115
|
+
expect(initializeCalls).toHaveLength(1);
|
|
116
|
+
const call = initializeCalls[0];
|
|
117
|
+
expect(call.networkName).toBe("testnet");
|
|
118
|
+
expect(call.nodeUrl).toMatch(/testnet/i);
|
|
119
|
+
});
|
|
120
|
+
it("uses forkRpcUrl override when supplied for a custom network", async () => {
|
|
121
|
+
await setupLocalTesting({
|
|
122
|
+
mode: "fork",
|
|
123
|
+
forkNetwork: "custom",
|
|
124
|
+
forkRpcUrl: "https://my-custom-node.example/v1",
|
|
125
|
+
accountLabels: ["deployer"],
|
|
126
|
+
autoFund: false,
|
|
127
|
+
});
|
|
128
|
+
expect(initializeCalls).toHaveLength(1);
|
|
129
|
+
const call = initializeCalls[0];
|
|
130
|
+
expect(call.networkName).toBe("custom");
|
|
131
|
+
expect(call.nodeUrl).toBe("https://my-custom-node.example/v1");
|
|
132
|
+
});
|
|
133
|
+
it("rejects a non-built-in forkNetwork when no forkRpcUrl is provided", async () => {
|
|
134
|
+
await expect(setupLocalTesting({
|
|
135
|
+
mode: "fork",
|
|
136
|
+
forkNetwork: "some-unknown-network",
|
|
137
|
+
accountLabels: ["deployer"],
|
|
138
|
+
autoFund: false,
|
|
139
|
+
})).rejects.toThrow(/forkRpcUrl/i);
|
|
140
|
+
expect(initializeCalls).toHaveLength(0);
|
|
141
|
+
});
|
|
142
|
+
it("rejects when an existing fork's saved network does not match the requested one (audit-f1 follow-up)", async () => {
|
|
143
|
+
// Pre-seed `.movehat/forks/test-local/metadata.json` with the
|
|
144
|
+
// wrong network so the `forkExists` branch fires and loads stale
|
|
145
|
+
// metadata. Without the metadata-mismatch guard, setupLocalTesting
|
|
146
|
+
// would silently serve a testnet snapshot while the caller thinks
|
|
147
|
+
// it's reading mainnet.
|
|
148
|
+
const forkDir = join(tmpRoot, ".movehat", "forks", "test-local");
|
|
149
|
+
mkdirSync(forkDir, { recursive: true });
|
|
150
|
+
writeFileSync(join(forkDir, "metadata.json"), JSON.stringify({
|
|
151
|
+
network: "testnet",
|
|
152
|
+
nodeUrl: "https://testnet.movementnetwork.xyz/v1",
|
|
153
|
+
chainId: 250,
|
|
154
|
+
ledgerVersion: "0",
|
|
155
|
+
timestamp: "0",
|
|
156
|
+
epoch: "0",
|
|
157
|
+
blockHeight: "0",
|
|
158
|
+
createdAt: new Date().toISOString(),
|
|
159
|
+
}));
|
|
160
|
+
await expect(setupLocalTesting({
|
|
161
|
+
mode: "fork",
|
|
162
|
+
forkNetwork: "mainnet",
|
|
163
|
+
accountLabels: ["deployer"],
|
|
164
|
+
autoFund: false,
|
|
165
|
+
})).rejects.toThrow(/network mismatch|created for|requested/i);
|
|
166
|
+
// Must not have re-initialized — the existing dir is what poisons
|
|
167
|
+
// the load path, and silently reinitializing would clobber the
|
|
168
|
+
// user's saved snapshot.
|
|
169
|
+
expect(initializeCalls).toHaveLength(0);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=setupLocalTesting.fork-network.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupLocalTesting.fork-network.test.js","sourceRoot":"","sources":["../../../src/helpers/__tests__/setupLocalTesting.fork-network.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
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;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAqB3D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB;IAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,gBAAgB;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA4C9B"}
|
|
@@ -6,6 +6,20 @@ import { ForkServer } from "../fork/server.js";
|
|
|
6
6
|
import { LocalNodeManager } from "../node/LocalNodeManager.js";
|
|
7
7
|
import { AccountManager } from "../core/AccountManager.js";
|
|
8
8
|
import { logger } from "../ui/index.js";
|
|
9
|
+
const BUILTIN_FORK_RPCS = {
|
|
10
|
+
testnet: "https://testnet.movementnetwork.xyz/v1",
|
|
11
|
+
mainnet: "https://mainnet.movementnetwork.xyz/v1",
|
|
12
|
+
};
|
|
13
|
+
function resolveForkRpcUrl(network, override) {
|
|
14
|
+
if (override !== undefined)
|
|
15
|
+
return override;
|
|
16
|
+
const builtin = BUILTIN_FORK_RPCS[network];
|
|
17
|
+
if (builtin !== undefined)
|
|
18
|
+
return builtin;
|
|
19
|
+
throw new Error(`Cannot fork unknown network "${network}" without a forkRpcUrl. ` +
|
|
20
|
+
`Either pass forkRpcUrl in LocalTestOptions or use one of: ` +
|
|
21
|
+
`${Object.keys(BUILTIN_FORK_RPCS).join(", ")}.`);
|
|
22
|
+
}
|
|
9
23
|
/**
|
|
10
24
|
* Setup a local testing environment with either a local node or fork server
|
|
11
25
|
*
|
|
@@ -45,9 +59,9 @@ export async function setupLocalTesting(options = {}) {
|
|
|
45
59
|
const defaultBalance = options.defaultBalance || 100_000_000;
|
|
46
60
|
const accountLabels = options.accountLabels || ["deployer", "alice", "bob"];
|
|
47
61
|
logger.newline();
|
|
48
|
-
logger.
|
|
49
|
-
logger.
|
|
50
|
-
logger.
|
|
62
|
+
logger.phase("Setting up local testing environment");
|
|
63
|
+
logger.kv("Mode", mode, 2);
|
|
64
|
+
logger.kv("Accounts", accountLabels.join(", "), 2);
|
|
51
65
|
logger.newline();
|
|
52
66
|
if (mode === 'local-node') {
|
|
53
67
|
const { runtime, localNode } = await setupWithLocalNode(options, accountLabels, autoFund, defaultBalance);
|
|
@@ -200,8 +214,8 @@ async function setupWithFork(options, accountLabels, autoFund, defaultBalance) {
|
|
|
200
214
|
const forkExists = existsSync(join(forkPath, "metadata.json"));
|
|
201
215
|
if (!forkExists) {
|
|
202
216
|
logger.step(`Creating fork from ${forkNetwork}...`);
|
|
203
|
-
const
|
|
204
|
-
await forkManager.initialize(
|
|
217
|
+
const rpcUrl = resolveForkRpcUrl(forkNetwork, options.forkRpcUrl);
|
|
218
|
+
await forkManager.initialize(rpcUrl, forkNetwork, options.forkApiKey);
|
|
205
219
|
logger.success(`Fork created at ${forkPath}`);
|
|
206
220
|
logger.newline();
|
|
207
221
|
}
|
|
@@ -214,6 +228,18 @@ async function setupWithFork(options, accountLabels, autoFund, defaultBalance) {
|
|
|
214
228
|
forkManager.setApiKey(options.forkApiKey);
|
|
215
229
|
}
|
|
216
230
|
forkManager.load();
|
|
231
|
+
// Guard against the audit-f1 follow-up case: the default forkName
|
|
232
|
+
// ("test-local") doesn't encode the network, so a fork created for
|
|
233
|
+
// testnet would silently serve mainnet requests. Refuse to load
|
|
234
|
+
// when the saved metadata's network doesn't match what the caller
|
|
235
|
+
// asked for — the user must either pass a network-specific
|
|
236
|
+
// `forkName` or delete the stale directory.
|
|
237
|
+
const savedNetwork = forkManager.getMetadata().network;
|
|
238
|
+
if (savedNetwork !== forkNetwork) {
|
|
239
|
+
throw new Error(`Fork at ${forkPath} was created for network "${savedNetwork}" but ` +
|
|
240
|
+
`you requested "${forkNetwork}". Use a different forkName ` +
|
|
241
|
+
`(e.g. "${forkNetwork}-local") or delete ${forkPath} to recreate.`);
|
|
242
|
+
}
|
|
217
243
|
if (forkResetState) {
|
|
218
244
|
logger.step("Resetting fork state...");
|
|
219
245
|
await forkManager.resetState();
|