@twin.org/move-to-json 0.0.3-next.7 → 0.0.3-next.9
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/es/cli.js +1 -1
- package/dist/es/cli.js.map +1 -1
- package/dist/es/commands/deploy.js +57 -7
- package/dist/es/commands/deploy.js.map +1 -1
- package/dist/locales/en.json +7 -6
- package/docs/changelog.md +127 -99
- package/docs/reference/interfaces/INetworkConfig.md +4 -4
- package/docs/usage.md +2 -2
- package/locales/en.json +7 -3
- package/package.json +5 -5
package/dist/es/cli.js
CHANGED
|
@@ -21,7 +21,7 @@ export class CLI extends CLIBase {
|
|
|
21
21
|
return this.execute({
|
|
22
22
|
title: "TWIN Move to JSON",
|
|
23
23
|
appName: "move-to-json",
|
|
24
|
-
version: "0.0.3-next.
|
|
24
|
+
version: "0.0.3-next.9", // x-release-please-version
|
|
25
25
|
icon: "⚙️ ",
|
|
26
26
|
supportsEnvFiles: true,
|
|
27
27
|
overrideOutputWidth: options?.overrideOutputWidth
|
package/dist/es/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,OAAO,GAAI,SAAQ,OAAO;IAC/B;;;;;;;OAOG;IACI,KAAK,CAAC,GAAG,CACf,IAAc,EACd,gBAAyB,EACzB,OAEC;QAED,OAAO,IAAI,CAAC,OAAO,CAClB;YACC,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,cAAc,EAAE,2BAA2B;YACpD,IAAI,EAAE,KAAK;YACX,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;SACjD,EACD,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,EACzF,IAAI,CACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,aAAa,CAAC,OAAgB;QACvC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CLIBase } from \"@twin.org/cli-core\";\nimport type { Command } from \"commander\";\nimport { buildCommandBuild } from \"./commands/build.js\";\nimport { buildCommandDeploy } from \"./commands/deploy.js\";\n\n/**\n * The main entry point for the Move to JSON CLI.\n */\nexport class CLI extends CLIBase {\n\t/**\n\t * Run the app.\n\t * @param argv The process arguments.\n\t * @param localesDirectory The directory for the locales, default to relative to the script.\n\t * @param options Additional options.\n\t * @param options.overrideOutputWidth Override the output width.\n\t * @returns The exit code.\n\t */\n\tpublic async run(\n\t\targv: string[],\n\t\tlocalesDirectory?: string,\n\t\toptions?: {\n\t\t\toverrideOutputWidth?: number;\n\t\t}\n\t): Promise<number> {\n\t\treturn this.execute(\n\t\t\t{\n\t\t\t\ttitle: \"TWIN Move to JSON\",\n\t\t\t\tappName: \"move-to-json\",\n\t\t\t\tversion: \"0.0.3-next.
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,OAAO,GAAI,SAAQ,OAAO;IAC/B;;;;;;;OAOG;IACI,KAAK,CAAC,GAAG,CACf,IAAc,EACd,gBAAyB,EACzB,OAEC;QAED,OAAO,IAAI,CAAC,OAAO,CAClB;YACC,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,cAAc,EAAE,2BAA2B;YACpD,IAAI,EAAE,KAAK;YACX,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;SACjD,EACD,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,EACzF,IAAI,CACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,aAAa,CAAC,OAAgB;QACvC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CLIBase } from \"@twin.org/cli-core\";\nimport type { Command } from \"commander\";\nimport { buildCommandBuild } from \"./commands/build.js\";\nimport { buildCommandDeploy } from \"./commands/deploy.js\";\n\n/**\n * The main entry point for the Move to JSON CLI.\n */\nexport class CLI extends CLIBase {\n\t/**\n\t * Run the app.\n\t * @param argv The process arguments.\n\t * @param localesDirectory The directory for the locales, default to relative to the script.\n\t * @param options Additional options.\n\t * @param options.overrideOutputWidth Override the output width.\n\t * @returns The exit code.\n\t */\n\tpublic async run(\n\t\targv: string[],\n\t\tlocalesDirectory?: string,\n\t\toptions?: {\n\t\t\toverrideOutputWidth?: number;\n\t\t}\n\t): Promise<number> {\n\t\treturn this.execute(\n\t\t\t{\n\t\t\t\ttitle: \"TWIN Move to JSON\",\n\t\t\t\tappName: \"move-to-json\",\n\t\t\t\tversion: \"0.0.3-next.9\", // x-release-please-version\n\t\t\t\ticon: \"⚙️ \",\n\t\t\t\tsupportsEnvFiles: true,\n\t\t\t\toverrideOutputWidth: options?.overrideOutputWidth\n\t\t\t},\n\t\t\tlocalesDirectory ?? path.join(path.dirname(fileURLToPath(import.meta.url)), \"../locales\"),\n\t\t\targv\n\t\t);\n\t}\n\n\t/**\n\t * Configure any options or actions at the root program level.\n\t * @param program The root program command.\n\t */\n\tprotected configureRoot(program: Command): void {\n\t\tbuildCommandBuild(program);\n\t\tbuildCommandDeploy(program);\n\t}\n}\n"]}
|
|
@@ -5,7 +5,7 @@ import path from "node:path";
|
|
|
5
5
|
import { IotaClient } from "@iota/iota-sdk/client";
|
|
6
6
|
import { requestIotaFromFaucetV0 } from "@iota/iota-sdk/faucet";
|
|
7
7
|
import { CLIDisplay, CLIParam, CLIUtils } from "@twin.org/cli-core";
|
|
8
|
-
import { Converter, GeneralError, Guards, I18n, Is, RandomHelper } from "@twin.org/core";
|
|
8
|
+
import { Coerce, Converter, GeneralError, Guards, I18n, Is, RandomHelper } from "@twin.org/core";
|
|
9
9
|
import { Bip39, Bip44 } from "@twin.org/crypto";
|
|
10
10
|
import { Iota, NetworkTypes } from "@twin.org/dlt-iota";
|
|
11
11
|
import { cleanBuildArtifactsInPath } from "../utils/buildArtifactUtils.js";
|
|
@@ -398,6 +398,39 @@ async function determineDeploymentStrategy(contractData) {
|
|
|
398
398
|
}
|
|
399
399
|
return "initial-deploy";
|
|
400
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* Query the on-chain UpgradeCap object to get the actual latest package ID.
|
|
403
|
+
* This is used to validate/correct the `published-at` value before upgrades,
|
|
404
|
+
* preventing failures when the deployment JSON is stale.
|
|
405
|
+
* @param rpcUrl RPC endpoint URL for the network.
|
|
406
|
+
* @param upgradeCapabilityId The UpgradeCap object ID on-chain.
|
|
407
|
+
* @returns The on-chain package ID and version, or undefined if query fails.
|
|
408
|
+
*/
|
|
409
|
+
async function queryUpgradeCapPackage(rpcUrl, upgradeCapabilityId) {
|
|
410
|
+
try {
|
|
411
|
+
const client = new IotaClient({ url: rpcUrl });
|
|
412
|
+
const response = await client.getObject({
|
|
413
|
+
id: upgradeCapabilityId,
|
|
414
|
+
options: { showContent: true }
|
|
415
|
+
});
|
|
416
|
+
if (response.data?.content?.dataType === "moveObject") {
|
|
417
|
+
const fields = response.data.content.fields;
|
|
418
|
+
const fieldPackage = Coerce.string(fields.package);
|
|
419
|
+
const fieldVersion = Coerce.number(fields.version);
|
|
420
|
+
if (Is.stringValue(fieldPackage) && Is.number(fieldVersion)) {
|
|
421
|
+
return {
|
|
422
|
+
package: fieldPackage,
|
|
423
|
+
version: fieldVersion
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return undefined;
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
// If query fails (e.g. network issue), return undefined to fall back to JSON value
|
|
431
|
+
return undefined;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
401
434
|
/**
|
|
402
435
|
* Execute contract upgrade using iota client upgrade command.
|
|
403
436
|
* @param contractData Contract data containing upgrade capability.
|
|
@@ -405,10 +438,27 @@ async function determineDeploymentStrategy(contractData) {
|
|
|
405
438
|
* @returns Upgrade result with package ID and upgrade capability.
|
|
406
439
|
*/
|
|
407
440
|
async function executeContractUpgrade(contractData, config) {
|
|
408
|
-
//
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
441
|
+
// Start with lastDeployedPackageId from JSON as the candidate for "published-at"
|
|
442
|
+
let publishedAtPackageId = contractData.lastDeployedPackageId;
|
|
443
|
+
// Query the on-chain UpgradeCap to get the actual latest package ID.
|
|
444
|
+
// This prevents failures when the JSON is stale
|
|
445
|
+
if (Is.stringValue(contractData.upgradeCapabilityId)) {
|
|
446
|
+
CLIDisplay.task(I18n.formatMessage("commands.deploy.progress.queryingUpgradeCap"));
|
|
447
|
+
const onChainCap = await queryUpgradeCapPackage(config.rpc.url, contractData.upgradeCapabilityId);
|
|
448
|
+
if (onChainCap) {
|
|
449
|
+
CLIDisplay.value(I18n.formatMessage("commands.deploy.labels.onChainPackageId"), onChainCap.package, 1);
|
|
450
|
+
CLIDisplay.value(I18n.formatMessage("commands.deploy.labels.onChainVersion"), String(onChainCap.version), 1);
|
|
451
|
+
if (publishedAtPackageId !== onChainCap.package) {
|
|
452
|
+
CLIDisplay.value(I18n.formatMessage("commands.deploy.labels.warning"), I18n.formatMessage("commands.deploy.messages.staleJsonDetected", {
|
|
453
|
+
jsonPackageId: publishedAtPackageId ?? "none",
|
|
454
|
+
onChainPackageId: onChainCap.package
|
|
455
|
+
}), 2);
|
|
456
|
+
publishedAtPackageId = onChainCap.package;
|
|
457
|
+
contractData.lastDeployedPackageId = onChainCap.package;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (!publishedAtPackageId) {
|
|
412
462
|
throw new GeneralError("commands", "commands.deploy.noPreviousDeploymentForUpgrade");
|
|
413
463
|
}
|
|
414
464
|
const moveTomlPaths = [];
|
|
@@ -424,8 +474,8 @@ async function executeContractUpgrade(contractData, config) {
|
|
|
424
474
|
const projectRoot = path.dirname(moveTomlPath);
|
|
425
475
|
const backupPath = await backupMoveToml(moveTomlPath);
|
|
426
476
|
try {
|
|
427
|
-
// Update Move.toml with "published-at" =
|
|
428
|
-
await updateMoveTomlPublishedAt(moveTomlPath,
|
|
477
|
+
// Update Move.toml with "published-at" = validated package ID (from chain or JSON)
|
|
478
|
+
await updateMoveTomlPublishedAt(moveTomlPath, publishedAtPackageId);
|
|
429
479
|
await validateContractIsBuilt(contractData, projectRoot);
|
|
430
480
|
// Execute upgrade command
|
|
431
481
|
const upgradeCapabilityId = contractData.upgradeCapabilityId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { promises as fsPromises } from \"node:fs\";\nimport path from \"node:path\";\nimport { IotaClient } from \"@iota/iota-sdk/client\";\nimport { requestIotaFromFaucetV0 } from \"@iota/iota-sdk/faucet\";\nimport { CLIDisplay, CLIParam, CLIUtils } from \"@twin.org/cli-core\";\nimport { Converter, GeneralError, Guards, I18n, Is, RandomHelper } from \"@twin.org/core\";\nimport { Bip39, Bip44 } from \"@twin.org/crypto\";\nimport {\n\tIota,\n\tNetworkTypes,\n\ttype IContractData,\n\ttype ISmartContractDeployments\n} from \"@twin.org/dlt-iota\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { Command } from \"commander\";\nimport type { INetworkConfig } from \"../models/INetworkConfig.js\";\nimport { cleanBuildArtifactsInPath } from \"../utils/buildArtifactUtils.js\";\nimport { ensureEnvironment, execAsyncWithError } from \"../utils/environmentUtils.js\";\nimport {\n\tgetDeploymentMnemonic,\n\tgetDeploymentSeed,\n\tvalidateDeploymentEnvironment\n} from \"../utils/envSetup.js\";\nimport { verifyIotaSDK } from \"../utils/iotaUtils.js\";\nimport { searchDirectoryForMoveToml } from \"../utils/moveToJsonUtils.js\";\n\n/**\n * Build the deploy command.\n * @param program The command program.\n */\nexport function buildCommandDeploy(program: Command): void {\n\tprogram\n\t\t.command(\"deploy\")\n\t\t.description(I18n.formatMessage(\"commands.deploy.description\"))\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.contracts.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.contracts.description\"),\n\t\t\t\"smart-contract-deployments.json\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.dryRun.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.dryRun.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.force.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.force.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcUrl.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcUrl.description\"),\n\t\t\t\"!RPC_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.addressIndex.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.addressIndex.description\"),\n\t\t\t\"!ADDRESS_INDEX\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcTimeout.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcTimeout.description\"),\n\t\t\t\"!RPC_TIMEOUT\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.gasBudget.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.gasBudget.description\"),\n\t\t\t\"!GAS_BUDGET\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.confirmationTimeout.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.confirmationTimeout.description\"),\n\t\t\t\"!CONFIRMATION_TIMEOUT\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.faucetUrl.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.faucetUrl.description\"),\n\t\t\t\"!FAUCET_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerMnemonic.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerMnemonic.description\"),\n\t\t\t\"!DEPLOYER_MNEMONIC\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerSeed.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerSeed.description\"),\n\t\t\t\"!DEPLOYER_SEED\"\n\t\t)\n\t\t.action(actionCommandDeploy);\n}\n\n/**\n * Action for the deploy command.\n * @param opts Command options.\n * @param opts.contracts Path to compiled modules JSON.\n * @param opts.network Network identifier - optional if NETWORK env var is set.\n * @param opts.dryRun Simulate deployment without executing.\n * @param opts.force Force redeployment of existing packages.\n * @param opts.rpcUrl RPC endpoint URL for the network.\n * @param opts.addressIndex Address index for key derivation.\n * @param opts.rpcTimeout RPC request timeout in milliseconds.\n * @param opts.gasBudget Gas budget for transactions.\n * @param opts.confirmationTimeout Transaction confirmation timeout in milliseconds.\n * @param opts.faucetUrl Faucet URL for requesting test tokens.\n * @param opts.deployerMnemonic Deployer wallet mnemonic phrase.\n * @param opts.deployerSeed Deployer wallet seed (alternative to mnemonic).\n */\nexport async function actionCommandDeploy(opts: {\n\tcontracts?: string;\n\tnetwork?: NetworkTypes;\n\tdryRun?: boolean;\n\tforce?: boolean;\n\trpcUrl?: string;\n\taddressIndex?: string;\n\trpcTimeout?: string;\n\tgasBudget?: string;\n\tconfirmationTimeout?: string;\n\tfaucetUrl?: string;\n\tdeployerMnemonic?: string;\n\tdeployerSeed?: string;\n}): Promise<void> {\n\tconst network = CLIParam.arrayOneOf<NetworkTypes>(\n\t\t\"network\",\n\t\topts.network,\n\t\tObject.values(NetworkTypes),\n\t\ttrue\n\t);\n\n\tconst contractsPath = opts.contracts ?? \"smart-contract-deployments.json\";\n\tconst dryRun = opts.dryRun ?? false;\n\tconst force = opts.force ?? false;\n\n\tCLIDisplay.section(I18n.formatMessage(\"commands.deploy.section.deployContracts\"));\n\tCLIDisplay.section(contractsPath);\n\n\t// Verify the IOTA SDK before we do anything else\n\tawait verifyIotaSDK();\n\n\t// Get configuration values needed for environment setup\n\tconst rpcUrl: string = CLIParam.stringValue(\"rpcUrl\", opts.rpcUrl);\n\tconst addressIndex = CLIParam.number(\"addressIndex\", opts.addressIndex) ?? 0;\n\tconst rpcTimeout = CLIParam.number(\"rpcTimeout\", opts.rpcTimeout);\n\tconst gasBudget = CLIParam.number(\"gasBudget\", opts.gasBudget);\n\tconst confirmationTimeout = CLIParam.number(\"confirmationTimeout\", opts.confirmationTimeout);\n\tconst faucetUrl: string | undefined =\n\t\tnetwork === NetworkTypes.Mainnet\n\t\t\t? undefined\n\t\t\t: CLIParam.stringValue(\"faucetUrl\", opts.faucetUrl);\n\n\tlet deployerMnemonic: string | undefined;\n\ttry {\n\t\tdeployerMnemonic = CLIParam.stringValue(\"deployerMnemonic\", opts.deployerMnemonic);\n\t} catch {\n\t\t// Optional parameter, can be undefined\n\t\tdeployerMnemonic = undefined;\n\t}\n\n\tlet deployerSeed: string | undefined;\n\ttry {\n\t\tdeployerSeed = CLIParam.stringValue(\"deployerSeed\", opts.deployerSeed);\n\t} catch {\n\t\t// Optional parameter, can be undefined\n\t\tdeployerSeed = undefined;\n\t}\n\n\t// Validate that at least one deployer credential is provided\n\tconst hasValidMnemonic = Is.stringValue(deployerMnemonic);\n\tconst hasValidSeed = Is.stringValue(deployerSeed);\n\n\tif (!hasValidMnemonic && !hasValidSeed) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.deployerCredentialRequired\", {\n\t\t\tnetwork\n\t\t});\n\t}\n\n\t// Check/switch to target network environment BEFORE loading config\n\tawait setIotaEnvironment(network, rpcUrl, addressIndex, dryRun, deployerMnemonic, deployerSeed);\n\n\tconst config = await createNetworkConfig(\n\t\tnetwork,\n\t\trpcUrl,\n\t\taddressIndex,\n\t\trpcTimeout,\n\t\tgasBudget,\n\t\tconfirmationTimeout\n\t);\n\tvalidateNetworkConfig(config, network);\n\n\tconst contractsData = await loadCompiledContracts(contractsPath);\n\n\tif (network === NetworkTypes.Mainnet) {\n\t\tconst validatedMnemonic = await getDeploymentMnemonic(\n\t\t\tnetwork,\n\t\t\thasValidMnemonic ? deployerMnemonic : undefined\n\t\t);\n\t\tawait validateDeploymentEnvironment(network, validatedMnemonic);\n\t}\n\n\tconst networkContracts = contractsData[network];\n\tif (!Is.object<IContractData>(networkContracts)) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noContractsFound\", {\n\t\t\tnetwork,\n\t\t\tcontractsPath\n\t\t});\n\t}\n\n\tawait deployContract(\n\t\t\"contract\",\n\t\tnetworkContracts,\n\t\tconfig,\n\t\tnetwork,\n\t\tdryRun,\n\t\tforce,\n\t\tfaucetUrl,\n\t\tdeployerMnemonic,\n\t\tdeployerSeed\n\t);\n\n\tif (!dryRun) {\n\t\tawait updateContractsFile(contractsPath, contractsData);\n\t}\n\n\tCLIDisplay.done();\n}\n\n/**\n * Switch IOTA CLI to the target network environment and set the active address.\n * @param network Target network to switch to\n * @param rpcUrl The RPC URL for the network\n * @param addressIndex The address index to derive the target address\n * @param dryRun Whether this is a dry run (checks environment but doesn't switch)\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function setIotaEnvironment(\n\tnetwork: NetworkTypes,\n\trpcUrl: string,\n\taddressIndex: number,\n\tdryRun: boolean = false,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\ttry {\n\t\tCLIDisplay.task(\n\t\t\tdryRun\n\t\t\t\t? I18n.formatMessage(\"commands.deploy.progress.checkingEnvironment\")\n\t\t\t\t: I18n.formatMessage(\"commands.deploy.progress.settingEnvironment\")\n\t\t);\n\n\t\t// Ensure environment exists, create if necessary\n\t\tGuards.stringValue(\"setIotaEnvironment\", nameof(rpcUrl), rpcUrl);\n\n\t\tawait ensureEnvironment(network, rpcUrl);\n\n\t\tif (dryRun) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.iotaEnvironmentCheck\"),\n\t\t\t\t`✅ ${network} environment exists`,\n\t\t\t\t1\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Derive the target address from existing mnemonic/seed\n\t\tconst targetAddress = await getDeploymentWalletAddress(\n\t\t\tnetwork,\n\t\t\taddressIndex,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\n\t\t// Ensure the correct deployer key exists in the keystore\n\t\tconst aliasName = `deployer-${network}`;\n\t\tconst validatedMnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\t\tawait ensureCorrectDeployerKey(\n\t\t\tnetwork,\n\t\t\taliasName,\n\t\t\ttargetAddress,\n\t\t\taddressIndex,\n\t\t\tvalidatedMnemonic\n\t\t);\n\n\t\t// Switch both environment and address in one command\n\t\tawait execAsyncWithError(`iota client switch --env ${network} --address ${targetAddress}`);\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.switchedIotaEnvironment\"),\n\t\t\tnetwork,\n\t\t\t1\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.switchedActiveAddress\"),\n\t\t\ttargetAddress,\n\t\t\t1\n\t\t);\n\n\t\t// Verify the switch was successful\n\t\tconst { stdout: activeEnv } = await execAsyncWithError(\"iota client active-env\");\n\t\tif (!activeEnv.includes(network)) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.environmentSwitchFailed\", {\n\t\t\t\tnetwork,\n\t\t\t\tactiveEnv\n\t\t\t});\n\t\t}\n\n\t\t// Verify address switch was successful\n\t\tconst { stdout: activeAddressOutput } = await execAsyncWithError(\"iota client active-address\");\n\t\tconst activeAddress = activeAddressOutput.trim();\n\t\tif (activeAddress !== targetAddress) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.addressSwitchFailed\", {\n\t\t\t\tnetwork,\n\t\t\t\ttargetAddress,\n\t\t\t\tactiveAddress\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.environmentOperationFailed\",\n\t\t\t{ network, operation: dryRun ? \"check\" : \"switch to\" },\n\t\t\terror\n\t\t);\n\t}\n}\n\n/**\n * Creates the network configuration.\n * @param network Target network to determine which env file to load.\n * @param rpcUrl The RPC URL for the network.\n * @param addressIndex The address index for the wallet.\n * @param rpcTimeout The RPC timeout in milliseconds.\n * @param gasBudget The gas budget for deployment.\n * @param confirmationTimeout The confirmation timeout in seconds.\n * @returns Network configuration.\n */\nasync function createNetworkConfig(\n\tnetwork: NetworkTypes,\n\trpcUrl: string,\n\taddressIndex: number,\n\trpcTimeout?: number,\n\tgasBudget?: number,\n\tconfirmationTimeout?: number\n): Promise<INetworkConfig> {\n\ttry {\n\t\tGuards.stringValue(\"createNetworkConfig\", nameof(rpcUrl), rpcUrl);\n\n\t\tconst config: INetworkConfig = {\n\t\t\tnetwork,\n\t\t\tplatform: \"iota\",\n\t\t\trpc: {\n\t\t\t\turl: rpcUrl,\n\t\t\t\ttimeout: rpcTimeout ?? 60000\n\t\t\t},\n\t\t\tdeployment: {\n\t\t\t\tgasBudget: gasBudget ?? 50000000,\n\t\t\t\tconfirmationTimeout: confirmationTimeout ?? 60,\n\t\t\t\twallet: {\n\t\t\t\t\taddressIndex\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn config;\n\t} catch (err) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.networkConfigInvalid\", { network }, err);\n\t}\n}\n\n/**\n * Validate network configuration matches expected network.\n * @param config Network configuration.\n * @param expectedNetwork Expected network type.\n * @throws GeneralError if the network configuration is invalid.\n */\nfunction validateNetworkConfig(config: INetworkConfig, expectedNetwork: NetworkTypes): void {\n\tif (config.network !== expectedNetwork) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.networkMismatch\", {\n\t\t\texpected: expectedNetwork,\n\t\t\tactual: config.network,\n\t\t\thelp: `Configuration file specifies '${config.network}' but command targets '${expectedNetwork}'`\n\t\t});\n\t}\n\n\tif (!Is.stringValue(config.rpc?.url)) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.rpcUrlRequired\", {\n\t\t\tnetwork: expectedNetwork\n\t\t});\n\t}\n\n\tif (!Is.number(config.deployment?.gasBudget)) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.gasBudgetRequired\", {\n\t\t\tnetwork: expectedNetwork\n\t\t});\n\t}\n}\n\n/**\n * Load compiled contracts from file.\n * @param contractsPath Path to contracts file.\n * @returns Compiled contracts data.\n */\nasync function loadCompiledContracts(contractsPath: string): Promise<ISmartContractDeployments> {\n\ttry {\n\t\tif (!(await CLIUtils.fileExists(contractsPath))) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.contractsFileNotFound\", {\n\t\t\t\tcontractsPath\n\t\t\t});\n\t\t}\n\n\t\tconst contracts = await CLIUtils.readJsonFile<ISmartContractDeployments>(contractsPath);\n\n\t\tif (!Is.object(contracts)) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.invalidContractsFile\");\n\t\t}\n\n\t\treturn contracts;\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.contractsLoadFailed\",\n\t\t\t{ contractsPath },\n\t\t\terr\n\t\t);\n\t}\n}\n\n/**\n * Validate environment and setup for deployment based on network type.\n * @param network Target network.\n * @param config Network configuration.\n * @param isDryRun Whether this is a dry run.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic for validation.\n * @param deployerSeed The deployer seed (optional).\n * @returns Wallet address for the deployment.\n */\nasync function validateEnvironmentForNetwork(\n\tnetwork: NetworkTypes,\n\tconfig: INetworkConfig,\n\tisDryRun: boolean = false,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<string> {\n\tconst walletAddress = await getDeploymentWalletAddress(\n\t\tnetwork,\n\t\tconfig.deployment.wallet.addressIndex,\n\t\tdeployerMnemonic,\n\t\tdeployerSeed\n\t);\n\n\tif (isDryRun) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.dryRunWalletAddress\"),\n\t\t\twalletAddress,\n\t\t\t1\n\t\t);\n\t} else {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.walletAddress\"), walletAddress, 1);\n\t}\n\n\tif (network === NetworkTypes.Mainnet) {\n\t\tconst validatedMnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\t\tawait validateDeploymentEnvironment(network, validatedMnemonic);\n\t} else if ((network === NetworkTypes.Testnet || network === NetworkTypes.Devnet) && !isDryRun) {\n\t\t// For testnet/devnet, check balance first and only request funds if needed\n\t\tawait checkBalanceAndRequestFaucetIfNeeded(network, config, walletAddress, faucetUrl);\n\t}\n\n\treturn walletAddress;\n}\n\n/**\n * Check wallet balance and display relevant information.\n * @param network Target network.\n * @param config Network configuration.\n * @param walletAddress Wallet address.\n * @param isDryRun Whether this is a dry run.\n * @returns Balance in nanos.\n */\nasync function checkWalletBalance(\n\tnetwork: NetworkTypes,\n\tconfig: INetworkConfig,\n\twalletAddress: string,\n\tisDryRun: boolean = false\n): Promise<number> {\n\tconst client = new IotaClient({ url: config.rpc.url });\n\tconst balanceResponse = await client.getBalance({ owner: walletAddress });\n\tconst balanceInNanos = Number(balanceResponse.totalBalance);\n\tconst requiredInNanos = config.deployment.gasBudget;\n\n\tconst balanceInIota = nanosToIota(balanceInNanos);\n\tconst requiredInIota = nanosToIota(requiredInNanos);\n\n\tconst balanceLabel = isDryRun\n\t\t? \"commands.deploy.labels.dryRunWalletBalance\"\n\t\t: \"commands.deploy.labels.walletBalance\";\n\tconst gasBudgetLabel = isDryRun\n\t\t? \"commands.deploy.labels.dryRunGasBudget\"\n\t\t: \"commands.deploy.labels.gasBudget\";\n\n\tCLIDisplay.value(I18n.formatMessage(balanceLabel), `${balanceInIota.toFixed(2)} IOTA`, 1);\n\tCLIDisplay.value(I18n.formatMessage(gasBudgetLabel), `${requiredInIota.toFixed(2)} IOTA`, 1);\n\n\t// Handle insufficient balance based on network and run type (compare in same units - nanos)\n\tif (balanceInNanos < requiredInNanos) {\n\t\tif (isDryRun) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.insufficientBalanceWarning\", {\n\t\t\t\t\tcurrentBalance: balanceInIota.toFixed(2),\n\t\t\t\t\trequiredBalance: requiredInIota.toFixed(2)\n\t\t\t\t}),\n\t\t\t\t2\n\t\t\t);\n\t\t} else if (network === NetworkTypes.Mainnet) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.insufficientBalance\", {\n\t\t\t\tbalance: balanceInIota,\n\t\t\t\trequired: requiredInIota,\n\t\t\t\twalletAddress\n\t\t\t});\n\t\t} else {\n\t\t\t// For testnet/devnet, show warning but continue\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.insufficientBalanceAfterFaucet\", {\n\t\t\t\t\tnetwork,\n\t\t\t\t\tbalance: balanceInIota.toFixed(2),\n\t\t\t\t\trequired: requiredInIota.toFixed(2),\n\t\t\t\t\twalletAddress\n\t\t\t\t}),\n\t\t\t\t2\n\t\t\t);\n\t\t}\n\t}\n\n\treturn balanceInNanos;\n}\n\n/**\n * Handle dry run validation and display.\n * @param contractName Name of the contract.\n * @param contractData Contract data.\n * @param config Network configuration.\n * @param network Target network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function handleDryRunValidation(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.dryRunWouldDeploy\"),\n\t\t`${contractName} (${network})`,\n\t\t1\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.dryRunPackageId\"),\n\t\tcontractData.packageId,\n\t\t1\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.dryRunRpcUrl\"), config.rpc.url, 1);\n\n\ttry {\n\t\tconst walletAddress = await validateEnvironmentForNetwork(\n\t\t\tnetwork,\n\t\t\tconfig,\n\t\t\ttrue,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t\tawait checkWalletBalance(network, config, walletAddress, true);\n\t} catch (err) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.environmentValidationWarning\", {\n\t\t\t\tmessage: (err as Error).message\n\t\t\t}),\n\t\t\t2\n\t\t);\n\t}\n}\n\n/**\n * Handle actual deployment execution.\n * @param contractName Name of the contract.\n * @param contractData Contract data.\n * @param config Network configuration.\n * @param network Target network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function handleActualDeployment(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\ttry {\n\t\tconst walletAddress = await validateEnvironmentForNetwork(\n\t\t\tnetwork,\n\t\t\tconfig,\n\t\t\tfalse,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t\tawait checkWalletBalance(network, config, walletAddress, false);\n\n\t\tconst deploymentResult = await deployWithIotaCli(config.deployment.gasBudget);\n\n\t\tcontractData.deployedPackageId = deploymentResult.packageId;\n\t\tcontractData.upgradeCapabilityId = deploymentResult.upgradeCap;\n\n\t\tif (deploymentResult.migrationStateId) {\n\t\t\tcontractData.migrationStateId = deploymentResult.migrationStateId;\n\t\t}\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.deployedPackageIdResult\"),\n\t\t\tdeploymentResult.packageId,\n\t\t\t1\n\t\t);\n\t\tif (deploymentResult.upgradeCap) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeCapabilityIdResult\"),\n\t\t\t\tdeploymentResult.upgradeCap,\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t\tif (contractData.migrationStateId) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.migrationStateIdResult\"),\n\t\t\t\tcontractData.migrationStateId,\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.deploymentFailed\",\n\t\t\t{ contract: contractName },\n\t\t\terr\n\t\t);\n\t}\n}\n\n/**\n * Determine the deployment strategy based on contract state.\n * @param contractData Contract data to analyze.\n * @returns Deployment strategy: initial-deploy, upgrade or already-deployed.\n */\nasync function determineDeploymentStrategy(\n\tcontractData: IContractData\n): Promise<\"initial-deploy\" | \"upgrade\" | \"already-deployed\"> {\n\tif (Is.stringValue(contractData.deployedPackageId)) {\n\t\treturn \"already-deployed\";\n\t}\n\n\tif (Is.stringValue(contractData.lastDeployedPackageId)) {\n\t\treturn \"upgrade\";\n\t}\n\n\treturn \"initial-deploy\";\n}\n\n/**\n * Execute contract upgrade using iota client upgrade command.\n * @param contractData Contract data containing upgrade capability.\n * @param config Network configuration.\n * @returns Upgrade result with package ID and upgrade capability.\n */\nasync function executeContractUpgrade(\n\tcontractData: IContractData,\n\tconfig: INetworkConfig\n): Promise<{ packageId: string; upgradeCap: string; migrationStateId?: string }> {\n\t// Store the previous deployedPackageId for \"published-at\" field in Move.toml\n\t// Use lastDeployedPackageId which tracks the previous deployment for upgrade chain\n\tconst previousDeployedPackageId = contractData.lastDeployedPackageId;\n\tif (!previousDeployedPackageId) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noPreviousDeploymentForUpgrade\");\n\t}\n\n\tconst moveTomlPaths: string[] = [];\n\tawait searchDirectoryForMoveToml(process.cwd(), moveTomlPaths);\n\n\tif (moveTomlPaths.length === 0) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noMoveTomlFilesFound\", {\n\t\t\tcurrentDir: process.cwd()\n\t\t});\n\t}\n\n\tconst currentDirMoveToml = path.join(process.cwd(), \"Move.toml\");\n\tconst selectedMoveToml = moveTomlPaths.find(p => p === currentDirMoveToml) ?? moveTomlPaths[0];\n\tconst moveTomlPath = selectedMoveToml;\n\tconst projectRoot = path.dirname(moveTomlPath);\n\n\tconst backupPath = await backupMoveToml(moveTomlPath);\n\n\ttry {\n\t\t// Update Move.toml with \"published-at\" = previous deployedPackageId\n\t\tawait updateMoveTomlPublishedAt(moveTomlPath, previousDeployedPackageId);\n\n\t\tawait validateContractIsBuilt(contractData, projectRoot);\n\n\t\t// Execute upgrade command\n\t\tconst upgradeCapabilityId = contractData.upgradeCapabilityId;\n\t\tif (!upgradeCapabilityId) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.upgradeCapabilityNotFound\");\n\t\t}\n\t\tconst upgradeResult = await executeUpgradeWithIotaCli(\n\t\t\tupgradeCapabilityId,\n\t\t\tconfig.deployment.gasBudget,\n\t\t\tprojectRoot\n\t\t);\n\n\t\t// Update contract data with new package ID\n\t\tcontractData.deployedPackageId = upgradeResult.packageId;\n\n\t\treturn upgradeResult;\n\t} finally {\n\t\t// Always restore original Move.toml\n\t\tawait restoreMoveToml(moveTomlPath, backupPath);\n\t}\n}\n\n/**\n * Execute upgrade using iota client upgrade command.\n * @param upgradeCapabilityId Upgrade capability ID.\n * @param gasBudget Gas budget for upgrade.\n * @param moveProjectRoot Move project root directory.\n * @returns Upgrade result.\n */\nasync function executeUpgradeWithIotaCli(\n\tupgradeCapabilityId: string,\n\tgasBudget: number,\n\tmoveProjectRoot: string\n): Promise<{ packageId: string; upgradeCap: string; migrationStateId?: string }> {\n\t// Clean build artifacts and lock files before upgrade to prevent permission issues\n\tawait cleanBuildArtifactsInPath(moveProjectRoot);\n\n\tconst upgradeCmd = `iota client upgrade --upgrade-capability ${upgradeCapabilityId} . --gas-budget ${gasBudget} --json`;\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.publishCommand\"), upgradeCmd, 1);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.workingDirectory\"),\n\t\tmoveProjectRoot,\n\t\t1\n\t);\n\n\ttry {\n\t\tconst { stdout: output } = await execAsyncWithError(upgradeCmd, {\n\t\t\tcwd: moveProjectRoot\n\t\t});\n\t\tconst result = JSON.parse(output);\n\n\t\t// Parse upgrade response (different from publish response)\n\t\tconst packageId = result.objectChanges?.find(\n\t\t\t(change: { type: string; packageId?: string }) => change.type === \"published\"\n\t\t)?.packageId;\n\n\t\tif (!packageId) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.upgradePackageIdNotFound\", { result });\n\t\t}\n\n\t\t// UpgradeCap persists with same ID\n\t\tconst upgradeCap = upgradeCapabilityId;\n\n\t\treturn { packageId, upgradeCap };\n\t} catch (err) {\n\t\t// Clean up on error too\n\t\tawait cleanBuildArtifactsInPath(moveProjectRoot);\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.upgradeFailed\", undefined, err);\n\t}\n}\n\n/**\n * Backup Move.toml file.\n * @param moveTomlPath Path to Move.toml file.\n * @returns Path to backup file.\n */\nasync function backupMoveToml(moveTomlPath: string): Promise<string> {\n\tconst backupPath = `${moveTomlPath}.backup.${Date.now()}`;\n\tawait fsPromises.copyFile(moveTomlPath, backupPath);\n\treturn backupPath;\n}\n\n/**\n * Restore Move.toml file from backup.\n * @param moveTomlPath Path to Move.toml file.\n * @param backupPath Path to backup file.\n */\nasync function restoreMoveToml(moveTomlPath: string, backupPath: string): Promise<void> {\n\tawait fsPromises.copyFile(backupPath, moveTomlPath);\n\tawait fsPromises.unlink(backupPath);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.moveTomlRestored\"),\n\t\tI18n.formatMessage(\"commands.deploy.messages.originalConfigurationRestored\"),\n\t\t1\n\t);\n}\n\n/**\n * Update Move.toml published-at field.\n * @param moveTomlPath Path to Move.toml file.\n * @param publishedAt Published-at value to set.\n */\nasync function updateMoveTomlPublishedAt(moveTomlPath: string, publishedAt: string): Promise<void> {\n\tconst content = await fsPromises.readFile(moveTomlPath, \"utf-8\");\n\n\t// Parse TOML and update \"published-at\" field\n\tconst lines = content.split(\"\\n\");\n\tlet updated = false;\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tif (lines[i].trim().startsWith(\"published-at\")) {\n\t\t\tlines[i] = `published-at = \"${publishedAt}\"`;\n\t\t\tupdated = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!updated) {\n\t\t// Add \"published-at\" to \"[package]\" section\n\t\tconst packageSectionIndex = lines.findIndex(line => line.trim() === \"[package]\");\n\t\tif (packageSectionIndex >= 0) {\n\t\t\tlines.splice(packageSectionIndex + 1, 0, `published-at = \"${publishedAt}\"`);\n\t\t}\n\t}\n\n\tawait fsPromises.writeFile(moveTomlPath, lines.join(\"\\n\"));\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.moveTomlUpdated\"),\n\t\t`published-at = \"${publishedAt}\"`,\n\t\t1\n\t);\n}\n\n/**\n * Validate that contract has been built.\n * @param contractData Contract data to validate.\n * @param projectRoot Project root directory.\n */\nasync function validateContractIsBuilt(\n\tcontractData: IContractData,\n\tprojectRoot: string\n): Promise<void> {\n\t// Check if build directory exists and has been built\n\tconst buildDir = path.join(projectRoot, \"build\");\n\ttry {\n\t\tconst stats = await fsPromises.stat(buildDir);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.buildPathNotDirectory\", {\n\t\t\t\tbuildDir\n\t\t\t});\n\t\t}\n\t} catch {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.contractNotBuilt\", {\n\t\t\tprojectRoot\n\t\t});\n\t}\n\n\t// Verify that the contract data has current packageId (build should have been run)\n\tif (!contractData.packageId || !contractData.packageBytecode) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.contractDataOutdated\");\n\t}\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.buildValidation\"),\n\t\tI18n.formatMessage(\"commands.deploy.messages.contractBuiltAndReadyForUpgrade\"),\n\t\t1\n\t);\n}\n\n/**\n * Handle contract upgrade execution.\n * @param contractName Name of the contract.\n * @param contractData Contract data.\n * @param config Network configuration.\n * @param network Target network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function handleContractUpgrade(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\tCLIDisplay.task(`Upgrading contract: ${contractName}`);\n\n\tconst walletAddress = await validateEnvironmentForNetwork(\n\t\tnetwork,\n\t\tconfig,\n\t\tfalse,\n\t\tfaucetUrl,\n\t\tdeployerMnemonic,\n\t\tdeployerSeed\n\t);\n\tawait checkWalletBalance(network, config, walletAddress, false);\n\n\tconst upgradeResult = await executeContractUpgrade(contractData, config);\n\n\t// Update contract data with upgrade chain tracking\n\tcontractData.deployedPackageId = upgradeResult.packageId;\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeSuccessful\"),\n\t\tupgradeResult.packageId,\n\t\t1\n\t);\n\tif (contractData.lastDeployedPackageId) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.previousDeployment\"),\n\t\t\tcontractData.lastDeployedPackageId,\n\t\t\t1\n\t\t);\n\t}\n\tif (contractData.upgradeCapabilityId) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeCapabilityPreserved\"),\n\t\t\tcontractData.upgradeCapabilityId,\n\t\t\t1\n\t\t);\n\t}\n}\n\n/**\n * Deploy a single contract.\n * @param contractName Name of the contract\n * @param contractData Contract compilation data\n * @param contractData.packageId Package ID\n * @param contractData.packageBytecode Package bytecode\n * @param contractData.deployedPackageId Deployed package ID\n * @param config Network configuration\n * @param network Target network\n * @param dryRun Whether this is a dry run\n * @param force Whether to force redeployment\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function deployContract(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tdryRun: boolean,\n\tforce: boolean,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.deploy.progress.deployingContract\", { contractName, network })\n\t);\n\n\tconst strategy = await determineDeploymentStrategy(contractData);\n\n\tif (strategy === \"already-deployed\" && !force) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.contractStatus\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.contractAlreadyDeployed\"),\n\t\t\t1\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeGuidance\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.upgradeGuidanceMessage\"),\n\t\t\t1\n\t\t);\n\t\treturn;\n\t}\n\n\t// Show deployment strategy\n\tCLIDisplay.section(I18n.formatMessage(\"commands.deploy.labels.smartDeployAnalysis\"));\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeCapability\"),\n\t\tcontractData.upgradeCapabilityId ??\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.noneInitialDeployment\")\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.currentDeployment\"),\n\t\tcontractData.deployedPackageId ??\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.noneNeedsDeploymentUpgrade\")\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.detectedStrategy\"), strategy);\n\n\tif (dryRun) {\n\t\tawait handleDryRunValidation(\n\t\t\tcontractName,\n\t\t\tcontractData,\n\t\t\tconfig,\n\t\t\tnetwork,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t\treturn;\n\t}\n\n\tif (strategy === \"upgrade\") {\n\t\tawait handleContractUpgrade(\n\t\t\tcontractName,\n\t\t\tcontractData,\n\t\t\tconfig,\n\t\t\tnetwork,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t} else {\n\t\tawait handleActualDeployment(\n\t\t\tcontractName,\n\t\t\tcontractData,\n\t\t\tconfig,\n\t\t\tnetwork,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t}\n}\n\n/**\n * Get wallet address for deployment, preferring seed over mnemonic if available.\n * @param network The target network.\n * @param addressIndex The address index to derive.\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n * @returns The wallet address.\n */\nasync function getDeploymentWalletAddress(\n\tnetwork: NetworkTypes,\n\taddressIndex: number,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<string> {\n\t// Try to use seed first if available\n\tconst hexSeed = await getDeploymentSeed(network, deployerSeed);\n\tlet seed: Uint8Array | undefined;\n\tif (Is.stringValue(hexSeed)) {\n\t\tseed = Converter.hexToBytes(hexSeed);\n\t} else {\n\t\tconst mnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\t\tseed = Bip39.mnemonicToSeed(mnemonic);\n\t}\n\n\tconst addresses = Iota.getAddresses(seed, Iota.DEFAULT_COIN_TYPE, 0, addressIndex, 1, false);\n\n\treturn addresses[0];\n}\n\n/**\n * Convert nanos to IOTA (1 IOTA = 1,000,000,000 nanos).\n * @param nanos Balance in nanos.\n * @returns Balance in IOTA.\n */\nfunction nanosToIota(nanos: number): number {\n\treturn nanos / 1_000_000_000;\n}\n\n/**\n * Request funds from the faucet for testnet or devnet deployment.\n * @param network The target network (testnet or devnet).\n * @param walletAddress The wallet address to fund.\n * @param rpcUrl The RPC URL for the network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @returns Promise that resolves when funding is complete.\n */\nasync function requestFaucetFunds(\n\tnetwork: NetworkTypes,\n\twalletAddress: string,\n\trpcUrl: string,\n\tfaucetUrl: string\n): Promise<void> {\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.deploy.progress.requestingFaucetFunds\", { network })\n\t);\n\n\tconst response = await requestIotaFromFaucetV0({\n\t\thost: faucetUrl,\n\t\trecipient: walletAddress\n\t});\n\n\tif (response?.error) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.fundingFailed\", undefined, response.error);\n\t}\n\n\tconst client = new IotaClient({ url: rpcUrl });\n\tconst balanceResponse = await client.getBalance({ owner: walletAddress });\n\tconst balanceInNanos = Number(balanceResponse.totalBalance);\n\n\tif (balanceInNanos > 0) {\n\t\tconst amountInIota = nanosToIota(balanceInNanos);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.faucetFundsRequested\"),\n\t\t\t`${amountInIota.toFixed(2)} IOTA`,\n\t\t\t1\n\t\t);\n\t} else {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.faucetNoFundsAdded\", { network }),\n\t\t\t2\n\t\t);\n\t}\n}\n\n/**\n * Check wallet balance and request faucet funds only if needed.\n * @param network The target network (testnet or devnet).\n * @param config Network configuration.\n * @param walletAddress The wallet address to check and potentially fund.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @returns Promise that resolves when balance check and optional funding is complete.\n */\nasync function checkBalanceAndRequestFaucetIfNeeded(\n\tnetwork: NetworkTypes,\n\tconfig: INetworkConfig,\n\twalletAddress: string,\n\tfaucetUrl?: string\n): Promise<void> {\n\t// Check current balance\n\tconst client = new IotaClient({ url: config.rpc.url });\n\tconst balanceResponse = await client.getBalance({ owner: walletAddress });\n\tconst balanceInNanos = Number(balanceResponse.totalBalance);\n\tconst requiredInNanos = config.deployment.gasBudget;\n\t// Convert to IOTA for display purposes\n\tconst balanceInIota = nanosToIota(balanceInNanos);\n\tconst requiredInIota = nanosToIota(requiredInNanos);\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.walletBalance\"),\n\t\t`${balanceInIota.toFixed(2)} IOTA`,\n\t\t1\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.gasBudget\"),\n\t\t`${requiredInIota.toFixed(2)} IOTA`,\n\t\t1\n\t);\n\n\t// Only request faucet funds if balance is insufficient (compare in same units - nanos)\n\tif (balanceInNanos < requiredInNanos) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.insufficientBalance\", {\n\t\t\t\tcurrentBalance: balanceInIota.toFixed(2),\n\t\t\t\trequiredBalance: requiredInIota.toFixed(2)\n\t\t\t}),\n\t\t\t1\n\t\t);\n\n\t\tif (!Is.stringValue(faucetUrl)) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noFaucetConfigured\");\n\t\t}\n\n\t\tCLIDisplay.task(I18n.formatMessage(\"commands.deploy.progress.requestingAdditionalFaucetFunds\"));\n\t\tawait requestFaucetFunds(network, walletAddress, config.rpc.url, faucetUrl);\n\n\t\t// Check balance again after faucet request\n\t\tconst updatedBalanceResponse = await client.getBalance({ owner: walletAddress });\n\t\tconst updatedBalanceInNanos = Number(updatedBalanceResponse.totalBalance);\n\t\tconst updatedBalanceInIota = nanosToIota(updatedBalanceInNanos);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.updatedWalletBalance\"),\n\t\t\t`${updatedBalanceInIota.toFixed(2)} IOTA`,\n\t\t\t1\n\t\t);\n\t} else {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.balanceCheck\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.sufficientFundsAvailable\"),\n\t\t\t1\n\t\t);\n\t}\n}\n\n/**\n * Deploy contract using IOTA CLI.\n * @param gasBudget Gas budget for deployment.\n * @returns Deployment result with package ID, upgrade cap, and migration state ID.\n */\nasync function deployWithIotaCli(\n\tgasBudget: number\n): Promise<{ packageId: string; upgradeCap?: string; migrationStateId?: string }> {\n\t// Find the Move project directory\n\tconst moveTomlPaths: string[] = [];\n\tconst cwd = process.cwd();\n\tawait searchDirectoryForMoveToml(cwd, moveTomlPaths);\n\n\tif (moveTomlPaths.length === 0) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noMoveTomlFilesFound\", {\n\t\t\tcurrentDir: cwd\n\t\t});\n\t}\n\n\t// Prioritize Move.toml in current directory, then use first found\n\tconst currentDirMoveToml = path.join(cwd, \"Move.toml\");\n\tconst selectedMoveToml = moveTomlPaths.find(p => p === currentDirMoveToml) ?? moveTomlPaths[0];\n\n\t// Use the actual Move project directory\n\tconst moveProjectRoot = path.dirname(selectedMoveToml);\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.moveProjectRoot\"),\n\t\tmoveProjectRoot,\n\t\t1\n\t);\n\n\tconst publishCmd = `iota client publish --gas-budget ${gasBudget} --json`;\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.publishCommand\"), publishCmd, 1);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.workingDirectory\"),\n\t\tmoveProjectRoot,\n\t\t1\n\t);\n\n\ttry {\n\t\tconst { stdout: output } = await execAsyncWithError(publishCmd, { cwd: moveProjectRoot });\n\t\tconst result = JSON.parse(output);\n\n\t\t// Extract package ID from published object\n\t\tconst packageId = result.objectChanges?.find(\n\t\t\t(change: { type: string; packageId?: string }) => change.type === \"published\"\n\t\t)?.packageId;\n\n\t\tif (!packageId) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.packageIdNotFound\", {\n\t\t\t\tresult\n\t\t\t});\n\t\t}\n\n\t\t// Extract UpgradeCap ID from created objects\n\t\tconst upgradeCap = result.objectChanges?.find(\n\t\t\t(change: { objectType?: string; objectId?: string }) =>\n\t\t\t\tchange.objectType === \"0x2::package::UpgradeCap\"\n\t\t)?.objectId;\n\n\t\t// Extract MigrationState ID from created objects\n\t\tconst migrationStateId = result.objectChanges?.find(\n\t\t\t(change: { objectType?: string; objectId?: string }) =>\n\t\t\t\tchange.objectType?.endsWith(\"::MigrationState\")\n\t\t)?.objectId;\n\n\t\treturn {\n\t\t\tpackageId,\n\t\t\tupgradeCap,\n\t\t\tmigrationStateId\n\t\t};\n\t} catch (err) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.deploymentFailed\", undefined, err);\n\t}\n}\n\n/**\n * Update contracts file with deployed package IDs.\n * @param contractsPath Path to contracts file.\n * @param contractsData Updated contracts data.\n */\nasync function updateContractsFile(\n\tcontractsPath: string,\n\tcontractsData: ISmartContractDeployments\n): Promise<void> {\n\ttry {\n\t\tawait CLIUtils.writeJsonFile(contractsPath, contractsData, false);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.updatedContractsFile\"),\n\t\t\tcontractsPath,\n\t\t\t1\n\t\t);\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.contractsFileUpdateFailed\",\n\t\t\t{ contractsPath },\n\t\t\terr\n\t\t);\n\t}\n}\n\n/**\n * Generate a unique backup alias that doesn't conflict with existing keys.\n * Uses cryptographically secure random bytes to avoid conflicts.\n * @param baseAlias The original alias name.\n * @param existingKeys Array of existing keys from keystore.\n * @returns A unique backup alias name.\n */\nexport function generateUniqueBackupAlias(\n\tbaseAlias: string,\n\texistingKeys: { alias: string; iotaAddress: string }[]\n): string {\n\tconst existingAliases = new Set(existingKeys.map(key => key.alias));\n\n\t// Generate cryptographically secure random identifier\n\tconst randomSuffix = Converter.bytesToHex(RandomHelper.generate(4));\n\tconst backupAlias = `${baseAlias}-backup-${randomSuffix}`;\n\n\t// In the extremely unlikely event of collision, add timestamp\n\tif (existingAliases.has(backupAlias)) {\n\t\treturn `${baseAlias}-backup-${Date.now()}-${randomSuffix}`;\n\t}\n\n\treturn backupAlias;\n}\n\n/**\n * Ensure the correct deployer key exists in the keystore with the expected address.\n * If a conflicting alias exists, rename it and import the correct key.\n * @param network The target network.\n * @param aliasName The desired alias name (e.g., \"deployer-testnet\").\n * @param expectedAddress The expected address from the current mnemonic.\n * @param addressIndex The address index to use.\n * @param deployerMnemonic The deployer mnemonic.\n */\nexport async function ensureCorrectDeployerKey(\n\tnetwork: NetworkTypes,\n\taliasName: string,\n\texpectedAddress: string,\n\taddressIndex: number,\n\tdeployerMnemonic: string\n): Promise<void> {\n\ttry {\n\t\t// Check if the alias already exists in keystore\n\t\tconst { stdout: keysListOutput } = await execAsyncWithError(\"iota keytool list --json\");\n\t\tconst keysList = JSON.parse(keysListOutput);\n\n\t\t// Find existing key with the target alias\n\t\tconst existingKey = keysList.find(\n\t\t\t(key: { alias: string; iotaAddress: string }) => key.alias === aliasName\n\t\t);\n\n\t\tif (existingKey) {\n\t\t\t// Check if existing key has the correct address\n\t\t\tconst existingAddress = existingKey.iotaAddress;\n\n\t\t\tif (existingAddress !== expectedAddress) {\n\t\t\t\t// Conflicting alias exists with wrong mnemonic - rename it\n\t\t\t\tCLIDisplay.task(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.progress.renamingConflictingKey\", { aliasName })\n\t\t\t\t);\n\n\t\t\t\tconst backupAlias = generateUniqueBackupAlias(aliasName, keysList);\n\t\t\t\tawait execAsyncWithError(`iota keytool update-alias \"${aliasName}\" \"${backupAlias}\"`);\n\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.renamedExistingKey\"),\n\t\t\t\t\t`${aliasName} → ${backupAlias} (${existingAddress})`,\n\t\t\t\t\t1\n\t\t\t\t);\n\n\t\t\t\t// Now import the correct key with the desired alias\n\t\t\t\tawait importCorrectDeployerKey(\n\t\t\t\t\tnetwork,\n\t\t\t\t\taliasName,\n\t\t\t\t\taddressIndex,\n\t\t\t\t\texpectedAddress,\n\t\t\t\t\tdeployerMnemonic\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Existing key is correct - no action needed\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.usingExistingCorrectKey\"),\n\t\t\t\t\t`${aliasName} (${expectedAddress})`,\n\t\t\t\t\t1\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// No existing alias - import the key\n\t\t\tawait importCorrectDeployerKey(\n\t\t\t\tnetwork,\n\t\t\t\taliasName,\n\t\t\t\taddressIndex,\n\t\t\t\texpectedAddress,\n\t\t\t\tdeployerMnemonic\n\t\t\t);\n\t\t}\n\n\t\t// Verify the address exists in client addresses\n\t\tconst { stdout: addressListOutput } = await execAsyncWithError(\"iota client addresses --json\");\n\t\tconst addressInfo = JSON.parse(addressListOutput);\n\t\tconst addressExists: boolean = addressInfo.addresses.some(\n\t\t\t([_, addr]: [string, string]) => addr === expectedAddress\n\t\t);\n\n\t\tif (!addressExists) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.addressNotInClient\", {\n\t\t\t\texpectedAddress,\n\t\t\t\taliasName\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.deployerKeySetupFailed\",\n\t\t\t{ network, aliasName, expectedAddress },\n\t\t\terror\n\t\t);\n\t}\n}\n\n/**\n * Import the deployer key with the correct mnemonic.\n * @param network The target network.\n * @param aliasName The alias name to use.\n * @param addressIndex The address index.\n * @param targetAddress The expected target address (avoids redundant calculation).\n * @param deployerMnemonic The deployer mnemonic.\n */\nasync function importCorrectDeployerKey(\n\tnetwork: NetworkTypes,\n\taliasName: string,\n\taddressIndex: number,\n\ttargetAddress: string,\n\tdeployerMnemonic: string\n): Promise<void> {\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.deploy.progress.importingDeployerKey\", { aliasName })\n\t);\n\n\tconst mnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\tconst derivationPath = Bip44.path(Iota.DEFAULT_COIN_TYPE, 0, false, addressIndex).toString();\n\n\tawait execAsyncWithError(\n\t\t`iota keytool import \"${mnemonic}\" ed25519 \"${derivationPath}\" --alias \"${aliasName}\"`\n\t);\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.importedDeployerKey\"),\n\t\t`${aliasName} (${targetAddress})`,\n\t\t1\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACN,IAAI,EACJ,YAAY,EAGZ,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,6BAA6B,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAClD,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC;SAC9D,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,IAAI,CAAC,aAAa,CAAC,+CAA+C,CAAC,EACnE,iCAAiC,CACjC;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,uCAAuC,CAAC,EAC3D,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,EACjE,UAAU,CACV;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,sCAAsC,CAAC,EAC1D,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,CAChE;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,qCAAqC,CAAC,EACzD,IAAI,CAAC,aAAa,CAAC,2CAA2C,CAAC,CAC/D;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,sCAAsC,CAAC,EAC1D,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,EAChE,UAAU,CACV;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,EAChE,IAAI,CAAC,aAAa,CAAC,kDAAkD,CAAC,EACtE,gBAAgB,CAChB;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAC,EAC9D,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,EACpE,cAAc,CACd;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,IAAI,CAAC,aAAa,CAAC,+CAA+C,CAAC,EACnE,aAAa,CACb;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,mDAAmD,CAAC,EACvE,IAAI,CAAC,aAAa,CAAC,yDAAyD,CAAC,EAC7E,uBAAuB,CACvB;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,IAAI,CAAC,aAAa,CAAC,+CAA+C,CAAC,EACnE,aAAa,CACb;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,EACpE,IAAI,CAAC,aAAa,CAAC,sDAAsD,CAAC,EAC1E,oBAAoB,CACpB;SACA,MAAM,CACN,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,EAChE,IAAI,CAAC,aAAa,CAAC,kDAAkD,CAAC,EACtE,gBAAgB,CAChB;SACA,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAazC;IACA,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAClC,SAAS,EACT,IAAI,CAAC,OAAO,EACZ,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAC3B,IAAI,CACJ,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,iCAAiC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAElC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAClF,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAElC,iDAAiD;IACjD,MAAM,aAAa,EAAE,CAAC;IAEtB,wDAAwD;IACxD,MAAM,MAAM,GAAW,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7F,MAAM,SAAS,GACd,OAAO,KAAK,YAAY,CAAC,OAAO;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEtD,IAAI,gBAAoC,CAAC;IACzC,IAAI,CAAC;QACJ,gBAAgB,GAAG,QAAQ,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;QACvC,gBAAgB,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAI,YAAgC,CAAC;IACrC,IAAI,CAAC;QACJ,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;QACvC,YAAY,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,6DAA6D;IAC7D,MAAM,gBAAgB,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAElD,IAAI,CAAC,gBAAgB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,4CAA4C,EAAE;YAChF,OAAO;SACP,CAAC,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAEhG,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACvC,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,SAAS,EACT,mBAAmB,CACnB,CAAC;IACF,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAEjE,IAAI,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CACpD,OAAO,EACP,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAC/C,CAAC;QACF,MAAM,6BAA6B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,gBAAgB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAgB,gBAAgB,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,kCAAkC,EAAE;YACtE,OAAO;YACP,aAAa;SACb,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,CACnB,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,UAAU,CAAC,IAAI,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,kBAAkB,CAChC,OAAqB,EACrB,MAAc,EACd,YAAoB,EACpB,SAAkB,KAAK,EACvB,gBAAyB,EACzB,YAAqB;IAErB,IAAI,CAAC;QACJ,UAAU,CAAC,IAAI,CACd,MAAM;YACL,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,8CAA8C,CAAC;YACpE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,CACpE,CAAC;QAEF,iDAAiD;QACjD,MAAM,CAAC,WAAW,CAAC,oBAAoB,YAAkB,MAAM,CAAC,CAAC;QAEjE,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzC,IAAI,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,EACjE,KAAK,OAAO,qBAAqB,EACjC,CAAC,CACD,CAAC;YACF,OAAO;QACR,CAAC;QAED,wDAAwD;QACxD,MAAM,aAAa,GAAG,MAAM,0BAA0B,CACrD,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,YAAY,CACZ,CAAC;QAEF,yDAAyD;QACzD,MAAM,SAAS,GAAG,YAAY,OAAO,EAAE,CAAC;QACxC,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjF,MAAM,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,iBAAiB,CACjB,CAAC;QAEF,qDAAqD;QACrD,MAAM,kBAAkB,CAAC,4BAA4B,OAAO,cAAc,aAAa,EAAE,CAAC,CAAC;QAE3F,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,EACpE,OAAO,EACP,CAAC,CACD,CAAC;QACF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,8CAA8C,CAAC,EAClE,aAAa,EACb,CAAC,CACD,CAAC;QAEF,mCAAmC;QACnC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;QACjF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,yCAAyC,EAAE;gBAC7E,OAAO;gBACP,SAAS;aACT,CAAC,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;QAC/F,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,qCAAqC,EAAE;gBACzE,OAAO;gBACP,aAAa;gBACb,aAAa;aACb,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACrB,UAAU,EACV,4CAA4C,EAC5C,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,EACtD,KAAK,CACL,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,mBAAmB,CACjC,OAAqB,EACrB,MAAc,EACd,YAAoB,EACpB,UAAmB,EACnB,SAAkB,EAClB,mBAA4B;IAE5B,IAAI,CAAC;QACJ,MAAM,CAAC,WAAW,CAAC,qBAAqB,YAAkB,MAAM,CAAC,CAAC;QAElE,MAAM,MAAM,GAAmB;YAC9B,OAAO;YACP,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE;gBACJ,GAAG,EAAE,MAAM;gBACX,OAAO,EAAE,UAAU,IAAI,KAAK;aAC5B;YACD,UAAU,EAAE;gBACX,SAAS,EAAE,SAAS,IAAI,QAAQ;gBAChC,mBAAmB,EAAE,mBAAmB,IAAI,EAAE;gBAC9C,MAAM,EAAE;oBACP,YAAY;iBACZ;aACD;SACD,CAAC;QAEF,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,sCAAsC,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,MAAsB,EAAE,eAA6B;IACnF,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;QACxC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,iCAAiC,EAAE;YACrE,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,IAAI,EAAE,iCAAiC,MAAM,CAAC,OAAO,0BAA0B,eAAe,GAAG;SACjG,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,gCAAgC,EAAE;YACpE,OAAO,EAAE,eAAe;SACxB,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,mCAAmC,EAAE;YACvE,OAAO,EAAE,eAAe;SACxB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAAC,aAAqB;IACzD,IAAI,CAAC;QACJ,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,uCAAuC,EAAE;gBAC3E,aAAa;aACb,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAA4B,aAAa,CAAC,CAAC;QAExF,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,sCAAsC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CACrB,UAAU,EACV,qCAAqC,EACrC,EAAE,aAAa,EAAE,EACjB,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,6BAA6B,CAC3C,OAAqB,EACrB,MAAsB,EACtB,WAAoB,KAAK,EACzB,SAAkB,EAClB,gBAAyB,EACzB,YAAqB;IAErB,MAAM,aAAa,GAAG,MAAM,0BAA0B,CACrD,OAAO,EACP,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,EACrC,gBAAgB,EAChB,YAAY,CACZ,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACd,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,EAChE,aAAa,EACb,CAAC,CACD,CAAC;IACH,CAAC;SAAM,CAAC;QACP,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,sCAAsC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjF,MAAM,6BAA6B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,IAAI,OAAO,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/F,2EAA2E;QAC3E,MAAM,oCAAoC,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,kBAAkB,CAChC,OAAqB,EACrB,MAAsB,EACtB,aAAqB,EACrB,WAAoB,KAAK;IAEzB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;IAEpD,MAAM,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,QAAQ;QAC5B,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,sCAAsC,CAAC;IAC1C,MAAM,cAAc,GAAG,QAAQ;QAC9B,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,kCAAkC,CAAC;IAEtC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1F,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE7F,4FAA4F;IAC5F,IAAI,cAAc,GAAG,eAAe,EAAE,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gCAAgC,CAAC,EACpD,IAAI,CAAC,aAAa,CAAC,mDAAmD,EAAE;gBACvE,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxC,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;aAC1C,CAAC,EACF,CAAC,CACD,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,qCAAqC,EAAE;gBACzE,OAAO,EAAE,aAAa;gBACtB,QAAQ,EAAE,cAAc;gBACxB,aAAa;aACb,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,gDAAgD;YAChD,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gCAAgC,CAAC,EACpD,IAAI,CAAC,aAAa,CAAC,uDAAuD,EAAE;gBAC3E,OAAO;gBACP,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;gBACjC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnC,aAAa;aACb,CAAC,EACF,CAAC,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,cAAc,CAAC;AACvB,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,sBAAsB,CACpC,YAAoB,EACpB,YAA2B,EAC3B,MAAsB,EACtB,OAAqB,EACrB,SAAkB,EAClB,gBAAyB,EACzB,YAAqB;IAErB,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAC,EAC9D,GAAG,YAAY,KAAK,OAAO,GAAG,EAC9B,CAAC,CACD,CAAC;IACF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,EAC5D,YAAY,CAAC,SAAS,EACtB,CAAC,CACD,CAAC;IACF,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,qCAAqC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAE/F,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,MAAM,6BAA6B,CACxD,OAAO,EACP,MAAM,EACN,IAAI,EACJ,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;QACF,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gCAAgC,CAAC,EACpD,IAAI,CAAC,aAAa,CAAC,qDAAqD,EAAE;YACzE,OAAO,EAAG,GAAa,CAAC,OAAO;SAC/B,CAAC,EACF,CAAC,CACD,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,sBAAsB,CACpC,YAAoB,EACpB,YAA2B,EAC3B,MAAsB,EACtB,OAAqB,EACrB,SAAkB,EAClB,gBAAyB,EACzB,YAAqB;IAErB,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,MAAM,6BAA6B,CACxD,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;QACF,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAEhE,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9E,YAAY,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,SAAS,CAAC;QAC5D,YAAY,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,UAAU,CAAC;QAE/D,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;YACvC,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;QACnE,CAAC;QAED,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,EACpE,gBAAgB,CAAC,SAAS,EAC1B,CAAC,CACD,CAAC;QACF,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;YACjC,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,kDAAkD,CAAC,EACtE,gBAAgB,CAAC,UAAU,EAC3B,CAAC,CACD,CAAC;QACH,CAAC;QACD,IAAI,YAAY,CAAC,gBAAgB,EAAE,CAAC;YACnC,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,+CAA+C,CAAC,EACnE,YAAY,CAAC,gBAAgB,EAC7B,CAAC,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CACrB,UAAU,EACV,kCAAkC,EAClC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAC1B,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,2BAA2B,CACzC,YAA2B;IAE3B,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpD,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,gBAAgB,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,sBAAsB,CACpC,MAAc,EACd,mBAA2B;IAE3B,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACvC,EAAE,EAAE,mBAAmB;YACvB,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;SAC9B,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,KAAK,YAAY,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAoC,CAAC;YAC1E,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7D,OAAO;oBACN,OAAO,EAAE,YAAY;oBACrB,OAAO,EAAE,YAAY;iBACrB,CAAC;YACH,CAAC;QACF,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACR,mFAAmF;QACnF,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,sBAAsB,CACpC,YAA2B,EAC3B,MAAsB;IAEtB,iFAAiF;IACjF,IAAI,oBAAoB,GAAG,YAAY,CAAC,qBAAqB,CAAC;IAE9D,qEAAqE;IACrE,gDAAgD;IAChD,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACnF,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,EACd,YAAY,CAAC,mBAAmB,CAChC,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YAChB,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,UAAU,CAAC,OAAO,EAClB,CAAC,CACD,CAAC;YACF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,uCAAuC,CAAC,EAC3D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAC1B,CAAC,CACD,CAAC;YAEF,IAAI,oBAAoB,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;gBACjD,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gCAAgC,CAAC,EACpD,IAAI,CAAC,aAAa,CAAC,4CAA4C,EAAE;oBAChE,aAAa,EAAE,oBAAoB,IAAI,MAAM;oBAC7C,gBAAgB,EAAE,UAAU,CAAC,OAAO;iBACpC,CAAC,EACF,CAAC,CACD,CAAC;gBACF,oBAAoB,GAAG,UAAU,CAAC,OAAO,CAAC;gBAC1C,YAAY,CAAC,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC;YACzD,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3B,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,gDAAgD,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAE/D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,sCAAsC,EAAE;YAC1E,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;SACzB,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACjE,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,kBAAkB,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,YAAY,GAAG,gBAAgB,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;IAEtD,IAAI,CAAC;QACJ,mFAAmF;QACnF,MAAM,yBAAyB,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;QAEpE,MAAM,uBAAuB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEzD,0BAA0B;QAC1B,MAAM,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC;QAC7D,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1B,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,2CAA2C,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,yBAAyB,CACpD,mBAAmB,EACnB,MAAM,CAAC,UAAU,CAAC,SAAS,EAC3B,WAAW,CACX,CAAC;QAEF,2CAA2C;QAC3C,YAAY,CAAC,iBAAiB,GAAG,aAAa,CAAC,SAAS,CAAC;QAEzD,OAAO,aAAa,CAAC;IACtB,CAAC;YAAS,CAAC;QACV,oCAAoC;QACpC,MAAM,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,yBAAyB,CACvC,mBAA2B,EAC3B,SAAiB,EACjB,eAAuB;IAEvB,mFAAmF;IACnF,MAAM,yBAAyB,CAAC,eAAe,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,4CAA4C,mBAAmB,mBAAmB,SAAS,SAAS,CAAC;IAExH,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,uCAAuC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7F,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,eAAe,EACf,CAAC,CACD,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE;YAC/D,GAAG,EAAE,eAAe;SACpB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,2DAA2D;QAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,IAAI,CAC3C,CAAC,MAA4C,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAC7E,EAAE,SAAS,CAAC;QAEb,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,0CAA0C,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,mBAAmB,CAAC;QAEvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,wBAAwB;QACxB,MAAM,yBAAyB,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,+BAA+B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACrF,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAAC,YAAoB;IACjD,MAAM,UAAU,GAAG,GAAG,YAAY,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC1D,MAAM,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,eAAe,CAAC,YAAoB,EAAE,UAAkB;IACtE,MAAM,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACpC,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,IAAI,CAAC,aAAa,CAAC,wDAAwD,CAAC,EAC5E,CAAC,CACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,yBAAyB,CAAC,YAAoB,EAAE,WAAmB;IACjF,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEjE,6CAA6C;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,CAAC,CAAC,GAAG,mBAAmB,WAAW,GAAG,CAAC;YAC7C,OAAO,GAAG,IAAI,CAAC;YACf,MAAM;QACP,CAAC;IACF,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,4CAA4C;QAC5C,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;QACjF,IAAI,mBAAmB,IAAI,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC,EAAE,mBAAmB,WAAW,GAAG,CAAC,CAAC;QAC7E,CAAC;IACF,CAAC;IAED,MAAM,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,EAC5D,mBAAmB,WAAW,GAAG,EACjC,CAAC,CACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,uBAAuB,CACrC,YAA2B,EAC3B,WAAmB;IAEnB,qDAAqD;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,uCAAuC,EAAE;gBAC3E,QAAQ;aACR,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,kCAAkC,EAAE;YACtE,WAAW;SACX,CAAC,CAAC;IACJ,CAAC;IAED,mFAAmF;IACnF,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QAC9D,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,sCAAsC,CAAC,CAAC;IAC5E,CAAC;IAED,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,EAC5D,IAAI,CAAC,aAAa,CAAC,0DAA0D,CAAC,EAC9E,CAAC,CACD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,qBAAqB,CACnC,YAAoB,EACpB,YAA2B,EAC3B,MAAsB,EACtB,OAAqB,EACrB,SAAkB,EAClB,gBAAyB,EACzB,YAAqB;IAErB,UAAU,CAAC,IAAI,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,MAAM,6BAA6B,CACxD,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;IACF,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAEhE,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAEzE,mDAAmD;IACnD,YAAY,CAAC,iBAAiB,GAAG,aAAa,CAAC,SAAS,CAAC;IAEzD,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAC,EAC9D,aAAa,CAAC,SAAS,EACvB,CAAC,CACD,CAAC;IACF,IAAI,YAAY,CAAC,qBAAqB,EAAE,CAAC;QACxC,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,2CAA2C,CAAC,EAC/D,YAAY,CAAC,qBAAqB,EAClC,CAAC,CACD,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;QACtC,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,mDAAmD,CAAC,EACvE,YAAY,CAAC,mBAAmB,EAChC,CAAC,CACD,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,cAAc,CAC5B,YAAoB,EACpB,YAA2B,EAC3B,MAAsB,EACtB,OAAqB,EACrB,MAAe,EACf,KAAc,EACd,SAAkB,EAClB,gBAAyB,EACzB,YAAqB;IAErB,UAAU,CAAC,IAAI,CACd,IAAI,CAAC,aAAa,CAAC,4CAA4C,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAC3F,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAEjE,IAAI,QAAQ,KAAK,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/C,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,uCAAuC,CAAC,EAC3D,IAAI,CAAC,aAAa,CAAC,kDAAkD,CAAC,EACtE,CAAC,CACD,CAAC;QACF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,EAC5D,IAAI,CAAC,aAAa,CAAC,iDAAiD,CAAC,EACrE,CAAC,CACD,CAAC;QACF,OAAO;IACR,CAAC;IAED,2BAA2B;IAC3B,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACrF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAC,EAC9D,YAAY,CAAC,mBAAmB;QAC/B,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,CACrE,CAAC;IACF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,0CAA0C,CAAC,EAC9D,YAAY,CAAC,iBAAiB;QAC7B,IAAI,CAAC,aAAa,CAAC,qDAAqD,CAAC,CAC1E,CAAC;IACF,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE1F,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,sBAAsB,CAC3B,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;QACF,OAAO;IACR,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,qBAAqB,CAC1B,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;IACH,CAAC;SAAM,CAAC;QACP,MAAM,sBAAsB,CAC3B,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,YAAY,CACZ,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,0BAA0B,CACxC,OAAqB,EACrB,YAAoB,EACpB,gBAAyB,EACzB,YAAqB;IAErB,qCAAqC;IACrC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/D,IAAI,IAA4B,CAAC;IACjC,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACP,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACxE,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAE7F,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAa;IACjC,OAAO,KAAK,GAAG,aAAa,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,kBAAkB,CAChC,OAAqB,EACrB,aAAqB,EACrB,MAAc,EACd,SAAiB;IAEjB,UAAU,CAAC,IAAI,CACd,IAAI,CAAC,aAAa,CAAC,gDAAgD,EAAE,EAAE,OAAO,EAAE,CAAC,CACjF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC;QAC9C,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,aAAa;KACxB,CAAC,CAAC;IAEH,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,+BAA+B,EAAE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAE5D,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QACjD,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,EACjE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EACjC,CAAC,CACD,CAAC;IACH,CAAC;SAAM,CAAC;QACP,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gCAAgC,CAAC,EACpD,IAAI,CAAC,aAAa,CAAC,2CAA2C,EAAE,EAAE,OAAO,EAAE,CAAC,EAC5E,CAAC,CACD,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,oCAAoC,CAClD,OAAqB,EACrB,MAAsB,EACtB,aAAqB,EACrB,SAAkB;IAElB,wBAAwB;IACxB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;IACpD,uCAAuC;IACvC,MAAM,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAEpD,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,sCAAsC,CAAC,EAC1D,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAClC,CAAC,CACD,CAAC;IACF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,kCAAkC,CAAC,EACtD,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EACnC,CAAC,CACD,CAAC;IAEF,uFAAuF;IACvF,IAAI,cAAc,GAAG,eAAe,EAAE,CAAC;QACtC,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gCAAgC,CAAC,EACpD,IAAI,CAAC,aAAa,CAAC,4CAA4C,EAAE;YAChE,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;SAC1C,CAAC,EACF,CAAC,CACD,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;QAC1E,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,0DAA0D,CAAC,CAAC,CAAC;QAChG,MAAM,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE5E,2CAA2C;QAC3C,MAAM,sBAAsB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACjF,MAAM,qBAAqB,GAAG,MAAM,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAC1E,MAAM,oBAAoB,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAChE,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,EACjE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EACzC,CAAC,CACD,CAAC;IACH,CAAC;SAAM,CAAC;QACP,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,qCAAqC,CAAC,EACzD,IAAI,CAAC,aAAa,CAAC,iDAAiD,CAAC,EACrE,CAAC,CACD,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAC/B,SAAiB;IAEjB,kCAAkC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,0BAA0B,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,sCAAsC,EAAE;YAC1E,UAAU,EAAE,GAAG;SACf,CAAC,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,kBAAkB,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAE/F,wCAAwC;IACxC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEvD,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,EAC5D,eAAe,EACf,CAAC,CACD,CAAC;IAEF,MAAM,UAAU,GAAG,oCAAoC,SAAS,SAAS,CAAC;IAE1E,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,uCAAuC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7F,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,EAC7D,eAAe,EACf,CAAC,CACD,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,2CAA2C;QAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,IAAI,CAC3C,CAAC,MAA4C,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAC7E,EAAE,SAAS,CAAC;QAEb,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,mCAAmC,EAAE;gBACvE,MAAM;aACN,CAAC,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,IAAI,CAC5C,CAAC,MAAkD,EAAE,EAAE,CACtD,MAAM,CAAC,UAAU,KAAK,0BAA0B,CACjD,EAAE,QAAQ,CAAC;QAEZ,iDAAiD;QACjD,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,EAAE,IAAI,CAClD,CAAC,MAAkD,EAAE,EAAE,CACtD,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAChD,EAAE,QAAQ,CAAC;QAEZ,OAAO;YACN,SAAS;YACT,UAAU;YACV,gBAAgB;SAChB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,kCAAkC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACxF,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CACjC,aAAqB,EACrB,aAAwC;IAExC,IAAI,CAAC;QACJ,MAAM,QAAQ,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAClE,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,EACjE,aAAa,EACb,CAAC,CACD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CACrB,UAAU,EACV,2CAA2C,EAC3C,EAAE,aAAa,EAAE,EACjB,GAAG,CACH,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACxC,SAAiB,EACjB,YAAsD;IAEtD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpE,sDAAsD;IACtD,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,GAAG,SAAS,WAAW,YAAY,EAAE,CAAC;IAE1D,8DAA8D;IAC9D,IAAI,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,GAAG,SAAS,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,YAAY,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,OAAqB,EACrB,SAAiB,EACjB,eAAuB,EACvB,YAAoB,EACpB,gBAAwB;IAExB,IAAI,CAAC;QACJ,gDAAgD;QAChD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAE5C,0CAA0C;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAChC,CAAC,GAA2C,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CACxE,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YACjB,gDAAgD;YAChD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC;YAEhD,IAAI,eAAe,KAAK,eAAe,EAAE,CAAC;gBACzC,2DAA2D;gBAC3D,UAAU,CAAC,IAAI,CACd,IAAI,CAAC,aAAa,CAAC,iDAAiD,EAAE,EAAE,SAAS,EAAE,CAAC,CACpF,CAAC;gBAEF,MAAM,WAAW,GAAG,yBAAyB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACnE,MAAM,kBAAkB,CAAC,8BAA8B,SAAS,MAAM,WAAW,GAAG,CAAC,CAAC;gBAEtF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,2CAA2C,CAAC,EAC/D,GAAG,SAAS,MAAM,WAAW,KAAK,eAAe,GAAG,EACpD,CAAC,CACD,CAAC;gBAEF,oDAAoD;gBACpD,MAAM,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,CAChB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,6CAA6C;gBAC7C,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,EACpE,GAAG,SAAS,KAAK,eAAe,GAAG,EACnC,CAAC,CACD,CAAC;YACH,CAAC;QACF,CAAC;aAAM,CAAC;YACP,qCAAqC;YACrC,MAAM,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,CAChB,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;QAC/F,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAClD,MAAM,aAAa,GAAY,WAAW,CAAC,SAAS,CAAC,IAAI,CACxD,CAAC,CAAC,CAAC,EAAE,IAAI,CAAmB,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CACzD,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,oCAAoC,EAAE;gBACxE,eAAe;gBACf,SAAS;aACT,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACrB,UAAU,EACV,wCAAwC,EACxC,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,EACvC,KAAK,CACL,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,wBAAwB,CACtC,OAAqB,EACrB,SAAiB,EACjB,YAAoB,EACpB,aAAqB,EACrB,gBAAwB;IAExB,UAAU,CAAC,IAAI,CACd,IAAI,CAAC,aAAa,CAAC,+CAA+C,EAAE,EAAE,SAAS,EAAE,CAAC,CAClF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE7F,MAAM,kBAAkB,CACvB,wBAAwB,QAAQ,cAAc,cAAc,cAAc,SAAS,GAAG,CACtF,CAAC;IAEF,UAAU,CAAC,KAAK,CACf,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,EAChE,GAAG,SAAS,KAAK,aAAa,GAAG,EACjC,CAAC,CACD,CAAC;AACH,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { promises as fsPromises } from \"node:fs\";\nimport path from \"node:path\";\nimport { IotaClient } from \"@iota/iota-sdk/client\";\nimport { requestIotaFromFaucetV0 } from \"@iota/iota-sdk/faucet\";\nimport { CLIDisplay, CLIParam, CLIUtils } from \"@twin.org/cli-core\";\nimport { Coerce, Converter, GeneralError, Guards, I18n, Is, RandomHelper } from \"@twin.org/core\";\nimport { Bip39, Bip44 } from \"@twin.org/crypto\";\nimport {\n\tIota,\n\tNetworkTypes,\n\ttype IContractData,\n\ttype ISmartContractDeployments\n} from \"@twin.org/dlt-iota\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { Command } from \"commander\";\nimport type { INetworkConfig } from \"../models/INetworkConfig.js\";\nimport { cleanBuildArtifactsInPath } from \"../utils/buildArtifactUtils.js\";\nimport { ensureEnvironment, execAsyncWithError } from \"../utils/environmentUtils.js\";\nimport {\n\tgetDeploymentMnemonic,\n\tgetDeploymentSeed,\n\tvalidateDeploymentEnvironment\n} from \"../utils/envSetup.js\";\nimport { verifyIotaSDK } from \"../utils/iotaUtils.js\";\nimport { searchDirectoryForMoveToml } from \"../utils/moveToJsonUtils.js\";\n\n/**\n * Build the deploy command.\n * @param program The command program.\n */\nexport function buildCommandDeploy(program: Command): void {\n\tprogram\n\t\t.command(\"deploy\")\n\t\t.description(I18n.formatMessage(\"commands.deploy.description\"))\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.contracts.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.contracts.description\"),\n\t\t\t\"smart-contract-deployments.json\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.dryRun.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.dryRun.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.force.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.force.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcUrl.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcUrl.description\"),\n\t\t\t\"!RPC_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.addressIndex.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.addressIndex.description\"),\n\t\t\t\"!ADDRESS_INDEX\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcTimeout.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.rpcTimeout.description\"),\n\t\t\t\"!RPC_TIMEOUT\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.gasBudget.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.gasBudget.description\"),\n\t\t\t\"!GAS_BUDGET\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.confirmationTimeout.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.confirmationTimeout.description\"),\n\t\t\t\"!CONFIRMATION_TIMEOUT\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.faucetUrl.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.faucetUrl.description\"),\n\t\t\t\"!FAUCET_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerMnemonic.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerMnemonic.description\"),\n\t\t\t\"!DEPLOYER_MNEMONIC\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerSeed.param\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.options.deployerSeed.description\"),\n\t\t\t\"!DEPLOYER_SEED\"\n\t\t)\n\t\t.action(actionCommandDeploy);\n}\n\n/**\n * Action for the deploy command.\n * @param opts Command options.\n * @param opts.contracts Path to compiled modules JSON.\n * @param opts.network Network identifier - optional if NETWORK env var is set.\n * @param opts.dryRun Simulate deployment without executing.\n * @param opts.force Force redeployment of existing packages.\n * @param opts.rpcUrl RPC endpoint URL for the network.\n * @param opts.addressIndex Address index for key derivation.\n * @param opts.rpcTimeout RPC request timeout in milliseconds.\n * @param opts.gasBudget Gas budget for transactions.\n * @param opts.confirmationTimeout Transaction confirmation timeout in milliseconds.\n * @param opts.faucetUrl Faucet URL for requesting test tokens.\n * @param opts.deployerMnemonic Deployer wallet mnemonic phrase.\n * @param opts.deployerSeed Deployer wallet seed (alternative to mnemonic).\n */\nexport async function actionCommandDeploy(opts: {\n\tcontracts?: string;\n\tnetwork?: NetworkTypes;\n\tdryRun?: boolean;\n\tforce?: boolean;\n\trpcUrl?: string;\n\taddressIndex?: string;\n\trpcTimeout?: string;\n\tgasBudget?: string;\n\tconfirmationTimeout?: string;\n\tfaucetUrl?: string;\n\tdeployerMnemonic?: string;\n\tdeployerSeed?: string;\n}): Promise<void> {\n\tconst network = CLIParam.arrayOneOf<NetworkTypes>(\n\t\t\"network\",\n\t\topts.network,\n\t\tObject.values(NetworkTypes),\n\t\ttrue\n\t);\n\n\tconst contractsPath = opts.contracts ?? \"smart-contract-deployments.json\";\n\tconst dryRun = opts.dryRun ?? false;\n\tconst force = opts.force ?? false;\n\n\tCLIDisplay.section(I18n.formatMessage(\"commands.deploy.section.deployContracts\"));\n\tCLIDisplay.section(contractsPath);\n\n\t// Verify the IOTA SDK before we do anything else\n\tawait verifyIotaSDK();\n\n\t// Get configuration values needed for environment setup\n\tconst rpcUrl: string = CLIParam.stringValue(\"rpcUrl\", opts.rpcUrl);\n\tconst addressIndex = CLIParam.number(\"addressIndex\", opts.addressIndex) ?? 0;\n\tconst rpcTimeout = CLIParam.number(\"rpcTimeout\", opts.rpcTimeout);\n\tconst gasBudget = CLIParam.number(\"gasBudget\", opts.gasBudget);\n\tconst confirmationTimeout = CLIParam.number(\"confirmationTimeout\", opts.confirmationTimeout);\n\tconst faucetUrl: string | undefined =\n\t\tnetwork === NetworkTypes.Mainnet\n\t\t\t? undefined\n\t\t\t: CLIParam.stringValue(\"faucetUrl\", opts.faucetUrl);\n\n\tlet deployerMnemonic: string | undefined;\n\ttry {\n\t\tdeployerMnemonic = CLIParam.stringValue(\"deployerMnemonic\", opts.deployerMnemonic);\n\t} catch {\n\t\t// Optional parameter, can be undefined\n\t\tdeployerMnemonic = undefined;\n\t}\n\n\tlet deployerSeed: string | undefined;\n\ttry {\n\t\tdeployerSeed = CLIParam.stringValue(\"deployerSeed\", opts.deployerSeed);\n\t} catch {\n\t\t// Optional parameter, can be undefined\n\t\tdeployerSeed = undefined;\n\t}\n\n\t// Validate that at least one deployer credential is provided\n\tconst hasValidMnemonic = Is.stringValue(deployerMnemonic);\n\tconst hasValidSeed = Is.stringValue(deployerSeed);\n\n\tif (!hasValidMnemonic && !hasValidSeed) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.deployerCredentialRequired\", {\n\t\t\tnetwork\n\t\t});\n\t}\n\n\t// Check/switch to target network environment BEFORE loading config\n\tawait setIotaEnvironment(network, rpcUrl, addressIndex, dryRun, deployerMnemonic, deployerSeed);\n\n\tconst config = await createNetworkConfig(\n\t\tnetwork,\n\t\trpcUrl,\n\t\taddressIndex,\n\t\trpcTimeout,\n\t\tgasBudget,\n\t\tconfirmationTimeout\n\t);\n\tvalidateNetworkConfig(config, network);\n\n\tconst contractsData = await loadCompiledContracts(contractsPath);\n\n\tif (network === NetworkTypes.Mainnet) {\n\t\tconst validatedMnemonic = await getDeploymentMnemonic(\n\t\t\tnetwork,\n\t\t\thasValidMnemonic ? deployerMnemonic : undefined\n\t\t);\n\t\tawait validateDeploymentEnvironment(network, validatedMnemonic);\n\t}\n\n\tconst networkContracts = contractsData[network];\n\tif (!Is.object<IContractData>(networkContracts)) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noContractsFound\", {\n\t\t\tnetwork,\n\t\t\tcontractsPath\n\t\t});\n\t}\n\n\tawait deployContract(\n\t\t\"contract\",\n\t\tnetworkContracts,\n\t\tconfig,\n\t\tnetwork,\n\t\tdryRun,\n\t\tforce,\n\t\tfaucetUrl,\n\t\tdeployerMnemonic,\n\t\tdeployerSeed\n\t);\n\n\tif (!dryRun) {\n\t\tawait updateContractsFile(contractsPath, contractsData);\n\t}\n\n\tCLIDisplay.done();\n}\n\n/**\n * Switch IOTA CLI to the target network environment and set the active address.\n * @param network Target network to switch to\n * @param rpcUrl The RPC URL for the network\n * @param addressIndex The address index to derive the target address\n * @param dryRun Whether this is a dry run (checks environment but doesn't switch)\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function setIotaEnvironment(\n\tnetwork: NetworkTypes,\n\trpcUrl: string,\n\taddressIndex: number,\n\tdryRun: boolean = false,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\ttry {\n\t\tCLIDisplay.task(\n\t\t\tdryRun\n\t\t\t\t? I18n.formatMessage(\"commands.deploy.progress.checkingEnvironment\")\n\t\t\t\t: I18n.formatMessage(\"commands.deploy.progress.settingEnvironment\")\n\t\t);\n\n\t\t// Ensure environment exists, create if necessary\n\t\tGuards.stringValue(\"setIotaEnvironment\", nameof(rpcUrl), rpcUrl);\n\n\t\tawait ensureEnvironment(network, rpcUrl);\n\n\t\tif (dryRun) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.iotaEnvironmentCheck\"),\n\t\t\t\t`✅ ${network} environment exists`,\n\t\t\t\t1\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Derive the target address from existing mnemonic/seed\n\t\tconst targetAddress = await getDeploymentWalletAddress(\n\t\t\tnetwork,\n\t\t\taddressIndex,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\n\t\t// Ensure the correct deployer key exists in the keystore\n\t\tconst aliasName = `deployer-${network}`;\n\t\tconst validatedMnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\t\tawait ensureCorrectDeployerKey(\n\t\t\tnetwork,\n\t\t\taliasName,\n\t\t\ttargetAddress,\n\t\t\taddressIndex,\n\t\t\tvalidatedMnemonic\n\t\t);\n\n\t\t// Switch both environment and address in one command\n\t\tawait execAsyncWithError(`iota client switch --env ${network} --address ${targetAddress}`);\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.switchedIotaEnvironment\"),\n\t\t\tnetwork,\n\t\t\t1\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.switchedActiveAddress\"),\n\t\t\ttargetAddress,\n\t\t\t1\n\t\t);\n\n\t\t// Verify the switch was successful\n\t\tconst { stdout: activeEnv } = await execAsyncWithError(\"iota client active-env\");\n\t\tif (!activeEnv.includes(network)) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.environmentSwitchFailed\", {\n\t\t\t\tnetwork,\n\t\t\t\tactiveEnv\n\t\t\t});\n\t\t}\n\n\t\t// Verify address switch was successful\n\t\tconst { stdout: activeAddressOutput } = await execAsyncWithError(\"iota client active-address\");\n\t\tconst activeAddress = activeAddressOutput.trim();\n\t\tif (activeAddress !== targetAddress) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.addressSwitchFailed\", {\n\t\t\t\tnetwork,\n\t\t\t\ttargetAddress,\n\t\t\t\tactiveAddress\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.environmentOperationFailed\",\n\t\t\t{ network, operation: dryRun ? \"check\" : \"switch to\" },\n\t\t\terror\n\t\t);\n\t}\n}\n\n/**\n * Creates the network configuration.\n * @param network Target network to determine which env file to load.\n * @param rpcUrl The RPC URL for the network.\n * @param addressIndex The address index for the wallet.\n * @param rpcTimeout The RPC timeout in milliseconds.\n * @param gasBudget The gas budget for deployment.\n * @param confirmationTimeout The confirmation timeout in seconds.\n * @returns Network configuration.\n */\nasync function createNetworkConfig(\n\tnetwork: NetworkTypes,\n\trpcUrl: string,\n\taddressIndex: number,\n\trpcTimeout?: number,\n\tgasBudget?: number,\n\tconfirmationTimeout?: number\n): Promise<INetworkConfig> {\n\ttry {\n\t\tGuards.stringValue(\"createNetworkConfig\", nameof(rpcUrl), rpcUrl);\n\n\t\tconst config: INetworkConfig = {\n\t\t\tnetwork,\n\t\t\tplatform: \"iota\",\n\t\t\trpc: {\n\t\t\t\turl: rpcUrl,\n\t\t\t\ttimeout: rpcTimeout ?? 60000\n\t\t\t},\n\t\t\tdeployment: {\n\t\t\t\tgasBudget: gasBudget ?? 50000000,\n\t\t\t\tconfirmationTimeout: confirmationTimeout ?? 60,\n\t\t\t\twallet: {\n\t\t\t\t\taddressIndex\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn config;\n\t} catch (err) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.networkConfigInvalid\", { network }, err);\n\t}\n}\n\n/**\n * Validate network configuration matches expected network.\n * @param config Network configuration.\n * @param expectedNetwork Expected network type.\n * @throws GeneralError if the network configuration is invalid.\n */\nfunction validateNetworkConfig(config: INetworkConfig, expectedNetwork: NetworkTypes): void {\n\tif (config.network !== expectedNetwork) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.networkMismatch\", {\n\t\t\texpected: expectedNetwork,\n\t\t\tactual: config.network,\n\t\t\thelp: `Configuration file specifies '${config.network}' but command targets '${expectedNetwork}'`\n\t\t});\n\t}\n\n\tif (!Is.stringValue(config.rpc?.url)) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.rpcUrlRequired\", {\n\t\t\tnetwork: expectedNetwork\n\t\t});\n\t}\n\n\tif (!Is.number(config.deployment?.gasBudget)) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.gasBudgetRequired\", {\n\t\t\tnetwork: expectedNetwork\n\t\t});\n\t}\n}\n\n/**\n * Load compiled contracts from file.\n * @param contractsPath Path to contracts file.\n * @returns Compiled contracts data.\n */\nasync function loadCompiledContracts(contractsPath: string): Promise<ISmartContractDeployments> {\n\ttry {\n\t\tif (!(await CLIUtils.fileExists(contractsPath))) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.contractsFileNotFound\", {\n\t\t\t\tcontractsPath\n\t\t\t});\n\t\t}\n\n\t\tconst contracts = await CLIUtils.readJsonFile<ISmartContractDeployments>(contractsPath);\n\n\t\tif (!Is.object(contracts)) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.invalidContractsFile\");\n\t\t}\n\n\t\treturn contracts;\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.contractsLoadFailed\",\n\t\t\t{ contractsPath },\n\t\t\terr\n\t\t);\n\t}\n}\n\n/**\n * Validate environment and setup for deployment based on network type.\n * @param network Target network.\n * @param config Network configuration.\n * @param isDryRun Whether this is a dry run.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic for validation.\n * @param deployerSeed The deployer seed (optional).\n * @returns Wallet address for the deployment.\n */\nasync function validateEnvironmentForNetwork(\n\tnetwork: NetworkTypes,\n\tconfig: INetworkConfig,\n\tisDryRun: boolean = false,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<string> {\n\tconst walletAddress = await getDeploymentWalletAddress(\n\t\tnetwork,\n\t\tconfig.deployment.wallet.addressIndex,\n\t\tdeployerMnemonic,\n\t\tdeployerSeed\n\t);\n\n\tif (isDryRun) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.dryRunWalletAddress\"),\n\t\t\twalletAddress,\n\t\t\t1\n\t\t);\n\t} else {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.walletAddress\"), walletAddress, 1);\n\t}\n\n\tif (network === NetworkTypes.Mainnet) {\n\t\tconst validatedMnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\t\tawait validateDeploymentEnvironment(network, validatedMnemonic);\n\t} else if ((network === NetworkTypes.Testnet || network === NetworkTypes.Devnet) && !isDryRun) {\n\t\t// For testnet/devnet, check balance first and only request funds if needed\n\t\tawait checkBalanceAndRequestFaucetIfNeeded(network, config, walletAddress, faucetUrl);\n\t}\n\n\treturn walletAddress;\n}\n\n/**\n * Check wallet balance and display relevant information.\n * @param network Target network.\n * @param config Network configuration.\n * @param walletAddress Wallet address.\n * @param isDryRun Whether this is a dry run.\n * @returns Balance in nanos.\n */\nasync function checkWalletBalance(\n\tnetwork: NetworkTypes,\n\tconfig: INetworkConfig,\n\twalletAddress: string,\n\tisDryRun: boolean = false\n): Promise<number> {\n\tconst client = new IotaClient({ url: config.rpc.url });\n\tconst balanceResponse = await client.getBalance({ owner: walletAddress });\n\tconst balanceInNanos = Number(balanceResponse.totalBalance);\n\tconst requiredInNanos = config.deployment.gasBudget;\n\n\tconst balanceInIota = nanosToIota(balanceInNanos);\n\tconst requiredInIota = nanosToIota(requiredInNanos);\n\n\tconst balanceLabel = isDryRun\n\t\t? \"commands.deploy.labels.dryRunWalletBalance\"\n\t\t: \"commands.deploy.labels.walletBalance\";\n\tconst gasBudgetLabel = isDryRun\n\t\t? \"commands.deploy.labels.dryRunGasBudget\"\n\t\t: \"commands.deploy.labels.gasBudget\";\n\n\tCLIDisplay.value(I18n.formatMessage(balanceLabel), `${balanceInIota.toFixed(2)} IOTA`, 1);\n\tCLIDisplay.value(I18n.formatMessage(gasBudgetLabel), `${requiredInIota.toFixed(2)} IOTA`, 1);\n\n\t// Handle insufficient balance based on network and run type (compare in same units - nanos)\n\tif (balanceInNanos < requiredInNanos) {\n\t\tif (isDryRun) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.insufficientBalanceWarning\", {\n\t\t\t\t\tcurrentBalance: balanceInIota.toFixed(2),\n\t\t\t\t\trequiredBalance: requiredInIota.toFixed(2)\n\t\t\t\t}),\n\t\t\t\t2\n\t\t\t);\n\t\t} else if (network === NetworkTypes.Mainnet) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.insufficientBalance\", {\n\t\t\t\tbalance: balanceInIota,\n\t\t\t\trequired: requiredInIota,\n\t\t\t\twalletAddress\n\t\t\t});\n\t\t} else {\n\t\t\t// For testnet/devnet, show warning but continue\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.insufficientBalanceAfterFaucet\", {\n\t\t\t\t\tnetwork,\n\t\t\t\t\tbalance: balanceInIota.toFixed(2),\n\t\t\t\t\trequired: requiredInIota.toFixed(2),\n\t\t\t\t\twalletAddress\n\t\t\t\t}),\n\t\t\t\t2\n\t\t\t);\n\t\t}\n\t}\n\n\treturn balanceInNanos;\n}\n\n/**\n * Handle dry run validation and display.\n * @param contractName Name of the contract.\n * @param contractData Contract data.\n * @param config Network configuration.\n * @param network Target network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function handleDryRunValidation(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.dryRunWouldDeploy\"),\n\t\t`${contractName} (${network})`,\n\t\t1\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.dryRunPackageId\"),\n\t\tcontractData.packageId,\n\t\t1\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.dryRunRpcUrl\"), config.rpc.url, 1);\n\n\ttry {\n\t\tconst walletAddress = await validateEnvironmentForNetwork(\n\t\t\tnetwork,\n\t\t\tconfig,\n\t\t\ttrue,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t\tawait checkWalletBalance(network, config, walletAddress, true);\n\t} catch (err) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.environmentValidationWarning\", {\n\t\t\t\tmessage: (err as Error).message\n\t\t\t}),\n\t\t\t2\n\t\t);\n\t}\n}\n\n/**\n * Handle actual deployment execution.\n * @param contractName Name of the contract.\n * @param contractData Contract data.\n * @param config Network configuration.\n * @param network Target network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function handleActualDeployment(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\ttry {\n\t\tconst walletAddress = await validateEnvironmentForNetwork(\n\t\t\tnetwork,\n\t\t\tconfig,\n\t\t\tfalse,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t\tawait checkWalletBalance(network, config, walletAddress, false);\n\n\t\tconst deploymentResult = await deployWithIotaCli(config.deployment.gasBudget);\n\n\t\tcontractData.deployedPackageId = deploymentResult.packageId;\n\t\tcontractData.upgradeCapabilityId = deploymentResult.upgradeCap;\n\n\t\tif (deploymentResult.migrationStateId) {\n\t\t\tcontractData.migrationStateId = deploymentResult.migrationStateId;\n\t\t}\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.deployedPackageIdResult\"),\n\t\t\tdeploymentResult.packageId,\n\t\t\t1\n\t\t);\n\t\tif (deploymentResult.upgradeCap) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeCapabilityIdResult\"),\n\t\t\t\tdeploymentResult.upgradeCap,\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t\tif (contractData.migrationStateId) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.migrationStateIdResult\"),\n\t\t\t\tcontractData.migrationStateId,\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.deploymentFailed\",\n\t\t\t{ contract: contractName },\n\t\t\terr\n\t\t);\n\t}\n}\n\n/**\n * Determine the deployment strategy based on contract state.\n * @param contractData Contract data to analyze.\n * @returns Deployment strategy: initial-deploy, upgrade or already-deployed.\n */\nasync function determineDeploymentStrategy(\n\tcontractData: IContractData\n): Promise<\"initial-deploy\" | \"upgrade\" | \"already-deployed\"> {\n\tif (Is.stringValue(contractData.deployedPackageId)) {\n\t\treturn \"already-deployed\";\n\t}\n\n\tif (Is.stringValue(contractData.lastDeployedPackageId)) {\n\t\treturn \"upgrade\";\n\t}\n\n\treturn \"initial-deploy\";\n}\n\n/**\n * Query the on-chain UpgradeCap object to get the actual latest package ID.\n * This is used to validate/correct the `published-at` value before upgrades,\n * preventing failures when the deployment JSON is stale.\n * @param rpcUrl RPC endpoint URL for the network.\n * @param upgradeCapabilityId The UpgradeCap object ID on-chain.\n * @returns The on-chain package ID and version, or undefined if query fails.\n */\nasync function queryUpgradeCapPackage(\n\trpcUrl: string,\n\tupgradeCapabilityId: string\n): Promise<{ package: string; version: number } | undefined> {\n\ttry {\n\t\tconst client = new IotaClient({ url: rpcUrl });\n\t\tconst response = await client.getObject({\n\t\t\tid: upgradeCapabilityId,\n\t\t\toptions: { showContent: true }\n\t\t});\n\n\t\tif (response.data?.content?.dataType === \"moveObject\") {\n\t\t\tconst fields = response.data.content.fields as { [key: string]: unknown };\n\t\t\tconst fieldPackage = Coerce.string(fields.package);\n\t\t\tconst fieldVersion = Coerce.number(fields.version);\n\t\t\tif (Is.stringValue(fieldPackage) && Is.number(fieldVersion)) {\n\t\t\t\treturn {\n\t\t\t\t\tpackage: fieldPackage,\n\t\t\t\t\tversion: fieldVersion\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t} catch {\n\t\t// If query fails (e.g. network issue), return undefined to fall back to JSON value\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Execute contract upgrade using iota client upgrade command.\n * @param contractData Contract data containing upgrade capability.\n * @param config Network configuration.\n * @returns Upgrade result with package ID and upgrade capability.\n */\nasync function executeContractUpgrade(\n\tcontractData: IContractData,\n\tconfig: INetworkConfig\n): Promise<{ packageId: string; upgradeCap: string; migrationStateId?: string }> {\n\t// Start with lastDeployedPackageId from JSON as the candidate for \"published-at\"\n\tlet publishedAtPackageId = contractData.lastDeployedPackageId;\n\n\t// Query the on-chain UpgradeCap to get the actual latest package ID.\n\t// This prevents failures when the JSON is stale\n\tif (Is.stringValue(contractData.upgradeCapabilityId)) {\n\t\tCLIDisplay.task(I18n.formatMessage(\"commands.deploy.progress.queryingUpgradeCap\"));\n\t\tconst onChainCap = await queryUpgradeCapPackage(\n\t\t\tconfig.rpc.url,\n\t\t\tcontractData.upgradeCapabilityId\n\t\t);\n\t\tif (onChainCap) {\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.onChainPackageId\"),\n\t\t\t\tonChainCap.package,\n\t\t\t\t1\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.onChainVersion\"),\n\t\t\t\tString(onChainCap.version),\n\t\t\t\t1\n\t\t\t);\n\n\t\t\tif (publishedAtPackageId !== onChainCap.package) {\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.messages.staleJsonDetected\", {\n\t\t\t\t\t\tjsonPackageId: publishedAtPackageId ?? \"none\",\n\t\t\t\t\t\tonChainPackageId: onChainCap.package\n\t\t\t\t\t}),\n\t\t\t\t\t2\n\t\t\t\t);\n\t\t\t\tpublishedAtPackageId = onChainCap.package;\n\t\t\t\tcontractData.lastDeployedPackageId = onChainCap.package;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!publishedAtPackageId) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noPreviousDeploymentForUpgrade\");\n\t}\n\n\tconst moveTomlPaths: string[] = [];\n\tawait searchDirectoryForMoveToml(process.cwd(), moveTomlPaths);\n\n\tif (moveTomlPaths.length === 0) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noMoveTomlFilesFound\", {\n\t\t\tcurrentDir: process.cwd()\n\t\t});\n\t}\n\n\tconst currentDirMoveToml = path.join(process.cwd(), \"Move.toml\");\n\tconst selectedMoveToml = moveTomlPaths.find(p => p === currentDirMoveToml) ?? moveTomlPaths[0];\n\tconst moveTomlPath = selectedMoveToml;\n\tconst projectRoot = path.dirname(moveTomlPath);\n\n\tconst backupPath = await backupMoveToml(moveTomlPath);\n\n\ttry {\n\t\t// Update Move.toml with \"published-at\" = validated package ID (from chain or JSON)\n\t\tawait updateMoveTomlPublishedAt(moveTomlPath, publishedAtPackageId);\n\n\t\tawait validateContractIsBuilt(contractData, projectRoot);\n\n\t\t// Execute upgrade command\n\t\tconst upgradeCapabilityId = contractData.upgradeCapabilityId;\n\t\tif (!upgradeCapabilityId) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.upgradeCapabilityNotFound\");\n\t\t}\n\t\tconst upgradeResult = await executeUpgradeWithIotaCli(\n\t\t\tupgradeCapabilityId,\n\t\t\tconfig.deployment.gasBudget,\n\t\t\tprojectRoot\n\t\t);\n\n\t\t// Update contract data with new package ID\n\t\tcontractData.deployedPackageId = upgradeResult.packageId;\n\n\t\treturn upgradeResult;\n\t} finally {\n\t\t// Always restore original Move.toml\n\t\tawait restoreMoveToml(moveTomlPath, backupPath);\n\t}\n}\n\n/**\n * Execute upgrade using iota client upgrade command.\n * @param upgradeCapabilityId Upgrade capability ID.\n * @param gasBudget Gas budget for upgrade.\n * @param moveProjectRoot Move project root directory.\n * @returns Upgrade result.\n */\nasync function executeUpgradeWithIotaCli(\n\tupgradeCapabilityId: string,\n\tgasBudget: number,\n\tmoveProjectRoot: string\n): Promise<{ packageId: string; upgradeCap: string; migrationStateId?: string }> {\n\t// Clean build artifacts and lock files before upgrade to prevent permission issues\n\tawait cleanBuildArtifactsInPath(moveProjectRoot);\n\n\tconst upgradeCmd = `iota client upgrade --upgrade-capability ${upgradeCapabilityId} . --gas-budget ${gasBudget} --json`;\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.publishCommand\"), upgradeCmd, 1);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.workingDirectory\"),\n\t\tmoveProjectRoot,\n\t\t1\n\t);\n\n\ttry {\n\t\tconst { stdout: output } = await execAsyncWithError(upgradeCmd, {\n\t\t\tcwd: moveProjectRoot\n\t\t});\n\t\tconst result = JSON.parse(output);\n\n\t\t// Parse upgrade response (different from publish response)\n\t\tconst packageId = result.objectChanges?.find(\n\t\t\t(change: { type: string; packageId?: string }) => change.type === \"published\"\n\t\t)?.packageId;\n\n\t\tif (!packageId) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.upgradePackageIdNotFound\", { result });\n\t\t}\n\n\t\t// UpgradeCap persists with same ID\n\t\tconst upgradeCap = upgradeCapabilityId;\n\n\t\treturn { packageId, upgradeCap };\n\t} catch (err) {\n\t\t// Clean up on error too\n\t\tawait cleanBuildArtifactsInPath(moveProjectRoot);\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.upgradeFailed\", undefined, err);\n\t}\n}\n\n/**\n * Backup Move.toml file.\n * @param moveTomlPath Path to Move.toml file.\n * @returns Path to backup file.\n */\nasync function backupMoveToml(moveTomlPath: string): Promise<string> {\n\tconst backupPath = `${moveTomlPath}.backup.${Date.now()}`;\n\tawait fsPromises.copyFile(moveTomlPath, backupPath);\n\treturn backupPath;\n}\n\n/**\n * Restore Move.toml file from backup.\n * @param moveTomlPath Path to Move.toml file.\n * @param backupPath Path to backup file.\n */\nasync function restoreMoveToml(moveTomlPath: string, backupPath: string): Promise<void> {\n\tawait fsPromises.copyFile(backupPath, moveTomlPath);\n\tawait fsPromises.unlink(backupPath);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.moveTomlRestored\"),\n\t\tI18n.formatMessage(\"commands.deploy.messages.originalConfigurationRestored\"),\n\t\t1\n\t);\n}\n\n/**\n * Update Move.toml published-at field.\n * @param moveTomlPath Path to Move.toml file.\n * @param publishedAt Published-at value to set.\n */\nasync function updateMoveTomlPublishedAt(moveTomlPath: string, publishedAt: string): Promise<void> {\n\tconst content = await fsPromises.readFile(moveTomlPath, \"utf-8\");\n\n\t// Parse TOML and update \"published-at\" field\n\tconst lines = content.split(\"\\n\");\n\tlet updated = false;\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tif (lines[i].trim().startsWith(\"published-at\")) {\n\t\t\tlines[i] = `published-at = \"${publishedAt}\"`;\n\t\t\tupdated = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!updated) {\n\t\t// Add \"published-at\" to \"[package]\" section\n\t\tconst packageSectionIndex = lines.findIndex(line => line.trim() === \"[package]\");\n\t\tif (packageSectionIndex >= 0) {\n\t\t\tlines.splice(packageSectionIndex + 1, 0, `published-at = \"${publishedAt}\"`);\n\t\t}\n\t}\n\n\tawait fsPromises.writeFile(moveTomlPath, lines.join(\"\\n\"));\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.moveTomlUpdated\"),\n\t\t`published-at = \"${publishedAt}\"`,\n\t\t1\n\t);\n}\n\n/**\n * Validate that contract has been built.\n * @param contractData Contract data to validate.\n * @param projectRoot Project root directory.\n */\nasync function validateContractIsBuilt(\n\tcontractData: IContractData,\n\tprojectRoot: string\n): Promise<void> {\n\t// Check if build directory exists and has been built\n\tconst buildDir = path.join(projectRoot, \"build\");\n\ttry {\n\t\tconst stats = await fsPromises.stat(buildDir);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.buildPathNotDirectory\", {\n\t\t\t\tbuildDir\n\t\t\t});\n\t\t}\n\t} catch {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.contractNotBuilt\", {\n\t\t\tprojectRoot\n\t\t});\n\t}\n\n\t// Verify that the contract data has current packageId (build should have been run)\n\tif (!contractData.packageId || !contractData.packageBytecode) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.contractDataOutdated\");\n\t}\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.buildValidation\"),\n\t\tI18n.formatMessage(\"commands.deploy.messages.contractBuiltAndReadyForUpgrade\"),\n\t\t1\n\t);\n}\n\n/**\n * Handle contract upgrade execution.\n * @param contractName Name of the contract.\n * @param contractData Contract data.\n * @param config Network configuration.\n * @param network Target network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function handleContractUpgrade(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\tCLIDisplay.task(`Upgrading contract: ${contractName}`);\n\n\tconst walletAddress = await validateEnvironmentForNetwork(\n\t\tnetwork,\n\t\tconfig,\n\t\tfalse,\n\t\tfaucetUrl,\n\t\tdeployerMnemonic,\n\t\tdeployerSeed\n\t);\n\tawait checkWalletBalance(network, config, walletAddress, false);\n\n\tconst upgradeResult = await executeContractUpgrade(contractData, config);\n\n\t// Update contract data with upgrade chain tracking\n\tcontractData.deployedPackageId = upgradeResult.packageId;\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeSuccessful\"),\n\t\tupgradeResult.packageId,\n\t\t1\n\t);\n\tif (contractData.lastDeployedPackageId) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.previousDeployment\"),\n\t\t\tcontractData.lastDeployedPackageId,\n\t\t\t1\n\t\t);\n\t}\n\tif (contractData.upgradeCapabilityId) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeCapabilityPreserved\"),\n\t\t\tcontractData.upgradeCapabilityId,\n\t\t\t1\n\t\t);\n\t}\n}\n\n/**\n * Deploy a single contract.\n * @param contractName Name of the contract\n * @param contractData Contract compilation data\n * @param contractData.packageId Package ID\n * @param contractData.packageBytecode Package bytecode\n * @param contractData.deployedPackageId Deployed package ID\n * @param config Network configuration\n * @param network Target network\n * @param dryRun Whether this is a dry run\n * @param force Whether to force redeployment\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n */\nasync function deployContract(\n\tcontractName: string,\n\tcontractData: IContractData,\n\tconfig: INetworkConfig,\n\tnetwork: NetworkTypes,\n\tdryRun: boolean,\n\tforce: boolean,\n\tfaucetUrl?: string,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<void> {\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.deploy.progress.deployingContract\", { contractName, network })\n\t);\n\n\tconst strategy = await determineDeploymentStrategy(contractData);\n\n\tif (strategy === \"already-deployed\" && !force) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.contractStatus\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.contractAlreadyDeployed\"),\n\t\t\t1\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeGuidance\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.upgradeGuidanceMessage\"),\n\t\t\t1\n\t\t);\n\t\treturn;\n\t}\n\n\t// Show deployment strategy\n\tCLIDisplay.section(I18n.formatMessage(\"commands.deploy.labels.smartDeployAnalysis\"));\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.upgradeCapability\"),\n\t\tcontractData.upgradeCapabilityId ??\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.noneInitialDeployment\")\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.currentDeployment\"),\n\t\tcontractData.deployedPackageId ??\n\t\t\tI18n.formatMessage(\"commands.deploy.messages.noneNeedsDeploymentUpgrade\")\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.detectedStrategy\"), strategy);\n\n\tif (dryRun) {\n\t\tawait handleDryRunValidation(\n\t\t\tcontractName,\n\t\t\tcontractData,\n\t\t\tconfig,\n\t\t\tnetwork,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t\treturn;\n\t}\n\n\tif (strategy === \"upgrade\") {\n\t\tawait handleContractUpgrade(\n\t\t\tcontractName,\n\t\t\tcontractData,\n\t\t\tconfig,\n\t\t\tnetwork,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t} else {\n\t\tawait handleActualDeployment(\n\t\t\tcontractName,\n\t\t\tcontractData,\n\t\t\tconfig,\n\t\t\tnetwork,\n\t\t\tfaucetUrl,\n\t\t\tdeployerMnemonic,\n\t\t\tdeployerSeed\n\t\t);\n\t}\n}\n\n/**\n * Get wallet address for deployment, preferring seed over mnemonic if available.\n * @param network The target network.\n * @param addressIndex The address index to derive.\n * @param deployerMnemonic The deployer mnemonic from environment variables.\n * @param deployerSeed The deployer seed from environment variables (optional).\n * @returns The wallet address.\n */\nasync function getDeploymentWalletAddress(\n\tnetwork: NetworkTypes,\n\taddressIndex: number,\n\tdeployerMnemonic?: string,\n\tdeployerSeed?: string\n): Promise<string> {\n\t// Try to use seed first if available\n\tconst hexSeed = await getDeploymentSeed(network, deployerSeed);\n\tlet seed: Uint8Array | undefined;\n\tif (Is.stringValue(hexSeed)) {\n\t\tseed = Converter.hexToBytes(hexSeed);\n\t} else {\n\t\tconst mnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\t\tseed = Bip39.mnemonicToSeed(mnemonic);\n\t}\n\n\tconst addresses = Iota.getAddresses(seed, Iota.DEFAULT_COIN_TYPE, 0, addressIndex, 1, false);\n\n\treturn addresses[0];\n}\n\n/**\n * Convert nanos to IOTA (1 IOTA = 1,000,000,000 nanos).\n * @param nanos Balance in nanos.\n * @returns Balance in IOTA.\n */\nfunction nanosToIota(nanos: number): number {\n\treturn nanos / 1_000_000_000;\n}\n\n/**\n * Request funds from the faucet for testnet or devnet deployment.\n * @param network The target network (testnet or devnet).\n * @param walletAddress The wallet address to fund.\n * @param rpcUrl The RPC URL for the network.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @returns Promise that resolves when funding is complete.\n */\nasync function requestFaucetFunds(\n\tnetwork: NetworkTypes,\n\twalletAddress: string,\n\trpcUrl: string,\n\tfaucetUrl: string\n): Promise<void> {\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.deploy.progress.requestingFaucetFunds\", { network })\n\t);\n\n\tconst response = await requestIotaFromFaucetV0({\n\t\thost: faucetUrl,\n\t\trecipient: walletAddress\n\t});\n\n\tif (response?.error) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.fundingFailed\", undefined, response.error);\n\t}\n\n\tconst client = new IotaClient({ url: rpcUrl });\n\tconst balanceResponse = await client.getBalance({ owner: walletAddress });\n\tconst balanceInNanos = Number(balanceResponse.totalBalance);\n\n\tif (balanceInNanos > 0) {\n\t\tconst amountInIota = nanosToIota(balanceInNanos);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.faucetFundsRequested\"),\n\t\t\t`${amountInIota.toFixed(2)} IOTA`,\n\t\t\t1\n\t\t);\n\t} else {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.faucetNoFundsAdded\", { network }),\n\t\t\t2\n\t\t);\n\t}\n}\n\n/**\n * Check wallet balance and request faucet funds only if needed.\n * @param network The target network (testnet or devnet).\n * @param config Network configuration.\n * @param walletAddress The wallet address to check and potentially fund.\n * @param faucetUrl The faucet URL (optional, defaults to network-specific URL).\n * @returns Promise that resolves when balance check and optional funding is complete.\n */\nasync function checkBalanceAndRequestFaucetIfNeeded(\n\tnetwork: NetworkTypes,\n\tconfig: INetworkConfig,\n\twalletAddress: string,\n\tfaucetUrl?: string\n): Promise<void> {\n\t// Check current balance\n\tconst client = new IotaClient({ url: config.rpc.url });\n\tconst balanceResponse = await client.getBalance({ owner: walletAddress });\n\tconst balanceInNanos = Number(balanceResponse.totalBalance);\n\tconst requiredInNanos = config.deployment.gasBudget;\n\t// Convert to IOTA for display purposes\n\tconst balanceInIota = nanosToIota(balanceInNanos);\n\tconst requiredInIota = nanosToIota(requiredInNanos);\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.walletBalance\"),\n\t\t`${balanceInIota.toFixed(2)} IOTA`,\n\t\t1\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.gasBudget\"),\n\t\t`${requiredInIota.toFixed(2)} IOTA`,\n\t\t1\n\t);\n\n\t// Only request faucet funds if balance is insufficient (compare in same units - nanos)\n\tif (balanceInNanos < requiredInNanos) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.warning\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.insufficientBalance\", {\n\t\t\t\tcurrentBalance: balanceInIota.toFixed(2),\n\t\t\t\trequiredBalance: requiredInIota.toFixed(2)\n\t\t\t}),\n\t\t\t1\n\t\t);\n\n\t\tif (!Is.stringValue(faucetUrl)) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noFaucetConfigured\");\n\t\t}\n\n\t\tCLIDisplay.task(I18n.formatMessage(\"commands.deploy.progress.requestingAdditionalFaucetFunds\"));\n\t\tawait requestFaucetFunds(network, walletAddress, config.rpc.url, faucetUrl);\n\n\t\t// Check balance again after faucet request\n\t\tconst updatedBalanceResponse = await client.getBalance({ owner: walletAddress });\n\t\tconst updatedBalanceInNanos = Number(updatedBalanceResponse.totalBalance);\n\t\tconst updatedBalanceInIota = nanosToIota(updatedBalanceInNanos);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.updatedWalletBalance\"),\n\t\t\t`${updatedBalanceInIota.toFixed(2)} IOTA`,\n\t\t\t1\n\t\t);\n\t} else {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.balanceCheck\"),\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.sufficientFundsAvailable\"),\n\t\t\t1\n\t\t);\n\t}\n}\n\n/**\n * Deploy contract using IOTA CLI.\n * @param gasBudget Gas budget for deployment.\n * @returns Deployment result with package ID, upgrade cap, and migration state ID.\n */\nasync function deployWithIotaCli(\n\tgasBudget: number\n): Promise<{ packageId: string; upgradeCap?: string; migrationStateId?: string }> {\n\t// Find the Move project directory\n\tconst moveTomlPaths: string[] = [];\n\tconst cwd = process.cwd();\n\tawait searchDirectoryForMoveToml(cwd, moveTomlPaths);\n\n\tif (moveTomlPaths.length === 0) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.noMoveTomlFilesFound\", {\n\t\t\tcurrentDir: cwd\n\t\t});\n\t}\n\n\t// Prioritize Move.toml in current directory, then use first found\n\tconst currentDirMoveToml = path.join(cwd, \"Move.toml\");\n\tconst selectedMoveToml = moveTomlPaths.find(p => p === currentDirMoveToml) ?? moveTomlPaths[0];\n\n\t// Use the actual Move project directory\n\tconst moveProjectRoot = path.dirname(selectedMoveToml);\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.moveProjectRoot\"),\n\t\tmoveProjectRoot,\n\t\t1\n\t);\n\n\tconst publishCmd = `iota client publish --gas-budget ${gasBudget} --json`;\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.deploy.labels.publishCommand\"), publishCmd, 1);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.workingDirectory\"),\n\t\tmoveProjectRoot,\n\t\t1\n\t);\n\n\ttry {\n\t\tconst { stdout: output } = await execAsyncWithError(publishCmd, { cwd: moveProjectRoot });\n\t\tconst result = JSON.parse(output);\n\n\t\t// Extract package ID from published object\n\t\tconst packageId = result.objectChanges?.find(\n\t\t\t(change: { type: string; packageId?: string }) => change.type === \"published\"\n\t\t)?.packageId;\n\n\t\tif (!packageId) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.packageIdNotFound\", {\n\t\t\t\tresult\n\t\t\t});\n\t\t}\n\n\t\t// Extract UpgradeCap ID from created objects\n\t\tconst upgradeCap = result.objectChanges?.find(\n\t\t\t(change: { objectType?: string; objectId?: string }) =>\n\t\t\t\tchange.objectType === \"0x2::package::UpgradeCap\"\n\t\t)?.objectId;\n\n\t\t// Extract MigrationState ID from created objects\n\t\tconst migrationStateId = result.objectChanges?.find(\n\t\t\t(change: { objectType?: string; objectId?: string }) =>\n\t\t\t\tchange.objectType?.endsWith(\"::MigrationState\")\n\t\t)?.objectId;\n\n\t\treturn {\n\t\t\tpackageId,\n\t\t\tupgradeCap,\n\t\t\tmigrationStateId\n\t\t};\n\t} catch (err) {\n\t\tthrow new GeneralError(\"commands\", \"commands.deploy.deploymentFailed\", undefined, err);\n\t}\n}\n\n/**\n * Update contracts file with deployed package IDs.\n * @param contractsPath Path to contracts file.\n * @param contractsData Updated contracts data.\n */\nasync function updateContractsFile(\n\tcontractsPath: string,\n\tcontractsData: ISmartContractDeployments\n): Promise<void> {\n\ttry {\n\t\tawait CLIUtils.writeJsonFile(contractsPath, contractsData, false);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.deploy.labels.updatedContractsFile\"),\n\t\t\tcontractsPath,\n\t\t\t1\n\t\t);\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.contractsFileUpdateFailed\",\n\t\t\t{ contractsPath },\n\t\t\terr\n\t\t);\n\t}\n}\n\n/**\n * Generate a unique backup alias that doesn't conflict with existing keys.\n * Uses cryptographically secure random bytes to avoid conflicts.\n * @param baseAlias The original alias name.\n * @param existingKeys Array of existing keys from keystore.\n * @returns A unique backup alias name.\n */\nexport function generateUniqueBackupAlias(\n\tbaseAlias: string,\n\texistingKeys: { alias: string; iotaAddress: string }[]\n): string {\n\tconst existingAliases = new Set(existingKeys.map(key => key.alias));\n\n\t// Generate cryptographically secure random identifier\n\tconst randomSuffix = Converter.bytesToHex(RandomHelper.generate(4));\n\tconst backupAlias = `${baseAlias}-backup-${randomSuffix}`;\n\n\t// In the extremely unlikely event of collision, add timestamp\n\tif (existingAliases.has(backupAlias)) {\n\t\treturn `${baseAlias}-backup-${Date.now()}-${randomSuffix}`;\n\t}\n\n\treturn backupAlias;\n}\n\n/**\n * Ensure the correct deployer key exists in the keystore with the expected address.\n * If a conflicting alias exists, rename it and import the correct key.\n * @param network The target network.\n * @param aliasName The desired alias name (e.g., \"deployer-testnet\").\n * @param expectedAddress The expected address from the current mnemonic.\n * @param addressIndex The address index to use.\n * @param deployerMnemonic The deployer mnemonic.\n */\nexport async function ensureCorrectDeployerKey(\n\tnetwork: NetworkTypes,\n\taliasName: string,\n\texpectedAddress: string,\n\taddressIndex: number,\n\tdeployerMnemonic: string\n): Promise<void> {\n\ttry {\n\t\t// Check if the alias already exists in keystore\n\t\tconst { stdout: keysListOutput } = await execAsyncWithError(\"iota keytool list --json\");\n\t\tconst keysList = JSON.parse(keysListOutput);\n\n\t\t// Find existing key with the target alias\n\t\tconst existingKey = keysList.find(\n\t\t\t(key: { alias: string; iotaAddress: string }) => key.alias === aliasName\n\t\t);\n\n\t\tif (existingKey) {\n\t\t\t// Check if existing key has the correct address\n\t\t\tconst existingAddress = existingKey.iotaAddress;\n\n\t\t\tif (existingAddress !== expectedAddress) {\n\t\t\t\t// Conflicting alias exists with wrong mnemonic - rename it\n\t\t\t\tCLIDisplay.task(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.progress.renamingConflictingKey\", { aliasName })\n\t\t\t\t);\n\n\t\t\t\tconst backupAlias = generateUniqueBackupAlias(aliasName, keysList);\n\t\t\t\tawait execAsyncWithError(`iota keytool update-alias \"${aliasName}\" \"${backupAlias}\"`);\n\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.renamedExistingKey\"),\n\t\t\t\t\t`${aliasName} → ${backupAlias} (${existingAddress})`,\n\t\t\t\t\t1\n\t\t\t\t);\n\n\t\t\t\t// Now import the correct key with the desired alias\n\t\t\t\tawait importCorrectDeployerKey(\n\t\t\t\t\tnetwork,\n\t\t\t\t\taliasName,\n\t\t\t\t\taddressIndex,\n\t\t\t\t\texpectedAddress,\n\t\t\t\t\tdeployerMnemonic\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Existing key is correct - no action needed\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"commands.deploy.labels.usingExistingCorrectKey\"),\n\t\t\t\t\t`${aliasName} (${expectedAddress})`,\n\t\t\t\t\t1\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// No existing alias - import the key\n\t\t\tawait importCorrectDeployerKey(\n\t\t\t\tnetwork,\n\t\t\t\taliasName,\n\t\t\t\taddressIndex,\n\t\t\t\texpectedAddress,\n\t\t\t\tdeployerMnemonic\n\t\t\t);\n\t\t}\n\n\t\t// Verify the address exists in client addresses\n\t\tconst { stdout: addressListOutput } = await execAsyncWithError(\"iota client addresses --json\");\n\t\tconst addressInfo = JSON.parse(addressListOutput);\n\t\tconst addressExists: boolean = addressInfo.addresses.some(\n\t\t\t([_, addr]: [string, string]) => addr === expectedAddress\n\t\t);\n\n\t\tif (!addressExists) {\n\t\t\tthrow new GeneralError(\"commands\", \"commands.deploy.addressNotInClient\", {\n\t\t\t\texpectedAddress,\n\t\t\t\taliasName\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.deploy.deployerKeySetupFailed\",\n\t\t\t{ network, aliasName, expectedAddress },\n\t\t\terror\n\t\t);\n\t}\n}\n\n/**\n * Import the deployer key with the correct mnemonic.\n * @param network The target network.\n * @param aliasName The alias name to use.\n * @param addressIndex The address index.\n * @param targetAddress The expected target address (avoids redundant calculation).\n * @param deployerMnemonic The deployer mnemonic.\n */\nasync function importCorrectDeployerKey(\n\tnetwork: NetworkTypes,\n\taliasName: string,\n\taddressIndex: number,\n\ttargetAddress: string,\n\tdeployerMnemonic: string\n): Promise<void> {\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.deploy.progress.importingDeployerKey\", { aliasName })\n\t);\n\n\tconst mnemonic = await getDeploymentMnemonic(network, deployerMnemonic);\n\tconst derivationPath = Bip44.path(Iota.DEFAULT_COIN_TYPE, 0, false, addressIndex).toString();\n\n\tawait execAsyncWithError(\n\t\t`iota keytool import \"${mnemonic}\" ed25519 \"${derivationPath}\" --alias \"${aliasName}\"`\n\t);\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.deploy.labels.importedDeployerKey\"),\n\t\t`${aliasName} (${targetAddress})`,\n\t\t1\n\t);\n}\n"]}
|
package/dist/locales/en.json
CHANGED
|
@@ -353,9 +353,6 @@
|
|
|
353
353
|
"transactionCosts": "Transaction costs for operation \"{operation}\", \"{cost}\""
|
|
354
354
|
}
|
|
355
355
|
},
|
|
356
|
-
"errorMessages": {
|
|
357
|
-
"fetch": "Fetch"
|
|
358
|
-
},
|
|
359
356
|
"commands": {
|
|
360
357
|
"build": {
|
|
361
358
|
"description": "Compiles Move smart contracts using the IOTA CLI and generates a network-aware JSON structure containing compiled bytecode modules.",
|
|
@@ -505,7 +502,9 @@
|
|
|
505
502
|
"upgradeGuidance": "Upgrade Guidance",
|
|
506
503
|
"previousDeployment": "Previous Deployment",
|
|
507
504
|
"currentDeployment": "Current Deployment",
|
|
508
|
-
"buildValidation": "Build Validation"
|
|
505
|
+
"buildValidation": "Build Validation",
|
|
506
|
+
"onChainPackageId": "On-chain UpgradeCap Package",
|
|
507
|
+
"onChainVersion": "On-chain UpgradeCap Version"
|
|
509
508
|
},
|
|
510
509
|
"progress": {
|
|
511
510
|
"checkingEnvironment": "Checking IOTA CLI environment...",
|
|
@@ -514,7 +513,8 @@
|
|
|
514
513
|
"requestingFaucetFunds": "Requesting funds from {network} faucet...",
|
|
515
514
|
"requestingAdditionalFaucetFunds": "Requesting additional funds from faucet...",
|
|
516
515
|
"renamingConflictingKey": "Renaming conflicting key alias \"{aliasName}\" to preserve existing key",
|
|
517
|
-
"importingDeployerKey": "Importing deployer key as \"{aliasName}\""
|
|
516
|
+
"importingDeployerKey": "Importing deployer key as \"{aliasName}\"",
|
|
517
|
+
"queryingUpgradeCap": "Querying on-chain UpgradeCap to validate published-at..."
|
|
518
518
|
},
|
|
519
519
|
"messages": {
|
|
520
520
|
"contractAlreadyDeployed": "Contract already deployed, no changes detected",
|
|
@@ -522,7 +522,8 @@
|
|
|
522
522
|
"noneInitialDeployment": "None - Initial deployment",
|
|
523
523
|
"noneNeedsDeploymentUpgrade": "None - Needs deployment/upgrade",
|
|
524
524
|
"originalConfigurationRestored": "Original configuration restored",
|
|
525
|
-
"contractBuiltAndReadyForUpgrade": "Contract has been built and is ready for upgrade"
|
|
525
|
+
"contractBuiltAndReadyForUpgrade": "Contract has been built and is ready for upgrade",
|
|
526
|
+
"staleJsonDetected": "Stale deployment JSON detected. JSON has \"{jsonPackageId}\" but on-chain UpgradeCap has \"{onChainPackageId}\". Using on-chain value."
|
|
526
527
|
},
|
|
527
528
|
"section": {
|
|
528
529
|
"deployContracts": "Deploy Contracts"
|
package/docs/changelog.md
CHANGED
|
@@ -1,11 +1,39 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## [0.0.3-next.
|
|
3
|
+
## [0.0.3-next.9](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.8...move-to-json-v0.0.3-next.9) (2026-05-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Miscellaneous Chores
|
|
7
|
+
|
|
8
|
+
* **move-to-json:** Synchronize repo versions
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/dlt-iota bumped from 0.0.3-next.8 to 0.0.3-next.9
|
|
16
|
+
|
|
17
|
+
## [0.0.3-next.8](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.7...move-to-json-v0.0.3-next.8) (2026-03-16)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* validate published-at against on-chain UpgradeCap before upgrade ([#62](https://github.com/iotaledger/twin-dlt/issues/62)) ([23b49e2](https://github.com/iotaledger/twin-dlt/commit/23b49e247b89d2e363f9420b01fa35941f73be12))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Dependencies
|
|
26
|
+
|
|
27
|
+
* The following workspace dependencies were updated
|
|
28
|
+
* dependencies
|
|
29
|
+
* @twin.org/dlt-iota bumped from 0.0.3-next.7 to 0.0.3-next.8
|
|
30
|
+
|
|
31
|
+
## [0.0.3-next.7](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.6...move-to-json-v0.0.3-next.7) (2026-03-13)
|
|
4
32
|
|
|
5
33
|
|
|
6
34
|
### Bug Fixes
|
|
7
35
|
|
|
8
|
-
* buffer usage required for identity ([#60](https://github.com/
|
|
36
|
+
* buffer usage required for identity ([#60](https://github.com/iotaledger/twin-dlt/issues/60)) ([0ba7d16](https://github.com/iotaledger/twin-dlt/commit/0ba7d165662b0083aa2b4c1325dd8c2e65defa2e))
|
|
9
37
|
|
|
10
38
|
|
|
11
39
|
### Dependencies
|
|
@@ -14,12 +42,12 @@
|
|
|
14
42
|
* dependencies
|
|
15
43
|
* @twin.org/dlt-iota bumped from 0.0.3-next.6 to 0.0.3-next.7
|
|
16
44
|
|
|
17
|
-
## [0.0.3-next.6](https://github.com/
|
|
45
|
+
## [0.0.3-next.6](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.5...move-to-json-v0.0.3-next.6) (2026-03-12)
|
|
18
46
|
|
|
19
47
|
|
|
20
48
|
### Features
|
|
21
49
|
|
|
22
|
-
* add IotaIdentityUtils to resolve IOTA identity controller cap info ([#57](https://github.com/
|
|
50
|
+
* add IotaIdentityUtils to resolve IOTA identity controller cap info ([#57](https://github.com/iotaledger/twin-dlt/issues/57)) ([f15281a](https://github.com/iotaledger/twin-dlt/commit/f15281af3b2812bde5130a1813f9c0143f1462bf))
|
|
23
51
|
|
|
24
52
|
|
|
25
53
|
### Dependencies
|
|
@@ -28,12 +56,12 @@
|
|
|
28
56
|
* dependencies
|
|
29
57
|
* @twin.org/dlt-iota bumped from 0.0.3-next.5 to 0.0.3-next.6
|
|
30
58
|
|
|
31
|
-
## [0.0.3-next.5](https://github.com/
|
|
59
|
+
## [0.0.3-next.5](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.4...move-to-json-v0.0.3-next.5) (2026-03-03)
|
|
32
60
|
|
|
33
61
|
|
|
34
62
|
### Bug Fixes
|
|
35
63
|
|
|
36
|
-
* additional debugging ([0d335a5](https://github.com/
|
|
64
|
+
* additional debugging ([0d335a5](https://github.com/iotaledger/twin-dlt/commit/0d335a594a34dea047fa0ee4143b2d519183b704))
|
|
37
65
|
|
|
38
66
|
|
|
39
67
|
### Dependencies
|
|
@@ -42,7 +70,7 @@
|
|
|
42
70
|
* dependencies
|
|
43
71
|
* @twin.org/dlt-iota bumped from 0.0.3-next.4 to 0.0.3-next.5
|
|
44
72
|
|
|
45
|
-
## [0.0.3-next.4](https://github.com/
|
|
73
|
+
## [0.0.3-next.4](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.3...move-to-json-v0.0.3-next.4) (2026-02-25)
|
|
46
74
|
|
|
47
75
|
|
|
48
76
|
### Miscellaneous Chores
|
|
@@ -56,37 +84,37 @@
|
|
|
56
84
|
* dependencies
|
|
57
85
|
* @twin.org/dlt-iota bumped from 0.0.3-next.3 to 0.0.3-next.4
|
|
58
86
|
|
|
59
|
-
## [0.0.3-next.3](https://github.com/
|
|
87
|
+
## [0.0.3-next.3](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.2...move-to-json-v0.0.3-next.3) (2026-02-25)
|
|
60
88
|
|
|
61
89
|
|
|
62
90
|
### Features
|
|
63
91
|
|
|
64
|
-
* add context id features ([#51](https://github.com/
|
|
65
|
-
* add header for CLI check ([#8](https://github.com/
|
|
66
|
-
* add validate-locales ([8465099](https://github.com/
|
|
67
|
-
* bytecode change detection ([#43](https://github.com/
|
|
68
|
-
* consolidate environment management ([#41](https://github.com/
|
|
69
|
-
* eslint migration to flat config ([83b56f0](https://github.com/
|
|
70
|
-
* eslint migration to flat config ([da1d12d](https://github.com/
|
|
71
|
-
* methods for alias handling and tests ([#38](https://github.com/
|
|
72
|
-
* move to json build deploy commands ([#30](https://github.com/
|
|
73
|
-
* remove local error handling as CLI base already handles this ([fc5a083](https://github.com/
|
|
74
|
-
* update dependencies ([bfbe8fc](https://github.com/
|
|
75
|
-
* update dependencies ([f7b71c2](https://github.com/
|
|
76
|
-
* update framework core ([79fc4b9](https://github.com/
|
|
77
|
-
* upgrade capabilities ([#32](https://github.com/
|
|
78
|
-
* use new CLIParam.arrayOnOf ([1f6458a](https://github.com/
|
|
79
|
-
* use shared store mechanism ([#10](https://github.com/
|
|
92
|
+
* add context id features ([#51](https://github.com/iotaledger/twin-dlt/issues/51)) ([fb68498](https://github.com/iotaledger/twin-dlt/commit/fb6849897957904ec90cf6368153aeff3bef261a))
|
|
93
|
+
* add header for CLI check ([#8](https://github.com/iotaledger/twin-dlt/issues/8)) ([0b9f271](https://github.com/iotaledger/twin-dlt/commit/0b9f2711fb3a9eb859e481725bfa1e2139e14053))
|
|
94
|
+
* add validate-locales ([8465099](https://github.com/iotaledger/twin-dlt/commit/8465099626ab1891d419a35870fae447efc3008d))
|
|
95
|
+
* bytecode change detection ([#43](https://github.com/iotaledger/twin-dlt/issues/43)) ([528469c](https://github.com/iotaledger/twin-dlt/commit/528469c1e4f032c6a936a9724a692abe403d92f6))
|
|
96
|
+
* consolidate environment management ([#41](https://github.com/iotaledger/twin-dlt/issues/41)) ([add1618](https://github.com/iotaledger/twin-dlt/commit/add161828e5dc42880fb0a5f9d3e61e611cf92bb))
|
|
97
|
+
* eslint migration to flat config ([83b56f0](https://github.com/iotaledger/twin-dlt/commit/83b56f02b1483f77c5f4cb9d7a1c345c56631333))
|
|
98
|
+
* eslint migration to flat config ([da1d12d](https://github.com/iotaledger/twin-dlt/commit/da1d12dcf5b24e7ba6204f540c27de191bca098e))
|
|
99
|
+
* methods for alias handling and tests ([#38](https://github.com/iotaledger/twin-dlt/issues/38)) ([43e0062](https://github.com/iotaledger/twin-dlt/commit/43e006220b4cf3df1aceb52b62178be0395ede00))
|
|
100
|
+
* move to json build deploy commands ([#30](https://github.com/iotaledger/twin-dlt/issues/30)) ([91aa00a](https://github.com/iotaledger/twin-dlt/commit/91aa00a29a8d7e3a99a46cea89e879a12dffc188))
|
|
101
|
+
* remove local error handling as CLI base already handles this ([fc5a083](https://github.com/iotaledger/twin-dlt/commit/fc5a083303f8c92cc264f782a2d292436da18031))
|
|
102
|
+
* update dependencies ([bfbe8fc](https://github.com/iotaledger/twin-dlt/commit/bfbe8fcfda80aa59d04f4ade3e4012e5291c8877))
|
|
103
|
+
* update dependencies ([f7b71c2](https://github.com/iotaledger/twin-dlt/commit/f7b71c24274b71e2d37c26c4a7e5e6d9df1dc9b7))
|
|
104
|
+
* update framework core ([79fc4b9](https://github.com/iotaledger/twin-dlt/commit/79fc4b961bd755437cad98d733ca9e25476bc03f))
|
|
105
|
+
* upgrade capabilities ([#32](https://github.com/iotaledger/twin-dlt/issues/32)) ([437219f](https://github.com/iotaledger/twin-dlt/commit/437219f0f784ec38353c01e1c8ce6bfba3b1b530))
|
|
106
|
+
* use new CLIParam.arrayOnOf ([1f6458a](https://github.com/iotaledger/twin-dlt/commit/1f6458a44486dfa5ddbf61bd63b85a98ec561728))
|
|
107
|
+
* use shared store mechanism ([#10](https://github.com/iotaledger/twin-dlt/issues/10)) ([ce36214](https://github.com/iotaledger/twin-dlt/commit/ce36214577f02cbb9642f831cb2c21335c31cc9a))
|
|
80
108
|
|
|
81
109
|
|
|
82
110
|
### Bug Fixes
|
|
83
111
|
|
|
84
|
-
* adding dependencies ([#45](https://github.com/
|
|
85
|
-
* docs ([cade544](https://github.com/
|
|
86
|
-
* i18n messages ([4b61495](https://github.com/
|
|
87
|
-
* missing dependency ([16f363c](https://github.com/
|
|
88
|
-
* modifying logging type param ([#36](https://github.com/
|
|
89
|
-
* update console output ([8cb193e](https://github.com/
|
|
112
|
+
* adding dependencies ([#45](https://github.com/iotaledger/twin-dlt/issues/45)) ([969f598](https://github.com/iotaledger/twin-dlt/commit/969f59807a0a0585dfe7d078b2cb38f197afb5d6))
|
|
113
|
+
* docs ([cade544](https://github.com/iotaledger/twin-dlt/commit/cade5443a4b955d592c1622f07499ad8a3d554b6))
|
|
114
|
+
* i18n messages ([4b61495](https://github.com/iotaledger/twin-dlt/commit/4b614957ea84d8af43345892cae3256dfa457483))
|
|
115
|
+
* missing dependency ([16f363c](https://github.com/iotaledger/twin-dlt/commit/16f363cde935d3b30cf86e01cb12f0390bfc8648))
|
|
116
|
+
* modifying logging type param ([#36](https://github.com/iotaledger/twin-dlt/issues/36)) ([b884fcc](https://github.com/iotaledger/twin-dlt/commit/b884fccef5bea5c6818cf8bfa8af197d3622cac6))
|
|
117
|
+
* update console output ([8cb193e](https://github.com/iotaledger/twin-dlt/commit/8cb193e2704e1e391d4c3c5899b765ca12471ef3))
|
|
90
118
|
|
|
91
119
|
|
|
92
120
|
### Dependencies
|
|
@@ -95,12 +123,12 @@
|
|
|
95
123
|
* dependencies
|
|
96
124
|
* @twin.org/dlt-iota bumped from 0.0.3-next.2 to 0.0.3-next.3
|
|
97
125
|
|
|
98
|
-
## [0.0.3-next.2](https://github.com/
|
|
126
|
+
## [0.0.3-next.2](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.1...move-to-json-v0.0.3-next.2) (2026-02-25)
|
|
99
127
|
|
|
100
128
|
|
|
101
129
|
### Bug Fixes
|
|
102
130
|
|
|
103
|
-
* missing dependency ([16f363c](https://github.com/
|
|
131
|
+
* missing dependency ([16f363c](https://github.com/iotaledger/twin-dlt/commit/16f363cde935d3b30cf86e01cb12f0390bfc8648))
|
|
104
132
|
|
|
105
133
|
|
|
106
134
|
### Dependencies
|
|
@@ -109,35 +137,35 @@
|
|
|
109
137
|
* dependencies
|
|
110
138
|
* @twin.org/dlt-iota bumped from 0.0.3-next.1 to 0.0.3-next.2
|
|
111
139
|
|
|
112
|
-
## [0.0.3-next.1](https://github.com/
|
|
140
|
+
## [0.0.3-next.1](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.3-next.0...move-to-json-v0.0.3-next.1) (2025-11-11)
|
|
113
141
|
|
|
114
142
|
|
|
115
143
|
### Features
|
|
116
144
|
|
|
117
|
-
* add context id features ([#51](https://github.com/
|
|
118
|
-
* add header for CLI check ([#8](https://github.com/
|
|
119
|
-
* add validate-locales ([8465099](https://github.com/
|
|
120
|
-
* bytecode change detection ([#43](https://github.com/
|
|
121
|
-
* consolidate environment management ([#41](https://github.com/
|
|
122
|
-
* eslint migration to flat config ([83b56f0](https://github.com/
|
|
123
|
-
* eslint migration to flat config ([da1d12d](https://github.com/
|
|
124
|
-
* methods for alias handling and tests ([#38](https://github.com/
|
|
125
|
-
* move to json build deploy commands ([#30](https://github.com/
|
|
126
|
-
* remove local error handling as CLI base already handles this ([fc5a083](https://github.com/
|
|
127
|
-
* update dependencies ([f7b71c2](https://github.com/
|
|
128
|
-
* update framework core ([79fc4b9](https://github.com/
|
|
129
|
-
* upgrade capabilities ([#32](https://github.com/
|
|
130
|
-
* use new CLIParam.arrayOnOf ([1f6458a](https://github.com/
|
|
131
|
-
* use shared store mechanism ([#10](https://github.com/
|
|
145
|
+
* add context id features ([#51](https://github.com/iotaledger/twin-dlt/issues/51)) ([fb68498](https://github.com/iotaledger/twin-dlt/commit/fb6849897957904ec90cf6368153aeff3bef261a))
|
|
146
|
+
* add header for CLI check ([#8](https://github.com/iotaledger/twin-dlt/issues/8)) ([0b9f271](https://github.com/iotaledger/twin-dlt/commit/0b9f2711fb3a9eb859e481725bfa1e2139e14053))
|
|
147
|
+
* add validate-locales ([8465099](https://github.com/iotaledger/twin-dlt/commit/8465099626ab1891d419a35870fae447efc3008d))
|
|
148
|
+
* bytecode change detection ([#43](https://github.com/iotaledger/twin-dlt/issues/43)) ([528469c](https://github.com/iotaledger/twin-dlt/commit/528469c1e4f032c6a936a9724a692abe403d92f6))
|
|
149
|
+
* consolidate environment management ([#41](https://github.com/iotaledger/twin-dlt/issues/41)) ([add1618](https://github.com/iotaledger/twin-dlt/commit/add161828e5dc42880fb0a5f9d3e61e611cf92bb))
|
|
150
|
+
* eslint migration to flat config ([83b56f0](https://github.com/iotaledger/twin-dlt/commit/83b56f02b1483f77c5f4cb9d7a1c345c56631333))
|
|
151
|
+
* eslint migration to flat config ([da1d12d](https://github.com/iotaledger/twin-dlt/commit/da1d12dcf5b24e7ba6204f540c27de191bca098e))
|
|
152
|
+
* methods for alias handling and tests ([#38](https://github.com/iotaledger/twin-dlt/issues/38)) ([43e0062](https://github.com/iotaledger/twin-dlt/commit/43e006220b4cf3df1aceb52b62178be0395ede00))
|
|
153
|
+
* move to json build deploy commands ([#30](https://github.com/iotaledger/twin-dlt/issues/30)) ([91aa00a](https://github.com/iotaledger/twin-dlt/commit/91aa00a29a8d7e3a99a46cea89e879a12dffc188))
|
|
154
|
+
* remove local error handling as CLI base already handles this ([fc5a083](https://github.com/iotaledger/twin-dlt/commit/fc5a083303f8c92cc264f782a2d292436da18031))
|
|
155
|
+
* update dependencies ([f7b71c2](https://github.com/iotaledger/twin-dlt/commit/f7b71c24274b71e2d37c26c4a7e5e6d9df1dc9b7))
|
|
156
|
+
* update framework core ([79fc4b9](https://github.com/iotaledger/twin-dlt/commit/79fc4b961bd755437cad98d733ca9e25476bc03f))
|
|
157
|
+
* upgrade capabilities ([#32](https://github.com/iotaledger/twin-dlt/issues/32)) ([437219f](https://github.com/iotaledger/twin-dlt/commit/437219f0f784ec38353c01e1c8ce6bfba3b1b530))
|
|
158
|
+
* use new CLIParam.arrayOnOf ([1f6458a](https://github.com/iotaledger/twin-dlt/commit/1f6458a44486dfa5ddbf61bd63b85a98ec561728))
|
|
159
|
+
* use shared store mechanism ([#10](https://github.com/iotaledger/twin-dlt/issues/10)) ([ce36214](https://github.com/iotaledger/twin-dlt/commit/ce36214577f02cbb9642f831cb2c21335c31cc9a))
|
|
132
160
|
|
|
133
161
|
|
|
134
162
|
### Bug Fixes
|
|
135
163
|
|
|
136
|
-
* adding dependencies ([#45](https://github.com/
|
|
137
|
-
* docs ([cade544](https://github.com/
|
|
138
|
-
* i18n messages ([4b61495](https://github.com/
|
|
139
|
-
* modifying logging type param ([#36](https://github.com/
|
|
140
|
-
* update console output ([8cb193e](https://github.com/
|
|
164
|
+
* adding dependencies ([#45](https://github.com/iotaledger/twin-dlt/issues/45)) ([969f598](https://github.com/iotaledger/twin-dlt/commit/969f59807a0a0585dfe7d078b2cb38f197afb5d6))
|
|
165
|
+
* docs ([cade544](https://github.com/iotaledger/twin-dlt/commit/cade5443a4b955d592c1622f07499ad8a3d554b6))
|
|
166
|
+
* i18n messages ([4b61495](https://github.com/iotaledger/twin-dlt/commit/4b614957ea84d8af43345892cae3256dfa457483))
|
|
167
|
+
* modifying logging type param ([#36](https://github.com/iotaledger/twin-dlt/issues/36)) ([b884fcc](https://github.com/iotaledger/twin-dlt/commit/b884fccef5bea5c6818cf8bfa8af197d3622cac6))
|
|
168
|
+
* update console output ([8cb193e](https://github.com/iotaledger/twin-dlt/commit/8cb193e2704e1e391d4c3c5899b765ca12471ef3))
|
|
141
169
|
|
|
142
170
|
|
|
143
171
|
### Dependencies
|
|
@@ -146,12 +174,12 @@
|
|
|
146
174
|
* dependencies
|
|
147
175
|
* @twin.org/dlt-iota bumped from 0.0.3-next.0 to 0.0.3-next.1
|
|
148
176
|
|
|
149
|
-
## [0.0.2-next.11](https://github.com/
|
|
177
|
+
## [0.0.2-next.11](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.10...move-to-json-v0.0.2-next.11) (2025-10-09)
|
|
150
178
|
|
|
151
179
|
|
|
152
180
|
### Features
|
|
153
181
|
|
|
154
|
-
* add validate-locales ([8465099](https://github.com/
|
|
182
|
+
* add validate-locales ([8465099](https://github.com/iotaledger/twin-dlt/commit/8465099626ab1891d419a35870fae447efc3008d))
|
|
155
183
|
|
|
156
184
|
|
|
157
185
|
### Dependencies
|
|
@@ -160,12 +188,12 @@
|
|
|
160
188
|
* dependencies
|
|
161
189
|
* @twin.org/dlt-iota bumped from 0.0.2-next.10 to 0.0.2-next.11
|
|
162
190
|
|
|
163
|
-
## [0.0.2-next.10](https://github.com/
|
|
191
|
+
## [0.0.2-next.10](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.9...move-to-json-v0.0.2-next.10) (2025-09-29)
|
|
164
192
|
|
|
165
193
|
|
|
166
194
|
### Bug Fixes
|
|
167
195
|
|
|
168
|
-
* adding dependencies ([#45](https://github.com/
|
|
196
|
+
* adding dependencies ([#45](https://github.com/iotaledger/twin-dlt/issues/45)) ([969f598](https://github.com/iotaledger/twin-dlt/commit/969f59807a0a0585dfe7d078b2cb38f197afb5d6))
|
|
169
197
|
|
|
170
198
|
|
|
171
199
|
### Dependencies
|
|
@@ -174,19 +202,19 @@
|
|
|
174
202
|
* dependencies
|
|
175
203
|
* @twin.org/dlt-iota bumped from 0.0.2-next.9 to 0.0.2-next.10
|
|
176
204
|
|
|
177
|
-
## [0.0.2-next.9](https://github.com/
|
|
205
|
+
## [0.0.2-next.9](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.8...move-to-json-v0.0.2-next.9) (2025-09-22)
|
|
178
206
|
|
|
179
207
|
|
|
180
208
|
### Features
|
|
181
209
|
|
|
182
|
-
* bytecode change detection ([#43](https://github.com/
|
|
183
|
-
* remove local error handling as CLI base already handles this ([fc5a083](https://github.com/
|
|
184
|
-
* use new CLIParam.arrayOnOf ([1f6458a](https://github.com/
|
|
210
|
+
* bytecode change detection ([#43](https://github.com/iotaledger/twin-dlt/issues/43)) ([528469c](https://github.com/iotaledger/twin-dlt/commit/528469c1e4f032c6a936a9724a692abe403d92f6))
|
|
211
|
+
* remove local error handling as CLI base already handles this ([fc5a083](https://github.com/iotaledger/twin-dlt/commit/fc5a083303f8c92cc264f782a2d292436da18031))
|
|
212
|
+
* use new CLIParam.arrayOnOf ([1f6458a](https://github.com/iotaledger/twin-dlt/commit/1f6458a44486dfa5ddbf61bd63b85a98ec561728))
|
|
185
213
|
|
|
186
214
|
|
|
187
215
|
### Bug Fixes
|
|
188
216
|
|
|
189
|
-
* i18n messages ([4b61495](https://github.com/
|
|
217
|
+
* i18n messages ([4b61495](https://github.com/iotaledger/twin-dlt/commit/4b614957ea84d8af43345892cae3256dfa457483))
|
|
190
218
|
|
|
191
219
|
|
|
192
220
|
### Dependencies
|
|
@@ -195,13 +223,13 @@
|
|
|
195
223
|
* dependencies
|
|
196
224
|
* @twin.org/dlt-iota bumped from 0.0.2-next.8 to 0.0.2-next.9
|
|
197
225
|
|
|
198
|
-
## [0.0.2-next.8](https://github.com/
|
|
226
|
+
## [0.0.2-next.8](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.7...move-to-json-v0.0.2-next.8) (2025-09-10)
|
|
199
227
|
|
|
200
228
|
|
|
201
229
|
### Features
|
|
202
230
|
|
|
203
|
-
* consolidate environment management ([#41](https://github.com/
|
|
204
|
-
* eslint migration to flat config ([83b56f0](https://github.com/
|
|
231
|
+
* consolidate environment management ([#41](https://github.com/iotaledger/twin-dlt/issues/41)) ([add1618](https://github.com/iotaledger/twin-dlt/commit/add161828e5dc42880fb0a5f9d3e61e611cf92bb))
|
|
232
|
+
* eslint migration to flat config ([83b56f0](https://github.com/iotaledger/twin-dlt/commit/83b56f02b1483f77c5f4cb9d7a1c345c56631333))
|
|
205
233
|
|
|
206
234
|
|
|
207
235
|
### Dependencies
|
|
@@ -210,12 +238,12 @@
|
|
|
210
238
|
* dependencies
|
|
211
239
|
* @twin.org/dlt-iota bumped from 0.0.2-next.7 to 0.0.2-next.8
|
|
212
240
|
|
|
213
|
-
## [0.0.2-next.7](https://github.com/
|
|
241
|
+
## [0.0.2-next.7](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.6...move-to-json-v0.0.2-next.7) (2025-08-29)
|
|
214
242
|
|
|
215
243
|
|
|
216
244
|
### Features
|
|
217
245
|
|
|
218
|
-
* eslint migration to flat config ([da1d12d](https://github.com/
|
|
246
|
+
* eslint migration to flat config ([da1d12d](https://github.com/iotaledger/twin-dlt/commit/da1d12dcf5b24e7ba6204f540c27de191bca098e))
|
|
219
247
|
|
|
220
248
|
|
|
221
249
|
### Dependencies
|
|
@@ -224,12 +252,12 @@
|
|
|
224
252
|
* dependencies
|
|
225
253
|
* @twin.org/dlt-iota bumped from 0.0.2-next.6 to 0.0.2-next.7
|
|
226
254
|
|
|
227
|
-
## [0.0.2-next.6](https://github.com/
|
|
255
|
+
## [0.0.2-next.6](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.5...move-to-json-v0.0.2-next.6) (2025-08-27)
|
|
228
256
|
|
|
229
257
|
|
|
230
258
|
### Features
|
|
231
259
|
|
|
232
|
-
* methods for alias handling and tests ([#38](https://github.com/
|
|
260
|
+
* methods for alias handling and tests ([#38](https://github.com/iotaledger/twin-dlt/issues/38)) ([43e0062](https://github.com/iotaledger/twin-dlt/commit/43e006220b4cf3df1aceb52b62178be0395ede00))
|
|
233
261
|
|
|
234
262
|
|
|
235
263
|
### Dependencies
|
|
@@ -238,12 +266,12 @@
|
|
|
238
266
|
* dependencies
|
|
239
267
|
* @twin.org/dlt-iota bumped from 0.0.2-next.5 to 0.0.2-next.6
|
|
240
268
|
|
|
241
|
-
## [0.0.2-next.5](https://github.com/
|
|
269
|
+
## [0.0.2-next.5](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.4...move-to-json-v0.0.2-next.5) (2025-08-25)
|
|
242
270
|
|
|
243
271
|
|
|
244
272
|
### Bug Fixes
|
|
245
273
|
|
|
246
|
-
* modifying logging type param ([#36](https://github.com/
|
|
274
|
+
* modifying logging type param ([#36](https://github.com/iotaledger/twin-dlt/issues/36)) ([b884fcc](https://github.com/iotaledger/twin-dlt/commit/b884fccef5bea5c6818cf8bfa8af197d3622cac6))
|
|
247
275
|
|
|
248
276
|
|
|
249
277
|
### Dependencies
|
|
@@ -252,12 +280,12 @@
|
|
|
252
280
|
* dependencies
|
|
253
281
|
* @twin.org/dlt-iota bumped from 0.0.2-next.4 to 0.0.2-next.5
|
|
254
282
|
|
|
255
|
-
## [0.0.2-next.4](https://github.com/
|
|
283
|
+
## [0.0.2-next.4](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.3...move-to-json-v0.0.2-next.4) (2025-08-22)
|
|
256
284
|
|
|
257
285
|
|
|
258
286
|
### Features
|
|
259
287
|
|
|
260
|
-
* upgrade capabilities ([#32](https://github.com/
|
|
288
|
+
* upgrade capabilities ([#32](https://github.com/iotaledger/twin-dlt/issues/32)) ([437219f](https://github.com/iotaledger/twin-dlt/commit/437219f0f784ec38353c01e1c8ce6bfba3b1b530))
|
|
261
289
|
|
|
262
290
|
|
|
263
291
|
### Dependencies
|
|
@@ -266,17 +294,17 @@
|
|
|
266
294
|
* dependencies
|
|
267
295
|
* @twin.org/dlt-iota bumped from 0.0.2-next.3 to 0.0.2-next.4
|
|
268
296
|
|
|
269
|
-
## [0.0.2-next.3](https://github.com/
|
|
297
|
+
## [0.0.2-next.3](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.2...move-to-json-v0.0.2-next.3) (2025-08-20)
|
|
270
298
|
|
|
271
299
|
|
|
272
300
|
### Features
|
|
273
301
|
|
|
274
|
-
* update framework core ([79fc4b9](https://github.com/
|
|
302
|
+
* update framework core ([79fc4b9](https://github.com/iotaledger/twin-dlt/commit/79fc4b961bd755437cad98d733ca9e25476bc03f))
|
|
275
303
|
|
|
276
304
|
|
|
277
305
|
### Bug Fixes
|
|
278
306
|
|
|
279
|
-
* docs ([cade544](https://github.com/
|
|
307
|
+
* docs ([cade544](https://github.com/iotaledger/twin-dlt/commit/cade5443a4b955d592c1622f07499ad8a3d554b6))
|
|
280
308
|
|
|
281
309
|
|
|
282
310
|
### Dependencies
|
|
@@ -285,12 +313,12 @@
|
|
|
285
313
|
* dependencies
|
|
286
314
|
* @twin.org/dlt-iota bumped from 0.0.2-next.2 to 0.0.2-next.3
|
|
287
315
|
|
|
288
|
-
## [0.0.2-next.2](https://github.com/
|
|
316
|
+
## [0.0.2-next.2](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.1...move-to-json-v0.0.2-next.2) (2025-07-25)
|
|
289
317
|
|
|
290
318
|
|
|
291
319
|
### Features
|
|
292
320
|
|
|
293
|
-
* move to json build deploy commands ([#30](https://github.com/
|
|
321
|
+
* move to json build deploy commands ([#30](https://github.com/iotaledger/twin-dlt/issues/30)) ([91aa00a](https://github.com/iotaledger/twin-dlt/commit/91aa00a29a8d7e3a99a46cea89e879a12dffc188))
|
|
294
322
|
|
|
295
323
|
|
|
296
324
|
### Dependencies
|
|
@@ -299,89 +327,89 @@
|
|
|
299
327
|
* dependencies
|
|
300
328
|
* @twin.org/dlt-iota bumped from next to 0.0.2-next.2
|
|
301
329
|
|
|
302
|
-
## [0.0.2-next.1](https://github.com/
|
|
330
|
+
## [0.0.2-next.1](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.2-next.0...move-to-json-v0.0.2-next.1) (2025-07-16)
|
|
303
331
|
|
|
304
332
|
|
|
305
333
|
### Features
|
|
306
334
|
|
|
307
|
-
* add header for CLI check ([#8](https://github.com/
|
|
308
|
-
* update dependencies ([f7b71c2](https://github.com/
|
|
309
|
-
* use shared store mechanism ([#10](https://github.com/
|
|
335
|
+
* add header for CLI check ([#8](https://github.com/iotaledger/twin-dlt/issues/8)) ([0b9f271](https://github.com/iotaledger/twin-dlt/commit/0b9f2711fb3a9eb859e481725bfa1e2139e14053))
|
|
336
|
+
* update dependencies ([f7b71c2](https://github.com/iotaledger/twin-dlt/commit/f7b71c24274b71e2d37c26c4a7e5e6d9df1dc9b7))
|
|
337
|
+
* use shared store mechanism ([#10](https://github.com/iotaledger/twin-dlt/issues/10)) ([ce36214](https://github.com/iotaledger/twin-dlt/commit/ce36214577f02cbb9642f831cb2c21335c31cc9a))
|
|
310
338
|
|
|
311
339
|
## 0.0.1 (2025-07-08)
|
|
312
340
|
|
|
313
341
|
|
|
314
342
|
### Features
|
|
315
343
|
|
|
316
|
-
* add header for CLI check ([#8](https://github.com/
|
|
317
|
-
* release to production ([fe6a7f7](https://github.com/
|
|
318
|
-
* update dependencies ([f7b71c2](https://github.com/
|
|
319
|
-
* use shared store mechanism ([#10](https://github.com/
|
|
344
|
+
* add header for CLI check ([#8](https://github.com/iotaledger/twin-dlt/issues/8)) ([0b9f271](https://github.com/iotaledger/twin-dlt/commit/0b9f2711fb3a9eb859e481725bfa1e2139e14053))
|
|
345
|
+
* release to production ([fe6a7f7](https://github.com/iotaledger/twin-dlt/commit/fe6a7f751138ea92ac22c70438261b0cea6fb238))
|
|
346
|
+
* update dependencies ([f7b71c2](https://github.com/iotaledger/twin-dlt/commit/f7b71c24274b71e2d37c26c4a7e5e6d9df1dc9b7))
|
|
347
|
+
* use shared store mechanism ([#10](https://github.com/iotaledger/twin-dlt/issues/10)) ([ce36214](https://github.com/iotaledger/twin-dlt/commit/ce36214577f02cbb9642f831cb2c21335c31cc9a))
|
|
320
348
|
|
|
321
|
-
## [0.0.1-next.29](https://github.com/
|
|
349
|
+
## [0.0.1-next.29](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.28...move-to-json-v0.0.1-next.29) (2025-06-26)
|
|
322
350
|
|
|
323
351
|
|
|
324
352
|
### Miscellaneous Chores
|
|
325
353
|
|
|
326
354
|
* **move-to-json:** Synchronize repo versions
|
|
327
355
|
|
|
328
|
-
## [0.0.1-next.28](https://github.com/
|
|
356
|
+
## [0.0.1-next.28](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.27...move-to-json-v0.0.1-next.28) (2025-06-23)
|
|
329
357
|
|
|
330
358
|
|
|
331
359
|
### Miscellaneous Chores
|
|
332
360
|
|
|
333
361
|
* **move-to-json:** Synchronize repo versions
|
|
334
362
|
|
|
335
|
-
## [0.0.1-next.27](https://github.com/
|
|
363
|
+
## [0.0.1-next.27](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.26...move-to-json-v0.0.1-next.27) (2025-06-18)
|
|
336
364
|
|
|
337
365
|
|
|
338
366
|
### Miscellaneous Chores
|
|
339
367
|
|
|
340
368
|
* **move-to-json:** Synchronize repo versions
|
|
341
369
|
|
|
342
|
-
## [0.0.1-next.26](https://github.com/
|
|
370
|
+
## [0.0.1-next.26](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.25...move-to-json-v0.0.1-next.26) (2025-06-12)
|
|
343
371
|
|
|
344
372
|
|
|
345
373
|
### Features
|
|
346
374
|
|
|
347
|
-
* update dependencies ([f7b71c2](https://github.com/
|
|
375
|
+
* update dependencies ([f7b71c2](https://github.com/iotaledger/twin-dlt/commit/f7b71c24274b71e2d37c26c4a7e5e6d9df1dc9b7))
|
|
348
376
|
|
|
349
|
-
## [0.0.1-next.25](https://github.com/
|
|
377
|
+
## [0.0.1-next.25](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.24...move-to-json-v0.0.1-next.25) (2025-05-21)
|
|
350
378
|
|
|
351
379
|
|
|
352
380
|
### Miscellaneous Chores
|
|
353
381
|
|
|
354
382
|
* **move-to-json:** Synchronize repo versions
|
|
355
383
|
|
|
356
|
-
## [0.0.1-next.24](https://github.com/
|
|
384
|
+
## [0.0.1-next.24](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.23...move-to-json-v0.0.1-next.24) (2025-05-21)
|
|
357
385
|
|
|
358
386
|
|
|
359
387
|
### Miscellaneous Chores
|
|
360
388
|
|
|
361
389
|
* **move-to-json:** Synchronize repo versions
|
|
362
390
|
|
|
363
|
-
## [0.0.1-next.23](https://github.com/
|
|
391
|
+
## [0.0.1-next.23](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.22...move-to-json-v0.0.1-next.23) (2025-05-06)
|
|
364
392
|
|
|
365
393
|
|
|
366
394
|
### Miscellaneous Chores
|
|
367
395
|
|
|
368
396
|
* **move-to-json:** Synchronize repo versions
|
|
369
397
|
|
|
370
|
-
## [0.0.1-next.22](https://github.com/
|
|
398
|
+
## [0.0.1-next.22](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.21...move-to-json-v0.0.1-next.22) (2025-04-17)
|
|
371
399
|
|
|
372
400
|
|
|
373
401
|
### Features
|
|
374
402
|
|
|
375
|
-
* use shared store mechanism ([#10](https://github.com/
|
|
403
|
+
* use shared store mechanism ([#10](https://github.com/iotaledger/twin-dlt/issues/10)) ([ce36214](https://github.com/iotaledger/twin-dlt/commit/ce36214577f02cbb9642f831cb2c21335c31cc9a))
|
|
376
404
|
|
|
377
|
-
## [0.0.1-next.21](https://github.com/
|
|
405
|
+
## [0.0.1-next.21](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.20...move-to-json-v0.0.1-next.21) (2025-04-17)
|
|
378
406
|
|
|
379
407
|
|
|
380
408
|
### Features
|
|
381
409
|
|
|
382
|
-
* add header for CLI check ([#8](https://github.com/
|
|
410
|
+
* add header for CLI check ([#8](https://github.com/iotaledger/twin-dlt/issues/8)) ([0b9f271](https://github.com/iotaledger/twin-dlt/commit/0b9f2711fb3a9eb859e481725bfa1e2139e14053))
|
|
383
411
|
|
|
384
|
-
## [0.0.1-next.20](https://github.com/
|
|
412
|
+
## [0.0.1-next.20](https://github.com/iotaledger/twin-dlt/compare/move-to-json-v0.0.1-next.19...move-to-json-v0.0.1-next.20) (2025-03-28)
|
|
385
413
|
|
|
386
414
|
|
|
387
415
|
### Miscellaneous Chores
|
|
@@ -32,7 +32,7 @@ The RPC configuration
|
|
|
32
32
|
|
|
33
33
|
#### timeout?
|
|
34
34
|
|
|
35
|
-
> `optional` **timeout
|
|
35
|
+
> `optional` **timeout?**: `number`
|
|
36
36
|
|
|
37
37
|
***
|
|
38
38
|
|
|
@@ -48,7 +48,7 @@ The deployment configuration
|
|
|
48
48
|
|
|
49
49
|
#### confirmationTimeout?
|
|
50
50
|
|
|
51
|
-
> `optional` **confirmationTimeout
|
|
51
|
+
> `optional` **confirmationTimeout?**: `number`
|
|
52
52
|
|
|
53
53
|
#### wallet
|
|
54
54
|
|
|
@@ -60,7 +60,7 @@ The deployment configuration
|
|
|
60
60
|
|
|
61
61
|
#### gasStation?
|
|
62
62
|
|
|
63
|
-
> `optional` **gasStation
|
|
63
|
+
> `optional` **gasStation?**: `object`
|
|
64
64
|
|
|
65
65
|
##### gasStation.url
|
|
66
66
|
|
|
@@ -74,7 +74,7 @@ The deployment configuration
|
|
|
74
74
|
|
|
75
75
|
### contracts? {#contracts}
|
|
76
76
|
|
|
77
|
-
> `optional` **contracts
|
|
77
|
+
> `optional` **contracts?**: `object`
|
|
78
78
|
|
|
79
79
|
The contracts configuration
|
|
80
80
|
|
package/docs/usage.md
CHANGED
|
@@ -165,6 +165,6 @@ move-to-json deploy --network mainnet --contracts <PATH-TO-CONTRACTS> --load-env
|
|
|
165
165
|
## Example
|
|
166
166
|
|
|
167
167
|
```shell
|
|
168
|
-
npx "@twin.org/move-to-json" build "tests/fixtures/sources/**/*.move" --load-env configs/testnet.env --output tests/fixtures/
|
|
169
|
-
npx "@twin.org/move-to-json" deploy --load-env configs/testnet.env --contracts tests/fixtures/
|
|
168
|
+
npx "@twin.org/move-to-json" build "tests/fixtures/sources/**/*.move" --load-env configs/testnet.env --output tests/fixtures/smartContractDeployments/smart-contract-deployments.json
|
|
169
|
+
npx "@twin.org/move-to-json" deploy --load-env configs/testnet.env --contracts tests/fixtures/smartContractDeployments/smart-contract-deployments.json --dry-run
|
|
170
170
|
```
|
package/locales/en.json
CHANGED
|
@@ -202,7 +202,9 @@
|
|
|
202
202
|
"upgradeGuidance": "Upgrade Guidance",
|
|
203
203
|
"previousDeployment": "Previous Deployment",
|
|
204
204
|
"currentDeployment": "Current Deployment",
|
|
205
|
-
"buildValidation": "Build Validation"
|
|
205
|
+
"buildValidation": "Build Validation",
|
|
206
|
+
"onChainPackageId": "On-chain UpgradeCap Package",
|
|
207
|
+
"onChainVersion": "On-chain UpgradeCap Version"
|
|
206
208
|
},
|
|
207
209
|
"progress": {
|
|
208
210
|
"checkingEnvironment": "Checking IOTA CLI environment...",
|
|
@@ -211,7 +213,8 @@
|
|
|
211
213
|
"requestingFaucetFunds": "Requesting funds from {network} faucet...",
|
|
212
214
|
"requestingAdditionalFaucetFunds": "Requesting additional funds from faucet...",
|
|
213
215
|
"renamingConflictingKey": "Renaming conflicting key alias \"{aliasName}\" to preserve existing key",
|
|
214
|
-
"importingDeployerKey": "Importing deployer key as \"{aliasName}\""
|
|
216
|
+
"importingDeployerKey": "Importing deployer key as \"{aliasName}\"",
|
|
217
|
+
"queryingUpgradeCap": "Querying on-chain UpgradeCap to validate published-at..."
|
|
215
218
|
},
|
|
216
219
|
"messages": {
|
|
217
220
|
"contractAlreadyDeployed": "Contract already deployed, no changes detected",
|
|
@@ -219,7 +222,8 @@
|
|
|
219
222
|
"noneInitialDeployment": "None - Initial deployment",
|
|
220
223
|
"noneNeedsDeploymentUpgrade": "None - Needs deployment/upgrade",
|
|
221
224
|
"originalConfigurationRestored": "Original configuration restored",
|
|
222
|
-
"contractBuiltAndReadyForUpgrade": "Contract has been built and is ready for upgrade"
|
|
225
|
+
"contractBuiltAndReadyForUpgrade": "Contract has been built and is ready for upgrade",
|
|
226
|
+
"staleJsonDetected": "Stale deployment JSON detected. JSON has \"{jsonPackageId}\" but on-chain UpgradeCap has \"{onChainPackageId}\". Using on-chain value."
|
|
223
227
|
},
|
|
224
228
|
"section": {
|
|
225
229
|
"deployContracts": "Deploy Contracts"
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/move-to-json",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.9",
|
|
4
4
|
"description": "CLI for compiling Move contracts and preparing deployment JSON for IOTA networks.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/
|
|
7
|
+
"url": "git+https://github.com/iotaledger/dlt.git",
|
|
8
8
|
"directory": "packages/move-to-json"
|
|
9
9
|
},
|
|
10
10
|
"author": "cornel.filip@iota.org",
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
"node": ">=20.0.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@iota/iota-sdk": "1.
|
|
17
|
+
"@iota/iota-sdk": "1.13.0",
|
|
18
18
|
"@twin.org/cli-core": "next",
|
|
19
19
|
"@twin.org/core": "next",
|
|
20
20
|
"@twin.org/crypto": "next",
|
|
21
|
-
"@twin.org/dlt-iota": "0.0.3-next.
|
|
21
|
+
"@twin.org/dlt-iota": "0.0.3-next.9",
|
|
22
22
|
"@twin.org/nameof": "next",
|
|
23
23
|
"@twin.org/wallet-connector-iota": "next",
|
|
24
24
|
"commander": "14.0.3",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"dlt"
|
|
54
54
|
],
|
|
55
55
|
"bugs": {
|
|
56
|
-
"url": "git+https://github.com/
|
|
56
|
+
"url": "git+https://github.com/iotaledger/dlt/issues"
|
|
57
57
|
},
|
|
58
58
|
"homepage": "https://twindev.org"
|
|
59
59
|
}
|