@0xobelisk/sui-cli 1.2.0-pre.11 โ 1.2.0-pre.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/dubhe.js +126 -49
- package/dist/dubhe.js.map +1 -1
- package/package.json +31 -19
- package/src/commands/build.ts +47 -16
- package/src/commands/call.ts +83 -83
- package/src/commands/checkBalance.ts +12 -5
- package/src/commands/configStore.ts +12 -4
- package/src/commands/convertJson.ts +70 -0
- package/src/commands/doctor.ts +1515 -0
- package/src/commands/faucet.ts +11 -7
- package/src/commands/generateKey.ts +3 -2
- package/src/commands/index.ts +16 -7
- package/src/commands/info.ts +55 -0
- package/src/commands/loadMetadata.ts +57 -0
- package/src/commands/localnode.ts +22 -6
- package/src/commands/publish.ts +21 -7
- package/src/commands/query.ts +101 -101
- package/src/commands/schemagen.ts +15 -4
- package/src/commands/shell.ts +198 -0
- package/src/commands/switchEnv.ts +26 -0
- package/src/commands/test.ts +54 -11
- package/src/commands/upgrade.ts +11 -4
- package/src/commands/wait.ts +333 -22
- package/src/commands/watch.ts +2 -1
- package/src/dubhe.ts +12 -4
- package/src/utils/axios-downloader.ts +116 -0
- package/src/utils/callHandler.ts +118 -118
- package/src/utils/constants.ts +5 -0
- package/src/utils/generateAccount.ts +1 -1
- package/src/utils/index.ts +4 -3
- package/src/utils/metadataHandler.ts +16 -0
- package/src/utils/publishHandler.ts +327 -293
- package/src/utils/queryStorage.ts +141 -141
- package/src/utils/startNode.ts +115 -16
- package/src/utils/storeConfig.ts +6 -12
- package/src/utils/upgradeHandler.ts +139 -86
- package/src/utils/utils.ts +712 -55
package/dist/dubhe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dubhe.ts","../src/utils/startNode.ts","../src/utils/printDubhe.ts","../src/utils/publishHandler.ts","../src/utils/utils.ts","../src/utils/errors.ts","../package.json","../src/utils/queryStorage.ts","../src/utils/callHandler.ts","../src/commands/localnode.ts","../src/commands/faucet.ts","../src/commands/schemagen.ts","../src/commands/publish.ts","../src/utils/upgradeHandler.ts","../src/commands/upgrade.ts","../src/commands/test.ts","../src/commands/build.ts","../src/commands/hello.ts","../src/utils/generateAccount.ts","../src/commands/generateKey.ts","../src/utils/checkBalance.ts","../src/commands/checkBalance.ts","../src/utils/storeConfig.ts","../src/commands/configStore.ts","../src/commands/query.ts","../src/commands/call.ts","../src/commands/watch.ts","../src/commands/wait.ts","../src/commands/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { commands } from './commands';\nimport { logError } from './utils/errors';\n\n// Load .env file into process.env\nimport * as dotenv from 'dotenv';\nimport chalk from 'chalk';\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"dubhe\" for e.g. ts-node)\n .scriptName('dubhe')\n // Use the commands directory to scaffold\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- command array overload isn't typed, see https://github.com/yargs/yargs/blob/main/docs/advanced.md#esm-hierarchy\n .command(commands as any)\n // Enable strict mode.\n .strict()\n // Custom error handler\n .fail((msg, err) => {\n console.error(chalk.red(msg));\n if (msg.includes('Missing required argument')) {\n console.log(\n chalk.yellow(\n `Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`\n )\n );\n }\n console.log('');\n logError(err);\n console.log('');\n\n process.exit(1);\n })\n // Useful aliases.\n .alias({ h: 'help' }).argv;\n","import { execSync, spawn } from 'child_process';\nimport chalk from 'chalk';\nimport { printDubhe } from './printDubhe';\nimport { delay, DubheCliError, validatePrivateKey } from '../utils';\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nfunction isSuiStartRunning(): boolean {\n try {\n const cmd =\n process.platform === 'win32'\n ? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n : 'pgrep -f \"sui start\"';\n\n const result = execSync(cmd).toString().trim();\n return process.platform === 'win32'\n ? result.toLowerCase().includes('sui.exe')\n : result.length > 0;\n } catch (error) {\n return false;\n }\n}\n\nasync function printAccounts() {\n // These private keys are used for testing purposes only, do not use them in production.\n const privateKeys = [\n 'suiprivkey1qq3ez3dje66l8pypgxynr7yymwps6uhn7vyczespj84974j3zya0wdpu76v',\n 'suiprivkey1qp6vcyg8r2x88fllmjmxtpzjl95gd9dugqrgz7xxf50w6rqdqzetg7x4d7s',\n 'suiprivkey1qpy3a696eh3m55fwa8h38ss063459u4n2dm9t24w2hlxxzjp2x34q8sdsnc',\n 'suiprivkey1qzxwp29favhzrjd95f6uj9nskjwal6nh9g509jpun395y6g72d6jqlmps4c',\n 'suiprivkey1qzhq4lv38sesah4uzsqkkmeyjx860xqjdz8qgw36tmrdd5tnle3evxpng57',\n 'suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c'\n ];\n console.log('๐Accounts');\n console.log('==========');\n privateKeys.forEach((privateKey, index) => {\n const dubhe = new Dubhe({ secretKey: privateKey });\n const keypair = dubhe.getSigner();\n spawn(\n 'curl',\n [\n '--location',\n '--request',\n 'POST',\n 'http://127.0.0.1:9123/gas',\n '--header',\n 'Content-Type: application/json',\n '--data-raw',\n `{\"FixedAmountRequest\": {\"recipient\": \"${keypair.toSuiAddress()}\"}}`\n ],\n {\n env: { ...process.env },\n stdio: 'ignore',\n detached: true\n }\n );\n console.log(` โโ Account #${index}: ${keypair.toSuiAddress()}(1000 SUI)`);\n console.log(` โโ Private Key: ${privateKey}`);\n });\n console.log('==========');\n console.log(\n chalk.yellow('โน๏ธ WARNING: These accounts, and their private keys, are publicly known.')\n );\n console.log(\n chalk.yellow('Any funds sent to them on Mainnet or any other live network WILL BE LOST.')\n );\n}\n\nfunction handleProcessSignals(suiProcess: ReturnType<typeof spawn> | null) {\n const cleanup = () => {\n console.log(chalk.yellow('\\n๐ Stopping Local Node...'));\n if (suiProcess) {\n suiProcess.kill('SIGINT');\n }\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n}\n\nexport async function startLocalNode() {\n if (isSuiStartRunning()) {\n console.log(chalk.yellow('\\nโ ๏ธ Warning: Local Node Already Running'));\n console.log(chalk.yellow(' โโ Cannot start a new instance'));\n console.log(chalk.yellow(' โโ Please stop the existing process first'));\n return;\n }\n\n printDubhe();\n console.log('๐ Starting Local Node...');\n let suiProcess: ReturnType<typeof spawn> | null = null;\n try {\n suiProcess = spawn('sui', ['start', '--with-faucet', '--force-regenesis'], {\n env: { ...process.env, RUST_LOG: 'off,sui_node=info' },\n stdio: 'ignore'\n });\n\n suiProcess.on('error', (error) => {\n console.error(chalk.red('\\nโ Failed to Start Local Node'));\n console.error(chalk.red(` โโ Error: ${error.message}`));\n });\n await delay(5000);\n console.log(' โโ Faucet: Enabled');\n console.log(' โโ Force Regenesis: Yes');\n console.log(' โโ HTTP server: http://127.0.0.1:9000/');\n console.log(' โโ Faucet server: http://127.0.0.1:9123/');\n\n await printAccounts();\n\n await delay(2000);\n\n const privateKeyFormat = validatePrivateKey(\n 'suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c'\n );\n if (privateKeyFormat === false) {\n throw new DubheCliError(`Please check your privateKey.`);\n }\n\n console.log(chalk.green('๐ Local environment is ready!'));\n\n handleProcessSignals(suiProcess);\n\n await new Promise<void>((resolve) => {\n suiProcess?.on('exit', () => resolve());\n });\n } catch (error: any) {\n console.error(chalk.red('\\nโ Failed to Start Local Node'));\n console.error(chalk.red(` โโ Error: ${error.message}`));\n if (suiProcess) {\n suiProcess.kill('SIGINT');\n }\n process.exit(1);\n }\n}","import chalk from 'chalk';\n\nexport function printDubhe() {\n console.log(\n chalk.yellow(`\nWelcome to Dubhe\n\\t\\t\\t --from team@obelisk\n ________ ___ ___ ________ ___ ___ _______ \n |\\\\ ___ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ __ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ ___ \\\\ \n \\\\ \\\\ \\\\_|\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ /\\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __/| \n \\\\ \\\\ \\\\ \\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __ \\\\ \\\\ __ \\\\ \\\\ \\\\_|/__ \n \\\\ \\\\ \\\\_\\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\_|\\\\ \\\\ \n \\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\__\\\\ \\\\__\\\\ \\\\_______\\\\\n \\\\|_______|\\\\|_______|\\\\|_______|\\\\|__|\\\\|__|\\\\|_______| \n \n`)\n );\n}\n","import { Dubhe, Transaction } from '@0xobelisk/sui-client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport {\n saveContractData,\n updateDubheDependency,\n switchEnv,\n delay,\n getDubheSchemaId,\n initializeDubhe\n} from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst MAX_RETRIES = 60; // 60s timeout\nconst RETRY_INTERVAL = 1000; // 1s retry interval\nconst SPINNER = ['โ ', 'โ ', 'โ น', 'โ ธ', 'โ ผ', 'โ ด', 'โ ฆ', 'โ ง', 'โ ', 'โ '];\n\nasync function removeEnvContent(\n filePath: string,\n networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): Promise<void> {\n if (!fs.existsSync(filePath)) {\n return;\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n const regex = new RegExp(`\\\\[env\\\\.${networkType}\\\\][\\\\s\\\\S]*?(?=\\\\[|$)`, 'g');\n const updatedContent = content.replace(regex, '');\n fs.writeFileSync(filePath, updatedContent, 'utf-8');\n}\n\ninterface EnvConfig {\n chainId: string;\n originalPublishedId: string;\n latestPublishedId: string;\n publishedVersion: number;\n}\n\nfunction updateEnvFile(\n filePath: string,\n networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n operation: 'publish' | 'upgrade',\n chainId: string,\n publishedId: string\n): void {\n const envFilePath = path.resolve(filePath);\n const envContent = fs.readFileSync(envFilePath, 'utf-8');\n const envLines = envContent.split('\\n');\n\n const networkSectionIndex = envLines.findIndex((line) => line.trim() === `[env.${networkType}]`);\n const config: EnvConfig = {\n chainId: chainId,\n originalPublishedId: '',\n latestPublishedId: '',\n publishedVersion: 0\n };\n\n if (networkSectionIndex === -1) {\n // If network section is not found, add a new section\n if (operation === 'publish') {\n config.originalPublishedId = publishedId;\n config.latestPublishedId = publishedId;\n config.publishedVersion = 1;\n } else {\n throw new Error(\n `Network type [env.${networkType}] not found in the file and cannot upgrade.`\n );\n }\n } else {\n for (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n const line = envLines[i].trim();\n if (line.startsWith('[')) break; // End of the current network section\n\n const [key, value] = line.split('=').map((part) => part.trim().replace(/\"/g, ''));\n switch (key) {\n case 'original-published-id':\n config.originalPublishedId = value;\n break;\n case 'latest-published-id':\n config.latestPublishedId = value;\n break;\n case 'published-version':\n config.publishedVersion = parseInt(value, 10);\n break;\n }\n }\n\n if (operation === 'publish') {\n config.originalPublishedId = publishedId;\n config.latestPublishedId = publishedId;\n config.publishedVersion = 1;\n } else if (operation === 'upgrade') {\n config.latestPublishedId = publishedId;\n config.publishedVersion += 1;\n }\n }\n\n const updatedSection = `\n[env.${networkType}]\nchain-id = \"${config.chainId}\"\noriginal-published-id = \"${config.originalPublishedId}\"\nlatest-published-id = \"${config.latestPublishedId}\"\npublished-version = \"${config.publishedVersion}\"\n`;\n\n const newEnvContent =\n networkSectionIndex === -1\n ? envContent + updatedSection\n : envLines.slice(0, networkSectionIndex).join('\\n') + updatedSection;\n\n fs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n}\n// function capitalizeAndRemoveUnderscores(input: string): string {\n// \treturn input\n// \t\t.split('_')\n// \t\t.map((word, index) => {\n// \t\t\treturn index === 0\n// \t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n// \t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n// \t\t})\n// \t\t.join('');\n// }\n//\n// function getLastSegment(input: string): string {\n// \tconst segments = input.split('::');\n// \treturn segments.length > 0 ? segments[segments.length - 1] : '';\n// }\n\nfunction buildContract(projectPath: string): string[][] {\n let modules: any, dependencies: any;\n try {\n const buildResult = JSON.parse(\n execSync(`sui move build --dump-bytecode-as-base64 --path ${projectPath}`, {\n encoding: 'utf-8',\n stdio: 'pipe'\n })\n );\n modules = buildResult.modules;\n dependencies = buildResult.dependencies;\n } catch (error: any) {\n console.error(chalk.red(' โโ Build failed'));\n console.error(error.stdout);\n process.exit(1);\n }\n return [modules, dependencies];\n}\n\ninterface ObjectChange {\n type: string;\n objectType?: string;\n packageId?: string;\n objectId?: string;\n}\n\nasync function waitForNode(dubhe: Dubhe): Promise<string> {\n let retryCount = 0;\n let spinnerIndex = 0;\n const startTime = Date.now();\n let isInterrupted = false;\n let chainId = '';\n let hasShownBalanceWarning = false;\n\n const handleInterrupt = () => {\n isInterrupted = true;\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log('\\n โโ Operation cancelled by user');\n process.exit(0);\n };\n process.on('SIGINT', handleInterrupt);\n\n try {\n // ็ฌฌไธ้ถๆฎต๏ผ็ญๅพ
่ทๅ chainId\n while (retryCount < MAX_RETRIES && !isInterrupted && !chainId) {\n try {\n chainId = await dubhe.suiInteractor.currentClient.getChainIdentifier();\n } catch (error) {\n // ๅฟฝ็ฅ้่ฏฏ๏ผ็ปง็ปญ้่ฏ\n }\n\n if (isInterrupted) break;\n\n if (!chainId) {\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(chalk.red(` โโ Failed to connect to node after ${MAX_RETRIES} attempts`));\n console.log(chalk.red(' โโ Please check if the Sui node is running.'));\n process.exit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Waiting for node... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n }\n }\n\n // ๆพ็คบ chainId\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log(` โโ ChainId: ${chainId}`);\n\n // ็ฌฌไบ้ถๆฎต๏ผๆฃๆฅ้จ็ฝฒ่ดฆๆทไฝ้ข\n retryCount = 0;\n while (retryCount < MAX_RETRIES && !isInterrupted) {\n try {\n const address = dubhe.getAddress();\n const coins = await dubhe.suiInteractor.currentClient.getCoins({\n owner: address,\n coinType: '0x2::sui::SUI'\n });\n\n if (coins.data.length > 0) {\n const balance = coins.data.reduce((sum, coin) => sum + Number(coin.balance), 0);\n if (balance > 0) {\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log(` โโ Deployer balance: ${balance / 10 ** 9} SUI`);\n return chainId;\n } else if (!hasShownBalanceWarning) {\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log(\n chalk.yellow(\n ` โโ Deployer balance: 0 SUI, please ensure your account has sufficient SUI balance`\n )\n );\n hasShownBalanceWarning = true;\n }\n } else if (!hasShownBalanceWarning) {\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log(\n chalk.yellow(\n ` โโ No SUI coins found in deployer account, please ensure your account has sufficient SUI balance`\n )\n );\n hasShownBalanceWarning = true;\n }\n\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(\n chalk.red(` โโ Deployer account has no SUI balance after ${MAX_RETRIES} attempts`)\n );\n console.log(chalk.red(' โโ Please ensure your account has sufficient SUI balance.'));\n process.exit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Checking deployer balance... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n } catch (error) {\n if (isInterrupted) break;\n\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(\n chalk.red(` โโ Failed to check deployer balance after ${MAX_RETRIES} attempts`)\n );\n console.log(chalk.red(' โโ Please check your account and network connection.'));\n process.exit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Checking deployer balance... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n }\n }\n } finally {\n process.removeListener('SIGINT', handleInterrupt);\n }\n\n if (isInterrupted) {\n process.exit(0);\n }\n\n throw new Error('Failed to connect to node');\n}\n\nasync function publishContract(\n dubhe: Dubhe,\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n projectPath: string,\n gasBudget?: number\n) {\n console.log('\\n๐ Starting Contract Publication...');\n console.log(` โโ Project: ${projectPath}`);\n console.log(` โโ Network: ${network}`);\n console.log(' โโ Waiting for node...');\n\n const chainId = await waitForNode(dubhe);\n console.log(' โโ Validating Environment...');\n\n await removeEnvContent(`${projectPath}/Move.lock`, network);\n console.log(` โโ Account: ${dubhe.getAddress()}`);\n\n console.log('\\n๐ฆ Building Contract...');\n const [modules, dependencies] = buildContract(projectPath);\n\n console.log('\\n๐ Publishing Contract...');\n const tx = new Transaction();\n if (gasBudget) {\n tx.setGasBudget(gasBudget);\n }\n const [upgradeCap] = tx.publish({ modules, dependencies });\n tx.transferObjects([upgradeCap], dubhe.getAddress());\n\n let result: any = null;\n let retryCount = 0;\n let spinnerIndex = 0;\n const startTime = Date.now();\n let isInterrupted = false;\n\n const handleInterrupt = () => {\n isInterrupted = true;\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log('\\n โโ Operation cancelled by user');\n process.exit(0);\n };\n process.on('SIGINT', handleInterrupt);\n\n try {\n while (retryCount < MAX_RETRIES && !result && !isInterrupted) {\n try {\n result = await dubhe.signAndSendTxn({ tx });\n } catch (error) {\n if (isInterrupted) break;\n\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(chalk.red(` โโ Publication failed after ${MAX_RETRIES} attempts`));\n console.log(chalk.red(' โโ Please check your network connection and try again later.'));\n process.exit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Retrying... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n }\n }\n } finally {\n process.removeListener('SIGINT', handleInterrupt);\n }\n\n if (isInterrupted) {\n process.exit(0);\n }\n\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n\n if (!result || result.effects?.status.status === 'failure') {\n console.log(chalk.red(' โโ Publication failed'));\n process.exit(1);\n }\n\n console.log(' โโ Processing publication results...');\n let version = 1;\n let packageId = '';\n let schemaId = '';\n let schemas = dubheConfig.schemas;\n let upgradeCapId = '';\n\n let printObjects: any[] = [];\n\n result.objectChanges!.map((object: ObjectChange) => {\n if (object.type === 'published') {\n console.log(` โโ Package ID: ${object.packageId}`);\n packageId = object.packageId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType === '0x2::package::UpgradeCap'\n ) {\n console.log(` โโ Upgrade Cap: ${object.objectId}`);\n upgradeCapId = object.objectId || '';\n }\n if (object.type === 'created') {\n printObjects.push(object);\n }\n });\n\n console.log(` โโ Transaction: ${result.digest}`);\n\n updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);\n\n console.log('\\nโก Executing Deploy Hook...');\n await delay(5000);\n\n const deployHookTx = new Transaction();\n let args = [];\n if (dubheConfig.name !== 'dubhe') {\n let dubheSchemaId = await getDubheSchemaId(network);\n args.push(deployHookTx.object(dubheSchemaId));\n }\n args.push(deployHookTx.object('0x6'));\n deployHookTx.moveCall({\n target: `${packageId}::${dubheConfig.name}_genesis::run`,\n arguments: args\n });\n\n let deployHookResult;\n try {\n deployHookResult = await dubhe.signAndSendTxn({ tx: deployHookTx });\n } catch (error: any) {\n console.error(chalk.red(' โโ Deploy hook execution failed'));\n console.error(error.message);\n process.exit(1);\n }\n\n if (deployHookResult.effects?.status.status === 'success') {\n console.log(' โโ Hook execution successful');\n console.log(` โโ Transaction: ${deployHookResult.digest}`);\n\n console.log('\\n๐ Created Objects:');\n deployHookResult.objectChanges?.map((object: ObjectChange) => {\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType.includes('schema::Schema')\n ) {\n schemaId = object.objectId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType.includes('schema') &&\n !object.objectType.includes('dynamic_field')\n ) {\n printObjects.push(object);\n }\n });\n\n printObjects.map((object: ObjectChange) => {\n console.log(` โโ Type: ${object.objectType}`);\n console.log(` โโ ID: ${object.objectId}`);\n });\n\n saveContractData(\n dubheConfig.name,\n network,\n packageId,\n schemaId,\n upgradeCapId,\n version,\n schemas\n );\n console.log('\\nโ
Contract Publication Complete\\n');\n } else {\n console.log(chalk.yellow(' โโ Deploy hook execution failed'));\n console.log(chalk.yellow(' Please republish or manually call deploy_hook::run'));\n console.log(chalk.yellow(' Please check the transaction digest:'));\n console.log(chalk.yellow(` ${deployHookResult.digest}`));\n process.exit(1);\n }\n}\n\nasync function checkDubheFramework(projectPath: string): Promise<boolean> {\n if (!fs.existsSync(projectPath)) {\n console.log(chalk.yellow('\\nโน๏ธ Dubhe Framework Files Not Found'));\n console.log(chalk.yellow(' โโ Expected Path:'), projectPath);\n console.log(chalk.yellow(' โโ To set up Dubhe Framework:'));\n console.log(chalk.yellow(' โ 1. Create directory: mkdir -p contracts/dubhe-framework'));\n console.log(\n chalk.yellow(\n ' โ 2. Clone repository: git clone https://github.com/0xobelisk/dubhe-framework contracts/dubhe-framework'\n )\n );\n console.log(\n chalk.yellow(' โ 3. Or download from: https://github.com/0xobelisk/dubhe-framework')\n );\n console.log(chalk.yellow(' โโ After setup, restart the local node'));\n return false;\n }\n return true;\n}\n\nexport async function publishDubheFramework(\n dubhe: Dubhe,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/dubhe-framework`;\n\n if (!(await checkDubheFramework(projectPath))) {\n return;\n }\n\n console.log('\\n๐ Starting Dubhe Framework Publication...');\n console.log(' โโ Waiting for node...');\n\n const chainId = await waitForNode(dubhe);\n\n await removeEnvContent(`${projectPath}/Move.lock`, network);\n const [modules, dependencies] = buildContract(projectPath);\n const tx = new Transaction();\n const [upgradeCap] = tx.publish({ modules, dependencies });\n tx.transferObjects([upgradeCap], dubhe.getAddress());\n\n let result: any = null;\n let retryCount = 0;\n let spinnerIndex = 0;\n const startTime = Date.now();\n let isInterrupted = false;\n\n const handleInterrupt = () => {\n isInterrupted = true;\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log('\\n โโ Operation cancelled by user');\n process.exit(0);\n };\n process.on('SIGINT', handleInterrupt);\n\n try {\n while (retryCount < MAX_RETRIES && !result && !isInterrupted) {\n try {\n result = await dubhe.signAndSendTxn({ tx });\n } catch (error) {\n if (isInterrupted) break;\n\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(chalk.red(` โโ Publication failed after ${MAX_RETRIES} attempts`));\n console.log(chalk.red(' โโ Please check your network connection and try again later.'));\n process.exit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Retrying... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n }\n }\n } finally {\n process.removeListener('SIGINT', handleInterrupt);\n }\n\n if (isInterrupted) {\n process.exit(0);\n }\n\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n\n if (!result || result.effects?.status.status === 'failure') {\n console.log(chalk.red(' โโ Publication failed'));\n process.exit(1);\n }\n\n let version = 1;\n let packageId = '';\n let schemaId = '';\n let schemas: Record<string, string> = {};\n let upgradeCapId = '';\n\n result.objectChanges!.map((object: ObjectChange) => {\n if (object.type === 'published') {\n packageId = object.packageId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType === '0x2::package::UpgradeCap'\n ) {\n upgradeCapId = object.objectId || '';\n }\n });\n\n await delay(3000);\n\n const deployHookTx = new Transaction();\n deployHookTx.moveCall({\n target: `${packageId}::dubhe_genesis::run`,\n arguments: [deployHookTx.object('0x6')]\n });\n\n let deployHookResult;\n try {\n deployHookResult = await dubhe.signAndSendTxn({ tx: deployHookTx });\n } catch (error: any) {\n console.error(chalk.red(' โโ Deploy hook execution failed'));\n console.error(error.message);\n process.exit(1);\n }\n\n if (deployHookResult.effects?.status.status === 'success') {\n deployHookResult.objectChanges?.map((object: ObjectChange) => {\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType.includes('dubhe_schema::Schema')\n ) {\n schemaId = object.objectId || '';\n }\n });\n }\n\n saveContractData('dubhe-framework', network, packageId, schemaId, upgradeCapId, version, schemas);\n\n updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);\n await delay(1000);\n}\n\nexport async function publishHandler(\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n gasBudget?: number\n) {\n await switchEnv(network);\n\n const dubhe = initializeDubhe({\n network\n });\n\n if (network === 'localnet') {\n await publishDubheFramework(dubhe, network);\n }\n\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n await updateDubheDependency(`${projectPath}/Move.toml`, network);\n await publishContract(dubhe, dubheConfig, network, projectPath, gasBudget);\n}\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { SUI_PRIVATE_KEY_PREFIX } from '@mysten/sui/cryptography';\nimport { FsIibError } from './errors';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\nimport { Dubhe, NetworkType, SuiMoveNormalizedModules } from '@0xobelisk/sui-client';\nimport { DubheCliError } from './errors';\nimport packageJson from '../../package.json';\n\nexport type DeploymentJsonType = {\n projectName: string;\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n packageId: string;\n schemaId: string;\n upgradeCap: string;\n version: number;\n schemas: Record<string, string>;\n};\n\nexport function validatePrivateKey(privateKey: string): false | string {\n if (privateKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {\n if (privateKey.length === 70) {\n return privateKey;\n } else {\n return false;\n }\n } else if (privateKey.startsWith('0x')) {\n const strippedPrivateKey = privateKey.slice(2);\n if (strippedPrivateKey.length === 64) {\n return strippedPrivateKey;\n } else {\n return false;\n }\n } else {\n if (privateKey.length === 64) {\n return privateKey;\n } else {\n return false;\n }\n }\n}\n\nexport async function updateVersionInFile(projectPath: string, newVersion: string) {\n try {\n const filePath = `${projectPath}/sources/script/migrate.move`;\n const data = await fsAsync.readFile(filePath, 'utf8');\n\n // update version data\n const updatedData = data.replace(\n /const VERSION: u64 = \\d+;/,\n `const VERSION: u64 = ${newVersion};`\n );\n\n // write new version\n writeOutput(updatedData, filePath, 'Update package version');\n } catch {\n throw new FsIibError('Fs update version failed.');\n }\n}\n\nexport async function getDeploymentJson(\n projectPath: string,\n network: string\n): Promise<DeploymentJsonType> {\n try {\n const data = await fsAsync.readFile(\n `${projectPath}/.history/sui_${network}/latest.json`,\n 'utf8'\n );\n return JSON.parse(data) as DeploymentJsonType;\n } catch (error) {\n throw new Error(`read .history/sui_${network}/latest.json failed. ${error}`);\n }\n}\n\nexport async function getDeploymentSchemaId(projectPath: string, network: string): Promise<string> {\n try {\n const data = await fsAsync.readFile(\n `${projectPath}/.history/sui_${network}/latest.json`,\n 'utf8'\n );\n const deployment = JSON.parse(data) as DeploymentJsonType;\n return deployment.schemaId;\n } catch (error) {\n return '';\n }\n}\n\nexport async function getDubheSchemaId(network: string) {\n const path = process.cwd();\n const contractPath = `${path}/contracts/dubhe-framework`;\n\n switch (network) {\n case 'mainnet':\n return await getDeploymentSchemaId(contractPath, 'mainnet');\n case 'testnet':\n return '0xa565cbb3641fff8f7e8ef384b215808db5f1837aa72c1cca1803b5d973699aac';\n case 'devnet':\n return await getDeploymentSchemaId(contractPath, 'devnet');\n case 'localnet':\n return await getDeploymentSchemaId(contractPath, 'localnet');\n default:\n throw new Error(`Invalid network: ${network}`);\n }\n}\n\nexport async function getOnchainSchemas(\n projectPath: string,\n network: string\n): Promise<Record<string, string>> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.schemas;\n}\n\nexport async function getVersion(projectPath: string, network: string): Promise<number> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.version;\n}\n\nexport async function getNetwork(\n projectPath: string,\n network: string\n): Promise<'mainnet' | 'testnet' | 'devnet' | 'localnet'> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.network;\n}\n\nexport async function getOldPackageId(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.packageId;\n}\n\nexport async function getSchemaId(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.schemaId;\n}\n\nexport async function getUpgradeCap(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.upgradeCap;\n}\n\nexport function saveContractData(\n projectName: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n packageId: string,\n schemaId: string,\n upgradeCap: string,\n version: number,\n schemas: Record<string, string>\n) {\n const DeploymentData: DeploymentJsonType = {\n projectName,\n network,\n packageId,\n schemaId,\n schemas,\n upgradeCap,\n version\n };\n\n const path = process.cwd();\n const storeDeploymentData = JSON.stringify(DeploymentData, null, 2);\n writeOutput(\n storeDeploymentData,\n `${path}/contracts/${projectName}/.history/sui_${network}/latest.json`,\n 'Update deploy log'\n );\n}\n\nexport async function writeOutput(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, output);\n if (logPrefix !== undefined) {\n console.log(`${logPrefix}: ${fullOutputPath}`);\n }\n}\n\nfunction getDubheDependency(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'): string {\n switch (network) {\n case 'localnet':\n return 'Dubhe = { local = \"../dubhe\" }';\n case 'testnet':\n return `Dubhe = { git = \"https://github.com/0xobelisk/dubhe-wip.git\", subdir = \"packages/sui-framework/contracts/dubhe\", rev = \"${packageJson.version}\" }`;\n case 'mainnet':\n return `Dubhe = { git = \"https://github.com/0xobelisk/dubhe-wip.git\", subdir = \"packages/sui-framework/contracts/dubhe\", rev = \"${packageJson.version}\" }`;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n}\n\nexport async function updateDubheDependency(\n filePath: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const newDependency = getDubheDependency(network);\n const updatedContent = fileContent.replace(/Dubhe = \\{.*\\}/, newDependency);\n fs.writeFileSync(filePath, updatedContent, 'utf-8');\n console.log(`Updated Dubhe dependency in ${filePath} for ${network}.`);\n}\nexport async function switchEnv(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {\n try {\n return new Promise<void>((resolve, reject) => {\n const suiProcess = spawn('sui', ['client', 'switch', '--env', network], {\n env: { ...process.env },\n stdio: 'pipe'\n });\n\n suiProcess.on('error', (error) => {\n console.error(chalk.red('\\nโ Failed to Switch Env'));\n console.error(chalk.red(` Error: ${error.message}`));\n reject(error); // Reject promise on error\n });\n\n suiProcess.on('exit', (code) => {\n if (code !== 0) {\n console.error(chalk.red(`\\nโ Process exited with code: ${code}`));\n reject(new Error(`Process exited with code: ${code}`));\n } else {\n resolve(); // Resolve promise on successful exit\n }\n });\n });\n } catch (error) {\n console.error(chalk.red('\\nโ Failed to Switch Env'));\n console.error(chalk.red(` โโ Error: ${error}`));\n }\n}\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function loadKey(): string {\n const privateKey = process.env.PRIVATE_KEY || process.env.NEXT_PUBLIC_PRIVATE_KEY;\n if (!privateKey) {\n throw new DubheCliError(\n `Missing private key environment variable.\n Run 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\n or 'echo \"NEXT_PUBLIC_PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\n in your contracts directory to use the default sui private key.`\n );\n }\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new DubheCliError(`Please check your privateKey.`);\n }\n return privateKeyFormat;\n}\n\nexport function initializeDubhe({\n network,\n packageId,\n metadata\n}: {\n network: NetworkType;\n packageId?: string;\n metadata?: SuiMoveNormalizedModules;\n}): Dubhe {\n const privateKey = loadKey();\n return new Dubhe({\n networkType: network,\n secretKey: privateKey,\n packageId,\n metadata\n });\n}\n","import chalk from 'chalk';\nimport { ZodError } from 'zod';\nimport { fromZodError, ValidationError } from 'zod-validation-error';\n\nexport class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n\nexport class DubheCliError extends Error {\n name = 'DubheCliError';\n}\n\nexport class UpgradeError extends Error {\n name = 'UpgradeError';\n}\n\nexport class FsIibError extends Error {\n name = 'FsIibError';\n}\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n const validationError = fromZodError(error, {\n prefixSeparator: '\\n- ',\n issueSeparator: '\\n- '\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log('');\n // TODO add docs to the website and update the link to the specific page\n console.log(\n chalk.blue(\n `To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk`\n )\n );\n } else if (error instanceof DubheCliError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","{\n \"name\": \"@0xobelisk/sui-cli\",\n \"version\": \"1.2.0-pre.11\",\n \"description\": \"Tookit for interacting with move eps framework\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"type\": \"module\",\n \"author\": \"team@obelisk.build\",\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-cli#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"exports\": {\n \".\": \"./dist/index.js\"\n },\n \"types\": \"src/index.ts\",\n \"bin\": {\n \"dubhe\": \"./dist/dubhe.js\"\n },\n \"scripts\": {\n \"build\": \"pnpm run type-check && pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/dubhe.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"@0xobelisk/sui-client\": \"workspace:*\",\n \"@0xobelisk/sui-common\": \"workspace:*\",\n \"@mysten/sui\": \"^1.19.0\",\n \"@types/sqlite3\": \"^3.1.11\",\n \"@types/wait-on\": \"^5.3.4\",\n \"chalk\": \"^5.0.1\",\n \"child_process\": \"^1.0.2\",\n \"chokidar\": \"^3.5.3\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"execa\": \"^7.0.0\",\n \"glob\": \"^8.0.3\",\n \"ora\": \"^5.4.1\",\n \"path\": \"^0.12.7\",\n \"sqlite\": \"^5.1.1\",\n \"sqlite3\": \"^5.1.7\",\n \"typescript\": \"5.1.6\",\n \"wait-on\": \"^7.0.1\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/yargs\": \"^17.0.10\",\n \"eslint\": \"^8.56.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\",\n \"ts-node\": \"^10.9.1\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"0.31.4\"\n }\n}\n","import { loadMetadata } from '@0xobelisk/sui-client';\nimport { DubheCliError } from './errors';\nimport { getOldPackageId, getSchemaId, initializeDubhe } from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nfunction validateParams(storageType: string, params: any[]): boolean {\n const formatStorageType = storageType.split('<')[0].trim();\n switch (formatStorageType) {\n case 'StorageValue':\n return params.length === 0;\n case 'StorageMap':\n return params.length === 1;\n case 'StorageDoubleMap':\n return params.length === 2;\n default:\n return false;\n }\n}\n\nfunction getExpectedParamsCount(storageType: string): number {\n const formatStorageType = storageType.split('<')[0].trim();\n switch (formatStorageType) {\n case 'StorageValue':\n return 0;\n case 'StorageMap':\n return 1;\n case 'StorageDoubleMap':\n return 2;\n default:\n return 0;\n }\n}\n\nexport async function queryStorage({\n dubheConfig,\n schema,\n params,\n network,\n objectId,\n packageId,\n metadataFilePath\n}: {\n dubheConfig: DubheConfig;\n schema: string;\n params?: any[];\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n objectId?: string;\n packageId?: string;\n metadataFilePath?: string;\n}) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n\n packageId = packageId || (await getOldPackageId(projectPath, network));\n\n objectId = objectId || (await getSchemaId(projectPath, network));\n\n let metadata;\n if (metadataFilePath) {\n metadata = await loadMetadataFromFile(metadataFilePath);\n } else {\n metadata = await loadMetadata(network, packageId);\n }\n if (!metadata) {\n throw new DubheCliError(\n `Metadata file not found. Please provide a metadata file path or set the packageId.`\n );\n }\n\n if (!dubheConfig.schemas[schema]) {\n throw new DubheCliError(\n `Schema \"${schema}\" not found in dubhe config. Available schemas: ${Object.keys(\n dubheConfig.schemas\n ).join(', ')}`\n );\n }\n\n const storageType = dubheConfig.schemas[schema];\n\n const processedParams = params || [];\n if (!validateParams(storageType, processedParams)) {\n throw new Error(\n `Invalid params count for ${storageType}. ` +\n `Expected: ${getExpectedParamsCount(storageType)}, ` +\n `Got: ${processedParams.length}`\n );\n }\n\n const dubhe = initializeDubhe({\n network,\n packageId,\n metadata\n });\n const result = await dubhe.parseState({\n schema,\n objectId,\n storageType,\n params: processedParams\n });\n\n console.log(result);\n}\n\n/**\n * Load metadata from a JSON file and construct the metadata structure\n * @param metadataFilePath Path to the metadata JSON file\n * @param network Network type\n * @param packageId Package ID\n * @returns Constructed metadata object\n */\nexport async function loadMetadataFromFile(metadataFilePath: string) {\n // Verify file extension is .json\n if (path.extname(metadataFilePath) !== '.json') {\n throw new Error('Metadata file must be in JSON format');\n }\n\n try {\n // Read JSON file content\n const rawData = fs.readFileSync(metadataFilePath, 'utf8');\n const jsonData = JSON.parse(rawData);\n\n // Validate JSON structure\n if (!jsonData || typeof jsonData !== 'object') {\n throw new Error('Invalid JSON format');\n }\n\n // Construct metadata structure\n const metadata = {\n ...jsonData\n };\n\n return metadata;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to read metadata file: ${error.message}`);\n }\n throw error;\n }\n}\n","import { loadMetadata, Transaction, TransactionResult } from '@0xobelisk/sui-client';\nimport { DubheCliError } from './errors';\nimport { getOldPackageId, initializeDubhe } from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport { loadMetadataFromFile } from './queryStorage';\n\nconst BaseTxType = [\n 'u8',\n 'u16',\n 'u32',\n 'u64',\n 'u128',\n 'u256',\n 'bool',\n 'id',\n 'string',\n 'address',\n 'object'\n];\n\nfunction validateParams(params: any[]) {\n try {\n params.forEach((param) => {\n const [type, _] = param.split(':');\n if (!BaseTxType.includes(type)) {\n throw new Error(`Invalid param type: ${type}`);\n }\n });\n } catch (error) {\n throw new Error(`Invalid params: ${error}`);\n }\n}\n\n// param:\n// u8:1\n// u16:1\n// u32:1\n// u64:1\n// u128:1\n// u256:1\n// object:0x1\n// address:0x1\n// bool:true\n// string:\"hello\"\nfunction formatBCS(tx: Transaction, param: string) {\n const [type, value] = param.split(':');\n switch (type) {\n case 'u8':\n return tx.pure.u8(parseInt(value));\n case 'u16':\n return tx.pure.u16(parseInt(value));\n case 'u32':\n return tx.pure.u32(parseInt(value));\n case 'u64':\n return tx.pure.u64(parseInt(value));\n case 'u128':\n return tx.pure.u128(parseInt(value));\n case 'u256':\n return tx.pure.u256(parseInt(value));\n case 'object':\n return tx.object(value);\n case 'address':\n return tx.pure.address(value);\n case 'bool':\n return tx.pure.bool(value === 'true');\n case 'string':\n return tx.pure.string(value);\n default:\n throw new Error(`Invalid param type: ${type}`);\n }\n}\n\nfunction formatBCSParams(tx: Transaction, params: any[]) {\n return params.map((param) => formatBCS(tx, param));\n}\n\nexport async function callHandler({\n dubheConfig,\n moduleName,\n funcName,\n params,\n network,\n packageId,\n metadataFilePath\n}: {\n dubheConfig: DubheConfig;\n moduleName: string;\n funcName: string;\n params?: any[];\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n packageId?: string;\n metadataFilePath?: string;\n}) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n\n packageId = packageId || (await getOldPackageId(projectPath, network));\n\n // objectId = objectId || (await getObjectId(projectPath, network, schema));\n\n let metadata;\n if (metadataFilePath) {\n metadata = await loadMetadataFromFile(metadataFilePath);\n } else {\n metadata = await loadMetadata(network, packageId);\n }\n if (!metadata) {\n throw new DubheCliError(\n `Metadata file not found. Please provide a metadata file path or set the packageId.`\n );\n }\n\n const processedParams = params || [];\n validateParams(processedParams);\n const dubhe = initializeDubhe({\n network,\n packageId,\n metadata\n });\n const tx = new Transaction();\n const formattedParams = formatBCSParams(tx, processedParams);\n\n const result = (await dubhe.tx[moduleName][funcName]({\n tx,\n params: formattedParams\n })) as TransactionResult;\n\n console.log(JSON.stringify(result, null, 2));\n}\n","import type { CommandModule } from 'yargs';\nimport { startLocalNode } from '../utils/startNode';\n\nconst commandModule: CommandModule = {\n command: 'node',\n\n describe: 'Manage local Sui node',\n\n builder(yargs) {\n return yargs\n },\n\n async handler() {\n try {\n await startLocalNode();\n } catch (error) {\n console.error('Error executing command:', error);\n process.exit(1);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { requestSuiFromFaucetV0, getFaucetHost } from '@mysten/sui/faucet';\nimport { SuiClient, getFullnodeUrl, GetBalanceParams } from '@mysten/sui/client';\nimport { initializeDubhe } from '../utils';\n\ntype Options = {\n network: any;\n recipient?: string;\n};\n\nconst MAX_RETRIES = 60; // 60s timeout\nconst RETRY_INTERVAL = 1000; // 1s retry interval\nconst SPINNER = ['โ ', 'โ ', 'โ น', 'โ ธ', 'โ ผ', 'โ ด', 'โ ฆ', 'โ ง', 'โ ', 'โ '];\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'faucet',\n\n describe: 'Interact with a Dubhe faucet',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n desc: 'URL of the Dubhe faucet',\n choices: ['testnet', 'devnet', 'localnet'],\n default: 'localnet'\n },\n recipient: {\n type: 'string',\n desc: 'Sui address to fund'\n }\n });\n },\n\n async handler({ network, recipient }) {\n let faucet_address = '';\n if (recipient === undefined) {\n const dubhe = initializeDubhe(network);\n faucet_address = dubhe.getAddress();\n } else {\n faucet_address = recipient;\n }\n\n console.log('\\n๐ Starting Faucet Operation...');\n console.log(` โโ Network: ${network}`);\n\n if (recipient === undefined) {\n console.log(' โโ Using Environment PrivateKey');\n console.log(` โโ Generated Address: ${faucet_address}`);\n } else {\n console.log(` โโ Using Provided Address: ${faucet_address}`);\n }\n\n console.log(' โโ Requesting funds from faucet...');\n\n let retryCount = 0;\n let success = false;\n let spinnerIndex = 0;\n const startTime = Date.now();\n let isInterrupted = false;\n\n const handleInterrupt = () => {\n isInterrupted = true;\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log('\\n โโ Operation cancelled by user');\n process.exit(0);\n };\n process.on('SIGINT', handleInterrupt);\n\n try {\n while (retryCount < MAX_RETRIES && !success && !isInterrupted) {\n try {\n await requestSuiFromFaucetV0({\n host: getFaucetHost(network),\n recipient: faucet_address\n });\n success = true;\n } catch (error) {\n if (isInterrupted) break;\n\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(` โโ Failed to request funds after ${MAX_RETRIES} attempts.`);\n console.log(' โโ Please check your network connection and try again later.');\n process.exit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Retrying... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n }\n }\n } finally {\n process.removeListener('SIGINT', handleInterrupt);\n }\n\n if (isInterrupted) {\n process.exit(0);\n }\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n\n console.log(' โโ Checking balance...');\n const client = new SuiClient({ url: getFullnodeUrl(network) });\n let params = {\n owner: faucet_address\n } as GetBalanceParams;\n\n const balance = await client.getBalance(params);\n\n console.log('\\n๐ฐ Account Summary');\n console.log(` โโ Address: ${faucet_address}`);\n console.log(` โโ Balance: ${(Number(balance.totalBalance) / 1_000_000_000).toFixed(4)} SUI`);\n\n console.log('\\nโ
Faucet Operation Complete\\n');\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { schemaGen, loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport chalk from 'chalk';\n\ntype Options = {\n 'config-path'?: string;\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'schemagen',\n\n describe: 'Autogenerate Dubhe schemas based on the config file',\n\n builder: {\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Path to the config file'\n },\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'] as const,\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n }\n },\n\n async handler({ 'config-path': configPath, network }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await schemaGen(dubheConfig, undefined, network);\n process.exit(0);\n } catch (error: any) {\n console.log(chalk.red('Schemagen failed!'));\n console.error(error.message);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { publishHandler } from '../utils';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n network: any;\n 'config-path': string;\n 'gas-budget'?: number;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'publish',\n\n describe: 'Publish dubhe move contract',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n default: 'localnet',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n },\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Configuration file path'\n },\n 'gas-budget': {\n type: 'number',\n desc: 'Optional gas budget for the transaction',\n optional: true\n }\n });\n },\n\n async handler({ network, 'config-path': configPath, 'gas-budget': gasBudget }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await publishHandler(dubheConfig, network, gasBudget);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import { Transaction, UpgradePolicy } from '@0xobelisk/sui-client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { UpgradeError } from './errors';\nimport {\n getOldPackageId,\n getVersion,\n getUpgradeCap,\n saveContractData,\n getOnchainSchemas,\n switchEnv,\n getSchemaId,\n initializeDubhe\n} from './utils';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { DubheConfig } from '@0xobelisk/sui-common';\n\ntype Migration = {\n schemaName: string;\n fields: string;\n};\n\nfunction updateMigrateMethod(projectPath: string, migrations: Migration[]): void {\n let filePath = `${projectPath}/sources/codegen/core/schema.move`;\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const migrateMethodRegex = new RegExp(\n `public fun migrate\\\\(_schema: &mut Schema, _ctx: &mut TxContext\\\\) {[^}]*}`\n );\n const newMigrateMethod = `\npublic fun migrate(_schema: &mut Schema, _ctx: &mut TxContext) {\n${migrations\n .map((migration) => {\n let storage_type = '';\n if (migration.fields.includes('StorageValue')) {\n storage_type = `storage_value::new(b\"${migration.schemaName}\", _ctx)`;\n } else if (migration.fields.includes('StorageMap')) {\n storage_type = `storage_map::new(b\"${migration.schemaName}\", _ctx)`;\n } else if (migration.fields.includes('StorageDoubleMap')) {\n storage_type = `storage_double_map::new(b\"${migration.schemaName}\", _ctx)`;\n }\n return `storage::add_field<${migration.fields}>(&mut _schema.id, b\"${migration.schemaName}\", ${storage_type});`;\n })\n .join('')}\n}\n`;\n\n const updatedContent = fileContent.replace(migrateMethodRegex, newMigrateMethod);\n fs.writeFileSync(filePath, updatedContent, 'utf-8');\n}\n\nfunction replaceEnvField(\n filePath: string,\n networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n field: 'original-published-id' | 'latest-published-id' | 'published-version',\n newValue: string\n): string {\n const envFilePath = path.resolve(filePath);\n const envContent = fs.readFileSync(envFilePath, 'utf-8');\n const envLines = envContent.split('\\n');\n\n const networkSectionIndex = envLines.findIndex((line) => line.trim() === `[env.${networkType}]`);\n if (networkSectionIndex === -1) {\n console.log(`Network type [env.${networkType}] not found in the file.`);\n return '';\n }\n\n let fieldIndex = -1;\n let previousValue: string = '';\n for (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n const line = envLines[i].trim();\n if (line.startsWith('[')) break; // End of the current network section\n\n if (line.startsWith(field)) {\n fieldIndex = i;\n previousValue = line.split('=')[1].trim().replace(/\"/g, '');\n break;\n }\n }\n\n if (fieldIndex !== -1) {\n envLines[fieldIndex] = `${field} = \"${newValue}\"`;\n const newEnvContent = envLines.join('\\n');\n fs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n } else {\n console.log(`${field} not found for [env.${networkType}].`);\n }\n\n return previousValue;\n}\nexport async function upgradeHandler(\n config: DubheConfig,\n name: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n await switchEnv(network);\n\n const path = process.cwd();\n const projectPath = `${path}/contracts/${name}`;\n\n const dubhe = initializeDubhe({\n network\n });\n\n let oldVersion = Number(await getVersion(projectPath, network));\n let oldPackageId = await getOldPackageId(projectPath, network);\n let upgradeCap = await getUpgradeCap(projectPath, network);\n let schemaId = await getSchemaId(projectPath, network);\n\n const original_published_id = replaceEnvField(\n `${projectPath}/Move.lock`,\n network,\n 'original-published-id',\n '0x0000000000000000000000000000000000000000000000000000000000000000'\n );\n\n let pendingMigration: Migration[] = [];\n let schemas = await getOnchainSchemas(projectPath, network);\n Object.entries(config.schemas).forEach(([key, value]) => {\n if (!schemas.hasOwnProperty(key)) {\n pendingMigration.push({ schemaName: key, fields: value });\n }\n });\n updateMigrateMethod(projectPath, pendingMigration);\n\n try {\n let modules: any, dependencies: any, digest: any;\n try {\n const {\n modules: extractedModules,\n dependencies: extractedDependencies,\n digest: extractedDigest\n } = JSON.parse(\n execSync(`sui move build --dump-bytecode-as-base64 --path ${path}/contracts/${name}`, {\n encoding: 'utf-8'\n })\n );\n\n modules = extractedModules;\n dependencies = extractedDependencies;\n digest = extractedDigest;\n } catch (error: any) {\n throw new UpgradeError(error.stdout);\n }\n\n console.log('\\n๐ Starting Upgrade Process...');\n console.log('๐ OldPackageId:', oldPackageId);\n console.log('๐ UpgradeCap Object Id:', upgradeCap);\n console.log('๐ OldVersion:', oldVersion);\n\n const tx = new Transaction();\n const ticket = tx.moveCall({\n target: '0x2::package::authorize_upgrade',\n arguments: [\n tx.object(upgradeCap),\n tx.pure.u8(UpgradePolicy.COMPATIBLE),\n tx.pure.vector('u8', digest)\n ]\n });\n\n const receipt = tx.upgrade({\n modules,\n dependencies,\n package: oldPackageId,\n ticket\n });\n\n tx.moveCall({\n target: '0x2::package::commit_upgrade',\n arguments: [tx.object(upgradeCap), receipt]\n });\n\n const result = await dubhe.signAndSendTxn({\n tx,\n onSuccess: (result) => {\n console.log(chalk.green(`Upgrade Transaction Digest: ${result.digest}`));\n },\n onError: (error) => {\n console.log(chalk.red('Upgrade Transaction failed!'));\n console.error(error);\n }\n });\n\n let newPackageId = '';\n result.objectChanges!.map((object) => {\n if (object.type === 'published') {\n console.log(chalk.blue(`${name} new PackageId: ${object.packageId}`));\n console.log(chalk.blue(`${name} new Version: ${oldVersion + 1}`));\n newPackageId = object.packageId;\n }\n });\n\n replaceEnvField(\n `${projectPath}/Move.lock`,\n network,\n 'original-published-id',\n original_published_id\n );\n replaceEnvField(`${projectPath}/Move.lock`, network, 'latest-published-id', newPackageId);\n replaceEnvField(`${projectPath}/Move.lock`, network, 'published-version', oldVersion + 1 + '');\n\n saveContractData(\n name,\n network,\n newPackageId,\n schemaId,\n upgradeCap,\n oldVersion + 1,\n config.schemas\n );\n\n console.log(`\\n๐ Starting Migration Process...`);\n pendingMigration.forEach((migration) => {\n console.log('๐ Added Fields:', JSON.stringify(migration, null, 2));\n });\n await new Promise((resolve) => setTimeout(resolve, 5000));\n\n const migrateTx = new Transaction();\n const newVersion = oldVersion + 1;\n let args = [];\n if (name !== 'dubhe') {\n let dubheSchemaId = await getSchemaId(`${process.cwd()}/contracts/dubhe-framework`, network);\n args.push(migrateTx.object(dubheSchemaId));\n }\n args.push(migrateTx.object(schemaId));\n args.push(migrateTx.pure.address(newPackageId));\n args.push(migrateTx.pure.u32(newVersion));\n migrateTx.moveCall({\n target: `${newPackageId}::${name}_migrate::migrate_to_v${newVersion}`,\n arguments: args\n });\n\n await dubhe.signAndSendTxn({\n tx: migrateTx,\n onSuccess: (result) => {\n console.log(chalk.green(`Migration Transaction Digest: ${result.digest}`));\n },\n onError: (error) => {\n console.log(\n chalk.red('Migration Transaction failed!, Please execute the migration manually.')\n );\n console.error(error);\n }\n });\n } catch (error: any) {\n console.log(chalk.red('upgrade handler execution failed!'));\n console.error(error.message);\n }\n}\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { upgradeHandler } from '../utils/upgradeHandler';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n network: any;\n 'config-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'upgrade',\n\n describe: 'Upgrade your move contracts',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n default: 'localnet',\n desc: 'Network of the node (mainnet/testnet/devnet/localnet)'\n },\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n decs: 'Path to the config file'\n }\n });\n },\n\n async handler({ network, 'config-path': configPath }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await upgradeHandler(dubheConfig, dubheConfig.name, network);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { execSync } from 'child_process';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n 'config-path': string;\n test?: string;\n 'gas-limit'?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'test',\n\n describe: 'Run tests in Dubhe contracts',\n\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n description: 'Options to pass to forge test'\n },\n test: {\n type: 'string',\n desc: 'Run a specific test'\n },\n 'gas-limit': {\n type: 'string',\n desc: 'Set the gas limit for the test',\n default: '100000000'\n }\n });\n },\n\n async handler({ 'config-path': configPath, test, 'gas-limit': gasLimit }) {\n // Start an internal anvil process if no world address is provided\n try {\n console.log('๐ Running move test');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n const command = `sui move test --path ${projectPath} ${\n test ? ` --test ${test}` : ''\n } --gas-limit ${gasLimit}`;\n execSync(command, { stdio: 'inherit', encoding: 'utf-8' });\n } catch (error: any) {\n process.exit(0);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { switchEnv, updateDubheDependency } from '../utils';\n\ntype Options = {\n 'config-path': string;\n network: any;\n 'dump-bytecode-as-base64'?: boolean;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'build',\n describe: 'Run tests in Dubhe contracts',\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n description: 'Options to pass to forge test'\n },\n network: {\n type: 'string',\n default: 'localnet',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n },\n 'dump-bytecode-as-base64': {\n type: 'boolean',\n default: false,\n desc: 'Dump bytecode as base64'\n }\n });\n },\n\n async handler({\n 'config-path': configPath,\n network,\n 'dump-bytecode-as-base64': dumpBytecodeAsBase64\n }) {\n // Start an internal anvil process if no world address is provided\n try {\n console.log('๐ Running move build');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n await switchEnv(network);\n await updateDubheDependency(projectPath + '/Move.toml', network);\n const command = `sui move build --path ${projectPath} ${\n dumpBytecodeAsBase64 ? ` --dump-bytecode-as-base64` : ''\n }`;\n const output = execSync(command, { encoding: 'utf-8' });\n console.log(output);\n } catch (error: any) {\n console.error(chalk.red('Error executing sui move build:'));\n console.log(error.stdout);\n process.exit(0);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { printDubhe } from '../utils';\n\nconst commandModule: CommandModule = {\n command: 'hello',\n\n describe: 'hello, dubhe',\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n printDubhe();\n }\n};\n\nexport default commandModule;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\n\nexport async function generateAccountHandler(\n force: boolean = false,\n useNextPublic: boolean = false\n) {\n if (useNextPublic) {\n console.log(\n chalk.gray(\n 'Note: The generated account will be stored in the .env file with NEXT_PUBLIC_ prefix for client-side usage.'\n )\n );\n console.log(\n chalk.yellow('Warning: Do not expose the .env file, it is intended for local testing only.\\n')\n );\n }\n const path = process.cwd();\n let privateKey: string | undefined;\n let envContent = '';\n\n // Check if .env file exists\n try {\n envContent = fs.readFileSync(`${path}/.env`, 'utf8');\n\n // privateKey = process.env.PRIVATE_KEY || process.env.NEXT_PUBLIC_PRIVATE_KEY;\n let privateKey = process.env.PRIVATE_KEY || process.env.NEXT_PUBLIC_PRIVATE_KEY;\n if (useNextPublic) {\n privateKey = process.env.NEXT_PUBLIC_PRIVATE_KEY || process.env.PRIVATE_KEY;\n }\n\n if (privateKey) {\n // If key exists, decide whether to update keyname based on useNextPublic\n const newKeyName = useNextPublic ? 'NEXT_PUBLIC_PRIVATE_KEY' : 'PRIVATE_KEY';\n\n // Find and update the last matching line based on privateKey value\n const lines = envContent.split('\\n');\n let shouldUpdate = false;\n\n // First check if the last matching line already has the correct keyname\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line.endsWith(privateKey)) {\n // If useNextPublic is true, only update if the line starts with PRIVATE_KEY=\n // If useNextPublic is false, only update if the line starts with NEXT_PUBLIC_PRIVATE_KEY=\n const [currentKeyName] = line.split('=');\n if (useNextPublic) {\n shouldUpdate = currentKeyName === 'PRIVATE_KEY';\n } else {\n shouldUpdate = currentKeyName === 'NEXT_PUBLIC_PRIVATE_KEY';\n }\n break;\n }\n }\n\n // Only update if necessary\n if (shouldUpdate) {\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line.endsWith(privateKey)) {\n const newLine = `${newKeyName}=${privateKey}`;\n lines[i] = newLine;\n envContent = lines.join('\\n');\n fs.writeFileSync(`${path}/.env`, envContent);\n break;\n }\n }\n }\n\n const dubhe = new Dubhe({ secretKey: privateKey });\n const keypair = dubhe.getSigner();\n console.log(chalk.blue(`Using existing account: ${keypair.toSuiAddress()}`));\n return;\n }\n } catch (error) {\n // .env file doesn't exist or failed to read, continue to generate new account\n }\n\n // Generate a new account if no existing key is found or force generation is requested\n if (force || !privateKey) {\n const dubhe = new Dubhe();\n const keypair = dubhe.getSigner();\n privateKey = keypair.getSecretKey();\n\n const newKeyName = useNextPublic ? 'NEXT_PUBLIC_PRIVATE_KEY' : 'PRIVATE_KEY';\n const newContent = `${newKeyName}=${privateKey}`;\n\n // If .env file exists, append new content; otherwise create a new file\n if (envContent) {\n envContent = envContent.trim() + '\\n' + newContent;\n } else {\n envContent = newContent;\n }\n\n fs.writeFileSync(`${path}/.env`, envContent);\n console.log(chalk.green(`File created/updated at: ${path}/.env`));\n\n console.log(chalk.blue(`New account generated: ${keypair.toSuiAddress()}`));\n }\n}\n","import type { CommandModule } from 'yargs';\nimport { generateAccountHandler } from '../utils/generateAccount';\n\ntype Options = {\n force?: boolean;\n 'use-next-public'?: boolean;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'generate-key',\n describe: 'Generate a new account keypair and save it to a .env file',\n builder: {\n force: {\n type: 'boolean',\n default: false,\n desc: 'Force generate a new keypair'\n },\n 'use-next-public': {\n type: 'boolean',\n default: false,\n desc: 'Use the NEXT_PUBLIC_ prefix for client-side usage'\n }\n },\n async handler({ force, 'use-next-public': useNextPublic }) {\n try {\n await generateAccountHandler(force, useNextPublic);\n } catch (error) {\n console.error('Error generating account:', error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { initializeDubhe } from './utils';\nimport { DubheCliError } from './errors';\ndotenv.config();\n\nexport async function checkBalanceHandler(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {\n try {\n const dubhe = initializeDubhe({\n network\n });\n\n const balance = await dubhe.getBalance();\n const balanceInSUI = Number(balance.totalBalance) / 1_000_000_000;\n\n if (balanceInSUI === 0) {\n throw new DubheCliError(`Your account balance is 0 SUI. Please get some SUI to proceed.`);\n }\n\n console.log(chalk.green(`Current account balance: ${balanceInSUI.toFixed(4)} SUI`));\n } catch (error) {\n throw new DubheCliError('Failed to check balance: ' + error);\n }\n}\n","import type { CommandModule } from 'yargs';\nimport { checkBalanceHandler } from '../utils/checkBalance';\n\ntype Options = {\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'check-balance',\n describe: 'Check the balance of the account',\n builder: {\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n desc: 'Network to check balance on',\n default: 'localnet'\n }\n },\n async handler({ network }) {\n try {\n await checkBalanceHandler(network);\n } catch (error) {\n console.error('Error checking balance:', error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport { getDeploymentJson, getDubheSchemaId } from './utils';\n\nasync function storeConfig(\n network: string,\n packageId: string,\n schemaId: string,\n outputPath: string\n) {\n const dubheSchemaId = await getDubheSchemaId(network);\n let code = `type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';\n\nexport const NETWORK: NetworkType = '${network}';\nexport const PACKAGE_ID = '${packageId}';\nexport const SCHEMA_ID = '${schemaId}';\nexport const DUBHE_SCHEMA_ID = '${dubheSchemaId}';\n`;\n\n writeOutput(code, outputPath, 'storeConfig');\n}\n\nasync function writeOutput(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, output);\n if (logPrefix !== undefined) {\n console.log(`${logPrefix}: ${fullOutputPath}`);\n }\n}\n\nexport async function storeConfigHandler(\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n outputPath: string\n) {\n const path = process.cwd();\n const contractPath = `${path}/contracts/${dubheConfig.name}`;\n const deployment = await getDeploymentJson(contractPath, network);\n await storeConfig(deployment.network, deployment.packageId, deployment.schemaId, outputPath);\n}\n","import type { CommandModule } from 'yargs';\nimport { storeConfigHandler } from '../utils/storeConfig';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n 'config-path': string;\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n 'output-ts-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'config-store',\n\n describe: 'Store configuration for the Dubhe project',\n\n builder: {\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Path to the config file'\n },\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n desc: 'Network to store config for'\n },\n 'output-ts-path': {\n type: 'string',\n desc: 'Specify the output path for the generated TypeScript configuration file (e.g., ./src/config/generated.ts)'\n }\n },\n async handler({ 'config-path': configPath, network, 'output-ts-path': outputTsPath }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await storeConfigHandler(dubheConfig, network, outputTsPath);\n } catch (error) {\n console.error('Error storing config:', error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { queryStorage } from '../utils';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n 'config-path'?: string;\n schema: string;\n 'object-id'?: string;\n 'package-id'?: string;\n 'metadata-path'?: string;\n params?: any[];\n};\n\n/**\n * CLI command module for querying schema struct state\n *\n * Examples:\n *\n * 1. Query StorageValue (no params required):\n * ```bash\n * dubhe query --config-path dubhe.config.ts --network devnet --schema counter --field value\n * ```\n *\n * 2. Query StorageMap (one param required):\n * ```bash\n * dubhe query --config-path dubhe.config.ts --network devnet --schema token --field balances \\\n * --params \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\"\n * ```\n *\n * 3. Query StorageDoubleMap (two params required):\n * ```bash\n * dubhe query --config-path dubhe.config.ts --network devnet --schema game --field player_relations \\\n * --params \"0x123...456\" \"0x789...abc\"\n * ```\n */\nconst commandModule: CommandModule<Options, Options> = {\n command: 'query',\n\n describe: 'Query dubhe schema struct state',\n\n builder: {\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n default: 'localnet',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n },\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Configuration file path'\n },\n schema: {\n type: 'string',\n desc: 'Schema name',\n demandOption: true\n },\n 'object-id': {\n type: 'string',\n desc: 'Object ID (optional)'\n },\n 'package-id': {\n type: 'string',\n desc: 'Package ID (optional)'\n },\n 'metadata-path': {\n type: 'string',\n desc: 'Path to metadata JSON file (optional)'\n },\n params: {\n type: 'array',\n desc: 'Params for storage type: StorageValue(no params), StorageMap(1 param), StorageDoubleMap(2 params)',\n string: true\n }\n },\n\n async handler({\n network,\n 'config-path': configPath,\n schema,\n 'object-id': objectId,\n 'package-id': packageId,\n 'metadata-path': metadataPath,\n params\n }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\n await queryStorage({\n dubheConfig,\n schema,\n objectId,\n network,\n packageId,\n metadataFilePath: metadataPath,\n params\n });\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { callHandler } from '../utils';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n module: string;\n function: string;\n 'config-path'?: string;\n 'package-id'?: string;\n 'metadata-path'?: string;\n params?: any[];\n};\n\n/**\n * CLI command for calling a function in a module\n */\nconst commandModule: CommandModule<Options, Options> = {\n command: 'call',\n\n describe: 'Call a function in a module',\n\n builder: {\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n desc: 'Node network (mainnet/testnet/devnet/localnet)',\n default: 'localnet'\n },\n module: {\n type: 'string',\n desc: 'Module name',\n demandOption: true\n },\n function: {\n type: 'string',\n desc: 'Function name',\n demandOption: true\n },\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Configuration file path'\n },\n 'package-id': {\n type: 'string',\n desc: 'Package ID (optional)'\n },\n 'metadata-path': {\n type: 'string',\n desc: 'Path to metadata JSON file (optional)'\n },\n params: {\n type: 'array',\n desc: 'Params for the function',\n string: true\n }\n },\n\n async handler({\n network,\n 'config-path': configPath,\n module: moduleName,\n function: funcName,\n 'package-id': packageId,\n 'metadata-path': metadataPath,\n params\n }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\n await callHandler({\n dubheConfig,\n moduleName,\n funcName,\n network,\n packageId,\n metadataFilePath: metadataPath,\n params\n });\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport chokidar from 'chokidar';\nimport { exec } from 'child_process';\n\nconst commandModule: CommandModule = {\n command: 'watch',\n\n describe: 'Watch dubhe config',\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n const configFilePath = 'dubhe.config.ts';\n\n const runSchemagen = () => {\n exec('pnpm dubhe schemagen', (error, stdout, stderr) => {\n if (error) {\n console.error(`Error executing schemagen: ${error.message}`);\n return;\n }\n if (stderr) {\n console.error(`schemagen stderr: ${stderr}`);\n return;\n }\n console.log(`schemagen stdout: ${stdout}`);\n });\n };\n\n const watcher = chokidar.watch(configFilePath, {\n persistent: true\n });\n\n watcher.on('change', (path) => {\n console.log(`${path} has been changed. Running schemagen...`);\n runSchemagen();\n });\n\n console.log(`Watching for changes in ${configFilePath}...`);\n\n process.on('SIGINT', () => {\n watcher.close();\n console.log('\\nWatch stopped.');\n process.exit();\n });\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport waitOn from 'wait-on';\nimport ora from 'ora';\nimport chalk from 'chalk';\n\ninterface WaitOptions {\n url: string;\n timeout: number;\n interval: number;\n}\n\nconst commandModule: CommandModule = {\n command: 'wait',\n describe: 'Wait for service to be ready',\n builder(yargs) {\n return yargs\n .option('url', {\n type: 'string',\n description: 'URL to wait for'\n })\n .option('timeout', {\n type: 'number',\n description: 'Timeout (in milliseconds)',\n default: 180000\n })\n .option('interval', {\n type: 'number',\n description: 'Check interval (in milliseconds)',\n default: 1000\n });\n },\n async handler(argv) {\n const options = argv as unknown as WaitOptions;\n const spinner = ora({\n text: `Waiting for service to start ${chalk.cyan(options.url)}...`,\n color: 'cyan'\n });\n\n spinner.start();\n\n try {\n await waitOn({\n resources: [options.url],\n timeout: options.timeout,\n interval: options.interval,\n validateStatus: (status: number) => status === 200\n });\n\n spinner.succeed(chalk.green('Service is ready!'));\n process.exit(0);\n } catch (error) {\n spinner.fail(chalk.red('Timeout waiting for service'));\n console.error(chalk.yellow('Please make sure the service is running...'));\n process.exit(1);\n }\n }\n};\n\nexport default commandModule;\n","import { CommandModule } from 'yargs';\n\nimport localnode from './localnode';\nimport faucet from './faucet';\nimport schemagen from './schemagen';\nimport publish from './publish';\nimport upgrade from './upgrade';\nimport test from './test';\nimport build from './build';\nimport hello from './hello';\nimport generateKey from './generateKey';\nimport checkBalance from './checkBalance';\nimport configStore from './configStore';\nimport query from './query';\nimport call from './call';\nimport watch from './watch';\nimport wait from './wait';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n localnode,\n publish,\n call,\n query,\n faucet,\n schemagen,\n upgrade,\n test,\n build,\n hello,\n generateKey,\n checkBalance,\n configStore,\n watch,\n wait\n];\n"],"mappings":"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","names":["yargs","hideBin","execSync","spawn","chalk","chalk","printDubhe","Transaction","execSync","chalk","fsAsync","mkdirSync","writeFileSync","dirname","SUI_PRIVATE_KEY_PREFIX","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","DubheCliError","UpgradeError","logError","error","ValidationError","chalk","ZodError","validationError","fromZodError","NotInsideProjectError","DubheCliError","fs","chalk","spawn","Dubhe","package_default","validatePrivateKey","privateKey","SUI_PRIVATE_KEY_PREFIX","strippedPrivateKey","getDeploymentJson","projectPath","network","data","error","getDeploymentSchemaId","getDubheSchemaId","contractPath","getOnchainSchemas","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getSchemaId","getUpgradeCap","saveContractData","projectName","packageId","schemaId","upgradeCap","version","schemas","DeploymentData","path","storeDeploymentData","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","getDubheDependency","package_default","updateDubheDependency","filePath","fileContent","newDependency","updatedContent","switchEnv","resolve","reject","suiProcess","spawn","error","chalk","code","delay","ms","loadKey","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","initializeDubhe","metadata","Dubhe","fs","path","MAX_RETRIES","RETRY_INTERVAL","SPINNER","removeEnvContent","filePath","networkType","content","regex","updatedContent","updateEnvFile","operation","chainId","publishedId","envFilePath","envContent","envLines","networkSectionIndex","line","config","i","key","value","part","updatedSection","newEnvContent","buildContract","projectPath","modules","dependencies","buildResult","execSync","error","chalk","waitForNode","dubhe","retryCount","spinnerIndex","startTime","isInterrupted","hasShownBalanceWarning","handleInterrupt","elapsedTime","spinner","resolve","address","coins","balance","sum","coin","publishContract","dubheConfig","network","gasBudget","tx","Transaction","upgradeCap","result","version","packageId","schemaId","schemas","upgradeCapId","printObjects","object","delay","deployHookTx","args","dubheSchemaId","getDubheSchemaId","deployHookResult","saveContractData","checkDubheFramework","publishDubheFramework","publishHandler","switchEnv","initializeDubhe","updateDubheDependency","loadMetadata","fs","path","validateParams","storageType","params","getExpectedParamsCount","queryStorage","dubheConfig","schema","network","objectId","packageId","metadataFilePath","projectPath","getOldPackageId","getSchemaId","metadata","loadMetadataFromFile","loadMetadata","DubheCliError","processedParams","result","initializeDubhe","rawData","jsonData","error","loadMetadata","Transaction","BaseTxType","validateParams","params","param","type","_","error","formatBCS","tx","value","formatBCSParams","callHandler","dubheConfig","moduleName","funcName","network","packageId","metadataFilePath","projectPath","getOldPackageId","metadata","loadMetadataFromFile","loadMetadata","DubheCliError","processedParams","dubhe","initializeDubhe","Transaction","formattedParams","result","Dubhe","isSuiStartRunning","cmd","result","execSync","printAccounts","privateKeys","privateKey","index","keypair","spawn","chalk","handleProcessSignals","suiProcess","cleanup","startLocalNode","printDubhe","error","delay","validatePrivateKey","DubheCliError","resolve","commandModule","yargs","startLocalNode","error","localnode_default","requestSuiFromFaucetV0","getFaucetHost","SuiClient","getFullnodeUrl","MAX_RETRIES","RETRY_INTERVAL","SPINNER","commandModule","yargs","network","recipient","faucet_address","initializeDubhe","retryCount","success","spinnerIndex","startTime","isInterrupted","handleInterrupt","requestSuiFromFaucetV0","getFaucetHost","elapsedTime","spinner","resolve","client","SuiClient","getFullnodeUrl","params","balance","faucet_default","schemaGen","loadConfig","chalk","commandModule","configPath","network","dubheConfig","error","schemagen_default","loadConfig","commandModule","yargs","network","configPath","gasBudget","dubheConfig","publishHandler","error","logError","publish_default","Transaction","UpgradePolicy","execSync","chalk","fs","path","updateMigrateMethod","projectPath","migrations","filePath","fileContent","migrateMethodRegex","newMigrateMethod","migration","storage_type","updatedContent","replaceEnvField","networkType","field","newValue","envFilePath","envLines","networkSectionIndex","line","fieldIndex","previousValue","i","newEnvContent","upgradeHandler","config","name","network","switchEnv","dubhe","initializeDubhe","oldVersion","getVersion","oldPackageId","getOldPackageId","upgradeCap","getUpgradeCap","schemaId","getSchemaId","original_published_id","pendingMigration","schemas","getOnchainSchemas","key","value","modules","dependencies","digest","extractedModules","extractedDependencies","extractedDigest","execSync","error","UpgradeError","tx","Transaction","ticket","UpgradePolicy","receipt","result","chalk","newPackageId","object","saveContractData","resolve","migrateTx","newVersion","args","dubheSchemaId","loadConfig","commandModule","yargs","network","configPath","dubheConfig","upgradeHandler","error","logError","upgrade_default","execSync","loadConfig","commandModule","yargs","configPath","test","gasLimit","dubheConfig","command","test_default","execSync","chalk","loadConfig","commandModule","yargs","configPath","network","dumpBytecodeAsBase64","dubheConfig","loadConfig","projectPath","switchEnv","updateDubheDependency","command","output","execSync","error","chalk","build_default","commandModule","yargs","printDubhe","hello_default","Dubhe","fs","chalk","generateAccountHandler","force","useNextPublic","path","privateKey","envContent","newKeyName","lines","shouldUpdate","i","line","currentKeyName","newLine","keypair","newContent","commandModule","force","useNextPublic","generateAccountHandler","error","generateKey_default","chalk","dotenv","dotenv","checkBalanceHandler","network","balance","initializeDubhe","balanceInSUI","DubheCliError","chalk","error","commandModule","network","checkBalanceHandler","error","checkBalance_default","mkdirSync","writeFileSync","dirname","storeConfig","network","packageId","schemaId","outputPath","dubheSchemaId","getDubheSchemaId","code","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","storeConfigHandler","dubheConfig","contractPath","deployment","getDeploymentJson","loadConfig","commandModule","configPath","network","outputTsPath","dubheConfig","storeConfigHandler","error","configStore_default","loadConfig","commandModule","network","configPath","schema","objectId","packageId","metadataPath","params","dubheConfig","queryStorage","error","logError","query_default","loadConfig","commandModule","network","configPath","moduleName","funcName","packageId","metadataPath","params","dubheConfig","callHandler","error","logError","call_default","chokidar","exec","commandModule","yargs","configFilePath","runSchemagen","error","stdout","stderr","watcher","path","watch_default","waitOn","ora","chalk","commandModule","yargs","argv","options","spinner","status","wait_default","commands","localnode_default","publish_default","call_default","query_default","faucet_default","schemagen_default","upgrade_default","test_default","build_default","hello_default","generateKey_default","checkBalance_default","configStore_default","watch_default","wait_default","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
|
|
1
|
+
{"version":3,"sources":["../src/dubhe.ts","../src/utils/startNode.ts","../src/utils/printDubhe.ts","../src/utils/publishHandler.ts","../src/utils/utils.ts","../src/utils/errors.ts","../src/utils/constants.ts","../src/utils/upgradeHandler.ts","../src/commands/shell.ts","../src/commands/localnode.ts","../src/commands/faucet.ts","../src/commands/schemagen.ts","../src/commands/publish.ts","../src/commands/test.ts","../src/commands/build.ts","../src/commands/hello.ts","../src/utils/generateAccount.ts","../src/commands/generateKey.ts","../src/utils/checkBalance.ts","../src/commands/checkBalance.ts","../src/utils/storeConfig.ts","../src/commands/configStore.ts","../src/commands/watch.ts","../src/commands/wait.ts","../src/commands/switchEnv.ts","../src/commands/info.ts","../src/commands/loadMetadata.ts","../src/utils/metadataHandler.ts","../src/commands/doctor.ts","../package.json","../src/utils/axios-downloader.ts","../src/commands/convertJson.ts","../src/commands/upgrade.ts","../src/commands/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport chalk from 'chalk';\nimport { commands } from './commands';\nimport { logError } from './utils/errors';\nimport packageJson from '../package.json';\n\n// Load .env file into process.env\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"dubhe\" for e.g. ts-node)\n .scriptName('dubhe')\n // Use the commands directory to scaffold\n\n .command(commands as any)\n .version(packageJson.version)\n .demandCommand(1, 'Please provide a command')\n .recommendCommands()\n // Enable strict mode.\n .strict()\n // Custom error handler\n .fail((msg, err) => {\n console.error(chalk.red(msg));\n\n if (msg.includes('Missing required argument')) {\n console.log(\n chalk.yellow(\n `Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`\n )\n );\n }\n console.log('');\n // Even though `.fail` type says we should get an `Error`, this can sometimes be undefined\n if (err != null) {\n logError(err);\n console.log('');\n }\n\n process.exit(1);\n })\n // Useful aliases.\n .alias({ h: 'help' }).argv;\n","import { execSync, spawn } from 'child_process';\nimport chalk from 'chalk';\nimport { printDubhe } from './printDubhe';\nimport { delay, DubheCliError, validatePrivateKey } from '../utils';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport * as fs from 'fs';\n\nexport function stopLocalNode(): void {\n console.log(chalk.yellow('๐ Stopping existing Local Node...'));\n\n let processStopped = false;\n\n if (process.platform === 'win32') {\n // Windows: Kill all sui.exe processes\n try {\n execSync('taskkill /F /IM sui.exe', { stdio: 'ignore' });\n processStopped = true;\n } catch (_error) {\n // Process not found\n }\n } else {\n // Unix-like systems: Try multiple patterns to find sui processes\n const patterns = [\n 'sui start', // Exact match\n 'sui.*start', // Pattern with any flags\n '^sui', // Any sui command\n 'sui.*--with-faucet' // Match our specific startup pattern\n ];\n\n for (const pattern of patterns) {\n try {\n const result = execSync(`pgrep -f \"${pattern}\"`, { stdio: 'pipe' }).toString().trim();\n if (result) {\n const pids = result.split('\\n').filter((pid) => pid);\n console.log(chalk.cyan(` โโ Found ${pids.length} process(es) matching \"${pattern}\"`));\n\n pids.forEach((pid) => {\n try {\n // First try graceful termination\n execSync(`kill -TERM ${pid}`, { stdio: 'ignore' });\n console.log(chalk.cyan(` โโ Sent SIGTERM to process ${pid}`));\n } catch (_error) {\n // If graceful termination fails, force kill\n try {\n execSync(`kill -KILL ${pid}`, { stdio: 'ignore' });\n console.log(chalk.cyan(` โโ Force killed process ${pid}`));\n } catch (_killError) {\n console.log(chalk.gray(` โโ Process ${pid} already terminated`));\n }\n }\n });\n processStopped = true;\n break; // Stop after first successful pattern match\n }\n } catch (_error) {\n // This pattern didn't match any processes, continue to next pattern\n continue;\n }\n }\n }\n\n if (processStopped) {\n console.log(chalk.green(' โโ Local Node stopped successfully'));\n } else {\n console.log(chalk.gray(' โโ No running Local Node found'));\n }\n}\n\nexport function removeDirectory(dirPath: string): void {\n try {\n if (fs.existsSync(dirPath)) {\n console.log(chalk.yellow(`๐๏ธ Removing directory: ${dirPath}`));\n fs.rmSync(dirPath, { recursive: true, force: true });\n console.log(chalk.green(' โโ Directory removed successfully'));\n } else {\n console.log(chalk.gray(` โโ Directory ${dirPath} does not exist`));\n }\n } catch (error: any) {\n console.error(chalk.red(` โโ Error removing directory: ${error.message}`));\n }\n}\n\nfunction isSuiStartRunning(): boolean {\n try {\n if (process.platform === 'win32') {\n const result = execSync(`tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`).toString().trim();\n return result.toLowerCase().includes('sui.exe');\n } else {\n // Try multiple patterns to detect running sui processes\n const patterns = ['sui start', 'sui.*start', '^sui', 'sui.*--with-faucet'];\n\n for (const pattern of patterns) {\n try {\n const result = execSync(`pgrep -f \"${pattern}\"`, { stdio: 'pipe' }).toString().trim();\n if (result && result.length > 0) {\n return true;\n }\n } catch (_error) {\n continue;\n }\n }\n return false;\n }\n } catch (_error) {\n return false;\n }\n}\n\nasync function printAccounts() {\n // These private keys are used for testing purposes only, do not use them in production.\n const privateKeys = [\n 'suiprivkey1qq3ez3dje66l8pypgxynr7yymwps6uhn7vyczespj84974j3zya0wdpu76v',\n 'suiprivkey1qp6vcyg8r2x88fllmjmxtpzjl95gd9dugqrgz7xxf50w6rqdqzetg7x4d7s',\n 'suiprivkey1qpy3a696eh3m55fwa8h38ss063459u4n2dm9t24w2hlxxzjp2x34q8sdsnc',\n 'suiprivkey1qzxwp29favhzrjd95f6uj9nskjwal6nh9g509jpun395y6g72d6jqlmps4c',\n 'suiprivkey1qzhq4lv38sesah4uzsqkkmeyjx860xqjdz8qgw36tmrdd5tnle3evxpng57',\n 'suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c'\n ];\n console.log('๐Accounts');\n console.log('==========');\n privateKeys.forEach((privateKey, index) => {\n const dubhe = new Dubhe({ secretKey: privateKey });\n const keypair = dubhe.getSigner();\n spawn(\n 'curl',\n [\n '--location',\n '--request',\n 'POST',\n 'http://127.0.0.1:9123/gas',\n '--header',\n 'Content-Type: application/json',\n '--data-raw',\n `{\"FixedAmountRequest\": {\"recipient\": \"${keypair.toSuiAddress()}\"}}`\n ],\n {\n env: { ...process.env },\n stdio: 'ignore',\n detached: true\n }\n );\n console.log(` โโ Account #${index}: ${keypair.toSuiAddress()}(1000 SUI)`);\n console.log(` โโ Private Key: ${privateKey}`);\n });\n console.log('==========');\n console.log(\n chalk.yellow('โน๏ธ WARNING: These accounts, and their private keys, are publicly known.')\n );\n console.log(\n chalk.yellow('Any funds sent to them on Mainnet or any other live network WILL BE LOST.')\n );\n}\n\nfunction handleProcessSignals(suiProcess: ReturnType<typeof spawn> | null) {\n const cleanup = () => {\n console.log(chalk.yellow('\\n๐ Stopping Local Node...'));\n if (suiProcess) {\n suiProcess.kill('SIGINT');\n }\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n}\n\nexport async function startLocalNode(data_dir: string, force?: boolean) {\n if (force) {\n console.log(chalk.cyan('\\n๐ Force mode enabled'));\n stopLocalNode();\n console.log(chalk.yellow(' โโ Waiting for processes to terminate...'));\n await delay(3000); // Wait longer for process to fully stop\n removeDirectory(data_dir);\n console.log('');\n } else if (isSuiStartRunning()) {\n console.log(chalk.yellow('\\nโ ๏ธ Warning: Local Node Already Running'));\n console.log(chalk.yellow(' โโ Cannot start a new instance'));\n console.log(chalk.yellow(' โโ Please stop the existing process first'));\n return;\n }\n\n printDubhe();\n console.log('๐ Starting Local Node...');\n let suiProcess: ReturnType<typeof spawn> | null = null;\n try {\n const args = ['start', '--with-faucet'];\n if (force) {\n args.push('--force-regenesis');\n }\n args.push('--data-ingestion-dir', data_dir);\n\n suiProcess = spawn('sui', args, {\n env: { ...process.env, RUST_LOG: 'off,sui_node=info' },\n stdio: 'ignore'\n });\n\n suiProcess.on('error', (error) => {\n console.error(chalk.red('\\nโ Failed to Start Local Node'));\n console.error(chalk.red(` โโ Error: ${error.message}`));\n });\n await delay(5000);\n console.log(' โโ Faucet: Enabled');\n console.log(` โโ Force Regenesis: ${force ? 'Yes' : 'No'}`);\n console.log(' โโ RPC server: http://127.0.0.1:9000/');\n console.log(' โโ Faucet server: http://127.0.0.1:9123/');\n\n await printAccounts();\n\n await delay(2000);\n\n const privateKeyFormat = validatePrivateKey(\n 'suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c'\n );\n if (privateKeyFormat === false) {\n throw new DubheCliError(`Please check your privateKey.`);\n }\n\n console.log(chalk.green('๐ Local environment is ready!'));\n\n handleProcessSignals(suiProcess);\n\n await new Promise<void>((resolve) => {\n suiProcess?.on('exit', () => resolve());\n });\n } catch (error: any) {\n console.error(chalk.red('\\nโ Failed to Start Local Node'));\n console.error(chalk.red(` โโ Error: ${error.message}`));\n if (suiProcess) {\n suiProcess.kill('SIGINT');\n }\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\n\nexport function printDubhe() {\n console.log(\n chalk.yellow(`\nWelcome to Dubhe\n\\t\\t\\t --from team@obelisk\n ________ ___ ___ ________ ___ ___ _______ \n |\\\\ ___ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ __ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ ___ \\\\ \n \\\\ \\\\ \\\\_|\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ /\\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __/| \n \\\\ \\\\ \\\\ \\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __ \\\\ \\\\ __ \\\\ \\\\ \\\\_|/__ \n \\\\ \\\\ \\\\_\\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\_|\\\\ \\\\ \n \\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\__\\\\ \\\\__\\\\ \\\\_______\\\\\n \\\\|_______|\\\\|_______|\\\\|_______|\\\\|__|\\\\|__|\\\\|_______| \n \n`)\n );\n}\n","import { Dubhe, Transaction } from '@0xobelisk/sui-client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport {\n saveContractData,\n updateMoveTomlAddress,\n switchEnv,\n delay,\n getDubheDappHub,\n initializeDubhe,\n saveMetadata,\n getOriginalDubhePackageId,\n updatePublishedToml,\n updateEphemeralPubFile,\n getEphemeralPubFilePath,\n getPublishedTomlEntry,\n clearPublishedTomlEntry,\n restorePublishedTomlEntry\n} from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Temporarily add localnet to Move.toml [environments] section before building.\n * Sui CLI 1.40+ requires the active environment to be declared in Move.toml even\n * when --build-env is specified. This patches the file and returns the original\n * content so the caller can restore it in a finally block.\n * Returns null if no changes were needed.\n */\nfunction patchMoveTomlWithLocalnetEnv(moveTomlPath: string, chainId: string): string | null {\n if (!fs.existsSync(moveTomlPath)) return null;\n const content = fs.readFileSync(moveTomlPath, 'utf-8');\n\n if (content.includes('localnet')) {\n return null;\n }\n\n let updatedContent: string;\n if (content.includes('[environments]')) {\n updatedContent = content.replace('[environments]', `[environments]\\nlocalnet = \"${chainId}\"`);\n } else {\n updatedContent = content.trimEnd() + `\\n\\n[environments]\\nlocalnet = \"${chainId}\"\\n`;\n }\n\n fs.writeFileSync(moveTomlPath, updatedContent, 'utf-8');\n return content;\n}\n\nasync function removeEnvContent(\n filePath: string,\n networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): Promise<void> {\n if (!fs.existsSync(filePath)) {\n return;\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n const regex = new RegExp(`\\\\[env\\\\.${networkType}\\\\][\\\\s\\\\S]*?(?=\\\\[|$)`, 'g');\n const updatedContent = content.replace(regex, '');\n fs.writeFileSync(filePath, updatedContent, 'utf-8');\n}\n\ninterface EnvConfig {\n chainId: string;\n originalPublishedId: string;\n latestPublishedId: string;\n publishedVersion: number;\n}\n\nfunction updateEnvFile(\n filePath: string,\n networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n operation: 'publish' | 'upgrade',\n chainId: string,\n publishedId: string\n): void {\n const envFilePath = path.resolve(filePath);\n const envContent = fs.readFileSync(envFilePath, 'utf-8');\n const envLines = envContent.split('\\n');\n\n const networkSectionIndex = envLines.findIndex((line) => line.trim() === `[env.${networkType}]`);\n const config: EnvConfig = {\n chainId: chainId,\n originalPublishedId: '',\n latestPublishedId: '',\n publishedVersion: 0\n };\n\n if (networkSectionIndex === -1) {\n // If network section is not found, add a new section\n if (operation === 'publish') {\n config.originalPublishedId = publishedId;\n config.latestPublishedId = publishedId;\n config.publishedVersion = 1;\n } else {\n throw new Error(\n `Network type [env.${networkType}] not found in the file and cannot upgrade.`\n );\n }\n } else {\n for (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n const line = envLines[i].trim();\n if (line.startsWith('[')) break; // End of the current network section\n\n const [key, value] = line.split('=').map((part) => part.trim().replace(/\"/g, ''));\n switch (key) {\n case 'original-published-id':\n config.originalPublishedId = value;\n break;\n case 'latest-published-id':\n config.latestPublishedId = value;\n break;\n case 'published-version':\n config.publishedVersion = parseInt(value, 10);\n break;\n }\n }\n\n if (operation === 'publish') {\n config.originalPublishedId = publishedId;\n config.latestPublishedId = publishedId;\n config.publishedVersion = 1;\n } else if (operation === 'upgrade') {\n config.latestPublishedId = publishedId;\n config.publishedVersion += 1;\n }\n }\n\n const updatedSection = `\n[env.${networkType}]\nchain-id = \"${config.chainId}\"\noriginal-published-id = \"${config.originalPublishedId}\"\nlatest-published-id = \"${config.latestPublishedId}\"\npublished-version = \"${config.publishedVersion}\"\n`;\n\n const newEnvContent =\n networkSectionIndex === -1\n ? envContent + updatedSection\n : envLines.slice(0, networkSectionIndex).join('\\n') + updatedSection;\n\n fs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n}\n// function capitalizeAndRemoveUnderscores(input: string): string {\n// \treturn input\n// \t\t.split('_')\n// \t\t.map((word, index) => {\n// \t\t\treturn index === 0\n// \t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n// \t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n// \t\t})\n// \t\t.join('');\n// }\n//\n// function getLastSegment(input: string): string {\n// \tconst segments = input.split('::');\n// \treturn segments.length > 0 ? segments[segments.length - 1] : '';\n// }\n\n/**\n * Build a Move package and return [modules, dependencies] as base64 arrays.\n *\n * For localnet (ephemeral) networks:\n * - Uses --build-env testnet so dependency addresses are resolved via testnet\n * Published.toml (no need to add 'localnet' to Move.toml [environments]).\n * - Optionally reads a Pub.localnet.toml pubfile for already-published local deps.\n * - This matches the Sui docs approach:\n * https://docs.sui.io/guides/developer/packages/move-package-management\n *\n * For persistent networks (testnet/mainnet/devnet): uses -e <network> as before.\n */\nfunction buildContract(\n projectPath: string,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n pubfilePath?: string\n): string[][] {\n let modules: any, dependencies: any;\n try {\n let buildEnvFlag: string;\n if (network === 'localnet') {\n // Ephemeral approach: resolve deps via testnet configuration.\n // --pubfile-path supplies already-published local dep addresses (e.g. dubhe).\n buildEnvFlag = ' --build-env testnet';\n if (pubfilePath) {\n buildEnvFlag += ` --pubfile-path ${pubfilePath}`;\n }\n } else {\n buildEnvFlag = network ? ` -e ${network}` : '';\n }\n\n // --no-tree-shaking avoids on-chain RPC calls during build.\n const buildResult = JSON.parse(\n execSync(\n `sui move build --dump-bytecode-as-base64 --no-tree-shaking${buildEnvFlag} --path ${projectPath}`,\n {\n encoding: 'utf-8',\n stdio: 'pipe'\n }\n )\n );\n modules = buildResult.modules;\n dependencies = buildResult.dependencies;\n } catch (error: any) {\n console.error(chalk.red(' โโ Build failed'));\n console.error(error.stdout || error.stderr);\n throw new Error(`Build failed: ${error.stdout || error.stderr || error.message}`);\n }\n return [modules, dependencies];\n}\n\ninterface ObjectChange {\n type: string;\n objectType?: string;\n packageId?: string;\n objectId?: string;\n}\n\nasync function waitForNode(dubhe: Dubhe): Promise<string> {\n const chainId = await dubhe.suiInteractor.currentClient.getChainIdentifier();\n console.log(` โโ ChainId: ${chainId}`);\n const address = dubhe.getAddress();\n const coins = await dubhe.suiInteractor.currentClient.getCoins({\n owner: address,\n coinType: '0x2::sui::SUI'\n });\n\n if (coins.data.length > 0) {\n const balance = coins.data.reduce((sum, coin) => sum + Number(coin.balance), 0);\n if (balance > 0) {\n console.log(` โโ Deployer balance: ${balance / 10 ** 9} SUI`);\n return chainId;\n } else {\n console.log(\n chalk.yellow(\n ` โโ Deployer balance: 0 SUI, please ensure your account has sufficient SUI balance`\n )\n );\n }\n }\n return chainId;\n}\n\nasync function publishContract(\n dubhe: Dubhe,\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n projectPath: string,\n gasBudget?: number,\n force?: boolean\n) {\n console.log('\\n๐ Starting Contract Publication...');\n console.log(` โโ Project: ${projectPath}`);\n console.log(` โโ Network: ${network}`);\n console.log(' โโ Waiting for node...');\n\n const chainId = await waitForNode(dubhe);\n console.log(' โโ Validating Environment...');\n\n await removeEnvContent(`${projectPath}/Move.lock`, network);\n console.log(` โโ Account: ${dubhe.getAddress()}`);\n\n console.log('\\n๐ฆ Building Contract...');\n // For localnet: pass the ephemeral pubfile so the build system can resolve\n // the dubhe dependency that was just published in publishDubheFramework().\n const pubfilePath =\n network === 'localnet' ? getEphemeralPubFilePath(process.cwd(), network) : undefined;\n\n // So the build uses package address 0x0: for localnet always remove the contract's\n // Published.toml; for testnet/mainnet/devnet only when --force (clear current network entry).\n // Otherwise Sui CLI bakes the existing [published.<network>] address into the bytecode and\n // the chain rejects with PublishErrorNonZeroAddress.\n const contractPublishedTomlPath = `${projectPath}/Published.toml`;\n let savedContractPublishedToml: string | null = null;\n let savedContractPublishedEntry: {\n network: string;\n entry: Exclude<ReturnType<typeof getPublishedTomlEntry>, undefined>;\n } | null = null;\n if (network === 'localnet' && fs.existsSync(contractPublishedTomlPath)) {\n savedContractPublishedToml = fs.readFileSync(contractPublishedTomlPath, 'utf-8');\n fs.unlinkSync(contractPublishedTomlPath);\n } else if (force && (network === 'testnet' || network === 'mainnet' || network === 'devnet')) {\n const entry = getPublishedTomlEntry(projectPath, network);\n if (entry) {\n savedContractPublishedEntry = { network, entry };\n clearPublishedTomlEntry(projectPath, network);\n }\n }\n\n // For localnet: also temporarily remove dubhe's Published.toml when building the\n // contract package. After publishDubheFramework restores dubhe/Published.toml, its\n // testnet entry's original-id may be \"0x0\", which collides with the contract package's\n // own address (also 0x0 before publish), triggering a spurious cyclic-dependency error.\n const dubhePublishedTomlPath = path.join(path.dirname(projectPath), 'dubhe', 'Published.toml');\n let savedDubhePublishedToml: string | null = null;\n if (network === 'localnet' && fs.existsSync(dubhePublishedTomlPath)) {\n savedDubhePublishedToml = fs.readFileSync(dubhePublishedTomlPath, 'utf-8');\n fs.unlinkSync(dubhePublishedTomlPath);\n }\n\n // Sui CLI 1.40+ checks that the active environment is declared in Move.toml\n // even when --build-env is specified. Temporarily inject localnet into [environments]\n // for both the contract and its dubhe dependency.\n const contractMoveTomlPath = `${projectPath}/Move.toml`;\n const dubheMoveTomlPath = path.join(path.dirname(projectPath), 'dubhe', 'Move.toml');\n let savedContractMoveToml: string | null = null;\n let savedDubheMoveToml: string | null = null;\n if (network === 'localnet') {\n savedContractMoveToml = patchMoveTomlWithLocalnetEnv(contractMoveTomlPath, chainId);\n savedDubheMoveToml = patchMoveTomlWithLocalnetEnv(dubheMoveTomlPath, chainId);\n }\n\n let modules: any, dependencies: any;\n try {\n [modules, dependencies] = buildContract(projectPath, network, pubfilePath);\n } finally {\n if (savedContractPublishedToml !== null) {\n fs.writeFileSync(contractPublishedTomlPath, savedContractPublishedToml, 'utf-8');\n }\n if (savedContractPublishedEntry !== null) {\n restorePublishedTomlEntry(\n projectPath,\n savedContractPublishedEntry.network,\n savedContractPublishedEntry.entry\n );\n }\n if (savedDubhePublishedToml !== null) {\n fs.writeFileSync(dubhePublishedTomlPath, savedDubhePublishedToml, 'utf-8');\n }\n if (savedContractMoveToml !== null) {\n fs.writeFileSync(contractMoveTomlPath, savedContractMoveToml, 'utf-8');\n }\n if (savedDubheMoveToml !== null) {\n fs.writeFileSync(dubheMoveTomlPath, savedDubheMoveToml, 'utf-8');\n }\n }\n\n console.log('\\n๐ Publishing Contract...');\n const tx = new Transaction();\n if (gasBudget) {\n tx.setGasBudget(gasBudget);\n }\n const [upgradeCap] = tx.publish({ modules, dependencies });\n tx.transferObjects([upgradeCap], dubhe.getAddress());\n\n let result;\n try {\n result = await dubhe.signAndSendTxn({ tx });\n } catch (error: any) {\n console.error(chalk.red(' โโ Publication failed'));\n console.error(error.message);\n if (\n !force &&\n (network === 'testnet' || network === 'mainnet' || network === 'devnet') &&\n /PublishErrorNonZeroAddress/i.test(String(error?.message))\n ) {\n console.error(\n chalk.yellow(\n ' Tip: This package may already be published on this network. Use --force to clear the stored address and publish as new, or use \"dubhe upgrade\" to update the existing package.'\n )\n );\n }\n throw new Error(`Contract publication failed: ${error.message}`);\n }\n\n if (!result || result.effects?.status.status === 'failure') {\n throw new Error('Contract publication transaction failed');\n }\n\n console.log(' โโ Processing publication results...');\n let version = 1;\n let packageId = '';\n let dappHub = '';\n let resources = dubheConfig.resources;\n let enums = dubheConfig.enums;\n let upgradeCapId = '';\n let startCheckpoint = '';\n\n let printObjects: any[] = [];\n\n result.objectChanges!.map((object: ObjectChange) => {\n if (object.type === 'published') {\n console.log(` โโ Package ID: ${object.packageId}`);\n packageId = object.packageId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType === '0x2::package::UpgradeCap'\n ) {\n console.log(` โโ Upgrade Cap: ${object.objectId}`);\n upgradeCapId = object.objectId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType.includes('dapp_service::DappHub')\n ) {\n dappHub = object.objectId || '';\n }\n if (object.type === 'created') {\n printObjects.push(object);\n }\n });\n\n console.log(` โโ Transaction: ${result.digest}`);\n\n updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);\n updatePublishedToml(projectPath, network, chainId, packageId, packageId, 1);\n\n console.log('\\nโก Executing Deploy Hook...');\n await delay(5000);\n\n startCheckpoint = await dubhe.suiInteractor.currentClient.getLatestCheckpointSequenceNumber();\n\n const deployHookTx = new Transaction();\n let args = [];\n let dubheDappHub = dubheConfig.name === 'dubhe' ? dappHub : await getDubheDappHub(network);\n args.push(deployHookTx.object(dubheDappHub));\n args.push(deployHookTx.object('0x6'));\n deployHookTx.moveCall({\n target: `${packageId}::genesis::run`,\n arguments: args\n });\n\n let deployHookResult;\n try {\n deployHookResult = await dubhe.signAndSendTxn({ tx: deployHookTx });\n } catch (error: any) {\n console.error(chalk.red(' โโ Deploy hook execution failed'));\n console.error(error.message);\n throw new Error(`genesis::run failed: ${error.message}`);\n }\n\n if (deployHookResult.effects?.status.status === 'success') {\n console.log(' โโ Hook execution successful');\n console.log(` โโ Transaction: ${deployHookResult.digest}`);\n\n console.log('\\n๐ Created Objects:');\n printObjects.map((object: ObjectChange) => {\n console.log(` โโ ID: ${object.objectId}`);\n console.log(` โโ Type: ${object.objectType}`);\n });\n\n await saveContractData(\n dubheConfig.name,\n network,\n startCheckpoint,\n packageId,\n dubheDappHub,\n upgradeCapId,\n version,\n resources,\n enums\n );\n\n await saveMetadata(dubheConfig.name, network, packageId);\n\n // Insert package id to dubhe config\n let config = JSON.parse(fs.readFileSync(`${process.cwd()}/dubhe.config.json`, 'utf-8'));\n config.original_package_id = packageId;\n config.dubhe_object_id = dubheDappHub;\n config.original_dubhe_package_id = await getOriginalDubhePackageId(network);\n config.start_checkpoint = startCheckpoint;\n\n fs.writeFileSync(`${process.cwd()}/dubhe.config.json`, JSON.stringify(config, null, 2));\n\n console.log('\\nโ
Contract Publication Complete\\n');\n } else {\n throw new Error(`genesis::run transaction failed. Digest: ${deployHookResult.digest}`);\n }\n}\n\nasync function checkDubheFramework(projectPath: string): Promise<boolean> {\n if (!fs.existsSync(projectPath)) {\n console.log(chalk.yellow('\\nโน๏ธ Dubhe Framework Files Not Found'));\n console.log(chalk.yellow(' โโ Expected Path:'), projectPath);\n console.log(chalk.yellow(' โโ To set up Dubhe Framework:'));\n console.log(chalk.yellow(' โ 1. Create directory: mkdir -p contracts/dubhe'));\n console.log(\n chalk.yellow(\n ' โ 2. Clone repository: git clone https://github.com/0xobelisk/dubhe contracts/dubhe'\n )\n );\n console.log(chalk.yellow(' โ 3. Or download from: https://github.com/0xobelisk/dubhe'));\n console.log(chalk.yellow(' โโ After setup, restart the local node'));\n return false;\n }\n return true;\n}\n\nexport async function publishDubheFramework(\n dubhe: Dubhe,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n const cwd = process.cwd();\n const projectPath = `${cwd}/src/dubhe`;\n\n if (!(await checkDubheFramework(projectPath))) {\n return;\n }\n\n console.log('\\n๐ Starting Dubhe Framework Publication...');\n console.log(' โโ Waiting for node...');\n\n const chainId = await waitForNode(dubhe);\n\n await removeEnvContent(`${projectPath}/Move.lock`, network);\n if (network === 'localnet') {\n // When building with --build-env testnet, Sui CLI reads Move.lock's [env.testnet] section\n // and bakes its original-published-id (non-zero for a previously published dubhe) into the\n // bytecode as the package self-address. Publishing then fails with PublishErrorNonZeroAddress\n // because Sui requires the self-address to be 0x0 for a first-time publish.\n // Fix: clear the testnet env section before building so the CLI uses 0x0 from Move.toml.\n await removeEnvContent(`${projectPath}/Move.lock`, 'testnet');\n }\n await updateMoveTomlAddress(projectPath, '0x0');\n\n const startCheckpoint =\n await dubhe.suiInteractor.currentClient.getLatestCheckpointSequenceNumber();\n\n // For localnet: --build-env testnet is used to resolve git dependencies, but the\n // Move CLI will also read Published.toml and use any existing testnet address for\n // dubhe โ causing PublishErrorNonZeroAddress if a testnet entry already exists.\n // Fix: temporarily remove Published.toml before the build, then restore it.\n // This ensures the dubhe package compiles with address 0x0 (from Move.toml).\n const publishedTomlPath = `${projectPath}/Published.toml`;\n let savedPublishedTomlContent: string | null = null;\n if (network === 'localnet' && fs.existsSync(publishedTomlPath)) {\n savedPublishedTomlContent = fs.readFileSync(publishedTomlPath, 'utf-8');\n fs.unlinkSync(publishedTomlPath);\n }\n\n // Sui CLI 1.40+ checks that the active environment is declared in Move.toml\n // even when --build-env is specified. Temporarily inject localnet into [environments].\n const moveTomlPath = `${projectPath}/Move.toml`;\n let savedMoveTomlContent: string | null = null;\n if (network === 'localnet') {\n savedMoveTomlContent = patchMoveTomlWithLocalnetEnv(moveTomlPath, chainId);\n }\n\n let modules: any, dependencies: any;\n try {\n // For localnet: use --build-env testnet (no pubfile needed โ dubhe has no local deps).\n // For testnet/mainnet: use -e <network> as usual.\n [modules, dependencies] = buildContract(projectPath, network);\n } finally {\n // Always restore Published.toml and Move.toml (successful build or error)\n if (savedPublishedTomlContent !== null) {\n fs.writeFileSync(publishedTomlPath, savedPublishedTomlContent, 'utf-8');\n }\n if (savedMoveTomlContent !== null) {\n fs.writeFileSync(moveTomlPath, savedMoveTomlContent, 'utf-8');\n }\n }\n\n const tx = new Transaction();\n const [upgradeCap] = tx.publish({ modules, dependencies });\n tx.transferObjects([upgradeCap], dubhe.getAddress());\n\n let result;\n try {\n result = await dubhe.signAndSendTxn({ tx });\n } catch (error: any) {\n console.error(chalk.red(' โโ Publication failed'));\n console.error(error.message);\n throw new Error(`Dubhe framework publication failed: ${error.message}`);\n }\n\n if (!result || result.effects?.status.status === 'failure') {\n throw new Error('Dubhe framework publication transaction failed');\n }\n\n let version = 1;\n let packageId = '';\n let dappHub = '';\n let upgradeCapId = '';\n\n result.objectChanges!.map((object: ObjectChange) => {\n if (object.type === 'published') {\n packageId = object.packageId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType === '0x2::package::UpgradeCap'\n ) {\n upgradeCapId = object.objectId || '';\n }\n if (\n object.type === 'created' &&\n object.objectType &&\n object.objectType.includes('dapp_service::DappHub')\n ) {\n dappHub = object.objectId || '';\n }\n });\n\n await delay(3000);\n const deployHookTx = new Transaction();\n deployHookTx.moveCall({\n target: `${packageId}::genesis::run`,\n arguments: [deployHookTx.object(dappHub), deployHookTx.object('0x6')]\n });\n\n let deployHookResult;\n try {\n deployHookResult = await dubhe.signAndSendTxn({ tx: deployHookTx });\n } catch (error: any) {\n console.error(chalk.red(' โโ Deploy hook execution failed'));\n console.error(error.message);\n throw new Error(`Dubhe genesis::run failed: ${error.message}`);\n }\n\n if (deployHookResult.effects?.status.status !== 'success') {\n throw new Error('Deploy hook execution failed');\n }\n\n await updateMoveTomlAddress(projectPath, packageId);\n await saveContractData(\n 'dubhe',\n network,\n startCheckpoint,\n packageId,\n dappHub,\n upgradeCapId,\n version,\n {},\n {}\n );\n\n updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);\n updatePublishedToml(projectPath, network, chainId, packageId, packageId, 1);\n\n // For localnet: write dubhe's published address to Pub.localnet.toml so that\n // the counter package build (next step) can resolve the dubhe dependency.\n if (network === 'localnet') {\n const pubfilePath = getEphemeralPubFilePath(cwd, network);\n updateEphemeralPubFile(pubfilePath, chainId, 'testnet', {\n source: projectPath,\n publishedAt: packageId,\n originalId: packageId,\n upgradeCap: upgradeCapId\n });\n }\n}\n\nexport async function publishHandler(\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n force: boolean,\n gasBudget?: number\n) {\n await switchEnv(network);\n\n const dubhe = initializeDubhe({\n network\n });\n\n const path = process.cwd();\n const projectPath = `${path}/src/${dubheConfig.name}`;\n\n if (network === 'localnet' && dubheConfig.name !== 'dubhe') {\n await publishDubheFramework(dubhe, network);\n }\n\n await publishContract(dubhe, dubheConfig, network, projectPath, gasBudget, force);\n}\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname, join as pathJoin } from 'path';\nimport { SUI_PRIVATE_KEY_PREFIX } from '@mysten/sui/cryptography';\nimport { FsIibError } from './errors';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\nimport { Dubhe, NetworkType, SuiMoveNormalizedModules, loadMetadata } from '@0xobelisk/sui-client';\nimport { DubheCliError } from './errors';\nimport { Component, MoveType, DubheConfig } from '@0xobelisk/sui-common';\nimport { TESTNET_DUBHE_HUB_OBJECT_ID, TESTNET_ORIGINAL_DUBHE_PACKAGE_ID } from './constants';\n\nexport type DeploymentJsonType = {\n projectName: string;\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n startCheckpoint: string;\n packageId: string;\n dappHub: string;\n upgradeCap: string;\n version: number;\n resources: Record<string, Component | MoveType>;\n enums?: Record<string, string[]>;\n};\n\nexport function validatePrivateKey(privateKey: string): false | string {\n if (privateKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {\n if (privateKey.length === 70) {\n return privateKey;\n } else {\n return false;\n }\n } else if (privateKey.startsWith('0x')) {\n const strippedPrivateKey = privateKey.slice(2);\n if (strippedPrivateKey.length === 64) {\n return strippedPrivateKey;\n } else {\n return false;\n }\n } else {\n if (privateKey.length === 64) {\n return privateKey;\n } else {\n return false;\n }\n }\n}\n\nexport async function updateVersionInFile(projectPath: string, newVersion: string) {\n try {\n const filePath = `${projectPath}/sources/script/migrate.move`;\n const data = await fsAsync.readFile(filePath, 'utf8');\n\n // update version data\n const updatedData = data.replace(\n /const VERSION: u64 = \\d+;/,\n `const VERSION: u64 = ${newVersion};`\n );\n\n // write new version\n writeOutput(updatedData, filePath, 'Update package version');\n } catch {\n throw new FsIibError('Fs update version failed.');\n }\n}\n\nexport async function getDeploymentJson(\n projectPath: string,\n network: string\n): Promise<DeploymentJsonType> {\n try {\n const data = await fsAsync.readFile(\n `${projectPath}/.history/sui_${network}/latest.json`,\n 'utf8'\n );\n return JSON.parse(data) as DeploymentJsonType;\n } catch (error) {\n throw new Error(`read .history/sui_${network}/latest.json failed. ${error}`);\n }\n}\n\nexport async function getDeploymentDappHub(projectPath: string, network: string): Promise<string> {\n try {\n const data = await fsAsync.readFile(\n `${projectPath}/.history/sui_${network}/latest.json`,\n 'utf8'\n );\n const deployment = JSON.parse(data) as DeploymentJsonType;\n return deployment.dappHub;\n } catch (_error) {\n return '';\n }\n}\n\nexport async function getDubheDappHub(network: string) {\n const path = process.cwd();\n const contractPath = `${path}/src/dubhe`;\n\n switch (network) {\n case 'mainnet':\n return TESTNET_DUBHE_HUB_OBJECT_ID;\n case 'testnet':\n return TESTNET_DUBHE_HUB_OBJECT_ID;\n case 'devnet':\n return TESTNET_DUBHE_HUB_OBJECT_ID;\n case 'localnet':\n return await getDeploymentDappHub(contractPath, 'localnet');\n default:\n throw new Error(`Invalid network: ${network}`);\n }\n}\n\nexport async function getOriginalDubhePackageId(network: string) {\n const path = process.cwd();\n const contractPath = `${path}/src/dubhe`;\n\n switch (network) {\n case 'mainnet':\n return TESTNET_ORIGINAL_DUBHE_PACKAGE_ID;\n case 'testnet':\n return TESTNET_ORIGINAL_DUBHE_PACKAGE_ID;\n case 'devnet':\n return TESTNET_ORIGINAL_DUBHE_PACKAGE_ID;\n case 'localnet':\n return await getOldPackageId(contractPath, network);\n default:\n throw new Error(`Invalid network: ${network}`);\n }\n}\nexport async function getOnchainResources(\n projectPath: string,\n network: string\n): Promise<Record<string, Component | MoveType>> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.resources;\n}\n\nexport async function getVersion(projectPath: string, network: string): Promise<number> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.version;\n}\n\nexport async function getNetwork(\n projectPath: string,\n network: string\n): Promise<'mainnet' | 'testnet' | 'devnet' | 'localnet'> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.network;\n}\n\nexport async function getOldPackageId(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.packageId;\n}\n\nexport async function getDappHub(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.dappHub;\n}\n\nexport async function getUpgradeCap(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.upgradeCap;\n}\n\nexport async function getStartCheckpoint(projectPath: string, network: string): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.startCheckpoint;\n}\n\nexport async function saveContractData(\n projectName: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n startCheckpoint: string,\n packageId: string,\n dappHub: string,\n upgradeCap: string,\n version: number,\n resources: Record<string, Component | MoveType>,\n enums?: Record<string, string[]>\n) {\n const DeploymentData: DeploymentJsonType = {\n projectName,\n network,\n startCheckpoint,\n packageId,\n dappHub,\n upgradeCap,\n version,\n resources,\n enums\n };\n\n const path = process.cwd();\n const storeDeploymentData = JSON.stringify(DeploymentData, null, 2);\n await writeOutput(\n storeDeploymentData,\n `${path}/src/${projectName}/.history/sui_${network}/latest.json`,\n 'Update deploy log'\n );\n}\n\nexport async function saveMetadata(\n projectName: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n packageId: string\n) {\n const path = process.cwd();\n\n // Save metadata files\n try {\n const metadata = await loadMetadata(network, packageId);\n if (metadata) {\n const metadataJson = JSON.stringify(metadata, null, 2);\n\n // Save packageId-specific metadata file\n await writeOutput(\n metadataJson,\n `${path}/src/${projectName}/.history/sui_${network}/${packageId}.json`,\n 'Save package metadata'\n );\n\n // Save latest metadata.json\n await writeOutput(metadataJson, `${path}/metadata.json`, 'Save latest metadata');\n }\n } catch (error) {\n console.warn(chalk.yellow(`Warning: Failed to save metadata: ${error}`));\n }\n}\n\nexport async function writeOutput(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, output);\n if (logPrefix !== undefined) {\n console.log(`${logPrefix}: ${fullOutputPath}`);\n }\n}\n\nexport async function updateDubheDependency(\n filePath: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n // With the new --build-env mechanism, we keep Dubhe as local dependency for all networks.\n // The Published.toml in ../dubhe resolves the correct on-chain address per environment.\n // This function is kept for backward compatibility but is a no-op for non-localnet.\n if (network === 'localnet') {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const localDependency = 'Dubhe = { local = \"../dubhe\" }';\n if (!fileContent.includes(localDependency)) {\n const updatedContent = fileContent.replace(/Dubhe = \\{[^}]*\\}/, localDependency);\n fs.writeFileSync(filePath, updatedContent, 'utf-8');\n console.log(`Ensured local Dubhe dependency in ${filePath} for localnet.`);\n }\n }\n}\n\n// Published.toml management for the new Sui CLI (v1.44+) publishing mechanism.\n// Published.toml tracks on-chain package addresses per environment.\n// It SHOULD be committed to source control.\n\ninterface PublishedEntry {\n chainId: string;\n publishedAt: string;\n originalId: string;\n version: number;\n}\n\nexport function readPublishedToml(packagePath: string): Record<string, PublishedEntry> {\n const filePath = pathJoin(packagePath, 'Published.toml');\n if (!fs.existsSync(filePath)) {\n return {};\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n const result: Record<string, PublishedEntry> = {};\n\n const sectionRegex = /\\[published\\.(\\w+)\\]([\\s\\S]*?)(?=\\[published\\.|$)/g;\n let match;\n while ((match = sectionRegex.exec(content)) !== null) {\n const env = match[1];\n const body = match[2];\n const getValue = (key: string) => {\n const m = body.match(new RegExp(`${key}\\\\s*=\\\\s*\"([^\"]*)\"`));\n return m ? m[1] : '';\n };\n const versionMatch = body.match(/version\\s*=\\s*(\\d+)/);\n result[env] = {\n chainId: getValue('chain-id'),\n publishedAt: getValue('published-at'),\n originalId: getValue('original-id'),\n version: versionMatch ? parseInt(versionMatch[1], 10) : 1\n };\n }\n return result;\n}\n\nexport function writePublishedToml(\n packagePath: string,\n entries: Record<string, PublishedEntry>\n): void {\n const filePath = pathJoin(packagePath, 'Published.toml');\n let content =\n '# Generated by Move\\n' +\n '# This file contains metadata about published versions of this package in different environments\\n' +\n '# This file SHOULD be committed to source control\\n';\n\n for (const [env, entry] of Object.entries(entries)) {\n content += `\\n[published.${env}]\\n`;\n content += `chain-id = \"${entry.chainId}\"\\n`;\n content += `published-at = \"${entry.publishedAt}\"\\n`;\n content += `original-id = \"${entry.originalId}\"\\n`;\n content += `version = ${entry.version}\\n`;\n }\n\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\nexport function updatePublishedToml(\n packagePath: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n chainId: string,\n packageId: string,\n originalId?: string,\n version?: number\n): void {\n const entries = readPublishedToml(packagePath);\n const existing = entries[network];\n\n entries[network] = {\n chainId,\n publishedAt: packageId,\n originalId: originalId ?? existing?.originalId ?? packageId,\n version: version ?? (existing ? existing.version + 1 : 1)\n };\n\n writePublishedToml(packagePath, entries);\n console.log(`Updated Published.toml in ${packagePath} for ${network}.`);\n}\n\nexport function getPublishedTomlEntry(\n packagePath: string,\n network: string\n): PublishedEntry | undefined {\n const entries = readPublishedToml(packagePath);\n return entries[network];\n}\n\nexport function clearPublishedTomlEntry(\n packagePath: string,\n network: string\n): PublishedEntry | undefined {\n const entries = readPublishedToml(packagePath);\n const existing = entries[network];\n if (!existing) return undefined;\n\n entries[network] = {\n ...existing,\n publishedAt: '0x0000000000000000000000000000000000000000000000000000000000000000',\n originalId: '0x0000000000000000000000000000000000000000000000000000000000000000'\n };\n writePublishedToml(packagePath, entries);\n return existing;\n}\n\nexport function restorePublishedTomlEntry(\n packagePath: string,\n network: string,\n entry: PublishedEntry\n): void {\n const entries = readPublishedToml(packagePath);\n entries[network] = entry;\n writePublishedToml(packagePath, entries);\n}\n\n// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n// Ephemeral publication file (Pub.<env>.toml)\n//\n// Per the Sui package management docs (v1.63+), localnet / devnet deployments\n// should use ephemeral publication files rather than the shared Published.toml.\n// The ephemeral file holds the localnet addresses so that subsequent builds\n// (e.g. for upgrades) can resolve local dependencies correctly.\n//\n// Reference: https://docs.sui.io/guides/developer/packages/move-package-management\n// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nexport interface EphemeralPubEntry {\n /** Absolute path to the package source directory */\n source: string;\n /** Current on-chain address of the package */\n publishedAt: string;\n /** Address of the first published version (same as publishedAt for v1) */\n originalId: string;\n /** Object ID of the upgrade capability */\n upgradeCap: string;\n /** Package version (required by Sui CLI parser) */\n version?: number;\n}\n\n/**\n * Return the canonical path for the ephemeral publication file.\n * For localnet this is <contractsDir>/Pub.localnet.toml.\n */\nexport function getEphemeralPubFilePath(contractsDir: string, network: string): string {\n return pathJoin(contractsDir, `Pub.${network}.toml`);\n}\n\n/**\n * Update (or create) an entry in the ephemeral publication file.\n * Preserves existing entries for other packages.\n */\nexport function updateEphemeralPubFile(\n pubfilePath: string,\n chainId: string,\n buildEnv: string,\n entry: EphemeralPubEntry\n): void {\n const existing: EphemeralPubEntry[] = [];\n // Always use the provided buildEnv and chainId parameters.\n // The chainId passed in comes from the live network and is authoritative.\n const currentBuildEnv = buildEnv;\n const currentChainId = chainId;\n\n if (fs.existsSync(pubfilePath)) {\n const content = fs.readFileSync(pubfilePath, 'utf-8');\n\n // Check if the file was written for a different chain (e.g. previous localnet run).\n // If chain-id changed, discard all existing entries โ they belong to a dead chain.\n const chainIdMatch = content.match(/^chain-id\\s*=\\s*\"([^\"]*)\"/m);\n const fileChainId = chainIdMatch ? chainIdMatch[1] : '';\n const chainChanged = fileChainId !== '' && fileChainId !== chainId;\n\n if (!chainChanged) {\n // Same chain: parse existing [[published]] blocks and preserve them.\n // source field is an inline table: source = { local = \"...\" }\n const blockRegex = /\\[\\[published\\]\\]([\\s\\S]*?)(?=\\[\\[published\\]\\]|$)/g;\n let blockMatch;\n while ((blockMatch = blockRegex.exec(content)) !== null) {\n const block = blockMatch[1];\n const get = (key: string) => {\n const m = block.match(new RegExp(`^${key}\\\\s*=\\\\s*\"([^\"]*)\"`, 'm'));\n return m ? m[1] : '';\n };\n // source = { local = \"/path/to/package\" }\n const srcMatch = block.match(/^source\\s*=\\s*\\{\\s*local\\s*=\\s*\"([^\"]*)\"\\s*\\}/m);\n const src = srcMatch ? srcMatch[1] : '';\n if (src) {\n existing.push({\n source: src,\n publishedAt: get('published-at'),\n originalId: get('original-id'),\n upgradeCap: get('upgrade-cap')\n });\n }\n }\n } else {\n console.log(` Pub file chain-id changed (${fileChainId} โ ${chainId}), resetting entries.`);\n }\n }\n\n // Update override or add the entry\n const idx = existing.findIndex((e) => e.source === entry.source);\n if (idx >= 0) {\n existing[idx] = entry;\n } else {\n existing.push(entry);\n }\n\n // Write the file\n let content =\n '# generated by dubhe cli\\n' +\n '# this file contains metadata from ephemeral publications\\n' +\n '# this file should NOT be committed to source control\\n\\n';\n content += `build-env = \"${currentBuildEnv}\"\\n`;\n content += `chain-id = \"${currentChainId}\"\\n`;\n\n for (const e of existing) {\n content += '\\n[[published]]\\n';\n // source must be a LocalDepInfo struct (not a plain string)\n content += `source = { local = \"${e.source}\" }\\n`;\n content += `published-at = \"${e.publishedAt}\"\\n`;\n content += `original-id = \"${e.originalId}\"\\n`;\n content += `upgrade-cap = \"${e.upgradeCap}\"\\n`;\n // version is required by Sui CLI parser (even though docs omit it)\n content += `version = 1\\n`;\n }\n\n fs.writeFileSync(pubfilePath, content, 'utf-8');\n console.log(\n ` Updated ${pathJoin(pubfilePath.split('/').slice(-1)[0])} for ${\n entry.source.split('/').slice(-1)[0]\n }.`\n );\n}\n\nasync function checkRpcAvailability(rpcUrl: string): Promise<boolean> {\n try {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'sui_getLatestCheckpointSequenceNumber',\n params: []\n })\n });\n\n if (!response.ok) {\n return false;\n }\n\n const data = await response.json();\n return !data.error;\n } catch (_error) {\n return false;\n }\n}\n\nexport async function addEnv(\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): Promise<void> {\n const rpcMap = {\n localnet: 'http://127.0.0.1:9000',\n devnet: 'https://fullnode.devnet.sui.io:443/',\n testnet: 'https://fullnode.testnet.sui.io:443/',\n mainnet: 'https://fullnode.mainnet.sui.io:443/'\n };\n\n const rpcUrl = rpcMap[network];\n\n // Check RPC availability first\n const isRpcAvailable = await checkRpcAvailability(rpcUrl);\n if (!isRpcAvailable) {\n throw new Error(\n `RPC endpoint ${rpcUrl} is not available. Please check your network connection or try again later.`\n );\n }\n\n return new Promise<void>((resolve, reject) => {\n let errorOutput = '';\n let stdoutOutput = '';\n\n const suiProcess = spawn(\n 'sui',\n ['client', 'new-env', '--alias', network, '--rpc', rpcMap[network]],\n {\n env: { ...process.env },\n stdio: 'pipe'\n }\n );\n\n // Capture standard output\n suiProcess.stdout.on('data', (data) => {\n stdoutOutput += data.toString();\n });\n\n // Capture error output\n suiProcess.stderr.on('data', (data) => {\n errorOutput += data.toString();\n });\n\n // Handle process errors (e.g., command not found)\n suiProcess.on('error', (error) => {\n console.error(chalk.red(`\\nโ Failed to execute sui command: ${error.message}`));\n reject(new Error(`Failed to execute sui command: ${error.message}`));\n });\n\n // Handle process exit\n suiProcess.on('exit', (code, signal) => {\n // Check if \"already exists\" message is present\n if (errorOutput.includes('already exists') || stdoutOutput.includes('already exists')) {\n console.log(chalk.yellow(`Environment ${network} already exists, proceeding...`));\n resolve();\n return;\n }\n\n if (code === 0) {\n console.log(chalk.green(`Successfully added environment ${network}`));\n resolve();\n } else {\n let finalError: string;\n if (code === null) {\n // Process was killed by a signal\n finalError =\n errorOutput ||\n stdoutOutput ||\n `Process was terminated by signal ${signal || 'unknown'}`;\n } else {\n finalError = errorOutput || stdoutOutput || `Process exited with code ${code}`;\n }\n console.error(chalk.red(`\\nโ Failed to add environment ${network}`));\n console.error(chalk.red(` โโ ${finalError.trim()}`));\n reject(new Error(finalError));\n }\n });\n });\n}\n\nexport type NetworkAlias = 'testnet' | 'mainnet' | 'devnet' | 'localnet';\n\nexport interface Endpoint {\n alias: NetworkAlias;\n rpc: string;\n ws: string | null;\n basic_auth: { username: string; password: string } | null;\n}\n\n// mainly is a tuple of [endpoint list, current active alias]\nexport type ConfigTuple = [Endpoint[], NetworkAlias];\n\nexport async function envsJSON(): Promise<ConfigTuple> {\n try {\n return new Promise<ConfigTuple>((resolve, reject) => {\n let errorOutput = '';\n let stdoutOutput = '';\n\n const suiProcess = spawn('sui', ['client', 'envs', '--json'], {\n env: { ...process.env },\n stdio: 'pipe'\n });\n\n suiProcess.stdout.on('data', (data) => {\n stdoutOutput += data.toString();\n });\n\n suiProcess.stderr.on('data', (data) => {\n errorOutput += data.toString();\n });\n\n suiProcess.on('error', (error) => {\n console.error(chalk.red(`\\nโ Failed to execute sui command: ${error.message}`));\n reject(new Error(`Failed to execute sui command: ${error.message}`));\n });\n\n suiProcess.on('exit', (code, signal) => {\n if (code === 0) {\n resolve(JSON.parse(stdoutOutput) as ConfigTuple);\n } else {\n let finalError: string;\n if (code === null) {\n // Process was killed by a signal\n finalError =\n errorOutput ||\n stdoutOutput ||\n `Process was terminated by signal ${signal || 'unknown'}`;\n } else {\n finalError = errorOutput || stdoutOutput || `Process exited with code ${code}`;\n }\n console.error(chalk.red(`\\nโ Failed to get envs`));\n console.error(chalk.red(` โโ ${finalError.trim()}`));\n reject(new Error(finalError));\n }\n });\n });\n } catch (error) {\n // Re-throw the error for the caller to handle\n throw error;\n }\n}\n\nexport async function getDefaultNetwork(): Promise<NetworkAlias> {\n const [_, currentAlias] = await envsJSON();\n return currentAlias as NetworkAlias;\n}\n\nexport async function switchEnv(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {\n try {\n // First, try to add the environment\n await addEnv(network);\n\n // Then switch to the specified environment\n return new Promise<void>((resolve, reject) => {\n let errorOutput = '';\n let stdoutOutput = '';\n\n const suiProcess = spawn('sui', ['client', 'switch', '--env', network], {\n env: { ...process.env },\n stdio: 'pipe'\n });\n\n suiProcess.stdout.on('data', (data) => {\n stdoutOutput += data.toString();\n });\n\n suiProcess.stderr.on('data', (data) => {\n errorOutput += data.toString();\n });\n\n suiProcess.on('error', (error) => {\n console.error(chalk.red(`\\nโ Failed to execute sui command: ${error.message}`));\n reject(new Error(`Failed to execute sui command: ${error.message}`));\n });\n\n suiProcess.on('exit', (code, signal) => {\n if (code === 0) {\n console.log(chalk.green(`Successfully switched to environment ${network}`));\n resolve();\n } else {\n let finalError: string;\n if (code === null) {\n // Process was killed by a signal\n finalError =\n errorOutput ||\n stdoutOutput ||\n `Process was terminated by signal ${signal || 'unknown'}`;\n } else {\n finalError = errorOutput || stdoutOutput || `Process exited with code ${code}`;\n }\n console.error(chalk.red(`\\nโ Failed to switch to environment ${network}`));\n console.error(chalk.red(` โโ ${finalError.trim()}`));\n reject(new Error(finalError));\n }\n });\n });\n } catch (error) {\n // Re-throw the error for the caller to handle\n throw error;\n }\n}\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function loadKey(): string {\n const privateKey = process.env.PRIVATE_KEY || process.env.NEXT_PUBLIC_PRIVATE_KEY;\n if (!privateKey) {\n throw new DubheCliError(\n `Missing private key environment variable.\n Run 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\n or 'echo \"NEXT_PUBLIC_PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\n in your contracts directory to use the default sui private key.`\n );\n }\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new DubheCliError(`Please check your privateKey.`);\n }\n return privateKeyFormat;\n}\n\nexport function initializeDubhe({\n network,\n packageId,\n metadata\n}: {\n network: NetworkType;\n packageId?: string;\n metadata?: SuiMoveNormalizedModules;\n}): Dubhe {\n const privateKey = loadKey();\n return new Dubhe({\n networkType: network,\n secretKey: privateKey,\n packageId,\n metadata\n });\n}\n\nexport function generateConfigJson(config: DubheConfig): string {\n const resources = Object.entries(config.resources).map(([name, resource]) => {\n // Simple type shorthand (e.g., counter1: 'u32') โ entity-keyed by account (entity_id: String).\n if (typeof resource === 'string') {\n return {\n [name]: {\n fields: [{ entity_id: 'String' }, { value: resource }],\n keys: ['entity_id'],\n offchain: false\n }\n };\n }\n\n // Empty resource object โ only the implicit entity key.\n if (Object.keys(resource as object).length === 0) {\n return {\n [name]: {\n fields: [{ entity_id: 'String' }],\n keys: ['entity_id'],\n offchain: false\n }\n };\n }\n\n const fields = (resource as any).fields || {};\n const keys = (resource as any).keys || [];\n const offchain = (resource as any).offchain ?? false;\n\n // Full Component format with no explicit keys: auto-inject 'entity_id: String'.\n if (keys.length === 0) {\n const fieldEntries = Object.entries(fields);\n const orderedFields: [string, unknown][] = [['entity_id', 'String'], ...fieldEntries];\n return {\n [name]: {\n fields: orderedFields.map(([fieldName, fieldType]) => ({\n [fieldName]: fieldType\n })),\n keys: ['entity_id'],\n offchain: offchain\n }\n };\n }\n\n // Full Component format with explicit custom keys: inject 'entity_id: String' as the first\n // field and first key so that key_tuple[0] (the BCS-encoded account injected by the indexer)\n // maps correctly, followed by the user-defined keys.\n const fieldEntries = Object.entries(fields);\n const orderedFields: [string, unknown][] = [['entity_id', 'String'], ...fieldEntries];\n return {\n [name]: {\n fields: orderedFields.map(([fieldName, fieldType]) => ({\n [fieldName]: fieldType\n })),\n keys: ['entity_id', ...keys],\n offchain: offchain\n }\n };\n });\n\n // Auto-append Dubhe framework fee state resource (entity-keyed by account string).\n if (!resources.some((resource) => 'dapp_fee_state' in resource)) {\n resources.push({\n dapp_fee_state: {\n fields: [\n { entity_id: 'String' },\n { base_fee: 'u256' },\n { byte_fee: 'u256' },\n { free_credit: 'u256' },\n { total_bytes_size: 'u256' },\n { total_recharged: 'u256' },\n { total_paid: 'u256' }\n ],\n keys: ['entity_id'],\n offchain: false\n }\n });\n }\n\n // handle enums\n const enums = Object.entries(config.enums || {}).map(([name, enumFields]) => {\n // Sort enum values by first letter\n const sortedFields = enumFields.sort((a, b) => a.localeCompare(b)).map((value) => value);\n\n return {\n [name]: sortedFields\n };\n });\n\n return JSON.stringify(\n {\n resources,\n enums\n },\n null,\n 2\n );\n}\n\n/**\n * Updates the dubhe address and published-at in Move.toml file\n * @param path - Directory path containing Move.toml file\n * @param packageAddress - New dubhe package address to set\n *\n * Logic:\n * - If packageAddress is \"0x0\": only set dubhe = \"0x0\", remove published-at line\n * - Otherwise: set both dubhe and published-at to packageAddress\n */\nexport function updateMoveTomlAddress(path: string, packageAddress: string) {\n const moveTomlPath = `${path}/Move.toml`;\n const moveTomlContent = fs.readFileSync(moveTomlPath, 'utf-8');\n\n let updatedContent = moveTomlContent;\n\n if (packageAddress === '0x0') {\n // Case 1: Address is \"0x0\" - set dubhe to \"0x0\" and remove published-at line\n updatedContent = updatedContent.replace(/dubhe\\s*=\\s*\"[^\"]*\"/, `dubhe = \"0x0\"`);\n\n // Remove published-at line (including the line break)\n updatedContent = updatedContent.replace(/published-at\\s*=\\s*\"[^\"]*\"\\r?\\n?/, '');\n } else {\n // Case 2: Address is not \"0x0\" - set both dubhe and published-at\n updatedContent = updatedContent.replace(/dubhe\\s*=\\s*\"[^\"]*\"/, `dubhe = \"${packageAddress}\"`);\n\n // Check if published-at already exists\n if (/published-at\\s*=\\s*\"[^\"]*\"/.test(updatedContent)) {\n // Replace existing published-at\n updatedContent = updatedContent.replace(\n /published-at\\s*=\\s*\"[^\"]*\"/,\n `published-at = \"${packageAddress}\"`\n );\n } else {\n // Add published-at after [package] line if it doesn't exist\n updatedContent = updatedContent.replace(\n /(\\[package\\][^\\n]*\\n)/,\n `$1published-at = \"${packageAddress}\"\\n`\n );\n }\n }\n\n fs.writeFileSync(moveTomlPath, updatedContent, 'utf-8');\n}\n\nexport function updateGenesisUpgradeFunction(path: string, tables: string[]) {\n const genesisPath = `${path}/sources/codegen/genesis.move`;\n const genesisContent = fs.readFileSync(genesisPath, 'utf-8');\n\n // Match the first pair of // ========================================== lines (with any content, including empty, between them)\n const separatorRegex =\n /(\\/\\/ ==========================================)[\\s\\S]*?(\\/\\/ ==========================================)/;\n const match = genesisContent.match(separatorRegex);\n\n if (!match) {\n throw new Error('Could not find separator comments in genesis.move');\n }\n\n // Generate new table registration code\n const registerTablesCode = tables\n .map((table) => ` ${table}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n\n // Build new content, preserve separators, replace middle content\n const newContent = `${match[1]}\\n${registerTablesCode}\\n${match[2]}`;\n\n // Replace matched content\n const updatedContent = genesisContent.replace(separatorRegex, newContent);\n\n fs.writeFileSync(genesisPath, updatedContent, 'utf-8');\n}\n","import chalk from 'chalk';\nimport { ZodError } from 'zod';\nimport { fromZodError, ValidationError } from 'zod-validation-error';\n\nexport class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n\nexport class DubheCliError extends Error {\n name = 'DubheCliError';\n}\n\nexport class UpgradeError extends Error {\n name = 'UpgradeError';\n}\n\nexport class FsIibError extends Error {\n name = 'FsIibError';\n}\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n const validationError = fromZodError(error, {\n prefixSeparator: '\\n- ',\n issueSeparator: '\\n- '\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log('');\n // TODO add docs to the website and update the link to the specific page\n console.log(\n chalk.blue(\n `To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk`\n )\n );\n } else if (error instanceof DubheCliError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","export const TESTNET_DUBHE_HUB_OBJECT_ID =\n '0xfef203de9d3a2980429e91df535a0503ccf8d3c05aa3815936984243dc96f19f';\n\nexport const TESTNET_ORIGINAL_DUBHE_PACKAGE_ID =\n '0x8817b4976b6c607da01cea49d728f71d09274c82e9b163fa20c2382586f8aefc';\n","import { Transaction, UpgradePolicy } from '@0xobelisk/sui-client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { UpgradeError } from './errors';\nimport {\n getOldPackageId,\n getVersion,\n getUpgradeCap,\n saveContractData,\n switchEnv,\n initializeDubhe,\n getOnchainResources,\n getStartCheckpoint,\n updateGenesisUpgradeFunction,\n getDubheDappHub,\n updatePublishedToml,\n clearPublishedTomlEntry,\n restorePublishedTomlEntry,\n readPublishedToml,\n updateEphemeralPubFile,\n getEphemeralPubFilePath\n} from './utils';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { DubheConfig } from '@0xobelisk/sui-common';\n\ntype Migration = {\n name: string;\n fields: any;\n};\n\nfunction replaceEnvField(\n filePath: string,\n networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n field: 'original-published-id' | 'latest-published-id' | 'published-version',\n newValue: string\n): string {\n const envFilePath = path.resolve(filePath);\n const envContent = fs.readFileSync(envFilePath, 'utf-8');\n const envLines = envContent.split('\\n');\n\n const networkSectionIndex = envLines.findIndex((line) => line.trim() === `[env.${networkType}]`);\n if (networkSectionIndex === -1) {\n console.log(`Network type [env.${networkType}] not found in the file.`);\n return '';\n }\n\n let fieldIndex = -1;\n let previousValue: string = '';\n for (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n const line = envLines[i].trim();\n if (line.startsWith('[')) break; // End of the current network section\n\n if (line.startsWith(field)) {\n fieldIndex = i;\n previousValue = line.split('=')[1].trim().replace(/\"/g, '');\n break;\n }\n }\n\n if (fieldIndex !== -1) {\n envLines[fieldIndex] = `${field} = \"${newValue}\"`;\n const newEnvContent = envLines.join('\\n');\n fs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n } else {\n console.log(`${field} not found for [env.${networkType}].`);\n }\n\n return previousValue;\n}\n\nexport async function upgradeHandler(\n config: DubheConfig,\n name: string,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n await switchEnv(network);\n\n const path = process.cwd();\n const projectPath = `${path}/src/${name}`;\n\n const dubhe = initializeDubhe({ network });\n\n let oldVersion = Number(await getVersion(projectPath, network));\n let oldPackageId = await getOldPackageId(projectPath, network);\n let upgradeCap = await getUpgradeCap(projectPath, network);\n let startCheckpoint = await getStartCheckpoint(projectPath, network);\n let dappHub = await getDubheDappHub(network);\n let onchainResources = await getOnchainResources(projectPath, network);\n\n let pendingMigration: Migration[] = [];\n Object.entries(config.resources).forEach(([key, value]) => {\n if (!onchainResources.hasOwnProperty(key)) {\n pendingMigration.push({ name: key, fields: value });\n }\n });\n\n const tables = pendingMigration.map((migration) => migration.name);\n // Only update genesis.move when there are new tables to register.\n // When tables is empty, there are no schema changes so no migration needed.\n // Note: updating genesis.move also requires separator comments inserted by\n // `dubhe schemagen`; if they are missing, the update will throw.\n if (tables.length > 0) {\n updateGenesisUpgradeFunction(projectPath, tables);\n }\n\n const original_published_id = replaceEnvField(\n `${projectPath}/Move.lock`,\n network,\n 'original-published-id',\n '0x0000000000000000000000000000000000000000000000000000000000000000'\n );\n\n // For persistent networks (testnet/mainnet): zero out Published.toml so the\n // package compiles with address 0x0 for upgrade.\n // For localnet: we use --build-env testnet + Pub.localnet.toml, so Published.toml\n // is not consulted during the build and does not need to be cleared.\n const savedPublishedEntry =\n network !== 'localnet' ? clearPublishedTomlEntry(projectPath, network) : undefined;\n\n // For localnet upgrades: refresh Pub.localnet.toml with dubhe's current address\n // so that the build can resolve the dubhe dependency.\n const cwd = process.cwd();\n if (network === 'localnet') {\n const dubheProjectPath = `${cwd}/src/dubhe`;\n const dubheEntries = readPublishedToml(dubheProjectPath);\n const dubheEntry = dubheEntries['localnet'];\n if (dubheEntry) {\n const pubfilePath = getEphemeralPubFilePath(cwd, network);\n const dubheUpgradeCap = await getUpgradeCap(dubheProjectPath, network).catch(() => '');\n updateEphemeralPubFile(pubfilePath, dubheEntry.chainId, 'testnet', {\n source: dubheProjectPath,\n publishedAt: dubheEntry.publishedAt,\n originalId: dubheEntry.originalId,\n upgradeCap: dubheUpgradeCap\n });\n }\n }\n\n try {\n let modules: any, dependencies: any, digest: any;\n try {\n // For localnet: use --build-env testnet --pubfile-path Pub.localnet.toml\n // so the package compiles with address 0x0 (not in pubfile) and links\n // against the already-published dubhe dependency (from pubfile).\n // For testnet/mainnet: use -e <network> as usual.\n let buildCmd: string;\n if (network === 'localnet') {\n const pubfilePath = getEphemeralPubFilePath(cwd, network);\n buildCmd = `sui move build --dump-bytecode-as-base64 --no-tree-shaking --build-env testnet --pubfile-path ${pubfilePath} --path ${path}/src/${name}`;\n } else {\n buildCmd = `sui move build --dump-bytecode-as-base64 --no-tree-shaking -e ${network} --path ${path}/src/${name}`;\n }\n\n const {\n modules: extractedModules,\n dependencies: extractedDependencies,\n digest: extractedDigest\n } = JSON.parse(execSync(buildCmd, { encoding: 'utf-8', stdio: 'pipe' }));\n\n modules = extractedModules;\n dependencies = extractedDependencies;\n digest = extractedDigest;\n } catch (error: any) {\n // Restore Published.toml before throwing (only for persistent networks)\n if (savedPublishedEntry) {\n restorePublishedTomlEntry(projectPath, network, savedPublishedEntry);\n }\n throw new UpgradeError(error.stdout || error.stderr || error.message);\n }\n\n console.log('\\n๐ Starting Upgrade Process...');\n console.log('๐ OldPackageId:', oldPackageId);\n console.log('๐ UpgradeCap Object Id:', upgradeCap);\n console.log('๐ OldVersion:', oldVersion);\n\n const tx = new Transaction();\n const ticket = tx.moveCall({\n target: '0x2::package::authorize_upgrade',\n arguments: [\n tx.object(upgradeCap),\n tx.pure.u8(UpgradePolicy.COMPATIBLE),\n tx.pure.vector('u8', digest)\n ]\n });\n\n const receipt = tx.upgrade({\n modules,\n dependencies,\n package: oldPackageId,\n ticket\n });\n\n tx.moveCall({\n target: '0x2::package::commit_upgrade',\n arguments: [tx.object(upgradeCap), receipt]\n });\n\n const result = await dubhe.signAndSendTxn({\n tx,\n onSuccess: (result) => {\n console.log(chalk.green(`Upgrade Transaction Digest: ${result.digest}`));\n },\n onError: (error) => {\n console.log(chalk.red('Upgrade Transaction failed!'));\n console.error(error);\n }\n });\n\n let newPackageId = '';\n result.objectChanges!.map((object) => {\n if (object.type === 'published') {\n console.log(chalk.blue(`${name} new PackageId: ${object.packageId}`));\n console.log(chalk.blue(`${name} new Version: ${oldVersion + 1}`));\n newPackageId = object.packageId;\n }\n });\n\n replaceEnvField(\n `${projectPath}/Move.lock`,\n network,\n 'original-published-id',\n original_published_id\n );\n replaceEnvField(`${projectPath}/Move.lock`, network, 'latest-published-id', newPackageId);\n replaceEnvField(`${projectPath}/Move.lock`, network, 'published-version', oldVersion + 1 + '');\n\n // Update Published.toml with the new package ID after upgrade.\n // For localnet: savedPublishedEntry is undefined (we skip clearPublishedTomlEntry),\n // so fall back to reading the current Published.toml entry for chainId/originalId.\n const existingEntry = readPublishedToml(projectPath)[network];\n const chainId = savedPublishedEntry?.chainId ?? existingEntry?.chainId ?? '';\n updatePublishedToml(\n projectPath,\n network,\n chainId,\n newPackageId,\n savedPublishedEntry?.originalId ?? existingEntry?.originalId ?? original_published_id,\n oldVersion + 1\n );\n\n saveContractData(\n name,\n network,\n startCheckpoint,\n newPackageId,\n dappHub,\n upgradeCap,\n oldVersion + 1,\n config.resources,\n config.enums\n );\n\n // Only run the migration transaction if there are pending schema changes.\n // A \"bug-fix\" upgrade with no new fields does not need a migration call.\n // The migrate_to_vX function is only generated by `dubhe schemagen` when\n // new components / resources are added.\n if (pendingMigration.length > 0) {\n console.log(`\\n๐ Starting Migration Process...`);\n pendingMigration.forEach((migration) => {\n console.log('๐ Added Fields:', JSON.stringify(migration, null, 2));\n });\n await new Promise((resolve) => setTimeout(resolve, 5000));\n\n const migrateTx = new Transaction();\n const newVersion = oldVersion + 1;\n migrateTx.moveCall({\n target: `${newPackageId}::migrate::migrate_to_v${newVersion}`,\n arguments: [\n migrateTx.object(dappHub),\n migrateTx.pure.address(newPackageId),\n migrateTx.pure.u32(newVersion)\n ]\n });\n\n await dubhe.signAndSendTxn({\n tx: migrateTx,\n onSuccess: (result) => {\n console.log(chalk.green(`Migration Transaction Digest: ${result.digest}`));\n },\n onError: (error) => {\n console.log(\n chalk.red('Migration Transaction failed!, Please execute the migration manually.')\n );\n console.error(error);\n }\n });\n } else {\n console.log(`\\nโ
No schema changes โ migration step skipped.`);\n // Brief delay to allow localnet to index the upgraded package before\n // subsequent on-chain queries.\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n } catch (error: any) {\n // Restore Published.toml to original state on failure (persistent networks only)\n if (savedPublishedEntry) {\n restorePublishedTomlEntry(projectPath, network, savedPublishedEntry);\n }\n console.log(chalk.red('upgrade handler execution failed!'));\n throw error;\n }\n}\n","import readline from 'readline';\n\nimport yargs, { CommandModule } from 'yargs';\nimport { commands } from '.';\nimport chalk from 'chalk';\nimport { getDefaultNetwork, printDubhe } from '../utils';\nimport dotenv from 'dotenv';\nimport { spawn } from 'child_process';\n\ndotenv.config();\n\nlet shouldHandlerExit = true;\n\n// Blacklist of commands not available inside shell\nconst SHELL_BLACKLIST_COMMANDS = ['shell', 'wait'];\n\nexport const handlerExit = (status: number = 0) => {\n if (shouldHandlerExit) process.exit(status);\n};\n\ntype Options = {\n network: any;\n};\n\nconst parseCommandNames = () => {\n return commands\n .filter((command) => !SHELL_BLACKLIST_COMMANDS.includes(command.command as string))\n .map((command) => command.command);\n};\n\nconst ShellCommand: CommandModule<Options, Options> = {\n command: 'shell',\n describe: 'Open a shell to interact with the Dubhe System',\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n default: 'default',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n }\n });\n },\n handler: async ({ network }) => {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n shouldHandlerExit = false;\n const commandHistory: string[] = [];\n\n function completer(line: string) {\n const hits = parseCommandNames().filter((c) => {\n if (!c) return false;\n return (c as string).startsWith(line.toLowerCase());\n });\n return [hits.length ? hits : parseCommandNames(), line];\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: `dubhe(${chalk.green(network)}) ${chalk.bold('>')} `,\n completer: completer,\n historySize: 200\n });\n\n rl.on('line', async (line) => {\n const fullCommand = line.trim();\n if (!fullCommand) {\n rl.prompt();\n return;\n }\n\n // Add command to history\n commandHistory.push(fullCommand);\n\n const parts = fullCommand.split(/\\s+/);\n const commandName = parts[0].toLowerCase();\n\n const command = commands.find(\n (c) => c.command === commandName && !SHELL_BLACKLIST_COMMANDS.includes(commandName)\n );\n\n // Check if user is asking for help\n if (parts.includes('--help') || parts.includes('-h')) {\n if (command) {\n try {\n // Use spawn to call dubhe help externally to avoid validation issues\n const dubheProcess = spawn('node', [process.argv[1], commandName, '--help'], {\n stdio: 'inherit',\n env: { ...process.env }\n });\n\n dubheProcess.on('exit', () => {\n rl.prompt();\n });\n\n dubheProcess.on('error', () => {\n // Fallback: show basic help information\n console.log(`\\n${command.describe || `${commandName} command`}`);\n console.log(`\\nUsage: ${commandName} [options]`);\n console.log('\\nFor complete help with all options, please exit shell and run:');\n console.log(chalk.cyan(` dubhe ${commandName} --help`));\n rl.prompt();\n });\n\n return; // Don't call rl.prompt() here as it's handled in the callbacks\n } catch {\n // Fallback: show basic help information\n console.log(`\\n${command.describe || `${commandName} command`}`);\n console.log(`\\nUsage: ${commandName} [options]`);\n console.log('\\nFor complete help with all options, please exit shell and run:');\n console.log(chalk.cyan(` dubhe ${commandName} --help`));\n }\n } else {\n console.log(\n `๐คท Unknown command: \"${commandName}\". Type 'help' to see available commands.`\n );\n }\n rl.prompt();\n return;\n }\n\n if (command) {\n try {\n const { builder, handler } = command;\n const yargsInstance = yargs().exitProcess(false);\n if (builder) {\n if (typeof builder === 'function') {\n builder(yargsInstance);\n } else {\n yargsInstance.options(builder);\n }\n const argv = yargsInstance.parseSync([\n commandName,\n '--network',\n network,\n ...parts.slice(1)\n ]);\n if (handler) {\n await handler(argv);\n }\n }\n } catch (error) {\n console.log(chalk.red(error));\n }\n } else if (commandName == 'help') {\n console.log('Available dubhe commands:');\n\n // Find the longest command name for alignment (excluding blacklisted commands)\n const availableCommands = commands.filter(\n (c) => !SHELL_BLACKLIST_COMMANDS.includes(c.command as string)\n );\n const maxCommandLength = Math.max(\n ...availableCommands.map((c) => {\n const command =\n typeof c.command === 'string'\n ? c.command\n : Array.isArray(c.command)\n ? c.command[0]\n : '';\n return command.length;\n })\n );\n\n availableCommands.forEach((c) => {\n const command =\n typeof c.command === 'string'\n ? c.command\n : Array.isArray(c.command)\n ? c.command[0]\n : '';\n const paddedCommand = command.padEnd(maxCommandLength);\n console.log(` ${chalk.green(paddedCommand)} ${c.describe}`);\n });\n rl.prompt();\n return;\n } else if (['exit', 'quit'].indexOf(commandName) !== -1) {\n console.log('Goodbye You will have a nice day! ๐');\n rl.close();\n return;\n } else {\n console.log(`๐คท Unknown command: \"${fullCommand}\". Type 'help' to see available commands.`);\n }\n rl.prompt();\n });\n\n rl.on('close', () => {\n process.exit(0);\n });\n\n printDubhe();\n rl.prompt();\n }\n};\n\nexport default ShellCommand;\n","import type { CommandModule } from 'yargs';\nimport { startLocalNode } from '../utils/startNode';\nimport { handlerExit } from './shell';\n\ntype Options = {\n 'data-dir': string;\n force: boolean;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'node',\n\n describe: 'Manage local Sui node',\n\n builder: {\n 'data-dir': {\n type: 'string',\n default: '.chk',\n desc: 'Path to the data directory'\n },\n force: {\n type: 'boolean',\n default: false,\n desc: 'Force restart: stop existing node and remove data directory'\n }\n },\n\n async handler({ 'data-dir': data_dir, force }) {\n try {\n await startLocalNode(data_dir, force);\n } catch (error) {\n console.error('Error executing command:', error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { requestSuiFromFaucetV2, getFaucetHost } from '@mysten/sui/faucet';\nimport { SuiClient, getFullnodeUrl, GetBalanceParams } from '@mysten/sui/client';\nimport { initializeDubhe } from '../utils';\nimport { handlerExit } from './shell';\n\ntype Options = {\n network: any;\n recipient?: string;\n};\n\nconst MAX_RETRIES = 60; // 60s timeout\nconst RETRY_INTERVAL = 1000; // 1s retry interval\nconst SPINNER = ['โ ', 'โ ', 'โ น', 'โ ธ', 'โ ผ', 'โ ด', 'โ ฆ', 'โ ง', 'โ ', 'โ '];\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'faucet',\n\n describe: 'Interact with a Dubhe faucet',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n desc: 'URL of the Dubhe faucet',\n choices: ['testnet', 'devnet', 'localnet'],\n default: 'localnet'\n },\n recipient: {\n type: 'string',\n desc: 'Sui address to fund'\n }\n });\n },\n\n async handler({ network, recipient }) {\n let faucet_address = '';\n if (recipient === undefined) {\n const dubhe = initializeDubhe(network);\n faucet_address = dubhe.getAddress();\n } else {\n faucet_address = recipient;\n }\n\n console.log('\\n๐ Starting Faucet Operation...');\n console.log(` โโ Network: ${network}`);\n\n if (recipient === undefined) {\n console.log(' โโ Using Environment PrivateKey');\n console.log(` โโ Generated Address: ${faucet_address}`);\n } else {\n console.log(` โโ Using Provided Address: ${faucet_address}`);\n }\n\n console.log(' โโ Requesting funds from faucet...');\n\n let retryCount = 0;\n let success = false;\n let spinnerIndex = 0;\n const startTime = Date.now();\n let isInterrupted = false;\n\n const handleInterrupt = () => {\n isInterrupted = true;\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n console.log('\\n โโ Operation cancelled by user');\n handlerExit(1);\n };\n process.on('SIGINT', handleInterrupt);\n\n try {\n while (retryCount < MAX_RETRIES && !success && !isInterrupted) {\n try {\n await requestSuiFromFaucetV2({\n host: getFaucetHost(network),\n recipient: faucet_address\n });\n success = true;\n } catch (_error) {\n if (isInterrupted) break;\n\n retryCount++;\n if (retryCount === MAX_RETRIES) {\n console.log(` โโ Failed to request funds after ${MAX_RETRIES} attempts.`);\n console.log(' โโ Please check your network connection and try again later.');\n console.log(\n ' โโ You can visit https://faucet.testnet.sui.io/ to request funds manually.'\n );\n handlerExit(1);\n }\n\n const elapsedTime = Math.floor((Date.now() - startTime) / 1000);\n const spinner = SPINNER[spinnerIndex % SPINNER.length];\n spinnerIndex++;\n\n process.stdout.write(`\\r โโ ${spinner} Retrying... (${elapsedTime}s)`);\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL));\n }\n }\n } finally {\n process.removeListener('SIGINT', handleInterrupt);\n }\n\n if (isInterrupted) {\n handlerExit(1);\n }\n process.stdout.write('\\r' + ' '.repeat(50) + '\\r');\n\n console.log(' โโ Checking balance...');\n const client = new SuiClient({ url: getFullnodeUrl(network) });\n let params = {\n owner: faucet_address\n } as GetBalanceParams;\n\n const balance = await client.getBalance(params);\n\n console.log('\\n๐ฐ Account Summary');\n console.log(` โโ Address: ${faucet_address}`);\n console.log(` โโ Balance: ${(Number(balance.totalBalance) / 1_000_000_000).toFixed(4)} SUI`);\n\n console.log('\\nโ
Faucet Operation Complete\\n');\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { schemaGen, loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport chalk from 'chalk';\nimport path from 'node:path';\nimport { handlerExit } from './shell';\nimport { getDefaultNetwork } from '../utils';\n\ntype Options = {\n 'config-path'?: string;\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet' | 'default';\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'schemagen',\n\n describe: 'Autogenerate Dubhe schemas based on the config file',\n\n builder: {\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Path to the config file'\n },\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'] as const,\n default: 'default',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n }\n },\n\n async handler({ 'config-path': configPath, network }) {\n try {\n if (!configPath) throw new Error('Config path is required');\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const rootDir = path.dirname(configPath);\n await schemaGen(rootDir, dubheConfig, network);\n handlerExit();\n } catch (error: any) {\n console.log(chalk.red('Schemagen failed!'));\n console.error(error.message);\n handlerExit(1);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { getDefaultNetwork, publishHandler } from '../utils';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport { execSync } from 'child_process';\nimport { handlerExit } from './shell';\nimport chalk from 'chalk';\n\ntype Options = {\n network: any;\n 'config-path': string;\n force: boolean;\n 'gas-budget'?: number;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'publish',\n\n describe: 'Publish dubhe move contract',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n default: 'default',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n },\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Configuration file path'\n },\n 'gas-budget': {\n type: 'number',\n desc: 'Optional gas budget for the transaction',\n optional: true\n },\n force: {\n type: 'boolean',\n default: false,\n desc: 'Clear existing published state for this network before build (use when re-publishing or to fix PublishErrorNonZeroAddress)'\n }\n });\n },\n\n async handler({ network, 'config-path': configPath, 'gas-budget': gasBudget, force }) {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n execSync(`pnpm dubhe convert-json --config-path ${configPath}`, { encoding: 'utf-8' });\n await publishHandler(dubheConfig, network, force, gasBudget);\n } catch (error: any) {\n logError(error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { execSync } from 'child_process';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { handlerExit } from './shell';\n\n/**\n * Returns the active Sui client environment (e.g. \"localnet\", \"testnet\").\n * Falls back to \"testnet\" if the command fails.\n */\nfunction getActiveSuiEnv(): string {\n try {\n return execSync('sui client active-env', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n } catch {\n return 'testnet';\n }\n}\n\ntype Options = {\n 'config-path': string;\n test?: string;\n 'gas-limit'?: string;\n};\n\n/**\n * Core Move test runner for Dubhe contracts.\n * Runs `sui move test` against the package at `src/<dubheConfig.name>`.\n *\n * Move unit tests compile packages locally โ no network or published address required.\n */\nexport async function testHandler(\n dubheConfig: DubheConfig,\n test?: string,\n gasLimit: string = '100000000',\n buildEnv?: string\n): Promise<string> {\n const cwd = process.cwd();\n const projectPath = `${cwd}/src/${dubheConfig.name}`;\n // --build-env overrides the active Sui client environment for dependency resolution.\n // Required for localnet (which is not in Move.toml [environments]) when the\n // active client env has been set to localnet from a previous run.\n const buildEnvFlag = buildEnv ? `--build-env ${buildEnv}` : '';\n const command = `sui move test ${buildEnvFlag} --path ${projectPath} ${\n test ? `--test ${test}` : ''\n } --gas-limit ${gasLimit}`;\n return execSync(command, { stdio: 'pipe', encoding: 'utf-8' });\n}\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'test',\n\n describe: 'Run Move unit tests in Dubhe contracts',\n\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n description: 'Path to the Dubhe config file'\n },\n test: {\n type: 'string',\n desc: 'Run a specific test by name'\n },\n 'gas-limit': {\n type: 'string',\n desc: 'Set the gas limit for the test',\n default: '100000000'\n }\n });\n },\n\n async handler({ 'config-path': configPath, test, 'gas-limit': gasLimit }) {\n try {\n console.log('๐ Running move test');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\n // Ephemeral networks (localnet/devnet) are not defined in Move.toml [environments].\n // Use --build-env testnet for dependency resolution so `sui move test` can resolve\n // git dependencies without requiring a localnet env entry.\n const activeEnv = getActiveSuiEnv();\n const buildEnv = activeEnv === 'localnet' || activeEnv === 'devnet' ? 'testnet' : undefined;\n\n const output = await testHandler(dubheConfig, test, gasLimit, buildEnv);\n if (output) process.stdout.write(output);\n } catch (error: any) {\n if (error.stdout) process.stdout.write(error.stdout);\n if (error.stderr) process.stderr.write(error.stderr);\n if (!error.stdout && !error.stderr && error.message) process.stderr.write(error.message);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { execSync, exec } from 'child_process';\nimport nodePath from 'path';\nimport chalk from 'chalk';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { handlerExit } from './shell';\nimport { getDefaultNetwork, switchEnv } from '../utils';\n\ntype Options = {\n 'config-path': string;\n network: any;\n 'dump-bytecode-as-base64'?: boolean;\n};\n\n/**\n * Core build logic for Dubhe contracts.\n *\n * - localnet: uses --build-env testnet + --pubfile-path Pub.localnet.toml so that\n * dependency addresses are resolved through the ephemeral publication file created\n * by publishHandler. Counter can only be built after dubhe is published on localnet.\n * - Other networks: uses -e <network> (standard Sui CLI environment flag).\n */\nexport async function buildHandler(\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n dumpBytecodeAsBase64: boolean = false\n): Promise<string> {\n const cwd = process.cwd();\n const projectPath = nodePath.join(cwd, 'src', dubheConfig.name);\n\n let command: string;\n if (network === 'localnet') {\n const pubfilePath = nodePath.join(cwd, 'Pub.localnet.toml');\n command = `sui move build --build-env testnet --pubfile-path ${pubfilePath} --path ${projectPath}`;\n } else {\n command = `sui move build -e ${network} --path ${projectPath}`;\n }\n\n if (dumpBytecodeAsBase64) command += ' --dump-bytecode-as-base64';\n\n return execSync(command, { encoding: 'utf-8' });\n}\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'build',\n describe: 'Build Dubhe contracts',\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n description: 'Path to the Dubhe config file'\n },\n network: {\n type: 'string',\n default: 'default',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n },\n 'dump-bytecode-as-base64': {\n type: 'boolean',\n default: false,\n desc: 'Dump bytecode as base64'\n }\n });\n },\n\n async handler({\n 'config-path': configPath,\n network,\n 'dump-bytecode-as-base64': dumpBytecodeAsBase64\n }) {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n console.log('๐ Running move build');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await switchEnv(network);\n const output = await buildHandler(dubheConfig, network, dumpBytecodeAsBase64);\n console.log(output);\n exec(`pnpm dubhe convert-json --config-path ${configPath}`);\n } catch (error: any) {\n console.error(chalk.red('Error executing sui move build:'));\n if (error.stdout) process.stdout.write(error.stdout);\n if (error.stderr) process.stderr.write(error.stderr);\n if (!error.stdout && !error.stderr && error.message) process.stderr.write(error.message);\n handlerExit(1);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { printDubhe } from '../utils';\n\nconst commandModule: CommandModule = {\n command: 'hello',\n\n describe: 'hello, dubhe',\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n printDubhe();\n }\n};\n\nexport default commandModule;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\n\nexport async function generateAccountHandler(\n force: boolean = false,\n useNextPublic: boolean = false\n) {\n if (useNextPublic) {\n console.log(\n chalk.gray(\n 'Note: The generated account will be stored in the .env file with NEXT_PUBLIC_ prefix for client-side usage.'\n )\n );\n console.log(\n chalk.yellow('Warning: Do not expose the .env file, it is intended for local testing only.\\n')\n );\n }\n const path = process.cwd();\n let privateKey: string | undefined;\n let envContent = '';\n\n // Check if .env file exists\n try {\n envContent = fs.readFileSync(`${path}/.env`, 'utf8');\n\n // privateKey = process.env.PRIVATE_KEY || process.env.NEXT_PUBLIC_PRIVATE_KEY;\n let privateKey = process.env.PRIVATE_KEY || process.env.NEXT_PUBLIC_PRIVATE_KEY;\n if (useNextPublic) {\n privateKey = process.env.NEXT_PUBLIC_PRIVATE_KEY || process.env.PRIVATE_KEY;\n }\n\n if (privateKey) {\n // If key exists, decide whether to update keyname based on useNextPublic\n const newKeyName = useNextPublic ? 'NEXT_PUBLIC_PRIVATE_KEY' : 'PRIVATE_KEY';\n\n // Find and update the last matching line based on privateKey value\n const lines = envContent.split('\\n');\n let shouldUpdate = false;\n\n // First check if the last matching line already has the correct keyname\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line.endsWith(privateKey)) {\n // If useNextPublic is true, only update if the line starts with PRIVATE_KEY=\n // If useNextPublic is false, only update if the line starts with NEXT_PUBLIC_PRIVATE_KEY=\n const [currentKeyName] = line.split('=');\n if (useNextPublic) {\n shouldUpdate = currentKeyName === 'PRIVATE_KEY';\n } else {\n shouldUpdate = currentKeyName === 'NEXT_PUBLIC_PRIVATE_KEY';\n }\n break;\n }\n }\n\n // Only update if necessary\n if (shouldUpdate) {\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line.endsWith(privateKey)) {\n const newLine = `${newKeyName}=${privateKey}`;\n lines[i] = newLine;\n envContent = lines.join('\\n');\n fs.writeFileSync(`${path}/.env`, envContent);\n break;\n }\n }\n }\n\n const dubhe = new Dubhe({ secretKey: privateKey });\n const keypair = dubhe.getSigner();\n console.log(chalk.blue(`Using existing account: ${keypair.toSuiAddress()}`));\n return;\n }\n } catch (_error) {\n // .env file doesn't exist or failed to read, continue to generate new account\n }\n\n // Generate a new account if no existing key is found or force generation is requested\n if (force || !privateKey) {\n const dubhe = new Dubhe();\n const keypair = dubhe.getSigner();\n privateKey = keypair.getSecretKey();\n\n const newKeyName = useNextPublic ? 'NEXT_PUBLIC_PRIVATE_KEY' : 'PRIVATE_KEY';\n const newContent = `${newKeyName}=${privateKey}`;\n\n // If .env file exists, append new content; otherwise create a new file\n if (envContent) {\n envContent = envContent.trim() + '\\n' + newContent;\n } else {\n envContent = newContent;\n }\n\n fs.writeFileSync(`${path}/.env`, envContent);\n console.log(chalk.green(`File created/updated at: ${path}/.env`));\n\n console.log(chalk.blue(`New account generated: ${keypair.toSuiAddress()}`));\n }\n}\n","import type { CommandModule } from 'yargs';\nimport { generateAccountHandler } from '../utils/generateAccount';\nimport { handlerExit } from './shell';\n\ntype Options = {\n force?: boolean;\n 'use-next-public'?: boolean;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'generate-key',\n describe: 'Generate a new account keypair and save it to a .env file',\n builder: {\n force: {\n type: 'boolean',\n default: false,\n desc: 'Force generate a new keypair'\n },\n 'use-next-public': {\n type: 'boolean',\n default: false,\n desc: 'Use the NEXT_PUBLIC_ prefix for client-side usage'\n }\n },\n async handler({ force, 'use-next-public': useNextPublic }) {\n try {\n await generateAccountHandler(force, useNextPublic);\n } catch (error) {\n console.error('Error generating account:', error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { initializeDubhe } from './utils';\nimport { DubheCliError } from './errors';\ndotenv.config();\n\nexport async function checkBalanceHandler(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {\n try {\n const dubhe = initializeDubhe({\n network\n });\n\n const balance = await dubhe.getBalance();\n const balanceInSUI = Number(balance.totalBalance) / 1_000_000_000;\n\n if (balanceInSUI === 0) {\n throw new DubheCliError(`Your account balance is 0 SUI. Please get some SUI to proceed.`);\n }\n\n console.log(chalk.green(`Current account balance: ${balanceInSUI.toFixed(4)} SUI`));\n } catch (error) {\n throw new DubheCliError('Failed to check balance: ' + error);\n }\n}\n","import type { CommandModule } from 'yargs';\nimport { checkBalanceHandler } from '../utils/checkBalance';\nimport { handlerExit } from './shell';\nimport chalk from 'chalk';\nimport { getDefaultNetwork } from '../utils';\n\ntype Options = {\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet' | 'default';\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'check-balance',\n describe: 'Check the balance of the account',\n builder: {\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n desc: 'Network to check balance on',\n default: 'default'\n }\n },\n async handler({ network }) {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n await checkBalanceHandler(network);\n } catch (error) {\n console.error('Error checking balance:', error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport { getDeploymentJson, getDubheDappHub } from './utils';\n\nasync function storeConfig(network: string, packageId: string, outputPath: string) {\n const dubheDappHub = await getDubheDappHub(network);\n let code = `type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';\n\nexport const NETWORK: NetworkType = '${network}';\nexport const PACKAGE_ID = '${packageId}';\nexport const DUBHE_SCHEMA_ID = '${dubheDappHub}';\n`;\n\n writeOutput(code, outputPath, 'storeConfig');\n}\n\nasync function writeOutput(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, output);\n if (logPrefix !== undefined) {\n console.log(`${logPrefix}: ${fullOutputPath}`);\n }\n}\n\nexport async function storeConfigHandler(\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n outputPath: string\n) {\n const path = process.cwd();\n const contractPath = `${path}/src/${dubheConfig.name}`;\n const deployment = await getDeploymentJson(contractPath, network);\n await storeConfig(deployment.network, deployment.packageId, outputPath);\n}\n","import type { CommandModule } from 'yargs';\nimport { storeConfigHandler } from '../utils/storeConfig';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport { handlerExit } from './shell';\nimport chalk from 'chalk';\nimport { getDefaultNetwork } from '../utils';\n\ntype Options = {\n 'config-path': string;\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet' | 'default';\n 'output-ts-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'config-store',\n\n describe: 'Store configuration for the Dubhe project',\n\n builder: {\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n desc: 'Path to the config file'\n },\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n default: 'default',\n desc: 'Network to store config for'\n },\n 'output-ts-path': {\n type: 'string',\n desc: 'Specify the output path for the generated TypeScript configuration file (e.g., ./src/config/generated.ts)'\n }\n },\n async handler({ 'config-path': configPath, network, 'output-ts-path': outputTsPath }) {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await storeConfigHandler(dubheConfig, network, outputTsPath);\n } catch (error) {\n console.error('Error storing config:', error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport chokidar from 'chokidar';\nimport { exec } from 'child_process';\nimport { handlerExit } from './shell';\n\nconst commandModule: CommandModule = {\n command: 'watch',\n\n describe: 'Watch dubhe config',\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n const configFilePath = 'dubhe.config.ts';\n\n const runSchemagen = () => {\n exec('pnpm dubhe schemagen', (error, stdout, stderr) => {\n if (error) {\n console.error(`Error executing schemagen: ${error.message}`);\n return;\n }\n if (stderr) {\n console.error(`schemagen stderr: ${stderr}`);\n return;\n }\n console.log(`schemagen stdout: ${stdout}`);\n });\n };\n\n const watcher = chokidar.watch(configFilePath, {\n persistent: true\n });\n\n watcher.on('change', (path) => {\n console.log(`${path} has been changed. Running schemagen...`);\n runSchemagen();\n });\n\n console.log(`Watching for changes in ${configFilePath}...`);\n\n process.on('SIGINT', () => {\n watcher.close();\n console.log('\\nWatch stopped.');\n handlerExit();\n });\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport waitOn from 'wait-on';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport net from 'net';\nimport { handlerExit } from './shell';\n\ninterface WaitOptions {\n url?: string;\n localnet?: boolean;\n 'local-database'?: boolean;\n 'local-node'?: boolean;\n 'local-indexer'?: boolean;\n timeout: number;\n interval: number;\n}\n\nasync function withoutProxy<T>(fn: () => Promise<T>): Promise<T> {\n const originalProxy = {\n HTTP_PROXY: process.env.HTTP_PROXY,\n HTTPS_PROXY: process.env.HTTPS_PROXY,\n http_proxy: process.env.http_proxy,\n https_proxy: process.env.https_proxy,\n NO_PROXY: process.env.NO_PROXY,\n no_proxy: process.env.no_proxy\n };\n\n delete process.env.HTTP_PROXY;\n delete process.env.HTTPS_PROXY;\n delete process.env.http_proxy;\n delete process.env.https_proxy;\n process.env.NO_PROXY = '127.0.0.1,localhost,*.local';\n process.env.no_proxy = '127.0.0.1,localhost,*.local';\n\n try {\n return await fn();\n } finally {\n Object.keys(originalProxy).forEach((key) => {\n const value = originalProxy[key as keyof typeof originalProxy];\n if (value !== undefined) {\n process.env[key] = value;\n } else {\n delete process.env[key];\n }\n });\n }\n}\n\n// Check if PostgreSQL port is occupied (service is running)\nasync function checkPostgreSQLRunning(): Promise<boolean> {\n return checkPortRunning(5432);\n}\n\n// Generic port checking function\nasync function checkPortRunning(port: number, host: string = '127.0.0.1'): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = new net.Socket();\n let isConnected = false;\n\n // Set timeout for connection attempt\n const timeout = setTimeout(() => {\n socket.destroy();\n if (!isConnected) {\n resolve(false);\n }\n }, 2000);\n\n socket.connect(port, host, () => {\n isConnected = true;\n clearTimeout(timeout);\n socket.destroy();\n resolve(true); // Port is occupied, service is running\n });\n\n socket.on('error', () => {\n clearTimeout(timeout);\n if (!isConnected) {\n resolve(false); // Connection failed, service not running\n }\n });\n });\n}\n\n// Check indexer health endpoint\nasync function checkIndexerHealth(): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const response = await fetch('http://127.0.0.1:8080/health', {\n signal: controller.signal,\n headers: {\n Accept: 'application/json'\n }\n });\n\n clearTimeout(timeout);\n return response.status === 200;\n } catch {\n return false;\n }\n}\n\n// Wait for all localnet services with custom checks\nasync function waitForLocalnetServices(options: WaitOptions): Promise<void> {\n const spinner = ora({\n text: 'Waiting for dubhe localnet services...',\n color: 'cyan'\n });\n\n spinner.start();\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < options.timeout) {\n try {\n // Check HTTP services using wait-on (excluding 9000 port)\n await withoutProxy(() =>\n waitOn({\n resources: [\n 'http://127.0.0.1:9123', // Sui faucet\n 'http://127.0.0.1:4000' // GraphQL server\n ],\n timeout: options.interval,\n interval: 500,\n validateStatus: (status: number) => status === 200\n })\n );\n\n // Check PostgreSQL separately\n const postgresRunning = await checkPostgreSQLRunning();\n\n if (postgresRunning) {\n spinner.succeed(chalk.green('All dubhe localnet services are ready!'));\n return;\n }\n } catch (_error) {\n // Continue waiting...\n }\n\n // Wait before next check\n await new Promise((resolve) => setTimeout(resolve, options.interval));\n }\n\n // Timeout reached\n throw new Error('Timeout waiting for services');\n}\n\n// Wait for local database\nasync function waitForLocalDatabase(options: WaitOptions): Promise<void> {\n const spinner = ora({\n text: 'Waiting for local database...',\n color: 'cyan'\n });\n\n spinner.start();\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < options.timeout) {\n const isRunning = await checkPostgreSQLRunning();\n\n if (isRunning) {\n spinner.succeed(chalk.green('Local database is ready!'));\n return;\n }\n\n // Wait before next check\n await new Promise((resolve) => setTimeout(resolve, options.interval));\n }\n\n // Timeout reached\n throw new Error('Timeout waiting for local database');\n}\n\n// Wait for local Sui node\nasync function waitForLocalNode(options: WaitOptions): Promise<void> {\n const spinner = ora({\n text: 'Waiting for local Sui node...',\n color: 'cyan'\n });\n\n spinner.start();\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < options.timeout) {\n const isRunning = await checkPortRunning(9123);\n\n if (isRunning) {\n spinner.succeed(chalk.green('Local Sui node is ready!'));\n return;\n }\n\n // Wait before next check\n await new Promise((resolve) => setTimeout(resolve, options.interval));\n }\n\n // Timeout reached\n throw new Error('Timeout waiting for local Sui node');\n}\n\n// Wait for local indexer\nasync function waitForLocalIndexer(options: WaitOptions): Promise<void> {\n const spinner = ora({\n text: 'Waiting for local indexer...',\n color: 'cyan'\n });\n\n spinner.start();\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < options.timeout) {\n const isRunning = await checkIndexerHealth();\n\n if (isRunning) {\n spinner.succeed(chalk.green('Local indexer is ready!'));\n return;\n }\n\n // Wait before next check\n await new Promise((resolve) => setTimeout(resolve, options.interval));\n }\n\n // Timeout reached\n throw new Error('Timeout waiting for local indexer');\n}\n\nconst commandModule: CommandModule = {\n command: 'wait',\n describe: 'Wait for service(s) to be ready',\n builder(yargs) {\n return yargs\n .option('url', {\n type: 'string',\n description: 'URL to wait for (single service)'\n })\n .option('localnet', {\n type: 'boolean',\n description:\n 'Wait for all dubhe localnet services (sui localnode:9000&9123, postgres:5432, graphql:4000)',\n default: false\n })\n .option('local-database', {\n type: 'boolean',\n description: 'Wait for local database (PostgreSQL on port 5432)',\n default: false\n })\n .option('local-node', {\n type: 'boolean',\n description: 'Wait for local Sui node (port 9123)',\n default: false\n })\n .option('local-indexer', {\n type: 'boolean',\n description: 'Wait for local indexer (health check at http://127.0.0.1:8080/health)',\n default: false\n })\n .option('timeout', {\n type: 'number',\n description: 'Timeout (in milliseconds)',\n default: 24 * 60 * 60 * 1000 // 24 hours, effectively no timeout\n })\n .option('interval', {\n type: 'number',\n description: 'Check interval (in milliseconds)',\n default: 1000\n })\n .check((argv) => {\n const hasUrl = !!argv.url;\n const hasLocalnet = !!argv.localnet;\n const hasLocalDatabase = !!argv['local-database'];\n const hasLocalNode = !!argv['local-node'];\n const hasLocalIndexer = !!argv['local-indexer'];\n\n const optionCount = [\n hasUrl,\n hasLocalnet,\n hasLocalDatabase,\n hasLocalNode,\n hasLocalIndexer\n ].filter(Boolean).length;\n\n if (optionCount === 0) {\n throw new Error(\n 'Please provide at least one option: --url, --localnet, --local-database, --local-node, or --local-indexer'\n );\n }\n\n if (hasUrl && optionCount > 1) {\n throw new Error('Cannot use --url together with other options');\n }\n\n if (hasLocalnet && (hasLocalDatabase || hasLocalNode || hasLocalIndexer)) {\n throw new Error('Cannot use --localnet together with individual service options');\n }\n\n return true;\n });\n },\n async handler(argv) {\n const options = argv as unknown as WaitOptions;\n\n try {\n if (options.localnet) {\n await waitForLocalnetServices(options);\n } else if (options['local-database']) {\n await waitForLocalDatabase(options);\n } else if (options['local-node']) {\n await waitForLocalNode(options);\n } else if (options['local-indexer']) {\n await waitForLocalIndexer(options);\n } else {\n // Single URL mode - use original wait-on logic\n const spinner = ora({\n text: `Waiting for ${options.url}...`,\n color: 'cyan'\n });\n\n spinner.start();\n\n await withoutProxy(() =>\n waitOn({\n resources: [options.url!],\n timeout: options.timeout,\n interval: options.interval,\n validateStatus: (status: number) => status === 200\n })\n );\n\n spinner.succeed(chalk.green('Service is ready!'));\n }\n\n handlerExit();\n } catch (_error) {\n const spinner = ora();\n\n let errorMessage = 'Timeout waiting for service';\n let helpMessage = 'Please make sure the service is running...';\n\n if (options.localnet) {\n errorMessage = 'Timeout waiting for dubhe localnet services';\n helpMessage =\n 'Please make sure all required services are running:\\n' +\n '- Sui localnode on port 9000\\n' +\n '- Sui faucet on port 9123\\n' +\n '- PostgreSQL database on port 5432\\n' +\n '- Dubhe GraphQL server on port 4000';\n } else if (options['local-database']) {\n errorMessage = 'Timeout waiting for local database';\n helpMessage = 'Please make sure PostgreSQL is running on port 5432';\n } else if (options['local-node']) {\n errorMessage = 'Timeout waiting for local Sui node';\n helpMessage = 'Please make sure Sui localnode is running on port 9123';\n } else if (options['local-indexer']) {\n errorMessage = 'Timeout waiting for local indexer';\n helpMessage =\n 'Please make sure indexer is running and health endpoint is available at http://127.0.0.1:8080/health';\n }\n\n spinner.fail(chalk.red(errorMessage));\n console.error(chalk.yellow(helpMessage));\n\n handlerExit(1);\n }\n }\n};\n\nexport default commandModule;\n","import type { CommandModule, ArgumentsCamelCase } from 'yargs';\nimport { switchEnv } from '../utils';\nimport { handlerExit } from './shell';\n\ntype Options = {\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet' | 'default';\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'switch-env',\n describe: 'Switch environment',\n builder(yargs) {\n return yargs.option('network', {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'] as const,\n default: 'localnet',\n desc: 'Switch to node network (mainnet/testnet/devnet/localnet)'\n }) as any;\n },\n async handler(argv: ArgumentsCamelCase<Options>) {\n await switchEnv(argv.network as 'mainnet' | 'testnet' | 'devnet' | 'localnet');\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import { CommandModule } from 'yargs';\nimport { logError, initializeDubhe, getDefaultNetwork } from '../utils';\nimport dotenv from 'dotenv';\nimport chalk from 'chalk';\nimport { handlerExit } from './shell';\ndotenv.config();\n\ntype Options = {\n network: any;\n};\n\nconst InfoCommand: CommandModule<Options, Options> = {\n command: 'info',\n describe: 'Get information about the current Sui node',\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n default: 'default',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n }\n });\n },\n handler: async ({ network }) => {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n const dubhe = initializeDubhe({ network });\n const keypair = dubhe.getSigner();\n\n console.log(chalk.blue('Account Information:'));\n console.log(` Network: ${chalk.green(network)}`);\n console.log(` Address: ${chalk.green(keypair.toSuiAddress())}`);\n\n try {\n const balance = await dubhe.getBalance('0x2::sui::SUI');\n const suiBalance = (Number(balance.totalBalance) / 10 ** 9).toFixed(4);\n console.log(` Balance: ${chalk.green(suiBalance)} SUI`);\n } catch (_error) {\n console.log(\n ` Balance: ${chalk.red('Failed to fetch balance')} ${chalk.gray('(Network error)')}`\n );\n }\n handlerExit();\n } catch (error) {\n logError(error);\n handlerExit(1);\n }\n }\n};\n\nexport default InfoCommand;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport { loadMetadataHandler } from '../utils/metadataHandler';\nimport { handlerExit } from './shell';\nimport { getDefaultNetwork } from '../utils';\nimport chalk from 'chalk';\n\ntype Options = {\n network: any;\n 'config-path': string;\n 'package-id'?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'load-metadata',\n\n describe: 'Load metadata for a package',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n default: 'default',\n desc: 'Node network (mainnet/testnet/devnet/localnet)'\n },\n 'config-path': {\n type: 'string',\n desc: 'Configuration file path',\n default: 'dubhe.config.ts'\n },\n 'package-id': {\n type: 'string',\n desc: 'Package ID to load metadata for',\n optional: true\n }\n });\n },\n\n async handler({ network, 'config-path': configPath, 'package-id': packageId }) {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await loadMetadataHandler(dubheConfig, network, packageId);\n } catch (error: any) {\n logError(error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import { DubheConfig } from '@0xobelisk/sui-common';\nimport { getOldPackageId, saveMetadata } from './utils';\n\nexport async function loadMetadataHandler(\n dubheConfig: DubheConfig,\n network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n packageId?: string\n) {\n if (packageId) {\n await saveMetadata(dubheConfig.name, network, packageId);\n } else {\n const projectPath = `${process.cwd()}/src/${dubheConfig.name}`;\n const packageId = await getOldPackageId(projectPath, network);\n await saveMetadata(dubheConfig.name, network, packageId);\n }\n}\n","import type { CommandModule } from 'yargs';\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\nimport Table from 'cli-table3';\nimport inquirer from 'inquirer';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as net from 'net';\nimport axios, { AxiosRequestConfig } from 'axios';\nimport packageJson from '../../package.json';\nimport { downloadWithAxios } from '../utils/axios-downloader';\nimport { handlerExit } from './shell';\n\n// Check result type\ninterface CheckResult {\n name: string;\n status: 'success' | 'warning' | 'error';\n message: string;\n fixSuggestion?: string;\n}\n\n// GitHub Release type\ninterface GitHubRelease {\n tag_name: string;\n name: string;\n assets: Array<{\n name: string;\n browser_download_url: string;\n }>;\n published_at: string;\n}\n\n// Tool configuration\ninterface ToolConfig {\n name: string;\n repo: string;\n binaryName: string;\n installDir: string;\n}\n\n// System information\ninterface SystemInfo {\n platform: string;\n arch: string;\n platformForAsset: string;\n archForAsset: string;\n}\n\n// Get system information\nfunction getSystemInfo(): SystemInfo {\n const platform = process.platform;\n const arch = process.arch;\n\n let platformForAsset: string;\n let archForAsset: string;\n\n switch (platform) {\n case 'darwin':\n platformForAsset = 'macos';\n break;\n case 'win32':\n platformForAsset = 'windows';\n break;\n case 'linux':\n platformForAsset = 'ubuntu';\n break;\n default:\n platformForAsset = platform;\n }\n\n switch (arch) {\n case 'x64':\n archForAsset = 'x86_64';\n break;\n case 'arm64':\n archForAsset = 'aarch64';\n break;\n default:\n archForAsset = arch;\n }\n\n return {\n platform,\n arch,\n platformForAsset,\n archForAsset\n };\n}\n\n// Tool configurations\nconst TOOL_CONFIGS: Record<string, ToolConfig> = {\n sui: {\n name: 'sui',\n repo: 'MystenLabs/sui',\n binaryName: 'sui',\n installDir: path.join(os.homedir(), '.dubhe', 'bin')\n },\n 'dubhe-indexer': {\n name: 'dubhe-indexer',\n repo: '0xobelisk/dubhe',\n binaryName: 'dubhe-indexer',\n installDir: path.join(os.homedir(), '.dubhe', 'bin')\n }\n};\n\n// Execute shell command and return output\nasync function execCommand(\n command: string,\n args: string[] = []\n): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const child = spawn(command, args, { shell: true });\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({ code: code || 0, stdout, stderr });\n });\n\n child.on('error', () => {\n resolve({ code: -1, stdout, stderr });\n });\n });\n}\n\n// Enhanced axios function\nasync function fetchWithAxios(\n url: string,\n options: AxiosRequestConfig = {}\n): Promise<{\n ok: boolean;\n status: number;\n statusText: string;\n json: () => Promise<any>;\n headers: any;\n}> {\n try {\n // Configure axios with better defaults for network issues\n const axiosConfig: AxiosRequestConfig = {\n timeout: 30000,\n maxRedirects: 5,\n validateStatus: (status) => status < 500, // Accept all status codes < 500\n ...options\n };\n\n const response = await axios(url, axiosConfig);\n return {\n ok: response.status >= 200 && response.status < 300,\n status: response.status,\n statusText: response.statusText,\n json: async () => response.data,\n headers: response.headers\n };\n } catch (error: any) {\n // Handle network errors more gracefully\n let status = error.response?.status || 0;\n let statusText = error.response?.statusText || error.message;\n\n // Handle specific network error cases\n if (error.code === 'ENOTFOUND') {\n statusText = 'DNS resolution failed - please check your internet connection';\n } else if (error.code === 'ECONNRESET') {\n statusText = 'Connection reset - please check your network connection';\n } else if (error.code === 'ETIMEDOUT') {\n statusText = 'Connection timeout - please check your network connection';\n } else if (error.message.includes('protocol mismatch')) {\n statusText = 'Protocol mismatch - please check your network configuration';\n }\n\n return {\n ok: false,\n status,\n statusText,\n json: async () => error.response?.data || {},\n headers: error.response?.headers || {}\n };\n }\n}\n\n// Fetch GitHub releases with retry\nasync function fetchGitHubReleases(\n repo: string,\n count: number = 10,\n retries: number = 3\n): Promise<GitHubRelease[]> {\n const url = `https://api.github.com/repos/${repo}/releases?per_page=${count}`;\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n if (attempt > 1) {\n console.log(chalk.gray(` Retry ${attempt}/${retries}...`));\n }\n\n const response = await fetchWithAxios(url, {\n headers: {\n 'User-Agent': 'dubhe-cli',\n Accept: 'application/vnd.github.v3+json'\n }\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\n `GitHub API rate limit: ${response.status}. Please retry later or set GITHUB_TOKEN environment variable`\n );\n }\n throw new Error(`GitHub API request failed: ${response.status} ${response.statusText}`);\n }\n\n const releases = await response.json();\n return releases;\n } catch (error) {\n if (attempt > 1) {\n console.log(\n chalk.yellow(\n ` โ ๏ธ Attempt ${attempt} failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n }\n\n if (attempt === retries) {\n console.error(chalk.red(` โ Failed to fetch releases after ${retries} attempts`));\n return [];\n }\n\n // Wait 1 second before retry\n await new Promise((resolve) => setTimeout(resolve, 1000 * attempt));\n }\n }\n\n return [];\n}\n\n// Find compatible assets for current system\nfunction findCompatibleAssets(release: GitHubRelease, systemInfo: SystemInfo): string[] {\n const assets = release.assets.filter((asset) => {\n const name = asset.name.toLowerCase();\n\n // Platform matching with various aliases\n const platformVariants = [\n systemInfo.platformForAsset.toLowerCase(),\n ...(systemInfo.platformForAsset === 'macos' ? ['darwin', 'apple'] : []),\n ...(systemInfo.platformForAsset === 'windows' ? ['win', 'win32', 'windows'] : []),\n ...(systemInfo.platformForAsset === 'ubuntu' ? ['linux', 'gnu'] : [])\n ];\n\n // Architecture matching with various aliases\n const archVariants = [\n systemInfo.archForAsset.toLowerCase(),\n ...(systemInfo.archForAsset === 'x86_64' ? ['amd64', 'x64'] : []),\n ...(systemInfo.archForAsset === 'aarch64' ? ['arm64'] : [])\n ];\n\n const platformMatch = platformVariants.some((variant) => name.includes(variant));\n const archMatch = archVariants.some((variant) => name.includes(variant));\n\n // Check for archive formats\n const isArchive =\n name.endsWith('.tar.gz') ||\n name.endsWith('.zip') ||\n name.endsWith('.tgz') ||\n name.endsWith('.tar.bz2') ||\n name.endsWith('.tar.xz');\n\n return platformMatch && archMatch && isArchive;\n });\n\n return assets.map((asset) => asset.name);\n}\n\n// Get available versions for a tool\nasync function getAvailableVersions(\n toolName: string,\n systemInfo: SystemInfo\n): Promise<Array<{ version: string; hasCompatibleAsset: boolean }>> {\n const config = TOOL_CONFIGS[toolName];\n if (!config) return [];\n\n const releases = await fetchGitHubReleases(config.repo, 10);\n\n return releases.map((release) => ({\n version: release.tag_name,\n hasCompatibleAsset: findCompatibleAssets(release, systemInfo).length > 0\n }));\n}\n\n// Auto-add PATH to shell configuration file\nasync function autoAddToShellConfig(installDir: string): Promise<void> {\n try {\n // Detect current shell\n const shell = detectCurrentShell();\n if (!shell) {\n console.log(chalk.gray(`Please add to PATH: export PATH=\"$PATH:${installDir}\"`));\n return;\n }\n\n const { shellName, configFile } = shell;\n const pathCommand =\n shellName === 'fish'\n ? `set -gx PATH $PATH ${installDir}`\n : `export PATH=\"$PATH:${installDir}\"`;\n\n // Check if PATH is already added\n if (fs.existsSync(configFile)) {\n const content = fs.readFileSync(configFile, 'utf8');\n if (content.includes(installDir)) {\n console.log(chalk.green(` โ PATH already configured in ${configFile}`));\n return;\n }\n }\n\n // Add PATH to configuration file\n const comment = shellName === 'fish' ? '# Added by dubhe doctor' : '# Added by dubhe doctor';\n const pathLine = `${comment}\\n${pathCommand}`;\n\n fs.appendFileSync(configFile, `\\n${pathLine}\\n`);\n\n console.log(chalk.green(` โ Automatically added to PATH in ${configFile}`));\n console.log(chalk.blue(` ๐ To apply changes: source ${configFile} or restart terminal`));\n } catch (error) {\n console.log(\n chalk.yellow(\n ` โ ๏ธ Could not auto-configure PATH: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n console.log(chalk.gray(` Please manually add to PATH: export PATH=\"$PATH:${installDir}\"`));\n }\n}\n\n// Detect current shell and return shell info\nfunction detectCurrentShell(): { shellName: string; configFile: string } | null {\n const homeDir = os.homedir();\n\n // Method 1: Check SHELL environment variable\n const shellEnv = process.env.SHELL;\n if (shellEnv) {\n if (shellEnv.includes('zsh')) {\n return {\n shellName: 'zsh',\n configFile: path.join(homeDir, '.zshrc')\n };\n } else if (shellEnv.includes('bash')) {\n // On macOS, prefer .bash_profile, on Linux prefer .bashrc\n const bashProfile = path.join(homeDir, '.bash_profile');\n const bashrc = path.join(homeDir, '.bashrc');\n return {\n shellName: 'bash',\n configFile:\n process.platform === 'darwin' && fs.existsSync(bashProfile) ? bashProfile : bashrc\n };\n } else if (shellEnv.includes('fish')) {\n const fishConfigDir = path.join(homeDir, '.config', 'fish');\n if (!fs.existsSync(fishConfigDir)) {\n fs.mkdirSync(fishConfigDir, { recursive: true });\n }\n return {\n shellName: 'fish',\n configFile: path.join(fishConfigDir, 'config.fish')\n };\n }\n }\n\n // Method 2: Check which config files exist\n const possibleConfigs = [\n { name: 'zsh', file: path.join(homeDir, '.zshrc') },\n {\n name: 'bash',\n file:\n process.platform === 'darwin'\n ? path.join(homeDir, '.bash_profile')\n : path.join(homeDir, '.bashrc')\n },\n { name: 'bash', file: path.join(homeDir, '.bashrc') }\n ];\n\n for (const config of possibleConfigs) {\n if (fs.existsSync(config.file)) {\n return {\n shellName: config.name,\n configFile: config.file\n };\n }\n }\n\n // Method 3: Try to create default based on common patterns\n if (process.env.ZSH || fs.existsSync('/bin/zsh')) {\n return {\n shellName: 'zsh',\n configFile: path.join(homeDir, '.zshrc')\n };\n }\n\n return null;\n}\n\n// Download and install tool\nasync function downloadAndInstallTool(toolName: string, version?: string): Promise<boolean> {\n const config = TOOL_CONFIGS[toolName];\n if (!config) {\n console.error(`Unknown tool: ${toolName}`);\n return false;\n }\n\n const systemInfo = getSystemInfo();\n console.log(chalk.gray(` System: ${systemInfo.platform}/${systemInfo.arch}`));\n\n try {\n // Fetch releases\n console.log(chalk.gray(` Fetching release information...`));\n const releases = await fetchGitHubReleases(config.repo, 10);\n if (releases.length === 0) {\n console.error(chalk.red(` โ Unable to fetch releases for ${config.name}`));\n return false;\n }\n\n let selectedRelease: GitHubRelease | null = null;\n\n if (version) {\n // Find specific version\n if (!version.startsWith('v')) {\n version = `v${version}`;\n }\n selectedRelease = releases.find((r) => r.tag_name === version) || null;\n if (!selectedRelease) {\n console.error(`Version ${version} not found`);\n return false;\n }\n } else {\n // Find latest compatible version\n for (const release of releases) {\n const compatibleAssets = findCompatibleAssets(release, systemInfo);\n if (compatibleAssets.length > 0) {\n selectedRelease = release;\n break;\n }\n }\n }\n\n if (!selectedRelease) {\n console.error(`No compatible version found`);\n return false;\n }\n\n // Find compatible asset\n const compatibleAssets = findCompatibleAssets(selectedRelease, systemInfo);\n if (compatibleAssets.length === 0) {\n console.error(`Version ${selectedRelease.tag_name} has no compatible binaries`);\n return false;\n }\n\n const assetName = compatibleAssets[0];\n const asset = selectedRelease.assets.find((a) => a.name === assetName);\n if (!asset) {\n console.error(`Asset file not found: ${assetName}`);\n return false;\n }\n\n console.log(chalk.green(` โ Found compatible version: ${selectedRelease.tag_name}`));\n console.log(chalk.gray(` Download file: ${asset.name}`));\n\n // Verify download link\n try {\n const headResponse = await fetchWithAxios(asset.browser_download_url, {\n method: 'HEAD',\n headers: { 'User-Agent': 'dubhe-cli' }\n });\n if (!headResponse.ok) {\n console.log(\n chalk.yellow(` โ ๏ธ Warning: Unable to access download file (${headResponse.status})`)\n );\n } else {\n const fileSize = headResponse.headers['content-length'];\n if (fileSize) {\n console.log(\n chalk.gray(\n ` File size: ${Math.round((parseInt(fileSize) / 1024 / 1024) * 100) / 100} MB`\n )\n );\n }\n }\n } catch (_error) {\n console.log(chalk.yellow(` โ ๏ธ Warning: Unable to verify download file`));\n }\n\n // Create install directory\n if (!fs.existsSync(config.installDir)) {\n fs.mkdirSync(config.installDir, { recursive: true });\n console.log(chalk.gray(` Created install directory: ${config.installDir}`));\n }\n\n // Download file with retry and progress bar\n console.log(chalk.blue(` ๐ฅ Downloading...`));\n\n const tempFile = path.join(os.tmpdir(), asset.name);\n const maxRetries = 3;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 1) {\n console.log(chalk.gray(` Attempt ${attempt} to download...`));\n }\n\n await downloadWithAxios(asset.browser_download_url, tempFile);\n break;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.log(chalk.yellow(` โ ๏ธ Download failed (attempt ${attempt}): ${errorMsg}`));\n\n if (attempt === maxRetries) {\n throw new Error(`Download failed after ${maxRetries} attempts: ${errorMsg}`);\n }\n\n // Wait before retry\n console.log(chalk.gray(` Waiting ${attempt * 2} seconds before retry...`));\n await new Promise((resolve) => setTimeout(resolve, attempt * 2000));\n }\n }\n\n // Extract and install\n console.log(chalk.blue(' ๐ฆ Extracting and installing...'));\n\n const extractDir = path.join(os.tmpdir(), `extract_${Date.now()}`);\n fs.mkdirSync(extractDir, { recursive: true });\n\n if (asset.name.endsWith('.tar.gz') || asset.name.endsWith('.tgz')) {\n // Extract tar.gz / tgz\n const tarResult = await execCommand('tar', ['-xzf', tempFile, '-C', extractDir]);\n if (tarResult.code !== 0) {\n throw new Error(`Extraction failed: ${tarResult.stderr}`);\n }\n } else if (asset.name.endsWith('.tar.bz2')) {\n // Extract tar.bz2\n const tarResult = await execCommand('tar', ['-xjf', tempFile, '-C', extractDir]);\n if (tarResult.code !== 0) {\n throw new Error(`Extraction failed: ${tarResult.stderr}`);\n }\n } else if (asset.name.endsWith('.tar.xz')) {\n // Extract tar.xz\n const tarResult = await execCommand('tar', ['-xJf', tempFile, '-C', extractDir]);\n if (tarResult.code !== 0) {\n throw new Error(`Extraction failed: ${tarResult.stderr}`);\n }\n } else if (asset.name.endsWith('.zip')) {\n // Extract zip (requires unzip command)\n const unzipResult = await execCommand('unzip', ['-q', tempFile, '-d', extractDir]);\n if (unzipResult.code !== 0) {\n throw new Error(`Extraction failed: ${unzipResult.stderr}`);\n }\n } else {\n throw new Error(`Unsupported compression format: ${asset.name}`);\n }\n\n // Find binary file\n const findBinary = (dir: string): string | null => {\n const files = fs.readdirSync(dir, { withFileTypes: true });\n for (const file of files) {\n const fullPath = path.join(dir, file.name);\n if (file.isDirectory()) {\n const result = findBinary(fullPath);\n if (result) return result;\n } else if (file.name === config.binaryName || file.name === `${config.binaryName}.exe`) {\n return fullPath;\n }\n }\n return null;\n };\n\n const binaryPath = findBinary(extractDir);\n if (!binaryPath) {\n throw new Error(`Cannot find ${config.binaryName} binary in extracted files`);\n }\n\n // Copy binary to install directory\n const targetPath = path.join(\n config.installDir,\n config.binaryName + (process.platform === 'win32' ? '.exe' : '')\n );\n fs.copyFileSync(binaryPath, targetPath);\n\n // Make executable on Unix systems\n if (process.platform !== 'win32') {\n fs.chmodSync(targetPath, 0o755);\n }\n\n // Cleanup\n fs.rmSync(tempFile, { force: true });\n fs.rmSync(extractDir, { recursive: true, force: true });\n\n console.log(chalk.green(` โ
Installation completed!`));\n console.log(chalk.gray(` Location: ${targetPath}`));\n console.log(chalk.gray(` Version: ${selectedRelease.tag_name}`));\n\n // Check if install directory is in PATH\n const currentPath = process.env.PATH || '';\n if (!currentPath.includes(config.installDir)) {\n console.log(\n chalk.yellow(' โ ๏ธ Warning: Install directory is not in PATH environment variable')\n );\n\n if (process.platform === 'win32') {\n console.log(chalk.gray(` Please add to PATH: set PATH=%PATH%;${config.installDir}`));\n } else {\n // Auto-add to shell configuration file\n await autoAddToShellConfig(config.installDir);\n }\n }\n\n return true;\n } catch (error) {\n console.error(chalk.red(`โ Installation failed: ${error}`));\n return false;\n }\n}\n\n// Interactive version selection\nasync function selectVersion(toolName: string): Promise<string | null> {\n const systemInfo = getSystemInfo();\n const versions = await getAvailableVersions(toolName, systemInfo);\n\n if (versions.length === 0) {\n console.log(chalk.red(`Unable to get version information for ${toolName}`));\n return null;\n }\n\n const compatibleVersions = versions.filter((v) => v.hasCompatibleAsset).slice(0, 5);\n\n if (compatibleVersions.length === 0) {\n console.log(chalk.red(`No compatible versions found for current system`));\n return null;\n }\n\n console.log(chalk.blue(`\\n๐ Select version for ${toolName}`));\n console.log(chalk.gray(`System: ${systemInfo.platform}/${systemInfo.arch}`));\n console.log(chalk.gray(`Compatible versions (latest 5):\\n`));\n\n const choices = compatibleVersions.map((version, index) => ({\n name: `${version.version} ${index === 0 ? chalk.green('(latest)') : chalk.gray('(available)')}`,\n value: version.version,\n short: version.version\n }));\n\n try {\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'version',\n message: 'Please select a version to install:',\n choices: [\n ...choices,\n new inquirer.Separator(),\n {\n name: chalk.gray('Cancel installation'),\n value: 'cancel'\n }\n ],\n default: choices[0].value\n }\n ]);\n\n if (answer.version === 'cancel') {\n console.log(chalk.gray('Installation cancelled'));\n return null;\n }\n\n return answer.version;\n } catch (_error) {\n console.log(chalk.gray('\\nInstallation cancelled'));\n return null;\n }\n}\n\n// Check if binary exists in install directory\nfunction checkBinaryExists(toolName: string): boolean {\n const config = TOOL_CONFIGS[toolName];\n if (!config) return false;\n\n const binaryPath = path.join(\n config.installDir,\n config.binaryName + (process.platform === 'win32' ? '.exe' : '')\n );\n\n return fs.existsSync(binaryPath);\n}\n\n// Check dubhe-indexer version consistency with sui-cli\nasync function checkDubheIndexerVersionConsistency(): Promise<CheckResult> {\n try {\n const currentSuiCliVersion = packageJson.version;\n\n // Get dubhe-indexer version\n const result = await execCommand('dubhe-indexer', ['--version']);\n if (result.code !== 0) {\n return {\n name: 'Dubhe-indexer Version Consistency',\n status: 'warning',\n message: 'Cannot get dubhe-indexer version',\n fixSuggestion: 'Unable to verify version consistency'\n };\n }\n\n // Parse version from output (expected format: \"dubhe-indexer 1.2.0-pre.46\" or similar)\n const versionMatch = result.stdout.trim().match(/dubhe-indexer\\s+(\\S+)/);\n if (!versionMatch) {\n return {\n name: 'Dubhe-indexer Version Consistency',\n status: 'warning',\n message: 'Cannot parse dubhe-indexer version',\n fixSuggestion: 'Unable to verify version consistency'\n };\n }\n\n const dubheIndexerVersion = versionMatch[1];\n\n // Compare versions\n if (currentSuiCliVersion === dubheIndexerVersion) {\n return {\n name: 'Dubhe-indexer Version Consistency',\n status: 'success',\n message: `Versions match (${currentSuiCliVersion})`\n };\n } else {\n return {\n name: 'Dubhe-indexer Version Consistency',\n status: 'warning',\n message: `Version mismatch: sui-cli ${currentSuiCliVersion}, dubhe-indexer ${dubheIndexerVersion}`,\n fixSuggestion: `Consider reinstalling dubhe-indexer to match sui-cli version ${currentSuiCliVersion}`\n };\n }\n } catch (_error) {\n return {\n name: 'Dubhe-indexer Version Consistency',\n status: 'warning',\n message: 'Version check failed',\n fixSuggestion: 'Unable to verify version consistency'\n };\n }\n}\n\n// Check if command is available in PATH\nasync function checkCommand(\n command: string,\n versionFlag: string = '--version'\n): Promise<CheckResult> {\n try {\n const result = await execCommand(command, [versionFlag]);\n if (result.code === 0) {\n const version = result.stdout.trim().split('\\n')[0];\n return {\n name: command,\n status: 'success',\n message: `Installed ${version}`\n };\n } else {\n // Check if binary exists in install directory but not in PATH\n if (checkBinaryExists(command)) {\n const shell = detectCurrentShell();\n const shellConfig = shell ? shell.configFile : '~/.zshrc (or ~/.bashrc)';\n\n return {\n name: command,\n status: 'warning',\n message: 'Installed but not in PATH',\n fixSuggestion: `Binary exists in install directory. Please apply PATH changes: source ${shellConfig} (or restart terminal), then run dubhe doctor again`\n };\n }\n\n return {\n name: command,\n status: 'error',\n message: 'Not installed',\n fixSuggestion: getInstallSuggestion(command)\n };\n }\n } catch (_error) {\n // Check if binary exists in install directory but not in PATH\n if (checkBinaryExists(command)) {\n const shell = detectCurrentShell();\n const shellConfig = shell ? shell.configFile : '~/.zshrc (or ~/.bashrc)';\n\n return {\n name: command,\n status: 'warning',\n message: 'Installed but not in PATH',\n fixSuggestion: `Binary exists in install directory. Please apply PATH changes: source ${shellConfig} (or restart terminal), then run dubhe doctor again`\n };\n }\n\n return {\n name: command,\n status: 'error',\n message: 'Not installed',\n fixSuggestion: getInstallSuggestion(command)\n };\n }\n}\n\n// Get installation suggestions\nfunction getInstallSuggestion(command: string): string {\n const suggestions: Record<string, string> = {\n docker: 'Visit https://docs.docker.com/get-docker/ to install Docker',\n 'docker-compose': 'Visit https://docs.docker.com/compose/install/ to install Docker Compose',\n sui: 'Run `dubhe doctor --install sui` to auto-install, or visit https://docs.sui.io/guides/developer/getting-started/sui-install',\n 'dubhe-indexer':\n 'Run `dubhe doctor --install dubhe-indexer` to auto-install, or download from https://github.com/0xobelisk/dubhe/releases',\n pnpm: 'Run: npm install -g pnpm',\n node: 'Visit https://nodejs.org/ to download and install Node.js'\n };\n\n return suggestions[command] || `Please install ${command}`;\n}\n\n// Check Node.js version\nasync function checkNodeVersion(): Promise<CheckResult> {\n try {\n const result = await execCommand('node', ['--version']);\n if (result.code === 0) {\n const version = result.stdout.trim();\n const versionNumber = parseFloat(version.replace('v', ''));\n\n if (versionNumber >= 18) {\n return {\n name: 'Node.js Version',\n status: 'success',\n message: `${version} (meets requirement >=18.0)`\n };\n } else {\n return {\n name: 'Node.js Version',\n status: 'warning',\n message: `${version} (recommend upgrade to >=18.0)`,\n fixSuggestion: 'Please upgrade Node.js to 18.0 or higher'\n };\n }\n } else {\n return {\n name: 'Node.js Version',\n status: 'error',\n message: 'Not installed',\n fixSuggestion: 'Please install Node.js 18.0 or higher'\n };\n }\n } catch (_error) {\n return {\n name: 'Node.js Version',\n status: 'error',\n message: 'Check failed',\n fixSuggestion: 'Please install Node.js'\n };\n }\n}\n\n// Check Docker service status\nasync function checkDockerService(): Promise<CheckResult> {\n try {\n const result = await execCommand('docker', ['info']);\n if (result.code === 0) {\n return {\n name: 'Docker Service',\n status: 'success',\n message: 'Running'\n };\n } else {\n return {\n name: 'Docker Service',\n status: 'warning',\n message: 'Not running',\n fixSuggestion: 'Please start Docker service'\n };\n }\n } catch (_error) {\n return {\n name: 'Docker Service',\n status: 'error',\n message: 'Check failed',\n fixSuggestion: 'Please install and start Docker'\n };\n }\n}\n\n// Check NPM configuration\nasync function checkNpmConfig(): Promise<CheckResult> {\n try {\n const result = await execCommand('npm', ['config', 'get', 'registry']);\n if (result.code === 0) {\n const registry = result.stdout.trim();\n return {\n name: 'NPM Configuration',\n status: 'success',\n message: `Configured (${registry})`\n };\n } else {\n return {\n name: 'NPM Configuration',\n status: 'warning',\n message: 'Configuration issue',\n fixSuggestion: 'Check NPM configuration: npm config list'\n };\n }\n } catch (_error) {\n return {\n name: 'NPM Configuration',\n status: 'warning',\n message: 'Check failed',\n fixSuggestion: 'Please install Node.js and NPM'\n };\n }\n}\n\n// Check if port is available\nasync function checkPortAvailable(port: number): Promise<boolean> {\n // Check both localhost and all interfaces\n const hosts = ['127.0.0.1', '0.0.0.0'];\n\n for (const host of hosts) {\n const available = await checkPortOnHost(port, host);\n if (!available) {\n return false; // Port is occupied on this host\n }\n }\n\n return true; // Port is available on all checked hosts\n}\n\n// Check if port is available on specific host\nasync function checkPortOnHost(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n // Set a timeout to avoid hanging\n const timeout = setTimeout(() => {\n server.close();\n resolve(false); // Assume occupied if timeout\n }, 2000);\n\n // Try to bind to the port - if this fails, port is in use\n server.listen(port, host, () => {\n clearTimeout(timeout);\n server.close(() => {\n resolve(true); // Port is available on this host\n });\n });\n\n server.on('error', (err: any) => {\n clearTimeout(timeout);\n server.close();\n // If error code is EADDRINUSE, port is definitely in use\n if (err.code === 'EADDRINUSE') {\n resolve(false); // Port is in use\n } else {\n // For other errors, also assume port is not available\n resolve(false);\n }\n });\n });\n}\n\n// Check PostgreSQL port (5432)\nasync function checkPostgreSQLPort(): Promise<CheckResult> {\n try {\n const isAvailable = await checkPortAvailable(5432);\n\n if (isAvailable) {\n return {\n name: 'PostgreSQL Port (5432)',\n status: 'success',\n message: 'Available'\n };\n } else {\n return {\n name: 'PostgreSQL Port (5432)',\n status: 'warning',\n message: 'Port is occupied',\n fixSuggestion:\n 'Port 5432 is in use. Check if PostgreSQL is already running or stop the service using this port. This may cause template startup failure.'\n };\n }\n } catch (_error) {\n return {\n name: 'PostgreSQL Port (5432)',\n status: 'warning',\n message: 'Check failed',\n fixSuggestion: 'Unable to check port status'\n };\n }\n}\n\n// Check GraphQL Server port (4000)\nasync function checkGraphQLPort(): Promise<CheckResult> {\n try {\n const isAvailable = await checkPortAvailable(4000);\n\n if (isAvailable) {\n return {\n name: 'GraphQL Server Port (4000)',\n status: 'success',\n message: 'Available'\n };\n } else {\n return {\n name: 'GraphQL Server Port (4000)',\n status: 'warning',\n message: 'Port is occupied',\n fixSuggestion:\n 'Port 4000 is in use. Check if GraphQL server is already running or stop the service using this port. This may cause template startup failure.'\n };\n }\n } catch (_error) {\n return {\n name: 'GraphQL Server Port (4000)',\n status: 'warning',\n message: 'Check failed',\n fixSuggestion: 'Unable to check port status'\n };\n }\n}\n\n// Create table row data\nfunction formatTableRow(result: CheckResult): string[] {\n const statusIcon = {\n success: chalk.green('โ'),\n warning: chalk.yellow('!'),\n error: chalk.red('โ')\n };\n\n const statusText = {\n success: chalk.green('Pass'),\n warning: chalk.yellow('Warning'),\n error: chalk.red('Fail')\n };\n\n // Decide what content to display based on status\n let fixContent = '';\n if (result.status === 'success') {\n fixContent = result.message;\n } else {\n fixContent = result.fixSuggestion || result.message;\n }\n\n return [result.name, `${statusIcon[result.status]} ${statusText[result.status]}`, fixContent];\n}\n\n// Main check function\nasync function runDoctorChecks(options: {\n install?: string;\n selectVersion?: boolean;\n listVersions?: string;\n debug?: boolean;\n}) {\n console.log(chalk.bold.blue('\\n๐ Dubhe Doctor - Development Environment Checker\\n'));\n\n // Handle list-versions option\n if (options.listVersions) {\n const toolName = options.listVersions;\n if (!TOOL_CONFIGS[toolName]) {\n console.error(chalk.red(`โ Unsupported tool: ${toolName}`));\n handlerExit(1);\n }\n\n console.log(chalk.blue(`๐ Available versions for ${toolName}:`));\n const systemInfo = getSystemInfo();\n console.log(chalk.gray(`System: ${systemInfo.platform}/${systemInfo.arch}\\n`));\n\n // Get 10 versions directly to avoid duplicate calls\n const config = TOOL_CONFIGS[toolName];\n const releases = await fetchGitHubReleases(config.repo, 10);\n\n if (releases.length === 0) {\n console.log(chalk.red('Unable to get version information'));\n handlerExit(1);\n }\n\n // Process version compatibility check\n const versions = releases.map((release) => ({\n version: release.tag_name,\n hasCompatibleAsset: findCompatibleAssets(release, systemInfo).length > 0,\n publishDate: new Date(release.published_at).toLocaleDateString('en-US')\n }));\n\n const table = new Table({\n head: [\n chalk.bold.cyan('Version'),\n chalk.bold.cyan('Compatibility'),\n chalk.bold.cyan('Release Date')\n ],\n colWidths: [30, 15, 25]\n });\n\n versions.forEach((version) => {\n table.push([\n version.version,\n version.hasCompatibleAsset ? chalk.green('โ Compatible') : chalk.red('โ Incompatible'),\n version.publishDate\n ]);\n });\n\n console.log(table.toString());\n\n if (options.debug && versions.length > 0) {\n console.log(chalk.blue('\\n๐ Debug Information:'));\n const latestCompatible = versions.find((v) => v.hasCompatibleAsset);\n if (latestCompatible) {\n const release = releases.find((r) => r.tag_name === latestCompatible.version);\n if (release) {\n console.log(chalk.gray(`Latest compatible version: ${latestCompatible.version}`));\n console.log(chalk.gray(`Available asset files:`));\n release.assets.forEach((asset) => {\n console.log(chalk.gray(` - ${asset.name}`));\n });\n\n const compatibleAssets = findCompatibleAssets(release, systemInfo);\n console.log(chalk.gray(`Compatible asset files:`));\n compatibleAssets.forEach((asset) => {\n console.log(chalk.green(` โ ${asset}`));\n });\n }\n }\n }\n\n handlerExit();\n }\n\n console.log(chalk.gray('Checking your development environment...\\n'));\n\n // Handle install option\n if (options.install) {\n const toolName = options.install;\n if (!TOOL_CONFIGS[toolName]) {\n console.error(chalk.red(`โ Unsupported tool: ${toolName}`));\n console.log(chalk.gray(`Supported tools: ${Object.keys(TOOL_CONFIGS).join(', ')}`));\n handlerExit(1);\n }\n\n let version: string | null = null;\n if (options.selectVersion) {\n version = await selectVersion(toolName);\n if (!version) {\n handlerExit(1);\n }\n } else if (toolName === 'dubhe-indexer') {\n // Default to sui-cli version for dubhe-indexer\n version = packageJson.version;\n console.log(\n chalk.blue(`๐ฆ Installing dubhe-indexer version ${version} (matching sui-cli version)`)\n );\n }\n\n const success = await downloadAndInstallTool(toolName, version || undefined);\n handlerExit(success ? 0 : 1);\n }\n\n const results: CheckResult[] = [];\n\n // Execute all checks\n console.log('Running checks...\\n');\n\n // Required tools check\n const nodeCheck = await checkNodeVersion();\n results.push(nodeCheck);\n\n const pnpmCheck = await checkCommand('pnpm');\n results.push(pnpmCheck);\n\n // Package manager configuration check\n const npmConfigCheck = await checkNpmConfig();\n // Treat npm config as optional, don't affect overall status\n if (npmConfigCheck.status === 'error') {\n npmConfigCheck.status = 'warning';\n }\n results.push(npmConfigCheck);\n\n // Docker related checks\n const dockerCheck = await checkCommand('docker');\n results.push(dockerCheck);\n\n let dockerServiceCheck: CheckResult | null = null;\n if (dockerCheck.status === 'success') {\n dockerServiceCheck = await checkDockerService();\n results.push(dockerServiceCheck);\n }\n\n const dockerComposeCheck = await checkCommand('docker-compose');\n results.push(dockerComposeCheck);\n\n // Sui CLI check\n const suiCheck = await checkCommand('sui');\n results.push(suiCheck);\n\n // Dubhe indexer check\n const dubheIndexerCheck = await checkCommand('dubhe-indexer');\n results.push(dubheIndexerCheck);\n\n // Dubhe indexer version consistency check (only if basic check passed)\n if (dubheIndexerCheck.status === 'success') {\n const dubheIndexerVersionCheck = await checkDubheIndexerVersionConsistency();\n results.push(dubheIndexerVersionCheck);\n }\n\n // Port availability checks\n const postgresPortCheck = await checkPostgreSQLPort();\n results.push(postgresPortCheck);\n\n const graphqlPortCheck = await checkGraphQLPort();\n results.push(graphqlPortCheck);\n\n // Create and display table\n const table = new Table({\n head: [\n chalk.bold.cyan('Check Item'),\n chalk.bold.cyan('Result'),\n chalk.bold.cyan('Description/Fix Suggestion')\n ],\n colWidths: [25, 15, 60],\n style: {\n head: ['cyan'],\n border: ['grey']\n },\n wordWrap: true\n });\n\n // Add table rows\n results.forEach((result) => {\n table.push(formatTableRow(result));\n });\n\n console.log(table.toString());\n\n // Summarize results\n const summary = {\n success: results.filter((r) => r.status === 'success').length,\n warning: results.filter((r) => r.status === 'warning').length,\n error: results.filter((r) => r.status === 'error').length\n };\n\n console.log('\\n' + chalk.bold('๐ Check Summary:'));\n console.log(` ${chalk.green('โ Passed:')} ${summary.success} items`);\n console.log(` ${chalk.yellow('! Warning:')} ${summary.warning} items`);\n console.log(` ${chalk.red('โ Failed:')} ${summary.error} items`);\n\n // Handle dubhe-indexer version inconsistency\n const versionInconsistencyWarning = results.find(\n (r) =>\n r.name === 'Dubhe-indexer Version Consistency' &&\n r.status === 'warning' &&\n r.message.includes('Version mismatch')\n );\n\n if (versionInconsistencyWarning) {\n console.log(chalk.yellow('\\nโ ๏ธ Dubhe-indexer version inconsistency detected!'));\n console.log(chalk.gray(` ${versionInconsistencyWarning.message}`));\n\n try {\n const answer = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'reinstallDubheIndexer',\n message: 'Would you like to reinstall dubhe-indexer to match the sui-cli version?',\n default: true\n }\n ]);\n\n if (answer.reinstallDubheIndexer) {\n console.log(chalk.blue('\\n๐ฆ Reinstalling dubhe-indexer...\\n'));\n console.log(chalk.blue(`${'='.repeat(60)}`));\n console.log(chalk.blue('๐ฆ Installing dubhe-indexer...'));\n console.log(chalk.blue(`${'='.repeat(60)}`));\n\n // Get the current sui-cli version to install matching dubhe-indexer\n const success = await downloadAndInstallTool('dubhe-indexer', packageJson.version);\n\n if (success) {\n console.log(chalk.green('\\nโ
Dubhe-indexer reinstallation completed successfully!'));\n console.log(\n chalk.blue(' Please restart your terminal or run: source ~/.zshrc (or ~/.bashrc)')\n );\n console.log(chalk.blue(' Then run: dubhe doctor to verify the installation'));\n } else {\n console.log(chalk.red('\\nโ Dubhe-indexer reinstallation failed'));\n console.log(\n chalk.gray(' You can try manual installation: dubhe doctor --install dubhe-indexer')\n );\n }\n } else {\n console.log(chalk.gray('\\nVersion inconsistency ignored. You can reinstall later with:'));\n console.log(chalk.gray(' dubhe doctor --install dubhe-indexer'));\n }\n } catch (_error) {\n console.log(chalk.gray('\\nVersion inconsistency check cancelled.'));\n }\n }\n\n // Handle missing tools\n const allFailedTools = results.filter((r) => r.status === 'error');\n const autoInstallableTools = allFailedTools.filter((r) => TOOL_CONFIGS[r.name]);\n const manualInstallTools = allFailedTools.filter((r) => !TOOL_CONFIGS[r.name]);\n\n // Show manual installation suggestions for non-auto-installable tools\n if (manualInstallTools.length > 0) {\n console.log(chalk.blue('\\n๐ง Missing tools that require manual installation:'));\n manualInstallTools.forEach((tool) => {\n console.log(` ${chalk.red('โ')} ${tool.name}: ${tool.fixSuggestion || tool.message}`);\n });\n }\n\n // Auto-install missing tools that support it\n if (autoInstallableTools.length > 0) {\n // Check if any of the tools are already installed in the install directory\n const alreadyInstalledTools = autoInstallableTools.filter((tool) =>\n checkBinaryExists(tool.name)\n );\n const notInstalledTools = autoInstallableTools.filter((tool) => !checkBinaryExists(tool.name));\n\n if (alreadyInstalledTools.length > 0) {\n const installedNames = alreadyInstalledTools.map((tool) => tool.name).join(', ');\n const installDir = TOOL_CONFIGS[alreadyInstalledTools[0].name]?.installDir || '~/.dubhe/bin';\n const shell = detectCurrentShell();\n const shellConfig = shell ? shell.configFile : '~/.zshrc (or ~/.bashrc)';\n\n console.log(chalk.yellow(`\\nโ ๏ธ Tools already installed but not in PATH: ${installedNames}`));\n console.log(chalk.gray(` Location: ${installDir}`));\n console.log(chalk.blue(' To fix this, apply PATH changes:'));\n console.log(chalk.green(` source ${shellConfig}`));\n console.log(chalk.blue(' Or restart your terminal, then run: dubhe doctor'));\n console.log(\n chalk.gray(\n ` If you want to reinstall, remove the files from ${installDir} and run dubhe doctor again`\n )\n );\n }\n\n if (notInstalledTools.length > 0) {\n const notInstalledNames = notInstalledTools.map((tool) => tool.name).join(', ');\n console.log(chalk.blue(`\\n๐ Auto-installable tools detected: ${notInstalledNames}`));\n\n try {\n const answer = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'installAll',\n message: `Would you like to automatically install these tools? (${notInstalledNames})`,\n default: true\n }\n ]);\n\n if (answer.installAll) {\n console.log(chalk.blue('\\n๐ฆ Starting installation of auto-installable tools...\\n'));\n\n let installationResults: Array<{ name: string; success: boolean }> = [];\n\n for (const tool of notInstalledTools) {\n console.log(chalk.blue(`${'='.repeat(60)}`));\n console.log(chalk.blue(`๐ฆ Installing ${tool.name}...`));\n console.log(chalk.blue(`${'='.repeat(60)}`));\n\n // Use sui-cli version for dubhe-indexer\n const installVersion = tool.name === 'dubhe-indexer' ? packageJson.version : undefined;\n if (tool.name === 'dubhe-indexer') {\n console.log(\n chalk.blue(` Using version ${installVersion} (matching sui-cli version)`)\n );\n }\n\n const success = await downloadAndInstallTool(tool.name, installVersion);\n installationResults.push({ name: tool.name, success });\n\n if (success) {\n console.log(chalk.green(`\\nโ
${tool.name} installation completed successfully!`));\n } else {\n console.log(chalk.red(`\\nโ ${tool.name} installation failed`));\n console.log(\n chalk.gray(` Manual installation: dubhe doctor --install ${tool.name}`)\n );\n }\n console.log(''); // Add spacing between tools\n }\n\n // Show installation summary\n console.log(chalk.blue(`${'='.repeat(60)}`));\n console.log(chalk.bold('๐ Installation Summary:'));\n console.log(chalk.blue(`${'='.repeat(60)}`));\n\n installationResults.forEach((result) => {\n const status = result.success ? chalk.green('โ
Success') : chalk.red('โ Failed');\n console.log(` ${result.name}: ${status}`);\n });\n\n const successCount = installationResults.filter((r) => r.success).length;\n const failureCount = installationResults.length - successCount;\n\n console.log(\n `\\n ${chalk.green('Successful:')} ${successCount}/${installationResults.length}`\n );\n if (failureCount > 0) {\n console.log(` ${chalk.red('Failed:')} ${failureCount}/${installationResults.length}`);\n }\n\n // Check if any tools were successfully installed\n if (successCount > 0) {\n const shell = detectCurrentShell();\n const shellConfig = shell ? shell.configFile : '~/.zshrc (or ~/.bashrc)';\n\n console.log(chalk.blue('\\n๐ Next Steps:'));\n console.log(chalk.yellow(' 1. Apply PATH changes by running:'));\n console.log(chalk.green(` source ${shellConfig}`));\n console.log(chalk.yellow(' 2. Or restart your terminal'));\n console.log(chalk.yellow(' 3. Then run the doctor check again:'));\n console.log(chalk.green(' dubhe doctor'));\n console.log(\n chalk.gray('\\n This will verify that all tools are properly configured.')\n );\n } else {\n console.log(\n chalk.red('\\nโ All installations failed. Please check the error messages above.')\n );\n }\n } else {\n console.log(\n chalk.gray('\\nAuto-installation skipped. You can install them manually later:')\n );\n notInstalledTools.forEach((tool) => {\n console.log(chalk.gray(` dubhe doctor --install ${tool.name}`));\n });\n }\n } catch (_error) {\n console.log(chalk.gray('\\nInstallation cancelled. You can install them manually later:'));\n notInstalledTools.forEach((tool) => {\n console.log(chalk.gray(` dubhe doctor --install ${tool.name}`));\n });\n }\n }\n }\n\n // If no auto-installable tools are missing, show final status\n if (autoInstallableTools.length === 0) {\n if (summary.error > 0) {\n console.log(\n chalk.red(\n '\\nโ Your environment has some issues. Please fix them according to the suggestions above.'\n )\n );\n handlerExit(1);\n } else if (summary.warning > 0) {\n console.log(\n chalk.yellow(\n '\\nโ ๏ธ Your environment is basically ready, but we recommend fixing the warnings for better development experience.'\n )\n );\n } else {\n console.log(\n chalk.green('\\nโ
Congratulations! Your development environment is fully ready!')\n );\n }\n }\n\n console.log(\n chalk.gray(\n '\\n๐ก Tip: For more help, visit https://docs.sui.io/ or https://github.com/0xobelisk/dubhe'\n )\n );\n}\n\nconst commandModule: CommandModule = {\n command: 'doctor',\n describe: 'Check if local development environment is ready',\n builder(yargs) {\n return yargs\n .option('install', {\n type: 'string',\n describe: 'Auto-install specified tool (sui, dubhe-indexer)',\n choices: Object.keys(TOOL_CONFIGS)\n })\n .option('select-version', {\n type: 'boolean',\n default: false,\n describe: 'Select specific version for installation'\n })\n .option('list-versions', {\n type: 'string',\n describe: 'List available versions for specified tool',\n choices: Object.keys(TOOL_CONFIGS)\n })\n .option('debug', {\n type: 'boolean',\n default: false,\n describe: 'Show detailed debug information'\n });\n },\n async handler(argv) {\n try {\n await runDoctorChecks({\n install: argv.install as string | undefined,\n selectVersion: argv['select-version'] as boolean,\n listVersions: argv['list-versions'] as string | undefined,\n debug: argv.debug as boolean\n });\n } catch (error) {\n console.error(chalk.red('Error occurred during check:'), error);\n handlerExit(1);\n }\n }\n};\n\nexport default commandModule;\n","{\n \"name\": \"@0xobelisk/sui-cli\",\n \"version\": \"1.2.0-pre.112\",\n \"description\": \"Tookit for interacting with move eps framework\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-cli#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"team@obelisk.build\",\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./dist/index.js\"\n },\n \"types\": \"src/index.ts\",\n \"bin\": {\n \"dubhe\": \"./dist/dubhe.js\"\n },\n \"scripts\": {\n \"build\": \"pnpm run type-check && pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/dubhe.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest run\",\n \"test:all\": \"pnpm test && pnpm test:integration\",\n \"test:coverage\": \"vitest run --coverage\",\n \"test:integration\": \"vitest run --config vitest.integration.config.ts\",\n \"test:localnet\": \"vitest run --config vitest.integration.config.ts tests/integration/localnet.test.ts\",\n \"test:testnet\": \"vitest run --config vitest.integration.config.ts tests/integration/testnet.test.ts\",\n \"test:watch\": \"vitest\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"@0xobelisk/sui-client\": \"workspace:*\",\n \"@0xobelisk/sui-common\": \"workspace:*\",\n \"@mysten/sui\": \"1.35.0\",\n \"@types/wait-on\": \"^5.3.4\",\n \"axios\": \"^1.12.0\",\n \"chalk\": \"^5.0.1\",\n \"child_process\": \"^1.0.2\",\n \"chokidar\": \"^3.5.3\",\n \"cli-progress\": \"^3.12.0\",\n \"cli-table3\": \"^0.6.5\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"execa\": \"^7.0.0\",\n \"glob\": \"^8.0.3\",\n \"http-proxy-agent\": \"^7.0.2\",\n \"https-proxy-agent\": \"^7.0.6\",\n \"inquirer\": \"^9.2.15\",\n \"ora\": \"^5.4.1\",\n \"path\": \"^0.12.7\",\n \"typescript\": \"^5.8.3\",\n \"wait-on\": \"^7.0.1\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/cli-progress\": \"^3.11.5\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/inquirer\": \"^9.0.7\",\n \"@types/node\": \"^22.16.0\",\n \"@types/yargs\": \"^17.0.10\",\n \"eslint\": \"^9.0.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\",\n \"ts-node\": \"^10.9.1\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"0.31.4\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","// Better download implementation using axios\nimport chalk from 'chalk';\nimport * as cliProgress from 'cli-progress';\nimport * as fs from 'fs';\nimport axios from 'axios';\n\n/**\n * Download file using axios\n */\nexport async function downloadWithAxios(url: string, outputPath: string): Promise<void> {\n try {\n const response = await axios.get(url, {\n responseType: 'stream',\n timeout: 30000,\n headers: { 'User-Agent': 'dubhe-cli' },\n maxRedirects: 5,\n validateStatus: (status) => status < 400 // Accept all status codes < 400\n });\n\n await streamToFile(response, outputPath);\n console.log(chalk.green(` โ Successfully downloaded`));\n } catch (error: any) {\n // Handle specific network error cases with more descriptive messages\n if (error.code === 'ENOTFOUND') {\n throw new Error(\n `DNS resolution failed: ${error.message}. Please check your internet connection.`\n );\n } else if (error.code === 'ECONNRESET') {\n throw new Error(`Connection reset: ${error.message}. Please check your network connection.`);\n } else if (error.code === 'ETIMEDOUT') {\n throw new Error(\n `Connection timeout: ${error.message}. Please check your network connection.`\n );\n } else if (error.message.includes('protocol mismatch')) {\n throw new Error(\n `Protocol mismatch: ${error.message}. Please check your network configuration.`\n );\n } else if (error.response) {\n throw new Error(`HTTP ${error.response.status}: ${error.response.statusText}`);\n } else {\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Download failed: ${errorMsg}`);\n }\n }\n}\n\n/**\n * Stream response data to file with progress bar\n */\nasync function streamToFile(response: any, outputPath: string): Promise<void> {\n const totalSize = parseInt(response.headers['content-length'] || '0');\n\n // Create progress bar\n const progressBar = new cliProgress.SingleBar({\n format:\n chalk.cyan('Download Progress') +\n ' |{bar}| {percentage}% | {value}/{total} MB | Speed: {speed} MB/s | ETA: {eta}s',\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n barsize: 30,\n forceRedraw: true\n });\n\n if (totalSize > 0) {\n progressBar.start(Math.round((totalSize / 1024 / 1024) * 100) / 100, 0, {\n speed: '0.00'\n });\n } else {\n console.log(chalk.blue('๐ฅ Downloading... (unable to get file size)'));\n }\n\n const writer = fs.createWriteStream(outputPath);\n let downloadedBytes = 0;\n const startTime = Date.now();\n\n return new Promise((resolve, reject) => {\n response.data.on('data', (chunk: Buffer) => {\n downloadedBytes += chunk.length;\n\n if (totalSize > 0) {\n const downloadedMB = Math.round((downloadedBytes / 1024 / 1024) * 100) / 100;\n const elapsedTime = (Date.now() - startTime) / 1000;\n const speed = elapsedTime > 0 ? Math.round((downloadedMB / elapsedTime) * 100) / 100 : 0;\n\n progressBar.update(downloadedMB, {\n speed: speed.toFixed(2)\n });\n }\n });\n\n response.data.pipe(writer);\n\n writer.on('finish', () => {\n if (totalSize > 0) {\n progressBar.stop();\n }\n\n const totalMB = Math.round((downloadedBytes / 1024 / 1024) * 100) / 100;\n const elapsedTime = (Date.now() - startTime) / 1000;\n const avgSpeed = elapsedTime > 0 ? Math.round((totalMB / elapsedTime) * 100) / 100 : 0;\n\n console.log(\n chalk.green(`โ Download completed! ${totalMB} MB, average speed: ${avgSpeed} MB/s`)\n );\n resolve();\n });\n\n writer.on('error', (error) => {\n if (totalSize > 0) {\n progressBar.stop();\n }\n reject(error);\n });\n });\n}\n","import type { CommandModule } from 'yargs';\nimport chalk from 'chalk';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { generateConfigJson } from '../utils';\nimport fs from 'fs';\nimport { handlerExit } from './shell';\n\ntype Options = {\n 'config-path': string;\n 'output-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'convert-json',\n describe: 'Convert JSON from Dubhe config to config.json',\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n description: 'Options to pass to forge test'\n },\n 'output-path': {\n type: 'string',\n default: 'dubhe.config.json',\n description: 'Output path for the config.json file'\n }\n });\n },\n\n async handler({ 'config-path': configPath, 'output-path': outputPath }) {\n try {\n console.log('๐ Running convert json');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const schemaJson = JSON.parse(generateConfigJson(dubheConfig));\n\n // Preserve runtime fields written by publishHandler (package IDs, checkpoint, etc.)\n // so that re-running convert-json after publish does not wipe deployment info.\n const RUNTIME_FIELDS = [\n 'original_package_id',\n 'dubhe_object_id',\n 'original_dubhe_package_id',\n 'start_checkpoint'\n ];\n let existing: Record<string, unknown> = {};\n if (fs.existsSync(outputPath)) {\n try {\n existing = JSON.parse(fs.readFileSync(outputPath, 'utf-8'));\n } catch {\n // ignore parse errors โ start fresh\n }\n }\n const merged: Record<string, unknown> = { ...schemaJson };\n for (const field of RUNTIME_FIELDS) {\n if (existing[field] !== undefined) {\n merged[field] = existing[field];\n }\n }\n\n fs.writeFileSync(outputPath, JSON.stringify(merged, null, 2));\n } catch (error: any) {\n console.error(chalk.red('Error executing convert json:'));\n console.log(error.stdout);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { upgradeHandler } from '../utils/upgradeHandler';\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { handlerExit } from './shell';\nimport { getDefaultNetwork } from '../utils';\nimport chalk from 'chalk';\n\ntype Options = {\n network: any;\n 'config-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: 'upgrade',\n\n describe: 'Upgrade your move contracts',\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet', 'default'],\n default: 'default',\n desc: 'Network of the node (mainnet/testnet/devnet/localnet)'\n },\n 'config-path': {\n type: 'string',\n default: 'dubhe.config.ts',\n decs: 'Path to the config file'\n }\n });\n },\n\n async handler({ network, 'config-path': configPath }) {\n try {\n if (network == 'default') {\n network = await getDefaultNetwork();\n console.log(chalk.yellow(`Use default network: [${network}]`));\n }\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await upgradeHandler(dubheConfig, dubheConfig.name, network);\n } catch (error: any) {\n logError(error);\n handlerExit(1);\n }\n handlerExit();\n }\n};\n\nexport default commandModule;\n","import { CommandModule } from 'yargs';\n\nimport localnode from './localnode';\nimport faucet from './faucet';\nimport schemagen from './schemagen';\nimport publish from './publish';\nimport test from './test';\nimport build from './build';\nimport hello from './hello';\nimport generateKey from './generateKey';\nimport checkBalance from './checkBalance';\nimport configStore from './configStore';\nimport watch from './watch';\nimport wait from './wait';\nimport switchEnv from './switchEnv';\nimport info from './info';\nimport loadMetadata from './loadMetadata';\nimport doctor from './doctor';\nimport convertJson from './convertJson';\nimport upgrade from './upgrade';\nimport shell from './shell';\n\nexport const commands: CommandModule<any, any>[] = [\n localnode,\n publish,\n // call,\n // query,\n faucet,\n schemagen,\n upgrade,\n test,\n build,\n hello,\n generateKey,\n checkBalance,\n configStore,\n watch,\n wait,\n switchEnv,\n info,\n loadMetadata,\n doctor,\n convertJson,\n shell\n];\n"],"mappings":"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","names":["yargs","hideBin","chalk","execSync","spawn","chalk","chalk","printDubhe","Transaction","execSync","chalk","fsAsync","mkdirSync","writeFileSync","dirname","pathJoin","SUI_PRIVATE_KEY_PREFIX","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","DubheCliError","UpgradeError","logError","error","ValidationError","chalk","ZodError","validationError","fromZodError","NotInsideProjectError","DubheCliError","fs","chalk","spawn","Dubhe","loadMetadata","TESTNET_DUBHE_HUB_OBJECT_ID","TESTNET_ORIGINAL_DUBHE_PACKAGE_ID","validatePrivateKey","privateKey","SUI_PRIVATE_KEY_PREFIX","strippedPrivateKey","getDeploymentJson","projectPath","network","data","error","getDeploymentDappHub","getDubheDappHub","contractPath","TESTNET_DUBHE_HUB_OBJECT_ID","getOriginalDubhePackageId","TESTNET_ORIGINAL_DUBHE_PACKAGE_ID","getOldPackageId","getOnchainResources","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getUpgradeCap","projectPath","network","getDeploymentJson","getStartCheckpoint","saveContractData","projectName","startCheckpoint","packageId","dappHub","upgradeCap","version","resources","enums","DeploymentData","path","storeDeploymentData","writeOutput","saveMetadata","metadata","loadMetadata","metadataJson","error","chalk","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","readPublishedToml","packagePath","filePath","pathJoin","content","result","sectionRegex","match","env","body","getValue","key","m","versionMatch","writePublishedToml","entries","entry","updatePublishedToml","network","chainId","packageId","originalId","version","existing","getPublishedTomlEntry","clearPublishedTomlEntry","restorePublishedTomlEntry","getEphemeralPubFilePath","contractsDir","updateEphemeralPubFile","pubfilePath","buildEnv","currentBuildEnv","currentChainId","chainIdMatch","fileChainId","blockRegex","blockMatch","block","get","srcMatch","src","idx","e","checkRpcAvailability","rpcUrl","response","addEnv","rpcMap","resolve","reject","errorOutput","stdoutOutput","suiProcess","spawn","data","error","chalk","code","signal","finalError","envsJSON","getDefaultNetwork","_","currentAlias","switchEnv","delay","ms","loadKey","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","initializeDubhe","metadata","Dubhe","generateConfigJson","config","resources","name","resource","fields","keys","offchain","fieldEntries","orderedFields","fieldName","fieldType","enums","enumFields","sortedFields","b","value","updateMoveTomlAddress","path","packageAddress","moveTomlPath","updatedContent","updateGenesisUpgradeFunction","tables","genesisPath","genesisContent","separatorRegex","registerTablesCode","table","newContent","fs","path","patchMoveTomlWithLocalnetEnv","moveTomlPath","chainId","content","updatedContent","removeEnvContent","filePath","networkType","regex","updateEnvFile","operation","publishedId","envFilePath","envContent","envLines","networkSectionIndex","line","config","i","key","value","part","updatedSection","newEnvContent","buildContract","projectPath","network","pubfilePath","modules","dependencies","buildEnvFlag","buildResult","execSync","error","chalk","waitForNode","dubhe","address","coins","balance","sum","coin","publishContract","dubheConfig","gasBudget","force","getEphemeralPubFilePath","contractPublishedTomlPath","savedContractPublishedToml","savedContractPublishedEntry","entry","getPublishedTomlEntry","clearPublishedTomlEntry","dubhePublishedTomlPath","savedDubhePublishedToml","contractMoveTomlPath","dubheMoveTomlPath","savedContractMoveToml","savedDubheMoveToml","restorePublishedTomlEntry","tx","Transaction","upgradeCap","result","version","packageId","dappHub","resources","enums","upgradeCapId","startCheckpoint","printObjects","object","updatePublishedToml","delay","deployHookTx","args","dubheDappHub","getDubheDappHub","deployHookResult","saveContractData","saveMetadata","getOriginalDubhePackageId","checkDubheFramework","publishDubheFramework","cwd","updateMoveTomlAddress","publishedTomlPath","savedPublishedTomlContent","savedMoveTomlContent","updateEphemeralPubFile","publishHandler","switchEnv","initializeDubhe","Transaction","UpgradePolicy","execSync","chalk","fs","path","replaceEnvField","filePath","networkType","field","newValue","envFilePath","envLines","networkSectionIndex","line","fieldIndex","previousValue","i","newEnvContent","upgradeHandler","config","name","network","switchEnv","projectPath","dubhe","initializeDubhe","oldVersion","getVersion","oldPackageId","getOldPackageId","upgradeCap","getUpgradeCap","startCheckpoint","getStartCheckpoint","dappHub","getDubheDappHub","onchainResources","getOnchainResources","pendingMigration","key","value","tables","migration","updateGenesisUpgradeFunction","original_published_id","savedPublishedEntry","clearPublishedTomlEntry","cwd","dubheProjectPath","dubheEntry","readPublishedToml","pubfilePath","getEphemeralPubFilePath","dubheUpgradeCap","updateEphemeralPubFile","modules","dependencies","digest","buildCmd","extractedModules","extractedDependencies","extractedDigest","execSync","error","restorePublishedTomlEntry","UpgradeError","tx","Transaction","ticket","UpgradePolicy","receipt","result","chalk","newPackageId","object","existingEntry","chainId","updatePublishedToml","saveContractData","resolve","migrateTx","newVersion","Dubhe","fs","stopLocalNode","chalk","processStopped","execSync","patterns","pattern","result","pids","pid","removeDirectory","dirPath","error","isSuiStartRunning","printAccounts","privateKeys","privateKey","index","keypair","spawn","handleProcessSignals","suiProcess","cleanup","startLocalNode","data_dir","force","delay","printDubhe","args","validatePrivateKey","DubheCliError","resolve","readline","yargs","chalk","dotenv","spawn","shouldHandlerExit","SHELL_BLACKLIST_COMMANDS","handlerExit","status","parseCommandNames","commands","command","ShellCommand","yargs","network","getDefaultNetwork","chalk","commandHistory","completer","line","hits","c","rl","readline","fullCommand","parts","commandName","dubheProcess","builder","handler","yargsInstance","argv","error","availableCommands","maxCommandLength","paddedCommand","printDubhe","shell_default","commandModule","data_dir","force","startLocalNode","error","handlerExit","localnode_default","requestSuiFromFaucetV2","getFaucetHost","SuiClient","getFullnodeUrl","MAX_RETRIES","RETRY_INTERVAL","SPINNER","commandModule","yargs","network","recipient","faucet_address","initializeDubhe","retryCount","success","spinnerIndex","startTime","isInterrupted","handleInterrupt","handlerExit","requestSuiFromFaucetV2","getFaucetHost","elapsedTime","spinner","resolve","client","SuiClient","getFullnodeUrl","params","balance","faucet_default","schemaGen","loadConfig","chalk","path","commandModule","configPath","network","getDefaultNetwork","chalk","dubheConfig","loadConfig","rootDir","path","schemaGen","handlerExit","error","schemagen_default","loadConfig","execSync","chalk","commandModule","yargs","network","configPath","gasBudget","force","getDefaultNetwork","dubheConfig","loadConfig","execSync","publishHandler","error","logError","handlerExit","publish_default","execSync","loadConfig","getActiveSuiEnv","execSync","testHandler","dubheConfig","test","gasLimit","buildEnv","projectPath","command","commandModule","yargs","configPath","loadConfig","activeEnv","output","error","handlerExit","test_default","execSync","exec","nodePath","chalk","loadConfig","buildHandler","dubheConfig","network","dumpBytecodeAsBase64","cwd","projectPath","nodePath","command","execSync","commandModule","yargs","configPath","getDefaultNetwork","chalk","loadConfig","switchEnv","output","exec","error","handlerExit","build_default","commandModule","yargs","printDubhe","hello_default","Dubhe","fs","chalk","generateAccountHandler","force","useNextPublic","path","privateKey","envContent","newKeyName","lines","shouldUpdate","i","line","currentKeyName","newLine","keypair","newContent","commandModule","force","useNextPublic","generateAccountHandler","error","handlerExit","generateKey_default","chalk","dotenv","dotenv","checkBalanceHandler","network","balance","initializeDubhe","balanceInSUI","DubheCliError","chalk","error","chalk","commandModule","network","getDefaultNetwork","chalk","checkBalanceHandler","error","handlerExit","checkBalance_default","mkdirSync","writeFileSync","dirname","storeConfig","network","packageId","outputPath","dubheDappHub","getDubheDappHub","code","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","storeConfigHandler","dubheConfig","contractPath","deployment","getDeploymentJson","loadConfig","chalk","commandModule","configPath","network","outputTsPath","getDefaultNetwork","chalk","dubheConfig","loadConfig","storeConfigHandler","error","handlerExit","configStore_default","chokidar","exec","commandModule","yargs","configFilePath","runSchemagen","exec","error","stdout","stderr","watcher","chokidar","path","handlerExit","watch_default","waitOn","ora","chalk","net","withoutProxy","fn","originalProxy","key","value","checkPostgreSQLRunning","checkPortRunning","port","host","resolve","socket","net","isConnected","timeout","checkIndexerHealth","controller","response","waitForLocalnetServices","options","spinner","ora","startTime","waitOn","status","chalk","waitForLocalDatabase","waitForLocalNode","waitForLocalIndexer","commandModule","yargs","argv","hasUrl","hasLocalnet","hasLocalDatabase","hasLocalNode","hasLocalIndexer","optionCount","handlerExit","errorMessage","helpMessage","wait_default","commandModule","yargs","argv","switchEnv","handlerExit","switchEnv_default","dotenv","chalk","dotenv","InfoCommand","yargs","network","getDefaultNetwork","chalk","dubhe","initializeDubhe","keypair","balance","suiBalance","handlerExit","error","logError","info_default","loadConfig","loadMetadataHandler","dubheConfig","network","packageId","saveMetadata","projectPath","getOldPackageId","chalk","commandModule","yargs","network","configPath","packageId","getDefaultNetwork","dubheConfig","loadConfig","loadMetadataHandler","error","logError","handlerExit","loadMetadata_default","chalk","spawn","Table","inquirer","fs","path","os","net","axios","package_default","chalk","cliProgress","fs","axios","downloadWithAxios","url","outputPath","response","status","streamToFile","error","errorMsg","totalSize","progressBar","writer","downloadedBytes","startTime","resolve","reject","chunk","downloadedMB","elapsedTime","speed","totalMB","avgSpeed","getSystemInfo","platform","arch","platformForAsset","archForAsset","TOOL_CONFIGS","execCommand","command","args","resolve","child","spawn","stdout","stderr","data","code","fetchWithAxios","url","options","axiosConfig","status","response","axios","error","statusText","fetchGitHubReleases","repo","count","retries","attempt","chalk","findCompatibleAssets","release","systemInfo","asset","name","platformVariants","archVariants","platformMatch","variant","archMatch","isArchive","getAvailableVersions","toolName","config","autoAddToShellConfig","installDir","shell","detectCurrentShell","shellName","configFile","pathCommand","pathLine","homeDir","shellEnv","bashProfile","bashrc","fishConfigDir","possibleConfigs","downloadAndInstallTool","version","releases","selectedRelease","r","compatibleAssets","assetName","a","headResponse","fileSize","tempFile","maxRetries","downloadWithAxios","errorMsg","extractDir","tarResult","unzipResult","findBinary","dir","files","file","fullPath","result","binaryPath","targetPath","selectVersion","versions","compatibleVersions","v","choices","index","answer","inquirer","checkBinaryExists","checkDubheIndexerVersionConsistency","currentSuiCliVersion","package_default","versionMatch","dubheIndexerVersion","checkCommand","versionFlag","shellConfig","getInstallSuggestion","checkNodeVersion","checkDockerService","checkNpmConfig","checkPortAvailable","port","hosts","host","checkPortOnHost","server","timeout","err","checkPostgreSQLPort","checkGraphQLPort","formatTableRow","statusIcon","fixContent","runDoctorChecks","handlerExit","table","Table","latestCompatible","success","results","nodeCheck","pnpmCheck","npmConfigCheck","dockerCheck","dockerServiceCheck","dockerComposeCheck","suiCheck","dubheIndexerCheck","dubheIndexerVersionCheck","postgresPortCheck","graphqlPortCheck","summary","versionInconsistencyWarning","allFailedTools","autoInstallableTools","manualInstallTools","tool","alreadyInstalledTools","notInstalledTools","installedNames","notInstalledNames","installationResults","installVersion","successCount","failureCount","commandModule","yargs","argv","doctor_default","chalk","loadConfig","fs","commandModule","yargs","configPath","outputPath","dubheConfig","loadConfig","schemaJson","generateConfigJson","RUNTIME_FIELDS","existing","fs","merged","field","error","chalk","handlerExit","convertJson_default","loadConfig","chalk","commandModule","yargs","network","configPath","getDefaultNetwork","dubheConfig","loadConfig","upgradeHandler","error","logError","handlerExit","upgrade_default","commands","localnode_default","publish_default","faucet_default","schemagen_default","upgrade_default","test_default","build_default","hello_default","generateKey_default","checkBalance_default","configStore_default","watch_default","wait_default","switchEnv_default","info_default","loadMetadata_default","doctor_default","convertJson_default","shell_default","dotenv","yargs","hideBin","commands","package_default","msg","err","chalk","logError"]}
|