movehat 0.2.0 → 0.2.2
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 +132 -279
- 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 +7 -2
- 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/__tests__/harness/Harness.proxy.test.js +7 -11
- package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -1
- package/dist/__tests__/harness/codeObject.deploy.test.js +1 -1
- package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -1
- package/dist/__tests__/harness/view.test.js +3 -3
- 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/__tests__/run.test.js +3 -3
- package/dist/commands/__tests__/run.test.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/core/AccountManager.d.ts +0 -3
- package/dist/core/AccountManager.d.ts.map +1 -1
- package/dist/core/AccountManager.js +14 -7
- package/dist/core/AccountManager.js.map +1 -1
- package/dist/core/Publisher.d.ts +0 -5
- package/dist/core/Publisher.d.ts.map +1 -1
- package/dist/core/Publisher.js +52 -76
- 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.js +6 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/contract.d.ts +0 -3
- package/dist/core/contract.d.ts.map +1 -1
- package/dist/core/contract.js +0 -3
- package/dist/core/contract.js.map +1 -1
- package/dist/core/deployments.d.ts +0 -6
- package/dist/core/deployments.d.ts.map +1 -1
- package/dist/core/deployments.js +0 -12
- 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__/manager.test.js +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.d.ts +1 -21
- package/dist/fork/manager.d.ts.map +1 -1
- package/dist/fork/manager.js +1 -41
- 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 +19 -9
- package/dist/fork/server.js.map +1 -1
- package/dist/fork/test.d.ts +0 -1
- package/dist/fork/test.d.ts.map +1 -1
- package/dist/fork/test.js.map +1 -1
- package/dist/harness/Harness.d.ts +11 -13
- package/dist/harness/Harness.d.ts.map +1 -1
- package/dist/harness/Harness.js +13 -13
- package/dist/harness/Harness.js.map +1 -1
- package/dist/harness/codeObject.d.ts.map +1 -1
- package/dist/harness/codeObject.js +31 -38
- 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 +33 -29
- 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 +1 -2
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
- package/dist/helpers/setupLocalTesting.js +28 -2
- 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/index.js +0 -1
- package/dist/index.js.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 +10 -1
- 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 +4 -3
- package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1 -3
- package/dist/runtime.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 +11 -1
- package/dist/templates/tests/Counter.test.ts +2 -2
- package/dist/types/config.d.ts +8 -1
- package/dist/types/config.d.ts.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/address.d.ts +0 -4
- package/dist/utils/address.d.ts.map +1 -1
- package/dist/utils/address.js +0 -4
- package/dist/utils/address.js.map +1 -1
- package/dist/utils/childProcessAdapter.d.ts +7 -0
- package/dist/utils/childProcessAdapter.d.ts.map +1 -1
- package/dist/utils/childProcessAdapter.js +23 -6
- package/dist/utils/childProcessAdapter.js.map +1 -1
- package/package.json +2 -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 +7 -2
- package/src/__tests__/fork/api.timeout.test.ts +150 -0
- package/src/__tests__/harness/Harness.proxy.test.ts +7 -11
- package/src/__tests__/harness/codeObject.deploy.test.ts +1 -1
- package/src/__tests__/harness/view.test.ts +3 -3
- package/src/commands/__tests__/compile.toml-mutation.test.ts +77 -0
- package/src/commands/__tests__/init.test.ts +96 -11
- package/src/commands/__tests__/run.test.ts +3 -3
- package/src/commands/init.ts +77 -6
- package/src/core/AccountManager.ts +18 -13
- package/src/core/Publisher.ts +58 -85
- 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 +9 -5
- package/src/core/contract.ts +0 -3
- package/src/core/deployments.ts +0 -12
- package/src/core/movementProfile.ts +75 -127
- package/src/fork/__tests__/manager.test.ts +1 -1
- package/src/fork/__tests__/server.cors.test.ts +101 -0
- package/src/fork/api.ts +69 -10
- package/src/fork/manager.ts +1 -41
- package/src/fork/server.ts +38 -9
- package/src/fork/test.ts +0 -1
- package/src/harness/Harness.ts +16 -13
- package/src/harness/codeObject.ts +38 -48
- package/src/harness/script.ts +40 -39
- package/src/helpers/__tests__/setupLocalTesting.fork-network.test.ts +212 -0
- package/src/helpers/setupLocalTesting.ts +37 -4
- package/src/index.ts +9 -2
- package/src/node/LocalNodeManager.ts +24 -2
- package/src/node/__tests__/LocalNodeManager.api-port.test.ts +62 -0
- package/src/node/__tests__/LocalNodeManager.test.ts +5 -4
- package/src/runtime.ts +1 -3
- package/src/templates/move/Move.toml +1 -1
- package/src/templates/move/sources/Counter.move +31 -4
- package/src/templates/scripts/deploy-counter.ts +11 -1
- package/src/templates/tests/Counter.test.ts +2 -2
- package/src/types/config.ts +8 -1
- package/src/types/runtime.ts +2 -2
- package/src/utils/__tests__/childProcessAdapter.maxBuffer.test.ts +51 -0
- package/src/utils/address.ts +0 -4
- package/src/utils/childProcessAdapter.ts +35 -6
|
@@ -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
8
|
import { logger } from "../ui/index.js";
|
|
11
|
-
import {
|
|
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();
|
|
@@ -132,24 +128,22 @@ async function executeMovementMoveObject(opts) {
|
|
|
132
128
|
}, { adapter: opts.adapter });
|
|
133
129
|
if (buildResult.stdout)
|
|
134
130
|
console.log(buildResult.stdout.trim());
|
|
135
|
-
//
|
|
136
|
-
// raw
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
//
|
|
143
|
-
|
|
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,
|
|
@@ -183,19 +179,18 @@ async function executeMovementMoveObject(opts) {
|
|
|
183
179
|
console.error(result.stderr.trim());
|
|
184
180
|
}
|
|
185
181
|
finally {
|
|
186
|
-
//
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
182
|
+
// Unlink via the observable helper — emit a warning if the file
|
|
183
|
+
// could not be removed AND still exists on disk (private key
|
|
184
|
+
// would persist silently otherwise). ENOENT and races are
|
|
185
|
+
// treated as benign success.
|
|
186
|
+
const cleanupErr = removeKeyFile(keyFilePath);
|
|
187
|
+
if (cleanupErr) {
|
|
188
|
+
logger.warning(`Failed to remove temp key file '${keyFilePath}': ${cleanupErr.message}. ` +
|
|
189
|
+
`The file has mode 0o600 but should be removed manually: rm ${keyFilePath}`);
|
|
190
|
+
}
|
|
194
191
|
cleanupCallbacks.delete(syncCleanup);
|
|
195
192
|
}
|
|
196
193
|
// Parse object address (for deploy-object) and txHash (both flows).
|
|
197
|
-
// No captured fixture exists at M2.2 commit time; M4 integration
|
|
198
|
-
// tests validate against real CLI output.
|
|
199
194
|
const objectAddress = opts.fixedAddress ?? parseObjectAddress(deployOut);
|
|
200
195
|
const txHash = parseTxHash(deployOut);
|
|
201
196
|
if (!objectAddress) {
|
|
@@ -247,9 +242,7 @@ async function executeMovementMoveObject(opts) {
|
|
|
247
242
|
/**
|
|
248
243
|
* Extract a code-object address from `movement move deploy-object` stdout.
|
|
249
244
|
*
|
|
250
|
-
* Movement CLI typically emits the address in one of these shapes
|
|
251
|
-
* of them captured at M2.2 commit time — patterns are speculative, with
|
|
252
|
-
* M4 integration tests as the validation gate):
|
|
245
|
+
* Movement CLI typically emits the address in one of these shapes:
|
|
253
246
|
*
|
|
254
247
|
* - Free text: `Code was successfully deployed to object address 0x…`
|
|
255
248
|
* - Free text: `Object address: 0x…`
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAOpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAuB,EACvB,OAAgC;IAEhC,OAAO,yBAAyB,CAAC;QAC/B,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,eAAe;QAC3B,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,OAAiC;IAEjC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IACD,OAAO,yBAAyB,CAAC;QAC/B,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,CAAC,kBAAkB,EAAE,OAAO,CAAC,aAAa,CAAC;QACtD,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,OAAO,CAAC,aAAa;KACpC,CAAC,CAAC;AACL,CAAC;AAyBD,KAAK,UAAU,yBAAyB,CACtC,IAAoB;IAEpB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEvC,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;IAC7D,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG;gBACnB,WAAW,UAAU,4BAA4B,MAAM,CAAC,OAAO,EAAE;gBACjE,YAAY,QAAQ,CAAC,OAAO,EAAE;gBAC9B,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE;gBAC/D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC1D,+FAA+F,QAAQ,CAAC,OAAO,YAAY;aAC5H;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,CAAC,KAAK,CACV,WAAW,UAAU,4BAA4B,MAAM,CAAC,OAAO,EAAE,CAClE,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CACV,mBAAmB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CACnE,CAAC;YACF,IAAI,QAAQ,CAAC,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACxE,MAAM,CAAC,OAAO,EAAE,CAAC;YAEjB,MAAM,IAAI,0BAA0B,CAClC,YAAY,EACZ,UAAU,EACV,MAAM,CAAC,OAAO,EACd,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,MAAM,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC;IAC9C,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAE7D,MAAM,CAAC,IAAI,CACT,GAAG,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,YAAY,UAAU,UAAU,GAAG,KAAK,CACtG,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAE1D,mEAAmE;QACnE,8DAA8D;QAC9D,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,iBAAiB;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,aAAa,GACjB,OAAO,CAAC,IAAI,GAAG,CAAC;YACd,CAAC,CAAC;gBACE,mBAAmB;gBACnB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;qBAC1B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;qBAC5B,IAAI,CAAC,GAAG,CAAC;aACb;YACH,CAAC,CAAC,EAAE,CAAC;QAET,4DAA4D;QAC5D,oCAAoC;QACpC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,MAAM,CAC9B;YACE,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;YACnE,SAAS,EAAE,MAAM;SAClB,EACD,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACF,IAAI,WAAW,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/D,+DAA+D;QAC/D,mEAAmE;QACnE,6CAA6C;QAC7C,MAAM,mBAAmB,GAAG,UAAU,CAAC,gBAAgB,CACrD,MAAM,CAAC,UAAU,EACjB,kBAAkB,CAAC,OAAO,CAC3B,CAAC;QAEF,kEAAkE;QAClE,iEAAiE;QACjE,gEAAgE;QAChE,8CAA8C;QAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QAE1D,+DAA+D;QAC/D,iEAAiE;QACjE,mEAAmE;QACnE,mDAAmD;QACnD,mBAAmB,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC;QACnE,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAElC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CACT,0BAA0B,UAAU,IAAI,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,KAAK,CAChH,CAAC;YACF,MAAM,iBAAiB,GACrB,IAAI,CAAC,iBAAiB;gBACpB,CAAC,CAAC,CAAC,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,CAAC;gBAClD,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB;gBACE,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE;oBACJ,MAAM;oBACN,UAAU;oBACV,gBAAgB;oBAChB,IAAI,CAAC,WAAW,IAAI,UAAU;oBAC9B,eAAe;oBACf,OAAO;oBACP,OAAO;oBACP,MAAM,CAAC,GAAG;oBACV,oBAAoB;oBACpB,WAAW;oBACX,kBAAkB;oBAClB,eAAe;oBACf,cAAc;oBACd,GAAG,iBAAiB;oBACpB,GAAG,aAAa;oBAChB,GAAG,IAAI,CAAC,SAAS;iBAClB;gBACD,SAAS,EAAE,MAAM,EAAE,6DAA6D;aACjF,EACD,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;YACF,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,gEAAgE;YAChE,6DAA6D;YAC7D,0DAA0D;YAC1D,6BAA6B;YAC7B,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,CACZ,mCAAmC,WAAW,MAAM,UAAU,CAAC,OAAO,IAAI;oBACxE,8DAA8D,WAAW,EAAE,CAC9E,CAAC;YACJ,CAAC;YACD,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;QAED,oEAAoE;QACpE,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QAEtC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,wCAAwC,UAAU,YAAY;gBAC5D,8DAA8D;gBAC9D,oEAAoE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CACjG,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,OAAO,CACZ,GAAG,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,gBAAgB,CAC1F,CAAC;QAEF,qEAAqE;QACrE,gEAAgE;QAEhE,MAAM,UAAU,GAAmB;YACjC,OAAO,EAAE,aAAa;YACtB,UAAU;YACV,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC;QAEF,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,IAAI,gBAAgB,CACxB,WAAW,UAAU,KAAK,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,UAAU,CAAC,OAAO,GAAG;gBAC5G,qDAAqD,GAAG,CAAC,OAAO,EAAE,EACpE,UAAU,EACV,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,CACZ,UAAU,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,oBAAoB,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG;gBAC/G,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,qDAAqD,CACnG,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CACZ,+DAA+D,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,QAAQ,CAC/H,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CACV,aAAa,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE,CAC/G,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CACV,aAAa,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,GAAG,CAAC,OAAO,EAAE,CAC5F,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACxC,mCAAmC;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAC9B,kDAAkD,CACnD,CAAC;IACF,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAE5C,8BAA8B;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAC5B,gDAAgD,CACjD,CAAC;IACF,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAExC,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
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,CAwI3B"}
|
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
8
|
import { logger } from "../ui/index.js";
|
|
10
|
-
import {
|
|
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",
|
|
@@ -99,11 +100,14 @@ export async function runMoveScript(runtime, options) {
|
|
|
99
100
|
console.error(result.stderr.trim());
|
|
100
101
|
}
|
|
101
102
|
finally {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
// Observable cleanup — emit a warning if the unlink failed and
|
|
104
|
+
// the file is still on disk (private key would persist silently
|
|
105
|
+
// otherwise).
|
|
106
|
+
const cleanupErr = removeKeyFile(keyFilePath);
|
|
107
|
+
if (cleanupErr) {
|
|
108
|
+
logger.warning(`Failed to remove temp key file '${keyFilePath}': ${cleanupErr.message}. ` +
|
|
109
|
+
`The file has mode 0o600 but should be removed manually: rm ${keyFilePath}`);
|
|
110
|
+
}
|
|
107
111
|
cleanupCallbacks.delete(syncCleanup);
|
|
108
112
|
}
|
|
109
113
|
const txHash = parseTxHash(scriptOut);
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,OAA6B;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,8CAA8C;IAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,UAAsD,CAAC;IAC3D,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,UAAU,GAAG,eAAe,CAAC;IAC/B,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,UAAU,GAAG,wBAAwB,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,wDAAwD,GAAG,IAAI,QAAQ,KAAK;YAC1E,iFAAiF,CACpF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,+CAA+C,OAAO,CAAC,UAAU,IAAI,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE7E,MAAM,CAAC,IAAI,CACT,wBAAwB,OAAO,CAAC,UAAU,QAAQ,MAAM,CAAC,OAAO,KAAK,CACtE,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAE1D,iEAAiE;QACjE,+DAA+D;QAC/D,mBAAmB;QACnB,MAAM,mBAAmB,GAAG,UAAU,CAAC,gBAAgB,CACrD,MAAM,CAAC,UAAU,EACjB,kBAAkB,CAAC,OAAO,CAC3B,CAAC;QAEF,kEAAkE;QAClE,kEAAkE;QAClE,+DAA+D;QAC/D,+CAA+C;QAC/C,MAAM,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QAE1D,kEAAkE;QAClE,oEAAoE;QACpE,mEAAmE;QACnE,gCAAgC;QAChC,mBAAmB,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC;QACnE,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAElC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,gBAAgB,GACpB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACtC,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,YAAY,GAChB,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC7B,CAAC,CAAC,EAAE,CAAC;YAET,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB;gBACE,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE;oBACJ,MAAM;oBACN,YAAY;oBACZ,oBAAoB;oBACpB,WAAW;oBACX,kBAAkB;oBAClB,eAAe;oBACf,OAAO;oBACP,MAAM,CAAC,GAAG;oBACV,cAAc;oBACd,UAAU;oBACV,cAAc;oBACd,GAAG,gBAAgB;oBACnB,GAAG,YAAY;iBAChB;gBACD,SAAS,EAAE,MAAM;aAClB,EACD,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAC7B,CAAC;YACF,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,+DAA+D;YAC/D,gEAAgE;YAChE,cAAc;YACd,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,CACZ,mCAAmC,WAAW,MAAM,UAAU,CAAC,OAAO,IAAI;oBACxE,8DAA8D,WAAW,EAAE,CAC9E,CAAC;YACJ,CAAC;YACD,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,kEAAkE;gBAChE,qBAAqB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAClD,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAE1C,MAAM,CAAC,OAAO,CAAC,4BAA4B,MAAM,IAAI,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAqB,EAAE,MAAM,EAAE,CAAC;QACzC,IAAI,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;QACjD,IAAI,QAAQ,KAAK,SAAS;YAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -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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"}
|
|
@@ -14,8 +14,7 @@ import type { LocalTestOptions } from "../types/config.js";
|
|
|
14
14
|
* @public The `runtime` and `teardown` fields are the supported surface.
|
|
15
15
|
* `localNode`, `forkServer`, and `forkManager` are exposed for
|
|
16
16
|
* escape hatches (e.g. mid-test `forkManager.resetState()`) but
|
|
17
|
-
* their concrete shapes are
|
|
18
|
-
* TypeDoc pass formalizes the public API.
|
|
17
|
+
* their concrete shapes are `@internal`.
|
|
19
18
|
*/
|
|
20
19
|
export interface LocalTestingContext {
|
|
21
20
|
runtime: MovehatRuntime;
|
|
@@ -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
|
*
|
|
@@ -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();
|