@twin.org/move-to-json 0.0.3-next.8 → 0.9.0-next.1
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 +26 -3
- package/dist/es/commands/deploy.js.map +1 -1
- package/dist/es/index.js +1 -0
- package/dist/es/index.js.map +1 -1
- package/dist/es/models/IContractConfig.js +4 -0
- package/dist/es/models/IContractConfig.js.map +1 -0
- package/dist/es/models/INetworkConfig.js.map +1 -1
- package/dist/locales/en.json +71 -10
- package/dist/types/index.d.ts +1 -0
- package/dist/types/models/IContractConfig.d.ts +19 -0
- package/dist/types/models/INetworkConfig.d.ts +2 -7
- package/docs/changelog.md +246 -101
- package/docs/reference/index.md +1 -0
- package/docs/reference/interfaces/IContractConfig.md +31 -0
- package/docs/reference/interfaces/INetworkConfig.md +5 -5
- package/docs/usage.md +2 -2
- package/package.json +15 -11
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
|
|
24
|
+
version: "0.9.0-next.1", // 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
|
|
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.9.0-next.1\", // 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"]}
|
|
@@ -8,6 +8,9 @@ import { CLIDisplay, CLIParam, CLIUtils } from "@twin.org/cli-core";
|
|
|
8
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
|
+
import { MemoryEntityStorageConnector } from "@twin.org/entity-storage-connector-memory";
|
|
12
|
+
import { EntityStorageConnectorFactory } from "@twin.org/entity-storage-models";
|
|
13
|
+
import { EntityStorageVaultConnector, initSchema } from "@twin.org/vault-connector-entity-storage";
|
|
11
14
|
import { cleanBuildArtifactsInPath } from "../utils/buildArtifactUtils.js";
|
|
12
15
|
import { ensureEnvironment, execAsyncWithError } from "../utils/environmentUtils.js";
|
|
13
16
|
import { getDeploymentMnemonic, getDeploymentSeed, validateDeploymentEnvironment } from "../utils/envSetup.js";
|
|
@@ -674,6 +677,7 @@ async function deployContract(contractName, contractData, config, network, dryRu
|
|
|
674
677
|
* @returns The wallet address.
|
|
675
678
|
*/
|
|
676
679
|
async function getDeploymentWalletAddress(network, addressIndex, deployerMnemonic, deployerSeed) {
|
|
680
|
+
const vault = setupVault();
|
|
677
681
|
// Try to use seed first if available
|
|
678
682
|
const hexSeed = await getDeploymentSeed(network, deployerSeed);
|
|
679
683
|
let seed;
|
|
@@ -682,10 +686,29 @@ async function getDeploymentWalletAddress(network, addressIndex, deployerMnemoni
|
|
|
682
686
|
}
|
|
683
687
|
else {
|
|
684
688
|
const mnemonic = await getDeploymentMnemonic(network, deployerMnemonic);
|
|
689
|
+
await vault.setSecret("deployment/mnemonic", mnemonic);
|
|
685
690
|
seed = Bip39.mnemonicToSeed(mnemonic);
|
|
686
691
|
}
|
|
687
|
-
|
|
688
|
-
return
|
|
692
|
+
await vault.setSecret("deployment/seed", seed);
|
|
693
|
+
return Iota.getAddress(vault, {}, "deployment", 0, addressIndex);
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Setup vault connectors for storing deployment keys and secrets.
|
|
697
|
+
* @returns An instance of IVaultConnector for use in deployment.
|
|
698
|
+
*/
|
|
699
|
+
function setupVault() {
|
|
700
|
+
initSchema();
|
|
701
|
+
const keyEntityStorage = new MemoryEntityStorageConnector({
|
|
702
|
+
entitySchema: "VaultKey",
|
|
703
|
+
config: { storageKey: "vault-key" }
|
|
704
|
+
});
|
|
705
|
+
const secretEntityStorage = new MemoryEntityStorageConnector({
|
|
706
|
+
entitySchema: "VaultSecret",
|
|
707
|
+
config: { storageKey: "vault-secret" }
|
|
708
|
+
});
|
|
709
|
+
EntityStorageConnectorFactory.register("vault-key", () => keyEntityStorage);
|
|
710
|
+
EntityStorageConnectorFactory.register("vault-secret", () => secretEntityStorage);
|
|
711
|
+
return new EntityStorageVaultConnector();
|
|
689
712
|
}
|
|
690
713
|
/**
|
|
691
714
|
* Convert nanos to IOTA (1 IOTA = 1,000,000,000 nanos).
|
|
@@ -883,7 +906,7 @@ export async function ensureCorrectDeployerKey(network, aliasName, expectedAddre
|
|
|
883
906
|
// Verify the address exists in client addresses
|
|
884
907
|
const { stdout: addressListOutput } = await execAsyncWithError("iota client addresses --json");
|
|
885
908
|
const addressInfo = JSON.parse(addressListOutput);
|
|
886
|
-
const addressExists = addressInfo.addresses.some(([
|
|
909
|
+
const addressExists = addressInfo.addresses.some(([a, addr]) => addr === expectedAddress);
|
|
887
910
|
if (!addressExists) {
|
|
888
911
|
throw new GeneralError("commands", "commands.deploy.addressNotInClient", {
|
|
889
912
|
expectedAddress,
|
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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 { 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 { MemoryEntityStorageConnector } from \"@twin.org/entity-storage-connector-memory\";\nimport { EntityStorageConnectorFactory } from \"@twin.org/entity-storage-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tEntityStorageVaultConnector,\n\tinitSchema,\n\ttype VaultKey,\n\ttype VaultSecret\n} from \"@twin.org/vault-connector-entity-storage\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\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\tconst vault = setupVault();\n\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\tawait vault.setSecret(\"deployment/mnemonic\", mnemonic);\n\n\t\tseed = Bip39.mnemonicToSeed(mnemonic);\n\t}\n\tawait vault.setSecret(\"deployment/seed\", seed);\n\n\treturn Iota.getAddress(vault, {}, \"deployment\", 0, addressIndex);\n}\n\n/**\n * Setup vault connectors for storing deployment keys and secrets.\n * @returns An instance of IVaultConnector for use in deployment.\n */\nfunction setupVault(): IVaultConnector {\n\tinitSchema();\n\n\tconst keyEntityStorage = new MemoryEntityStorageConnector<VaultKey>({\n\t\tentitySchema: nameof<VaultKey>(),\n\t\tconfig: { storageKey: \"vault-key\" }\n\t});\n\tconst secretEntityStorage = new MemoryEntityStorageConnector<VaultSecret>({\n\t\tentitySchema: nameof<VaultSecret>(),\n\t\tconfig: { storageKey: \"vault-secret\" }\n\t});\n\n\tEntityStorageConnectorFactory.register(\"vault-key\", () => keyEntityStorage);\n\tEntityStorageConnectorFactory.register(\"vault-secret\", () => secretEntityStorage);\n\n\treturn new EntityStorageVaultConnector();\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([a, 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/es/index.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
export * from "./cli.js";
|
|
4
4
|
export * from "./commands/build.js";
|
|
5
5
|
export * from "./commands/deploy.js";
|
|
6
|
+
export * from "./models/IContractConfig.js";
|
|
6
7
|
export * from "./models/INetworkConfig.js";
|
|
7
8
|
export * from "./utils/envSetup.js";
|
|
8
9
|
export * from "./utils/iotaUtils.js";
|
package/dist/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nexport * from \"./cli.js\";\nexport * from \"./commands/build.js\";\nexport * from \"./commands/deploy.js\";\nexport * from \"./models/IContractConfig.js\";\nexport * from \"./models/INetworkConfig.js\";\nexport * from \"./utils/envSetup.js\";\nexport * from \"./utils/iotaUtils.js\";\nexport * from \"./utils/moveToJsonUtils.js\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IContractConfig.js","sourceRoot":"","sources":["../../../src/models/IContractConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Contract configuration interface\n */\nexport interface IContractConfig {\n\t/**\n\t * The module name\n\t */\n\tmoduleName: string;\n\t/**\n\t * The dependencies\n\t */\n\tdependencies?: string[];\n\t/**\n\t * The package controller configuration\n\t */\n\tpackageController?: {\n\t\taddressIndex: number;\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"INetworkConfig.js","sourceRoot":"","sources":["../../../src/models/INetworkConfig.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { NetworkTypes } from \"@twin.org/dlt-iota\";\n\n/**\n * Network configuration interface\n */\nexport interface INetworkConfig {\n\t/**\n\t * The network type\n\t */\n\tnetwork: NetworkTypes;\n\t/**\n\t * The platform type\n\t */\n\tplatform: \"iota\";\n\t/**\n\t * The RPC configuration\n\t */\n\trpc: {\n\t\turl: string;\n\t\ttimeout?: number;\n\t};\n\t/**\n\t * The deployment configuration\n\t */\n\tdeployment: {\n\t\tgasBudget: number;\n\t\tconfirmationTimeout?: number;\n\t\twallet: {\n\t\t\taddressIndex: number;\n\t\t};\n\t\tgasStation?: {\n\t\t\turl: string;\n\t\t\tauthToken: string;\n\t\t};\n\t};\n\t/**\n\t * The contracts configuration\n\t */\n\tcontracts?: {\n\t\t[key: string]:
|
|
1
|
+
{"version":3,"file":"INetworkConfig.js","sourceRoot":"","sources":["../../../src/models/INetworkConfig.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { NetworkTypes } from \"@twin.org/dlt-iota\";\nimport type { IContractConfig } from \"./IContractConfig.js\";\n\n/**\n * Network configuration interface\n */\nexport interface INetworkConfig {\n\t/**\n\t * The network type\n\t */\n\tnetwork: NetworkTypes;\n\t/**\n\t * The platform type\n\t */\n\tplatform: \"iota\";\n\t/**\n\t * The RPC configuration\n\t */\n\trpc: {\n\t\turl: string;\n\t\ttimeout?: number;\n\t};\n\t/**\n\t * The deployment configuration\n\t */\n\tdeployment: {\n\t\tgasBudget: number;\n\t\tconfirmationTimeout?: number;\n\t\twallet: {\n\t\t\taddressIndex: number;\n\t\t};\n\t\tgasStation?: {\n\t\t\turl: string;\n\t\t\tauthToken: string;\n\t\t};\n\t};\n\t/**\n\t * The contracts configuration\n\t */\n\tcontracts?: {\n\t\t[key: string]: IContractConfig;\n\t};\n}\n"]}
|