@gabrielhicks/solv 5.3.15 → 5.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../src/lib/version.ts","../src/config/constants.ts","../src/cli/update/update.ts","../src/cli/install/installAgave.ts","../src/config/getSolanaCLI.ts","../src/cli/update/index.ts","../src/config/langs.ts","../src/config/config.ts","../src/cli/update/updateSolv.ts","../src/config/jitConfig.ts","../src/cli/update/jitoUpdate.ts","../src/lib/updateJitoSolvConfig.ts","../src/cli/update/updateCommission.ts","../src/cli/setup/updateFirewall.ts","../src/cli/epochTimer/getSolvVersion.ts","../src/config/readConfig.ts","../src/config/enums.ts","../src/config/versionConfig.ts","../src/config/defaultConfig.ts","../src/lib/sendDiscord.ts","../src/cli/update/autoUpdate/index.ts","../src/cli/epochTimer/isValidatorActive.ts","../src/lib/getSolanaAddress.ts","../src/lib/sleep.ts","../src/cli/update/autoUpdate/waitCatchup.ts","../src/config/updateDefaultConfig.ts","../src/locales/en/cmds.ts","../src/locales/ja/cmds.ts","../src/locales/en/logs.ts","../src/locales/ja/logs.ts","../src/locales/en/installer.ts","../src/locales/ja/installer.ts","../src/locales/en/subCmds.ts","../src/locales/ja/subCmds.ts","../src/locales/en/client.ts","../src/locales/ja/client.ts","../src/locales/readLocale.ts","../src/lib/readOrCreateDefaultConfig.ts","../src/lib/updateSolvConfig.ts","../src/cli/get/snapshot.ts","../src/cli/update/frankendancerUpdate.ts","../src/cli/setup/rmSnapshot.ts","../src/cli/log/tail.ts","../src/cli/log/index.ts","../src/cli/setup/index.ts","../src/cli/setup/setupVoteAccount.ts","../src/lib/createSolvKeys.ts","../src/cli/setup/template/jupiter/jupiterAPISetup.ts","../src/cli/setup/template/jupiter/jupiterAPIService.ts","../src/lib/readOrCreateJitoConfig.ts","../src/lib/daemonReload.ts","../src/cli/setup/question/initialConfigSetup.ts","../src/cli/setup/askJitoSetting.ts","../src/cli/install/installJito.ts","../src/template/startupScripts/startJitoRPCScript.ts","../src/cli/setup/rpc/index.ts","../src/cli/setup/updateStartupScriptPermission.ts","../src/template/startupScripts/startRPCNodeScript.ts","../src/cli/install/installSolana.ts","../src/template/startupScripts/startJitoMainnetScript.ts","../src/template/startupScripts/startJitoTestnetScript.ts","../src/template/startupScripts/startMainnetValidatorScript.ts","../src/template/startupScripts/startTestnetAgaveValidatorScript.ts","../src/cli/setup/validator/index.ts","../src/cli/setup/setupV2.ts","../src/lib/createDirectoryIfNotExists.ts","../src/cli/setup/mkdirs.ts","../src/cli/check/mt/getLargestDisk.ts","../src/cli/setup/formatDisk.ts","../src/cli/check/ensureMountAndFiles.ts","../src/cli/check/mt/umount.ts","../src/cli/setup/mount/mountDirs.ts","../src/cli/setup/userPermissions.ts","../src/cli/setup/setupSystemd.ts","../src/template/logRotates.ts","../src/cli/setup/setupLogrotate.ts","../src/template/solvService.ts","../src/cli/setup/setupSolvService.ts","../src/cli/setup/makeServices.ts","../src/cli/setup/setupKeys.ts","../src/cli/start/startSolana.ts","../src/cli/setup/setupCpuGovernor.ts","../src/template/updateSysctlConfig.ts","../src/lib/restartLogrotate.ts","../src/lib/enableSolv.ts","../src/cli/setup/createSymLink.ts","../src/utils/rpcLog.ts","../src/cli/setup/firedancer/setupFiredancer.ts","../src/cli/setup/firedancer/startFiredancerScript.ts","../src/cli/setup/template/firedancer/firedancerService.ts","../src/cli/setup/template/firedancer/configToml.ts","../src/cli/setup/template/firedancer/portRelayService.ts","../src/template/relayerService.ts","../src/cli/setup/jitoRelayerSetup.ts","../src/cli/setup/template/geyser/yellowstoneGeyser.ts","../src/cli/setup/template/geyser/geyserConfig.ts","../src/cli/setup/template/geyser/addConfigToStartupScript.ts","../src/cli/check/df/df.ts","../src/lib/logger/table.ts","../src/cli/check/df/index.ts","../src/cli/start/index.ts","../src/cli/stop/stopSolana.ts","../src/cli/stop/index.ts","../src/cli/restart/index.ts","../src/cli/install/index.ts","../src/cli/check/mt/index.ts","../src/cli/cron/index.ts","../src/cli/cron/hasEpochTimer.ts","../src/config/solvClient.ts","../src/cli/scp/download.ts","../src/cli/scp/executeSCP.ts","../src/cli/scp/upload.ts","../src/cli/scp/create.ts","../src/cli/scp/cat.ts","../src/cli/scp/init.ts","../src/cli/scp/search.ts","../src/cli/scp/index.ts","../src/cli/scp/uploadVS.ts","../src/cli/status/index.ts","../src/cli/stake/delegateStake.ts","../src/cli/stake/stakeAccountQuestion.ts","../src/cli/stake/createStakeAccount.ts","../src/cli/stake/deactivateStake.ts","../src/cli/stake/withdrawStake.ts","../src/cli/stake/index.ts","../src/lib/solana/getStakePoolInfo.ts","../src/lib/solana/getTokenAccount.ts","../src/cli/stake/selectLST.ts","../src/cli/stake/elSOLdeposit.ts","../src/lib/solana/getOrCreateDestinationAddress.ts","../src/lib/solana/depositSOL.ts","../src/cli/stake/depositLST.ts","../src/cli/cron/getEpoch.ts","../src/cli/cron/getSlot.ts","../src/lib/logger/logger.ts","../src/cli/get/showConfig.ts","../src/cli/get/index.ts","../src/cli/relayer/relayerStatus.ts","../src/cli/relayer/relayerStart.ts","../src/cli/relayer/relayerStop.ts","../src/cli/relayer/relayerRestart.ts","../src/cli/relayer/relayerLog.ts","../src/cli/relayer/index.ts","../src/cli/relayer/relayerEnable.ts","../src/lib/solana/splBalance.ts","../src/cli/balance/index.ts","../src/lib/getSolBalance.ts","../src/cli/setup/rmLogs.ts","../src/cli/get/monitorSolana.ts","../src/cli/get/solanaCatchup.ts","../src/cli/transfer/index.ts","../src/cli/withdraw/withdraw.ts","../src/cli/withdraw/index.ts","../src/cli/harvest/collectSOL.ts","../src/cli/harvest/getHarvestBalance.ts","../src/lib/solana/getBalance.ts","../src/lib/solana/loadKeypairFromFile.ts","../src/lib/solana/solanaTransfer.ts","../src/cli/harvest/index.ts","../src/lib/solana/getElSOLBalance.ts","../src/lib/solana/transferSPLToken.ts","../src/cli/harvest/mevOn.ts","../src/cli/cron/removeCronJob.ts","../src/lib/getEpochInfo.ts","../src/lib/getAverageSlotTime.ts","../src/cli/epochTimer/epochTimer.ts","../src/cli/epochTimer/writeEpochDataToFile.ts","../src/cli/epochTimer/lessThan1Day.ts","../src/cli/epochTimer/lessThan8Hour.ts","../src/cli/epochTimer/lessThan1Hour.ts","../src/cli/epochTimer/newEpoch.ts","../src/cli/epochTimer/initEpochFile.ts","../src/cli/epochTimer/checkBalance.ts","../src/cli/epochTimer/getNpmLatestVersion.ts","../src/cli/epochTimer/isVersionSame.ts","../src/lib/getEpochInfoByRust.ts","../src/cli/epochTimer/index.ts","../src/cli/switch/index.ts","../src/cli/switch/changeIdentityIncoming.ts","../src/lib/scpSSH.ts","../src/cli/switch/checkValidatorKey.ts","../src/config/getSolanaCLIActive.ts","../src/config/getSolanaCLIAgave.ts","../src/cli/switch/getRemoteClientType.ts","../src/cli/switch/getLocalClientType.ts","../src/cli/switch/changeIdentityOutgoing.ts","../src/cli/scp/checkSSHConnection.ts","../src/cli/switch/changeIdentityIncomingV1toV2.ts","../src/cli/get/createSnapshot.ts","../src/cli/swap/index.ts","../src/config/tokenInfo.ts","../src/cli/swap/swap.ts","../src/cli/swap/getJupiterQuote.ts","../src/cli/swap/postJupiterSwap.ts","../src/cli/jupiter/jupiterStatus.ts","../src/cli/jupiter/jupiterStart.ts","../src/cli/jupiter/jupiterStop.ts","../src/cli/jupiter/jupiterRestart.ts","../src/cli/jupiter/jupiterLog.ts","../src/cli/jupiter/jupiterEnable.ts","../src/cli/jupiter/index.ts","../src/cli/epochTimer/getSolanaVersion.ts"],"sourcesContent":["import 'dotenv/config'\nimport { Command } from 'commander'\nimport { VERSION } from '@/lib/version'\nimport {\n logCommands,\n startCommand,\n stopCommand,\n updateCommands,\n stakeCommands,\n setupCommands,\n restartCommand,\n installCommands,\n cronCommands,\n statusCommands,\n scpCommands,\n getCommands,\n mountCommands,\n relayerCommands,\n dfCommands,\n} from '@/cli'\nimport { balanceCommands } from './cli/balance'\nimport { rmLogs } from './cli/setup/rmLogs'\nimport { rmSnapshot } from './cli/setup/rmSnapshot'\nimport { monitorSolana } from './cli/get/monitorSolana'\nimport { solanaCatchup } from './cli/get/solanaCatchup'\nimport { showConfig } from './cli/get/showConfig'\nimport { transferCommands } from './cli/transfer'\nimport { withdrawCommands } from './cli/withdraw'\nimport { harvestCommands } from './cli/harvest'\nimport { epochTimerCommands } from './cli/epochTimer'\nimport { switchCommand } from './cli/switch'\nimport createSnapshot from './cli/get/createSnapshot'\nimport { swapCommand } from './cli/swap'\nimport readConfig from './config/readConfig'\nimport { jupiterCommands } from './cli/jupiter'\nimport chalk from 'chalk'\nimport getSolanaVersion from './cli/epochTimer/getSolanaVersion'\n\nexport const program = new Command()\nprogram\n .name('solv')\n .description(`🪄 solv - Solana Validator Tool ✨`)\n .helpOption('-h, --help', `Display help for command`)\n .version(VERSION, '-V', `Display version`)\n\nasync function main() {\n try {\n // This config will be new config file - solv4.config.json\n const config = await readConfig()\n\n startCommand(config)\n restartCommand(config)\n stopCommand(config)\n statusCommands(config)\n updateCommands(config)\n logCommands()\n installCommands(config)\n stakeCommands(config)\n getCommands(config)\n scpCommands()\n cronCommands()\n setupCommands(config)\n balanceCommands(config)\n mountCommands()\n relayerCommands()\n transferCommands(config)\n withdrawCommands(config)\n harvestCommands(config)\n dfCommands()\n swapCommand(program, config)\n epochTimerCommands(config)\n switchCommand(program, config)\n jupiterCommands()\n\n program\n .command('rm:log')\n .description('Remove Logs')\n .action(() => {\n rmLogs()\n })\n\n program\n .command('rm:snapshot')\n .description('Remove Snapshot')\n .action(() => {\n rmSnapshot(config)\n })\n\n program\n .command('create:snapshot')\n .description('Create Snapshot')\n .option('-s, --slot <slot>', 'Slot', '306450862')\n .option('-l, --ledger <ledger>', 'Ledger', config.LEDGER_PATH)\n .option('-n, --snapshots <snapshots>', 'Snapshots', config.SNAPSHOTS_PATH)\n .action((options: { slot: string; ledger: string, snapshots: string }) => {\n console.log(chalk.white(`📝 Creating Snapshot...`))\n createSnapshot(options.slot, options.ledger, options.snapshots)\n })\n\n program\n .command('monitor')\n .alias('m')\n .description('Monitor Solana Node')\n .action(() => {\n monitorSolana(config)\n })\n\n program\n .command('catchup')\n .description('Check Solana Catchup Status')\n .alias('c')\n .alias('ca')\n .action(() => {\n solanaCatchup()\n })\n\n program\n .command('config')\n .description('Show Solv Config')\n .action(() => {\n showConfig(config)\n })\n\n program\n .command('vv')\n .description('Show Solv Version')\n .action(() => {\n const version = getSolanaVersion()\n console.log('version:', version)\n })\n\n await program\n .addHelpCommand('help [cmd]', 'Display help for command')\n .parseAsync(process.argv)\n process.exit(0)\n } catch (error) {\n console.log(error)\n process.exit(0)\n }\n}\n\nmain()\n","{\n \"name\": \"@gabrielhicks/solv\",\n \"version\": \"5.3.15\",\n \"description\": \"Solana Validator CLI SOLV\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"repository\": \"https://github.com/gabrielhicks/solv\",\n \"keywords\": [\n \"solana\",\n \"validator\",\n \"cli\",\n \"validator-tool\",\n \"Node.js\",\n \"web3\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"author\": \"ELSOUL LABO B.V.\",\n \"private\": false,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"solv\": \"./dist/index.js\"\n },\n \"scripts\": {\n \"test\": \"vitest\",\n \"build\": \"tsup src/index.ts && npx tsx add-line.ts\",\n \"dev\": \"nodemon\",\n \"start\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@jup-ag/api\": \"6.0.27\",\n \"@metaplex-foundation/mpl-token-metadata\": \"3.2.1\",\n \"@metaplex-foundation/umi\": \"0.9.2\",\n \"@metaplex-foundation/umi-bundle-defaults\": \"0.9.2\",\n \"@skeet-framework/utils\": \"1.3.11\",\n \"@solana/spl-stake-pool\": \"1.1.5\",\n \"@solana/spl-token\": \"0.4.8\",\n \"@solana/web3.js\": \"1.95.4\",\n \"bigint-buffer\": \"1.1.5\",\n \"bn.js\": \"5.2.1\",\n \"bs58\": \"6.0.0\",\n \"chalk\": \"5.3.0\",\n \"chalk-pipe\": \"6.1.0\",\n \"cli-progress\": \"3.12.0\",\n \"cli-spinner\": \"0.2.10\",\n \"cli-table3\": \"0.6.5\",\n \"commander\": \"12.1.0\",\n \"dotenv\": \"16.4.5\",\n \"inquirer\": \"10.2.0\",\n \"node-fetch\": \"3.3.2\",\n \"prompt\": \"1.3.0\"\n },\n \"devDependencies\": {\n \"@changesets/changelog-github\": \"0.5.0\",\n \"@changesets/cli\": \"2.27.7\",\n \"@solana-developers/helpers\": \"^2.5.6\",\n \"@swc/core\": \"1.7.21\",\n \"@types/bn.js\": \"5.1.5\",\n \"@types/cli-progress\": \"3.11.6\",\n \"@types/cli-spinner\": \"0.2.3\",\n \"@types/inquirer\": \"9.0.7\",\n \"@types/node\": \"22.5.1\",\n \"@types/node-fetch\": \"2.6.11\",\n \"@types/prompt\": \"1.1.8\",\n \"@typescript-eslint/eslint-plugin\": \"8.3.0\",\n \"@typescript-eslint/parser\": \"8.3.0\",\n \"eslint\": \"9.9.1\",\n \"eslint-config-prettier\": \"9.1.0\",\n \"nodemon\": \"3.1.7\",\n \"prettier\": \"3.3.3\",\n \"tsup\": \"8.2.4\",\n \"typescript\": \"5.5.4\",\n \"vite\": \"5.4.2\",\n \"vite-tsconfig-paths\": \"5.0.1\",\n \"vitest\": \"2.0.5\"\n }\n}","import packageJson from '../../package.json'\n\nexport const VERSION = packageJson.version\n","// WEBSITE URL\nexport const WEB_VALIDATORS_DAO = 'https://dao.validators.solutions'\nexport const WEB_VALIDATORS_SOLUTIONS = 'https://validators.solutions'\n\n// solv config Path\nexport const SOLV_CONFIG_PATH = '~/solv.config.json'\nexport const SOLV_CONFIG_FILE = 'solv.config.json'\nexport const SOLV4_CONFIG_FILE = 'solv4.config.json'\n\n// Linux System Config Files\nexport const SOL_SERVICE = '/etc/systemd/system/solv.service'\nexport const SOL_LOGROTATE = '/etc/logrotate.d/solana'\nexport const SOL_SYSTEM_CONFIG21 = '/etc/sysctl.d/21-solana-validator.conf'\nexport const SOL_NOFILES_CONF = '/etc/security/limits.d/90-solana-nofiles.conf'\nexport const SOL_SYSTEM_CONF = '/etc/systemd/system.conf'\nexport const SOLANA_PATH = '/home/solv/.local/share/solana/install'\n\n// Solana Key Names\nexport const IDENTITY_KEY = 'identity.json'\nexport const UNSTAKED_KEY = 'unstaked-identity.json'\nexport const RELAYER_KEY = 'relayer-keypair.json'\nexport const MAINNET_VALIDATOR_KEY = 'mainnet-validator-keypair.json'\nexport const MAINNET_VALIDATOR_VOTE_KEY = 'mainnet-vote-account-keypair.json'\nexport const MAINNET_VALITATOR_AUTHORITY_KEY = 'mainnet-authority-keypair.json'\nexport const TESTNET_VALIDATOR_KEY = 'testnet-validator-keypair.json'\nexport const TESTNET_VALIDATOR_VOTE_KEY = 'testnet-vote-account-keypair.json'\nexport const TESTNET_VALITATOR_AUTHORITY_KEY = 'testnet-authority-keypair.json'\n\n// Validayor Key Paths\nexport const SOLV_HOME = '/home/solv'\nexport const IDENTITY_KEY_PATH = `${SOLV_HOME}/${IDENTITY_KEY}`\nexport const UNSTAKED_KEY_PATH = `${SOLV_HOME}/${UNSTAKED_KEY}`\nexport const MAINNET_VALIDATOR_KEY_PATH = `${SOLV_HOME}/${MAINNET_VALIDATOR_KEY}`\nexport const MAINNET_VALIDATOR_VOTE_KEY_PATH = `${SOLV_HOME}/${MAINNET_VALIDATOR_VOTE_KEY}`\nexport const MAINNET_VALITATOR_AUTHORITY_KEY_PATH = `${SOLV_HOME}/${MAINNET_VALITATOR_AUTHORITY_KEY}`\nexport const TESTNET_VALIDATOR_KEY_PATH = `${SOLV_HOME}/${TESTNET_VALIDATOR_KEY}`\nexport const TESTNET_VALIDATOR_VOTE_KEY_PATH = `${SOLV_HOME}/${TESTNET_VALIDATOR_VOTE_KEY}`\nexport const TESTNET_VALITATOR_AUTHORITY_KEY_PATH = `${SOLV_HOME}/${TESTNET_VALITATOR_AUTHORITY_KEY}`\n\n// Log Path\nexport const LOG_PATH = `${SOLV_HOME}/solana-validator.log`\n\n// Startup Script Path\nexport const STARTUP_SCRIPT = SOLV_HOME + '/start-validator.sh'\n\n// Ledger, Account, Snapshots Paths\nexport const LEDGER_PATH = '/mnt/ledger'\nexport const ACCOUNTS_PATH = '/mnt/accounts'\nexport const SNAPSHOTS_PATH = '/mnt/snapshots'\n\n// SOLANA VALIDATOR CLI\nexport const SOLANA_VALIDATOR = 'solana-validator'\nexport const AGAVE_VALIDATOR = 'agave-validator'\n\nexport const DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY =\n 'ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG'\n\nexport const EPOCH_TIMER_FILE_PATH = '/home/solv/currentEpoch.json'\nexport const MINIMUM_VALIDATOR_BALANCE = 0.5\nexport const MAX_RETRIES = 3\n\n// Endpoint\nexport const SOLANA_TESTNET_RPC_URL = 'https://api.testnet.solana.com'\nexport const SOLANA_MAINNET_RPC_URL = 'https://api.mainnet-beta.solana.com'\nexport const VS_UPLOAD_ENDPOINT =\n 'https://verify.validators.solutions/solv-migrate'\nexport const JUPITER_ENDPOINT = 'https://jup.validators.solutions/v1/jup'\n\nexport enum SWAP_TOKEN {\n SOL = 'SOL',\n USDC = 'USDC',\n elSOL = 'elSOL',\n JitoSOL = 'JitoSOL',\n mSOL = 'mSOL',\n bSOL = 'bSOL',\n EPCT = 'EPCT',\n JUP = 'JUP',\n BONK = 'BONK',\n JTO = 'JTO',\n}\n\nexport const SWAP_TOKENS = Object.values(SWAP_TOKEN)\n\n// SPL Token Mint\nexport const SOL_TOKEN_MINT = 'So11111111111111111111111111111111111111112'\nexport const USDC_TOKEN_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'\nexport const ELSOL_TOKEN_MINT = 'ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC'\nexport const EPCT_TOKEN_MINT = 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP'\nexport const SOLV_SWAP = 'SOLV420'\n\nexport const AssociationAccount = {\n So11111111111111111111111111111111111111112:\n '4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra',\n EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:\n 'J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj',\n J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:\n 'HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a',\n mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:\n '8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9',\n bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:\n '782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH',\n CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:\n 'BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB',\n JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:\n '212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg',\n DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:\n '61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U',\n jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:\n '2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo',\n}\n","import { LEDGER_PATH } from '@/config/constants'\nimport { spawnSync } from 'child_process'\nimport installAgave from '../install/installAgave'\nimport getSolanaCLI from '@/config/getSolanaCLI'\n\nexport const updateVersion = async (version: string, mod = false) => {\n installAgave(version, mod)\n return\n}\n\nexport const monitorUpdate = async (\n maxDelinquentStake: number,\n noMonitor = false,\n minIdleTime = 10,\n) => {\n const solanaValidatorClient = getSolanaCLI()\n let cmd = `${solanaValidatorClient} --ledger ${LEDGER_PATH} exit --max-delinquent-stake ${maxDelinquentStake} --monitor --min-idle-time ${minIdleTime}`\n if (noMonitor) {\n cmd = `${solanaValidatorClient} --ledger ${LEDGER_PATH} exit --max-delinquent-stake ${maxDelinquentStake} --min-idle-time ${minIdleTime}`\n }\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\n// Agave Install e.g. installAgave('0.1.0')\nconst installAgave = (version: string, mod = false) => {\n if(mod) {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${version}-agave-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${version}-agave-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/${version}-agave-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${version}-agave-mod checkout ${version}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git -C /tmp/${version}-agave-mod submodule update --init --recursive`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${version}-agave-mod rev-parse HEAD) /tmp/${version}-agave-mod/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${version}-agave-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${version}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${version}-agave-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n } else {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${version}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${version} checkout ${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${version} submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${version} rev-parse HEAD) /tmp/${version}/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${version}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${version}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n spawnSync(`sudo rm -rf /tmp/${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n}\n\nexport default installAgave\n","const AGAVE_CLI = 'agave-validator'\n\nconst getSolanaCLI = () => {\n try {\n return AGAVE_CLI\n } catch (error) {\n console.error(error)\n return AGAVE_CLI\n }\n}\nexport default getSolanaCLI\n","import { program } from '@/index'\nimport { monitorUpdate, updateVersion } from './update'\nimport chalk from 'chalk'\nimport { updateSolv } from './updateSolv'\nimport { jitoUpdate } from './jitoUpdate'\nimport { updateJitoSolvConfig } from '@/lib/updateJitoSolvConfig'\nimport { updateCommission, updateCommissionAsk } from './updateCommission'\nimport { updateFirewall } from '../setup/updateFirewall'\nimport autoUpdate from './autoUpdate'\nimport getSolvVersion from '../epochTimer/getSolvVersion'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport {\n MNT_DISK_TYPE,\n Network,\n NodeType,\n RpcType,\n ValidatorType,\n} from '@/config/enums'\nimport {\n DELINQUENT_STAKE_MAINNET,\n DELINQUENT_STAKE_TESTNET,\n VERSION_FIREDANCER,\n VERSION_FIREDANCER_TESTNET,\n VERSION_JITO_MAINNET,\n VERSION_JITO_RPC,\n VERSION_JITO_TESTNET,\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport { readOrCreateDefaultConfig } from '@/lib/readOrCreateDefaultConfig'\nimport { MAINNET_TYPES, NETWORK_TYPES, SOLV_TYPES } from '@/config/config'\nimport { getSnapshot } from '../get/snapshot'\nimport { frankendancerUpdate } from './frankendancerUpdate'\nimport { rmSnapshot } from '../setup/rmSnapshot'\n\nexport * from './update'\n\nexport type UpdateOptions = {\n version: string\n background: boolean\n commission: number\n firewall: boolean\n config: boolean\n migrateConfig: boolean\n auto: boolean\n mod: boolean\n}\n\nexport const updateCommands = (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n const isJito = config.VALIDATOR_TYPE === ValidatorType.JITO\n const isFrankendancer = config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n const isAutoRestart = config.AUTO_RESTART\n const isModded = config.MOD\n let minIdleTime = 10\n if (isAutoRestart && !isTestnet) {\n minIdleTime = 30\n }\n let version = isTestnet ? VERSION_TESTNET : VERSION_MAINNET\n if (isJito) {\n version = VERSION_JITO_MAINNET\n if (isTestnet) {\n version = VERSION_JITO_TESTNET\n }\n }\n if (isFrankendancer) {\n version = VERSION_FIREDANCER\n if(isTestnet) {\n version = VERSION_FIREDANCER_TESTNET\n }\n }\n if (isRPC) {\n version = VERSION_SOLANA_RPC\n if (isJito) {\n version = VERSION_JITO_RPC\n }\n }\n program\n .command('update')\n .alias('u')\n .description('Update Command')\n .option('-v, --version <version>', `Solana Version e.g ${version}`, version)\n .option('-b, --background', 'No Monitor Delinquent Stake Update', false)\n .option('-c, --commission', 'Update Commission', false)\n .option('-f, --firewall', 'Update Firewall', false)\n .option('--migrate-config', 'Migrate Solv Config', false)\n .option('--config', 'Update Solv Config Default Solana Version', false)\n .option('--auto', 'Auto Update', false)\n .option('--mod', 'Modified Versions', false)\n .action(async (options: UpdateOptions) => {\n const solvVersion = getSolvVersion()\n const deliquentStake = isTestnet\n ? config.TESTNET_DELINQUENT_STAKE\n : config.MAINNET_DELINQUENT_STAKE\n console.log(chalk.white(`Current solv version: ${solvVersion}`))\n\n // Auto Update\n if (options.auto) {\n await autoUpdate(config)\n return\n }\n\n if (options.migrateConfig) {\n // Temporarily!!\n // Migrate solv.config.json to solv4.config.json\n const oldConfig = readOrCreateDefaultConfig().config\n let diskType = MNT_DISK_TYPE.TRIPLE\n if (oldConfig.DISK_TYPES === 0) {\n diskType = MNT_DISK_TYPE.DOUBLE\n } else if (oldConfig.DISK_TYPES === 1) {\n diskType = MNT_DISK_TYPE.SINGLE\n } else {\n diskType = MNT_DISK_TYPE.TRIPLE\n }\n const isTestnetOld =\n oldConfig.SOLANA_NETWORK === NETWORK_TYPES.TESTNET\n const isRPCOld = oldConfig.SOLV_TYPE === SOLV_TYPES.RPC_NODE\n const isJitoOld = oldConfig.MAINNET_TYPE === MAINNET_TYPES.JITO_MEV\n const newConfigBody: DefaultConfigType = {\n NETWORK: isTestnetOld ? Network.TESTNET : Network.MAINNET,\n NODE_TYPE: isRPCOld ? NodeType.RPC : NodeType.VALIDATOR,\n MNT_DISK_TYPE: diskType,\n RPC_TYPE: isRPCOld ? RpcType.JITO : RpcType.NONE,\n VALIDATOR_TYPE: isJitoOld\n ? ValidatorType.JITO\n : isTestnetOld\n ? ValidatorType.AGAVE\n : ValidatorType.SOLANA,\n TESTNET_SOLANA_VERSION: oldConfig.TESTNET_SOLANA_VERSION,\n MAINNET_SOLANA_VERSION: oldConfig.MAINNET_SOLANA_VERSION,\n NODE_VERSION: oldConfig.NODE_VERSION,\n TESTNET_DELINQUENT_STAKE: oldConfig.TESTNET_DELINQUENT_STAKE,\n MAINNET_DELINQUENT_STAKE: oldConfig.MAINNET_DELINQUENT_STAKE,\n COMMISSION: oldConfig.COMMISSION,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:\n oldConfig.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,\n STAKE_ACCOUNTS: oldConfig.STAKE_ACCOUNT,\n HARVEST_ACCOUNT: oldConfig.HARVEST_ACCOUNT,\n IS_MEV_MODE: oldConfig.IS_MEV_MODE,\n RPC_URL: oldConfig.RPC_URL,\n KEYPAIR_PATH: oldConfig.KEYPAIR_PATH,\n DISCORD_WEBHOOK_URL: oldConfig.DISCORD_WEBHOOK_URL,\n AUTO_UPDATE: oldConfig.AUTO_UPDATE,\n AUTO_RESTART: oldConfig.AUTO_RESTART,\n IS_DUMMY: false,\n API_KEY: '',\n LEDGER_PATH: oldConfig.LEDGER_PATH,\n ACCOUNTS_PATH: '/mnt/accounts',\n SNAPSHOTS_PATH: '/mnt/snapshots',\n MOD: false\n }\n\n await updateDefaultConfig(newConfigBody)\n // --- End of Temporarily!!\n }\n if (options.config) {\n await updateDefaultConfig({\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n })\n if (isJito) {\n const jitoVersion = isTestnet\n ? VERSION_JITO_TESTNET\n : VERSION_JITO_MAINNET\n await updateJitoSolvConfig({\n version: jitoVersion,\n tag: `v${jitoVersion}`,\n })\n }\n console.log(\n chalk.green(\n '✔️ Updated Solv Config Default Solana Version\\n\\n You can now run `solv i` to install the latest version',\n ),\n )\n return\n }\n if (options.firewall) {\n await updateFirewall()\n return\n }\n\n if (options.background) {\n let version = options.version\n await updateDefaultConfig({\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n })\n rmSnapshot(config)\n if (isJito) {\n jitoUpdate(`v${version}`, options.mod || isModded)\n await updateJitoSolvConfig({ version, tag: `v${version}` })\n await monitorUpdate(deliquentStake, true, minIdleTime)\n return\n }\n\n if(isTestnet) {\n getSnapshot(isTestnet, '10', config.SNAPSHOTS_PATH, VERSION_TESTNET)\n }\n\n if (isFrankendancer) {\n await frankendancerUpdate(config, version, options.mod || isModded)\n await monitorUpdate(deliquentStake, true, minIdleTime)\n return\n }\n\n await updateVersion(version, options.mod || isModded)\n const deliquentStakeNum = isTestnet\n ? DELINQUENT_STAKE_TESTNET\n : DELINQUENT_STAKE_MAINNET\n\n await monitorUpdate(deliquentStakeNum, true, minIdleTime)\n return\n } else if (options.commission) {\n const ansewr = await updateCommissionAsk()\n updateCommission(ansewr.commission, isTestnet)\n } else {\n updateSolv()\n }\n })\n}\n","export enum LANGS {\n EN = 'en',\n JA = 'ja',\n}\n","import { LANGS } from './langs'\n\nexport enum DISK_TYPES {\n DOUBLE,\n SINGLE,\n TRIPLE,\n}\n\nexport enum MOUNT_TYPES {\n SINGLE = 'single',\n DOUBLE = 'double',\n TRIPLE = 'triple',\n}\n\nexport enum NETWORK_TYPES {\n MAINNET = 'mainnet-beta',\n TESTNET = 'testnet',\n}\n\nexport enum NODE_TYPES {\n VALIDATOR = 'validator',\n RPC = 'rpc',\n}\n\nexport enum SOLANA_CLIENTS {\n SOLANA = 'solana',\n JITO = 'jito',\n AGAVE = 'agave',\n FIREDANCER = 'firedancer',\n}\n\nexport enum JITO_TYPES {\n CO_HOST_RELAYER = 'co-host-relayer',\n SEPARATED_RELAYER = 'separated-relayer',\n WITHOUT_RELAYER = 'without-relayer',\n}\n\nexport enum FIREDANCER_TYPES {\n FIREDANCER = 'firedancer',\n FRANKENDANCER = 'frankendancer',\n}\n\nexport enum SOLV_TYPES {\n TESTNET_VALIDATOR,\n MAINNET_VALIDATOR,\n RPC_NODE,\n}\n\nexport const RPC_MODE = ['SOLANA_RPC', 'JITO_RPC']\n\nexport enum MAINNET_TYPES {\n SOLANA_CLIENT = 'SolanaClient',\n JITO_MEV = 'JitoMev',\n FIREDANCER = 'Firedancer',\n}\n\n// ⚠️ Please DO NOT forget to turn this to false if restart is not needed\nexport const NODE_RESTART_REQUIRED_MAINNET = false\nexport const NODE_RESTART_REQUIRED_TESTNET = true\nexport const FD_RESTART_REQUIRED_MAINNET = false\nexport const FD_RESTART_REQUIRED_TESTNET = false\n\nexport type CONFIG_TYPE = {\n ID: string\n LANG: LANGS\n USERNAME: string\n TESTNET_SOLANA_VERSION: string\n MAINNET_SOLANA_VERSION: string\n NODE_VERSION: string\n TESTNET_DELINQUENT_STAKE: number\n MAINNET_DELINQUENT_STAKE: number\n COMMISSION: number\n SOLANA_NETWORK: NETWORK_TYPES\n SOLV_TYPE: SOLV_TYPES\n DISK_TYPES: DISK_TYPES\n IS_SETUP: boolean\n LANG_SETUP: boolean\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY: string\n IS_CLIENT: boolean\n VALIDATOR_IPS: string[]\n MAINNET_TYPE: MAINNET_TYPES\n LEDGER_PATH: string\n STAKE_ACCOUNT: string[]\n HARVEST_ACCOUNT: string\n IS_MEV_MODE: boolean\n RPC_URL: string\n KEYPAIR_PATH: string\n DISCORD_WEBHOOK_URL: string\n AUTO_UPDATE: boolean\n AUTO_RESTART: boolean\n ACCOUNTS_PATH: string\n SNAPSHOTS_PATH: string\n MOD: boolean\n}\n\nexport type PartialConfigType = Partial<CONFIG_TYPE>\n\nexport const CONFIG: CONFIG_TYPE = {\n ID: 'solv',\n LANG: LANGS.EN,\n USERNAME: 'solv',\n TESTNET_SOLANA_VERSION: '3.0.0',\n MAINNET_SOLANA_VERSION: '2.3.7',\n NODE_VERSION: '20.17.0',\n TESTNET_DELINQUENT_STAKE: 5,\n MAINNET_DELINQUENT_STAKE: 5,\n COMMISSION: 5,\n SOLANA_NETWORK: NETWORK_TYPES.TESTNET,\n SOLV_TYPE: SOLV_TYPES.TESTNET_VALIDATOR,\n DISK_TYPES: DISK_TYPES.SINGLE,\n IS_SETUP: false,\n LANG_SETUP: false,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:\n 'ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG',\n IS_CLIENT: false,\n VALIDATOR_IPS: [],\n MAINNET_TYPE: MAINNET_TYPES.SOLANA_CLIENT,\n LEDGER_PATH: '/mnt/ledger',\n STAKE_ACCOUNT: [],\n HARVEST_ACCOUNT: '',\n IS_MEV_MODE: false,\n RPC_URL: 'https://mainnet-beta.solana.com',\n KEYPAIR_PATH: '/home/solv/testnet-validator-keypair.json',\n DISCORD_WEBHOOK_URL: '',\n AUTO_UPDATE: false,\n AUTO_RESTART: false,\n ACCOUNTS_PATH: '/mnt/accounts',\n SNAPSHOTS_PATH: '/mnt/snapshots',\n MOD: false\n}\n\nexport const HOME_PATHS = {\n ROOT: '/home/solv',\n AUTHORIZED_KEYS: '/home/solv/.ssh/authorized_keys',\n}\n\nexport const MT_PATHS = {\n ROOT: '/mnt',\n ACCOUNTS: '/mnt/accounts',\n LEDGER: '/mnt/ledger',\n SNAPSHOTS: '/mnt/snapshots',\n}\n\nexport const FILES = {\n LOG: 'solana-validator.log',\n STARTUP_SCRIPT: 'start-validator.sh',\n CONFIG: 'solv.config.json',\n JITO_CONFIG: 'jito.config.json',\n}\n\nexport const SERVICE_PATHS = {\n SOL_SERVICE: '/etc/systemd/system/solv.service',\n SOL_LOGROTATE: '/etc/logrotate.d/solana',\n FRANKENDANCER_LOGROTATE: '/etc/logrotate.d/frankendancer',\n SOL_SYSTEM_CONFIG21: '/etc/sysctl.d/21-solana-validator.conf',\n SOL_NOFILES_CONF: '/etc/security/limits.d/90-solana-nofiles.conf',\n SOL_SYSTEM_CONF: '/etc/systemd/system.conf',\n SOLANA_PATH: '/home/solv/.local/share/solana/install',\n}\n\nexport const KEYPAIRS = {\n MAINNET_VALIDATOR_KEY: 'mainnet-validator-keypair.json',\n MAINNET_VALIDATOR_VOTE_KEY: 'mainnet-vote-account-keypair.json',\n MAINNET_VALITATOR_AUTHORITY_KEY: 'mainnet-authority-keypair.json',\n TESTNET_VALIDATOR_KEY: 'testnet-validator-keypair.json',\n TESTNET_VALIDATOR_VOTE_KEY: 'testnet-vote-account-keypair.json',\n TESTNET_VALITATOR_AUTHORITY_KEY: 'testnet-authority-keypair.json',\n}\n\nexport const getAllKeyPaths = (path = HOME_PATHS.ROOT) => {\n const rootDir = path === HOME_PATHS.ROOT ? HOME_PATHS.ROOT : path\n const mainnetValidatorKey = `${rootDir}/${KEYPAIRS.MAINNET_VALIDATOR_KEY}`\n const mainnetValidatorVoteKey = `${rootDir}/${KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY}`\n const mainnetValidatorAuthorityKey = `${rootDir}/${KEYPAIRS.MAINNET_VALITATOR_AUTHORITY_KEY}`\n const testnetValidatorKey = `${rootDir}/${KEYPAIRS.TESTNET_VALIDATOR_KEY}`\n const testnetValidatorVoteKey = `${rootDir}/${KEYPAIRS.TESTNET_VALIDATOR_VOTE_KEY}`\n const testnetValidatorAuthorityKey = `${rootDir}/${KEYPAIRS.TESTNET_VALITATOR_AUTHORITY_KEY}`\n return {\n mainnetValidatorKey,\n mainnetValidatorVoteKey,\n mainnetValidatorAuthorityKey,\n testnetValidatorKey,\n testnetValidatorVoteKey,\n testnetValidatorAuthorityKey,\n }\n}\n\nexport const startupScriptPaths = (isTest = true) => {\n const identity = isTest\n ? `${HOME_PATHS.ROOT}/${KEYPAIRS.TESTNET_VALIDATOR_KEY}`\n : `${HOME_PATHS.ROOT}/${KEYPAIRS.MAINNET_VALIDATOR_KEY}`\n const voteAccount = isTest\n ? `${HOME_PATHS.ROOT}/${KEYPAIRS.TESTNET_VALIDATOR_VOTE_KEY}`\n : `${HOME_PATHS.ROOT}/${KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY}`\n const log = `${HOME_PATHS.ROOT}/${FILES.LOG}`\n const accounts = MT_PATHS.ACCOUNTS\n const ledger = MT_PATHS.LEDGER\n const snapshots = MT_PATHS.SNAPSHOTS\n const scriptPath = `${HOME_PATHS.ROOT}/${FILES.STARTUP_SCRIPT}`\n return {\n identity,\n voteAccount,\n log,\n accounts,\n ledger,\n scriptPath,\n snapshots,\n }\n}\n\nexport const SOLV_DISCORD_INVITE = 'https://discord.gg/y8tCMzPU9Y'\nexport const DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY =\n '76DafWkJ6pGK2hoD41HjrM4xTBhfKqrDYDazv13n5ir1'\nexport const SOLV_STAKE_POOL_ADDRESS =\n 'So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5'\nexport const SOLV_ELSOL_ACCOUNT_ADDRESS =\n '7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv'\nexport const SOLV_POOL_MANAGER_ADDRESS =\n 'EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV'\nexport const ELSOL_DECIMALS = 9\n\n// Token Mint Addresses\nexport const ELSOL_MINT_ADDRESS = 'ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC'\nexport const SOL_MINT_ADDRESS = 'So11111111111111111111111111111111111111112'\nexport const USDC_MINT_ADDRESS = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'\nexport const EPCT_MINT_ADDRESS = 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP'\n\nexport enum TOKEN_MINT_ADDRESS {\n ELSOL = ELSOL_MINT_ADDRESS,\n SOL = SOL_MINT_ADDRESS,\n USDC = USDC_MINT_ADDRESS,\n EPCT = EPCT_MINT_ADDRESS,\n}\n\nexport enum JUP_URL {\n V6_BASE_URL = 'https://quote-api.jup.ag/v6',\n V6_QUOTE_URL = V6_BASE_URL + '/quote',\n V6_SWAP_URL = V6_BASE_URL + '/swap',\n}\n\nexport const DECIMALS = {\n [SOL_MINT_ADDRESS]: 9,\n [ELSOL_MINT_ADDRESS]: 9,\n [USDC_MINT_ADDRESS]: 6,\n [EPCT_MINT_ADDRESS]: 6,\n}\n\nexport const EPOCH_TIMER_FILE_PATH = '/home/solv/currentEpoch.json'\nexport const MINIMUM_VALIDATOR_BALANCE = 0.5\nexport const SOLANA_TESTNET_RPC_URL = 'https://api.testnet.solana.com'\n","import { CONFIG } from '@/config/config'\nimport { spawnSync } from 'child_process'\n\nexport const updateSolv = () => {\n spawnSync('pnpm add -g pnpm', { shell: true, stdio: 'inherit' })\n const nodeVersion = CONFIG.NODE_VERSION\n spawnSync(`pnpm env use ${nodeVersion} --global`, {\n shell: true,\n stdio: 'inherit',\n })\n const cmd = `pnpm add -g @gabrielhicks/solv`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","export interface JitoConfig {\n version: string\n tag: string\n commissionBps: number\n relayerUrl: string\n blockEngineUrl: string\n shredReceiverAddr: string\n hasRelayer?: boolean\n}\n\nexport const JITO_CONFIG: JitoConfig = {\n version: '2.3.6',\n tag: 'v2.3.6',\n commissionBps: 1000,\n relayerUrl: 'http://frankfurt.mainnet.relayer.jito.wtf:8100',\n blockEngineUrl: 'https://frankfurt.mainnet.block-engine.jito.wtf',\n shredReceiverAddr: '64.130.50.14:1002',\n}\n\nexport const JITO_REGIONS = {\n TESTNET: {\n Dallas: {\n BLOCK_ENGINE_URL: 'https://dallas.testnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://dallas.testnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '141.98.218.12:1002',\n },\n NewYork: {\n BLOCK_ENGINE_URL: 'https://ny.testnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://ny.testnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.35.224:1002',\n },\n },\n MAINNET: {\n Amsterdam: {\n BLOCK_ENGINE_URL: 'https://amsterdam.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://amsterdam.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '74.118.140.240:1002',\n },\n London: {\n BLOCK_ENGINE_URL: 'https://london.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://london.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '142.91.127.175:1002',\n },\n Frankfurt: {\n BLOCK_ENGINE_URL: 'https://frankfurt.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://frankfurt.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.50.14:1002',\n },\n NewYork: {\n BLOCK_ENGINE_URL: 'https://ny.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://ny.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '141.98.216.96:1002',\n },\n Tokyo: {\n BLOCK_ENGINE_URL: 'https://tokyo.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://tokyo.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '202.8.9.160:1002',\n },\n SaltLakeCity: {\n BLOCK_ENGINE_URL: 'https://slc.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://slc.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.53.8:1002',\n },\n Singapore: {\n BLOCK_ENGINE_URL: 'https://singapore.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://singapore.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '202.8.11.224:1002',\n },\n },\n}\n","import { JITO_CONFIG } from '@/config/jitConfig'\nimport { spawnSync } from 'child_process'\n\nexport const jitoUpdate = (tag = JITO_CONFIG.tag, mod = false) => {\n if (mod) {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/gabrielhicks/jito-solana.git --recurse-submodules /tmp/${tag}-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag}-mod checkout ${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag}-mod submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag}-mod rev-parse HEAD) /tmp/${tag}-mod/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n } else {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${tag}-jito`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag}-jito checkout ${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag}-jito submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag}-jito rev-parse HEAD) /tmp/${tag}-jito/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}-jito`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n}\n","import { FILES } from '@/config/config'\nimport { JitoConfig } from '@/config/jitConfig'\nimport { readFile, writeFile } from 'fs/promises'\nimport { homedir } from 'os'\nexport const updateJitoSolvConfig = async (config: Partial<JitoConfig>) => {\n // update ~/jito.config.json with new values\n const homeDir = homedir()\n const solvConfigFile = `${homeDir}/${FILES.JITO_CONFIG}`\n const solvConfig = JSON.parse(\n await readFile(solvConfigFile, 'utf8'),\n ) as JitoConfig\n // unique values\n const updatedConfig: JitoConfig = {\n ...solvConfig,\n ...config,\n }\n const updatedConfigString = JSON.stringify(updatedConfig, null, 2)\n await writeFile(solvConfigFile, updatedConfigString)\n console.log(`Updated ${solvConfigFile} with new values.`)\n}\n","import { spawnSync } from 'child_process'\nimport inquirer from 'inquirer'\n\nexport const updateCommission = (commission: number, isTest = true) => {\n const validatorKeypair = isTest\n ? '/home/solv/testnet-validator-keypair.json'\n : '/home/solv/mainnet-validator-keypair.json'\n const voteAccountKeypair = isTest\n ? '/home/solv/testnet-vote-account-keypair.json'\n : '/home/solv/mainnet-vote-account-keypair.json'\n const network = isTest ? 'testnet' : 'mainnet-beta'\n spawnSync(\n `solana config set --url ${network} --keypair ${validatorKeypair}`,\n { shell: true, stdio: 'inherit' },\n )\n const cmd = `solana vote-update-commission ${voteAccountKeypair} ${commission} ${validatorKeypair} --keypair ${validatorKeypair}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n\nexport type UpdateCommissionAsk = {\n commission: number\n}\n\nexport const updateCommissionAsk = async () => {\n const ansewr = await inquirer.prompt<UpdateCommissionAsk>([\n {\n type: 'number',\n name: 'commission',\n message: 'Enter new commission',\n default: 7,\n },\n ])\n return ansewr\n}\n","import { execAsync } from '@skeet-framework/utils'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\n\nexport const updateFirewall = async () => {\n const answer = await inquirer.prompt<{ ip: string; isRelayer: boolean }>([\n {\n name: 'ip',\n type: 'input',\n message: 'Enter your IP address to allow access to RPC NODE:',\n default: '1.2.3.4',\n },\n ])\n await execAsync(`sudo ufw delete allow 8899/udp`)\n await execAsync(`sudo ufw delete allow 8899/tcp`)\n await execAsync(`sudo ufw allow from ${answer.ip} to any port 8899 proto tcp`)\n await execAsync(`sudo ufw allow from ${answer.ip} to any port 8899 proto udp`)\n await execAsync(`sudo ufw reload`)\n console.log(chalk.white('✔️ Firewall updated!'))\n}\n","import * as packageJson from '../../../package.json'\n\nconst getSolvVersion = () => {\n const version = packageJson.version\n return version\n}\n\nexport default getSolvVersion\n","import { readFile, writeFile } from 'fs/promises'\nimport { SOLV4_CONFIG_FILE } from '@/config/constants'\nimport { existsAsync } from '@skeet-framework/utils'\nimport DEFAULT_CONFIG from '@/config/defaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { homedir } from 'os'\n\nconst readConfig = async () => {\n const homeDir = homedir()\n const configPath = `${homeDir}/${SOLV4_CONFIG_FILE}`\n if (!(await existsAsync(configPath))) {\n // create default config\n console.log('Creating default config file at', configPath)\n await writeFile(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2))\n return DEFAULT_CONFIG\n }\n const config = JSON.parse(\n await readFile(configPath, 'utf-8'),\n ) as DefaultConfigType\n return config\n}\n\nexport default readConfig\n","export enum LANG {\n EN = 'en',\n JA = 'ja',\n}\n\nexport const LANGS = Object.values(LANG)\n\nexport enum Network {\n MAINNET = 'mainnet-beta',\n // DEVNET = 'devnet',\n TESTNET = 'testnet',\n}\n\nexport const NETWORK_TYPES = Object.values(Network)\n\nexport enum NodeType {\n RPC = 'rpc',\n VALIDATOR = 'validator',\n}\n\nexport const NODE_TYPES = Object.values(NodeType)\n\nexport enum ValidatorType {\n SOLANA = 'solana',\n AGAVE = 'agave',\n JITO = 'jito',\n FRANKENDANCER = 'frankendancer',\n // FIREDANCER = 'firedancer',\n NONE = 'none',\n}\n\nexport const SOLANA_CLIENTS = Object.values(ValidatorType).filter(\n (type) => type !== ValidatorType.NONE,\n)\n\nexport enum RpcType {\n AGAVE = 'agave',\n JITO = 'jito',\n NONE = 'none',\n}\n\nexport const RPC_MODE = Object.values(RpcType).filter(\n (type) => type !== RpcType.NONE,\n)\n\nexport enum MNT_DISK_TYPE {\n SINGLE = 'single',\n DOUBLE = 'double',\n TRIPLE = 'triple',\n}\n","export const VERSION_TESTNET = '3.0.0'\nexport const VERSION_MAINNET = '2.3.7'\nexport const VERSION_JITO_TESTNET = '3.0.0'\nexport const VERSION_JITO_MAINNET = '2.3.7'\nexport const VERSION_JITO_RPC = '2.3.7'\nexport const VERSION_SOLANA_RPC = '2.3.7'\nexport const DELINQUENT_STAKE_TESTNET = 10\nexport const DELINQUENT_STAKE_MAINNET = 5\nexport const COMMISSION = 5\nexport const VERSION_NODE = '20.17.0'\nexport const VERSION_FIREDANCER_TESTNET = '0.707.20306'\nexport const VERSION_FIREDANCER = '0.707.20306'\n","import { DefaultConfigType } from '@/config/types'\nimport {\n MNT_DISK_TYPE,\n NodeType,\n Network,\n ValidatorType,\n RpcType,\n} from '@/config/enums'\nimport {\n COMMISSION,\n DELINQUENT_STAKE_MAINNET,\n DELINQUENT_STAKE_TESTNET,\n VERSION_MAINNET,\n VERSION_NODE,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport {\n ACCOUNTS_PATH,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,\n LEDGER_PATH,\n SNAPSHOTS_PATH,\n SOLANA_MAINNET_RPC_URL,\n} from '@/config/constants'\n\nconst DEFAULT_CONFIG: DefaultConfigType = {\n NETWORK: Network.TESTNET,\n NODE_TYPE: NodeType.RPC,\n VALIDATOR_TYPE: ValidatorType.NONE,\n RPC_TYPE: RpcType.AGAVE,\n MNT_DISK_TYPE: MNT_DISK_TYPE.TRIPLE,\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n NODE_VERSION: VERSION_NODE,\n TESTNET_DELINQUENT_STAKE: DELINQUENT_STAKE_TESTNET,\n MAINNET_DELINQUENT_STAKE: DELINQUENT_STAKE_MAINNET,\n COMMISSION: COMMISSION,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY: DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,\n STAKE_ACCOUNTS: [],\n HARVEST_ACCOUNT: '',\n IS_MEV_MODE: false,\n RPC_URL: SOLANA_MAINNET_RPC_URL,\n KEYPAIR_PATH: '',\n DISCORD_WEBHOOK_URL: '',\n AUTO_UPDATE: false,\n AUTO_RESTART: false,\n IS_DUMMY: false,\n API_KEY: '',\n LEDGER_PATH: LEDGER_PATH,\n ACCOUNTS_PATH: ACCOUNTS_PATH,\n SNAPSHOTS_PATH: SNAPSHOTS_PATH,\n MOD: false\n}\n\nexport default DEFAULT_CONFIG\n","import readConfig from '@/config/readConfig'\nimport fetch from 'node-fetch'\n\nexport const sendDiscord = async (content: string) => {\n try {\n const config = await readConfig()\n if (config.DISCORD_WEBHOOK_URL === '')\n throw new Error(\n 'DISCORD_WEBHOOK_URL is empty\\nPlease set DISCORD_WEBHOOK_URL in .env',\n )\n\n const body = {\n content,\n username: '🪄 Solv Notifier',\n }\n const res = await fetch(config.DISCORD_WEBHOOK_URL, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n })\n if (res.status !== 204) return false\n return true\n } catch (e) {\n console.log({ error: `Skeet sendDiscord Error - ${content}` })\n return false\n }\n}\n","import getSolvVersion from '@/cli/epochTimer/getSolvVersion'\nimport {\n getAllKeyPaths,\n NODE_RESTART_REQUIRED_MAINNET,\n NODE_RESTART_REQUIRED_TESTNET,\n FD_RESTART_REQUIRED_MAINNET,\n FD_RESTART_REQUIRED_TESTNET,\n} from '@/config/config'\nimport { sendDiscord } from '@/lib/sendDiscord'\nimport { spawnSync } from 'child_process'\nimport waitCatchup from './waitCatchup'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport sleep from '@/lib/sleep'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, ValidatorType } from '@/config/enums'\nimport getSolanaVersion from '@/cli/epochTimer/getSolanaVersion'\n\n// NODE_RESTART_REQUIRED_MAINNET/TESTNET is a boolean\n// This is a global variable that is not defined in this file\n// It is defined in packages/solv/src/cli/config/config.ts\n// Please DO NOT forget to turn this to false if it's not needed\n\nconst autoUpdate = async (config: DefaultConfigType) => {\n const isMainnet = config.NETWORK === Network.MAINNET\n const isFrankendancer = config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n const { mainnetValidatorKey, testnetValidatorKey } = getAllKeyPaths()\n const validatorKey = isMainnet ? mainnetValidatorKey : testnetValidatorKey\n // const solanaVersion = getSolanaVersion()\n \n // Notify the user about the update\n let isUpdateRequired = false\n if (isFrankendancer) {\n isUpdateRequired = isMainnet\n ? FD_RESTART_REQUIRED_MAINNET\n : FD_RESTART_REQUIRED_TESTNET\n } else {\n isUpdateRequired = isMainnet\n ? NODE_RESTART_REQUIRED_MAINNET\n : NODE_RESTART_REQUIRED_TESTNET\n }\n isUpdateRequired = isUpdateRequired && config.AUTO_RESTART\n\n const address = getSolanaAddress(validatorKey)\n const msg = `**${address}** updated solv to **${getSolvVersion()}**`\n await sendDiscord(msg)\n\n if (isUpdateRequired) {\n // Restart the node\n const msg = `Restarting **${address}**`\n await sendDiscord(msg)\n try {\n spawnSync(`solv update && solv update --config && solv update -b`, {\n stdio: 'inherit',\n shell: true,\n })\n } catch (error: any) {\n const errorMsg = `Error restarting **${address}**: ${error?.message || 'Unknown error'}`\n await sendDiscord(errorMsg)\n return false\n }\n\n const restartMsg = `**${address}** has restarted, catching up...`\n await sendDiscord(restartMsg)\n await sleep(180 * 1000)\n \n // Wait for the node to catch up\n const catchup = await waitCatchup(config)\n if (catchup) {\n const msg = `**${address}** has caught up!`\n await sendDiscord(msg)\n } else {\n const errorMsg = `**${address}** failed to catch up after update`\n await sendDiscord(errorMsg)\n }\n return catchup\n }\n return true\n}\n\nexport default autoUpdate\n","import { Connection } from '@solana/web3.js'\n\nexport type ValidatorStatus = {\n pubkey: string\n isActive: boolean\n reason: string\n}\n\nexport const isValidatorActive = async (\n rpcUrl: string,\n voteAccountKey: string,\n isTest = false,\n slot = 200,\n) => {\n let validatorStatus: ValidatorStatus = {\n pubkey: voteAccountKey,\n isActive: false,\n reason: '',\n }\n try {\n const connection = isTest\n ? new Connection('https://api.testnet.solana.com')\n : new Connection(rpcUrl, 'confirmed')\n let voteAccounts = await connection.getVoteAccounts()\n let validator = voteAccounts.current.find(\n (v) => v.votePubkey === voteAccountKey,\n )\n\n if (!validator) {\n // Validator is not in the current list, it might be delinquent.\n const delinquentValidator = voteAccounts.delinquent.find(\n (v) => v.votePubkey === voteAccountKey,\n )\n if (delinquentValidator) {\n validatorStatus.isActive = false\n validatorStatus.reason = 'Validator is delinquent.'\n return validatorStatus\n } else {\n validatorStatus.isActive = false\n validatorStatus.reason =\n 'Validator is not found in both current and delinquent lists.'\n return validatorStatus\n }\n }\n // Refetch the validator from the current list.\n voteAccounts = await connection.getVoteAccounts()\n validator = voteAccounts.current.find(\n (v) => v.votePubkey === voteAccountKey,\n )\n if (!validator) {\n validatorStatus.isActive = false\n validatorStatus.reason = 'Validator is not found in the current list.'\n return validatorStatus\n }\n\n // Check the last vote timestamp.\n const lastVoteSlot = validator.lastVote\n const currentSlot = await connection.getSlot()\n const slotsSinceLastVote = currentSlot - lastVoteSlot\n if (slotsSinceLastVote > slot) {\n // This is an arbitrary number, adjust based on your needs.\n validatorStatus.isActive = false\n validatorStatus.reason = `Validator has not voted for ${slotsSinceLastVote} slots.`\n return validatorStatus\n }\n\n validatorStatus.isActive = true\n validatorStatus.reason = 'Validator is active and voting.'\n return validatorStatus\n } catch (error) {\n console.error(error)\n validatorStatus.isActive = false\n validatorStatus.reason = 'Failed to check validator status.'\n return validatorStatus\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const getSolanaAddress = (keypath: string) => {\n const cmd = `solana address --keypair ${keypath}`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n const address = stdout.toString().trim()\n return address\n}\n","const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport default sleep\n","import { isValidatorActive } from '@/cli/epochTimer/isValidatorActive'\nimport { getAllKeyPaths } from '@/config/config'\nimport { Network } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport sleep from '@/lib/sleep'\nimport { sendDiscord } from '@skeet-framework/utils'\n\nconst MAX_RETRIES = 60\n\nconst waitCatchup = async (config: DefaultConfigType) => {\n try {\n const isTestnet = config.NETWORK === Network.TESTNET\n const { mainnetValidatorVoteKey, testnetValidatorVoteKey } =\n getAllKeyPaths()\n const validatorKey = isTestnet\n ? testnetValidatorVoteKey\n : mainnetValidatorVoteKey\n const validatorPubkey = getSolanaAddress(validatorKey)\n let result = await isValidatorActive(\n config.RPC_URL,\n validatorPubkey,\n isTestnet,\n )\n let retries = 0\n while (!result.isActive) {\n if (retries >= MAX_RETRIES) {\n console.log('Max retries reached, exiting...')\n const msg = `⚠️ Validator is not active for ${MAX_RETRIES} minutes!\nAccount: ${result.pubkey}\nReason: ${result.reason}\nMessage: Max retries reached, exiting catchup check...\n Please check your validator node 👷‍♀️`\n await sendDiscord(msg)\n return false\n }\n\n console.log('Waiting for validator to catch up...')\n // Wait for 1 minute\n await sleep(60 * 1000)\n result = await isValidatorActive(\n config.RPC_URL,\n validatorPubkey,\n isTestnet,\n )\n retries++\n }\n return true\n } catch (error) {\n console.log('Error in waitCatchup:', error)\n return false\n }\n}\n\nexport default waitCatchup\n","import { homedir } from 'os'\nimport { DefaultConfigType } from './types'\nimport { SOLV4_CONFIG_FILE } from '@/config/constants'\nimport { readFile, writeFile } from 'fs/promises'\nimport { existsAsync } from '@skeet-framework/utils'\nimport DEFAULT_CONFIG from './defaultConfig'\n\nexport const updateDefaultConfig = async (\n config: Partial<DefaultConfigType>,\n) => {\n // update ~/solv4.config.json with new values\n const homeDir = homedir()\n const solvConfigFile = `${homeDir}/${SOLV4_CONFIG_FILE}`\n\n // Check if the file exists\n if (!(await existsAsync(solvConfigFile))) {\n // create default config\n console.log('Creating default config file at', solvConfigFile)\n await writeFile(solvConfigFile, JSON.stringify(DEFAULT_CONFIG, null, 2))\n }\n\n const solvConfig = JSON.parse(\n await readFile(solvConfigFile, 'utf8'),\n ) as DefaultConfigType\n // unique values\n const updatedConfig: DefaultConfigType = {\n ...solvConfig,\n ...config,\n }\n const updatedConfigString = JSON.stringify(updatedConfig, null, 2)\n await writeFile(solvConfigFile, updatedConfigString)\n}\n","import { DescriptionParams } from '../localeParams'\n\nconst cmdsEN: DescriptionParams = {\n description: '💎 Solana Validator All-in-One CLI 💎',\n version: 'Output the current version',\n help: 'Display help for solv commands',\n subcmdHelp: 'Display help for subcommands',\n server: 'Open solv Dashboard',\n start: 'Start Solana Validator',\n stop: 'Stop Solana Validator',\n status: 'Show Solana Validator Status',\n restart: 'Restart Solana Validator',\n update: 'Update Solana Validator Version',\n get: 'Get Solana Validator Info Commands',\n log: 'Tail Solana Validator Log',\n catchup: 'Catchup Solana Validator',\n monitor: 'Monitor Solana Validator',\n config: 'Show Solana Validator Config',\n install: 'Install/Update Solana Version',\n stake: 'Solana Delegate Stake',\n check: 'Check Solana Validator',\n scp: 'Download/Upload Solana Validator Keypairs',\n cron: 'Run Schedule Tasks',\n setup: 'Setup Solana Validator',\n epoch: 'Show Current Epoch',\n slot: 'Show Current Slot',\n solv: 'Endroll Solv AA',\n installer: 'Please select an option:',\n unstake: 'UnStake',\n}\n\nexport default cmdsEN\n","import { DescriptionParams } from '../localeParams'\n\nconst cmdsJA: DescriptionParams = {\n description: '💎 ソラナバリデーターオールインワン CLI ツール 💎',\n version: '現在のバージョンを出力',\n help: 'solv コマンドのオプション詳細を表示',\n subcmdHelp: 'サブコマンドのヘルプを表示',\n server: 'solv ダッシュボードを開く',\n start: 'ノードを起動',\n stop: 'ノードを停止',\n status: 'ノードのステータスを表示',\n restart: 'ノードを再起動',\n update: 'ノードのバージョンを更新',\n get: 'ノードの設定情報を取得 サブコマンド',\n log: 'ノードのログを表示',\n catchup: 'ノードをキャッチアップ',\n monitor: 'ノードを監視',\n config: 'ノードの設定を表示',\n install: 'ソラナのバージョンを更新/インストール',\n stake: 'ソラナのステーキングを行う',\n unstake: 'ソラナのアンステーキングを行う',\n check: 'ノードの状態をチェック',\n scp: 'scp サブコマンド',\n cron: 'スケジュールタスク サブコマンド',\n setup: 'ソラナバリデーターをセットアップ',\n epoch: '現在のエポックを表示',\n slot: '現在のスロットを表示',\n solv: 'Solvエンドロール AA を表示',\n installer: '以下からオプションを選択してください:',\n}\n\nexport default cmdsJA\n","import { LogParams } from '../localeParams'\n\nconst logsEN: LogParams = {\n success: {\n created: 'Created',\n },\n error: {\n failed: 'Failed',\n },\n installer: {\n welcomeMsg: '🔥 Welcome to the solv installer 🔥',\n description: 'solv is born and ready for running Solana Validator Nodes 🚀',\n },\n}\n\nexport default logsEN\n","import { LogParams } from '../localeParams'\n\nconst logsJA: LogParams = {\n success: {\n created: '作成されました',\n },\n error: {\n failed: '失敗しました',\n },\n installer: {\n welcomeMsg: '🔥 ソラナバリデーターツール solv へようこそ 🔥',\n description: 'あなたはもう、ソラナバリデーターになる準備ができています。',\n },\n}\n\nexport default logsJA\n","import { installerParams, installerSubParams } from '../localeParams'\n\nexport const installerEN: installerParams = [\n ') Upgrade - Update/Downgrade Solana Version',\n ') Check Validator Logs/Status or Start/Stop',\n ') Get Validator Config Info',\n ') Backup Validator Keyfiles',\n ') Staking',\n ') Uninstall',\n ') Exit',\n]\n\nexport const installerSubEN: installerSubParams = [\n [],\n [\n ') Check Validator Status',\n ') Show Validator Logs',\n ') Start Validator',\n ') Stop Validator',\n ') Restart Validator (no fetch snapshot)',\n ') Restart Validator (fetch snapshot)',\n ') Return to Main Menu',\n ],\n [\n ') Show Validator Config',\n ') Register Validator Info',\n ') Show Validator Keys Path/Address/Balance',\n ') Get Current Epoch/Slot',\n ') Get Solana Validator Catchup Info',\n ') Get Solana Validator Monitor Info',\n ') Return to Main Menu',\n ],\n [\n ') Backup Validator Keyfiles',\n ') Set Validator Keyfile/Network',\n ') Return to Main Menu',\n ],\n [') Stake', ') Unstake', ') Return to Main Menu'],\n [],\n [],\n]\n","import { installerParams, installerSubParams } from '@/locales/localeParams'\n\nexport const installerJA: installerParams = [\n ') アップグレード - Solanaバージョンのアップデート/ダウングレード',\n ') バリデータ-の状態/ログを確認・または開始/停止',\n ') バリデータ-の設定情報',\n ') 鍵の設定',\n ') ステーキング',\n ') アンインストール',\n ') 終了',\n]\n\nexport const installerSubJA: installerSubParams = [\n [],\n [\n ') バリデータ-の状態を確認',\n ') バリデーターのログを表示',\n ') バリデータ-を開始',\n ') バリデータ-を停止',\n ') バリデータ-を再起動 (fetch snapshot なし)',\n ') バリデータ-を再起動 (fetch snapshot あり)',\n ') メインメニューに戻る',\n ],\n [\n ') バリデータ-の設定を見る',\n ') バリデータ-情報を登録する',\n ') バリデータ-の鍵の パス/アドレス/残高 を見る',\n ') 現在の エポック/スロット を見る',\n ') バリデーターの Catchup 情報を見る',\n ') バリデーターのモニター情報を見る',\n ') メインメニューに戻る',\n ],\n [\n ') バリデーターの鍵をバックアップ',\n ') 鍵/ネットワークを設定する',\n ') メインメニューに戻る',\n ],\n [\n ') ステーキングを行う',\n ') アンステーキングを行う',\n ') メインメニューに戻る',\n ],\n [],\n [],\n]\n","const subCmdsEN = {\n server: {\n description: 'Open solv Dashboard',\n },\n start: {\n description: 'Start Solana Validator',\n },\n stop: {\n description: 'Stop Solana Validator',\n },\n status: {\n description: 'Show Solana Validator Status',\n },\n restart: {\n description: 'Restart Solana Validator',\n },\n update: {\n description: 'Update Solana Validator Version',\n },\n get: {\n description: 'Get Solana Validator Info',\n },\n log: {\n description: 'Tail Solana Validator Log',\n },\n catchup: {\n description: 'Catchup Solana Validator',\n },\n monitor: {\n description: 'Monitor Solana Validator',\n },\n config: {\n description: 'Show Solana Validator Config',\n },\n install: {\n description: 'Install/Update Solana Version',\n },\n stake: {\n description: 'Solana Delegate Stake',\n },\n unstake: {\n description: 'UnStake',\n },\n check: {\n description: 'Check Solana Validator',\n },\n scp: {\n description: 'Download/Upload Solana Validator Keypairs',\n },\n cron: {\n description: 'Run Schedule Tasks',\n },\n setup: {\n description: 'Setup Solana Validator',\n },\n epoch: {\n description: 'Show Current Epoch',\n },\n slot: {\n description: 'Show Current Slot',\n },\n solv: {\n description: 'Endroll Solv AA',\n },\n}\n\nexport default subCmdsEN\n","const subCmdsJA = {\n server: {\n description: 'Open solv Dashboard',\n },\n start: {\n description: 'Start Solana Validator',\n },\n stop: {\n description: 'Stop Solana Validator',\n },\n status: {\n description: 'Show Solana Validator Status',\n },\n restart: {\n description: 'Restart Solana Validator',\n },\n update: {\n description: 'Update Solana Validator Version',\n },\n get: {\n description: 'Get Solana Validator Info',\n },\n log: {\n description: 'Tail Solana Validator Log',\n },\n catchup: {\n description: 'Catchup Solana Validator',\n },\n monitor: {\n description: 'Monitor Solana Validator',\n },\n config: {\n description: 'Show Solana Validator Config',\n },\n install: {\n description: 'Install/Update Solana Version',\n },\n stake: {\n description: 'Solana Delegate Stake',\n },\n unstake: {\n description: 'UnStake',\n },\n check: {\n description: 'Check Solana Validator',\n },\n scp: {\n description: 'Download/Upload Solana Validator Keypairs',\n },\n cron: {\n description: 'Run Schedule Tasks',\n },\n setup: {\n description: 'Setup Solana Validator',\n },\n epoch: {\n description: 'Show Current Epoch',\n },\n slot: {\n description: 'Show Current Slot',\n },\n solv: {\n description: 'Endroll Solv AA',\n },\n}\n\nexport default subCmdsJA\n","import { ClientParams } from '../localeParams'\n\nexport const clientEN: ClientParams = [\n ') Check Validator Status',\n ') Download Validator Keyfiles',\n ') Generate Validator Keyfiles',\n ') Upload Validator Keyfiles',\n ') Set Validator Keyfile/Network',\n ') Uninstall',\n ') Exit',\n]\n\nexport const clientSubEN = [[]]\n","import { ClientParams } from '../localeParams'\n\nexport const clientJA: ClientParams = [\n ') バリデータ-の状態を確認',\n ') バリデーターの鍵をダウンロード',\n ') バリデーターの鍵を作成',\n ') バリデーターの鍵をアップロード',\n ') 鍵/ネットワークを設定する',\n ') アンインストール',\n ') 終了',\n]\n\nexport const clientSubJA = [\n [],\n [\n ') バリデータ-の状態を確認',\n ') バリデーターのログを表示',\n ') バリデータ-を開始',\n ') バリデータ-を停止',\n ') バリデータ-を再起動 (fetch snapshot なし)',\n ') バリデータ-を再起動 (fetch snapshot あり)',\n ') メインメニューに戻る',\n ],\n [\n ') バリデータ-の設定を見る',\n ') バリデータ-の鍵の パス/アドレス/残高 を見る',\n ') 現在の エポック/スロット を見る',\n ') バリデーターの Catchup 情報を見る',\n ') バリデーターのモニター情報を見る',\n ') メインメニューに戻る',\n ],\n [\n ') バリデーターの鍵をバックアップ',\n ') バリデーターの鍵をリストア',\n ') メインメニューに戻る',\n ],\n [],\n [],\n [],\n]\n","import { LANGS } from '@/config/langs'\nimport cmdsEN from '@/locales/en/cmds'\nimport cmdsJA from '@/locales/ja/cmds'\nimport logsEN from '@/locales/en/logs'\nimport logsJA from '@/locales/ja/logs'\nimport { installerEN, installerSubEN } from '@/locales/en/installer'\nimport { installerJA, installerSubJA } from '@/locales/ja/installer'\nimport { LocaleParams } from '@/locales/localeParams'\nimport subCmdsEN from '@/locales/en/subCmds'\nimport subCmdsJA from '@/locales/ja/subCmds'\nimport { clientEN } from './en/client'\nimport { clientJA } from './ja/client'\n\nconst readLocale = (lang: LANGS) => {\n let locales: LocaleParams = {\n cmds: cmdsEN,\n subCmds: subCmdsEN,\n logs: logsEN,\n installer: installerEN,\n installerSub: installerSubEN,\n clientCmds: clientEN,\n }\n switch (lang) {\n case LANGS.EN:\n locales = {\n cmds: cmdsEN,\n subCmds: subCmdsEN,\n logs: logsEN,\n installer: installerEN,\n installerSub: installerSubEN,\n clientCmds: clientEN,\n }\n break\n case LANGS.JA:\n locales = {\n cmds: cmdsJA,\n subCmds: subCmdsJA,\n logs: logsJA,\n installer: installerJA,\n installerSub: installerSubJA,\n clientCmds: clientJA,\n }\n break\n default:\n locales = {\n cmds: cmdsEN,\n subCmds: subCmdsEN,\n logs: logsEN,\n installer: installerEN,\n installerSub: installerSubEN,\n clientCmds: clientEN,\n }\n }\n return locales\n}\n\nexport default readLocale\n","import { CONFIG, CONFIG_TYPE, FILES } from '@/config/config'\nimport { LocaleParams } from '@/locales/localeParams'\nimport readLocale from '@/locales/readLocale'\nimport { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { updateSolvConfig } from './updateSolvConfig'\nimport { homedir } from 'os'\n\nexport type ConfigParams = {\n config: CONFIG_TYPE\n locale: LocaleParams\n}\n\nexport const readOrCreateDefaultConfig = () => {\n const homeDir = homedir()\n const configPath = `${homeDir}/${FILES.CONFIG}`\n if (!existsSync(configPath)) {\n writeFileSync(configPath, JSON.stringify(CONFIG, null, 2))\n console.log(`Created default config file at ${configPath}`)\n }\n let config: CONFIG_TYPE\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8')) as CONFIG_TYPE\n } catch (error) {\n console.log('Error parsing config file. Renewing config file.')\n writeFileSync(configPath, JSON.stringify(CONFIG, null, 2))\n config = CONFIG\n }\n const locale = readLocale(config.LANG)\n // Set default RPC_URL if not set\n if (!config.RPC_URL) {\n config.RPC_URL = CONFIG.RPC_URL\n updateSolvConfig({ RPC_URL: CONFIG.RPC_URL })\n }\n\n // Set IS_MEV_MODE to false if not set\n if (config.IS_MEV_MODE === undefined) {\n config.IS_MEV_MODE = false\n updateSolvConfig({ IS_MEV_MODE: false })\n }\n\n // Set DISCORD_WEBHOOK_URL to empty string if not set\n if (!config.DISCORD_WEBHOOK_URL) {\n config.DISCORD_WEBHOOK_URL = ''\n updateSolvConfig({ DISCORD_WEBHOOK_URL: '' })\n }\n return { config, locale } as ConfigParams\n}\n","import { CONFIG_TYPE, FILES, PartialConfigType } from '@/config/config'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { homedir } from 'os'\n\nexport const updateSolvConfig = (config: PartialConfigType) => {\n // update ~/solv.config.json with new values\n const homeDir = homedir()\n const solvConfigFile = `${homeDir}/${FILES.CONFIG}`\n const solvConfig = JSON.parse(\n readFileSync(solvConfigFile, 'utf8'),\n ) as CONFIG_TYPE\n // unique values\n const updatedConfig: CONFIG_TYPE = {\n ...solvConfig,\n ...config,\n }\n const updatedConfigString = JSON.stringify(updatedConfig, null, 2)\n writeFileSync(solvConfigFile, updatedConfigString)\n}\n","import { SNAPSHOTS_PATH } from '@/config/constants'\nimport { VERSION_MAINNET } from '@/config/versionConfig';\nimport { spawnSync } from 'node:child_process'\n\nexport const getSnapshot = (\n isTest = false,\n minDownloadSpeed = '45',\n snapshotPath = SNAPSHOTS_PATH,\n version = VERSION_MAINNET,\n rpcUrl = isTest ? 'https://api.testnet.solana.com' : 'https://api.mainnet-beta.solana.com',\n useAvorio = false,\n) => {\n try {\n let cmd = `docker run -it --rm -v ${snapshotPath}:${snapshotPath} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${snapshotPath} --min_download_speed ${minDownloadSpeed} --version ${version} --rpc ${rpcUrl}`\n if (isTest && useAvorio) {\n spawnSync(\n `wget --trust-server-names https://snapshots.avorio.network/testnet/snapshot.tar.bz2 https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2 && for file in snapshot-* incremental-snapshot-*; do mv \"$file\" \"$(echo \"$file\" | sed 's/\\\\?.*$//')\"; done`,\n { shell: true, stdio: 'inherit', cwd: snapshotPath },\n );\n return\n }\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n } catch (error) {\n throw new Error(`getSnapshot Error: ${error}`)\n }\n}\n","import { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nexport const frankendancerUpdate = async (config: DefaultConfigType, version?: string, mod = false) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const firedancerVersion = version || (isTestnet ? VERSION_FIREDANCER_TESTNET : VERSION_FIREDANCER)\n const isModified = mod || config.MOD\n\n // Update Firedancer\n if (isModified) {\n spawnSync(\n `git -C /home/solv/firedancer fetch origin`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer checkout v${firedancerVersion}-mod`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer submodule update --init --recursive`,\n { shell: true, stdio: 'inherit' },\n )\n } else {\n spawnSync(\n `git -C /home/solv/firedancer fetch origin`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer checkout v${firedancerVersion}`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer submodule update --init --recursive`,\n { shell: true, stdio: 'inherit' },\n )\n }\n \n\n // Temp rust bug\n // spawnSync(`rustup uninstall 1.84.1-x86_64-unknown-linux-gnu`, {\n // shell: true,\n // stdio: 'inherit',\n // cwd: '/home/solv/firedancer',\n // })\n // spawnSync(`rustup install 1.84.1`, {\n // shell: true,\n // stdio: 'inherit',\n // cwd: '/home/solv/firedancer',\n // })\n\n // Rebuild Firedancer\n spawnSync(\n `export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install`,\n {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n },\n )\n spawnSync(\n `make -j fdctl solana`,\n {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n },\n )\n\n // Restart services\n spawnSync(\n `sudo systemctl restart frankendancer`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`sudo rm -rf /mnt/accounts/snapshot`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `sudo systemctl restart port-relay`,\n { shell: true, stdio: 'inherit' },\n )\n}\n","import { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n\nexport const rmSnapshot = (config: DefaultConfigType) => {\n spawnSync(`sudo rm -rf /mnt/ledger/*`, {\n shell: true,\n stdio: 'inherit',\n })\n if(config.SNAPSHOTS_PATH !== '/mnt/ledger') {\n spawnSync(`sudo rm -rf ${config.SNAPSHOTS_PATH}/*`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n spawnSync(`sudo rm -rf /mnt/accounts/*`, {\n shell: true,\n stdio: 'inherit',\n })\n}\n","import { startupScriptPaths } from '@/config/config'\nimport { spawnSync } from 'node:child_process'\n\nexport type TailOptions = {\n info: boolean\n warning: boolean\n error: boolean\n all: boolean\n}\n\nexport const tail = (options: TailOptions) => {\n try {\n const { log } = startupScriptPaths()\n let cmd = `tail -f ${log}`\n if (options.error) {\n cmd += ` | grep '\\\\(WARN\\\\|ERR\\\\)'`\n } else if (options.info) {\n cmd += ` | grep INFO`\n } else if (options.warning) {\n cmd += ` | grep WARN`\n }\n\n console.log(cmd)\n const result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n\n if (result.error) {\n throw result.error\n }\n\n if (result.signal === 'SIGINT') {\n console.log('Child process terminated due to receipt of SIGINT signal')\n process.exit(0)\n } else if (result.status !== 0) {\n console.error(`Child process exited with code ${result.status}`)\n process.exit(result.status)\n }\n } catch (error) {\n console.error(`tail Error: ${error}`)\n process.exit(1)\n }\n}\n","import { program } from '@/index'\nimport { tail } from './tail'\n\nexport const logCommands = () => {\n program\n .command('log')\n .description('tail logs')\n .alias('l')\n .description('tail logs')\n .option('-i, --info', 'Follow INFO output', false)\n .option('-w, --warning', 'Follow WARN output', false)\n .option('-e, --error', 'Follow ERR/WARN output', false)\n .option('-a, --all', 'Follow All output', false)\n .action((options) => {\n tail(options)\n })\n}\n","import { program } from '@/index'\nimport chalk from 'chalk'\nimport { setupVoteAccount } from '@/cli/setup/setupVoteAccount'\nimport { createSolvKeyPairs } from '@/lib/createSolvKeys'\nimport { DefaultConfigType } from '@/config/types'\nimport jupiterAPISetup from '@/cli/setup/template/jupiter/jupiterAPISetup'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { daemonReload } from '@/lib/daemonReload'\nimport { setupV2 } from './setupV2'\nimport { jitoRelayerSetup } from './jitoRelayerSetup'\nimport rpcLog from '@/utils/rpcLog'\nimport { yellowstoneGeyser } from './template/geyser/yellowstoneGeyser'\nimport setupFiredancer from './firedancer/setupFiredancer'\n\ntype SetupOptions = {\n vote: boolean\n key: boolean\n relayer: boolean\n jupiter: boolean\n geyser: boolean\n firedancer: boolean\n skipInitConfig: boolean\n skipMount: boolean\n pivot: boolean\n mod: boolean\n}\n\nexport const setupCommands = (config: DefaultConfigType) => {\n program\n .command('setup')\n .description(`Setup Solana Validator`)\n .option('--vote', 'Setup Vote Account', false)\n .option('--key', 'Setup Validator Keypairs', false)\n .option('--relayer', 'Setup Jito Relayer', false)\n .option('--jupiter', 'Setup Jupiter Swap API', false)\n .option('--geyser', 'Setup Geyser', false)\n .option('--firedancer', 'Setup Firedancer', false)\n .option('--skip-init-config', 'Skip Initial Config', false)\n .option('--skip-mount', 'Skip Mount', false)\n .option('--pivot', 'Pivot install', false)\n .option('--mod', 'Modified install', false)\n .action(async (options: SetupOptions) => {\n const isModded = config.MOD || options.mod\n try {\n if (options.vote) {\n console.log(chalk.white('🗳️ Setting up Vote Account ...'))\n setupVoteAccount(config)\n process.exit(0)\n } else if (options.key) {\n console.log(chalk.white('🔑 Setting up Validator Keypairs ...'))\n createSolvKeyPairs(config)\n process.exit(0)\n } else if (options.relayer) {\n console.log(chalk.white('🛰️ Setting up Jito Relayer ...'))\n const jitoConfig = await readOrCreateJitoConfig()\n const blockEngineUrl = jitoConfig.blockEngineUrl\n const isCoHost = false\n await jitoRelayerSetup(blockEngineUrl, isCoHost)\n console.log(\n chalk.green(\n 'Jito Relayer Setup Completed\\n\\n$ solv relayer --help',\n ),\n )\n daemonReload()\n rpcLog()\n process.exit(0)\n } else if (options.jupiter) {\n console.log(chalk.white('🌏 Setting up Jupiter Swap API ...'))\n await jupiterAPISetup()\n daemonReload()\n rpcLog()\n process.exit(0)\n } else if (options.geyser) {\n console.log(chalk.white('⚡️ Setting up Geyser ...'))\n await yellowstoneGeyser()\n return\n } else if (options.firedancer) {\n console.log(chalk.white('🔥 Setting up Firedancer ...'))\n await setupFiredancer(isModded)\n return\n }\n await setupV2(\n options.skipInitConfig,\n options.skipMount,\n options.pivot,\n isModded,\n )\n } catch (error: any) {\n if (\n error.message.includes('User force closed the prompt') ||\n error.message.includes('initialConfigSetup')\n ) {\n console.error(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.error(chalk.red(`Setup Error: ${error.message}`))\n process.exit(0)\n }\n })\n}\n","import { NETWORK_TYPES, getAllKeyPaths } from '@/config/config'\nimport { Network } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'child_process'\nimport { homedir } from 'os'\n\nexport const setupVoteAccount = (config: DefaultConfigType) => {\n const homeDir = homedir()\n const allKeyPaths = getAllKeyPaths(homeDir)\n let validatorVoteKey = allKeyPaths.testnetValidatorVoteKey\n let validatorKey = allKeyPaths.testnetValidatorKey\n let validatorAuthorityKey = allKeyPaths.testnetValidatorAuthorityKey\n let network = NETWORK_TYPES.TESTNET\n const commision = config.COMMISSION\n\n if (config.NETWORK === Network.MAINNET) {\n validatorVoteKey = allKeyPaths.mainnetValidatorVoteKey\n validatorKey = allKeyPaths.mainnetValidatorKey\n validatorAuthorityKey = allKeyPaths.mainnetValidatorAuthorityKey\n network = NETWORK_TYPES.MAINNET\n }\n\n console.log(\n `⌛️ Creating vote account with commission ${commision} - ${network}`,\n )\n let url = config.RPC_URL || network\n if (config.NETWORK === Network.TESTNET) {\n url = NETWORK_TYPES.TESTNET\n }\n const cmd = `solana create-vote-account ${validatorVoteKey} ${validatorKey} ${validatorAuthorityKey} --commission ${commision} --url ${url} --keypair ${validatorKey}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'child_process'\nimport { existsSync, readdirSync, rmSync } from 'fs'\nimport { homedir } from 'os'\nimport { KEYPAIRS } from '@/config/config'\nimport path from 'path'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\n\nexport const createSolvKeyPairs = (config: DefaultConfigType) => {\n let genKeys = []\n let keyNum = 0\n if (config.NODE_TYPE === NodeType.RPC) {\n genKeys = [KEYPAIRS.MAINNET_VALIDATOR_KEY]\n keyNum = 1\n }\n if (config.NETWORK === Network.TESTNET) {\n genKeys = [\n KEYPAIRS.TESTNET_VALIDATOR_KEY,\n KEYPAIRS.TESTNET_VALITATOR_AUTHORITY_KEY,\n KEYPAIRS.TESTNET_VALIDATOR_VOTE_KEY,\n KEYPAIRS.MAINNET_VALIDATOR_KEY,\n KEYPAIRS.MAINNET_VALITATOR_AUTHORITY_KEY,\n KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY,\n ]\n keyNum = 6\n } else {\n genKeys = [\n KEYPAIRS.MAINNET_VALIDATOR_KEY,\n KEYPAIRS.MAINNET_VALITATOR_AUTHORITY_KEY,\n KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY,\n ]\n keyNum = 3\n }\n\n const cmd = `solana-keygen grind --starts-and-ends-with E:SV:${keyNum}`\n spawnSync(cmd, { shell: true, stdio: 'ignore' })\n const files = readdirSync('./').filter((f) => f.endsWith('SV.json'))\n const keyDir = homedir()\n const unstakedKeyPath = path.join(keyDir, 'unstaked-identity.json')\n if (existsSync(unstakedKeyPath)) {\n spawnSync(`mv ${unstakedKeyPath} ${keyDir}/unstaked-identity.backup.json`, {\n shell: true,\n stdio: 'ignore',\n })\n }\n let i = 0\n for (const file of files) {\n const keyPath = path.join(keyDir, genKeys[i])\n i++\n if (existsSync(keyPath)) {\n console.log(`${keyPath} is already exist!`)\n rmSync(file, { recursive: true })\n continue\n }\n const cmd = `mv ${file} ${keyPath}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n }\n spawnSync(\n 'solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json',\n { shell: true, stdio: 'ignore' },\n )\n console.log(`Generated keypairs - ${keyDir}`)\n}\n","import { spawnSync } from 'child_process'\nimport jupiterAPIService from '@/cli/setup/template/jupiter/jupiterAPIService'\nimport inquirer from 'inquirer'\nimport chalk from 'chalk'\nimport rpcLog from '@/utils/rpcLog'\n\ntype JupiterAPISetupOptions = {\n rpcUrl: string\n grpcUrl: string\n grpcToken: string\n}\n\nconst jupiterAPISetup = async () => {\n const questions = await inquirer.prompt<JupiterAPISetupOptions>([\n {\n name: 'rpcUrl',\n message: 'Enter RPC URL',\n type: 'input',\n default: 'http://localhost:8899',\n },\n {\n name: 'grpcUrl',\n message: 'Enter GRPC URL',\n type: 'input',\n default: 'http://localhost:10000',\n },\n {\n name: 'grpcToken',\n message: 'Enter GRPC Token',\n type: 'input',\n default: 'token',\n },\n ])\n const cmd = `sudo apt-get install unzip wget -y\nwget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip\nunzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip\nchmod +x jupiter-swap-api\nrm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n const { filePath, body } = jupiterAPIService(\n questions.rpcUrl,\n questions.grpcUrl,\n questions.grpcToken,\n )\n spawnSync(`echo '${body}' | sudo tee ${filePath}`, {\n shell: true,\n stdio: 'inherit',\n })\n console.log(\n chalk.white('🟢 Jupiter Swap API Setup Completed\\n\\n$ solv jupiter --help'),\n )\n}\n\nexport default jupiterAPISetup\n","const jupiterAPIService = (\n rpcUrl: string,\n grpcUrl: string,\n grpcToken: string,\n port = 2001,\n) => {\n const filePath = '/etc/systemd/system/jupiter-api.service'\n const body = `[Unit]\nDescription=Jupiter API Service Instance\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/home/solv/jupiter-swap-api --rpc-url ${rpcUrl} --yellowstone-grpc-endpoint ${grpcUrl} --yellowstone-grpc-x-token \"${grpcToken}\" --port ${port}\nWorkingDirectory=/home/solv\nRestart=always\nUser=solv\nEnvironment=NODE_ENV=production\nEnvironment=RUST_LOG=info\nEnvironment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx\n\n[Install]\nWantedBy=multi-user.target`\n return { filePath, body }\n}\n\nexport default jupiterAPIService\n","import { FILES } from '@/config/config'\nimport { JITO_CONFIG, JitoConfig } from '@/config/jitConfig'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { readFile, writeFile } from 'fs/promises'\nimport { homedir } from 'os'\nimport path from 'path'\n\nexport const readOrCreateJitoConfig = async () => {\n const homeDir = homedir()\n const configPath = path.join(homeDir, FILES.JITO_CONFIG)\n if (!(await existsAsync(configPath))) {\n await writeFile(configPath, JSON.stringify(JITO_CONFIG, null, 2))\n console.log(`Created jito config file at ${configPath}`)\n }\n let config: JitoConfig\n try {\n config = JSON.parse(await readFile(configPath, 'utf-8')) as JitoConfig\n } catch (error) {\n console.log(`readOrCreateJitoConfig - ${error}`)\n await writeFile(configPath, JSON.stringify(JITO_CONFIG, null, 2))\n config = JITO_CONFIG\n }\n return config\n}\n","import { spawnSync } from 'child_process'\n\nexport const daemonReload = () => {\n spawnSync('sudo systemctl daemon-reload', { shell: true, stdio: 'inherit' })\n}\n","import DEFAULT_CONFIG from '@/config/defaultConfig'\nimport {\n Network,\n NETWORK_TYPES,\n NODE_TYPES,\n NodeType,\n RPC_MODE,\n RpcType,\n ValidatorType,\n} from '@/config/enums'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport { askJitoSetting } from '../askJitoSetting'\nimport { updateJitoSolvConfig } from '@/lib/updateJitoSolvConfig'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\n\ntype SolvInitialConfig = {\n network: Network\n nodeType: NodeType\n}\n\n// Setup initial config in solv4.config.json\nconst initialConfigSetup = async () => {\n try {\n // Setup solv config\n let validatorType: ValidatorType = ValidatorType.NONE\n let rpcType: RpcType = RpcType.AGAVE\n let commission = DEFAULT_CONFIG.COMMISSION\n let isDummy = false\n const answer = await inquirer.prompt<SolvInitialConfig>([\n {\n name: 'network',\n type: 'list',\n message: 'Choose Network',\n choices: NETWORK_TYPES,\n default: Network.MAINNET,\n },\n {\n name: 'nodeType',\n type: 'list',\n message: 'Choose Node Type',\n choices: NODE_TYPES,\n default: NodeType.RPC,\n },\n ])\n let isTestnet = answer.network === Network.TESTNET\n if (answer.nodeType === NodeType.VALIDATOR) {\n const validatorChoices =\n answer.network === Network.MAINNET\n ? [ValidatorType.JITO, ValidatorType.SOLANA]\n : [\n ValidatorType.AGAVE,\n ValidatorType.JITO,\n ValidatorType.FRANKENDANCER,\n ]\n validatorType = await inquirer\n .prompt<{ validatorType: ValidatorType }>({\n name: 'validatorType',\n type: 'list',\n message: 'Choose Validator Type',\n choices: validatorChoices,\n default: ValidatorType.AGAVE,\n })\n .then((answer) => answer.validatorType)\n rpcType = RpcType.NONE\n }\n if (answer.nodeType === NodeType.RPC) {\n rpcType = await inquirer\n .prompt<{ rpcType: RpcType }>({\n name: 'rpcType',\n type: 'list',\n message: 'Choose RPC Type',\n choices: RPC_MODE,\n default: RpcType.AGAVE,\n })\n .then((answer) => answer.rpcType)\n }\n\n if (answer.nodeType === NodeType.VALIDATOR) {\n const answer = await inquirer.prompt<{\n commission: number\n isDummy: boolean\n }>([\n {\n name: 'commission',\n type: 'number',\n message: `What is your commission rate? You can change it later (default: ${DEFAULT_CONFIG.COMMISSION}%)'`,\n default: DEFAULT_CONFIG.COMMISSION,\n },\n {\n name: 'isDummy',\n type: 'confirm',\n message:\n 'Do you want to setup as a dummy(Inactive) node?(※For Migration)',\n default: true,\n },\n ])\n commission = answer.commission\n isDummy = answer.isDummy\n if (validatorType === ValidatorType.JITO || validatorType === ValidatorType.FRANKENDANCER) {\n await readOrCreateJitoConfig()\n const jitoConfig = await askJitoSetting(isTestnet)\n await updateJitoSolvConfig(jitoConfig)\n }\n }\n\n const { network, nodeType } = answer\n console.log(chalk.white('Network:', network))\n console.log(chalk.white('Node Type:', nodeType))\n console.log(chalk.white('Validator Type:', validatorType))\n console.log(chalk.white('RPC Type:', rpcType))\n if (nodeType === NodeType.VALIDATOR) {\n console.log(chalk.white('Commission:', commission))\n }\n\n await updateDefaultConfig({\n NETWORK: network,\n NODE_TYPE: nodeType,\n VALIDATOR_TYPE: validatorType,\n RPC_TYPE: rpcType,\n COMMISSION: commission,\n IS_DUMMY: isDummy,\n })\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport default initialConfigSetup\n","import { JITO_CONFIG, JITO_REGIONS, JitoConfig } from '@/config/jitConfig'\nimport inquirer from 'inquirer'\n\nexport const askJitoSetting = async (isTestnet: boolean) => {\n const commissionBps = 1000\n const jitRegions = isTestnet\n ? Object.keys(JITO_REGIONS.TESTNET)\n : Object.keys(JITO_REGIONS.MAINNET)\n const regionType = isTestnet ? JITO_REGIONS.TESTNET : JITO_REGIONS.MAINNET\n const answer = await inquirer.prompt<{\n commissionBps: number\n region: string\n isRelayer: boolean\n }>([\n {\n name: 'commissionBps',\n type: 'number',\n message: 'Enter commission bps',\n default: commissionBps,\n },\n {\n name: 'region',\n type: 'list',\n message: 'Select region',\n choices: jitRegions,\n },\n ])\n const regionKey = answer.region as keyof typeof regionType\n const regionArgs = regionType[regionKey]\n const result = {\n version: JITO_CONFIG.version,\n tag: JITO_CONFIG.tag,\n commissionBps: answer.commissionBps,\n blockEngineUrl: regionArgs.BLOCK_ENGINE_URL,\n relayerUrl: regionArgs.RELAYER_URL,\n shredReceiverAddr: regionArgs.SHRED_RECEIVER_ADDR,\n } as JitoConfig\n\n return result\n}\n","import { VERSION_JITO_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\n\nexport const installJito = (version = VERSION_JITO_TESTNET, mod = false) => {\n if(mod) {\n const tag = `v${version}-mod`\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `source /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`mkdir /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git -C /tmp/${tag} clone https://github.com/gabrielhicks/jito-solana.git --recurse-submodules .`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag} checkout ${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag} submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag} rev-parse HEAD) /tmp/${tag}/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n } else {\n const tag = `v${version}-jito`\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git -C /tmp/${tag} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag} checkout ${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag} submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag} rev-parse HEAD) /tmp/${tag}/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n}\n","import {\n ACCOUNTS_PATH,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n LOG_PATH,\n SNAPSHOTS_PATH,\n} from '@/config/constants'\n\nexport const startJitoRPCScript = () => {\n const script = `#!/bin/bash\nexec agave-validator \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${ACCOUNTS_PATH} \\\\\n--ledger ${LEDGER_PATH} \\\\\n--snapshots ${SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--only-known-rpc \\\\\n--full-rpc-api \\\\\n--no-voting \\\\\n--private-rpc \\\\\n--enable-cpi-and-log-storage \\\\\n--no-skip-initial-accounts-db-clean \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--rpc-port 8899 \\\\\n--no-port-check \\\\\n--account-index program-id spl-token-mint spl-token-owner \\\\\n--enable-rpc-transaction-history \\\\\n--rpc-pubsub-enable-block-subscription \\\\\n--rpc-pubsub-enable-vote-subscription \\\\\n--no-wait-for-vote-to-start-leader \\\\\n--account-index-include-key Stake11111111111111111111111111111111111111 \\\\\n--account-index-include-key Config1111111111111111111111111111111111111 \\\\\n--account-index-include-key AddressLookupTab1e1111111111111111111111111 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 400000000 \\\\\n`\n return script\n}\n","import installAgave from '@/cli/install/installAgave'\nimport { installJito } from '@/cli/install/installJito'\nimport { STARTUP_SCRIPT } from '@/config/constants'\nimport { RpcType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\n// import { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { startJitoRPCScript } from '@/template/startupScripts/startJitoRPCScript'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { writeFile } from 'fs/promises'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\nimport { VERSION_JITO_TESTNET } from '@/config/versionConfig'\nimport { startRPCNodeScript } from '@/template/startupScripts/startRPCNodeScript'\n\nconst setupRpcNode = async (config: DefaultConfigType) => {\n const rpcType = config.RPC_TYPE\n let startupScript = ''\n switch (rpcType) {\n case RpcType.AGAVE:\n console.log('Agave RPC Node Setup')\n installAgave(config.TESTNET_SOLANA_VERSION)\n startupScript = startRPCNodeScript()\n break\n case RpcType.JITO:\n console.log('JITO RPC Node Setup')\n installJito(VERSION_JITO_TESTNET)\n startupScript = startJitoRPCScript()\n break\n // case RpcType.JUPITER_GEYSER:\n // installJito(config.TESTNET_SOLANA_VERSION)\n // break\n default:\n console.log('Unknown RPC Node Setup')\n break\n }\n if (await existsAsync(STARTUP_SCRIPT)) {\n console.log('Startup script already exists. Skipping...')\n return\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n}\n\nexport default setupRpcNode\n","import { STARTUP_SCRIPT } from '@/config/constants'\nimport { spawnSync } from 'node:child_process'\n\nconst updateStartupScriptPermission = () => {\n const cmd = `sudo chmod +x ${STARTUP_SCRIPT}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n\nexport default updateStartupScriptPermission\n","import {\n ACCOUNTS_PATH,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n LOG_PATH,\n SNAPSHOTS_PATH,\n} from '@/config/constants'\nexport const startRPCNodeScript = () => {\n const script = `#!/bin/bash\nexec agave-validator \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${ACCOUNTS_PATH} \\\\\n--ledger ${LEDGER_PATH} \\\\\n--snapshots ${SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--only-known-rpc \\\\\n--full-rpc-api \\\\\n--no-voting \\\\\n--private-rpc \\\\\n--enable-cpi-and-log-storage \\\\\n--no-skip-initial-accounts-db-clean \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--rpc-port 8899 \\\\\n--no-port-check \\\\\n--account-index program-id spl-token-mint spl-token-owner \\\\\n--enable-rpc-transaction-history \\\\\n--rpc-pubsub-enable-block-subscription \\\\\n--rpc-pubsub-enable-vote-subscription \\\\\n--no-wait-for-vote-to-start-leader \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 400000000 \\\\\n`\n return script\n}\n","import { spawnSync } from 'node:child_process'\n\n// Agave Install e.g. installAgave('0.1.0')\nconst installSolana = (version: string) => {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.solana.com/v${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n}\n\nexport default installSolana\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n MAINNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startJitoMainnetScript = (\n commissionBps = 1000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const script = `#!/bin/bash\nexec ${solanaCLI} \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${MAINNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${MAINNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--known-validator phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2 \\\\\n--known-validator wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\\\\n--tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\\\\n--merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\\\\n--commission-bps ${commissionBps} \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--snapshot-interval-slots 0 \\\\\n--private-rpc \\\\\n--full-rpc-api \\\\\n`\n return script\n}\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startJitoTestnetScript = (\n commissionBps = 1000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const script = `#!/bin/bash\nexec ${solanaCLI} \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${TESTNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${TESTNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint2.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint3.testnet.solana.com:8001 \\\\\n--known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\\\\n--known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\\\\n--known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\\\\n--tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\\\\n--tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\\\\n--merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\\\\n--commission-bps ${commissionBps} \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--private-rpc \\\\\n--wait-for-supermajority 343175553 \\\\\n--expected-shred-version 9065 \\\\\n--expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--full-rpc-api \\\\\n`\n return script\n}\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n MAINNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startMainnetValidatorScript = (config: DefaultConfigType, solanaCLI = 'agave-validator') => {\n const script = `#!/bin/bash\nexec ${solanaCLI} \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${MAINNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${MAINNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--known-validator phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2 \\\\\n--known-validator wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--snapshot-interval-slots 0 \\\\\n--private-rpc \\\\\n`\n return script\n}\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startTestnetAgaveValidatorScript = (config: DefaultConfigType) => {\n const script = `#!/bin/bash\nexec agave-validator \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${TESTNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${TESTNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint2.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint3.testnet.solana.com:8001 \\\\\n--known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\\\\n--known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\\\\n--known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\\\\n--only-known-rpc \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--private-rpc \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--wait-for-supermajority 343175553 \\\\\n--expected-shred-version 9065 \\\\\n--expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--full-rpc-api \\\\\n`\n return script\n}\n","import installAgave from '@/cli/install/installAgave'\nimport { installJito } from '@/cli/install/installJito'\nimport installSolana from '@/cli/install/installSolana'\nimport { STARTUP_SCRIPT } from '@/config/constants'\nimport { Network, ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { startJitoMainnetScript } from '@/template/startupScripts/startJitoMainnetScript'\nimport { startJitoTestnetScript } from '@/template/startupScripts/startJitoTestnetScript'\nimport { startMainnetValidatorScript } from '@/template/startupScripts/startMainnetValidatorScript'\nimport { startTestnetAgaveValidatorScript } from '@/template/startupScripts/startTestnetAgaveValidatorScript'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { writeFile } from 'fs/promises'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\n\nconst setupValidatorNode = async (config: DefaultConfigType, mod = false) => {\n const { NETWORK: network, MOD: modConfig } = config\n mod = modConfig\n if (network === Network.MAINNET) {\n console.log('Mainnet Validator Node Setup')\n await setupMainnetValidator(config, mod)\n } else if (network === Network.TESTNET) {\n console.log('Testnet Validator Node Setup')\n await setupTestnetValidator(config, mod)\n } else {\n console.log('Unknown Network Validator Node Setup')\n }\n}\n\nconst setupMainnetValidator = async (config: DefaultConfigType, mod = false) => {\n const { VALIDATOR_TYPE: validatorType, MAINNET_SOLANA_VERSION: version, MOD: modConfig } =\n config\n mod = modConfig\n let startupScript = ''\n switch (validatorType) {\n case ValidatorType.SOLANA:\n installSolana(version)\n startupScript = startMainnetValidatorScript(config)\n break\n // case ValidatorType.AGAVE:\n // console.log('Coming soon...🌉')\n // break\n case ValidatorType.JITO:\n console.log('JITO Validator Setup for Mainnet')\n const jitoConfig = await readOrCreateJitoConfig()\n installJito(version, mod)\n startupScript = startJitoMainnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n // case ValidatorType.FRANKENDANCER:\n // console.log('Coming soon...🌉')\n // break\n // case ValidatorType.FIREDANCER:\n // console.log('Coming soon...🌉')\n // break\n default:\n console.log('Unknown Validator Type for Mainnet')\n break\n }\n if (await existsAsync(STARTUP_SCRIPT)) {\n console.log('Startup script already exists. Skipping...')\n return\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n}\n\nconst setupTestnetValidator = async (config: DefaultConfigType, mod = false) => {\n const { VALIDATOR_TYPE: validatorType, MOD: modConfig } = config\n mod = modConfig\n let startupScript = ''\n switch (validatorType) {\n case ValidatorType.SOLANA:\n installSolana(config.TESTNET_SOLANA_VERSION)\n startupScript = startTestnetAgaveValidatorScript(config)\n case ValidatorType.AGAVE:\n console.log('Agave Validator Setup for Testnet')\n installAgave(config.TESTNET_SOLANA_VERSION, mod)\n startupScript = startTestnetAgaveValidatorScript(config)\n break\n case ValidatorType.JITO:\n console.log('JITO Validator Setup for Testnet')\n const jitoConfig = await readOrCreateJitoConfig()\n installJito(config.TESTNET_SOLANA_VERSION, mod)\n startupScript = startJitoTestnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n // case ValidatorType.FRANKENDANCER:\n // console.log('Coming soon...🌉')\n // break\n // case ValidatorType.FIREDANCER:\n // console.log('Coming soon...🌉')\n // break\n default:\n console.log('Unknown Validator Type for Testnet')\n break\n }\n if (await existsAsync(STARTUP_SCRIPT)) {\n console.log('Startup script already exists. Skipping...')\n return\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n}\n\nexport default setupValidatorNode\n","import readConfig from '@/config/readConfig'\nimport initialConfigSetup from './question/initialConfigSetup'\nimport { Network, NodeType, ValidatorType } from '@/config/enums'\nimport setupRpcNode from './rpc'\nimport setupValidatorNode from './validator'\nimport chalk from 'chalk'\nimport { setupDirs } from './mkdirs'\nimport mountDirs from './mount/mountDirs'\nimport { setupPermissions } from './userPermissions'\nimport { makeServices } from './makeServices'\nimport { setupKeys } from './setupKeys'\nimport { daemonReload } from '@/lib/daemonReload'\nimport { getSnapshot } from '../get/snapshot'\nimport { startSolana } from '../start/startSolana'\nimport setupCpuGovernor from './setupCpuGovernor'\nimport updateSysctlConfig from '@/template/updateSysctlConfig'\nimport { restartLogrotate } from '@/lib/restartLogrotate'\nimport { enableSolv } from '@/lib/enableSolv'\nimport { createSymLink } from './createSymLink'\nimport rpcLog from '@/utils/rpcLog'\nimport setupFiredancer from './firedancer/setupFiredancer'\n\nexport const setupV2 = async (skipInitConfig = false, skipMount = false, pivot = false, mod = false) => {\n try {\n if (!skipInitConfig) {\n console.log(chalk.white(`🟢 Initializing Setup`))\n // Init Config File - solv4.config.json is the new config file\n await readConfig()\n await initialConfigSetup()\n }\n\n let latestConfig = await readConfig()\n const isTest = latestConfig.NETWORK === Network.TESTNET\n // Generate /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n setupDirs()\n if (!skipMount || !pivot) {\n // Mount /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n await mountDirs()\n }\n\n // Generate Systemd Service\n makeServices(isTest)\n // Restart Logrotate\n restartLogrotate()\n // Set CPU governor to performance\n setupCpuGovernor()\n // Update Sysctl Config if needed\n await updateSysctlConfig()\n // Generate Solana Keys\n setupKeys(latestConfig)\n createSymLink(latestConfig.IS_DUMMY, isTest)\n latestConfig = await readConfig()\n // Generate Soalna Startup Script\n switch (latestConfig.NODE_TYPE) {\n case NodeType.RPC:\n await setupRpcNode(latestConfig)\n break\n case NodeType.VALIDATOR:\n await setupValidatorNode(latestConfig, mod)\n // Setup Firedancer if needed\n if (latestConfig.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER) {\n await setupFiredancer(mod, latestConfig)\n }\n break\n default:\n throw new Error('Unknown Node Type')\n }\n if(!pivot) {\n // Setup Permissions\n setupPermissions()\n }\n // Reload Daemon\n daemonReload()\n if (latestConfig.VALIDATOR_TYPE !== ValidatorType.FRANKENDANCER) {\n if(!pivot) {\n latestConfig = await readConfig()\n // Enable Solv Service\n enableSolv()\n // Download Snapshot\n getSnapshot(isTest, `100`, latestConfig.SNAPSHOTS_PATH, isTest ? latestConfig.TESTNET_SOLANA_VERSION : latestConfig.MAINNET_SOLANA_VERSION)\n }\n }\n if(!pivot) {\n // Start Solana\n startSolana(latestConfig)\n }\n console.log(chalk.white(`🟢 Setup Completed`))\n rpcLog()\n } catch (error: any) {\n throw new Error(`Setup Error: ${error.message}`)\n }\n}\n","import { execSync } from 'node:child_process'\n\nexport function createDirectoryIfNotExists(path: string): void {\n try {\n // Check if the directory exists\n execSync(`test -d ${path}`)\n console.log(`${path} already exists.`)\n } catch {\n // If the directory does not exist, create it with sudo privileges\n execSync(`sudo mkdir -p ${path}`)\n console.log(`${path} has been created.`)\n }\n}\n","import { MT_PATHS } from '@/config/config'\nimport { createDirectoryIfNotExists } from '@/lib/createDirectoryIfNotExists'\n\nexport const setupDirs = () => {\n try {\n const dirs = [MT_PATHS.ACCOUNTS, MT_PATHS.LEDGER, MT_PATHS.SNAPSHOTS]\n for (const dir of dirs) {\n createDirectoryIfNotExists(dir)\n }\n } catch (error) {\n throw new Error(`setupDirs Error: ${error}`)\n }\n}\n","import { execSync } from 'child_process'\n\nexport type DiskInfo = {\n name: string\n size: number\n mountpoint: string\n isMounted: boolean\n hasPartition: boolean\n type: 'NVMe' | 'SATA'\n}\n\nexport type GetPreferredDisksResult = {\n disks: DiskInfo[]\n has850GB: boolean\n has400GB: boolean\n hasUsed1250GB: boolean\n hasThirdDisk400GB: boolean\n}\n\n// This method can be improved later - Prioritize the NVMe disks over SATA disks\n// Currently, it is just selecting the first disk\nfunction getPreferredDisks(): GetPreferredDisksResult {\n const commandOutput = execSync('lsblk -l -b -o NAME,SIZE,MOUNTPOINT', {\n encoding: 'utf8',\n })\n const lines = commandOutput.split('\\n').slice(1) // skip the header line\n\n const disks: DiskInfo[] = []\n\n // Collecting all disk names to identify which ones have partitions\n const allDiskNames = lines.map((line) => line.trim().split(/\\s+/)[0])\n\n // Initialize the boolean flags\n let has850GB = false\n let has400GB = false\n let hasUsed1250GB = false\n let hasThirdDisk400GB = false\n let rootDiskName = ''\n\n for (const line of lines) {\n const [name, sizeStr, mountpoint] = line.trim().split(/\\s+/)\n if (!name || !sizeStr) continue // Skip empty lines or lines without required data\n\n const size = parseInt(sizeStr, 10)\n if (isNaN(size)) continue // Skip lines where size is not a number\n const isMounted = mountpoint !== undefined && mountpoint !== ''\n if (mountpoint === '/') rootDiskName = name.replace(/p?\\d*$/, '') // Remove any trailing digits\n\n const hasPartition = allDiskNames.some(\n (diskName) => diskName !== name && diskName.startsWith(name),\n )\n\n\n // Soft check if a drive is an NVMe based on its name\n const isNVMe = name.startsWith('nvme')\n const diskType = isNVMe ? 'NVMe' : 'SATA'\n if (size >= 400 * 1024 * 1024 * 1024) {\n disks.push({\n name,\n size,\n mountpoint: mountpoint || '',\n isMounted,\n hasPartition,\n type: diskType\n })\n }\n }\n console.log(\"Found root disk name: \", rootDiskName)\n\n // Collect partitions of the root disk\n const rootDiskPartitions = allDiskNames.filter((diskName) =>\n diskName.startsWith(rootDiskName),\n )\n\n rootDiskPartitions.forEach((partition) => console.log(\"Found root disk partition: \", partition))\n\n // Remove root disk and its partitions from the list of disks\n const checkedDisks = disks.filter(\n (disk) => !rootDiskPartitions.includes(disk.name),\n )\n\n // Sort disks by size\n const sortedDisks = checkedDisks.sort((a, b) => b.size - a.size)\n\n // Separate NVMe and SATA disks, and sort by size (largest first)\n const nvmeDisks = sortedDisks\n .filter((disk) => disk.type === 'NVMe')\n .sort((a, b) => b.size - a.size);\n const sataDisks = sortedDisks\n .filter((disk) => disk.type === 'SATA')\n .sort((a, b) => b.size - a.size);\n\n // Combine NVMe and SATA disks, prioritizing NVMe first\n const prioritizedDisks = [...nvmeDisks, ...sataDisks];\n\n // Check conditions based on sorted disks\n if (prioritizedDisks.length > 0) {\n const largestDisk = prioritizedDisks[0]\n if (largestDisk.size >= 850 * 1024 * 1024 * 1024 && !largestDisk.isMounted)\n has850GB = true\n if (largestDisk.size >= 1250 * 1024 * 1024 * 1024 && largestDisk.isMounted)\n hasUsed1250GB = true\n\n // Check second largest disk for has400GB\n if (prioritizedDisks.length > 1) {\n const secondLargestDisk = prioritizedDisks[1]\n if (\n secondLargestDisk.size >= 400 * 1024 * 1024 * 1024 &&\n !secondLargestDisk.isMounted\n )\n has400GB = true\n }\n\n // Check if a third disk is present\n if (prioritizedDisks.length > 2) {\n const thirdDisk = prioritizedDisks[2]\n if (\n thirdDisk.size >= 400 * 1024 * 1024 * 1024 &&\n !thirdDisk.isMounted\n ) {\n hasThirdDisk400GB = true\n }\n }\n }\n\n prioritizedDisks.forEach((disk, index) => console.log(`Prioritized Disk ${index + 1}: ${disk.name} ${disk.size}`))\n\n return { disks: prioritizedDisks, has850GB, has400GB, hasUsed1250GB, hasThirdDisk400GB }\n}\n\nexport default getPreferredDisks\n","import { spawnSync } from 'child_process'\n\nexport const formatDisk = (fileSystem: string) => {\n // Check if the disk is already formatted\n const checkDisk = spawnSync(`sudo blkid ${fileSystem}`, {\n shell: true,\n encoding: 'utf8',\n })\n\n // If the output is empty, the disk is not formatted\n if (!checkDisk.stdout.trim()) {\n const cmd = `sudo mkfs.ext4 ${fileSystem}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n spawnSync(`sudo udevadm trigger --action=change`, { shell: true })\n spawnSync(`sudo udevadm settle`, { shell: true })\n console.log(`${fileSystem} has been formatted.`)\n return true\n } else {\n spawnSync(`sudo udevadm trigger --action=change`, { shell: true })\n spawnSync(`sudo udevadm settle`, { shell: true })\n console.log(`${fileSystem} is already formatted.`)\n return false\n }\n}\n","import { MT_PATHS } from '@/config/config'\nimport sleep from '@/lib/sleep'\nimport { spawnSync } from 'child_process'\n\n/**\n * Helper to get UUID for a given device path\n */\n\nexport async function getUUID(devicePath: string): Promise<string> {\n for (let attempt = 1; attempt <= 5; attempt++) {\n const blkid = spawnSync(`sudo blkid -s UUID -o value ${devicePath}`, {\n shell: true,\n encoding: 'utf8',\n })\n\n const uuid = blkid.stdout.trim()\n\n if (uuid) {\n console.log(`[SUCCESS] Found UUID for ${devicePath}: ${uuid}`)\n return `UUID=${uuid}`\n }\n\n console.warn(\n `[WARN] Attempt ${attempt}: Failed to get UUID for ${devicePath}`,\n )\n await sleep(5000) // wait 1 second before retrying\n }\n\n console.error(`[ERROR] Giving up: No UUID for ${devicePath}, using raw path`)\n return devicePath\n}\n\n\nexport const ensureFstabEntries = async (\n fileSystem: string,\n fileSystem2 = '',\n fileSystem3 = '',\n isDouble = false,\n isTriple = false\n) => {\n const fs1 = await getUUID(fileSystem);\n const fs2 = await getUUID(fileSystem2);\n const fs3 = await getUUID(fileSystem3);\n\n let mtLine = `${fs1} ${MT_PATHS.ROOT} ext4 defaults 0 0`\n\n if (isDouble) {\n mtLine = `${fs1} ${MT_PATHS.LEDGER} ext4 defaults 0 0\n${fs2} ${MT_PATHS.ACCOUNTS} ext4 defaults 0 0`\n }\n\n if (isTriple) {\n mtLine = `${fs1} ${MT_PATHS.LEDGER} ext4 defaults 0 0\n${fs2} ${MT_PATHS.ACCOUNTS} ext4 defaults 0 0\n${fs3} ${MT_PATHS.SNAPSHOTS} ext4 defaults 0 0`\n }\n\n const lines = [mtLine]\n const output = spawnSync(`cat /etc/fstab`, {\n shell: true,\n encoding: 'utf8',\n })\n\n const fstabContent = output.stdout\n\n const linesToAdd: string[] = []\n\n for (const line of lines) {\n if (!fstabContent.includes(line)) {\n console.log(`[INFO] Line to add: ${line}`)\n linesToAdd.push(line)\n }\n }\n\n if (linesToAdd.length) {\n console.log(`[INFO] Lines to add all: ${linesToAdd}`)\n const addCmd = `echo \"${linesToAdd.join('\\n')}\" | sudo tee -a /etc/fstab`\n spawnSync(addCmd, {\n shell: true,\n encoding: 'utf8',\n })\n const reloadCmd = `sudo mount --all --verbose`\n spawnSync(reloadCmd, {\n shell: true,\n encoding: 'utf8',\n })\n console.log(`Added lines to /etc/fstab: \\n${linesToAdd.join('\\n')}`)\n } else {\n console.log('All lines are already present in /etc/fstab')\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const umount = (mountPath: string) => {\n try {\n const cmd = `sudo umount ${mountPath}`\n const { stderr } = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n if (stderr.includes('busy')) {\n return false\n }\n return true\n } catch (error) {\n console.log(`umount: ${error}`)\n return false\n }\n}\n","import getPreferredDisks, {\n GetPreferredDisksResult,\n} from '@/cli/check/mt/getLargestDisk'\nimport { MNT_DISK_TYPE } from '@/config/enums'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { formatDisk } from '../formatDisk'\nimport { ensureFstabEntries } from '@/cli/check/ensureMountAndFiles'\nimport { umount } from '@/cli/check/mt/umount'\nimport sleep from '@/lib/sleep'\n\nconst mountDirs = async () => {\n // This method can be improved later - Prioritize the NVMe disks over SATA disks\n // Currently, it is just selecting the first disk\n const disks: GetPreferredDisksResult = getPreferredDisks()\n\n const mountPoint = disks.disks[0].mountpoint\n // Detect if DISK_TYPE is TRIPLE, DOUBLE or SINGLE\n if (disks.has850GB && disks.has400GB && disks.disks.length >= 3) {\n // TRIPLE\n console.log('Setting up TRIPLE DISK...')\n\n await updateDefaultConfig({\n MNT_DISK_TYPE: MNT_DISK_TYPE.TRIPLE,\n })\n const fileSystemName1 = '/dev/' + disks.disks[0].name\n const fileSystemName2 = '/dev/' + disks.disks[1].name\n const fileSystemName3 = '/dev/' + disks.disks[2].name\n const isDisk1Formatted = formatDisk(fileSystemName1)\n const isDisk2Formatted = formatDisk(fileSystemName2)\n const isDisk3Formatted = formatDisk(fileSystemName3)\n\n let fileSystem1 = isDisk1Formatted ? fileSystemName1 : ''\n let fileSystem2 = isDisk2Formatted ? fileSystemName2 : ''\n let fileSystem3 = isDisk3Formatted ? fileSystemName3 : ''\n\n console.log('Waiting for formatting to finish...')\n await sleep(5000)\n \n await ensureFstabEntries(\n isDisk1Formatted ? fileSystem1 : '',\n isDisk2Formatted ? fileSystem2 : '',\n isDisk3Formatted ? fileSystem3 : '',\n false, // isDouble\n true // isTriple\n )\n } else if (disks.has850GB && disks.has400GB) {\n // DOUBLE\n console.log('Setting up DOUBLE DISK...')\n\n await updateDefaultConfig({\n MNT_DISK_TYPE: MNT_DISK_TYPE.DOUBLE,\n })\n const fileSystemName1 = '/dev/' + disks.disks[0].name\n const fileSystemName2 = '/dev/' + disks.disks[1].name\n const isDisk1Formatted = formatDisk(fileSystemName1)\n const isDisk2Formatted = formatDisk(fileSystemName2)\n\n let fileSystem1 = isDisk1Formatted ? fileSystemName1 : ''\n let fileSystem2 = isDisk2Formatted ? fileSystemName2 : ''\n\n await ensureFstabEntries(\n isDisk1Formatted ? fileSystem1 : '',\n isDisk2Formatted ? fileSystem2 : '',\n '', // No third disk\n true // isDouble\n )\n } else {\n // SINGLE\n console.log('Setting up SINGLE DISK...')\n await updateDefaultConfig({\n MNT_DISK_TYPE: MNT_DISK_TYPE.SINGLE,\n })\n\n if (!mountPoint.includes('/mnt')) {\n const fileSystem = '/dev/' + disks.disks[0].name\n formatDisk(fileSystem)\n await ensureFstabEntries(fileSystem)\n } else {\n umount(mountPoint)\n const fileSystem = '/dev/' + disks.disks[0].name\n formatDisk(fileSystem)\n await ensureFstabEntries(fileSystem)\n }\n }\n}\n\nexport default mountDirs\n","import { MT_PATHS } from '@/config/config'\nimport { spawnSync } from 'child_process'\n\nexport const setupPermissions = () => {\n const cmds = [\n `sudo mkdir -p ${MT_PATHS.ROOT}`,\n `sudo chown -R solv:solv ${MT_PATHS.ROOT}`,\n `sudo chmod -R 755 ${MT_PATHS.ROOT}`,\n `sudo mkdir -p ${MT_PATHS.ACCOUNTS}`,\n `sudo chown -R solv:solv ${MT_PATHS.ACCOUNTS}`,\n `sudo chmod -R 755 ${MT_PATHS.ACCOUNTS}`,\n `sudo mkdir -p ${MT_PATHS.LEDGER}`,\n `sudo chown -R solv:solv ${MT_PATHS.LEDGER}`,\n `sudo chmod -R 755 ${MT_PATHS.LEDGER}`,\n `sudo mkdir -p ${MT_PATHS.SNAPSHOTS}`,\n `sudo chown -R solv:solv ${MT_PATHS.SNAPSHOTS}`,\n `sudo chmod -R 755 ${MT_PATHS.SNAPSHOTS}`,\n ]\n\n for (const line of cmds) {\n spawnSync(line, { shell: true, stdio: 'ignore' })\n }\n}\n","import { SERVICE_PATHS } from '@/config/config'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\n\nexport function setupSystemd(): void {\n if (!existsSync(SERVICE_PATHS.SOL_SYSTEM_CONFIG21)) {\n console.log('Creating solana-validator.conf sysctl configuration file')\n\n const sysctlConfig = `\n# Increase UDP buffer sizes\nnet.core.rmem_default = 134217728\nnet.core.rmem_max = 134217728\nnet.core.wmem_default = 134217728\nnet.core.wmem_max = 134217728\n\n# Increase memory mapped files limit\nvm.max_map_count = 1000000\n\n# Increase number of allowed open file descriptors\nfs.nr_open = 1000000\n`\n\n const nofilesConfig = `\n# Increase process file descriptor count limit\n* - nofile 1000000\n`\n\n // Write sysctl configuration\n execSync(\n `echo \"${sysctlConfig}\" | sudo tee ${SERVICE_PATHS.SOL_SYSTEM_CONFIG21} > /dev/null`\n )\n\n // Apply sysctl configuration\n execSync(`sudo sysctl -p ${SERVICE_PATHS.SOL_SYSTEM_CONFIG21}`)\n\n // Update systemd configuration\n execSync(\n `echo \"DefaultFILE=1000000\" | sudo tee -a ${SERVICE_PATHS.SOL_SYSTEM_CONF}`\n )\n\n // Write nofiles configuration\n execSync(\n `echo \"${nofilesConfig}\" | sudo tee ${SERVICE_PATHS.SOL_NOFILES_CONF} > /dev/null`\n )\n }\n}\n","import { CONFIG, startupScriptPaths } from '@/config/config'\n\nexport const logRotates = (username = CONFIG.USERNAME, frankendancer: boolean) => {\n const { log } = startupScriptPaths()\n const service = frankendancer ? 'frankendancer' : 'agave'\n let body = `${log} {\n su ${username} ${username} \n daily\n rotate 1\n size 4G\n missingok\n compress\n postrotate\n systemctl kill -s USR1 solv.service\n endscript\n }\n `\n if (service === 'agave') {\n body = `${log} {\n su ${username} ${username} \n daily\n rotate 1\n size 4G\n missingok\n compress\n postrotate\n systemctl kill -s USR1 solv.service\n endscript\n }\n `\n return body\n }\n if (service === 'frankendancer') {\n body = `${log} {\n su ${username} ${username} \n daily\n size 4G\n rotate 1\n missingok\n compress\n copytruncate\n }\n `\n return body\n }\n return body\n}","import { logRotates } from '@/template/logRotates'\nimport { existsSync } from 'fs'\nimport { execSync } from 'child_process'\nimport { SERVICE_PATHS } from '@/config/config'\n\nexport function setupLogrotate(frankendancer = false): void {\n console.log('Creating logrotate configuration for solana')\n\n if (!frankendancer && existsSync(SERVICE_PATHS.SOL_LOGROTATE)) {\n console.log(\n 'SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.',\n )\n } \n if (!frankendancer && !existsSync(SERVICE_PATHS.SOL_LOGROTATE)) {\n const body = logRotates('solv', frankendancer)\n // Use sudo tee to write the file with superuser privileges\n execSync(\n `echo \"${body}\" | sudo tee ${SERVICE_PATHS.SOL_LOGROTATE} > /dev/null`,\n )\n console.log('Logrotate configuration created.')\n }\n if (frankendancer && existsSync(SERVICE_PATHS.FRANKENDANCER_LOGROTATE)) {\n console.log(\n 'FRANKENDANCER_LOGROTATE_PATH already exists. Skipping logrotate configuration.',\n )\n }\n if (frankendancer && !existsSync(SERVICE_PATHS.SOL_LOGROTATE)) {\n const body = logRotates('solv', frankendancer)\n // Use sudo tee to write the file with superuser privileges\n execSync(\n `echo \"${body}\" | sudo tee ${SERVICE_PATHS.FRANKENDANCER_LOGROTATE} > /dev/null`,\n )\n console.log('Logrotate configuration created.')\n }\n}\n","import { CONFIG, HOME_PATHS, startupScriptPaths } from '@/config/config'\n\nconst envMainnet =\n 'SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password'\nconst envTestnet =\n 'SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea'\n\nconst normalSolanaPath = `/home/${CONFIG.USERNAME}/.local/share/solana/install/active_release/bin`\n\nexport const solvService = (isTest = true) => {\n const { scriptPath } = startupScriptPaths(isTest)\n const environment = isTest ? envTestnet : envMainnet\n const solanaPath = normalSolanaPath\n const body = `[Unit]\nDescription=Solana Validator\nAfter=network.target\nStartLimitIntervalSec=0\n\n[Service]\nType=simple\nRestart=always\nRestartSec=1\nLimitNOFILE=1000000\nLogRateLimitIntervalSec=0\nUser=${CONFIG.USERNAME}\nEnvironment=PATH=${solanaPath}\nWorkingDirectory=${HOME_PATHS.ROOT}\nEnvironment=\"${environment}\"\nExecStart=${scriptPath}\n\n[Install]\nWantedBy=multi-user.target`\n return body\n}\n","import { solvService } from '@/template/solvService'\n\nimport { execSync } from 'child_process'\nimport { SERVICE_PATHS } from '@/config/config'\n\n// This will overwrite the solv.service file with the new configuration to easily switch between testnet and mainnet\nexport function setupSolvService(isTest = true): void {\n console.log('Creating solvService configuration for solana')\n const body = solvService(isTest)\n // Use sudo tee to write the file with superuser privileges\n execSync(`echo \"${body}\" | sudo tee ${SERVICE_PATHS.SOL_SERVICE} > /dev/null`)\n console.log('solv.service configuration created.')\n}\n","import { setupSystemd } from '@/cli/setup/setupSystemd'\nimport { setupLogrotate } from './setupLogrotate'\nimport { setupSolvService } from './setupSolvService'\n\nexport const makeServices = (isTest = true) => {\n setupLogrotate()\n setupSolvService(isTest)\n setupSystemd()\n}\n","import { spawnSync } from 'node:child_process'\nimport { createSolvKeyPairs } from '@/lib/createSolvKeys'\nimport { setupVoteAccount } from '@/cli/setup/setupVoteAccount'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport {\n MAINNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n} from '@/config/constants'\n\nexport const setupKeys = (config: DefaultConfigType) => {\n try {\n createSolvKeyPairs(config)\n const network = config.NETWORK\n // AirDrop 1 SOL if it's a testnet\n if (network === Network.TESTNET) {\n spawnSync(\n `solana config set --url ${network} -k ${TESTNET_VALIDATOR_KEY_PATH}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `solana airdrop 1 --url ${network} -k ${TESTNET_VALIDATOR_KEY_PATH}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `solana config set --url ${network} -k ${MAINNET_VALIDATOR_KEY_PATH}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n\n if (config.NODE_TYPE !== NodeType.RPC) {\n setupVoteAccount(config)\n }\n return true\n } catch (error) {\n throw new Error(`setupKeys Error: ${error}`)\n }\n}\n","import { ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n\nexport const startSolana = (config: DefaultConfigType) => {\n const service =\n config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n ? 'frankendancer'\n : 'solv'\n const cmd = [`sudo systemctl start ${service}`]\n spawnSync(cmd[0], { shell: true, stdio: 'inherit' })\n}\n","import { execSync } from 'node:child_process'\n\nconst setupCpuGovernor = () => {\n try {\n const cmd = `echo \"performance\" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor`\n execSync(cmd)\n } catch (error) {\n // ppl complain if they see error messages\n // console.error(\n // 'Error setting up CPU Governor\\nPlease Check your cpu governor yourself',\n // error,\n // )\n }\n}\n\nexport default setupCpuGovernor\n","import fs from 'fs'\nimport { promisify } from 'util'\nimport { execSync } from 'child_process'\n\nconst readFile = promisify(fs.readFile)\nconst access = promisify(fs.access)\n\nconst path = '/etc/sysctl.conf'\n\nconst sysconfig = `# set default and maximum socket buffer sizes to 128MB\nnet.core.rmem_default=134217728\nnet.core.wmem_default=134217728\nnet.core.rmem_max=134217728\nnet.core.wmem_max=134217728\n\n# set minimum, default, and maximum tcp buffer sizes (10k, 87.38k (linux default), 128MB resp)\nnet.ipv4.tcp_rmem=10240 87380 134217728\nnet.ipv4.tcp_wmem=10240 87380 134217728\n\n# Enable TCP westwood for kernels greater than or equal to 2.6.13\nnet.ipv4.tcp_congestion_control=westwood`\n\nasync function updateSysctlConfig(): Promise<void> {\n try {\n // Check if the file exists\n await access(path, fs.constants.F_OK)\n } catch (err) {\n return console.log(`Skipping updateSysctlConfig: ${path} does not exist`)\n }\n try {\n const data = await readFile(path, 'utf8')\n\n if (!data.includes('rmem_default')) {\n console.log('No need to update sysctl.conf')\n return\n }\n // Remove existing relevant lines\n let updatedConfig = data.replace(\n /net\\.core\\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\\n/g,\n '',\n )\n updatedConfig = updatedConfig.replace(\n /net\\.ipv4\\.tcp_(rmem|wmem|congestion_control)=.*\\n/g,\n '',\n )\n\n // Append new configuration\n updatedConfig += `\\n${sysconfig}\\n`\n\n // Write to the file using execSync and sudo tee\n execSync(`echo \"${updatedConfig}\" | sudo tee ${path} > /dev/null`)\n execSync('sudo sysctl -p')\n console.log('sysctl.conf updated successfully')\n } catch (err) {\n console.error(`Error: ${err}`)\n }\n}\n\nexport default updateSysctlConfig\n","import { spawnSync } from 'child_process'\n\nexport const restartLogrotate = () => {\n spawnSync('sudo systemctl restart logrotate', {\n shell: true,\n stdio: 'inherit',\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const enableSolv = () => {\n spawnSync('sudo systemctl enable solv', { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'child_process'\n\nexport const createSymLink = (isDummy = false, isTest = false) => {\n if (isDummy) {\n createInactiveSymLink()\n } else {\n createActiveSymLink(isTest)\n }\n}\n\nexport const createActiveSymLink = (isTest = false) => {\n let network = 'mainnet'\n if (isTest) {\n network = 'testnet'\n }\n spawnSync(\n `ln -sf /home/solv/${network}-validator-keypair.json /home/solv/identity.json`,\n { shell: true, stdio: 'inherit' },\n )\n}\n\nexport const createInactiveSymLink = () => {\n spawnSync(\n `ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json`,\n { shell: true, stdio: 'inherit' },\n )\n}\n","import chalk from 'chalk'\n\nconst rpcLog = () => {\n const lighting = `${chalk.yellow('⚡️⚡️⚡️')}`\n const msg = `${chalk.blueBright(`${lighting} Solana Private RPC Connection API Key ${lighting}`)}\n\nWe're excited to offer a free API key exclusively for the Validators DAO community 🎉\nIt's our way of supporting the community and empowering you with fast, reliable connections.\n\nTo get your free API key, simply join us through the link below:\n\nValidators DAO: ${chalk.white('`https://discord.gg/X4BgkBHavp`')}\n\nUnlock fast connections and elevate your experience with your very own API key 🚀\n`\n console.log(chalk.cyan(msg))\n}\n\nexport default rpcLog\n","import { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET, VERSION_MAINNET, VERSION_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { promises as fs } from 'fs'\nimport startFiredancerScript from './startFiredancerScript'\nimport firedancerService from '../template/firedancer/firedancerService'\nimport configToml from '../template/firedancer/configToml'\nimport portRelayService from '../template/firedancer/portRelayService'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { setupLogrotate } from '../setupLogrotate'\n\nconst setupFiredancer = async (mod = false, config?: DefaultConfigType) => {\n const isTest = config && config.NETWORK === Network.TESTNET ? true : false\n const latestVersion = isTest ? VERSION_FIREDANCER_TESTNET : VERSION_FIREDANCER\n const latestSubmoduleVersion = isTest ? VERSION_TESTNET : VERSION_MAINNET\n\n if (mod) {\n spawnSync(\n `git clone --recurse-submodules https://github.com/gabrielhicks/firedancer.git`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`git checkout v${latestVersion}-mod`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git checkout v${latestSubmoduleVersion}-mod`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer/agave',\n })\n spawnSync(`git add .`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git commit -m \"add mods\"`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n } else {\n spawnSync(\n `git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`git checkout v${latestVersion}`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n }\n // Temp rust bug\n spawnSync(`rustup uninstall 1.84.1-x86_64-unknown-linux-gnu`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`rustup install 1.84.1`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n\n spawnSync(\n `export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install`,\n {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n },\n )\n spawnSync(`make -j fdctl solana`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(\n `sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n const jitoConfig = await readOrCreateJitoConfig()\n const { filePath, body } = startFiredancerScript()\n spawnSync(`echo \"${body}\" | sudo tee ${filePath} > /dev/null`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo chmod +x ${filePath}`, { shell: true, stdio: 'inherit' })\n const fdService = firedancerService()\n spawnSync(\n `echo \"${fdService.body}\" | sudo tee ${fdService.filePath} > /dev/null`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n const prService = portRelayService()\n spawnSync(`sudo apt install socat`, { shell: true, stdio: 'inherit' })\n spawnSync(`sudo ufw allow 9600/tcp`, { shell: true, stdio: 'inherit' })\n spawnSync(\n `echo \"${prService.body}\" | sudo tee ${prService.filePath} > /dev/null`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n spawnSync(`sudo systemctl daemon-reload`, { shell: true })\n const toml = configToml(isTest, jitoConfig)\n\n await fs.writeFile(toml.filePath, toml.body, 'utf-8')\n\n console.log(`config.toml written to ${toml.filePath}`)\n spawnSync(`sudo chown solv:solv \"${toml.filePath}\"`, {\n shell: true,\n stdio: 'inherit',\n })\n setupLogrotate(true)\n}\n\nexport default setupFiredancer\n","const startFiredancerScript = () => {\n const filePath = '/home/solv/start-firedancer.sh'\n const body = `#!/usr/bin/env bash\nsudo chmod -R 755 /mnt\nsudo fdctl configure init all --config /home/solv/firedancer/config.toml\nsudo chown -R solv:solv /mnt\nsudo fdctl run --config /home/solv/firedancer/config.toml`\n return {\n filePath,\n body,\n }\n}\n\nexport default startFiredancerScript\n","const firedancerService = () => {\n const filePath = '/etc/systemd/system/frankendancer.service'\n const body = `[Unit]\nDescription=Firedancer Solana\nAfter=network.target\nStartLimitIntervalSec=0\n\n[Service]\nType=simple\nRestart=always\nRestartSec=1\nUser=solv\nLimitNOFILE=1000000\nLogRateLimitIntervalSec=0\nExecStart=/home/solv/start-firedancer.sh\n\n[Install]\nWantedBy=multi-user.target\n`\n\n return {\n filePath,\n body,\n }\n}\n\nexport default firedancerService\n","import { JitoConfig } from \"@/config/jitConfig\"\n\nconst configToml = (isTest: boolean, jitoConfig: JitoConfig) => {\n const filePath = '/home/solv/firedancer/config.toml'\n const mainnetBody = `name = \\\"fd1\\\"\nuser = \\\"solv\\\"\n\n[log]\n path = \\\"/home/solv/solana-validator.log\\\"\n colorize = \\\"auto\\\"\n level_logfile = \\\"INFO\\\"\n level_stderr = \\\"NOTICE\\\"\n level_flush = \\\"WARNING\\\"\n\n[reporting]\n solana_metrics_config = \\\"host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password\"\n\n[ledger]\n path = \\\"/mnt/ledger\\\"\n accounts_path = \\\"/mnt/accounts\\\"\n account_indexes = []\n account_index_exclude_keys = []\n snapshot_archive_format = \\\"zstd\\\"\n require_tower = false\n limit_size = 50_000_000\n enable_accounts_disk_index = false\n\n[snapshots]\n enabled = true\n incremental_snapshots = true\n path = \\\"/mnt/snapshots\\\"\n incremental_path = \\\"/mnt/snapshots\\\"\n maximum_full_snapshots_to_retain = 1\n maximum_incremental_snapshots_to_retain = 2\n\n[gossip]\n entrypoints = [\n \\\"entrypoint.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint2.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint3.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint4.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint5.mainnet-beta.solana.com:8001\\\"\n ]\n\n[consensus]\n identity_path = \\\"/home/solv/identity.json\\\"\n vote_account_path = \\\"/home/solv/mainnet-vote-account-keypair.json\\\"\n authorized_voter_paths = [\n \\\"/home/solv/mainnet-validator-keypair.json\\\"\n ]\n expected_genesis_hash = \\\"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d\\\"\n known_validators = [\n \\\"Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24\\\", \n \\\"7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2\\\",\n \\\"GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ\\\",\n \\\"CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S\\\",\n \\\"rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg\\\",\n \\\"phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1\\\",\n \\\"wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo\\\",\n \\\"YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV\\\",\n \\\"dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S\\\"\n ]\n\n[rpc]\n port = 8899\n only_known = true\n full_api = true\n private = true\n\n[layout]\n affinity = \\\"auto\\\"\n agave_affinity = \\\"auto\\\"\n net_tile_count = 1\n quic_tile_count = 1\n verify_tile_count = 6\n bank_tile_count = 4\n shred_tile_count = 1\n\n[tiles.bundle]\n enabled = true\n url = \\\"${jitoConfig.blockEngineUrl}\\\"\n tip_distribution_program_addr = \\\"4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7\\\"\n tip_payment_program_addr = \\\"T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt\\\"\n tip_distribution_authority = \\\"GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib\\\"\n commission_bps = 1000\n\n[tiles.pack]\n schedule_strategy = \\\"balanced\\\"`\n\n const testnetBody = `name = \\\"fd1\\\"\nuser = \\\"solv\\\"\n\n[log]\n path = \\\"/home/solv/solana-validator.log\\\"\n colorize = \\\"auto\\\"\n level_logfile = \\\"INFO\\\"\n level_stderr = \\\"NOTICE\\\"\n level_flush = \\\"WARNING\\\"\n\n[reporting]\n solana_metrics_config = \\\"host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea\\\"\n\n[ledger]\n path = \\\"/mnt/ledger\\\"\n accounts_path = \\\"/mnt/accounts\\\"\n account_indexes = []\n account_index_exclude_keys = []\n snapshot_archive_format = \\\"zstd\\\"\n require_tower = false\n limit_size = 50_000_000\n\n[snapshots]\n enabled = true\n incremental_snapshots = true\n path = \\\"/mnt/snapshots\\\"\n maximum_full_snapshots_to_retain = 1\n maximum_incremental_snapshots_to_retain = 2\n\n[gossip]\n entrypoints = [\n \\\"entrypoint.testnet.solana.com:8001\\\",\n \\\"entrypoint2.testnet.solana.com:8001\\\",\n \\\"entrypoint3.testnet.solana.com:8001\\\"\n ]\n\n[consensus]\n identity_path = \\\"/home/solv/identity.json\\\"\n vote_account_path = \\\"/home/solv/testnet-vote-account-keypair.json\\\"\n authorized_voter_paths = [\n \\\"/home/solv/testnet-validator-keypair.json\\\"\n ]\n expected_genesis_hash = \\\"4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY\\\"\n expected_bank_hash = \\\"4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk\\\"\n expected_shred_version = 9065\n known_validators = [\n \\\"5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on\\\", \n \\\"dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs\\\",\n \\\"Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN\\\",\n \\\"eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ\\\",\n \\\"rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg\\\",\n \\\"phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1\\\",\n \\\"hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M\\\",\n \\\"naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi\\\",\n \\\"9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv\\\"\n ]\n\n[rpc]\n port = 8899\n only_known = true\n full_api = true\n private = true\n\n[layout]\n affinity = \\\"auto\\\"\n agave_affinity = \\\"auto\\\"\n shred_tile_count = 1\n verify_tile_count = 1\n bank_tile_count = 1\n quic_tile_count = 1\n \n[tiles.bundle]\n enabled = true\n url = \\\"https://ny.testnet.block-engine.jito.wtf\\\"\n tip_distribution_program_addr = \\\"F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2\\\"\n tip_payment_program_addr = \\\"GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy\\\"\n tip_distribution_authority = \\\"GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib\\\"\n commission_bps = 10000\n\n[tiles.pack]\n schedule_strategy = \"balanced\"`\n\n const body = isTest ? testnetBody : mainnetBody\n\n return { filePath, body }\n}\n\nexport default configToml\n","const portRelayService = () => {\n const filePath = '/etc/systemd/system/port-relay.service'\n const body = `[Unit]\nDescription=Relay port 9600 to localhost:80\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/socat TCP4-LISTEN:9600,reuseaddr,fork TCP:127.0.0.1:80\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\n`\n\n return {\n filePath,\n body,\n }\n}\n\nexport default portRelayService\n","export const relayerService = (blockEngineUrl: string) => {\n const filePath = '/etc/systemd/system/relayer.service'\n const body = `# Example Systemd File for Co-Hosted Relayer\n[Unit]\nDescription=Solana transaction relayer\nRequires=network-online.target\nAfter=network-online.target\n\n# User is required to install a keypair here that's used to auth against the block engine\nConditionPathExists=/home/solv/relayer-keypair.json\nConditionPathExists=/home/solv/private.pem\nConditionPathExists=/home/solv/public.pem\n\n[Service]\nType=exec\nUser=solv\nRestart=on-failure\nEnvironment=RUST_LOG=info\nEnvironment=SOLANA_METRICS_CONFIG=\"host=http://metrics.jito.wtf:8086,db=relayer,u=relayer-operators,p=jito-relayer-write\"\nEnvironment=BLOCK_ENGINE_URL=${blockEngineUrl}\nEnvironment=GRPC_BIND_IP=127.0.0.1\n\nExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\\\\n --keypair-path=/home/solv/relayer-keypair.json \\\\\n --signing-key-pem-path=/home/solv/private.pem \\\\\n --verifying-key-pem-path=/home/solv/public.pem\n\n[Install]\nWantedBy=multi-user.target`\n return { filePath, body }\n}\n\nexport const jitoRelayerSeparateService = (blockEngineUrl: string) => {\n const filePath = '/etc/systemd/system/relayer.service'\n const body = `[Unit]\nDescription=Solana transaction relayer\nRequires=network-online.target\nAfter=network-online.target\n\n# User is required to install a keypair here that's used to auth against the block engine\nConditionPathExists=/home/solv/relayer-keypair.json\nConditionPathExists=/home/solv/private.pem\nConditionPathExists=/home/solv/public.pem\n\n[Service]\nType=exec\nUser=solv\nRestart=on-failure\nEnvironment=RUST_LOG=info\nEnvironment=SOLANA_METRICS_CONFIG=\"host=http://metrics.jito.wtf:8086,db=relayer,u=relayer-operators,p=jito-relayer-write\"\nEnvironment=BLOCK_ENGINE_URL=${blockEngineUrl}\nEnvironment=RPC_SERVERS=https://your.rpc.server\nEnvironment=WEBSOCKET_SERVERS=wss://your.websocket.server\n\nExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\\n --keypair-path=/home/solv/relayer-keypair.json \\\n --signing-key-pem-path=/home/solv/private.pem \\\n --verifying-key-pem-path=/home/solv/public.pem \\\n --forward-all\n\n[Install]\nWantedBy=multi-user.target`\n return { filePath, body }\n}\n","import {\n jitoRelayerSeparateService,\n relayerService,\n} from '@/template/relayerService'\nimport { execSync, spawnSync } from 'child_process'\n\nexport const jitoRelayerSetup = async (\n blockEngineUrl: string,\n isCoHost = true,\n) => {\n // Create openssl keypair\n spawnSync('openssl', ['genrsa', '-out', '/home/solv/private.pem'], {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(\n 'openssl',\n [\n 'rsa',\n '-in',\n '/home/solv/private.pem',\n '-pubout',\n '-out',\n '/home/solv/public.pem',\n ],\n { stdio: 'inherit', shell: true },\n )\n\n // Create relayer keypair\n spawnSync(\n 'solana-keygen',\n [\n 'new',\n '--no-bip39-passphrase',\n '--outfile',\n '/home/solv/relayer-keypair.json',\n ],\n { stdio: 'inherit', shell: true },\n )\n\n // Clone and build relayer\n spawnSync(\n 'git',\n ['clone', 'https://github.com/jito-foundation/jito-relayer.git'],\n {\n stdio: 'inherit',\n shell: true,\n },\n )\n spawnSync('git', ['submodule', 'update', '--init', '--recursive'], {\n cwd: 'jito-relayer',\n stdio: 'inherit',\n shell: true,\n })\n spawnSync('cargo', ['build', '--release'], {\n cwd: 'jito-relayer',\n stdio: 'inherit',\n shell: true,\n })\n\n // Create relayer service\n const { filePath, body } = isCoHost\n ? relayerService(blockEngineUrl)\n : jitoRelayerSeparateService(blockEngineUrl)\n execSync(`echo \"${body}\" | sudo tee ${filePath} > /dev/null`)\n spawnSync('sudo', ['systemctl', 'enable', 'relayer'], { stdio: 'inherit' })\n spawnSync('sudo', ['systemctl', 'start', 'relayer'], { stdio: 'inherit' })\n\n // Update firewall\n execSync('sudo ufw allow 11228', { stdio: 'inherit' })\n execSync('sudo ufw allow 11229', { stdio: 'inherit' })\n execSync('sudo ufw allow 11226', { stdio: 'inherit' })\n\n // Update startup script\n}\n","import { spawnSync } from 'node:child_process'\nimport geyserConfig from './geyserConfig'\nimport addConfigToStartupScript from './addConfigToStartupScript'\nimport inquirer from 'inquirer'\nimport { writeFile } from 'node:fs/promises'\n\nexport const yellowstoneGeyser = async () => {\n const xTokenAnswer = await inquirer.prompt<{ xToken: string }>([\n {\n type: 'input',\n name: 'xToken',\n message: 'Enter the xToken',\n default: 'xToken',\n },\n ])\n const xToken = xTokenAnswer.xToken\n const cmd = `git clone https://github.com/rpcpool/yellowstone-grpc.git`\n const cmd2 = `cargo build -r`\n const cmd3 = `cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n spawnSync(cmd2, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/yellowstone-grpc',\n })\n spawnSync(cmd3, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/yellowstone-grpc',\n })\n const { filePath, defaultConfig } = geyserConfig(xToken)\n const jsonString = JSON.stringify(defaultConfig, null, 2)\n await writeFile(filePath, jsonString, { encoding: 'utf8' })\n\n // Add config to startup script\n await addConfigToStartupScript()\n}\n","const geyserConfig = (xToken: string) => {\n const filePath = `/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json`\n const defaultConfig = {\n libpath:\n '/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so',\n log: {\n level: 'info',\n },\n grpc: {\n address: '0.0.0.0:10000',\n compression: {\n accept: ['gzip'],\n send: ['gzip'],\n },\n max_decoding_message_size: '4_194_304',\n snapshot_plugin_channel_capacity: null,\n snapshot_client_channel_capacity: '50_000_000',\n channel_capacity: '100_000',\n unary_concurrency_limit: 100,\n unary_disabled: false,\n x_token: xToken,\n },\n prometheus: {\n address: '0.0.0.0:8999',\n },\n }\n return {\n filePath,\n defaultConfig,\n }\n}\n\nexport default geyserConfig\n","import { spawnSync } from 'node:child_process'\nimport { readFile, writeFile } from 'fs/promises'\n\nconst addConfigToStartupScript = async () => {\n const startupScriptPath = '/home/solv/start-validator.sh'\n const startupScript = await readFile(startupScriptPath, 'utf-8')\n // Add one line to the second from the last line of the startup script\n const lines = startupScript.split('\\n')\n lines.splice(\n -1,\n 0,\n '--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\\\',\n )\n const newStartupScript = lines.join('\\n')\n await writeFile(startupScriptPath, newStartupScript)\n spawnSync(`chmod +x ${startupScriptPath}`, {\n shell: true,\n stdio: 'inherit',\n })\n}\n\nexport default addConfigToStartupScript\n","import { UbuntuDhParams } from '@/types/solvTypes'\nimport { execSync } from 'child_process'\nimport { convertToBytes } from '.'\n\nexport const df = () => {\n const output = execSync('df -h').toString()\n const lines = output.split('\\n').slice(1)\n\n const parsedData = lines\n .filter((line) => line.split(/\\s+/)[0] !== '')\n .map((line) => {\n const segments = line.split(/\\s+/)\n return {\n Filesystem: segments[0],\n Size: segments[1],\n Used: segments[2],\n Avail: segments[3],\n Use: segments[4],\n MountedOn: segments[5],\n } as UbuntuDhParams\n })\n .sort((a, b) => convertToBytes(b.Avail) - convertToBytes(a.Avail))\n .slice(0, 10)\n\n const isMountedOnCorrect = parsedData.some(\n (data) =>\n data.MountedOn === '/mnt' && convertToBytes(data.Size) > 900e9 - 1,\n )\n\n parsedData.forEach((data) => {\n if (data.MountedOn === '/mnt' && convertToBytes(data.Size) > 900e9 - 1) {\n console.log(\n `%c${data.Filesystem}\\t${data.Size}\\t${data.MountedOn}`,\n 'color: green',\n )\n } else if (\n data.Filesystem.startsWith('/dev/') &&\n convertToBytes(data.Size) > 900e9 - 1\n ) {\n console.log(\n `%c${data.Filesystem}\\t${data.Size}\\t${data.MountedOn}`,\n 'color: red',\n )\n }\n })\n\n if (isMountedOnCorrect) {\n console.log('your mount point is correct')\n } else {\n const fsNames = parsedData\n .filter(\n (data) =>\n data.Filesystem.startsWith('/dev/') &&\n convertToBytes(data.Size) > 900e9 - 1,\n )\n .map((data) => data.Filesystem)\n if (fsNames.length > 0) {\n // console.log(\n // Logger.warningHex(\n // `\\nfileSystem might be one of ${fsNames.join(', ')} ...?`,\n // ),\n // )\n }\n }\n\n return parsedData\n}\n","import { UbuntuDhParams } from '@/types/solvTypes'\nimport chalk from 'chalk'\nimport Table from 'cli-table3'\n\nexport const displayTable = (data: UbuntuDhParams[]) => {\n const head = ['Filesystem', 'Size', 'Used', 'Avail', 'Use', 'MountedOn'].map(\n (item) => chalk.blue(item)\n )\n // テーブルのヘッダーを定義\n const table = new Table({\n head,\n colWidths: [20, 10, 10, 10, 10, 20],\n })\n\n // 各行のデータをテーブルに追加\n data.forEach((row) => {\n table.push(\n [\n row.Filesystem,\n row.Size,\n row.Used,\n row.Avail,\n row.Use,\n row.MountedOn,\n ].map((item) => chalk.white(item))\n )\n })\n\n // テーブルを表示\n console.log(table.toString())\n}\n","import { program } from '@/index'\nimport { df } from './df'\nimport { displayTable } from '@/lib/logger/table'\n\nexport const dfCommands = async () => {\n program\n .command('df')\n .description('Disk Free Command')\n .action(() => {\n const dirs = df()\n displayTable(dirs)\n })\n}\n\nexport const convertToBytes = (size: string): number => {\n const units: { [key: string]: number } = {\n K: 1e3,\n KB: 1e3,\n M: 1e6,\n MB: 1e6,\n G: 1e9,\n GB: 1e9,\n T: 1e12,\n TB: 1e12,\n }\n const unit = size.match(/[A-Za-z]+/)?.[0] || ''\n const number = parseFloat(size)\n\n return units[unit] ? number * units[unit] : number\n}\n","import { program } from '@/index'\nimport { startSolana } from './startSolana'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startCommand = (config: DefaultConfigType) => {\n program\n .command('start')\n .description('Start Solana Validator')\n .action(() => {\n startSolana(config)\n process.exit(0)\n })\n}\n","import { \n // Network, \n ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n// import { readlink } from 'fs/promises'\nimport chalk from 'chalk'\n// import readline from 'readline'\n\nexport const stopSolana = async (config: DefaultConfigType) => {\n chalk.white(console.log('Starting solv stop process...'))\n const service =\n config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n ? 'frankendancer'\n : 'solv'\n // const isTest = config.NETWORK === Network.TESTNET\n\n // const symlinkPath = '/home/solv/identity.json'\n // const targetPath = '/home/solv/mainnet-validator-keypair.json'\n\n // if (!isTest) {\n // let symlinkTarget = ''\n // try {\n // symlinkTarget = await readlink(symlinkPath)\n // chalk.white(console.log(`Confirmed symlink at: ${symlinkTarget}`))\n // } catch (err) {\n // chalk.white(console.log(`Could not verify symlink`))\n // }\n\n // if (symlinkTarget === targetPath) {\n // const confirmed = await promptConfirm(\n // `WARNING: You are about to stop a mainnet validator using the mainnet keypair (${targetPath}).\\nAre you sure? (yes/no): `,\n // )\n // if (!confirmed) {\n // chalk.white(console.log('Operation cancelled.'))\n // return\n // }\n // }\n // }\n\n const cmd = [`sudo systemctl stop ${service}`]\n spawnSync(cmd[0], { shell: true, stdio: 'inherit' })\n}\n\n// function promptConfirm(question: string): Promise<boolean> {\n// const rl = readline.createInterface({\n// input: process.stdin,\n// output: process.stdout,\n// })\n\n// return new Promise((resolve) => {\n// rl.question(question, (answer) => {\n// rl.close()\n// resolve(answer.trim().toLowerCase() === 'yes')\n// })\n// })\n// }\n","import { program } from '@/index'\nimport { stopSolana } from './stopSolana'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const stopCommand = (config: DefaultConfigType) => {\n program\n .command('stop')\n .description('Stop Solana Validator')\n .action(() => {\n stopSolana(config)\n process.exit(0)\n })\n}\n","import { program } from '@/index'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport { DefaultConfigType } from '@/config/types'\nimport getSolanaCLI from '@/config/getSolanaCLI'\nimport { Network } from '@/config/enums'\n\nexport const restartCommand = (config: DefaultConfigType) => {\n let solanaValidatorClient = getSolanaCLI()\n program\n .command('restart')\n .description('Restart Solana Validator')\n .option('-r, --rm', 'Remove Snapshot and Restart Validator', false)\n .action(async (options: { rm: boolean }) => {\n const isAutoRestart = config.AUTO_RESTART\n const isTestnet = config.NETWORK === Network.TESTNET\n const minIdleTime = isAutoRestart && isTestnet ? 10 : 30\n if (options.rm) {\n console.log(\n chalk.white('👷‍♀️ Removing Snapshot and Restarting Validator...'),\n )\n spawnSync('solv stop', { stdio: 'inherit', shell: true })\n spawnSync('solv rm:snapshot', { stdio: 'inherit', shell: true })\n spawnSync('solv get snapshot', { stdio: 'inherit', shell: true })\n spawnSync('solv start', { stdio: 'inherit', shell: true })\n console.log(chalk.green('✔︎ Successfully Restarted Validator'))\n process.exit(0)\n }\n const cmd = `${solanaValidatorClient} --ledger ${config.LEDGER_PATH} exit --max-delinquent-stake ${config.MAINNET_DELINQUENT_STAKE} --min-idle-time ${minIdleTime}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n process.exit(0)\n })\n}\n","import { program } from '@/index'\nimport { updateVersion } from '../update'\nimport { jitoUpdate } from '../update/jitoUpdate'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType, ValidatorType } from '@/config/enums'\nimport {\n VERSION_JITO_MAINNET,\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\n\nexport const installCommands = (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n let version = isTestnet ? VERSION_TESTNET : VERSION_MAINNET\n if (config.NODE_TYPE === NodeType.RPC) {\n version = VERSION_SOLANA_RPC\n }\n program\n .command('install')\n .alias('i')\n .description('Install Solana Client')\n .option(\n '-v, --version <version>',\n `Solana Version e.g. ${version}`,\n version,\n )\n .option(\n '-m, --mod <version>',\n `Use modified installer`,\n false,\n )\n .action(async (options: { version: string, mod: boolean }) => {\n const isJito = config.VALIDATOR_TYPE === ValidatorType.JITO\n const isModified = options.mod || config.MOD;\n if (isJito) {\n const jitoVersion = options.version || VERSION_JITO_MAINNET\n const jitoTag = `v${jitoVersion}`\n jitoUpdate(jitoTag, isModified)\n return\n }\n const isRPC = config.NODE_TYPE === NodeType.RPC\n if (isRPC) {\n version = VERSION_SOLANA_RPC\n }\n const solanaCLIVersion = options.version || version\n await updateVersion(solanaCLIVersion, isModified)\n })\n}\n","import { program } from '@/index'\nimport { spawnSync } from 'child_process'\nimport getPreferredDisk from './getLargestDisk'\n\nexport const mountCommands = () => {\n program\n .command('mtr')\n .description('Mount Reload Command')\n .action(() => {\n const cmd = `sudo mount --all --verbose`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n })\n\n program\n .command('disks')\n .description('Show unmounted disks')\n .action(() => {\n const disks = getPreferredDisk()\n console.log(disks)\n })\n}\n","import { program } from '@/index'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport hasEpochTimer from './hasEpochTimer'\n\ntype CronOptions = {\n cron: string\n epoch: string\n}\n\nexport const cronCommands = () => {\n const crond = program.command('cron').description(`Cron Job Commands`)\n\n crond\n .command('epoch')\n .description('Solv Epoch Timer Discord Notification Command')\n .option('-c, --cron <value>', 'Cron Job', '*/5 14-22 * * *')\n .action(async (options: CronOptions) => {\n const hasCron = await hasEpochTimer()\n if (hasCron) {\n console.log(chalk.green('⚠️ Epoch Timer Cron Job already set'))\n process.exit(1)\n }\n const cronJob = `(crontab -l 2>/dev/null; echo \"${options.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1\") | crontab -`\n spawnSync(cronJob, { shell: true, stdio: 'inherit' })\n console.log(chalk.green('✅ Epoch Timer Cron Job Set'))\n })\n}\n","import { spawnSync } from 'child_process'\n\nconst hasEpochTimer = async (): Promise<boolean> => {\n try {\n const result = spawnSync('crontab', ['-l'], { encoding: 'utf-8' })\n if (result.status !== 0) {\n console.log('No crontab for this user.')\n return false\n }\n\n const crontabList = result.stdout\n console.log(crontabList)\n return crontabList.includes('solv epochTimer')\n } catch (error) {\n console.error('Error reading crontab:', error)\n return false\n }\n}\n\nexport default hasEpochTimer\n","export const SOLV_CLIENT_PATHS = {\n SOLV_KEYPAIR_DOWNLOAD_PATH: '/solvKeys/download',\n SOLV_KEYPAIR_UPLOAD_PATH: '/solvKeys/upload',\n SOLV_KEYPAIR_UPLOAD_PATH_LINUX: '/home/solv',\n SOLV_KEYPAIR_TRASH_PATH: '/solvKeys/trash',\n SSH_PUBKEY_PATH: '/.ssh/id_rsa.pub',\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { SOLV_CLIENT_PATHS } from '@/config/solvClient'\nimport { existsSync, mkdirSync } from 'fs'\nimport inquirer from 'inquirer'\nimport { homedir } from 'os'\nimport { executeSCP } from './executeSCP'\nimport { RELAYER_KEY, UNSTAKED_KEY } from '@/config/constants'\n\nexport const download = async (ip = '') => {\n let migrateIP = ip\n if (ip === '') {\n const answer = await inquirer.prompt<{ ip: string }>([\n {\n type: 'input',\n name: 'ip',\n message: 'Enter your Ubuntu Server IP',\n default() {\n return '1.1.1.1'\n },\n },\n ])\n migrateIP = answer.ip\n }\n const solanaKeys = Object.values(getAllKeyPaths())\n const homeDirectory = homedir()\n const keyDir = homeDirectory.includes('/home/solv')\n ? '/home/solv'\n : homeDirectory + SOLV_CLIENT_PATHS.SOLV_KEYPAIR_DOWNLOAD_PATH\n if (!existsSync(keyDir)) {\n mkdirSync(keyDir, { recursive: true })\n }\n const isDownload = true\n const relayerKeyPath = homeDirectory + '/' + RELAYER_KEY\n solanaKeys.push(relayerKeyPath)\n for (const key of solanaKeys) {\n const splits = key.split('/')\n let fileName = splits[splits.length - 1]\n fileName = homeDirectory.includes('/home/solv')\n ? fileName\n : fileName.replace('.json', `-${migrateIP}.json`)\n const filePath = `${keyDir}/${fileName}`\n const result = executeSCP(migrateIP, key, filePath, isDownload)\n if (result) {\n console.log(`Successfully Exported - ${filePath} 🎉`)\n }\n }\n}\n","import { spawnSync } from 'node:child_process'\n\nexport function executeSCP(\n ip: string,\n key: string,\n filePath: string,\n isDownload: boolean,\n) {\n const cmd = isDownload\n ? `scp -o StrictHostKeyChecking=no solv@${ip}:${key} ${filePath}`\n : `scp -o StrictHostKeyChecking=no ${key} solv@${ip}:${filePath}`\n const result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n\n return result.status === 0\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { SOLV_CLIENT_PATHS } from '@/config/solvClient'\nimport { spawnSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport inquirer from 'inquirer'\nimport os from 'os'\n\nexport const upload = async (ip = '') => {\n const homeDirectory = os.userInfo().homedir\n let migrateIP = ip\n if (ip === '') {\n const answer = await inquirer.prompt<{ ip: string }>([\n {\n type: 'input',\n name: 'ip',\n message: 'Enter your Ubuntu Server IP',\n default() {\n return '1.1.1.1'\n },\n },\n ])\n migrateIP = answer.ip\n }\n let keyPath = `${homeDirectory}${SOLV_CLIENT_PATHS.SOLV_KEYPAIR_UPLOAD_PATH}`\n if (homeDirectory.includes('/home/solv')) {\n keyPath = SOLV_CLIENT_PATHS.SOLV_KEYPAIR_UPLOAD_PATH_LINUX\n }\n const solanaKeys = Object.values(getAllKeyPaths(keyPath))\n\n for (const key of solanaKeys) {\n const splits = key.split('/')\n const fileName = splits[splits.length - 1]\n if (!fileName.endsWith('keypair.json')) {\n continue\n }\n const filePath = `${keyPath}/${fileName}`\n if (!existsSync(filePath)) {\n continue\n }\n const cmd = `scp -o StrictHostKeyChecking=no ${filePath} solv@${migrateIP}:${key}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n console.log(`Successfully Uploaded - ${fileName} 🎉`)\n }\n}\n","import { HOME_PATHS } from '@/config/config'\nimport { spawnSync } from 'child_process'\nimport inquirer from 'inquirer'\n\nexport const scpCreate = async () => {\n const answer = await inquirer.prompt<{ pubkey: string }>({\n type: 'input',\n name: 'pubkey',\n message: 'Enter your SSH Public Key',\n default() {\n return 'xxxxxxxpubkeyxxxxxxxx'\n },\n })\n\n const cmd = `mkdir -p ${HOME_PATHS.ROOT}/.ssh && echo \"${answer.pubkey}\" >> ${HOME_PATHS.AUTHORIZED_KEYS}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n console.log(`Successfully Created SSH Login Setting 🎉`)\n}\n","import chalk from 'chalk'\nimport { readFileSync } from 'fs'\nimport os from 'os'\n\nexport const cat = () => {\n try {\n const homeDirectory = os.userInfo().homedir\n const publicKeyPath = `${homeDirectory}/.ssh/id_rsa.pub`\n const publicKey = readFileSync(publicKeyPath, 'utf8')\n console.log(chalk.white('Your SSH Public Key is:\\n'))\n console.log(chalk.white(publicKey))\n } catch (error) {\n console.error(chalk.white('Error reading SSH Public Key\\n'))\n console.error(chalk.white(error))\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const init = () => {\n const cmd = 'ssh-keygen -t rsa -b 4096'\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawn } from 'child_process'\nimport { readFileSync } from 'fs'\nimport { Readable } from 'stream'\nimport { SingleBar } from 'cli-progress'\n\nexport const search = async (bar: SingleBar): Promise<string[]> => {\n return new Promise((resolve, reject) => {\n try {\n const find = spawn('find', ['/', '-name', '*.json', '-size', '-301c'])\n const filePaths: string[] = []\n find.stdout.on('data', (data) => {\n filePaths.push(\n ...data\n .toString()\n .split('\\n')\n .filter((path: string) => path)\n )\n bar.increment()\n })\n\n find.stderr.on('data', (data) => {\n bar.increment()\n //console.error(`Error: ${data}`)\n })\n\n find.on('close', (code) => {\n if (code === 0) {\n resolve(filePaths)\n } else {\n resolve(filePaths)\n }\n })\n } catch (error) {\n reject(`search Error: ${error}`)\n }\n })\n}\n\nconst checkIfSolanaKey = (path: string): boolean => {\n try {\n const content = JSON.parse(readFileSync(path, 'utf-8'))\n return content.length === 64\n } catch (error) {\n return false\n }\n}\n\nexport const processPaths = async (\n paths: string[],\n bar: SingleBar\n): Promise<string[]> => {\n const validPaths: string[] = []\n const readable = Readable.from(paths)\n readable.on('data', async (path) => {\n if (checkIfSolanaKey(path)) {\n validPaths.push(path)\n }\n })\n\n return new Promise((resolve, reject) => {\n readable.on('end', () => {\n resolve(validPaths)\n })\n\n readable.on('error', (error) => {\n reject(error)\n })\n })\n}\n","import { program } from '@/index'\nimport { download } from './download'\nimport { upload } from './upload'\nimport { scpCreate } from './create'\nimport { cat } from './cat'\nimport { init } from './init'\nimport { processPaths, search } from './search'\nimport chalk from 'chalk'\nimport { Presets, SingleBar } from 'cli-progress'\nimport uploadVS from './uploadVS'\n\nexport type UploadOptions = {\n vs: boolean\n ip: string\n}\n\nexport const scpCommands = () => {\n const scp = program\n .command('scp')\n .description(`Scp Commands`)\n .argument('<cmd>')\n\n scp\n .command('download')\n .alias('dl')\n .option('--ip <ip>', 'Download Key to a Specific IP Address', '')\n .description('Export Solana Validator Keypair')\n .action(async (options: UploadOptions) => {\n if (options.ip) {\n await download(options.ip)\n return\n }\n await download()\n })\n\n scp\n .command('upload')\n .alias('up')\n .option('--vs', 'Upload Key to a New Validator Auto Operation Node', false)\n .option('--ip <ip>', 'Upload Key to a Specific IP Address', '')\n .description('Upload Solana Validator Keypair')\n .action(async (options: UploadOptions) => {\n if (options.vs) {\n await uploadVS()\n return\n }\n await upload(options.ip)\n })\n\n scp\n .command('create')\n .alias('c')\n .description('Create SSH Login Setting')\n .action(async () => {\n await scpCreate()\n })\n\n scp\n .command('cat')\n .description('Show SSH Public Key')\n .action(() => {\n cat()\n })\n\n scp\n .command('init')\n .description('Init SSH Key Pair')\n .action(() => {\n init()\n })\n\n scp\n .command('search')\n .alias('sc')\n .description('Search Solana Validator Key Pair')\n .action(async () => {\n console.log(`start searching...`)\n const progressBar = new SingleBar({}, Presets.shades_classic)\n progressBar.start(10000, 0)\n const solanaKeyPaths = await search(progressBar)\n let result = await processPaths(solanaKeyPaths, progressBar)\n progressBar.stop()\n console.log(\n chalk.white(`🔍 Found ${result.length} Potential Solana Key Pairs 🎉`),\n )\n result = result.slice(0, 10)\n console.log(chalk.green(`\\n${result.join('\\n')}`))\n console.log(chalk.white('\\nOnly showing the first 10 results\\n\\n'))\n console.log(chalk.white(`$ mv <your-key> /mt/solana/<solvKeyName>.json`))\n })\n}\n","import chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\nimport fetch from 'node-fetch'\nimport { VS_UPLOAD_ENDPOINT } from '@/config/constants'\n\nconst uploadVS = async () => {\n const result = await fetch(VS_UPLOAD_ENDPOINT, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n if (result.status !== 200) {\n console.log(\n chalk.yellow(\n '⚠️ This Node is not Registered as Auto Operation Node.\\nPlease contact Discord Channel',\n ),\n )\n return false\n }\n const data = (await result.json()) as { cmds: string[] }\n for (const cmd of data.cmds) {\n spawnSync(cmd, { shell: true, stdio: 'ignore' })\n }\n console.log(chalk.white('🟢 Upload completed successfully!'))\n return true\n}\n\nexport default uploadVS\n","import { ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { program } from '@/index'\nimport { spawnSync } from 'child_process'\n\nexport const statusCommands = (config: DefaultConfigType) => {\n program\n .command('status')\n .description('Check Solana Validator Status')\n .action(() => {\n systemctlStatusSolv(config)\n })\n}\n\nexport const systemctlStatusSolv = (config: DefaultConfigType) => {\n const service =\n config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n ? 'frankendancer'\n : 'solv'\n const cmd = `sudo systemctl status ${service}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n process.exit(0)\n}\n","import { Network, NodeType } from '@/config/enums'\nimport readConfig from '@/config/readConfig'\nimport { spawnSync } from 'node:child_process'\n\nexport const delegateStake = async (\n stakeAccountPubkey: string,\n validatorVoteAccountPubkey: string,\n) => {\n try {\n const config = await readConfig()\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n const network = isRPC\n ? config.RPC_URL\n : isTestnet\n ? Network.TESTNET\n : config.RPC_URL\n const authorityKeyPath = isTestnet\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n const cmd = [\n `solana delegate-stake ${stakeAccountPubkey} ${validatorVoteAccountPubkey} --stake-authority ${authorityKeyPath} --url ${network}`,\n ]\n spawnSync(cmd.join(' && '), { shell: true, stdio: 'inherit' })\n return true\n } catch (error) {\n throw new Error(`delegateStake: ${error}`)\n }\n}\n","import inquirer from 'inquirer'\nimport { createStakeAccount } from './createStakeAccount'\nimport { updateSolvConfig } from '@/lib/updateSolvConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport { addLeadingZero, existsAsync } from '@skeet-framework/utils'\nimport { execSync, spawnSync } from 'node:child_process'\nimport os from 'node:os'\n\nexport type StakeAccountQuestion = {\n stakeAuthorityKeyPath: string\n solAmount: string\n}\n\nexport const stakeAccountQuestion = async (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const confirmCreateStakeAccount = await inquirer.prompt<{\n confirmCreateStakeAccount: boolean\n }>([\n {\n type: 'confirm',\n name: 'confirmCreateStakeAccount',\n message: 'Would you like to create a new stake account?',\n default: false,\n },\n ])\n if (!confirmCreateStakeAccount.confirmCreateStakeAccount) {\n return false\n }\n const authorityKeypair = isTestnet\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n spawnSync(`solana config set --keypair ${authorityKeypair}`, {\n shell: true,\n stdio: 'pipe',\n })\n const answer = await inquirer.prompt<StakeAccountQuestion>([\n {\n type: 'input',\n name: 'solAmount',\n message: 'How many SOL would you like to stake?',\n default: '1',\n },\n ])\n const { stakeKeypair, stakeKeypairPath } = await createStakeKeypair()\n\n const currentStakeAccount = config.STAKE_ACCOUNTS\n // Array of unique stake accounts\n const uniqueStakeAccount = Array.from(\n new Set([...currentStakeAccount, stakeKeypair]),\n )\n updateSolvConfig({ STAKE_ACCOUNT: uniqueStakeAccount })\n return createStakeAccount(stakeKeypairPath, Number(answer.solAmount))\n}\n\nconst homeDirectory = os.userInfo().homedir\nconst STAKE_ACCOUNT_DIR = homeDirectory + '/stake-account'\n\nexport type StakeKeypair = {\n stakeKeypair: string\n stakeKeypairPath: string\n}\n\nconst createStakeKeypair = async (): Promise<StakeKeypair> => {\n if (!(await existsAsync(STAKE_ACCOUNT_DIR))) {\n spawnSync(`mkdir -p ${STAKE_ACCOUNT_DIR}`, { shell: true })\n }\n\n const files = spawnSync(`ls ${STAKE_ACCOUNT_DIR}`, { shell: true })\n .stdout.toString()\n .split('\\n')\n .filter((file) => file.includes('.json'))\n const stakeAccountNum = addLeadingZero(files.length + 1)\n\n const outfile = `${STAKE_ACCOUNT_DIR}/stake${stakeAccountNum}.json`\n const cmd = `solana-keygen new --outfile ${outfile} --no-bip39-passphrase`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n const output = execSync(`solana-keygen pubkey ${outfile}`)\n return {\n stakeKeypair: output.toString().trim(),\n stakeKeypairPath: outfile,\n } as StakeKeypair\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const createStakeAccount = (\n stakeKeypair: string,\n sol: number,\n retryLimit: number = 5, // リトライの最大回数を設定\n): boolean => {\n let attempt = 0\n while (attempt < retryLimit) {\n const result = spawnSync(\n `solana create-stake-account ${stakeKeypair} ${sol}`,\n { shell: true, stdio: 'pipe' },\n )\n const output = result.stdout.toString() + result.stderr.toString()\n\n if (output.includes('Signature:')) {\n console.log('Stake account created successfully:', output)\n return true\n } else if (output.includes('Error:')) {\n console.log('Error encountered:', output)\n attempt++\n console.log(`Retrying... (${attempt}/${retryLimit})`)\n } else {\n console.log('Unknown output:', output)\n break\n }\n\n if (attempt === retryLimit) {\n console.log('Failed to create stake account after retries.')\n }\n }\n\n return false\n}\n","import { Network } from '@/config/enums'\nimport readConfig from '@/config/readConfig'\nimport { spawnSync } from 'node:child_process'\n\nexport const deactivateStake = async (stakeAccountPubkey: string) => {\n try {\n const config = await readConfig()\n const authorityKeyPath =\n config.NETWORK === Network.TESTNET\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n const cmd = `solana deactivate-stake ${stakeAccountPubkey} --stake-authority ${authorityKeyPath}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n return true\n } catch (error) {\n throw new Error(`deactivateStake: ${error}`)\n }\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const withdrawStake = async (\n stakeAccountPubkey: string,\n destinationPubkey: string,\n amount: string, // 例: '0.5' SOL\n) => {\n try {\n const cmd = `solana withdraw-stake ${stakeAccountPubkey} ${destinationPubkey} ${amount}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n return true\n } catch (error) {\n throw new Error(`withdrawStake: ${error}`)\n }\n}\n","import { program } from '@/index'\nimport { delegateStake } from './delegateStake'\nexport * from './delegateStake'\nimport { stakeAccountQuestion } from './stakeAccountQuestion'\nimport { deactivateStake } from './deactivateStake'\nimport { withdrawStake } from './withdrawStake'\nimport chalk from 'chalk'\nimport { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\nimport { selectLST } from './selectLST'\nimport { readFile } from 'fs/promises'\nimport inquirer from 'inquirer'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { elSOLdeposit } from './elSOLdeposit'\nimport { depositeLST } from './depositLST'\nimport { execSync } from 'node:child_process'\nimport { homedir } from 'os'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport readConfig from '@/config/readConfig'\n\nexport type StakeOptions = {\n lst: boolean\n elsol: boolean\n amount: string\n}\nexport const stakeCommands = (config: DefaultConfigType) => {\n program\n .command('stake')\n .description('Stake SOL')\n .option('-l, --lst', 'Convert to Liquid Stake Token')\n .option('-e, --elsol', 'Convert to elSOL', false)\n .option('-a, --amount <amount>', 'Amount of SOL to stake', '0')\n .action(async (options: StakeOptions) => {\n let amount = Number(options.amount)\n console.log('RPC URL:', config.RPC_URL)\n let poolAddress = SOLV_STAKE_POOL_ADDRESS\n const isTestnet = config.NETWORK === Network.TESTNET\n const keyRoot = homedir()\n const keypairPath = isTestnet\n ? `${keyRoot}/testnet-authority-keypair.json`\n : `${keyRoot}/mainnet-authority-keypair.json`\n execSync(`solana config set --keypair ${keypairPath}`)\n if (!(await existsAsync(keypairPath))) {\n console.log(\n chalk.yellow(\n '⚠️ No keypair found. Please place your keypair in the following path:\\n',\n ),\n )\n console.log(chalk.white(keypairPath))\n return\n }\n const fromWalletKey = JSON.parse(\n await readFile(keypairPath, 'utf-8'),\n ) as number[]\n if (options.elsol) {\n // Deposit SOL to elSOL\n await elSOLdeposit(config.RPC_URL, poolAddress, amount, fromWalletKey)\n return\n } else if (options.lst) {\n const lst = await selectLST(config.RPC_URL)\n if (!lst) {\n return\n }\n poolAddress = lst.stakePoolAddress\n // Deposit SOL to LST\n await depositeLST(\n config.RPC_URL,\n poolAddress,\n amount,\n fromWalletKey,\n lst.symbol,\n )\n return\n } else {\n // Solana Native Stake\n const result = await stakeAccountQuestion(config)\n if (!result) {\n return\n }\n const newSolvConfig = await readConfig()\n const { validatorVoteAccount, stakeAccounts } =\n await delegateStakeAsk(newSolvConfig)\n for await (const stakeAccount of stakeAccounts) {\n try {\n await delegateStake(stakeAccount, validatorVoteAccount)\n } catch (error) {\n console.log(\n chalk.yellow(\n `Network might be busy, please try again later\\nYou can use a custom RPC endpoint to avoid this issue\\n`,\n ),\n )\n }\n }\n }\n })\n\n program\n .command('unstake')\n .description('Unstake SOL')\n .action(async () => {\n const { unstakeOption } = await unstakeAsk()\n if (unstakeOption === 'Deactivate Stake') {\n const { stakeAccounts } = await deactivateStakeAsk()\n for await (const stakeAccount of stakeAccounts) {\n try {\n await deactivateStake(stakeAccount)\n } catch (error) {\n console.log(\n chalk.yellow(\n `Network might be busy, please try again later\\nYou can use a custom RPC endpoint to avoid this issue\\n`,\n ),\n )\n }\n }\n } else {\n const answer = await withdrawStakeAsk()\n await withdrawStake(\n answer.stakeAccounts,\n answer.destinationAddress,\n answer.solAmount,\n )\n }\n })\n}\n\nexport const askAmount = async () => {\n const currentAddress = execSync(`solana address`).toString().trim()\n const currentVoteAccountBalance = execSync(`solana balance`)\n .toString()\n .replace('SOL', '')\n .trim()\n console.log(\n chalk.white(\n `📗 Selected Wallet: ${currentAddress}\\n💰 Account Balance:`,\n currentVoteAccountBalance + ' SOL',\n ),\n )\n console.log(\n chalk.yellow(\n '⚠️ 0.03 SOL will be remaining in the account if you just press enter.',\n ),\n )\n const answer = await inquirer.prompt<{ amount: string }>([\n {\n type: 'input',\n name: 'amount',\n message: 'Enter amount of SOL to stake:',\n default: String(Number(currentVoteAccountBalance) - 0.03),\n },\n ])\n return Number(answer.amount)\n}\n\ntype deactivateStakeAskOption = {\n stakeAccounts: string[]\n}\n\nconst deactivateStakeAsk = async () => {\n const config = await readConfig()\n const answer = await inquirer.prompt<deactivateStakeAskOption>([\n {\n type: 'checkbox',\n name: 'stakeAccounts',\n message: `Which Stake Account would you like to deactivate stake from?`,\n choices: config.STAKE_ACCOUNTS,\n },\n ])\n return answer\n}\n\ntype delegateStakeOption = {\n stakeAccounts: string[]\n validatorVoteAccount: string\n}\n\nconst delegateStakeAsk = async (config: DefaultConfigType) => {\n const stakeAccount = config.STAKE_ACCOUNTS\n const defaultAddress =\n config.NETWORK === Network.TESTNET\n ? getVoteAccountAddress(config)\n : config.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY\n const answer = await inquirer.prompt<delegateStakeOption>([\n {\n type: 'checkbox',\n name: 'stakeAccounts',\n message: `Which Stake Account would you like to delegate stake to?`,\n choices: stakeAccount,\n },\n {\n type: 'input',\n name: 'validatorVoteAccount',\n message: `What is the Validator Vote Account Address?`,\n default() {\n return defaultAddress\n },\n },\n ])\n return answer\n}\n\nconst getVoteAccountAddress = (config: DefaultConfigType) => {\n const isTest = config.NETWORK === Network.TESTNET\n const voteAccount = isTest ? 'testnet-vote-account' : 'mainnet-vote-account'\n const cmd = `/home/solv/${voteAccount}-keypair.json`\n const address = execSync(`solana-keygen pubkey ${cmd}`).toString()\n return address\n}\n\ntype unstakeAskOption = {\n unstakeOption: string\n}\n\nconst unstakeAsk = async () => {\n const unstakeOptions = ['Deactivate Stake', 'Withdraw Stake']\n const answer = await inquirer.prompt<unstakeAskOption>([\n {\n type: 'list',\n name: 'unstakeOption',\n message: 'What would you like to do?',\n choices: unstakeOptions,\n default: unstakeOptions[0],\n },\n ])\n return answer\n}\n\ntype withdrawStakeAskOption = {\n stakeAccounts: string\n destinationAddress: string\n solAmount: string\n}\n\nconst withdrawStakeAsk = async () => {\n const stakeAccount = (await readConfig()).STAKE_ACCOUNTS\n const answer = await inquirer.prompt<withdrawStakeAskOption>([\n {\n type: 'checkbox',\n name: 'stakeAccounts',\n message: `Which Stake Account would you like to withdraw stake from?`,\n choices: stakeAccount,\n },\n {\n type: 'input',\n name: 'destinationAddress',\n message: `What is the destination address for the withdrawn SOL?`,\n default() {\n return 'xxxxxxxx'\n },\n },\n {\n type: 'input',\n name: 'solAmount',\n message: `How many SOL would you like to withdraw?`,\n default() {\n return '1'\n },\n },\n ])\n return answer\n}\n","import { Connection, PublicKey } from '@solana/web3.js'\nimport { stakePoolInfo } from '@solana/spl-stake-pool'\nimport { StakePoolInfoRes } from './stakePoolInfoRes'\nimport { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\n\nexport const getStakePoolInfo = async (\n rpcUrl: string,\n poolAddress = SOLV_STAKE_POOL_ADDRESS,\n) => {\n try {\n const connection = new Connection(rpcUrl)\n\n const stakePoolAddress = new PublicKey(poolAddress)\n const stakePool = await stakePoolInfo(connection, stakePoolAddress)\n return stakePool as StakePoolInfoRes\n } catch (error) {\n console.log(`Stake Pool not found: ${poolAddress}`)\n return null\n }\n}\n","import { fetchDigitalAsset } from '@metaplex-foundation/mpl-token-metadata'\nimport { createUmi } from '@metaplex-foundation/umi-bundle-defaults'\nimport { publicKey } from '@metaplex-foundation/umi'\n\nexport type TokenInfo = {\n name: string\n symbol: string\n uri: string\n mint: string\n}\n\nexport const getTokenInfo = async (rpcUrl: string, mintAddress: string) => {\n try {\n const mintPubkey = publicKey(mintAddress)\n console.log(`mintPubkey: ${mintPubkey}`)\n const umi = createUmi(rpcUrl)\n const nftMetadata = await fetchDigitalAsset(umi, mintPubkey)\n const res = {\n name: nftMetadata.metadata.name,\n symbol: nftMetadata.metadata.symbol,\n uri: nftMetadata.metadata.uri,\n mint: mintAddress,\n }\n return res as TokenInfo\n } catch (error) {\n return null\n }\n}\n","import { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\nimport { getStakePoolInfo } from '@/lib/solana/getStakePoolInfo'\nimport { TokenInfo, getTokenInfo } from '@/lib/solana/getTokenAccount'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\n\nexport interface StakePoolInfo extends TokenInfo {\n stakePoolAddress: string\n}\n\nexport const selectLST = async (rpcUrl: string) => {\n const answer = await inquirer.prompt<{ stakePoolAddress: string }>([\n {\n type: 'input',\n name: 'stakePoolAddress',\n message: 'Enter Stake Pool Address(default: elSOL)',\n default: SOLV_STAKE_POOL_ADDRESS,\n },\n ])\n try {\n const poolInfo = await getStakePoolInfo(rpcUrl, answer.stakePoolAddress)\n if (!poolInfo) {\n console.log(\n chalk.yellow(\n '⚠️ Invalid Stake Pool Address\\nPlease check the correct address and try again.\\n',\n ),\n )\n console.log(\n chalk.white(\n 'For stake pool information\\n🔗 https://solanacompass.com/stake-pools/',\n ),\n )\n return null\n }\n\n const poolMint = poolInfo.poolMint\n let tokenInfo = await getTokenInfo(rpcUrl, poolMint)\n\n if (!tokenInfo) {\n tokenInfo = {\n name: poolMint,\n symbol: poolMint,\n mint: poolMint,\n uri: 'no metadata',\n }\n }\n const result: StakePoolInfo = {\n ...tokenInfo,\n stakePoolAddress: answer.stakePoolAddress,\n }\n const stakeInfo = `🪙 ${result.symbol}\\nName: ${result.name} \\nToken Mint: ${result.mint}`\n const confirm = await inquirer.prompt<{ confirm: boolean }>([\n {\n type: 'confirm',\n name: 'confirm',\n message: stakeInfo + '\\nIs this the correct Stake Pool?',\n },\n ])\n if (!confirm.confirm) {\n console.log(chalk.yellow('✔️ Canceled'))\n return null\n }\n return result\n } catch (error) {\n console.log(\n chalk.yellow(\n '⚠️ Invalid Stake Pool Address\\nPlease check the correct address and try again.\\n',\n ),\n )\n console.log(\n chalk.white(\n 'For stake pool information\\n🔗 https://solanacompass.com/stake-pools/',\n ),\n )\n return null\n }\n}\n","import { Connection, Keypair, PublicKey } from '@solana/web3.js'\nimport { askAmount } from '.'\nimport { ELSOL_MINT_ADDRESS, SOLV_ELSOL_ACCOUNT_ADDRESS } from '@/config/config'\nimport { getOrCreateDestinationAddress } from '@/lib/solana/getOrCreateDestinationAddress'\nimport { Spinner } from 'cli-spinner'\nimport chalk from 'chalk'\nimport { depositSol } from '@/lib/solana/depositSOL'\nimport { sleep } from '@skeet-framework/utils'\n\nexport const elSOLdeposit = async (\n rpcUrl: string,\n poolAddress: string,\n amount: number,\n fromWalletKey: number[],\n) => {\n console.log(chalk.white('Solana RPC URL:', rpcUrl))\n let connection = new Connection(rpcUrl)\n if (amount === 0) {\n amount = await askAmount()\n }\n const spinner = new Spinner('%s')\n spinner.setSpinnerString(18)\n spinner.start()\n spinner.setSpinnerTitle(\n chalk.green(`✔︎ Checking Stake Pool ${poolAddress}...`),\n )\n const stakePoolAddress = new PublicKey(poolAddress)\n const depositAuthority = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const mintAddress = ELSOL_MINT_ADDRESS\n spinner.setSpinnerTitle(\n chalk.green(`🔍 Getting or Creating AssociatedTokenAccount`),\n )\n const destinationTokenAccount = await getOrCreateDestinationAddress(\n rpcUrl,\n fromWalletKey,\n mintAddress,\n depositAuthority.publicKey,\n )\n await sleep(1000)\n spinner.setSpinnerTitle(chalk.green('🔄 Converting SOL to elSOL'))\n\n let sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(SOLV_ELSOL_ACCOUNT_ADDRESS),\n depositAuthority.publicKey,\n )\n\n let retryCount = 0\n while (sig.status !== 'success') {\n retryCount++\n if (retryCount > 10) {\n spinner.stop(true)\n console.log(chalk.red('Failed to deposit.Please try again later 🙏'))\n return false\n }\n spinner.setSpinnerTitle(chalk.yellow(`⏳ ${retryCount} Times Retrying...`))\n await sleep(3000)\n connection = new Connection(rpcUrl)\n sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(SOLV_ELSOL_ACCOUNT_ADDRESS),\n depositAuthority.publicKey,\n )\n }\n spinner.stop(true)\n\n console.log(\n chalk.white(\n \"💰 Finished Deposit - You've got elSOL ✨\\n\\nSignature:\",\n sig.signature,\n ),\n )\n return true\n}\n","import { Connection, PublicKey, Keypair } from '@solana/web3.js'\nimport { getOrCreateAssociatedTokenAccount } from '@solana/spl-token'\n\nexport const getOrCreateDestinationAddress = async (\n rpcUrl: string,\n fromWalletKey: number[],\n mintAddress: string,\n owner: PublicKey,\n allowOwnerOffCurve = false,\n) => {\n try {\n const payer = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const mintPublicKey = new PublicKey(mintAddress)\n const connection = new Connection(rpcUrl)\n // SPLトークンの関連アドレスを計算します\n const associatedTokenAddress = await getOrCreateAssociatedTokenAccount(\n connection,\n payer,\n mintPublicKey,\n owner,\n allowOwnerOffCurve,\n )\n\n // 関連アドレスを返します\n return associatedTokenAddress.address.toBase58()\n } catch (error) {\n console.log('Error in getOrCreateDestinationAddress', error)\n throw new Error(JSON.stringify(error))\n }\n}\n","import {\n Connection,\n PublicKey,\n Keypair,\n Transaction,\n ComputeBudgetProgram,\n LAMPORTS_PER_SOL,\n} from '@solana/web3.js'\nimport { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\nimport * as solanaStakePool from '@solana/spl-stake-pool'\n\nexport type DepositSOLResponse = {\n status: 'success' | 'error'\n signature?: string\n error?: any\n}\n\nexport const depositSol = async (\n connection: Connection,\n fromWalletKey: number[],\n SOL: number,\n stakePoolAddress: PublicKey = new PublicKey(SOLV_STAKE_POOL_ADDRESS),\n destinationTokenAccount?: PublicKey,\n referrerTokenAccount?: PublicKey,\n depositAuthority?: PublicKey,\n) => {\n try {\n const fromWallet = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const lamport = SOL * LAMPORTS_PER_SOL\n const { instructions, signers } = await depositSOLInstruction(\n connection,\n fromWalletKey,\n lamport,\n stakePoolAddress,\n destinationTokenAccount,\n referrerTokenAccount,\n depositAuthority,\n )\n\n const txForEstimate = new Transaction().add(...instructions)\n txForEstimate.feePayer = fromWallet.publicKey\n const latestBlockhashAndContext =\n await connection.getLatestBlockhashAndContext({\n commitment: 'finalized',\n })\n\n txForEstimate.recentBlockhash = latestBlockhashAndContext.value.blockhash\n txForEstimate.sign(...signers, fromWallet)\n\n const tx = new Transaction().add(...instructions).add(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1000,\n }),\n )\n\n tx.feePayer = fromWallet.publicKey\n tx.recentBlockhash = latestBlockhashAndContext.value.blockhash\n tx.sign(...signers, fromWallet)\n const signature = await connection.sendRawTransaction(tx.serialize(), {\n skipPreflight: true,\n })\n\n await connection.confirmTransaction(\n {\n ...latestBlockhashAndContext.value,\n signature,\n },\n 'finalized',\n )\n return { status: 'success', signature } as DepositSOLResponse\n } catch (error) {\n console.log('depositSol error', error)\n return { status: 'error', error } as DepositSOLResponse\n }\n}\n\nconst depositSOLInstruction = async (\n connection: Connection,\n fromWalletKey: number[],\n lamport: number,\n stakePoolAddress: PublicKey = new PublicKey(SOLV_STAKE_POOL_ADDRESS),\n destinationTokenAccount?: PublicKey,\n referrerTokenAccount?: PublicKey,\n depositAuthority?: PublicKey,\n) => {\n const fromWallet = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const payerAddress = fromWallet.publicKey\n const res = await solanaStakePool.depositSol(\n connection,\n stakePoolAddress,\n payerAddress,\n lamport,\n destinationTokenAccount,\n referrerTokenAccount,\n depositAuthority,\n )\n return res\n}\n","import { Connection, Keypair, PublicKey } from '@solana/web3.js'\nimport { askAmount } from '.'\nimport { SOLV_POOL_MANAGER_ADDRESS } from '@/config/config'\nimport { getOrCreateDestinationAddress } from '@/lib/solana/getOrCreateDestinationAddress'\nimport { Spinner } from 'cli-spinner'\nimport chalk from 'chalk'\nimport { depositSol } from '@/lib/solana/depositSOL'\nimport { sleep } from '@skeet-framework/utils'\nimport { getStakePoolInfo } from '@/lib/solana/getStakePoolInfo'\n\nexport const depositeLST = async (\n rpcUrl: string,\n poolAddress: string,\n amount: number,\n fromWalletKey: number[],\n symbol?: string,\n) => {\n const connection = new Connection(rpcUrl)\n if (amount === 0) {\n amount = await askAmount()\n }\n const spinner = new Spinner('%s')\n spinner.setSpinnerString(18)\n spinner.start()\n spinner.setSpinnerTitle(\n chalk.green(`✔︎ Checking Stake Pool ${poolAddress}...`),\n )\n const stakePoolAddress = new PublicKey(poolAddress)\n const stakePool = await getStakePoolInfo(rpcUrl, poolAddress)\n if (!stakePool) {\n console.log('Stake Pool not found')\n return false\n }\n spinner.setSpinnerTitle(\n chalk.green(`🔍 Getting or Creating AssociatedTokenAccount`),\n )\n const mintAddress = stakePool.poolMint\n const depositAuthority = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const destinationTokenAccount = await getOrCreateDestinationAddress(\n rpcUrl,\n fromWalletKey,\n mintAddress,\n depositAuthority.publicKey,\n )\n const solvAssociatedTokenAccount = await getOrCreateDestinationAddress(\n rpcUrl,\n fromWalletKey,\n mintAddress,\n new PublicKey(SOLV_POOL_MANAGER_ADDRESS),\n true,\n )\n await sleep(1000)\n\n spinner.setSpinnerTitle(chalk.green(`🔄 Converting SOL to ${symbol}`))\n\n let sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(solvAssociatedTokenAccount),\n depositAuthority.publicKey,\n )\n\n let retryCount = 0\n while (sig.status !== 'success') {\n retryCount++\n if (retryCount > 10) {\n spinner.stop(true)\n console.log(chalk.red('Failed to deposit.Please try again later 🙏'))\n return false\n }\n console.log(chalk.yellow(`⏳ ${retryCount} Times Retrying...\\n`))\n await sleep(1000)\n sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(solvAssociatedTokenAccount),\n depositAuthority.publicKey,\n )\n }\n spinner.stop(true)\n console.log(\n chalk.white(`💰 You've got ${symbol} ✨\\n\\nSignature:`, sig.signature),\n )\n return true\n}\n","import { execSync } from 'child_process'\n\nexport const getEpoch = () => {\n try {\n const cmd = `solana epoch --commitment finalized -ul`\n const epoch = execSync(cmd, { encoding: 'utf-8' }).toString()\n return epoch.replace(/\\n/g, '')\n } catch (error) {\n return `getEpoch Error: ${error}`\n }\n}\n\nexport const getEpochRemote = () => {\n try {\n const cmd = `solana epoch`\n const epoch = execSync(cmd, { encoding: 'utf-8' }).toString()\n return epoch.replace(/\\n/g, '')\n } catch (error) {\n return `getEpoch Error: ${error}`\n }\n}","import { execSync } from 'child_process'\n\nexport const getSlot = () => {\n try {\n const cmd = `solana --url http://127.0.0.1:8899 slot`\n const slot = execSync(cmd, { encoding: 'utf-8' }).toString()\n return slot.replace(/\\n/g, '')\n } catch (error) {\n return `getSlot Error: ${error}`\n }\n}\n","import chalk from 'chalk'\nimport { Spinner } from 'cli-spinner'\nimport { VERSION } from '@/lib/version'\n\nexport module Logger {\n export const successHex = chalk.hex('#39A845')\n export const warningHex = chalk.hex('#FFD02E')\n export const errorHex = chalk.hex('#B5332E')\n export const syncHex = chalk.hex('#3073B7')\n export const greyHex = chalk.hex('#BEBDBD')\n export const indigoHex = chalk.hex('#3950A0')\n export const pinkHex = chalk.hex('#D8A1C4')\n\n export const normal = (text: string) => {\n console.log(chalk.white(text))\n }\n\n export const syncSpinner = (text: string) => {\n const spinner = new Spinner(chalk.white(text) + ` %s\\n`)\n try {\n spinner.setSpinnerString(18)\n spinner.start()\n return spinner\n } catch (error) {\n spinner.stop(true)\n throw new Error(`syncSpinner Error: ${error}`)\n }\n }\n\n export const solvAA = () => {\n const row1 = Logger.syncHex(' _ ')\n const row2 = Logger.syncHex(' | | ')\n const row3 = Logger.syncHex(' ___ ___ | |') + Logger.errorHex('_ __ ')\n const row4 = Logger.syncHex('/ __|/ _ \\\\| |') + Logger.errorHex('\\\\ \\\\ / /')\n const row5 = Logger.syncHex('\\\\__ \\\\ (_) | |') + Logger.errorHex(' \\\\ V / ')\n const row6 = Logger.syncHex('|___/\\\\___/|_|') + Logger.errorHex(' \\\\_/ ')\n\n console.log(`\\n${row1}`)\n console.log(`${row2}`)\n console.log(`${row3}`)\n console.log(`${row4}`)\n console.log(`${row5}`)\n console.log(`${row6}\\n`)\n console.log(`Solv Version: v${VERSION}\\n`)\n }\n\n export const installMessage = () => {\n const msg = warningHex(`🔥 Welcome to Solana Validator Tool Solv 🔥`)\n const msg2 = `\nSolv is born and ready for running Solana Validator 🚀\n\n$ cd ~ && source ~/.profile\n$ solv setup\n\n$ solv --help for more information\n`\n console.log(msg)\n console.log(greyHex(msg2))\n }\n\n export const installClientMessage = () => {\n const msg = warningHex(`🔥 Welcome to Solana Validator Tool Solv 🔥`)\n const msg2 = `\nThis is solv CLI mode for Solana Validator Management ⭐️\n\n$ cd ~ && source ~/.profile\n$ solv c\n\n$ solv --help for more information\n`\n console.log(msg)\n console.log(greyHex(msg2))\n }\n\n export const mtCommandsLog = () => {\n const msg = warningHex(`🔨 Mount Commands 🔨`)\n const msg2 = `mount\\n$ solv mt -p <fileSystem>\\n`\n const msg3 = `unmount\\n$ solv umt -p <fileSystem>\\n`\n const msg4 = `mount reload\\n$ solv mtr\\n`\n console.log(msg)\n console.log(greyHex(msg2))\n console.log(greyHex(msg3))\n console.log(greyHex(msg4))\n }\n}\n","import { SERVICE_PATHS, startupScriptPaths } from '@/config/config'\nimport { DefaultConfigType } from '@/config/types'\nimport chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\n\nexport const showConfig = (solvConfig: DefaultConfigType) => {\n const cmd = `solana config get`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n const config = startupScriptPaths()\n console.log(chalk.white('start-validator.sh: ') + config.scriptPath)\n console.log(chalk.white('solv.service: ') + SERVICE_PATHS.SOL_SERVICE)\n console.log(chalk.white('logrotate: ') + SERVICE_PATHS.SOL_LOGROTATE)\n console.log(chalk.white('logrotate (fd): ') + SERVICE_PATHS.FRANKENDANCER_LOGROTATE)\n console.log(chalk.white('sysctl.d: ') + SERVICE_PATHS.SOL_SYSTEM_CONFIG21)\n console.log(chalk.white('limits.d: ') + SERVICE_PATHS.SOL_NOFILES_CONF)\n console.log(chalk.white('system.conf: ') + SERVICE_PATHS.SOL_SYSTEM_CONF)\n console.log(chalk.white('ledger: ') + config.ledger)\n console.log(chalk.white('accounts: ') + config.accounts)\n console.log(chalk.white('snapshots: ') + config.snapshots)\n console.log(chalk.white('mount type: ') + solvConfig.MNT_DISK_TYPE)\n}\n","import { program } from '@/index'\nimport { getEpoch } from '../cron/getEpoch'\nimport { getSlot } from '../cron/getSlot'\nimport { Logger } from '@/lib/logger'\nimport { showConfig } from './showConfig'\nimport { getSnapshot } from './snapshot'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport {\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport getSolanaCLI from '@/config/getSolanaCLI'\n\nexport const getCommands = (config: DefaultConfigType) => {\n const isTest = config.NETWORK === Network.TESTNET\n let version = isTest ? VERSION_TESTNET : VERSION_MAINNET\n if (config.NODE_TYPE === NodeType.RPC) {\n version = VERSION_SOLANA_RPC\n }\n const get = program\n .command('get')\n .description(`Get Solana Validator's Information`)\n .argument(\n '<cmd>',\n `Subcommands: epoch, slot, catchup, snapshot, contact, config`,\n )\n\n get\n .command('epoch')\n .description(`Show Validator's Epoch`)\n .action(() => {\n const epoch = getEpoch()\n console.log({ epoch })\n })\n\n get\n .command('ip')\n .description(`Show Validator's IP Address`)\n .action(() => {\n const cmd = `curl ipinfo.io/ip`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n console.log(chalk.white(`${stdout}`))\n })\n\n get\n .command('slot')\n .description(`Show Current Slot`)\n .action(() => {\n const slot = getSlot()\n console.log({ slot })\n })\n\n get\n .command('snapshot')\n .alias('sn')\n .option(\n '-m, --minDownloadSpeed <minDownloadSpeed>',\n 'Minimum download speed',\n '100',\n )\n .option(\n '-s, --snapshotPath <snapshotPath>',\n 'Snapshot Path',\n config.SNAPSHOTS_PATH,\n )\n .option('-v, --version <version>', 'Specific Version Node', version)\n .option('-r, --rpcUrl <rpcUrl>', 'RPC URL', isTest ? 'https://api.testnet.solana.com' : 'https://api.mainnet-beta.solana.com')\n .option('-a, --avorio <version>', 'Use Avorio Network (Testnet only)', false)\n .description(`Download the latest snapshot`)\n .action(\n (options: {\n minDownloadSpeed: string\n ledgerPath: string\n snapshotPath: string\n version: string\n rpcUrl: string\n avorio: boolean\n }) => {\n const minDownloadSpeed = options.minDownloadSpeed\n const snapshotPath = options.snapshotPath\n const version = options.version\n const rpcUrl = options.rpcUrl\n const useAvorio = options.avorio\n getSnapshot(isTest, minDownloadSpeed, snapshotPath, version, rpcUrl, useAvorio)\n },\n )\n\n get\n .command('contact')\n .description('Show Validator Contact Information')\n .action(() => {\n const solanaValidatorClient = getSolanaCLI()\n const cmd = `${solanaValidatorClient} --ledger /mnt/ledger/ contact-info`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n })\n\n get\n .command('config')\n .description('Show Solv Config')\n .alias('c')\n .action(async () => {\n showConfig(config)\n })\n\n get\n .command('aa')\n .description('Show Solv AA')\n .option('-c, --client', 'Show Solv Client Mode AA', false)\n .action((options: { client: boolean }) => {\n Logger.solvAA()\n if (options.client) {\n Logger.installClientMessage()\n } else {\n Logger.installMessage()\n }\n })\n get.addHelpCommand('help [cmd]', 'Get Solana Validator Information')\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerStatus = () => {\n const cmd = `sudo systemctl status relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerStart = () => {\n const cmd = `sudo systemctl start relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerStop = () => {\n const cmd = `sudo systemctl stop relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerRestart = () => {\n const cmd = `sudo systemctl restart relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerLog = (error = false) => {\n const cmd = error\n ? `journalctl -u relayer.service -xef | grep ERROR`\n : `journalctl -u relayer.service -xef`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport { relayerStatus } from './relayerStatus'\nimport { relayerStart } from './relayerStart'\nimport { relayerStop } from './relayerStop'\nimport { relayerRestart } from './relayerRestart'\nimport { relayerLog } from './relayerLog'\nimport chalk from 'chalk'\nimport { LEDGER_PATH } from '@/config/constants'\nimport { spawnSync } from 'child_process'\nimport { relayerEnable } from './relayerEnable'\nimport getSolanaCLI from '@/config/getSolanaCLI'\n\nexport const relayerCommands = () => {\n const relayer = program\n .command('relayer')\n .description('Jito Relayer Commands')\n\n relayer\n .command('status')\n .description('Show Relayer Status')\n .action(() => {\n relayerStatus()\n })\n\n relayer\n .command('start')\n .description('Start Relayer')\n .action(() => {\n relayerStart()\n })\n\n relayer\n .command('stop')\n .description('Stop Relayer')\n .action(() => {\n relayerStop()\n })\n\n relayer\n .command('log')\n .option('-e, --error', 'Show Error Logs', false)\n .description('Show Relayer Logs')\n .action((options: { error: boolean }) => {\n relayerLog(options.error)\n })\n\n relayer\n .command('restart')\n .description('Restart Relayer')\n .action(() => {\n relayerRestart()\n })\n\n relayer\n .command('enable')\n .description('Enable Relayer')\n .action(() => {\n relayerEnable()\n })\n\n relayer\n .command('set:url')\n .option('-u, --url <url>', 'Set Relayer URL', '')\n .description('Set Relayer URL on Validator')\n .action((options: { url: string }) => {\n if (options.url === '') {\n console.log(chalk.red('Please provide a URL'))\n return\n }\n const cmd = `${getSolanaCLI()} --ledger ${LEDGER_PATH} set-relayer-config --relayer-url ${options.url}`\n console.log(chalk.white('Setting Relayer URL ...'))\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n console.log(chalk.green('🟢 Relayer URL Set'))\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerEnable = () => {\n const cmd = `sudo systemctl enable relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import chalk from 'chalk'\nimport { spawnSync } from 'child_process'\n\nexport const splBalance = async (keyPath: string) => {\n try {\n const cmd = `spl-token accounts --owner ${keyPath}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n } catch (error) {\n console.log(chalk.yellow(`You might need to install the Solana SPL CLI:\\n`))\n console.log(chalk.white(`$ cargo install spl-token-cli`))\n }\n}\n","import { program } from '@/index'\nimport { splBalance } from '@/lib/solana/splBalance'\nimport { homedir } from 'os'\nimport { DefaultConfigType } from '@/config/types'\nimport { getAllKeyPaths } from '@/config/config'\nimport { getSolBalance } from '@/lib/getSolBalance'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { Network, NodeType } from '@/config/enums'\nimport chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\nimport { IDENTITY_KEY_PATH } from '@/config/constants'\n\nexport type BalanceOptions = {\n spl: boolean\n}\n\nexport const balanceCommands = (config: DefaultConfigType) => {\n program\n .command('balance')\n .alias('bal')\n .alias('b')\n .option('-s, --spl', 'Show SPL Token Balance', false)\n .description('Show Keypairs Balance')\n .action(async (options: BalanceOptions) => {\n if (options.spl) {\n const defaultKey = 'mainnet-authority-keypair.json'\n const keyPath = `${homedir()}/${defaultKey}`\n await splBalance(keyPath)\n process.exit(0)\n }\n await showKeypairsInfo(config)\n process.exit(0)\n })\n}\n\nconst showKeypairsInfo = async (config: DefaultConfigType) => {\n const keyInfo = getKeypairsInfo(config)\n let output = `Validator Key: ${keyInfo.validatorKey}\nAddress: ${keyInfo.validatorKeyAddress}\nBalance: ${keyInfo.validatorKeyBalance}\nVote Key: ${keyInfo.voteKey} \nAddress: ${keyInfo.voteKeyAddress}\nBalance: ${keyInfo.voteKeyBalance}\nAuthority Key: ${keyInfo.authorityKey}\nAddress: ${keyInfo.authorityKeyAddress}\nBalance: ${keyInfo.authorityKeyBalance}\nActive Identity:`\n if (config.NODE_TYPE === NodeType.RPC) {\n output = `Validator Key: ${keyInfo.validatorKey}\nAddress: ${keyInfo.validatorKeyAddress}\nBalance: ${keyInfo.validatorKeyBalance}\nActive Identity:`\n }\n console.log(chalk.white(output))\n spawnSync(`solana-keygen pubkey ${IDENTITY_KEY_PATH}`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n\nexport const getKeypairsInfo = (config: DefaultConfigType) => {\n const keypairs = getAllKeyPaths()\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n\n if (isRPC) {\n return {\n validatorKey: keypairs.mainnetValidatorKey,\n validatorKeyAddress: getSolanaAddress(keypairs.mainnetValidatorKey),\n validatorKeyBalance: getSolBalance(keypairs.mainnetValidatorKey),\n }\n }\n\n if (isTestnet) {\n return {\n validatorKey: keypairs.testnetValidatorKey,\n validatorKeyAddress: getSolanaAddress(keypairs.testnetValidatorKey),\n validatorKeyBalance: getSolBalance(keypairs.testnetValidatorKey),\n voteKey: keypairs.testnetValidatorVoteKey,\n voteKeyAddress: getSolanaAddress(keypairs.testnetValidatorVoteKey),\n voteKeyBalance: getSolBalance(keypairs.testnetValidatorVoteKey),\n authorityKey: keypairs.testnetValidatorAuthorityKey,\n authorityKeyAddress: getSolanaAddress(\n keypairs.testnetValidatorAuthorityKey,\n ),\n authorityKeyBalance: getSolBalance(keypairs.testnetValidatorAuthorityKey),\n }\n }\n\n return {\n validatorKey: keypairs.mainnetValidatorKey,\n validatorKeyAddress: getSolanaAddress(keypairs.mainnetValidatorKey),\n validatorKeyBalance: getSolBalance(keypairs.mainnetValidatorKey),\n voteKey: keypairs.mainnetValidatorVoteKey,\n voteKeyAddress: getSolanaAddress(keypairs.mainnetValidatorVoteKey),\n voteKeyBalance: getSolBalance(keypairs.mainnetValidatorVoteKey),\n authorityKey: keypairs.mainnetValidatorAuthorityKey,\n authorityKeyAddress: getSolanaAddress(\n keypairs.mainnetValidatorAuthorityKey,\n ),\n authorityKeyBalance: getSolBalance(keypairs.mainnetValidatorAuthorityKey),\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const getSolBalance = (keyPath: string) => {\n const cmd = `solana balance --keypair ${keyPath}`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n const balance = stdout.toString().trim()\n return balance\n}\n","import { spawnSync } from 'child_process'\n\nexport const rmLogs = () => {\n const cmd = `sudo rm -rf /home/solv/solana-validator.log.*`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import getSolanaCLI from '@/config/getSolanaCLI'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n\nexport const monitorSolana = (config: DefaultConfigType) => {\n const solanaValidatorClient = getSolanaCLI()\n const cmd = `${solanaValidatorClient} --ledger ${config.LEDGER_PATH} monitor`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const solanaCatchup = () => {\n const cmd = `solana catchup --our-localhost`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport inquirer from 'inquirer'\nimport { execSync, spawnSync } from 'child_process'\nimport chalk from 'chalk'\nimport sleep from '@/lib/sleep'\nimport { homedir } from 'os'\nimport { MAX_RETRIES } from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nconst RETRY_DELAY = 1000\n\nexport type BalanceOptions = {\n spl: boolean\n}\n\nexport enum TransferFrom {\n VALIDATOR = 'Validator Account',\n AUTHORITY = 'Authority Account',\n}\n\nexport enum TransferTo {\n VALIDATOR = 'Validator Account',\n AUTHORITY = 'Authority Account',\n OTHER = 'Other Account',\n}\n\nexport type SelectTransferRes = {\n fromWalletPath: string\n fromAddress: string\n toAddress: string\n}\n\nexport const transferFromArray: string[] = Object.values(TransferFrom)\n\nexport const transferCommands = (config: DefaultConfigType) => {\n program\n .command('transfer')\n .alias('tr')\n .option('-s, --spl', 'Show SPL Token Balance', false)\n .description('Transfer Solana Tokens/SPL Tokens')\n .action(async (options: BalanceOptions) => {\n if (options.spl) {\n console.log(\n chalk.blue(\n '✨ Coming Soon\\nThis Feature is Currently Under Development\\nPlease Check Back Later',\n ),\n )\n process.exit(0)\n }\n const { fromWalletPath, fromAddress, toAddress } =\n await selectFromKeypairs()\n let toBalance = '0'\n try {\n const out = spawnSync(\n `solana balance ${toAddress} --url ${config.RPC_URL}`,\n { shell: true },\n )\n if (out.status !== 0) {\n throw new Error('Invalid Wallet Address')\n }\n toBalance = out.stdout.toString()\n console.log('toBalance:', toBalance)\n } catch (error) {\n console.log(\n chalk.red(`❌ To Wallet is Invalid\\nPlease Check the Wallet Address`),\n )\n process.exit(0)\n }\n\n const fromBalance = execSync(\n `solana balance ${fromAddress} --url ${config.RPC_URL}`,\n ).toString()\n\n console.log(\n chalk.white(\n `🏦 From Wallet: ${fromAddress}\\n💰 Balance: ${fromBalance}`,\n ),\n )\n console.log(\n chalk.white(`🏦 To Wallet: ${toAddress}\\n💰 Balance: ${toBalance}`),\n )\n const { amount } = await inquirer.prompt<{ amount: number }>([\n {\n type: 'number',\n name: 'amount',\n message: 'Enter Amount to Transfer',\n default: 0.1,\n },\n ])\n const cmd = `solana transfer ${toAddress} ${amount} --allow-unfunded-recipient --keypair ${fromWalletPath} --url ${config.RPC_URL}`\n let result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n let maxRetries = MAX_RETRIES\n while (result.status !== 0 && maxRetries > 0) {\n console.log(\n chalk.red(\n `❌ Transaction Failed\\nRetrying Transaction in ${RETRY_DELAY}ms\\nRetries Left: ${maxRetries}`,\n ),\n )\n await sleep(RETRY_DELAY)\n result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n maxRetries--\n }\n process.exit(0)\n })\n}\n\nexport const validateSolanaKey = (input: string): boolean | string => {\n const regex = /^[1-9A-HJ-NP-Za-km-z]{43,44}$/\n if (regex.test(input)) {\n return true\n }\n return 'Invalid Solana keygen string. Please enter a valid key.'\n}\n\nconst selectFromKeypairs = async () => {\n const homeDir = homedir()\n const authorityKey = 'mainnet-authority-keypair.json'\n const validatorKey = 'mainnet-validator-keypair.json'\n let toKeyPath = `${homeDir}/${authorityKey}`\n\n let toAddress = execSync(`solana address -k ${toKeyPath}`).toString().trim()\n const answer = await inquirer.prompt<{ from: string }>([\n {\n type: 'list',\n name: 'from',\n message: 'Select Transfer From Account',\n choices: transferFromArray,\n },\n ])\n const secondChoice =\n answer.from === TransferFrom.VALIDATOR\n ? Object.values(TransferTo).filter(\n (value) => value !== TransferTo.VALIDATOR,\n )\n : Object.values(TransferTo).filter(\n (value) => value !== TransferTo.AUTHORITY,\n )\n\n const second = await inquirer.prompt<{ to: string }>([\n {\n type: 'list',\n name: 'to',\n message: 'Select Transfer To Account',\n choices: secondChoice,\n },\n ])\n if (second.to === TransferTo.OTHER) {\n const { to } = await inquirer.prompt<{ to: string }>([\n {\n type: 'input',\n name: 'to',\n message: 'Enter Transfer To Account',\n validate: validateSolanaKey,\n },\n ])\n toAddress = to\n } else {\n const toKey =\n answer.from === TransferFrom.VALIDATOR ? authorityKey : validatorKey\n toKeyPath = `${homeDir}/${toKey}`\n toAddress = execSync(`solana address -k ${toKeyPath}`).toString().trim()\n }\n const key =\n answer.from === TransferFrom.VALIDATOR ? validatorKey : authorityKey\n const fromWalletPath = `${homeDir}/${key}`\n const fromAddress = execSync(`solana address -k ${fromWalletPath}`)\n .toString()\n .trim()\n return { fromWalletPath, fromAddress, toAddress } as SelectTransferRes\n}\n","import { SOLANA_TESTNET_RPC_URL } from '@/config/config'\nimport { Network } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport { execSync, spawnSync } from 'node:child_process'\n\nexport const withdraw = async (config: DefaultConfigType, isAll = false) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const RPC_URL = isTestnet ? SOLANA_TESTNET_RPC_URL : config.RPC_URL\n const validatorKeypair = isTestnet\n ? '~/testnet-validator-keypair.json'\n : '~/mainnet-validator-keypair.json'\n const authorityKeypair = isTestnet\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n const voteAccount = isTestnet\n ? '~/testnet-vote-account-keypair.json'\n : '~/mainnet-vote-account-keypair.json'\n\n const currentVoteAccountBalance = execSync(`solana balance ${voteAccount}`)\n .toString()\n .replace('SOL', '')\n .trim()\n\n let withdrawAmount = 0\n const defaultMax = Number(currentVoteAccountBalance) - 0.03\n if (isAll) {\n withdrawAmount = defaultMax\n } else {\n console.log(\n chalk.white(\n '💰 Current Vote Account Balance:',\n currentVoteAccountBalance + ' SOL',\n ),\n )\n console.log(\n chalk.yellow(\n '⚠️ 0.03 SOL will be left in the account if you just press enter.',\n ),\n )\n const answer = await inquirer.prompt<{ sol: string }>([\n {\n type: 'input',\n name: 'sol',\n message: `How many SOL? e.g. ${defaultMax}`,\n default: String(defaultMax),\n },\n ])\n withdrawAmount = Number(answer.sol)\n }\n\n const votePubkey = execSync(`solana address --keypair ${voteAccount}`)\n .toString()\n .trim()\n const targetPubkey = execSync(`solana address --keypair ${authorityKeypair}`)\n .toString()\n .trim()\n const cmd = `solana withdraw-from-vote-account --keypair ${validatorKeypair} --commitment finalized ${votePubkey} ${targetPubkey} ${withdrawAmount} --authorized-withdrawer ${authorityKeypair} --url ${RPC_URL}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport { withdraw } from './withdraw'\nimport { DefaultConfigType } from '@/config/types'\n\ntype WithdrawOptions = {\n all: boolean\n}\n\nexport const withdrawCommands = (config: DefaultConfigType) => {\n program\n .command('withdraw')\n .option('-a, --all', 'Withdraw All SOL', false)\n .description('Withdraw SOL from Vote Account to Authority Account')\n .action(async (options: WithdrawOptions) => {\n await withdraw(config, options.all)\n process.exit(0)\n })\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { execSync, spawnSync } from 'node:child_process'\nimport { getHarvestBalance } from './getHarvestBalance'\nimport getBalance, { KeyType } from '@/lib/solana/getBalance'\nimport chalk from 'chalk'\nimport { solanaTransfer } from '@/lib/solana/solanaTransfer'\nimport { readFile } from 'fs/promises'\nimport { LAMPORTS_PER_SOL } from '@solana/web3.js'\n\n// Collect SOL from Vote Account to Authority Account and Validator Account to Authority Account\n// 1. Withdraw all SOL from Vote Account to Authority Account\n// 2. Transfer SOL from Validator Account to Authority Account\n\nexport const collectSOL = async (rpcUrl: string) => {\n const { mainnetValidatorAuthorityKey, mainnetValidatorKey } = getAllKeyPaths()\n\n // Check Vote Account Balance\n const voteAccountBalance = await getBalance(rpcUrl, KeyType.VOTE)\n\n // Skip this step if Vote Account Balance is less than 1 SOL\n if (voteAccountBalance < 1) {\n console.log(chalk.white('Vote Account Balance is less than 1 SOL'))\n console.log(\n chalk.white(\n 'Skip withdrawing SOL from Vote Account to Authority Account',\n ),\n )\n } else {\n // Withdraw all SOL from Vote Account to Authority Account\n const cmd = `solv withdraw --all`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n }\n\n // Check Validator Key Balance\n const validatorTransferableBalance = await getHarvestBalance(rpcUrl)\n console.log(\n chalk.white(`Transferable Balance: ${validatorTransferableBalance} SOL`),\n )\n const transferLamports = validatorTransferableBalance * LAMPORTS_PER_SOL\n\n // Skip this step if Validator Account Balance is less than 1 SOL\n if (validatorTransferableBalance < 1) {\n console.log(chalk.white('Validator Account Balance is less than 1 SOL'))\n console.log(\n chalk.white(\n 'Skip transferring SOL from Validator Account to Authority Account',\n ),\n )\n } else {\n // Transfer SOL from Validator Account to Authority Account\n const toAddress = execSync(\n `solana address --keypair ${mainnetValidatorAuthorityKey}`,\n )\n .toString()\n .trim()\n\n const fromWalletKey = JSON.parse(\n await readFile(mainnetValidatorKey, 'utf-8'),\n ) as number[]\n\n await solanaTransfer(rpcUrl, fromWalletKey, toAddress, transferLamports)\n }\n return true\n}\n","import { BN } from 'bn.js'\nimport { LAMPORTS_PER_SOL } from '@solana/web3.js'\nimport getBalance, { KeyType } from '@/lib/solana/getBalance'\n\n// Havrst Settings\nconst MINIMUM_EPOCH_START_BALANCE = new BN(3 * LAMPORTS_PER_SOL) // LAMPORTS\n\nexport const getHarvestBalance = async (rpcUrl: string) => {\n const validatorBalance = await getBalance(rpcUrl, KeyType.VALIDATOR)\n const validatorBalanceBN = new BN(\n Number(Number(validatorBalance) * LAMPORTS_PER_SOL),\n )\n const withdrawableBalanceLamport = validatorBalanceBN.sub(\n MINIMUM_EPOCH_START_BALANCE,\n )\n let withdrawableBalance =\n Number(withdrawableBalanceLamport) / LAMPORTS_PER_SOL\n // round to 9 decimal places\n withdrawableBalance = Math.round(withdrawableBalance * 1e9) / 1e9\n return withdrawableBalance // SOL\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { Connection, LAMPORTS_PER_SOL } from '@solana/web3.js'\nimport loadKeypairFromFile from './loadKeypairFromFile'\nimport { homedir } from 'os'\n\nexport enum KeyType {\n VALIDATOR = 'validator',\n AUTH = 'auth',\n VOTE = 'vote',\n}\n\ntype NetworkPrefix = 'mainnet' | 'testnet'\n\ntype KeySuffix = 'ValidatorKey' | 'ValidatorVoteKey' | 'ValidatorAuthorityKey'\n\ntype AccountKey =\n | 'mainnetValidatorKey'\n | 'mainnetValidatorVoteKey'\n | 'mainnetValidatorAuthorityKey'\n | 'testnetValidatorKey'\n | 'testnetValidatorVoteKey'\n | 'testnetValidatorAuthorityKey'\n\nconst keySuffixMap: Record<KeyType, KeySuffix> = {\n [KeyType.VALIDATOR]: 'ValidatorKey',\n [KeyType.AUTH]: 'ValidatorAuthorityKey',\n [KeyType.VOTE]: 'ValidatorVoteKey',\n}\n\nconst getBalance = async (\n rpcUrl: string,\n key: KeyType = KeyType.AUTH,\n isTestnet: boolean = false,\n): Promise<number> => {\n const connection = new Connection(rpcUrl)\n const home = homedir()\n const keyPaths = getAllKeyPaths(home)\n\n const prefix: NetworkPrefix = isTestnet ? 'testnet' : 'mainnet'\n\n const accountKey = `${prefix}${keySuffixMap[key]}` as AccountKey\n const account = keyPaths[accountKey]\n\n const keypair = await loadKeypairFromFile(account)\n const balance = await connection.getBalance(keypair.publicKey)\n const lamports = Number(balance)\n const SOL = lamports / LAMPORTS_PER_SOL\n\n if (isNaN(SOL)) throw new Error('Failed to get balance')\n return SOL\n}\n\nexport default getBalance\n","import { Keypair } from '@solana/web3.js'\nimport { readFile } from 'fs/promises'\n\nconst loadKeypairFromFile = async (filePath: string) => {\n const secretKey = JSON.parse(await readFile(filePath, 'utf8')) as number[]\n return Keypair.fromSecretKey(new Uint8Array(secretKey))\n}\n\nexport default loadKeypairFromFile\n","import {\n Keypair,\n Connection,\n PublicKey,\n SystemProgram,\n ComputeBudgetProgram,\n VersionedTransaction,\n TransactionMessage,\n} from '@solana/web3.js'\nimport sleep from '../sleep'\nimport { MAX_RETRIES } from '@/config/constants'\n\nexport const solanaTransfer = async (\n endpoint: string,\n fromWalletKey: number[],\n toAddressPubkey: string,\n transferAmountLamport: number,\n) => {\n let retry = 0\n try {\n const connection = new Connection(endpoint, 'finalized')\n\n const fromWallet = Keypair.fromSecretKey(\n new Uint8Array(Array.from(fromWalletKey)),\n )\n const toPubkey = new PublicKey(toAddressPubkey)\n const lamports = transferAmountLamport\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const testInstructions = [\n SystemProgram.transfer({\n fromPubkey: fromWallet.publicKey,\n toPubkey,\n lamports,\n }),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: Math.ceil(5000000),\n }),\n ]\n\n const latestBlockhashAndContext =\n await connection.getLatestBlockhashAndContext({\n commitment: 'finalized',\n })\n\n const testVersionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions: testInstructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n const simulationResult = await connection.simulateTransaction(\n testVersionedTx,\n {\n replaceRecentBlockhash: true,\n sigVerify: false,\n },\n )\n\n testVersionedTx.sign([fromWallet])\n\n const instructions = [\n SystemProgram.transfer({\n fromPubkey: fromWallet.publicKey,\n toPubkey,\n lamports,\n }),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: simulationResult.value.unitsConsumed\n ? Math.trunc(simulationResult.value.unitsConsumed * 1.2)\n : 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1000,\n }),\n ]\n\n const versionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n versionedTx.sign([fromWallet])\n const signature = await connection.sendRawTransaction(\n versionedTx.serialize(),\n )\n\n await connection.confirmTransaction(\n {\n ...latestBlockhashAndContext.value,\n signature,\n },\n 'finalized',\n )\n console.log('finalized signature:', signature)\n return signature\n } catch (error) {\n retry++\n if (retry > MAX_RETRIES) {\n throw new Error(JSON.stringify(error))\n }\n console.log(\n `solanaTransfer failed, ${retry} times retrying... Error: ${error}`,\n )\n await sleep(1000)\n }\n }\n } catch (error) {\n console.log(`solanaTransfer: ${error}`)\n throw new Error(JSON.stringify(error))\n }\n}\n","import { program } from '@/index'\nimport { collectSOL } from './collectSOL'\nimport getBalance, { KeyType } from '@/lib/solana/getBalance'\nimport sleep from '@/lib/sleep'\nimport { elSOLdeposit } from '../stake/elSOLdeposit'\nimport {\n ELSOL_DECIMALS,\n ELSOL_MINT_ADDRESS,\n SOLV_STAKE_POOL_ADDRESS,\n getAllKeyPaths,\n} from '@/config/config'\nimport { readFile } from 'fs/promises'\nimport inquirer from 'inquirer'\nimport { validateSolanaKey } from '../transfer'\nimport getElSOLBalance from '@/lib/solana/getElSOLBalance'\nimport chalk from 'chalk'\nimport { transferSPLToken } from '@/lib/solana/transferSPLToken'\nimport { sendDiscord } from '@/lib/sendDiscord'\nimport mevOn from './mevOn'\nimport { spawnSync } from 'node:child_process'\nimport { getEpochInfo } from '@/lib/getEpochInfo'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { DefaultConfigType } from '@/config/types'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\n\nconst MINIMUM_AUTHORITY_BALANCE = 0.03\n\nexport const harvestCommands = (config: DefaultConfigType) => {\n program\n .command('harvest')\n .alias('hv')\n .description('Harvest SOL from Validator Account to Authority Account')\n .action(async () => {\n const harvestAddress = await getHarvestAddress(config)\n const { mainnetValidatorAuthorityKey } = getAllKeyPaths()\n console.log('Harvesting SOL...')\n await collectSOL(config.RPC_URL)\n let voteBalance = await getBalance(config.RPC_URL, KeyType.VOTE)\n let retryCount = 0\n while (voteBalance > 1 && retryCount < 3) {\n console.log('Retrying Harvesting SOL...')\n await sleep(1000)\n await collectSOL(config.RPC_URL)\n voteBalance = await getBalance(config.RPC_URL, KeyType.VOTE)\n retryCount++\n }\n const fromWalletKey = JSON.parse(\n await readFile(mainnetValidatorAuthorityKey, 'utf-8'),\n ) as number[]\n\n // Convert SOL to elSOL\n const authorityBalance = await getBalance(config.RPC_URL, KeyType.AUTH)\n if (authorityBalance < 1) {\n console.log(chalk.white('Authority Account Balance is less than 1 SOL'))\n console.log(chalk.white('Skip converting SOL to elSOL'))\n } else {\n let convertibleBalance = authorityBalance - MINIMUM_AUTHORITY_BALANCE\n convertibleBalance = Math.round(convertibleBalance * 1e9) / 1e9\n console.log(`Converting ${convertibleBalance} SOL to elSOL`)\n const result = await elSOLdeposit(\n config.RPC_URL,\n SOLV_STAKE_POOL_ADDRESS,\n convertibleBalance,\n fromWalletKey,\n )\n if (!result) {\n throw new Error('Failed to convert SOL to elSOL')\n }\n }\n\n // Transfer elSOL to Harvest Address\n const elSOLBalance = await getElSOLBalance(config.RPC_URL)\n if (elSOLBalance < 1) {\n const epoch = await getEpochInfo(config.RPC_URL)\n console.log('elSOL Balance is less than 1 elSOL')\n const msg = `elSOL Balance is less than 1 elSOL for ${epoch.epoch}`\n await sendDiscord(msg)\n\n process.exit(0)\n }\n console.log(`Transferring ${elSOLBalance} elSOL to Harvest Address`)\n await transferSPLToken(\n config.RPC_URL,\n fromWalletKey,\n harvestAddress,\n elSOLBalance,\n ELSOL_MINT_ADDRESS,\n ELSOL_DECIMALS,\n )\n if (config.IS_MEV_MODE) {\n const epoch = await getEpochInfo(config.RPC_URL)\n const msg = `💰 Harvested Rewards for ${epoch.epoch} 💰\nValidator Address: ${getSolanaAddress(mainnetValidatorAuthorityKey)}\nTotal Reward: ${elSOLBalance} elSOL\nHarvest Address: ${harvestAddress}`\n await sendDiscord(msg)\n }\n console.log(chalk.green('✔︎ Successfully Harvested SOL'))\n process.exit(0)\n })\n\n program\n .command('auto')\n .alias('mev')\n .description('Enable Auto Operation Mode')\n .action(async () => {\n const res = await mevOn(config)\n if (res) {\n spawnSync(`solv cron epoch`, {\n stdio: 'inherit',\n shell: true,\n })\n console.log(chalk.green('✔︎ Auto Operation Mode Enabled'))\n }\n process.exit(0)\n })\n}\n\nexport const getHarvestAddress = async (config: DefaultConfigType) => {\n try {\n const harvestAddress = config.HARVEST_ACCOUNT\n if (harvestAddress === '') {\n throw new Error('Harvest Address not found')\n }\n return harvestAddress\n } catch (error) {\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'harvestAddress',\n message: 'Enter Harvest Address',\n validate: validateSolanaKey,\n },\n ])\n await updateDefaultConfig({ HARVEST_ACCOUNT: answer.harvestAddress })\n return answer.harvestAddress as string\n }\n}\n","import { ELSOL_MINT_ADDRESS, getAllKeyPaths } from '@/config/config'\nimport chalk from 'chalk'\nimport { execSync } from 'child_process'\nimport { homedir } from 'os'\n\nconst getElSOLBalance = async (rpcUrl: string) => {\n try {\n const home = homedir()\n const { mainnetValidatorAuthorityKey } = getAllKeyPaths(home)\n const cmd = `spl-token balance ${ELSOL_MINT_ADDRESS} --owner ${mainnetValidatorAuthorityKey} --url ${rpcUrl}`\n const balance = execSync(cmd).toString().trim()\n return Number(balance)\n } catch (error) {\n console.log(chalk.red(`Error: ${error}`))\n console.log(chalk.yellow(`You might need to install the Solana SPL CLI:\\n`))\n console.log(chalk.white(`$ cargo install spl-token-cli`))\n return 0\n }\n}\n\nexport default getElSOLBalance\n","import {\n Connection,\n PublicKey,\n Keypair,\n ComputeBudgetProgram,\n VersionedTransaction,\n TransactionMessage,\n} from '@solana/web3.js'\nimport {\n getOrCreateAssociatedTokenAccount,\n createTransferInstruction,\n TOKEN_PROGRAM_ID,\n} from '@solana/spl-token'\n\nexport const transferSPLToken = async (\n endpoint: string,\n fromWalletKey: number[],\n toAddressPubkey: string,\n amount: number,\n tokenMintAddress: string,\n tokenDecimals: number,\n) => {\n try {\n const connection = new Connection(endpoint, 'finalized')\n\n const fromWallet = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const toPubkey = new PublicKey(toAddressPubkey)\n const mintPubkey = new PublicKey(tokenMintAddress)\n\n const amountInSmallestUnit = Math.trunc(\n amount * Math.pow(10, tokenDecimals),\n )\n\n const fromTokenAccount = await getOrCreateAssociatedTokenAccount(\n connection,\n fromWallet,\n mintPubkey,\n fromWallet.publicKey,\n )\n const toTokenAccount = await getOrCreateAssociatedTokenAccount(\n connection,\n fromWallet,\n mintPubkey,\n toPubkey,\n true,\n )\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const testInstructions = [\n createTransferInstruction(\n fromTokenAccount.address,\n toTokenAccount.address,\n fromWallet.publicKey,\n amountInSmallestUnit,\n [],\n TOKEN_PROGRAM_ID,\n ),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: Math.ceil(5000000),\n }),\n ]\n\n const latestBlockhashAndContext =\n await connection.getLatestBlockhashAndContext({\n commitment: 'finalized',\n })\n\n const testVersionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions: testInstructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n const simulationResult = await connection.simulateTransaction(\n testVersionedTx,\n {\n replaceRecentBlockhash: true,\n sigVerify: false,\n },\n )\n testVersionedTx.sign([fromWallet])\n\n const instructions = [\n createTransferInstruction(\n fromTokenAccount.address,\n toTokenAccount.address,\n fromWallet.publicKey,\n amountInSmallestUnit,\n [],\n TOKEN_PROGRAM_ID,\n ),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: simulationResult.value.unitsConsumed\n ? Math.trunc(simulationResult.value.unitsConsumed * 1.2)\n : 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1000,\n }),\n ]\n const versionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n versionedTx.sign([fromWallet])\n const signature = await connection.sendRawTransaction(\n versionedTx.serialize(),\n )\n\n await connection.confirmTransaction(\n {\n ...latestBlockhashAndContext.value,\n signature,\n },\n 'finalized',\n )\n console.log('finalized signature:', signature)\n return signature\n } catch (error) {\n console.error('Transfer failed, retrying...', error)\n }\n }\n } catch (error) {\n console.error(error)\n throw error\n }\n}\n","import inquirer from 'inquirer'\nimport { validateSolanaKey } from '../transfer'\nimport hasEpochTimer from '../cron/hasEpochTimer'\nimport removeCronJob from '../cron/removeCronJob'\nimport chalk from 'chalk'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\ntype MevOnParam1 = {\n mevOn: boolean\n}\ntype MevOnAutoParam = {\n autoUpdate: boolean\n autoRestart: boolean\n}\n\ntype MevOnParam2 = {\n discordWebhookUrl: string\n}\n\ntype MevOnParam3 = {\n rpcUrl: string\n}\n\nconst mevOn = async (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const ask = await inquirer.prompt<MevOnParam1>([\n {\n type: 'confirm',\n name: 'mevOn',\n message:\n 'Do you want to enable solv Auto Operation Mode?(You can change it again)',\n default: false,\n },\n ])\n if (!ask.mevOn) {\n const hasCron = await hasEpochTimer()\n if (hasCron) {\n // Delete the cron job\n await removeCronJob()\n }\n await updateDefaultConfig({\n IS_MEV_MODE: ask.mevOn,\n AUTO_UPDATE: false,\n AUTO_RESTART: false,\n })\n return false\n }\n const autoText = `✨ About Auto Update & Restart ✨\n${chalk.green('No more Login to the server to update 🌱')}\n\nIf you enable this, solv will update automatically when the solv/solana version is updated.\n\nAUTO UPDATE: If you enable this, solv will update automatically when the solv version is updated.\n\nAUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.\n※ Please turn off if you are using no-downtime migration.\n`\n console.log(chalk.white(autoText))\n const askIfAuto = await inquirer.prompt<MevOnAutoParam>([\n {\n type: 'confirm',\n name: 'autoUpdate',\n message: 'Do you want to enable AUTO UPDATE? (Recommended)',\n default: false,\n },\n {\n type: 'confirm',\n name: 'autoRestart',\n message: 'Do you want to enable AUTO RESTART?',\n default: false,\n },\n ])\n let rpcUrl = config.RPC_URL\n let harvestAddress = ''\n const ask2 = await inquirer.prompt<MevOnParam2>([\n {\n type: 'input',\n name: 'discordWebhookUrl',\n message: 'Enter your Discord Webhook URL',\n default: config.DISCORD_WEBHOOK_URL,\n },\n ])\n if (isTestnet) {\n harvestAddress = ''\n } else {\n const ask3 = await inquirer.prompt<MevOnParam3>([\n {\n type: 'input',\n name: 'rpcUrl',\n message: 'Enter your RPC URL',\n default: config.RPC_URL,\n },\n ])\n rpcUrl = ask3.rpcUrl\n }\n\n await updateDefaultConfig({\n HARVEST_ACCOUNT: harvestAddress,\n IS_MEV_MODE: ask.mevOn,\n RPC_URL: rpcUrl,\n DISCORD_WEBHOOK_URL: ask2.discordWebhookUrl,\n AUTO_UPDATE: askIfAuto.autoUpdate,\n AUTO_RESTART: askIfAuto.autoRestart,\n })\n return true\n}\n\nexport default mevOn\n","import { spawnSync } from 'child_process'\nimport chalk from 'chalk'\nimport { promises as fs } from 'fs'\n\nconst removeCronJob = async (cronPattern = 'epochTimer'): Promise<void> => {\n try {\n // 現在のcrontabの内容を取得\n const crontabResult = spawnSync('crontab', ['-l'], { encoding: 'utf-8' })\n if (crontabResult.status !== 0) {\n console.log(chalk.red('⚠️ Could not read crontab.'))\n process.exit(1)\n }\n\n const crontab = crontabResult.stdout.split('\\n')\n\n // 指定したcronPatternを含まない行だけを抽出\n const newCronBody = crontab\n .filter((line) => !line.includes(cronPattern))\n .join('\\n')\n\n // 新しいcrontabの内容を設定\n const tempCrontabFile = '/tmp/temp_crontab'\n await fs.writeFile(tempCrontabFile, newCronBody, 'utf-8')\n spawnSync('crontab', [tempCrontabFile])\n await fs.unlink(tempCrontabFile) // 一時ファイルを削除\n\n console.log(chalk.green('✅ Cron Job successfully removed.'))\n } catch (error) {\n console.log(chalk.red('Error removing cron job:', error))\n }\n}\n\nexport default removeCronJob\n","import { Connection, EpochInfo } from '@solana/web3.js'\nimport getAverageSlotTime from './getAverageSlotTime'\n\nexport interface EpochInfoType extends EpochInfo {\n estimatedTimeUntilNextEpoch: string\n displayRatio: string\n}\n\nexport const getEpochInfo = async (rpcUrl: string) => {\n try {\n const connection = new Connection(rpcUrl)\n const epochInfo = await connection.getEpochInfo()\n if (epochInfo.slotsInEpoch === 0) {\n throw new Error('slotsInEpoch is 0, causing division by zero.')\n }\n\n const timePerSlotSeconds = await getAverageSlotTime(rpcUrl)\n console.log('timePerSlotSeconds', timePerSlotSeconds)\n const remainingSlots = epochInfo.slotsInEpoch - epochInfo.slotIndex\n const estimatedSecondsUntilNextEpoch = remainingSlots * timePerSlotSeconds\n const displayRatio = (\n (epochInfo.slotIndex / epochInfo.slotsInEpoch) *\n 100\n ).toFixed(2)\n // 時間の表示方法を調整\n const days = Math.floor(estimatedSecondsUntilNextEpoch / (3600 * 24))\n const hours = Math.floor(\n (estimatedSecondsUntilNextEpoch % (3600 * 24)) / 3600,\n )\n const minutes = Math.floor((estimatedSecondsUntilNextEpoch % 3600) / 60)\n const seconds = Math.floor(estimatedSecondsUntilNextEpoch % 60)\n let estimatedTimeUntilNextEpoch = `${days}d ${hours}h ${minutes}m ${seconds}s`\n if (days === 0) {\n estimatedTimeUntilNextEpoch = `${hours}h ${minutes}m ${seconds}s`\n }\n return {\n ...epochInfo,\n estimatedTimeUntilNextEpoch,\n displayRatio,\n } as EpochInfoType\n } catch (error) {\n throw new Error(`getEpochInfo failed: ${error}`)\n }\n}\n","import { Connection } from '@solana/web3.js'\n\nconst getAverageSlotTime = async (\n rpcUrl: string,\n sampleCount = 10,\n fallbackSlotTime = 0.4, // Set a reasonable fallback slot time in seconds\n): Promise<number> => {\n try {\n const connection = new Connection(rpcUrl)\n const samples = await connection.getRecentPerformanceSamples(sampleCount)\n\n // Handle the case where no samples are available\n if (samples.length === 0) {\n console.warn(\n 'No performance samples available. Using fallback slot time.',\n )\n return fallbackSlotTime\n }\n\n // Filter out samples with numSlots equal to 0\n const validSamples = samples.filter((sample) => sample.numSlots !== 0)\n\n // If no valid samples, use the fallback slot time\n if (validSamples.length === 0) {\n console.warn(\n 'All performance samples have numSlots equal to 0. Using fallback slot time.',\n )\n return fallbackSlotTime\n }\n\n // Calculate the average slot time from valid samples\n const averageSlotTime =\n validSamples.reduce((acc, sample) => {\n return acc + sample.samplePeriodSecs / sample.numSlots\n }, 0) / validSamples.length\n\n return averageSlotTime\n } catch (error) {\n console.error(\n `getAverageSlotTime failed: ${error}. Using fallback slot time.`,\n )\n return fallbackSlotTime // Return fallback slot time in case of error\n }\n}\n\nexport default getAverageSlotTime\n","import { format } from '@skeet-framework/utils'\nimport isLessThan1Day from './lessThan1Day'\nimport lessThan8Hour from './lessThan8Hour'\nimport lessThan1Hour from './lessThan1Hour'\nimport newEpoch from './newEpoch'\nimport initOrReadEpochFile from './initEpochFile'\nimport checkBalance from './checkBalance'\nimport { isValidatorActive } from './isValidatorActive'\nimport { getAllKeyPaths, SOLANA_TESTNET_RPC_URL } from '@/config/config'\n// import { sendDiscord } from '@/lib/sendDiscord'\nimport isVersionSame from './isVersionSame'\nimport { spawnSync } from 'child_process'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { getEpochInfoByRust } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nexport type EpochData = {\n epoch: number\n isLessThan1Hour: boolean\n isLessThan8Hours: boolean\n isLessThan1Day: boolean\n}\n\nexport const epochTimer = async (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const rpcUrl = isTestnet ? SOLANA_TESTNET_RPC_URL : config.RPC_URL\n const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss')\n console.log(`Checking Epoch at ${now}`)\n const getD1Epoch = await initOrReadEpochFile()\n const currentEpoch = getEpochInfoByRust(rpcUrl)\n // Check if Validator is running\n const { mainnetValidatorVoteKey, testnetValidatorVoteKey } = getAllKeyPaths()\n let voteAccountKey = isTestnet\n ? testnetValidatorVoteKey\n : mainnetValidatorVoteKey\n\n const isActive = await isValidatorActive(\n rpcUrl,\n getSolanaAddress(voteAccountKey),\n )\n // if (!isActive.isActive) {\n // await sendDiscord(\n // `⚠️ Validator is not active!\\nVoteAccount: ${isActive.pubkey}\\nReason: ${isActive.reason}\\nNetwork: ${config.NETWORK}\\nPlease check your validator node 👷‍♀️`,\n // )\n // }\n console.log(`Validator is active: ${isActive.isActive}`)\n // Check Validator Account's Balance\n await checkBalance(config)\n\n // Check if solv/Solana version update is required\n const isSolvVersionSame = await isVersionSame()\n if (!isSolvVersionSame && config.AUTO_UPDATE) {\n console.log(`Found new version of solv! Updating...`)\n spawnSync(`solv update && solv update --config && solv update --auto`, {\n stdio: 'inherit',\n shell: true,\n })\n return 'Node has been restarted!'\n }\n\n // New epoch has been updated\n if (getD1Epoch.epoch < currentEpoch.epoch) {\n await newEpoch(currentEpoch, config)\n return 'Epoch has been updated!'\n }\n\n // Get the total minutes until the next epoch\n const totalMinutes = currentEpoch.totalMinutes\n\n // Check conditions in sequence and stop if any condition is met\n const checks = [lessThan1Hour, lessThan8Hour, isLessThan1Day]\n for (const check of checks) {\n const result = await check(totalMinutes, getD1Epoch, currentEpoch, config)\n if (result) {\n break\n }\n }\n\n return 'Epoch has not been changed!'\n}\n\nexport default epochTimer\n","import { EPOCH_TIMER_FILE_PATH } from '@/config/config'\nimport { writeFile } from 'fs/promises'\nimport { EpochData } from './epochTimer'\n\nconst writeEpochDataToFile = async (epochData: EpochData) => {\n await writeFile(\n EPOCH_TIMER_FILE_PATH,\n JSON.stringify({ ...epochData }, null, 2),\n 'utf-8',\n )\n}\n\nexport default writeEpochDataToFile\n","import { EpochData } from './epochTimer'\nimport writeEpochDataToFile from './writeEpochDataToFile'\n// import alertMessage from './alertMessage'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\n\nconst isLessThan1Day = async (\n totalMinutes: number,\n epochData: EpochData,\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n if (\n totalMinutes < 24 * 60 &&\n totalMinutes >= 8 * 60 &&\n !epochData.isLessThan1Day\n ) {\n // Update the database and send a notification\n await writeEpochDataToFile({ ...epochData, isLessThan1Day: true })\n // await alertMessage(currentEpoch, '1 Day', config)\n }\n}\n\nexport default isLessThan1Day\n","import { EpochData } from './epochTimer'\nimport writeEpochDataToFile from './writeEpochDataToFile'\n// import alertMessage from './alertMessage'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\n\nconst lessThan8Hour = async (\n totalMinutes: number,\n epochData: EpochData,\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n if (\n totalMinutes < 8 * 60 &&\n totalMinutes >= 60 &&\n !epochData.isLessThan8Hours\n ) {\n // Update the database and send a notification\n await writeEpochDataToFile({ ...epochData, isLessThan8Hours: true })\n // await alertMessage(currentEpoch, '8 Hours', config)\n }\n}\n\nexport default lessThan8Hour\n","import { EpochData } from './epochTimer'\n// import { spawnSync } from 'child_process'\nimport writeEpochDataToFile from './writeEpochDataToFile'\n// import alertMessage from './alertMessage'\n// import chalk from 'chalk'\n// import randomSleep from './randomSleep'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\n// import { Network } from '@/config/enums'\n\nconst lessThan1Hour = async (\n totalMinutes: number,\n epochData: EpochData,\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n // const isMEV = config.IS_MEV_MODE\n // const isMainnet = config.NETWORK === Network.MAINNET\n if (totalMinutes < 60 && !epochData.isLessThan1Hour) {\n // Update the database and send a notification\n await writeEpochDataToFile({ ...epochData, isLessThan1Hour: true })\n // await alertMessage(currentEpoch, '1 Hour', config)\n\n // If MEV is enabled, run `solv harvest` command\n // if (isMEV && isMainnet) {\n // Random Sleep to avoid network congestion\n // const waitTime = await randomSleep(1, 100)\n // console.log(\n // chalk.white(\n // `⏳ Waiting for ${waitTime} seconds before running solv harvest...`,\n // ),\n // )\n // run `solv harvest` command\n // spawnSync('solv', ['harvest'], { stdio: 'inherit', shell: true })\n // }\n return true\n }\n return false\n}\n\nexport default lessThan1Hour\n","import { EpochData } from './epochTimer'\n// import { sendDiscord } from '@/lib/sendDiscord'\nimport writeEpochDataToFile from './writeEpochDataToFile'\nimport { getAllKeyPaths } from '@/config/config'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nconst newEpoch = async (\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const params: EpochData = {\n epoch: currentEpoch.epoch,\n isLessThan1Hour: false,\n isLessThan8Hours: false,\n isLessThan1Day: false,\n }\n const { mainnetValidatorKey, testnetValidatorKey } = getAllKeyPaths()\n const address = isTestnet\n ? getSolanaAddress(testnetValidatorKey)\n : getSolanaAddress(mainnetValidatorKey)\n await writeEpochDataToFile(params)\n console.log('Epoch has been updated!')\n\n const content = `===⏳ ${currentEpoch.epoch} ⏳===\nValidator: ${address}\nNetwork: ${config.NETWORK}\nCurrentEpoch: ${currentEpoch.epoch}\nEpoch has been updated!\nUntil Next Epoch: Approximately 2 days`\n // await sendDiscord(content)\n return 'Epoch has been updated!'\n}\n\nexport default newEpoch\n","import { EPOCH_TIMER_FILE_PATH } from '@/config/config'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { EpochData } from './epochTimer'\nimport { readFile, writeFile } from 'fs/promises'\nimport chalk from 'chalk'\nimport { homedir } from 'os'\n\nconst initOrReadEpochFile = async () => {\n const homeDir = homedir()\n const epochFilePath = homeDir.includes('/home/solv')\n ? EPOCH_TIMER_FILE_PATH\n : `./currentEpoch.json`\n if (await existsAsync(epochFilePath)) {\n return JSON.parse(await readFile(epochFilePath, 'utf-8')) as EpochData\n }\n const initialData: EpochData = {\n epoch: 0,\n isLessThan1Hour: false,\n isLessThan8Hours: false,\n isLessThan1Day: false,\n }\n await writeFile(epochFilePath, JSON.stringify(initialData, null, 2), 'utf-8')\n console.log(chalk.white('✔️ Initial epoch data has been created!'))\n return initialData\n}\n\nexport default initOrReadEpochFile\n","import getBalance, { KeyType } from '@/lib/solana/getBalance'\nimport { MINIMUM_VALIDATOR_BALANCE, getAllKeyPaths } from '@/config/config'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { sendDiscord } from '@/lib/sendDiscord'\nimport chalk from 'chalk'\nimport { SOLANA_TESTNET_RPC_URL } from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nconst checkBalance = async (config: DefaultConfigType) => {\n let rpcUrl = config.RPC_URL\n const isTestnet = config.NETWORK === Network.TESTNET\n if (isTestnet) {\n rpcUrl = SOLANA_TESTNET_RPC_URL\n }\n const balance = await getBalance(rpcUrl, KeyType.VALIDATOR, isTestnet)\n if (balance < MINIMUM_VALIDATOR_BALANCE) {\n const { mainnetValidatorKey, testnetValidatorKey } = getAllKeyPaths()\n const address = isTestnet\n ? getSolanaAddress(testnetValidatorKey)\n : getSolanaAddress(mainnetValidatorKey)\n const msg = `⚠️ Validator Account Balance is less than ${MINIMUM_VALIDATOR_BALANCE} SOL\\nPlease top up your Validator Account\\nAddress: ${address}`\n await sendDiscord(msg)\n return false\n }\n console.log(chalk.green('✔️ Validator Account Balance is sufficient'))\n return true\n}\nexport default checkBalance\n","async function getNpmLatestVersion(packageName = '@gabrielhicks/solv') {\n try {\n const url = `https://registry.npmjs.org/${packageName}`\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n const data = (await response.json()) as Record<string, any>\n const latestVersion = data['dist-tags'].latest\n return latestVersion as string\n } catch (error) {\n console.error(\n `Error fetching latest version for package ${packageName}:`,\n error,\n )\n return null\n }\n}\n\nexport default getNpmLatestVersion\n","import getNpmLatestVersion from './getNpmLatestVersion'\nimport getSolvVersion from './getSolvVersion'\n\nasync function isVersionSame() {\n const solvVersion = getSolvVersion()\n const latestVersion = await getNpmLatestVersion()\n if (!latestVersion) {\n throw new Error('Failed to get NPM API')\n }\n console.log('currentVersion:', solvVersion)\n console.log('latestVersion:', latestVersion)\n return solvVersion === latestVersion\n}\n\nexport default isVersionSame\n","import { spawnSync } from 'node:child_process'\n\nexport type EpochInfoCLIType = {\n epoch: number\n day: number\n hour: number\n min: number\n sec: number\n totalMinutes: number\n epochRemainingTime: string\n epochCompletedPercent: string\n}\n\nexport const getEpochInfoByRust = (rpcUrl: string) => {\n try {\n const cmd = `solana epoch-info --url '${rpcUrl}'`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n const epochInfo = stdout.toString()\n\n // 'Epoch Completed Time:' 行を探す\n const splitedLine = epochInfo.split('\\n')\n const epochCompletedTime = splitedLine.find((line) =>\n line.includes('Epoch Completed Time:'),\n )\n const epochCompletedPercent = splitedLine\n .find((line) => line.includes('Epoch Completed Percent:'))\n ?.replace('Epoch Completed Percent:', '')\n const epoch = Number(\n splitedLine\n .find((line) => line.includes('Epoch:'))\n ?.replace('Epoch:', ''),\n )\n\n if (!epochCompletedTime || !epochCompletedPercent || !epoch) {\n throw new Error('Epoch Completed Time not found')\n }\n\n // 'remaining' の時間部分を抽出\n const splitedEpochCompletedTime = epochCompletedTime.split('(')\n const remainingTime = splitedEpochCompletedTime[1].replace(\n ' remaining)',\n '',\n )\n console.log('remainingTime:', remainingTime)\n\n // 正規表現で day, hour, min, sec を抽出\n const timeRegex =\n /(?:(\\d+)day\\s*)?(?:(\\d+)h\\s*)?(?:(\\d+)m\\s*)?(?:(\\d+)s\\s*)?/\n\n const match = remainingTime.match(timeRegex)\n if (match) {\n const day = match[1] ? parseInt(match[1]) : 0\n const hour = match[2] ? parseInt(match[2]) : 0\n const min = match[3] ? parseInt(match[3]) : 0\n const sec = match[4] ? parseInt(match[4]) : 0\n\n // 分に変換\n const totalMinutes =\n day * 24 * 60 + hour * 60 + min + Math.floor(sec / 60)\n\n const res: EpochInfoCLIType = {\n epoch,\n day,\n hour,\n min,\n sec,\n totalMinutes,\n epochRemainingTime: remainingTime,\n epochCompletedPercent,\n }\n return res\n } else {\n throw new Error('Time information could not be parsed')\n }\n } catch (error) {\n throw new Error(`getEpochInfoByRust failed: ${error}`)\n }\n}\n","import { program } from '@/index'\nimport epochTimer from './epochTimer'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const epochTimerCommands = (config: DefaultConfigType) => {\n program\n .command('epochTimer')\n .description('Check Solana Epoch Timer')\n .action(async () => {\n await epochTimer(config)\n process.exit(0)\n })\n}\n","import { Command } from 'commander'\nimport inquirer from 'inquirer'\nimport { changeIdentityIncoming } from './changeIdentityIncoming'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport {\n MAINNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n} from '@/config/constants'\nimport { changeIdentityOutgoing } from './changeIdentityOutgoing'\nimport { checkSSHConnection } from '../scp/checkSSHConnection'\nimport chalk from 'chalk'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport { changeIdentityIncomingV1toV2 } from './changeIdentityIncomingV1toV2'\n\ntype SwitchType = 'Incoming' | 'Outgoing' | ''\nconst SWITCH_TYPES: SwitchType[] = ['Incoming', 'Outgoing']\n\ntype SwitchOptions = {\n switchType: SwitchType\n ip: string\n v2MigrateIncoming: boolean\n user: string\n unsafe: boolean\n}\n\nexport const switchCommand = async (\n program: Command,\n config: DefaultConfigType,\n) => {\n program\n .command('switch')\n .option('--ip <ip>', 'IP Address of the New Validator', '')\n .option('--switchType <switchType>', 'Switch Type', '')\n .option('--v2-migrate-incoming', 'Switch V1 to V2 Incoming', false)\n .option('--user <user>', 'SSH User', 'solv')\n\n .option('--unsafe', 'Switch without waiting for a restart window', false)\n .description('Switch Validator Identity with No Downtime')\n .action(async (options: SwitchOptions) => {\n try {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n const isSafe = options.unsafe === false;\n let keyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n\n if (isRPC) {\n keyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n let user = options.user\n const pubkey = getSolanaAddress(keyPath)\n let switchType = options.switchType\n let ip = options.ip\n if (switchType === '' || ip === '' || user === '') {\n const answer = await inquirer.prompt<{\n switchType: SwitchType\n ip: string\n user: string\n }>([\n {\n name: 'switchType',\n type: 'list',\n message: 'Which switch type do you want to perform?',\n choices: ['Incoming', 'Outgoing'],\n },\n {\n name: 'ip',\n type: 'input',\n message: 'What is the IP address of the new validator?',\n default() {\n return '1.1.1.1'\n },\n },\n {\n name: 'user',\n type: 'list',\n message: 'Which user would you want to SSH as?',\n choices: ['solv'],\n },\n ])\n switchType = answer.switchType\n ip = answer.ip\n user = answer.user\n }\n if (!SWITCH_TYPES.includes(switchType)) {\n console.log(\n chalk.yellow(\n '⚠️ Invalid Switch Type\\nYou can choose only Incoming or Outgoing',\n ),\n )\n return\n }\n\n const result = checkSSHConnection(ip, user)\n if (!result) {\n console.log('SSH Connection Failed')\n return\n }\n if (switchType === 'Incoming') {\n if (options.v2MigrateIncoming) {\n const confirm = await inquirer.prompt<{ confirm: boolean }>([\n {\n name: 'confirm',\n type: 'confirm',\n message:\n 'Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1.',\n },\n ])\n if (!confirm.confirm) {\n console.log(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.log(chalk.white('🟢 Migrating V1 to V2 Incoming...'))\n await changeIdentityIncomingV1toV2(ip, pubkey, config, user, isSafe)\n return\n }\n await changeIdentityIncoming(ip, pubkey, config, user, isSafe)\n } else {\n await changeIdentityOutgoing(ip, pubkey, config, user, isSafe)\n }\n process.exit(0)\n } catch (error: any) {\n if (error.message.includes('User force closed the prompt')) {\n console.error(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.error(chalk.red(`Switch Error: ${error.message}`))\n process.exit(0)\n }\n })\n}\n","import {\n IDENTITY_KEY,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n SOLV_HOME,\n TESTNET_VALIDATOR_KEY_PATH,\n UNSTAKED_KEY,\n} from '@/config/constants'\nimport { join } from 'path'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport checkValidatorKey from './checkValidatorKey'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport getSolanaCLIActive from '@/config/getSolanaCLIActive'\nimport getSolanaCLIAgave from '@/config/getSolanaCLIAgave'\nimport { getRemoteClientType } from './getRemoteClientType'\nimport { getLocalClientType } from './getLocalClientType'\n\nconst unstakedKeyPath = join(SOLV_HOME, UNSTAKED_KEY)\nconst identityKeyPath = join(SOLV_HOME, IDENTITY_KEY)\n\nexport const changeIdentityIncoming = async (\n ip: string,\n pubkey: string,\n config: DefaultConfigType,\n user: string,\n safe = true,\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n let validatorKeyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n if (isRPC) {\n validatorKeyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n // Auto-detect both local and remote client types\n const localClientResult = await getLocalClientType()\n const remoteClientResult = await getRemoteClientType(ip, user)\n \n const localClient = localClientResult.success ? localClientResult.client : 'agave'\n const remoteClient = remoteClientResult.success ? remoteClientResult.client : 'agave'\n \n console.log(chalk.green(`✅ Local client: ${localClient}, Remote client: ${remoteClient}`))\n\n const [localSolanaClient, localSolanaClientConfig] = getSolanaCLIActive(localClient)\n const [remoteSolanaClient, remoteSolanaClientConfig] = getSolanaCLIActive(remoteClient)\n const agaveSolanaClient = getSolanaCLIAgave()\n\n const isKeyOkay = checkValidatorKey(validatorKeyPath, ip, user)\n if (!isKeyOkay) {\n return\n }\n \n if (safe) {\n console.log(chalk.white('🟢 Waiting for restart window...'))\n const restartWindowCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${agaveSolanaClient} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`\n const result1 = spawnSync(restartWindowCmd, { shell: true, stdio: 'inherit' })\n if (result1.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ wait-for-restart-window Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${agaveSolanaClient} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,\n ),\n )\n return\n }\n }\n\n // Set the identity on the unstaked key (remote)\n console.log(chalk.white('🟢 Setting identity on the remote validator...'))\n const setIdentityCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${remoteSolanaClient} set-identity ${remoteSolanaClientConfig}${unstakedKeyPath}'`\n const result2 = spawnSync(setIdentityCmd, { shell: true, stdio: 'inherit' })\n if (result2.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${remoteSolanaClient} set-identity ${remoteSolanaClientConfig}${unstakedKeyPath}`,\n ),\n )\n return\n }\n\n // Change the Symlink to the unstaked keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const result3 = spawnSync(\n `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ln -sf ${unstakedKeyPath} ${identityKeyPath}'`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n if (result3.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ln -sf ${unstakedKeyPath} ${identityKeyPath}`,\n ),\n )\n return\n }\n\n // Download the tower file to the new validator\n console.log(\n chalk.white('🟢 Uploading the tower file to the new validator...'),\n )\n const result4 = spawnSync(\n `scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n { shell: true, stdio: 'inherit' },\n )\n if (result4.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Upload Tower File Failed. Please check your tower file\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n ),\n )\n return\n }\n\n // Set the identity on the local validator\n console.log(chalk.white('🟢 Setting identity on the local validator...'))\n const result5 = spawnSync(\n `${localSolanaClient} set-identity ${localSolanaClientConfig}--require-tower ${validatorKeyPath}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n if (result5.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n\\nFailed Cmd: ${localSolanaClient} set-identity ${localSolanaClientConfig}${validatorKeyPath}\\nln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n const result6 = spawnSync(`ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`, {\n shell: true,\n stdio: 'inherit',\n })\n\n if (result6.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n console.log(chalk.white('🟢 Identity changed successfully!'))\n await updateDefaultConfig({\n IS_DUMMY: false,\n })\n}\n","import { CommonSpawnOptions, spawnSync } from 'node:child_process'\n\nexport type ScpSSHResult = {\n status: number | null\n stdout: string\n stderr: string\n}\n\nconst scpSSH = (\n ip: string,\n cmd: string,\n user: string,\n stdio = 'pipe' as CommonSpawnOptions['stdio'],\n sshKeyPath = '~/.ssh/id_rsa',\n) => {\n let scpSSHResult: ScpSSHResult\n try {\n const result = spawnSync(\n `ssh -i ${sshKeyPath} -o StrictHostKeyChecking=no solv@${ip} -p 22 'cd ~ && source ~/.profile && ${cmd}'`,\n { shell: true, stdio },\n )\n if (result.status !== 0) {\n console.log(\n `⚠️ CMD Failed. Please check your SSH connection.\\n$ ssh solv@${ip}\\n\\nFailed Cmd: ${cmd}`,\n )\n scpSSHResult = {\n status: result.status,\n stdout: String(result.stdout),\n stderr: result.stderr.toString(),\n }\n return scpSSHResult\n }\n scpSSHResult = {\n status: result.status,\n stdout: result.stdout.toString(),\n stderr: result.stderr.toString(),\n }\n return scpSSHResult\n } catch (error) {\n console.log(`scpSSH Error: ${error}`)\n scpSSHResult = {\n status: null,\n stdout: '',\n stderr: String(error),\n }\n return scpSSHResult\n }\n}\n\nexport default scpSSH\n","import { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport scpSSH from '@/lib/scpSSH'\nimport chalk from 'chalk'\n\nconst checkValidatorKey = (\n validatorKeyPath: string,\n ip: string,\n user: string,\n) => {\n console.log(\n chalk.white('🔍 Checking If Destination Validator Key is the same...'),\n )\n const localValidatorIdentityAddress =\n getSolanaAddress(validatorKeyPath).trim()\n const destinationValidatorIdentityAddress = scpSSH(\n ip,\n `solana-keygen pubkey ${validatorKeyPath}`,\n user,\n )\n .stdout.toString()\n .trim()\n\n if (localValidatorIdentityAddress !== destinationValidatorIdentityAddress) {\n console.log(\n chalk.yellow(\n `⚠️ Destination Identity Key is different. \nPlease check your Validator\n$ ssh ${user}@${ip}\n\nLocal Identity Key: ${localValidatorIdentityAddress}\nDestination Identity Key: ${destinationValidatorIdentityAddress}`,\n ),\n )\n return false\n }\n return true\n}\n\nexport default checkValidatorKey\n","const AGAVE_CLI = 'agave-validator -l /mnt/ledger'\nconst FD_CLI = 'sudo fdctl'\nconst FC_CLI_CONFIG = '--config /home/solv/firedancer/config.toml '\n\nconst getSolanaCLIActive = (client: string) => {\n if(client === \"agave\") {\n return [AGAVE_CLI, '']\n } else {\n return [FD_CLI, FC_CLI_CONFIG]\n }\n}\nexport default getSolanaCLIActive\n","const AGAVE_CLI = 'agave-validator -l /mnt/ledger'\n\nconst getSolanaCLIAgave = () => {\n try {\n return AGAVE_CLI\n } catch (error) {\n console.error(error)\n return AGAVE_CLI\n }\n}\nexport default getSolanaCLIAgave\n","import scpSSH from '@/lib/scpSSH'\nimport { ValidatorType } from '@/config/enums'\nimport chalk from 'chalk'\n\nexport type RemoteConfigResult = {\n client: string\n validatorType: ValidatorType\n success: boolean\n error?: string\n}\n\nexport const getRemoteClientType = async (\n ip: string,\n user: string\n): Promise<RemoteConfigResult> => {\n try {\n console.log(chalk.white('🔍 Detecting client type from remote configuration...'))\n \n // Read the remote solv config file\n const configResult = scpSSH(\n ip,\n 'cat /home/solv/solv4.config.json',\n user,\n 'pipe'\n )\n\n if (configResult.status !== 0) {\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: 'Could not read remote configuration file'\n }\n }\n\n // Parse the config\n const remoteConfig = JSON.parse(configResult.stdout)\n const validatorType = remoteConfig.VALIDATOR_TYPE\n\n // Map validator type to client string\n let client: string\n switch (validatorType) {\n case ValidatorType.AGAVE:\n client = 'agave'\n break\n case ValidatorType.FRANKENDANCER:\n client = 'frankendancer'\n break\n case ValidatorType.JITO:\n client = 'agave' // Jito uses agave client\n break\n default:\n client = 'agave' // Default fallback\n }\n\n console.log(chalk.green(`✅ Detected remote client type: ${client} (${validatorType})`))\n \n return {\n client,\n validatorType,\n success: true\n }\n } catch (error) {\n console.log(chalk.yellow(`⚠️ Could not auto-detect client type: ${error}`))\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: String(error)\n }\n }\n} ","import { readFile } from 'fs/promises'\nimport { ValidatorType } from '@/config/enums'\nimport chalk from 'chalk'\nimport { existsSync } from 'fs'\n\nexport type LocalConfigResult = {\n client: string\n validatorType: ValidatorType\n success: boolean\n error?: string\n}\n\nexport const getLocalClientType = async (): Promise<LocalConfigResult> => {\n try {\n console.log(chalk.white('🔍 Detecting local client type from configuration...'))\n \n const configPath = '/home/solv/solv4.config.json'\n \n if (!existsSync(configPath)) {\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: 'Local configuration file not found'\n }\n }\n\n // Read the local solv config file\n const configContent = await readFile(configPath, 'utf-8')\n const localConfig = JSON.parse(configContent)\n const validatorType = localConfig.VALIDATOR_TYPE\n\n // Map validator type to client string\n let client: string\n switch (validatorType) {\n case ValidatorType.AGAVE:\n client = 'agave'\n break\n case ValidatorType.FRANKENDANCER:\n client = 'frankendancer'\n break\n case ValidatorType.JITO:\n client = 'agave' // Jito uses agave client\n break\n default:\n client = 'agave' // Default fallback\n }\n\n console.log(chalk.green(`✅ Detected local client type: ${client} (${validatorType})`))\n \n return {\n client,\n validatorType,\n success: true\n }\n } catch (error) {\n console.log(chalk.yellow(`⚠️ Could not auto-detect local client type: ${error}`))\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: String(error)\n }\n }\n} ","import {\n IDENTITY_KEY,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n SOLV_HOME,\n TESTNET_VALIDATOR_KEY_PATH,\n UNSTAKED_KEY,\n} from '@/config/constants'\nimport { join } from 'path'\nimport chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\nimport checkValidatorKey from './checkValidatorKey'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport getSolanaCLIActive from '@/config/getSolanaCLIActive'\nimport getSolanaCLIAgave from '@/config/getSolanaCLIAgave'\nimport { getRemoteClientType } from './getRemoteClientType'\nimport { getLocalClientType } from './getLocalClientType'\n\nconst unstakedKeyPath = join(SOLV_HOME, UNSTAKED_KEY)\nconst identityKeyPath = join(SOLV_HOME, IDENTITY_KEY)\nconst sshKeyPath = '~/.ssh/id_rsa'\n\nexport const changeIdentityOutgoing = async (\n ip: string,\n pubkey: string,\n config: DefaultConfigType,\n user: string,\n safe = true,\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n let validatorKeyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n if (isRPC) {\n validatorKeyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n // Auto-detect both local and remote client types\n const localClientResult = await getLocalClientType()\n const remoteClientResult = await getRemoteClientType(ip, user)\n \n const localClient = localClientResult.success ? localClientResult.client : 'agave'\n const remoteClient = remoteClientResult.success ? remoteClientResult.client : 'agave'\n \n console.log(chalk.green(`✅ Local client: ${localClient}, Remote client: ${remoteClient}`))\n\n const [localSolanaClient, localSolanaClientConfig] = getSolanaCLIActive(localClient)\n const [remoteSolanaClient, remoteSolanaClientConfig] = getSolanaCLIActive(remoteClient)\n const agaveSolanaClient = getSolanaCLIAgave()\n\n const isKeyOkay = checkValidatorKey(validatorKeyPath, ip, user)\n if (!isKeyOkay) {\n return\n }\n\n // Commands to run on the source validator (local) - SpawnSync\n const step1 = `${agaveSolanaClient} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`\n const step2 = `${localSolanaClient} set-identity ${localSolanaClientConfig}${unstakedKeyPath}`\n const step3 = `ln -sf ${unstakedKeyPath} ${identityKeyPath}`\n const step4 = `scp ${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${user}@${ip}:${LEDGER_PATH}`\n\n // Commands to run on the destination validator (remote) - scpSSH\n const step5 = `${remoteSolanaClient} set-identity ${remoteSolanaClientConfig}--require-tower ${validatorKeyPath}`\n const step6 = `ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`\n\n if (safe) {\n console.log(chalk.white('🟢 Waiting for restart window...'))\n const result1 = spawnSync(step1, { shell: true, stdio: 'inherit' })\n if (result1.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ wait-for-restart-window Failed. Please check your Validator\\n\\nFailed Cmd: ${step1}`,\n ),\n )\n return\n }\n }\n\n // Set the identity to the unstaked key\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const result2 = spawnSync(step2, { shell: true, stdio: 'inherit' })\n if (result2.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ set-identity Failed. Please check your Validator\\n\\nFailed Cmd: ${step2}`,\n ),\n )\n return\n }\n\n // Change the Symlink to the unstaked keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const result3 = spawnSync(step3, { shell: true, stdio: 'inherit' })\n if (result3.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ${step3}`,\n ),\n )\n return\n }\n\n // Upload the tower file to the new validator\n console.log(\n chalk.white('🟢 Uploading the tower file to the new validator...'),\n )\n const result4 = spawnSync(step4, { shell: true, stdio: 'inherit' })\n if (result4.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Upload Tower File Failed. Please check your Validator\\n\\nFailed Cmd: ${step4}`,\n ),\n )\n return\n }\n\n // Set the identity on the identity key\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const cmd5 = `ssh -i ${sshKeyPath} -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${step5}'`\n const result5 = spawnSync(cmd5, { shell: true, stdio: 'inherit' })\n if (result5.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ set-identity Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${step5}`,\n ),\n )\n //return\n }\n\n // Change the Symlink to the identity keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const cmd6 = `ssh -i ${sshKeyPath} -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${step6}'`\n const result6 = spawnSync(cmd6, { shell: true, stdio: 'inherit' })\n if (result6.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ${step6}`,\n ),\n )\n return\n }\n console.log(chalk.white('🟢 Identity changed successfully!'))\n await updateDefaultConfig({\n IS_DUMMY: true,\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport function checkSSHConnection(ip: string, user: string) {\n const cmd = `ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${ip} exit`\n const result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n\n return result.status === 0\n}\n","import {\n AGAVE_VALIDATOR,\n IDENTITY_KEY,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n SOLANA_VALIDATOR,\n SOLV_HOME,\n TESTNET_VALIDATOR_KEY_PATH,\n UNSTAKED_KEY,\n} from '@/config/constants'\nimport { join } from 'path'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport checkValidatorKey from './checkValidatorKey'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\n\nconst unstakedKeyPath = join(SOLV_HOME, UNSTAKED_KEY)\nconst identityKeyPath = join(SOLV_HOME, IDENTITY_KEY)\n\nexport const changeIdentityIncomingV1toV2 = async (\n ip: string,\n pubkey: string,\n config: DefaultConfigType,\n user: string,\n safe = true\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n let validatorKeyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n if (isRPC) {\n validatorKeyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n const isKeyOkay = checkValidatorKey(validatorKeyPath, ip, user)\n if (!isKeyOkay) {\n return\n }\n\n // old version of solana client\n const solanaClient = SOLANA_VALIDATOR\n // new version of solana client\n const agaveClient = AGAVE_VALIDATOR\n\n if (safe) {\n console.log(chalk.white('🟢 Waiting for restart window...'))\n const restartWindowCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${solanaClient} -l ${LEDGER_PATH} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`\n const result1 = spawnSync(restartWindowCmd, { shell: true, stdio: 'inherit' })\n if (result1.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ wait-for-restart-window Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${solanaClient} -l ${LEDGER_PATH} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,\n ),\n )\n return\n }\n } \n\n // Set the identity on the unstaked key\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const setIdentityCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${solanaClient} -l ${LEDGER_PATH} set-identity ${unstakedKeyPath}'`\n const result2 = spawnSync(setIdentityCmd, { shell: true, stdio: 'inherit' })\n if (result2.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${solanaClient} -l ${LEDGER_PATH} set-identity ${unstakedKeyPath}`,\n ),\n )\n return\n }\n\n // Change the Symlink to the unstaked keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const result3 = spawnSync(\n `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ln -sf ${unstakedKeyPath} ${identityKeyPath}'`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n if (result3.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ln -sf ${unstakedKeyPath} ${identityKeyPath}`,\n ),\n )\n return\n }\n\n // Download the tower file to the new validator\n console.log(\n chalk.white('🟢 Uploading the tower file to the new validator...'),\n )\n const result4 = spawnSync(\n `scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n { shell: true, stdio: 'inherit' },\n )\n if (result4.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Upload Tower File Failed. Please check your tower file\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n ),\n )\n return\n }\n\n // Set the identity on the new validator\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const result5 = spawnSync(\n `${agaveClient} -l ${LEDGER_PATH} set-identity --require-tower ${validatorKeyPath}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n if (result5.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n\\nFailed Cmd: ${agaveClient} -l ${LEDGER_PATH} set-identity ${validatorKeyPath}\\nln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n const result6 = spawnSync(`ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`, {\n shell: true,\n stdio: 'inherit',\n })\n\n if (result6.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n console.log(chalk.white('🟢 Identity changed successfully!'))\n await updateDefaultConfig({\n IS_DUMMY: false,\n })\n}\n","import { LEDGER_PATH, SNAPSHOTS_PATH } from '@/config/constants'\nimport { spawnSync } from 'node:child_process'\n\nconst createSnapshot = (slot = '306450862', ledgerPath = LEDGER_PATH, snapshotPath = SNAPSHOTS_PATH) => {\n try {\n const cmd = `agave-ledger-tool --ledger ${ledgerPath} create-snapshot \\\n--incremental \\\n--snapshot-archive-path ${snapshotPath} \\\n--hard-fork ${slot} \\\n-- ${slot} ${ledgerPath}`\n console.log('Parameters to createSnapshot:', slot, ledgerPath, snapshotPath)\n console.log('Command:', cmd)\n const result = spawnSync(cmd, {\n shell: true,\n stdio: 'pipe',\n cwd: ledgerPath,\n })\n if (result.status !== 0) {\n throw new Error(`createSnapshot: ${result.error}`)\n }\n } catch (error) {\n throw new Error(`createSnapshot: ${error}`)\n }\n}\nexport default createSnapshot\n","import inquirer from 'inquirer'\nimport dotenv from 'dotenv'\nimport {\n JUPITER_ENDPOINT,\n SOL_TOKEN_MINT,\n SOLV_SWAP,\n SWAP_TOKENS,\n USDC_TOKEN_MINT,\n} from '@/config/constants'\nimport chalk from 'chalk'\nimport { TokenInfo } from '@/config/tokenInfo'\nimport { swap } from './swap'\nimport { Command } from 'commander'\nimport { ELSOL_MINT_ADDRESS } from '@/config/config'\nimport { DefaultConfigType } from '@/config/types'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport rpcLog from '@/utils/rpcLog'\ndotenv.config()\n\nexport const swapCommand = async (\n program: Command,\n config: DefaultConfigType,\n) => {\n program\n .command('swap')\n .description('Swap tokens')\n .option('-i, --input <input>', 'Input token mint', '')\n .option('-o, --output <output>', 'Output token mint', '')\n .option('-a, --amount <amount>', 'Input amount in lamports', '0')\n .option('-s, --skip-confirm', 'Skip confirmation', false)\n .option('-c, --init-config', 'Initialize config', false)\n .action(\n async (options: {\n input: string\n output: string\n amount: number\n skipConfirm: boolean\n initConfig: boolean\n }) => {\n try {\n await swapCmd(\n config.RPC_URL,\n config.KEYPAIR_PATH,\n config.API_KEY,\n options.input,\n options.output,\n Number(options.amount),\n !options.skipConfirm,\n options.initConfig,\n )\n } catch (error: any) {\n if (error.message.includes('User force closed the prompt')) {\n console.error(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.error(chalk.red(`Swap Error: ${error.message}`))\n process.exit(0)\n }\n },\n )\n}\n\nconst swapCmd = async (\n solanaRpcUrl: string,\n keyfilePath: string,\n jupiterApiKey: string,\n inputMint = '',\n outputMint = '',\n inputAmountLamport = 0,\n isNeedConfirm = true,\n initConfig = false,\n) => {\n console.log(chalk.white('Solana RPC URL:', solanaRpcUrl))\n console.log(chalk.white('KeyfilePath:', keyfilePath))\n if (!keyfilePath || keyfilePath === '' || initConfig) {\n await askForConfig()\n }\n const jupiterEndpoint = JUPITER_ENDPOINT\n let inputTokenChoice = [...SWAP_TOKENS, 'Other']\n let inputTokenAdress = inputMint\n let inputTokenSymbol = '' as keyof typeof TokenInfo\n let outputTokenAdress = outputMint\n let inputAmount = inputAmountLamport\n // If inputTokenAdress is not provided, prompt user to select input mint\n if (inputTokenAdress === '') {\n const inputToken = await inquirer.prompt([\n {\n type: 'list',\n name: 'name',\n message: 'Select input mint',\n choices: inputTokenChoice,\n default: SOL_TOKEN_MINT,\n },\n ])\n if (inputToken.name === 'Other') {\n const inputTokenAddress = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Enter input mint address',\n default: USDC_TOKEN_MINT,\n },\n ])\n inputTokenAdress = inputTokenAddress.address\n } else {\n inputTokenSymbol = inputToken.name\n inputTokenAdress = TokenInfo[inputTokenSymbol].tokenMint\n }\n }\n\n // If outputTokenAdress is not provided, prompt user to select output mint\n if (outputTokenAdress === '') {\n inputTokenChoice = inputTokenChoice.filter(\n (item) => item !== inputTokenSymbol,\n )\n const outputToken = await inquirer.prompt([\n {\n type: 'list',\n name: 'name',\n message: 'Select output mint',\n choices: inputTokenChoice,\n },\n ])\n\n if (outputToken.name === 'Other') {\n const outputTokenAddress = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Enter output mint address',\n default: ELSOL_MINT_ADDRESS,\n },\n ])\n outputTokenAdress = outputTokenAddress.address\n } else {\n const tokenName = outputToken.name as keyof typeof TokenInfo\n outputTokenAdress = TokenInfo[tokenName].tokenMint\n }\n const tokenName = outputToken.name as keyof typeof TokenInfo\n outputTokenAdress = TokenInfo[tokenName].tokenMint\n }\n\n // If inputAmount is not provided, prompt user to enter input amount\n if (inputAmount === 0) {\n const inputAmountPrompt = await inquirer.prompt([\n {\n type: 'input',\n name: 'amount',\n message: 'Enter input amount in LAMPORTS. e.g. 0.01 SOL',\n default: '10000000',\n },\n ])\n inputAmount = Number(inputAmountPrompt.amount)\n }\n\n const apiKey =\n !jupiterApiKey || jupiterApiKey === '' ? SOLV_SWAP : jupiterApiKey\n const txid = await swap(\n solanaRpcUrl,\n jupiterEndpoint,\n apiKey,\n keyfilePath,\n inputTokenAdress,\n outputTokenAdress,\n inputAmount,\n isNeedConfirm,\n )\n if (!txid) {\n process.exit(0)\n }\n console.log(chalk.green('✔︎ Sent Tx Successfully!'))\n console.log(chalk.white(`Check Your TX 👉: https://solscan.io/tx/${txid}`))\n}\n\nexport default swapCmd\n\nexport type SwapConfig = {\n RPC_URL: string\n KEYPAIR_PATH: string\n API_KEY: string\n}\n\nconst askForConfig = async () => {\n const config = await inquirer.prompt<SwapConfig>([\n {\n type: 'input',\n name: 'RPC_URL',\n message: 'Enter Solana RPC URL',\n default: 'https://api.mainnet-beta.solana.com',\n },\n {\n type: 'input',\n name: 'KEYPAIR_PATH',\n message: 'Enter Keypair Path',\n default: '/home/solv/mainnet-validator-keypair.json',\n },\n {\n type: 'input',\n name: 'API_KEY',\n message: 'Enter Jupiter API Key(Optional)',\n default: '',\n },\n ])\n await updateDefaultConfig(config)\n console.log(chalk.green('✔︎ Config Updated Successfully!\\n'))\n rpcLog()\n}\n","import { ELSOL_TOKEN_MINT, SOL_TOKEN_MINT, USDC_TOKEN_MINT } from './constants'\n\nexport const TokenInfo = {\n SOL: {\n tokenMint: 'So11111111111111111111111111111111111111112',\n associationAccount: '4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra',\n decimal: 9,\n },\n USDC: {\n tokenMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n associationAccount: 'J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj',\n decimal: 6,\n },\n elSOL: {\n tokenMint: ELSOL_TOKEN_MINT,\n associationAccount: '',\n decimal: 9,\n },\n JitoSOL: {\n tokenMint: 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn',\n associationAccount: 'HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a',\n decimal: 9,\n },\n mSOL: {\n tokenMint: 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So',\n associationAccount: '8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9',\n decimal: 9,\n },\n bSOL: {\n tokenMint: 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1',\n associationAccount: '782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH',\n decimal: 9,\n },\n EPCT: {\n tokenMint: 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP',\n associationAccount: 'BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB',\n decimal: 6,\n },\n JUP: {\n tokenMint: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN',\n associationAccount: '212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg',\n decimal: 6,\n },\n BONK: {\n tokenMint: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263',\n associationAccount: '61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U',\n decimal: 5,\n },\n JTO: {\n tokenMint: 'jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL',\n associationAccount: '2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo',\n decimal: 9,\n },\n}\n\nexport const TokenInfoByMint = {\n So11111111111111111111111111111111111111112: {\n symbol: 'SOL',\n tokenMint: SOL_TOKEN_MINT,\n associationAccount: '4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra',\n decimal: 9,\n },\n EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: {\n symbol: 'USDC',\n tokenMint: USDC_TOKEN_MINT,\n associationAccount: 'J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj',\n decimal: 6,\n },\n ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC: {\n symbol: 'elSOL',\n tokenMint: ELSOL_TOKEN_MINT,\n associationAccount: '',\n decimal: 9,\n },\n J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn: {\n symbol: 'jitoSOL',\n tokenMint: 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn',\n associationAccount: 'HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a',\n decimal: 9,\n },\n mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So: {\n symbol: 'mSOL',\n tokenMint: 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So',\n associationAccount: '8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9',\n decimal: 9,\n },\n bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1: {\n symbol: 'bSOL',\n tokenMint: 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1',\n associationAccount: '782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH',\n decimal: 9,\n },\n CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP: {\n symbol: 'EPCT',\n tokenMint: 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP',\n associationAccount: 'BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB',\n decimal: 6,\n },\n JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN: {\n symbol: 'JUP',\n tokenMint: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN',\n associationAccount: '212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg',\n decimal: 6,\n },\n DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263: {\n symbol: 'BONK',\n tokenMint: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263',\n associationAccount: '61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U',\n decimal: 5,\n },\n jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL: {\n symbol: 'JTO',\n tokenMint: 'jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL',\n associationAccount: '2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo',\n decimal: 9,\n },\n}\n","import { readFile } from 'fs/promises'\nimport { Connection, Keypair, VersionedTransaction } from '@solana/web3.js'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport dotenv from 'dotenv'\nimport { TokenInfoByMint } from '@/config/tokenInfo'\nimport getJupiterQuote from './getJupiterQuote'\nimport postJupiterSwap from './postJupiterSwap'\nimport { WEB_VALIDATORS_SOLUTIONS } from '@/config/constants'\ndotenv.config()\n\nexport const swap = async (\n solanaRpcUrl: string,\n jupiterEndpoint: string,\n JupiterApiKey: string,\n keyfilePath: string,\n inputMint: string,\n outputMint: string,\n inputAmountLamport: number,\n isNeedConfirm: boolean = true,\n) => {\n const connection = new Connection(solanaRpcUrl, 'confirmed')\n const quoteResponse = await getJupiterQuote(\n jupiterEndpoint,\n JupiterApiKey,\n inputMint,\n outputMint,\n inputAmountLamport,\n )\n if (typeof quoteResponse === 'string') {\n if (quoteResponse.includes('Unauthorized')) {\n console.error(\n chalk.yellow('⚠️ Invalid API key, please check your API key ⚠️\\n'),\n )\n console.log(chalk.white('Get Your API key 👇'))\n console.log(chalk.white(WEB_VALIDATORS_SOLUTIONS + '\\n'))\n process.exit(0)\n }\n const msg = `${chalk.yellow('⚠️ Too many requests, please try again later ⚠️')}\n\nYou can upgrade your API key to increase your rate limits.\nGet Your API key 👇\nValidators Solutions: ${WEB_VALIDATORS_SOLUTIONS}\n`\n console.error(chalk.white(msg))\n process.exit(0)\n }\n const inputTokneInfo =\n TokenInfoByMint[inputMint as keyof typeof TokenInfoByMint]\n const outputTokenInfo =\n TokenInfoByMint[outputMint as keyof typeof TokenInfoByMint]\n const log = `🔄 Swap Quote 🔄\n\n- 🏦 Input Token: ${inputTokneInfo.symbol} (${inputMint})\n- 💰 Input Amount: ${inputAmountLamport / Math.pow(10, inputTokneInfo.decimal)} ${inputTokneInfo.symbol}\n\n- 🏦 Output Token: ${outputTokenInfo.symbol} (${outputMint})\n- 💰 Output Amount: ${Number(quoteResponse?.outAmount) / Math.pow(10, outputTokenInfo.decimal)} ${outputTokenInfo.symbol}\n\n※ This quote is based on the current market rate and may change before the swap is completed.\n`\n console.log(chalk.white(log))\n console.log(\n chalk.gray(`You can also swap using the following command: \n$ solv swap --input ${inputMint} --output ${outputMint} --amount ${inputAmountLamport} --skip-confirm\n`),\n )\n let confirm = false\n if (isNeedConfirm) {\n const answer = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Do you want to proceed with the swap?',\n default: false,\n },\n ])\n confirm = answer.confirm\n } else {\n console.log(chalk.cyan('Skipping confirmation...'))\n confirm = true\n }\n if (!confirm) {\n console.log(chalk.yellow('⚠️ Swap cancelled'))\n process.exit(0)\n }\n\n if (!quoteResponse) {\n process.exit(0)\n }\n\n const fromWalletKey = JSON.parse(\n await readFile(keyfilePath, 'utf8'),\n ) as number[]\n const fromWallet = Keypair.fromSecretKey(\n new Uint8Array(Array.from(fromWalletKey)),\n )\n\n const swapResponse = await postJupiterSwap(\n jupiterEndpoint,\n JupiterApiKey,\n quoteResponse,\n fromWallet.publicKey.toString(),\n )\n if (typeof swapResponse === 'string') {\n if (swapResponse.includes('Unauthorized')) {\n console.error(\n chalk.yellow('⚠️ Invalid API key, please check your API key ⚠️\\n'),\n )\n console.log(chalk.white('Get Your API key 👇'))\n console.log(chalk.white(WEB_VALIDATORS_SOLUTIONS + '\\n'))\n process.exit(0)\n }\n const msg = `${chalk.yellow('⚠️ Too many requests, please try again later ⚠️')}\n\nYou can upgrade your API key to increase your rate limits.\nGet Your API key 👇\nValidators Solutions: ${WEB_VALIDATORS_SOLUTIONS}\n`\n console.error(chalk.white(msg))\n process.exit(0)\n }\n\n const swapTransactionBuf = Buffer.from(\n swapResponse.swapTransaction as string,\n 'base64',\n )\n let transaction = VersionedTransaction.deserialize(swapTransactionBuf)\n // Sign transaction\n transaction.sign([fromWallet])\n const rawTransaction = transaction.serialize()\n const txid = await connection.sendRawTransaction(rawTransaction, {\n skipPreflight: true,\n maxRetries: 2,\n })\n const blockhash = transaction.message.recentBlockhash\n console.log(`Swapping...\\nTransaction ID: ${txid}`)\n await connection.confirmTransaction(\n {\n blockhash,\n lastValidBlockHeight: swapResponse.lastValidBlockHeight,\n signature: txid,\n },\n 'confirmed',\n )\n return txid\n}\n","import { QuoteResponse } from '@jup-ag/api'\n\nconst getJupiterQuote = async (\n jupiterEndpoint: string,\n apiKey: string,\n inputMint: string,\n outputMint: string,\n inputAmountLamport: number,\n) => {\n try {\n const url = `${jupiterEndpoint}/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${inputAmountLamport}`\n const result = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n Authorization: `Bearer ${apiKey}`,\n },\n })\n if (result.status === 429) {\n const error = 'Too many requests, please try again later'\n return error\n }\n if (result.status === 401) {\n const error = 'Unauthorized, please check your API key'\n return error\n }\n\n const json = (await result.json()) as QuoteResponse\n return json\n } catch (error) {\n throw new Error(`Error getJupiterQuote: ${error}`)\n }\n}\n\nexport default getJupiterQuote\n","import { AssociationAccount } from '@/config/constants'\nimport { QuoteResponse, SwapPostRequest, SwapResponse } from '@jup-ag/api'\n\nconst postJupiterSwap = async (\n jupiterEndpoint: string,\n jupiterApiKey: string,\n quoteResponse: QuoteResponse,\n fromWalletPubkey: string,\n) => {\n try {\n const outputMint = quoteResponse.outputMint\n let swapBody: SwapPostRequest\n const associationAccount =\n AssociationAccount[outputMint as keyof typeof AssociationAccount]\n\n if (associationAccount) {\n swapBody = {\n swapRequest: {\n quoteResponse,\n userPublicKey: fromWalletPubkey,\n feeAccount: associationAccount,\n dynamicComputeUnitLimit: true,\n prioritizationFeeLamports: 'auto',\n dynamicSlippage: { maxBps: 500 },\n },\n }\n } else {\n swapBody = {\n swapRequest: {\n quoteResponse,\n userPublicKey: fromWalletPubkey,\n dynamicComputeUnitLimit: true,\n prioritizationFeeLamports: 'auto',\n dynamicSlippage: { maxBps: 500 },\n },\n }\n }\n const url = `${jupiterEndpoint}/swap`\n const result = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': jupiterApiKey,\n Authorization: `Bearer ${jupiterApiKey}`,\n },\n body: JSON.stringify(swapBody.swapRequest),\n })\n if (result.status === 429) {\n const error = 'Too many requests, please try again later'\n return error\n }\n const json = (await result.json()) as SwapResponse\n return json\n } catch (error) {\n throw new Error(`Error postJupiterSwap: ${error}`)\n }\n}\n\nexport default postJupiterSwap\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterStatus = () => {\n const cmd = `sudo systemctl status jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterStart = () => {\n const cmd = `sudo systemctl start jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterStop = () => {\n const cmd = `sudo systemctl stop jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterRestart = () => {\n const cmd = `sudo systemctl restart jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterLog = (error = false) => {\n const cmd = error\n ? `journalctl -u jupiter-api.service -xef | grep ERROR`\n : `journalctl -u jupiter-api.service -xef`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterEnable = () => {\n const cmd = `sudo systemctl enable jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport { jupiterStatus } from '@/cli/jupiter/jupiterStatus'\nimport { jupiterStart } from '@/cli/jupiter/jupiterStart'\nimport { jupiterStop } from '@/cli/jupiter/jupiterStop'\nimport { jupiterRestart } from '@/cli/jupiter/jupiterRestart'\nimport { jupiterLog } from '@/cli/jupiter/jupiterLog'\nimport { jupiterEnable } from '@/cli/jupiter/jupiterEnable'\n\nexport const jupiterCommands = () => {\n const jupiter = program.command('jupiter').description('Jupiter API Commands')\n\n jupiter\n .command('status')\n .description('Show Jupiter Status')\n .action(() => {\n jupiterStatus()\n })\n\n jupiter\n .command('start')\n .description('Start Jupiter')\n .action(() => {\n jupiterStart()\n })\n\n jupiter\n .command('stop')\n .description('Stop Jupiter')\n .action(() => {\n jupiterStop()\n })\n\n jupiter\n .command('log')\n .option('-e, --error', 'Show Error Logs', false)\n .description('Show Jupiter Logs')\n .action((options: { error: boolean }) => {\n jupiterLog(options.error)\n process.exit(0)\n })\n\n jupiter\n .command('restart')\n .description('Restart Jupiter')\n .action(() => {\n jupiterRestart()\n })\n\n jupiter\n .command('enable')\n .description('Enable Jupiter')\n .action(() => {\n jupiterEnable()\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nconst getSolanaVersion = (): string => {\n const { stdout } = spawnSync('solana --version', { shell: true })\n const version = stdout ? String(stdout) : 'Unknown'\n return version.trim()\n}\n\nexport default getSolanaVersion\n"],"mappings":"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JF,YAAa,uBACf,EACAG,OAAQ,CACNH,YAAa,8BACf,EACAI,QAAS,CACPJ,YAAa,0BACf,EACAK,OAAQ,CACNL,YAAa,iCACf,EACAM,IAAK,CACHN,YAAa,2BACf,EACAO,IAAK,CACHP,YAAa,2BACf,EACAQ,QAAS,CACPR,YAAa,0BACf,EACAS,QAAS,CACPT,YAAa,0BACf,EACAU,OAAQ,CACNV,YAAa,8BACf,EACAW,QAAS,CACPX,YAAa,+BACf,EACAY,MAAO,CACLZ,YAAa,uBACf,EACAa,QAAS,CACPb,YAAa,SACf,EACAc,MAAO,CACLd,YAAa,wBACf,EACAe,IAAK,CACHf,YAAa,2CACf,EACAgB,KAAM,CACJhB,YAAa,oBACf,EACAiB,MAAO,CACLjB,YAAa,wBACf,EACAkB,MAAO,CACLlB,YAAa,oBACf,EACAmB,KAAM,CACJnB,YAAa,mBACf,EACAoB,KAAM,CACJpB,YAAa,iBACf,CACF,EAEAqB,GAAevB,GClEf,IAAMwB,GAAY,CAChBC,OAAQ,CACNC,YAAa,qBACf,EACAC,MAAO,CACLD,YAAa,wBACf,EACAE,KAAM,CACJF,YAAa,uBACf,EACAG,OAAQ,CACNH,YAAa,8BACf,EACAI,QAAS,CACPJ,YAAa,0BACf,EACAK,OAAQ,CACNL,YAAa,iCACf,EACAM,IAAK,CACHN,YAAa,2BACf,EACAO,IAAK,CACHP,YAAa,2BACf,EACAQ,QAAS,CACPR,YAAa,0BACf,EACAS,QAAS,CACPT,YAAa,0BACf,EACAU,OAAQ,CACNV,YAAa,8BACf,EACAW,QAAS,CACPX,YAAa,+BACf,EACAY,MAAO,CACLZ,YAAa,uBACf,EACAa,QAAS,CACPb,YAAa,SACf,EACAc,MAAO,CACLd,YAAa,wBACf,EACAe,IAAK,CACHf,YAAa,2CACf,EACAgB,KAAM,CACJhB,YAAa,oBACf,EACAiB,MAAO,CACLjB,YAAa,wBACf,EACAkB,MAAO,CACLlB,YAAa,oBACf,EACAmB,KAAM,CACJnB,YAAa,mBACf,EACAoB,KAAM,CACJpB,YAAa,iBACf,CACF,EAEAqB,GAAevB,GChER,IAAMwB,GAAyB,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","names":["Command","version","package_default","version","VERSION","packageJson","version","WEB_VALIDATORS_SOLUTIONS","SOLV4_CONFIG_FILE","IDENTITY_KEY","UNSTAKED_KEY","RELAYER_KEY","MAINNET_VALIDATOR_KEY","MAINNET_VALIDATOR_VOTE_KEY","MAINNET_VALITATOR_AUTHORITY_KEY","TESTNET_VALIDATOR_KEY","TESTNET_VALIDATOR_VOTE_KEY","TESTNET_VALITATOR_AUTHORITY_KEY","SOLV_HOME","IDENTITY_KEY_PATH","UNSTAKED_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALITATOR_AUTHORITY_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALITATOR_AUTHORITY_KEY_PATH","LOG_PATH","STARTUP_SCRIPT","LEDGER_PATH","ACCOUNTS_PATH","SNAPSHOTS_PATH","SOLANA_VALIDATOR","AGAVE_VALIDATOR","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","MAX_RETRIES","SOLANA_TESTNET_RPC_URL","SOLANA_MAINNET_RPC_URL","VS_UPLOAD_ENDPOINT","JUPITER_ENDPOINT","SWAP_TOKEN","SWAP_TOKENS","Object","values","SOL_TOKEN_MINT","USDC_TOKEN_MINT","ELSOL_TOKEN_MINT","SOLV_SWAP","AssociationAccount","So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn","mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So","bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1","CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP","JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN","DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL","spawnSync","spawnSync","installAgave","__name","version","mod","spawnSync","shell","stdio","installAgave_default","AGAVE_CLI","getSolanaCLI","__name","error","console","getSolanaCLI_default","updateVersion","__name","version","mod","installAgave","monitorUpdate","maxDelinquentStake","noMonitor","minIdleTime","solanaValidatorClient","getSolanaCLI","cmd","LEDGER_PATH","spawnSync","shell","stdio","chalk","LANGS","DISK_TYPES","MOUNT_TYPES","NETWORK_TYPES","NODE_TYPES","SOLANA_CLIENTS","JITO_TYPES","FIREDANCER_TYPES","SOLV_TYPES","MAINNET_TYPES","NODE_RESTART_REQUIRED_MAINNET","NODE_RESTART_REQUIRED_TESTNET","FD_RESTART_REQUIRED_MAINNET","FD_RESTART_REQUIRED_TESTNET","CONFIG","ID","LANG","LANGS","EN","USERNAME","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","NODE_VERSION","TESTNET_DELINQUENT_STAKE","MAINNET_DELINQUENT_STAKE","COMMISSION","SOLANA_NETWORK","SOLV_TYPE","DISK_TYPES","IS_SETUP","LANG_SETUP","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","IS_CLIENT","VALIDATOR_IPS","MAINNET_TYPE","LEDGER_PATH","STAKE_ACCOUNT","HARVEST_ACCOUNT","IS_MEV_MODE","RPC_URL","KEYPAIR_PATH","DISCORD_WEBHOOK_URL","AUTO_UPDATE","AUTO_RESTART","ACCOUNTS_PATH","SNAPSHOTS_PATH","MOD","HOME_PATHS","ROOT","AUTHORIZED_KEYS","MT_PATHS","ACCOUNTS","LEDGER","SNAPSHOTS","FILES","LOG","STARTUP_SCRIPT","JITO_CONFIG","SERVICE_PATHS","SOL_SERVICE","SOL_LOGROTATE","FRANKENDANCER_LOGROTATE","SOL_SYSTEM_CONFIG21","SOL_NOFILES_CONF","SOL_SYSTEM_CONF","SOLANA_PATH","KEYPAIRS","MAINNET_VALIDATOR_KEY","MAINNET_VALIDATOR_VOTE_KEY","MAINNET_VALITATOR_AUTHORITY_KEY","TESTNET_VALIDATOR_KEY","TESTNET_VALIDATOR_VOTE_KEY","TESTNET_VALITATOR_AUTHORITY_KEY","getAllKeyPaths","__name","path","rootDir","mainnetValidatorKey","mainnetValidatorVoteKey","mainnetValidatorAuthorityKey","testnetValidatorKey","testnetValidatorVoteKey","testnetValidatorAuthorityKey","startupScriptPaths","isTest","identity","voteAccount","log","accounts","ledger","snapshots","scriptPath","SOLV_STAKE_POOL_ADDRESS","SOLV_ELSOL_ACCOUNT_ADDRESS","SOLV_POOL_MANAGER_ADDRESS","ELSOL_DECIMALS","ELSOL_MINT_ADDRESS","SOL_MINT_ADDRESS","USDC_MINT_ADDRESS","EPCT_MINT_ADDRESS","TOKEN_MINT_ADDRESS","JUP_URL","DECIMALS","EPOCH_TIMER_FILE_PATH","MINIMUM_VALIDATOR_BALANCE","SOLANA_TESTNET_RPC_URL","spawnSync","updateSolv","__name","spawnSync","shell","stdio","nodeVersion","CONFIG","NODE_VERSION","JITO_CONFIG","version","tag","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","JITO_REGIONS","TESTNET","Dallas","BLOCK_ENGINE_URL","RELAYER_URL","SHRED_RECEIVER_ADDR","NewYork","MAINNET","Amsterdam","London","Frankfurt","Tokyo","SaltLakeCity","Singapore","spawnSync","jitoUpdate","__name","tag","JITO_CONFIG","mod","spawnSync","shell","stdio","readFile","writeFile","homedir","updateJitoSolvConfig","__name","config","solvConfigFile","homedir","homeDir","FILES","JITO_CONFIG","updatedConfig","JSON","parse","readFile","updatedConfigString","stringify","writeFile","console","log","spawnSync","inquirer","updateCommission","__name","commission","isTest","validatorKeypair","voteAccountKeypair","spawnSync","network","shell","stdio","cmd","updateCommissionAsk","inquirer","prompt","type","name","message","default","execAsync","chalk","inquirer","updateFirewall","__name","answer","inquirer","prompt","name","type","message","default","execAsync","ip","console","log","chalk","white","getSolvVersion","__name","version","getSolvVersion_default","readFile","writeFile","existsAsync","LANG","LANGS","Object","values","Network","NETWORK_TYPES","NodeType","NODE_TYPES","ValidatorType","SOLANA_CLIENTS","filter","type","RpcType","RPC_MODE","MNT_DISK_TYPE","VERSION_TESTNET","VERSION_MAINNET","VERSION_JITO_TESTNET","VERSION_JITO_MAINNET","VERSION_JITO_RPC","VERSION_SOLANA_RPC","VERSION_NODE","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","DEFAULT_CONFIG","NETWORK","Network","TESTNET","NODE_TYPE","NodeType","RPC","VALIDATOR_TYPE","ValidatorType","NONE","RPC_TYPE","RpcType","AGAVE","MNT_DISK_TYPE","TRIPLE","TESTNET_SOLANA_VERSION","VERSION_TESTNET","MAINNET_SOLANA_VERSION","VERSION_MAINNET","NODE_VERSION","VERSION_NODE","TESTNET_DELINQUENT_STAKE","DELINQUENT_STAKE_TESTNET","MAINNET_DELINQUENT_STAKE","DELINQUENT_STAKE_MAINNET","COMMISSION","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","STAKE_ACCOUNTS","HARVEST_ACCOUNT","IS_MEV_MODE","RPC_URL","SOLANA_MAINNET_RPC_URL","KEYPAIR_PATH","DISCORD_WEBHOOK_URL","AUTO_UPDATE","AUTO_RESTART","IS_DUMMY","API_KEY","LEDGER_PATH","ACCOUNTS_PATH","SNAPSHOTS_PATH","MOD","defaultConfig_default","homedir","readConfig","__name","configPath","homedir","homeDir","SOLV4_CONFIG_FILE","existsAsync","JSON","parse","readFile","console","log","writeFile","stringify","DEFAULT_CONFIG","readConfig_default","fetch","sendDiscord","__name","content","config","readConfig","DISCORD_WEBHOOK_URL","Error","body","username","fetch","method","JSON","stringify","headers","status","console","log","error","spawnSync","Connection","isValidatorActive","__name","rpcUrl","voteAccountKey","isTest","slot","validatorStatus","pubkey","isActive","reason","connection","Connection","voteAccounts","getVoteAccounts","validator","current","find","v","votePubkey","delinquent","lastVoteSlot","lastVote","slotsSinceLastVote","getSlot","error","console","spawnSync","getSolanaAddress","__name","keypath","cmd","stdout","spawnSync","shell","stdio","toString","trim","sleep","__name","ms","Promise","resolve","setTimeout","sleep_default","sendDiscord","MAX_RETRIES","waitCatchup","__name","config","isTestnet","NETWORK","Network","TESTNET","mainnetValidatorVoteKey","testnetValidatorVoteKey","getAllKeyPaths","validatorPubkey","getSolanaAddress","validatorKey","result","isValidatorActive","RPC_URL","retries","isActive","console","log","msg","pubkey","reason","sendDiscord","sleep","error","waitCatchup_default","autoUpdate","__name","config","isMainnet","NETWORK","Network","MAINNET","isFrankendancer","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","validatorKey","isUpdateRequired","FD_RESTART_REQUIRED_MAINNET","FD_RESTART_REQUIRED_TESTNET","NODE_RESTART_REQUIRED_MAINNET","NODE_RESTART_REQUIRED_TESTNET","AUTO_RESTART","address","getSolanaAddress","msg","getSolvVersion","sendDiscord","spawnSync","stdio","shell","error","errorMsg","message","restartMsg","sleep","catchup","waitCatchup","autoUpdate_default","homedir","readFile","writeFile","existsAsync","updateDefaultConfig","__name","config","solvConfigFile","homedir","homeDir","SOLV4_CONFIG_FILE","existsAsync","console","log","writeFile","JSON","stringify","DEFAULT_CONFIG","updatedConfig","parse","readFile","updatedConfigString","cmdsEN","description","version","help","subcmdHelp","server","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","check","scp","cron","setup","epoch","slot","solv","installer","unstake","cmds_default","cmdsJA","description","version","help","subcmdHelp","server","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","unstake","check","scp","cron","setup","epoch","slot","solv","installer","cmds_default","logsEN","success","created","error","failed","installer","welcomeMsg","description","logs_default","logsJA","success","created","error","failed","installer","welcomeMsg","description","logs_default","installerEN","installerSubEN","installerJA","installerSubJA","subCmdsEN","server","description","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","unstake","check","scp","cron","setup","epoch","slot","solv","subCmds_default","subCmdsJA","server","description","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","unstake","check","scp","cron","setup","epoch","slot","solv","subCmds_default","clientEN","clientJA","readLocale","__name","lang","locales","cmds","cmdsEN","subCmds","subCmdsEN","logs","logsEN","installer","installerEN","installerSub","installerSubEN","clientCmds","clientEN","LANGS","EN","JA","cmdsJA","subCmdsJA","logsJA","installerJA","installerSubJA","clientJA","readLocale_default","existsSync","readFileSync","writeFileSync","readFileSync","writeFileSync","homedir","updateSolvConfig","__name","config","solvConfigFile","homedir","homeDir","FILES","CONFIG","updatedConfig","JSON","parse","readFileSync","updatedConfigString","stringify","writeFileSync","homedir","readOrCreateDefaultConfig","__name","configPath","homedir","homeDir","FILES","CONFIG","existsSync","writeFileSync","JSON","stringify","console","log","config","parse","readFileSync","locale","readLocale","LANG","RPC_URL","updateSolvConfig","IS_MEV_MODE","undefined","DISCORD_WEBHOOK_URL","spawnSync","getSnapshot","__name","isTest","minDownloadSpeed","snapshotPath","SNAPSHOTS_PATH","version","VERSION_MAINNET","rpcUrl","useAvorio","cmd","spawnSync","shell","stdio","cwd","error","Error","spawnSync","frankendancerUpdate","__name","config","version","mod","isTestnet","NETWORK","Network","TESTNET","firedancerVersion","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","MOD","spawnSync","shell","stdio","cwd","spawnSync","rmSnapshot","__name","config","spawnSync","shell","stdio","SNAPSHOTS_PATH","updateCommands","__name","config","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","isJito","VALIDATOR_TYPE","ValidatorType","JITO","isFrankendancer","FRANKENDANCER","isAutoRestart","AUTO_RESTART","isModded","MOD","minIdleTime","version","VERSION_TESTNET","VERSION_MAINNET","VERSION_JITO_MAINNET","VERSION_JITO_TESTNET","VERSION_FIREDANCER","VERSION_FIREDANCER_TESTNET","VERSION_SOLANA_RPC","VERSION_JITO_RPC","program","command","alias","description","option","action","options","solvVersion","getSolvVersion","deliquentStake","TESTNET_DELINQUENT_STAKE","MAINNET_DELINQUENT_STAKE","console","log","chalk","white","auto","autoUpdate","migrateConfig","oldConfig","readOrCreateDefaultConfig","diskType","MNT_DISK_TYPE","TRIPLE","DISK_TYPES","DOUBLE","SINGLE","isTestnetOld","SOLANA_NETWORK","NETWORK_TYPES","isRPCOld","SOLV_TYPE","SOLV_TYPES","RPC_NODE","isJitoOld","MAINNET_TYPE","MAINNET_TYPES","JITO_MEV","newConfigBody","MAINNET","VALIDATOR","RPC_TYPE","RpcType","NONE","AGAVE","SOLANA","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","NODE_VERSION","COMMISSION","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","STAKE_ACCOUNTS","STAKE_ACCOUNT","HARVEST_ACCOUNT","IS_MEV_MODE","RPC_URL","KEYPAIR_PATH","DISCORD_WEBHOOK_URL","AUTO_UPDATE","IS_DUMMY","API_KEY","LEDGER_PATH","ACCOUNTS_PATH","SNAPSHOTS_PATH","updateDefaultConfig","jitoVersion","updateJitoSolvConfig","tag","green","firewall","updateFirewall","background","rmSnapshot","jitoUpdate","mod","monitorUpdate","getSnapshot","frankendancerUpdate","updateVersion","DELINQUENT_STAKE_TESTNET","DELINQUENT_STAKE_MAINNET","commission","ansewr","updateCommissionAsk","updateCommission","updateSolv","spawnSync","tail","__name","options","log","startupScriptPaths","cmd","error","info","warning","console","result","spawnSync","shell","stdio","signal","process","exit","status","logCommands","__name","program","command","description","alias","option","action","options","tail","chalk","spawnSync","homedir","setupVoteAccount","__name","config","homeDir","homedir","allKeyPaths","getAllKeyPaths","validatorVoteKey","testnetValidatorVoteKey","validatorKey","testnetValidatorKey","validatorAuthorityKey","testnetValidatorAuthorityKey","network","NETWORK_TYPES","TESTNET","commision","COMMISSION","NETWORK","Network","MAINNET","mainnetValidatorVoteKey","mainnetValidatorKey","mainnetValidatorAuthorityKey","console","log","url","RPC_URL","cmd","spawnSync","shell","stdio","spawnSync","existsSync","readdirSync","rmSync","homedir","path","createSolvKeyPairs","__name","config","genKeys","keyNum","NODE_TYPE","NodeType","RPC","KEYPAIRS","MAINNET_VALIDATOR_KEY","NETWORK","Network","TESTNET","TESTNET_VALIDATOR_KEY","TESTNET_VALITATOR_AUTHORITY_KEY","TESTNET_VALIDATOR_VOTE_KEY","MAINNET_VALITATOR_AUTHORITY_KEY","MAINNET_VALIDATOR_VOTE_KEY","cmd","spawnSync","shell","stdio","files","readdirSync","filter","f","endsWith","keyDir","homedir","unstakedKeyPath","path","join","existsSync","i","file","keyPath","console","log","rmSync","recursive","spawnSync","jupiterAPIService","__name","rpcUrl","grpcUrl","grpcToken","port","filePath","body","jupiterAPIService_default","inquirer","chalk","jupiterAPISetup","__name","questions","inquirer","prompt","name","message","type","default","spawnSync","shell","stdio","filePath","body","jupiterAPIService","rpcUrl","grpcUrl","grpcToken","console","log","chalk","white","jupiterAPISetup_default","existsAsync","readFile","writeFile","homedir","path","readOrCreateJitoConfig","__name","homeDir","homedir","configPath","path","join","FILES","JITO_CONFIG","existsAsync","writeFile","JSON","stringify","console","log","config","parse","readFile","error","spawnSync","daemonReload","__name","spawnSync","shell","stdio","chalk","inquirer","inquirer","askJitoSetting","__name","isTestnet","jitRegions","Object","keys","JITO_REGIONS","TESTNET","MAINNET","regionType","answer","inquirer","prompt","name","type","message","default","commissionBps","choices","regionKey","region","regionArgs","version","JITO_CONFIG","tag","blockEngineUrl","BLOCK_ENGINE_URL","relayerUrl","RELAYER_URL","shredReceiverAddr","SHRED_RECEIVER_ADDR","initialConfigSetup","__name","validatorType","ValidatorType","NONE","rpcType","RpcType","AGAVE","commission","DEFAULT_CONFIG","COMMISSION","isDummy","answer","inquirer","prompt","name","type","message","choices","NETWORK_TYPES","default","Network","MAINNET","NODE_TYPES","NodeType","RPC","isTestnet","network","TESTNET","nodeType","VALIDATOR","validatorChoices","JITO","SOLANA","FRANKENDANCER","then","RPC_MODE","readOrCreateJitoConfig","jitoConfig","askJitoSetting","updateJitoSolvConfig","console","log","chalk","white","updateDefaultConfig","NETWORK","NODE_TYPE","VALIDATOR_TYPE","RPC_TYPE","IS_DUMMY","error","Error","initialConfigSetup_default","spawnSync","installJito","__name","version","VERSION_JITO_TESTNET","mod","tag","spawnSync","shell","stdio","startJitoRPCScript","__name","IDENTITY_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","existsAsync","writeFile","spawnSync","updateStartupScriptPermission","__name","cmd","STARTUP_SCRIPT","spawnSync","shell","stdio","updateStartupScriptPermission_default","startRPCNodeScript","__name","IDENTITY_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","setupRpcNode","__name","config","rpcType","RPC_TYPE","startupScript","RpcType","AGAVE","console","log","installAgave","TESTNET_SOLANA_VERSION","startRPCNodeScript","JITO","installJito","VERSION_JITO_TESTNET","startJitoRPCScript","existsAsync","STARTUP_SCRIPT","writeFile","updateStartupScriptPermissions","rpc_default","spawnSync","installSolana","__name","version","spawnSync","shell","stdio","installSolana_default","startJitoMainnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startJitoTestnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startMainnetValidatorScript","__name","config","solanaCLI","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startTestnetAgaveValidatorScript","__name","config","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","existsAsync","writeFile","setupValidatorNode","__name","config","mod","NETWORK","network","MOD","modConfig","Network","MAINNET","console","log","setupMainnetValidator","TESTNET","setupTestnetValidator","VALIDATOR_TYPE","validatorType","MAINNET_SOLANA_VERSION","version","startupScript","ValidatorType","SOLANA","installSolana","startMainnetValidatorScript","JITO","jitoConfig","readOrCreateJitoConfig","installJito","startJitoMainnetScript","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","existsAsync","STARTUP_SCRIPT","writeFile","updateStartupScriptPermissions","TESTNET_SOLANA_VERSION","startTestnetAgaveValidatorScript","AGAVE","installAgave","startJitoTestnetScript","validator_default","chalk","execSync","createDirectoryIfNotExists","path","execSync","console","log","setupDirs","__name","dirs","MT_PATHS","ACCOUNTS","LEDGER","SNAPSHOTS","dir","createDirectoryIfNotExists","error","Error","execSync","getPreferredDisks","lines","execSync","encoding","split","slice","disks","allDiskNames","map","line","trim","has850GB","has400GB","hasUsed1250GB","hasThirdDisk400GB","rootDiskName","name","sizeStr","mountpoint","size","parseInt","isNaN","isMounted","undefined","replace","hasPartition","some","diskName","startsWith","diskType","push","type","console","log","rootDiskPartitions","filter","forEach","partition","sortedDisks","disk","includes","sort","a","b","nvmeDisks","sataDisks","prioritizedDisks","length","largestDisk","secondLargestDisk","thirdDisk","index","getLargestDisk_default","spawnSync","formatDisk","__name","fileSystem","spawnSync","shell","encoding","stdout","trim","console","log","cmd","stdio","spawnSync","getUUID","devicePath","attempt","uuid","spawnSync","shell","encoding","stdout","trim","console","log","warn","sleep","error","ensureFstabEntries","__name","fileSystem","fileSystem2","fileSystem3","isDouble","isTriple","fs1","fs2","fs3","mtLine","MT_PATHS","ROOT","LEDGER","ACCOUNTS","SNAPSHOTS","lines","fstabContent","linesToAdd","line","includes","push","length","addCmd","join","spawnSync","umount","__name","mountPath","cmd","stderr","spawnSync","shell","stdio","includes","error","console","log","mountDirs","__name","disks","getPreferredDisks","mountPoint","mountpoint","has850GB","has400GB","length","console","log","updateDefaultConfig","MNT_DISK_TYPE","TRIPLE","fileSystemName1","name","fileSystemName2","fileSystemName3","isDisk1Formatted","formatDisk","isDisk2Formatted","isDisk3Formatted","fileSystem1","fileSystem2","fileSystem3","sleep","ensureFstabEntries","DOUBLE","SINGLE","includes","umount","fileSystem","mountDirs_default","spawnSync","setupPermissions","__name","cmds","MT_PATHS","ROOT","ACCOUNTS","LEDGER","SNAPSHOTS","line","spawnSync","shell","stdio","execSync","existsSync","setupSystemd","existsSync","SERVICE_PATHS","SOL_SYSTEM_CONFIG21","console","log","sysctlConfig","nofilesConfig","execSync","SOL_SYSTEM_CONF","SOL_NOFILES_CONF","logRotates","__name","username","CONFIG","USERNAME","frankendancer","log","startupScriptPaths","service","body","existsSync","execSync","setupLogrotate","frankendancer","console","log","existsSync","SERVICE_PATHS","SOL_LOGROTATE","body","logRotates","execSync","FRANKENDANCER_LOGROTATE","envMainnet","envTestnet","normalSolanaPath","CONFIG","USERNAME","solvService","__name","isTest","scriptPath","startupScriptPaths","environment","solanaPath","HOME_PATHS","ROOT","execSync","setupSolvService","isTest","console","log","body","solvService","execSync","SERVICE_PATHS","SOL_SERVICE","makeServices","__name","isTest","setupLogrotate","setupSolvService","setupSystemd","spawnSync","setupKeys","__name","config","createSolvKeyPairs","network","NETWORK","Network","TESTNET","spawnSync","TESTNET_VALIDATOR_KEY_PATH","shell","stdio","MAINNET_VALIDATOR_KEY_PATH","NODE_TYPE","NodeType","RPC","setupVoteAccount","error","Error","spawnSync","startSolana","__name","config","cmd","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","service","spawnSync","shell","stdio","execSync","setupCpuGovernor","__name","execSync","cmd","setupCpuGovernor_default","fs","promisify","execSync","readFile","promisify","fs","access","path","sysconfig","updateSysctlConfig","constants","F_OK","console","log","data","includes","updatedConfig","replace","execSync","err","error","updateSysctlConfig_default","spawnSync","restartLogrotate","__name","spawnSync","shell","stdio","spawnSync","enableSolv","__name","spawnSync","shell","stdio","spawnSync","createSymLink","__name","isDummy","isTest","createInactiveSymLink","createActiveSymLink","network","spawnSync","shell","stdio","chalk","rpcLog","__name","lighting","chalk","yellow","msg","blueBright","white","console","log","cyan","rpcLog_default","spawnSync","promises","fs","startFiredancerScript","__name","filePath","body","startFiredancerScript_default","firedancerService","__name","filePath","body","firedancerService_default","configToml","__name","isTest","jitoConfig","filePath","mainnetBody","blockEngineUrl","body","configToml_default","portRelayService","__name","filePath","body","portRelayService_default","setupFiredancer","__name","mod","config","isTest","NETWORK","Network","TESTNET","latestVersion","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","latestSubmoduleVersion","VERSION_TESTNET","VERSION_MAINNET","spawnSync","shell","stdio","cwd","jitoConfig","readOrCreateJitoConfig","filePath","body","startFiredancerScript","fdService","firedancerService","prService","portRelayService","toml","configToml","fs","writeFile","console","log","setupLogrotate","setupFiredancer_default","setupV2","__name","skipInitConfig","skipMount","pivot","mod","console","log","chalk","white","readConfig","initialConfigSetup","latestConfig","isTest","NETWORK","Network","TESTNET","setupDirs","mountDirs","makeServices","restartLogrotate","setupCpuGovernor","updateSysctlConfig","setupKeys","createSymLink","IS_DUMMY","NODE_TYPE","NodeType","RPC","setupRpcNode","VALIDATOR","setupValidatorNode","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","setupFiredancer","Error","setupPermissions","daemonReload","enableSolv","getSnapshot","SNAPSHOTS_PATH","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","startSolana","rpcLog","error","message","relayerService","__name","blockEngineUrl","filePath","body","jitoRelayerSeparateService","execSync","spawnSync","jitoRelayerSetup","__name","blockEngineUrl","isCoHost","spawnSync","stdio","shell","cwd","filePath","body","relayerService","jitoRelayerSeparateService","execSync","spawnSync","geyserConfig","__name","xToken","filePath","defaultConfig","libpath","log","level","grpc","address","compression","accept","send","max_decoding_message_size","snapshot_plugin_channel_capacity","snapshot_client_channel_capacity","channel_capacity","unary_concurrency_limit","unary_disabled","x_token","prometheus","geyserConfig_default","spawnSync","readFile","writeFile","addConfigToStartupScript","__name","startupScriptPath","lines","readFile","split","splice","newStartupScript","join","writeFile","spawnSync","shell","stdio","addConfigToStartupScript_default","inquirer","writeFile","yellowstoneGeyser","__name","xToken","inquirer","prompt","type","name","message","default","cmd","cmd2","cmd3","spawnSync","shell","stdio","cwd","filePath","defaultConfig","geyserConfig","jsonString","JSON","stringify","writeFile","encoding","addConfigToStartupScript","setupCommands","__name","config","program","command","description","option","action","options","isModded","MOD","mod","vote","console","log","chalk","white","setupVoteAccount","process","exit","key","createSolvKeyPairs","relayer","blockEngineUrl","readOrCreateJitoConfig","jitoRelayerSetup","isCoHost","green","daemonReload","rpcLog","jupiter","jupiterAPISetup","geyser","yellowstoneGeyser","firedancer","setupFiredancer","setupV2","skipInitConfig","skipMount","pivot","error","message","includes","cyan","red","execSync","df","__name","parsedData","execSync","toString","split","slice","filter","line","map","segments","Filesystem","Size","Used","Avail","Use","MountedOn","sort","a","b","convertToBytes","isMountedOnCorrect","some","data","forEach","console","log","startsWith","length","chalk","Table","displayTable","__name","data","head","map","item","chalk","blue","table","Table","colWidths","forEach","row","push","Filesystem","Size","Used","Avail","Use","MountedOn","white","console","log","toString","dfCommands","__name","program","command","description","action","dirs","df","displayTable","convertToBytes","size","units","K","KB","M","MB","G","GB","T","TB","unit","match","number","parseFloat","startCommand","__name","config","program","command","description","action","startSolana","process","exit","spawnSync","chalk","stopSolana","__name","config","chalk","white","console","log","cmd","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","service","spawnSync","shell","stdio","stopCommand","__name","config","program","command","description","action","stopSolana","process","exit","spawnSync","chalk","restartCommand","__name","config","solanaValidatorClient","getSolanaCLI","program","command","description","option","action","options","isAutoRestart","AUTO_RESTART","isTestnet","NETWORK","Network","TESTNET","minIdleTime","rm","console","log","chalk","white","spawnSync","stdio","shell","green","process","exit","cmd","LEDGER_PATH","MAINNET_DELINQUENT_STAKE","installCommands","__name","config","version","NETWORK","Network","TESTNET","VERSION_TESTNET","VERSION_MAINNET","NODE_TYPE","NodeType","RPC","VERSION_SOLANA_RPC","program","command","alias","description","option","action","options","isJito","VALIDATOR_TYPE","ValidatorType","JITO","isModified","mod","MOD","jitoTag","VERSION_JITO_MAINNET","jitoVersion","jitoUpdate","solanaCLIVersion","updateVersion","spawnSync","mountCommands","__name","program","command","description","action","spawnSync","shell","stdio","disks","getPreferredDisk","console","log","spawnSync","chalk","spawnSync","hasEpochTimer","__name","result","spawnSync","encoding","status","console","log","crontabList","stdout","includes","error","hasEpochTimer_default","cronCommands","__name","program","command","description","option","action","options","hasEpochTimer","console","log","chalk","green","process","exit","cronJob","cron","spawnSync","shell","stdio","SOLV_CLIENT_PATHS","SOLV_KEYPAIR_DOWNLOAD_PATH","SOLV_KEYPAIR_UPLOAD_PATH","SOLV_KEYPAIR_UPLOAD_PATH_LINUX","SOLV_KEYPAIR_TRASH_PATH","SSH_PUBKEY_PATH","existsSync","mkdirSync","inquirer","homedir","spawnSync","executeSCP","ip","key","filePath","isDownload","cmd","spawnSync","shell","stdio","status","download","__name","ip","migrateIP","inquirer","prompt","type","name","message","default","solanaKeys","Object","values","getAllKeyPaths","homeDirectory","homedir","keyDir","includes","SOLV_CLIENT_PATHS","SOLV_KEYPAIR_DOWNLOAD_PATH","existsSync","mkdirSync","recursive","isDownload","relayerKeyPath","RELAYER_KEY","push","key","splits","split","fileName","length","replace","filePath","executeSCP","console","log","spawnSync","existsSync","inquirer","os","upload","__name","ip","homeDirectory","os","userInfo","homedir","migrateIP","inquirer","prompt","type","name","message","default","keyPath","SOLV_CLIENT_PATHS","SOLV_KEYPAIR_UPLOAD_PATH","includes","SOLV_KEYPAIR_UPLOAD_PATH_LINUX","solanaKeys","Object","values","getAllKeyPaths","key","splits","split","fileName","length","endsWith","filePath","existsSync","cmd","spawnSync","shell","stdio","console","log","spawnSync","inquirer","scpCreate","__name","answer","inquirer","prompt","type","name","message","default","cmd","HOME_PATHS","ROOT","pubkey","AUTHORIZED_KEYS","spawnSync","shell","stdio","console","log","chalk","readFileSync","os","cat","__name","publicKeyPath","os","userInfo","homedir","homeDirectory","publicKey","readFileSync","console","log","chalk","white","error","spawnSync","init","__name","spawnSync","shell","stdio","spawn","readFileSync","Readable","search","__name","bar","Promise","resolve","reject","find","spawn","filePaths","stdout","on","data","push","toString","split","filter","path","increment","stderr","code","error","checkIfSolanaKey","JSON","parse","readFileSync","length","processPaths","paths","validPaths","readable","Readable","from","chalk","Presets","SingleBar","chalk","spawnSync","fetch","uploadVS","__name","result","fetch","VS_UPLOAD_ENDPOINT","method","headers","status","console","log","chalk","yellow","data","json","cmd","cmds","spawnSync","shell","stdio","white","uploadVS_default","scpCommands","__name","scp","program","command","description","argument","alias","option","action","options","ip","download","vs","uploadVS","upload","scpCreate","cat","init","console","log","progressBar","SingleBar","Presets","shades_classic","start","solanaKeyPaths","search","result","processPaths","stop","chalk","white","length","slice","green","join","spawnSync","statusCommands","__name","config","program","command","description","action","systemctlStatusSolv","cmd","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","service","spawnSync","shell","stdio","process","exit","spawnSync","delegateStake","__name","stakeAccountPubkey","validatorVoteAccountPubkey","config","readConfig","isTestnet","NETWORK","Network","TESTNET","network","NODE_TYPE","NodeType","RPC","RPC_URL","cmd","authorityKeyPath","spawnSync","join","shell","stdio","error","Error","inquirer","spawnSync","createStakeAccount","__name","stakeKeypair","sol","retryLimit","attempt","result","spawnSync","shell","stdio","output","stdout","toString","stderr","includes","console","log","addLeadingZero","existsAsync","execSync","spawnSync","os","stakeAccountQuestion","__name","config","isTestnet","NETWORK","Network","TESTNET","inquirer","prompt","type","name","message","default","confirmCreateStakeAccount","spawnSync","authorityKeypair","shell","stdio","answer","stakeKeypair","stakeKeypairPath","createStakeKeypair","currentStakeAccount","STAKE_ACCOUNTS","uniqueStakeAccount","Array","from","Set","updateSolvConfig","STAKE_ACCOUNT","createStakeAccount","Number","solAmount","homeDirectory","os","userInfo","homedir","STAKE_ACCOUNT_DIR","existsAsync","files","stdout","toString","split","filter","file","includes","stakeAccountNum","addLeadingZero","length","outfile","cmd","execSync","trim","spawnSync","deactivateStake","__name","stakeAccountPubkey","authorityKeyPath","readConfig","NETWORK","Network","TESTNET","cmd","spawnSync","shell","stdio","error","Error","spawnSync","withdrawStake","__name","stakeAccountPubkey","destinationPubkey","amount","cmd","spawnSync","shell","stdio","error","Error","chalk","Connection","PublicKey","stakePoolInfo","getStakePoolInfo","__name","rpcUrl","poolAddress","SOLV_STAKE_POOL_ADDRESS","connection","Connection","stakePoolAddress","PublicKey","stakePoolInfo","console","log","fetchDigitalAsset","createUmi","publicKey","getTokenInfo","__name","rpcUrl","mintAddress","mintPubkey","publicKey","console","log","umi","createUmi","nftMetadata","fetchDigitalAsset","name","metadata","symbol","uri","mint","chalk","inquirer","selectLST","__name","rpcUrl","answer","inquirer","prompt","type","name","message","default","SOLV_STAKE_POOL_ADDRESS","poolInfo","getStakePoolInfo","stakePoolAddress","console","log","chalk","yellow","white","poolMint","tokenInfo","getTokenInfo","symbol","mint","uri","result","stakeInfo","confirm","readFile","inquirer","existsAsync","Connection","Keypair","PublicKey","Connection","PublicKey","Keypair","getOrCreateAssociatedTokenAccount","getOrCreateDestinationAddress","__name","rpcUrl","fromWalletKey","mintAddress","owner","allowOwnerOffCurve","payer","Keypair","fromSecretKey","Uint8Array","mintPublicKey","PublicKey","connection","Connection","getOrCreateAssociatedTokenAccount","address","toBase58","error","console","log","Error","JSON","stringify","Spinner","chalk","PublicKey","Keypair","Transaction","ComputeBudgetProgram","LAMPORTS_PER_SOL","solanaStakePool","depositSol","__name","connection","fromWalletKey","SOL","stakePoolAddress","PublicKey","SOLV_STAKE_POOL_ADDRESS","destinationTokenAccount","referrerTokenAccount","depositAuthority","fromWallet","Keypair","fromSecretKey","Uint8Array","lamport","LAMPORTS_PER_SOL","instructions","signers","depositSOLInstruction","txForEstimate","Transaction","add","feePayer","publicKey","latestBlockhashAndContext","getLatestBlockhashAndContext","commitment","recentBlockhash","value","blockhash","sign","tx","ComputeBudgetProgram","setComputeUnitPrice","microLamports","signature","sendRawTransaction","serialize","skipPreflight","confirmTransaction","status","error","console","log","payerAddress","sleep","elSOLdeposit","__name","rpcUrl","poolAddress","amount","fromWalletKey","console","log","chalk","white","connection","Connection","askAmount","spinner","Spinner","setSpinnerString","start","setSpinnerTitle","green","stakePoolAddress","PublicKey","depositAuthority","Keypair","fromSecretKey","Uint8Array","mintAddress","ELSOL_MINT_ADDRESS","destinationTokenAccount","getOrCreateDestinationAddress","publicKey","sleep","sig","depositSol","SOLV_ELSOL_ACCOUNT_ADDRESS","retryCount","status","stop","red","yellow","signature","Connection","Keypair","PublicKey","Spinner","chalk","sleep","depositeLST","__name","rpcUrl","poolAddress","amount","fromWalletKey","symbol","connection","Connection","askAmount","spinner","Spinner","setSpinnerString","start","setSpinnerTitle","chalk","green","stakePoolAddress","PublicKey","stakePool","getStakePoolInfo","console","log","mintAddress","poolMint","depositAuthority","Keypair","fromSecretKey","Uint8Array","destinationTokenAccount","getOrCreateDestinationAddress","publicKey","solvAssociatedTokenAccount","SOLV_POOL_MANAGER_ADDRESS","sleep","sig","depositSol","retryCount","status","stop","red","yellow","white","signature","execSync","homedir","stakeCommands","__name","config","program","command","description","option","action","options","amount","Number","console","log","RPC_URL","poolAddress","SOLV_STAKE_POOL_ADDRESS","isTestnet","NETWORK","Network","TESTNET","keyRoot","homedir","keypairPath","execSync","existsAsync","chalk","yellow","white","fromWalletKey","JSON","parse","readFile","elsol","elSOLdeposit","lst","selectLST","stakePoolAddress","depositeLST","symbol","stakeAccountQuestion","newSolvConfig","readConfig","validatorVoteAccount","stakeAccounts","delegateStakeAsk","stakeAccount","delegateStake","unstakeOption","unstakeAsk","deactivateStakeAsk","deactivateStake","answer","withdrawStakeAsk","withdrawStake","destinationAddress","solAmount","askAmount","currentAddress","toString","trim","currentVoteAccountBalance","replace","inquirer","prompt","type","name","message","default","String","choices","STAKE_ACCOUNTS","defaultAddress","getVoteAccountAddress","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","cmd","voteAccount","unstakeOptions","execSync","getEpoch","__name","execSync","encoding","toString","replace","error","execSync","getSlot","__name","execSync","encoding","toString","replace","error","chalk","Spinner","Logger","successHex","chalk","hex","warningHex","errorHex","syncHex","greyHex","indigoHex","pinkHex","normal","text","console","log","white","syncSpinner","spinner","Spinner","setSpinnerString","start","error","stop","Error","solvAA","row1","row2","row3","row4","row5","row6","VERSION","installMessage","msg","msg2","installClientMessage","mtCommandsLog","msg3","msg4","chalk","spawnSync","showConfig","__name","solvConfig","spawnSync","shell","stdio","config","startupScriptPaths","console","log","chalk","white","scriptPath","SERVICE_PATHS","SOL_SERVICE","SOL_LOGROTATE","FRANKENDANCER_LOGROTATE","SOL_SYSTEM_CONFIG21","SOL_NOFILES_CONF","SOL_SYSTEM_CONF","ledger","accounts","snapshots","MNT_DISK_TYPE","spawnSync","chalk","getCommands","__name","config","isTest","NETWORK","Network","TESTNET","version","VERSION_TESTNET","VERSION_MAINNET","NODE_TYPE","NodeType","RPC","VERSION_SOLANA_RPC","get","program","command","description","argument","action","epoch","getEpoch","console","log","cmd","stdout","spawnSync","shell","stdio","chalk","white","slot","getSlot","alias","option","SNAPSHOTS_PATH","options","minDownloadSpeed","snapshotPath","rpcUrl","useAvorio","avorio","getSnapshot","getSolanaCLI","solanaValidatorClient","showConfig","Logger","solvAA","client","installClientMessage","installMessage","addHelpCommand","spawnSync","relayerStatus","__name","spawnSync","shell","stdio","spawnSync","relayerStart","__name","spawnSync","shell","stdio","spawnSync","relayerStop","__name","spawnSync","shell","stdio","spawnSync","relayerRestart","__name","spawnSync","shell","stdio","spawnSync","relayerLog","__name","error","spawnSync","shell","stdio","chalk","spawnSync","spawnSync","relayerEnable","__name","spawnSync","shell","stdio","relayerCommands","__name","relayer","program","command","description","action","relayerStatus","relayerStart","relayerStop","option","options","relayerLog","error","relayerRestart","relayerEnable","url","console","log","chalk","red","cmd","getSolanaCLI","LEDGER_PATH","white","spawnSync","shell","stdio","green","chalk","spawnSync","splBalance","__name","keyPath","cmd","spawnSync","shell","stdio","console","log","chalk","yellow","white","homedir","spawnSync","getSolBalance","__name","keyPath","cmd","stdout","spawnSync","shell","stdio","toString","trim","chalk","spawnSync","balanceCommands","__name","config","program","command","alias","option","description","action","options","spl","keyPath","homedir","splBalance","process","exit","showKeypairsInfo","keyInfo","getKeypairsInfo","output","validatorKey","validatorKeyAddress","validatorKeyBalance","voteKey","voteKeyAddress","voteKeyBalance","authorityKey","authorityKeyAddress","authorityKeyBalance","NODE_TYPE","NodeType","RPC","console","log","chalk","white","spawnSync","IDENTITY_KEY_PATH","stdio","shell","keypairs","getAllKeyPaths","isTestnet","NETWORK","Network","TESTNET","mainnetValidatorKey","getSolanaAddress","getSolBalance","testnetValidatorKey","testnetValidatorVoteKey","testnetValidatorAuthorityKey","mainnetValidatorVoteKey","mainnetValidatorAuthorityKey","spawnSync","rmLogs","__name","spawnSync","shell","stdio","spawnSync","monitorSolana","__name","config","cmd","getSolanaCLI","solanaValidatorClient","LEDGER_PATH","spawnSync","shell","stdio","spawnSync","solanaCatchup","__name","spawnSync","shell","stdio","inquirer","execSync","spawnSync","chalk","homedir","RETRY_DELAY","TransferFrom","TransferTo","transferFromArray","Object","values","transferCommands","__name","config","program","command","alias","option","description","action","options","spl","console","log","chalk","blue","process","exit","fromWalletPath","fromAddress","toAddress","selectFromKeypairs","toBalance","out","spawnSync","RPC_URL","shell","status","Error","stdout","toString","red","fromBalance","execSync","white","amount","inquirer","prompt","type","name","message","default","cmd","result","stdio","maxRetries","MAX_RETRIES","sleep","validateSolanaKey","input","test","homeDir","homedir","authorityKey","validatorKey","toKeyPath","trim","answer","choices","secondChoice","from","filter","value","to","validate","toKey","key","chalk","inquirer","execSync","spawnSync","withdraw","__name","config","isAll","isTestnet","NETWORK","Network","TESTNET","RPC_URL","SOLANA_TESTNET_RPC_URL","validatorKeypair","authorityKeypair","voteAccount","currentVoteAccountBalance","execSync","toString","replace","trim","withdrawAmount","defaultMax","Number","console","log","chalk","white","yellow","answer","inquirer","prompt","type","name","message","default","String","sol","votePubkey","targetPubkey","cmd","spawnSync","shell","stdio","withdrawCommands","__name","config","program","command","option","description","action","options","withdraw","all","process","exit","execSync","spawnSync","BN","LAMPORTS_PER_SOL","Connection","LAMPORTS_PER_SOL","Keypair","readFile","loadKeypairFromFile","__name","filePath","secretKey","JSON","parse","readFile","Keypair","fromSecretKey","Uint8Array","loadKeypairFromFile_default","homedir","KeyType","keySuffixMap","getBalance","__name","rpcUrl","key","isTestnet","connection","Connection","home","homedir","keyPaths","getAllKeyPaths","accountKey","prefix","account","keypair","loadKeypairFromFile","balance","publicKey","SOL","Number","LAMPORTS_PER_SOL","isNaN","Error","getBalance_default","MINIMUM_EPOCH_START_BALANCE","BN","LAMPORTS_PER_SOL","getHarvestBalance","__name","rpcUrl","validatorBalance","getBalance","KeyType","VALIDATOR","withdrawableBalanceLamport","Number","sub","withdrawableBalance","Math","round","chalk","Keypair","Connection","PublicKey","SystemProgram","ComputeBudgetProgram","VersionedTransaction","TransactionMessage","solanaTransfer","__name","endpoint","fromWalletKey","toAddressPubkey","transferAmountLamport","retry","connection","Connection","fromWallet","Keypair","fromSecretKey","Uint8Array","Array","from","toPubkey","PublicKey","lamports","testInstructions","SystemProgram","transfer","fromPubkey","publicKey","ComputeBudgetProgram","setComputeUnitLimit","units","setComputeUnitPrice","microLamports","Math","ceil","latestBlockhashAndContext","getLatestBlockhashAndContext","commitment","testVersionedTx","VersionedTransaction","TransactionMessage","instructions","payerKey","recentBlockhash","value","blockhash","compileToV0Message","simulationResult","simulateTransaction","replaceRecentBlockhash","sigVerify","sign","unitsConsumed","trunc","versionedTx","signature","sendRawTransaction","serialize","confirmTransaction","console","log","error","MAX_RETRIES","Error","JSON","stringify","sleep","readFile","LAMPORTS_PER_SOL","collectSOL","__name","rpcUrl","mainnetValidatorAuthorityKey","mainnetValidatorKey","getAllKeyPaths","getBalance","KeyType","VOTE","console","log","chalk","white","spawnSync","shell","stdio","validatorTransferableBalance","getHarvestBalance","transferLamports","LAMPORTS_PER_SOL","toAddress","execSync","toString","trim","fromWalletKey","JSON","parse","readFile","solanaTransfer","readFile","inquirer","chalk","execSync","homedir","getElSOLBalance","__name","rpcUrl","home","homedir","mainnetValidatorAuthorityKey","getAllKeyPaths","cmd","ELSOL_MINT_ADDRESS","balance","execSync","toString","trim","Number","error","console","log","chalk","red","yellow","white","getElSOLBalance_default","chalk","Connection","PublicKey","Keypair","ComputeBudgetProgram","VersionedTransaction","TransactionMessage","getOrCreateAssociatedTokenAccount","createTransferInstruction","TOKEN_PROGRAM_ID","transferSPLToken","__name","endpoint","fromWalletKey","toAddressPubkey","amount","tokenMintAddress","tokenDecimals","connection","Connection","fromWallet","Keypair","fromSecretKey","Uint8Array","toPubkey","PublicKey","mintPubkey","amountInSmallestUnit","Math","trunc","pow","fromTokenAccount","getOrCreateAssociatedTokenAccount","publicKey","toTokenAccount","testInstructions","createTransferInstruction","address","TOKEN_PROGRAM_ID","ComputeBudgetProgram","setComputeUnitLimit","units","setComputeUnitPrice","microLamports","ceil","latestBlockhashAndContext","getLatestBlockhashAndContext","commitment","testVersionedTx","VersionedTransaction","TransactionMessage","instructions","payerKey","recentBlockhash","value","blockhash","compileToV0Message","simulationResult","simulateTransaction","replaceRecentBlockhash","sigVerify","sign","unitsConsumed","versionedTx","signature","sendRawTransaction","serialize","confirmTransaction","console","log","error","inquirer","spawnSync","chalk","promises","fs","removeCronJob","__name","cronPattern","crontabResult","spawnSync","encoding","status","console","log","chalk","red","process","exit","newCronBody","stdout","split","filter","line","includes","join","tempCrontabFile","fs","writeFile","unlink","green","error","removeCronJob_default","chalk","mevOn","__name","config","isTestnet","NETWORK","Network","TESTNET","ask","inquirer","prompt","type","name","message","default","hasEpochTimer","removeCronJob","updateDefaultConfig","IS_MEV_MODE","AUTO_UPDATE","AUTO_RESTART","autoText","chalk","green","console","log","white","askIfAuto","rpcUrl","RPC_URL","harvestAddress","ask2","DISCORD_WEBHOOK_URL","HARVEST_ACCOUNT","discordWebhookUrl","autoUpdate","autoRestart","mevOn_default","spawnSync","Connection","Connection","getAverageSlotTime","__name","rpcUrl","sampleCount","fallbackSlotTime","samples","Connection","getRecentPerformanceSamples","length","console","warn","validSamples","filter","sample","numSlots","reduce","acc","samplePeriodSecs","error","getAverageSlotTime_default","getEpochInfo","__name","rpcUrl","epochInfo","Connection","slotsInEpoch","Error","timePerSlotSeconds","getAverageSlotTime","console","log","estimatedSecondsUntilNextEpoch","slotIndex","displayRatio","toFixed","days","Math","floor","hours","minutes","seconds","estimatedTimeUntilNextEpoch","error","MINIMUM_AUTHORITY_BALANCE","harvestCommands","__name","config","program","command","alias","description","action","harvestAddress","getHarvestAddress","mainnetValidatorAuthorityKey","getAllKeyPaths","console","log","collectSOL","RPC_URL","voteBalance","getBalance","KeyType","VOTE","retryCount","sleep","fromWalletKey","JSON","parse","readFile","authorityBalance","AUTH","chalk","white","convertibleBalance","Math","round","elSOLdeposit","SOLV_STAKE_POOL_ADDRESS","Error","elSOLBalance","getElSOLBalance","epoch","getEpochInfo","msg","sendDiscord","process","exit","transferSPLToken","ELSOL_MINT_ADDRESS","ELSOL_DECIMALS","IS_MEV_MODE","getSolanaAddress","green","mevOn","spawnSync","stdio","shell","HARVEST_ACCOUNT","answer","inquirer","prompt","type","name","message","validate","validateSolanaKey","updateDefaultConfig","format","writeFile","writeEpochDataToFile","__name","epochData","writeFile","EPOCH_TIMER_FILE_PATH","JSON","stringify","writeEpochDataToFile_default","isLessThan1Day","__name","totalMinutes","epochData","currentEpoch","config","writeEpochDataToFile","lessThan1Day_default","lessThan8Hour","__name","totalMinutes","epochData","currentEpoch","config","isLessThan8Hours","writeEpochDataToFile","lessThan8Hour_default","lessThan1Hour","__name","totalMinutes","epochData","currentEpoch","config","isLessThan1Hour","writeEpochDataToFile","lessThan1Hour_default","newEpoch","__name","currentEpoch","config","isTestnet","NETWORK","Network","TESTNET","params","epoch","isLessThan1Hour","isLessThan8Hours","isLessThan1Day","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","address","getSolanaAddress","writeEpochDataToFile","console","log","content","newEpoch_default","existsAsync","readFile","writeFile","chalk","homedir","initOrReadEpochFile","__name","epochFilePath","homedir","includes","EPOCH_TIMER_FILE_PATH","existsAsync","JSON","parse","readFile","initialData","epoch","isLessThan1Hour","isLessThan8Hours","isLessThan1Day","writeFile","stringify","console","log","chalk","white","initEpochFile_default","chalk","checkBalance","__name","config","rpcUrl","RPC_URL","isTestnet","NETWORK","Network","TESTNET","SOLANA_TESTNET_RPC_URL","getBalance","KeyType","VALIDATOR","MINIMUM_VALIDATOR_BALANCE","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","address","getSolanaAddress","msg","sendDiscord","console","log","chalk","green","checkBalance_default","getNpmLatestVersion","packageName","url","response","fetch","ok","Error","status","json","latest","error","console","getNpmLatestVersion_default","isVersionSame","solvVersion","getSolvVersion","latestVersion","getNpmLatestVersion","Error","console","log","isVersionSame_default","spawnSync","spawnSync","getEpochInfoByRust","__name","rpcUrl","cmd","stdout","spawnSync","shell","stdio","splitedLine","toString","split","epochCompletedTime","find","line","includes","epochCompletedPercent","replace","epoch","Number","Error","remainingTime","console","log","timeRegex","match","day","parseInt","hour","min","sec","totalMinutes","Math","floor","epochRemainingTime","error","epochTimer","__name","config","isTestnet","NETWORK","Network","TESTNET","rpcUrl","SOLANA_TESTNET_RPC_URL","RPC_URL","now","format","Date","console","log","getD1Epoch","initOrReadEpochFile","currentEpoch","getEpochInfoByRust","mainnetValidatorVoteKey","testnetValidatorVoteKey","getAllKeyPaths","isActive","isValidatorActive","getSolanaAddress","voteAccountKey","checkBalance","isVersionSame","AUTO_UPDATE","spawnSync","stdio","shell","epoch","newEpoch","totalMinutes","checks","lessThan1Hour","lessThan8Hour","isLessThan1Day","check","epochTimer_default","epochTimerCommands","__name","config","program","command","description","action","epochTimer","process","exit","inquirer","join","spawnSync","chalk","spawnSync","scpSSH","__name","ip","cmd","user","stdio","sshKeyPath","scpSSHResult","result","spawnSync","shell","status","console","log","stdout","String","stderr","toString","error","scpSSH_default","chalk","checkValidatorKey","__name","validatorKeyPath","ip","user","console","log","chalk","white","localValidatorIdentityAddress","getSolanaAddress","trim","destinationValidatorIdentityAddress","scpSSH","stdout","toString","yellow","checkValidatorKey_default","AGAVE_CLI","FD_CLI","FC_CLI_CONFIG","getSolanaCLIActive","__name","client","getSolanaCLIActive_default","AGAVE_CLI","getSolanaCLIAgave","__name","error","console","getSolanaCLIAgave_default","chalk","getRemoteClientType","__name","ip","user","console","log","chalk","white","configResult","scpSSH","status","client","validatorType","ValidatorType","AGAVE","success","error","JSON","parse","stdout","VALIDATOR_TYPE","FRANKENDANCER","JITO","green","yellow","String","readFile","chalk","existsSync","getLocalClientType","__name","console","log","chalk","white","configPath","existsSync","client","validatorType","ValidatorType","AGAVE","success","error","configContent","readFile","JSON","parse","VALIDATOR_TYPE","FRANKENDANCER","JITO","green","yellow","String","unstakedKeyPath","join","SOLV_HOME","UNSTAKED_KEY","identityKeyPath","IDENTITY_KEY","changeIdentityIncoming","__name","ip","pubkey","config","user","safe","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","validatorKeyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","localClientResult","getLocalClientType","remoteClientResult","getRemoteClientType","localClient","success","client","remoteClient","console","log","chalk","green","localSolanaClient","localSolanaClientConfig","getSolanaCLIActive","remoteSolanaClient","remoteSolanaClientConfig","agaveSolanaClient","getSolanaCLIAgave","checkValidatorKey","white","restartWindowCmd","spawnSync","shell","stdio","status","yellow","setIdentityCmd","LEDGER_PATH","IDENTITY_KEY_PATH","updateDefaultConfig","IS_DUMMY","join","chalk","spawnSync","unstakedKeyPath","join","SOLV_HOME","UNSTAKED_KEY","identityKeyPath","IDENTITY_KEY","sshKeyPath","changeIdentityOutgoing","__name","ip","pubkey","config","user","safe","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","validatorKeyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","localClientResult","getLocalClientType","remoteClientResult","getRemoteClientType","localClient","success","client","remoteClient","console","log","chalk","green","localSolanaClient","localSolanaClientConfig","getSolanaCLIActive","remoteSolanaClient","remoteSolanaClientConfig","agaveSolanaClient","getSolanaCLIAgave","checkValidatorKey","step1","step2","step3","step4","LEDGER_PATH","step5","step6","IDENTITY_KEY_PATH","white","spawnSync","shell","stdio","status","yellow","cmd5","cmd6","updateDefaultConfig","IS_DUMMY","spawnSync","checkSSHConnection","ip","user","cmd","spawnSync","shell","stdio","status","chalk","join","spawnSync","chalk","unstakedKeyPath","join","SOLV_HOME","UNSTAKED_KEY","identityKeyPath","IDENTITY_KEY","changeIdentityIncomingV1toV2","__name","ip","pubkey","config","user","safe","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","validatorKeyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","checkValidatorKey","solanaClient","SOLANA_VALIDATOR","agaveClient","AGAVE_VALIDATOR","console","log","chalk","white","restartWindowCmd","LEDGER_PATH","spawnSync","shell","stdio","status","yellow","setIdentityCmd","IDENTITY_KEY_PATH","updateDefaultConfig","IS_DUMMY","SWITCH_TYPES","switchCommand","__name","program","config","command","option","description","action","options","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","isSafe","unsafe","keyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","user","pubkey","getSolanaAddress","switchType","ip","answer","inquirer","prompt","name","type","message","choices","default","includes","console","log","chalk","yellow","checkSSHConnection","v2MigrateIncoming","confirm","cyan","process","exit","white","changeIdentityIncomingV1toV2","changeIdentityIncoming","changeIdentityOutgoing","error","red","spawnSync","createSnapshot","__name","slot","ledgerPath","LEDGER_PATH","snapshotPath","SNAPSHOTS_PATH","cmd","console","log","result","spawnSync","shell","stdio","cwd","status","Error","error","createSnapshot_default","inquirer","dotenv","chalk","TokenInfo","SOL","tokenMint","associationAccount","decimal","USDC","elSOL","ELSOL_TOKEN_MINT","JitoSOL","mSOL","bSOL","EPCT","JUP","BONK","JTO","TokenInfoByMint","So11111111111111111111111111111111111111112","symbol","SOL_TOKEN_MINT","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","USDC_TOKEN_MINT","ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC","J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn","mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So","bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1","CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP","JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN","DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL","readFile","Connection","Keypair","VersionedTransaction","chalk","inquirer","dotenv","getJupiterQuote","__name","jupiterEndpoint","apiKey","inputMint","outputMint","inputAmountLamport","url","result","fetch","method","headers","Authorization","status","json","error","Error","getJupiterQuote_default","postJupiterSwap","__name","jupiterEndpoint","jupiterApiKey","quoteResponse","fromWalletPubkey","outputMint","swapBody","associationAccount","AssociationAccount","swapRequest","userPublicKey","feeAccount","dynamicComputeUnitLimit","prioritizationFeeLamports","dynamicSlippage","maxBps","url","result","fetch","method","headers","Authorization","body","JSON","stringify","status","json","error","Error","postJupiterSwap_default","dotenv","config","swap","__name","solanaRpcUrl","jupiterEndpoint","JupiterApiKey","keyfilePath","inputMint","outputMint","inputAmountLamport","isNeedConfirm","connection","Connection","quoteResponse","getJupiterQuote","includes","console","error","chalk","yellow","log","white","WEB_VALIDATORS_SOLUTIONS","process","exit","msg","inputTokneInfo","TokenInfoByMint","outputTokenInfo","symbol","Math","pow","decimal","Number","outAmount","gray","confirm","inquirer","prompt","type","name","message","default","cyan","fromWalletKey","JSON","parse","readFile","fromWallet","Keypair","fromSecretKey","Uint8Array","Array","from","swapResponse","postJupiterSwap","publicKey","toString","swapTransactionBuf","Buffer","swapTransaction","transaction","VersionedTransaction","deserialize","sign","rawTransaction","serialize","txid","sendRawTransaction","skipPreflight","maxRetries","blockhash","recentBlockhash","confirmTransaction","lastValidBlockHeight","signature","dotenv","config","swapCommand","__name","program","command","description","option","action","options","swapCmd","RPC_URL","KEYPAIR_PATH","API_KEY","input","output","Number","amount","skipConfirm","initConfig","error","message","includes","console","chalk","cyan","process","exit","red","solanaRpcUrl","keyfilePath","jupiterApiKey","inputMint","outputMint","inputAmountLamport","isNeedConfirm","log","white","askForConfig","jupiterEndpoint","JUPITER_ENDPOINT","inputTokenChoice","SWAP_TOKENS","inputTokenAdress","inputTokenSymbol","outputTokenAdress","inputAmount","inputToken","inquirer","prompt","type","name","choices","default","SOL_TOKEN_MINT","USDC_TOKEN_MINT","address","TokenInfo","tokenMint","filter","item","outputToken","ELSOL_MINT_ADDRESS","tokenName","inputAmountPrompt","txid","swap","SOLV_SWAP","green","askForConfig","__name","config","inquirer","prompt","type","name","message","default","updateDefaultConfig","console","log","chalk","green","rpcLog","spawnSync","jupiterStatus","__name","spawnSync","shell","stdio","spawnSync","jupiterStart","__name","spawnSync","shell","stdio","spawnSync","jupiterStop","__name","spawnSync","shell","stdio","spawnSync","jupiterRestart","__name","spawnSync","shell","stdio","spawnSync","jupiterLog","__name","error","spawnSync","shell","stdio","spawnSync","jupiterEnable","__name","spawnSync","shell","stdio","jupiterCommands","__name","jupiter","program","command","description","action","jupiterStatus","jupiterStart","jupiterStop","option","options","jupiterLog","error","process","exit","jupiterRestart","jupiterEnable","chalk","spawnSync","getSolanaVersion","__name","stdout","spawnSync","shell","String","trim","getSolanaVersion_default","program","Command","name","description","helpOption","version","VERSION","main","config","readConfig","startCommand","restartCommand","stopCommand","statusCommands","updateCommands","logCommands","installCommands","stakeCommands","getCommands","scpCommands","cronCommands","setupCommands","balanceCommands","mountCommands","relayerCommands","transferCommands","withdrawCommands","harvestCommands","dfCommands","swapCommand","epochTimerCommands","switchCommand","jupiterCommands","command","action","rmLogs","rmSnapshot","option","LEDGER_PATH","SNAPSHOTS_PATH","options","console","log","chalk","white","createSnapshot","slot","ledger","snapshots","alias","monitorSolana","solanaCatchup","showConfig","getSolanaVersion","addHelpCommand","parseAsync","process","argv","exit","error"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/lib/version.ts","../src/config/constants.ts","../src/cli/update/update.ts","../src/cli/install/installAgave.ts","../src/config/getSolanaCLI.ts","../src/cli/update/index.ts","../src/config/langs.ts","../src/config/config.ts","../src/cli/update/updateSolv.ts","../src/config/jitConfig.ts","../src/cli/update/jitoUpdate.ts","../src/lib/updateJitoSolvConfig.ts","../src/cli/update/updateCommission.ts","../src/cli/setup/updateFirewall.ts","../src/cli/epochTimer/getSolvVersion.ts","../src/config/readConfig.ts","../src/config/enums.ts","../src/config/versionConfig.ts","../src/config/defaultConfig.ts","../src/lib/sendDiscord.ts","../src/cli/update/autoUpdate/index.ts","../src/cli/epochTimer/isValidatorActive.ts","../src/lib/getSolanaAddress.ts","../src/lib/sleep.ts","../src/cli/update/autoUpdate/waitCatchup.ts","../src/config/updateDefaultConfig.ts","../src/locales/en/cmds.ts","../src/locales/ja/cmds.ts","../src/locales/en/logs.ts","../src/locales/ja/logs.ts","../src/locales/en/installer.ts","../src/locales/ja/installer.ts","../src/locales/en/subCmds.ts","../src/locales/ja/subCmds.ts","../src/locales/en/client.ts","../src/locales/ja/client.ts","../src/locales/readLocale.ts","../src/lib/readOrCreateDefaultConfig.ts","../src/lib/updateSolvConfig.ts","../src/cli/get/snapshot.ts","../src/cli/update/frankendancerUpdate.ts","../src/cli/setup/rmSnapshot.ts","../src/cli/log/tail.ts","../src/cli/log/index.ts","../src/cli/setup/index.ts","../src/cli/setup/setupVoteAccount.ts","../src/lib/createSolvKeys.ts","../src/cli/setup/template/jupiter/jupiterAPISetup.ts","../src/cli/setup/template/jupiter/jupiterAPIService.ts","../src/lib/readOrCreateJitoConfig.ts","../src/lib/daemonReload.ts","../src/cli/setup/question/initialConfigSetup.ts","../src/cli/setup/askJitoSetting.ts","../src/cli/install/installJito.ts","../src/template/startupScripts/startJitoRPCScript.ts","../src/cli/setup/rpc/index.ts","../src/cli/setup/updateStartupScriptPermission.ts","../src/template/startupScripts/startRPCNodeScript.ts","../src/cli/install/installSolana.ts","../src/template/startupScripts/startJitoMainnetScript.ts","../src/template/startupScripts/startJitoTestnetScript.ts","../src/template/startupScripts/startMainnetValidatorScript.ts","../src/template/startupScripts/startTestnetAgaveValidatorScript.ts","../src/cli/setup/validator/index.ts","../src/cli/setup/setupV2.ts","../src/lib/createDirectoryIfNotExists.ts","../src/cli/setup/mkdirs.ts","../src/cli/check/mt/getLargestDisk.ts","../src/cli/setup/formatDisk.ts","../src/cli/check/ensureMountAndFiles.ts","../src/cli/check/mt/umount.ts","../src/cli/setup/mount/mountDirs.ts","../src/cli/setup/userPermissions.ts","../src/cli/setup/setupSystemd.ts","../src/template/logRotates.ts","../src/cli/setup/setupLogrotate.ts","../src/template/solvService.ts","../src/cli/setup/setupSolvService.ts","../src/cli/setup/makeServices.ts","../src/cli/setup/setupKeys.ts","../src/cli/start/startSolana.ts","../src/cli/setup/setupCpuGovernor.ts","../src/template/updateSysctlConfig.ts","../src/lib/restartLogrotate.ts","../src/lib/enableSolv.ts","../src/cli/setup/createSymLink.ts","../src/utils/rpcLog.ts","../src/cli/setup/firedancer/setupFiredancer.ts","../src/cli/setup/firedancer/startFiredancerScript.ts","../src/cli/setup/template/firedancer/firedancerService.ts","../src/cli/setup/template/firedancer/configToml.ts","../src/cli/setup/template/firedancer/portRelayService.ts","../src/template/relayerService.ts","../src/cli/setup/jitoRelayerSetup.ts","../src/cli/setup/template/geyser/yellowstoneGeyser.ts","../src/cli/setup/template/geyser/geyserConfig.ts","../src/cli/setup/template/geyser/addConfigToStartupScript.ts","../src/cli/check/df/df.ts","../src/lib/logger/table.ts","../src/cli/check/df/index.ts","../src/cli/start/index.ts","../src/cli/stop/stopSolana.ts","../src/cli/stop/index.ts","../src/cli/restart/index.ts","../src/cli/install/index.ts","../src/cli/check/mt/index.ts","../src/cli/cron/index.ts","../src/cli/cron/hasEpochTimer.ts","../src/config/solvClient.ts","../src/cli/scp/download.ts","../src/cli/scp/executeSCP.ts","../src/cli/scp/upload.ts","../src/cli/scp/create.ts","../src/cli/scp/cat.ts","../src/cli/scp/init.ts","../src/cli/scp/search.ts","../src/cli/scp/index.ts","../src/cli/scp/uploadVS.ts","../src/cli/status/index.ts","../src/cli/stake/delegateStake.ts","../src/cli/stake/stakeAccountQuestion.ts","../src/cli/stake/createStakeAccount.ts","../src/cli/stake/deactivateStake.ts","../src/cli/stake/withdrawStake.ts","../src/cli/stake/index.ts","../src/lib/solana/getStakePoolInfo.ts","../src/lib/solana/getTokenAccount.ts","../src/cli/stake/selectLST.ts","../src/cli/stake/elSOLdeposit.ts","../src/lib/solana/getOrCreateDestinationAddress.ts","../src/lib/solana/depositSOL.ts","../src/cli/stake/depositLST.ts","../src/cli/cron/getEpoch.ts","../src/cli/cron/getSlot.ts","../src/lib/logger/logger.ts","../src/cli/get/showConfig.ts","../src/cli/get/index.ts","../src/cli/relayer/relayerStatus.ts","../src/cli/relayer/relayerStart.ts","../src/cli/relayer/relayerStop.ts","../src/cli/relayer/relayerRestart.ts","../src/cli/relayer/relayerLog.ts","../src/cli/relayer/index.ts","../src/cli/relayer/relayerEnable.ts","../src/lib/solana/splBalance.ts","../src/cli/balance/index.ts","../src/lib/getSolBalance.ts","../src/cli/setup/rmLogs.ts","../src/cli/get/monitorSolana.ts","../src/cli/get/solanaCatchup.ts","../src/cli/transfer/index.ts","../src/cli/withdraw/withdraw.ts","../src/cli/withdraw/index.ts","../src/cli/harvest/collectSOL.ts","../src/cli/harvest/getHarvestBalance.ts","../src/lib/solana/getBalance.ts","../src/lib/solana/loadKeypairFromFile.ts","../src/lib/solana/solanaTransfer.ts","../src/cli/harvest/index.ts","../src/lib/solana/getElSOLBalance.ts","../src/lib/solana/transferSPLToken.ts","../src/cli/harvest/mevOn.ts","../src/cli/cron/removeCronJob.ts","../src/lib/getEpochInfo.ts","../src/lib/getAverageSlotTime.ts","../src/cli/epochTimer/epochTimer.ts","../src/cli/epochTimer/writeEpochDataToFile.ts","../src/cli/epochTimer/lessThan1Day.ts","../src/cli/epochTimer/lessThan8Hour.ts","../src/cli/epochTimer/lessThan1Hour.ts","../src/cli/epochTimer/newEpoch.ts","../src/cli/epochTimer/initEpochFile.ts","../src/cli/epochTimer/checkBalance.ts","../src/cli/epochTimer/getNpmLatestVersion.ts","../src/cli/epochTimer/isVersionSame.ts","../src/lib/getEpochInfoByRust.ts","../src/cli/epochTimer/index.ts","../src/cli/switch/index.ts","../src/cli/switch/changeIdentityIncoming.ts","../src/lib/scpSSH.ts","../src/cli/switch/checkValidatorKey.ts","../src/config/getSolanaCLIActive.ts","../src/config/getSolanaCLIAgave.ts","../src/cli/switch/getRemoteClientType.ts","../src/cli/switch/getLocalClientType.ts","../src/cli/switch/changeIdentityOutgoing.ts","../src/cli/scp/checkSSHConnection.ts","../src/cli/switch/changeIdentityIncomingV1toV2.ts","../src/cli/get/createSnapshot.ts","../src/cli/swap/index.ts","../src/config/tokenInfo.ts","../src/cli/swap/swap.ts","../src/cli/swap/getJupiterQuote.ts","../src/cli/swap/postJupiterSwap.ts","../src/cli/jupiter/jupiterStatus.ts","../src/cli/jupiter/jupiterStart.ts","../src/cli/jupiter/jupiterStop.ts","../src/cli/jupiter/jupiterRestart.ts","../src/cli/jupiter/jupiterLog.ts","../src/cli/jupiter/jupiterEnable.ts","../src/cli/jupiter/index.ts","../src/cli/epochTimer/getSolanaVersion.ts"],"sourcesContent":["import 'dotenv/config'\nimport { Command } from 'commander'\nimport { VERSION } from '@/lib/version'\nimport {\n logCommands,\n startCommand,\n stopCommand,\n updateCommands,\n stakeCommands,\n setupCommands,\n restartCommand,\n installCommands,\n cronCommands,\n statusCommands,\n scpCommands,\n getCommands,\n mountCommands,\n relayerCommands,\n dfCommands,\n} from '@/cli'\nimport { balanceCommands } from './cli/balance'\nimport { rmLogs } from './cli/setup/rmLogs'\nimport { rmSnapshot } from './cli/setup/rmSnapshot'\nimport { monitorSolana } from './cli/get/monitorSolana'\nimport { solanaCatchup } from './cli/get/solanaCatchup'\nimport { showConfig } from './cli/get/showConfig'\nimport { transferCommands } from './cli/transfer'\nimport { withdrawCommands } from './cli/withdraw'\nimport { harvestCommands } from './cli/harvest'\nimport { epochTimerCommands } from './cli/epochTimer'\nimport { switchCommand } from './cli/switch'\nimport createSnapshot from './cli/get/createSnapshot'\nimport { swapCommand } from './cli/swap'\nimport readConfig from './config/readConfig'\nimport { jupiterCommands } from './cli/jupiter'\nimport chalk from 'chalk'\nimport getSolanaVersion from './cli/epochTimer/getSolanaVersion'\n\nexport const program = new Command()\nprogram\n .name('solv')\n .description(`🪄 solv - Solana Validator Tool ✨`)\n .helpOption('-h, --help', `Display help for command`)\n .version(VERSION, '-V', `Display version`)\n\nasync function main() {\n try {\n // This config will be new config file - solv4.config.json\n const config = await readConfig()\n\n startCommand(config)\n restartCommand(config)\n stopCommand(config)\n statusCommands(config)\n updateCommands(config)\n logCommands()\n installCommands(config)\n stakeCommands(config)\n getCommands(config)\n scpCommands()\n cronCommands()\n setupCommands(config)\n balanceCommands(config)\n mountCommands()\n relayerCommands()\n transferCommands(config)\n withdrawCommands(config)\n harvestCommands(config)\n dfCommands()\n swapCommand(program, config)\n epochTimerCommands(config)\n switchCommand(program, config)\n jupiterCommands()\n\n program\n .command('rm:log')\n .description('Remove Logs')\n .action(() => {\n rmLogs()\n })\n\n program\n .command('rm:snapshot')\n .description('Remove Snapshot')\n .action(() => {\n rmSnapshot(config)\n })\n\n program\n .command('create:snapshot')\n .description('Create Snapshot')\n .option('-s, --slot <slot>', 'Slot', '306450862')\n .option('-l, --ledger <ledger>', 'Ledger', config.LEDGER_PATH)\n .option('-n, --snapshots <snapshots>', 'Snapshots', config.SNAPSHOTS_PATH)\n .action((options: { slot: string; ledger: string, snapshots: string }) => {\n console.log(chalk.white(`📝 Creating Snapshot...`))\n createSnapshot(options.slot, options.ledger, options.snapshots)\n })\n\n program\n .command('monitor')\n .alias('m')\n .description('Monitor Solana Node')\n .action(() => {\n monitorSolana(config)\n })\n\n program\n .command('catchup')\n .description('Check Solana Catchup Status')\n .alias('c')\n .alias('ca')\n .action(() => {\n solanaCatchup()\n })\n\n program\n .command('config')\n .description('Show Solv Config')\n .action(() => {\n showConfig(config)\n })\n\n program\n .command('vv')\n .description('Show Solv Version')\n .action(() => {\n const version = getSolanaVersion()\n console.log('version:', version)\n })\n\n await program\n .addHelpCommand('help [cmd]', 'Display help for command')\n .parseAsync(process.argv)\n process.exit(0)\n } catch (error) {\n console.log(error)\n process.exit(0)\n }\n}\n\nmain()\n","{\n \"name\": \"@gabrielhicks/solv\",\n \"version\": \"5.3.16\",\n \"description\": \"Solana Validator CLI SOLV\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"repository\": \"https://github.com/gabrielhicks/solv\",\n \"keywords\": [\n \"solana\",\n \"validator\",\n \"cli\",\n \"validator-tool\",\n \"Node.js\",\n \"web3\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"author\": \"ELSOUL LABO B.V.\",\n \"private\": false,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"solv\": \"./dist/index.js\"\n },\n \"scripts\": {\n \"test\": \"vitest\",\n \"build\": \"tsup src/index.ts && npx tsx add-line.ts\",\n \"dev\": \"nodemon\",\n \"start\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@jup-ag/api\": \"6.0.27\",\n \"@metaplex-foundation/mpl-token-metadata\": \"3.2.1\",\n \"@metaplex-foundation/umi\": \"0.9.2\",\n \"@metaplex-foundation/umi-bundle-defaults\": \"0.9.2\",\n \"@skeet-framework/utils\": \"1.3.11\",\n \"@solana/spl-stake-pool\": \"1.1.5\",\n \"@solana/spl-token\": \"0.4.8\",\n \"@solana/web3.js\": \"1.95.4\",\n \"bigint-buffer\": \"1.1.5\",\n \"bn.js\": \"5.2.1\",\n \"bs58\": \"6.0.0\",\n \"chalk\": \"5.3.0\",\n \"chalk-pipe\": \"6.1.0\",\n \"cli-progress\": \"3.12.0\",\n \"cli-spinner\": \"0.2.10\",\n \"cli-table3\": \"0.6.5\",\n \"commander\": \"12.1.0\",\n \"dotenv\": \"16.4.5\",\n \"inquirer\": \"10.2.0\",\n \"node-fetch\": \"3.3.2\",\n \"prompt\": \"1.3.0\"\n },\n \"devDependencies\": {\n \"@changesets/changelog-github\": \"0.5.0\",\n \"@changesets/cli\": \"2.27.7\",\n \"@solana-developers/helpers\": \"^2.5.6\",\n \"@swc/core\": \"1.7.21\",\n \"@types/bn.js\": \"5.1.5\",\n \"@types/cli-progress\": \"3.11.6\",\n \"@types/cli-spinner\": \"0.2.3\",\n \"@types/inquirer\": \"9.0.7\",\n \"@types/node\": \"22.5.1\",\n \"@types/node-fetch\": \"2.6.11\",\n \"@types/prompt\": \"1.1.8\",\n \"@typescript-eslint/eslint-plugin\": \"8.3.0\",\n \"@typescript-eslint/parser\": \"8.3.0\",\n \"eslint\": \"9.9.1\",\n \"eslint-config-prettier\": \"9.1.0\",\n \"nodemon\": \"3.1.7\",\n \"prettier\": \"3.3.3\",\n \"tsup\": \"8.2.4\",\n \"typescript\": \"5.5.4\",\n \"vite\": \"5.4.2\",\n \"vite-tsconfig-paths\": \"5.0.1\",\n \"vitest\": \"2.0.5\"\n }\n}","import packageJson from '../../package.json'\n\nexport const VERSION = packageJson.version\n","// WEBSITE URL\nexport const WEB_VALIDATORS_DAO = 'https://dao.validators.solutions'\nexport const WEB_VALIDATORS_SOLUTIONS = 'https://validators.solutions'\n\n// solv config Path\nexport const SOLV_CONFIG_PATH = '~/solv.config.json'\nexport const SOLV_CONFIG_FILE = 'solv.config.json'\nexport const SOLV4_CONFIG_FILE = 'solv4.config.json'\n\n// Linux System Config Files\nexport const SOL_SERVICE = '/etc/systemd/system/solv.service'\nexport const SOL_LOGROTATE = '/etc/logrotate.d/solana'\nexport const SOL_SYSTEM_CONFIG21 = '/etc/sysctl.d/21-solana-validator.conf'\nexport const SOL_NOFILES_CONF = '/etc/security/limits.d/90-solana-nofiles.conf'\nexport const SOL_SYSTEM_CONF = '/etc/systemd/system.conf'\nexport const SOLANA_PATH = '/home/solv/.local/share/solana/install'\n\n// Solana Key Names\nexport const IDENTITY_KEY = 'identity.json'\nexport const UNSTAKED_KEY = 'unstaked-identity.json'\nexport const RELAYER_KEY = 'relayer-keypair.json'\nexport const MAINNET_VALIDATOR_KEY = 'mainnet-validator-keypair.json'\nexport const MAINNET_VALIDATOR_VOTE_KEY = 'mainnet-vote-account-keypair.json'\nexport const MAINNET_VALITATOR_AUTHORITY_KEY = 'mainnet-authority-keypair.json'\nexport const TESTNET_VALIDATOR_KEY = 'testnet-validator-keypair.json'\nexport const TESTNET_VALIDATOR_VOTE_KEY = 'testnet-vote-account-keypair.json'\nexport const TESTNET_VALITATOR_AUTHORITY_KEY = 'testnet-authority-keypair.json'\n\n// Validayor Key Paths\nexport const SOLV_HOME = '/home/solv'\nexport const IDENTITY_KEY_PATH = `${SOLV_HOME}/${IDENTITY_KEY}`\nexport const UNSTAKED_KEY_PATH = `${SOLV_HOME}/${UNSTAKED_KEY}`\nexport const MAINNET_VALIDATOR_KEY_PATH = `${SOLV_HOME}/${MAINNET_VALIDATOR_KEY}`\nexport const MAINNET_VALIDATOR_VOTE_KEY_PATH = `${SOLV_HOME}/${MAINNET_VALIDATOR_VOTE_KEY}`\nexport const MAINNET_VALITATOR_AUTHORITY_KEY_PATH = `${SOLV_HOME}/${MAINNET_VALITATOR_AUTHORITY_KEY}`\nexport const TESTNET_VALIDATOR_KEY_PATH = `${SOLV_HOME}/${TESTNET_VALIDATOR_KEY}`\nexport const TESTNET_VALIDATOR_VOTE_KEY_PATH = `${SOLV_HOME}/${TESTNET_VALIDATOR_VOTE_KEY}`\nexport const TESTNET_VALITATOR_AUTHORITY_KEY_PATH = `${SOLV_HOME}/${TESTNET_VALITATOR_AUTHORITY_KEY}`\n\n// Log Path\nexport const LOG_PATH = `${SOLV_HOME}/solana-validator.log`\n\n// Startup Script Path\nexport const STARTUP_SCRIPT = SOLV_HOME + '/start-validator.sh'\n\n// Ledger, Account, Snapshots Paths\nexport const LEDGER_PATH = '/mnt/ledger'\nexport const ACCOUNTS_PATH = '/mnt/accounts'\nexport const SNAPSHOTS_PATH = '/mnt/snapshots'\n\n// SOLANA VALIDATOR CLI\nexport const SOLANA_VALIDATOR = 'solana-validator'\nexport const AGAVE_VALIDATOR = 'agave-validator'\n\nexport const DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY =\n 'ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG'\n\nexport const EPOCH_TIMER_FILE_PATH = '/home/solv/currentEpoch.json'\nexport const MINIMUM_VALIDATOR_BALANCE = 0.5\nexport const MAX_RETRIES = 3\n\n// Endpoint\nexport const SOLANA_TESTNET_RPC_URL = 'https://api.testnet.solana.com'\nexport const SOLANA_MAINNET_RPC_URL = 'https://api.mainnet-beta.solana.com'\nexport const VS_UPLOAD_ENDPOINT =\n 'https://verify.validators.solutions/solv-migrate'\nexport const JUPITER_ENDPOINT = 'https://jup.validators.solutions/v1/jup'\n\nexport enum SWAP_TOKEN {\n SOL = 'SOL',\n USDC = 'USDC',\n elSOL = 'elSOL',\n JitoSOL = 'JitoSOL',\n mSOL = 'mSOL',\n bSOL = 'bSOL',\n EPCT = 'EPCT',\n JUP = 'JUP',\n BONK = 'BONK',\n JTO = 'JTO',\n}\n\nexport const SWAP_TOKENS = Object.values(SWAP_TOKEN)\n\n// SPL Token Mint\nexport const SOL_TOKEN_MINT = 'So11111111111111111111111111111111111111112'\nexport const USDC_TOKEN_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'\nexport const ELSOL_TOKEN_MINT = 'ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC'\nexport const EPCT_TOKEN_MINT = 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP'\nexport const SOLV_SWAP = 'SOLV420'\n\nexport const AssociationAccount = {\n So11111111111111111111111111111111111111112:\n '4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra',\n EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:\n 'J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj',\n J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:\n 'HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a',\n mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:\n '8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9',\n bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:\n '782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH',\n CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:\n 'BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB',\n JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:\n '212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg',\n DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:\n '61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U',\n jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:\n '2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo',\n}\n","import { LEDGER_PATH } from '@/config/constants'\nimport { spawnSync } from 'child_process'\nimport installAgave from '../install/installAgave'\nimport getSolanaCLI from '@/config/getSolanaCLI'\n\nexport const updateVersion = async (version: string, mod = false) => {\n installAgave(version, mod)\n return\n}\n\nexport const monitorUpdate = async (\n maxDelinquentStake: number,\n noMonitor = false,\n minIdleTime = 10,\n) => {\n const solanaValidatorClient = getSolanaCLI()\n let cmd = `${solanaValidatorClient} --ledger ${LEDGER_PATH} exit --max-delinquent-stake ${maxDelinquentStake} --monitor --min-idle-time ${minIdleTime}`\n if (noMonitor) {\n cmd = `${solanaValidatorClient} --ledger ${LEDGER_PATH} exit --max-delinquent-stake ${maxDelinquentStake} --min-idle-time ${minIdleTime}`\n }\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\n// Agave Install e.g. installAgave('0.1.0')\nconst installAgave = (version: string, mod = false) => {\n if(mod) {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${version}-agave-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${version}-agave-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/${version}-agave-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${version}-agave-mod checkout ${version}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git -C /tmp/${version}-agave-mod submodule update --init --recursive`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${version}-agave-mod rev-parse HEAD) /tmp/${version}-agave-mod/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${version}-agave-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${version}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${version}-agave-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n } else {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${version}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${version} checkout ${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${version} submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${version} rev-parse HEAD) /tmp/${version}/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${version}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${version}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n spawnSync(`sudo rm -rf /tmp/${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n}\n\nexport default installAgave\n","const AGAVE_CLI = 'agave-validator'\n\nconst getSolanaCLI = () => {\n try {\n return AGAVE_CLI\n } catch (error) {\n console.error(error)\n return AGAVE_CLI\n }\n}\nexport default getSolanaCLI\n","import { program } from '@/index'\nimport { monitorUpdate, updateVersion } from './update'\nimport chalk from 'chalk'\nimport { updateSolv } from './updateSolv'\nimport { jitoUpdate } from './jitoUpdate'\nimport { updateJitoSolvConfig } from '@/lib/updateJitoSolvConfig'\nimport { updateCommission, updateCommissionAsk } from './updateCommission'\nimport { updateFirewall } from '../setup/updateFirewall'\nimport autoUpdate from './autoUpdate'\nimport getSolvVersion from '../epochTimer/getSolvVersion'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport {\n MNT_DISK_TYPE,\n Network,\n NodeType,\n RpcType,\n ValidatorType,\n} from '@/config/enums'\nimport {\n DELINQUENT_STAKE_MAINNET,\n DELINQUENT_STAKE_TESTNET,\n VERSION_FIREDANCER,\n VERSION_FIREDANCER_TESTNET,\n VERSION_JITO_MAINNET,\n VERSION_JITO_RPC,\n VERSION_JITO_TESTNET,\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport { readOrCreateDefaultConfig } from '@/lib/readOrCreateDefaultConfig'\nimport { MAINNET_TYPES, NETWORK_TYPES, SOLV_TYPES } from '@/config/config'\nimport { getSnapshot } from '../get/snapshot'\nimport { frankendancerUpdate } from './frankendancerUpdate'\nimport { rmSnapshot } from '../setup/rmSnapshot'\n\nexport * from './update'\n\nexport type UpdateOptions = {\n version: string\n background: boolean\n commission: number\n firewall: boolean\n config: boolean\n migrateConfig: boolean\n auto: boolean\n mod: boolean\n}\n\nexport const updateCommands = (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n const isJito = config.VALIDATOR_TYPE === ValidatorType.JITO\n const isFrankendancer = config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n const isAutoRestart = config.AUTO_RESTART\n const isModded = config.MOD\n let minIdleTime = 10\n if (isAutoRestart && !isTestnet) {\n minIdleTime = 30\n }\n let version = isTestnet ? VERSION_TESTNET : VERSION_MAINNET\n if (isJito) {\n version = VERSION_JITO_MAINNET\n if (isTestnet) {\n version = VERSION_JITO_TESTNET\n }\n }\n if (isFrankendancer) {\n version = VERSION_FIREDANCER\n if(isTestnet) {\n version = VERSION_FIREDANCER_TESTNET\n }\n }\n if (isRPC) {\n version = VERSION_SOLANA_RPC\n if (isJito) {\n version = VERSION_JITO_RPC\n }\n }\n program\n .command('update')\n .alias('u')\n .description('Update Command')\n .option('-v, --version <version>', `Solana Version e.g ${version}`, version)\n .option('-b, --background', 'No Monitor Delinquent Stake Update', false)\n .option('-c, --commission', 'Update Commission', false)\n .option('-f, --firewall', 'Update Firewall', false)\n .option('--migrate-config', 'Migrate Solv Config', false)\n .option('--config', 'Update Solv Config Default Solana Version', false)\n .option('--auto', 'Auto Update', false)\n .option('--mod', 'Modified Versions', false)\n .action(async (options: UpdateOptions) => {\n const solvVersion = getSolvVersion()\n const deliquentStake = isTestnet\n ? config.TESTNET_DELINQUENT_STAKE\n : config.MAINNET_DELINQUENT_STAKE\n console.log(chalk.white(`Current solv version: ${solvVersion}`))\n\n // Auto Update\n if (options.auto) {\n await autoUpdate(config)\n return\n }\n\n if (options.migrateConfig) {\n // Temporarily!!\n // Migrate solv.config.json to solv4.config.json\n const oldConfig = readOrCreateDefaultConfig().config\n let diskType = MNT_DISK_TYPE.TRIPLE\n if (oldConfig.DISK_TYPES === 0) {\n diskType = MNT_DISK_TYPE.DOUBLE\n } else if (oldConfig.DISK_TYPES === 1) {\n diskType = MNT_DISK_TYPE.SINGLE\n } else {\n diskType = MNT_DISK_TYPE.TRIPLE\n }\n const isTestnetOld =\n oldConfig.SOLANA_NETWORK === NETWORK_TYPES.TESTNET\n const isRPCOld = oldConfig.SOLV_TYPE === SOLV_TYPES.RPC_NODE\n const isJitoOld = oldConfig.MAINNET_TYPE === MAINNET_TYPES.JITO_MEV\n const newConfigBody: DefaultConfigType = {\n NETWORK: isTestnetOld ? Network.TESTNET : Network.MAINNET,\n NODE_TYPE: isRPCOld ? NodeType.RPC : NodeType.VALIDATOR,\n MNT_DISK_TYPE: diskType,\n RPC_TYPE: isRPCOld ? RpcType.JITO : RpcType.NONE,\n VALIDATOR_TYPE: isJitoOld\n ? ValidatorType.JITO\n : isTestnetOld\n ? ValidatorType.AGAVE\n : ValidatorType.SOLANA,\n TESTNET_SOLANA_VERSION: oldConfig.TESTNET_SOLANA_VERSION,\n MAINNET_SOLANA_VERSION: oldConfig.MAINNET_SOLANA_VERSION,\n NODE_VERSION: oldConfig.NODE_VERSION,\n TESTNET_DELINQUENT_STAKE: oldConfig.TESTNET_DELINQUENT_STAKE,\n MAINNET_DELINQUENT_STAKE: oldConfig.MAINNET_DELINQUENT_STAKE,\n COMMISSION: oldConfig.COMMISSION,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:\n oldConfig.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,\n STAKE_ACCOUNTS: oldConfig.STAKE_ACCOUNT,\n HARVEST_ACCOUNT: oldConfig.HARVEST_ACCOUNT,\n IS_MEV_MODE: oldConfig.IS_MEV_MODE,\n RPC_URL: oldConfig.RPC_URL,\n KEYPAIR_PATH: oldConfig.KEYPAIR_PATH,\n DISCORD_WEBHOOK_URL: oldConfig.DISCORD_WEBHOOK_URL,\n AUTO_UPDATE: oldConfig.AUTO_UPDATE,\n AUTO_RESTART: oldConfig.AUTO_RESTART,\n IS_DUMMY: false,\n API_KEY: '',\n LEDGER_PATH: oldConfig.LEDGER_PATH,\n ACCOUNTS_PATH: '/mnt/accounts',\n SNAPSHOTS_PATH: '/mnt/snapshots',\n MOD: false\n }\n\n await updateDefaultConfig(newConfigBody)\n // --- End of Temporarily!!\n }\n if (options.config) {\n await updateDefaultConfig({\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n })\n if (isJito) {\n const jitoVersion = isTestnet\n ? VERSION_JITO_TESTNET\n : VERSION_JITO_MAINNET\n await updateJitoSolvConfig({\n version: jitoVersion,\n tag: `v${jitoVersion}`,\n })\n }\n console.log(\n chalk.green(\n '✔️ Updated Solv Config Default Solana Version\\n\\n You can now run `solv i` to install the latest version',\n ),\n )\n return\n }\n if (options.firewall) {\n await updateFirewall()\n return\n }\n\n if (options.background) {\n let version = options.version\n await updateDefaultConfig({\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n })\n rmSnapshot(config)\n if (isJito) {\n jitoUpdate(`v${version}`, options.mod || isModded)\n await updateJitoSolvConfig({ version, tag: `v${version}` })\n await monitorUpdate(deliquentStake, true, minIdleTime)\n return\n }\n\n if(isTestnet) {\n getSnapshot(isTestnet, '10', config.SNAPSHOTS_PATH, VERSION_TESTNET)\n }\n\n if (isFrankendancer) {\n await frankendancerUpdate(config, version, options.mod || isModded)\n await monitorUpdate(deliquentStake, true, minIdleTime)\n return\n }\n\n await updateVersion(version, options.mod || isModded)\n const deliquentStakeNum = isTestnet\n ? DELINQUENT_STAKE_TESTNET\n : DELINQUENT_STAKE_MAINNET\n\n await monitorUpdate(deliquentStakeNum, true, minIdleTime)\n return\n } else if (options.commission) {\n const ansewr = await updateCommissionAsk()\n updateCommission(ansewr.commission, isTestnet)\n } else {\n updateSolv()\n }\n })\n}\n","export enum LANGS {\n EN = 'en',\n JA = 'ja',\n}\n","import { LANGS } from './langs'\n\nexport enum DISK_TYPES {\n DOUBLE,\n SINGLE,\n TRIPLE,\n}\n\nexport enum MOUNT_TYPES {\n SINGLE = 'single',\n DOUBLE = 'double',\n TRIPLE = 'triple',\n}\n\nexport enum NETWORK_TYPES {\n MAINNET = 'mainnet-beta',\n TESTNET = 'testnet',\n}\n\nexport enum NODE_TYPES {\n VALIDATOR = 'validator',\n RPC = 'rpc',\n}\n\nexport enum SOLANA_CLIENTS {\n SOLANA = 'solana',\n JITO = 'jito',\n AGAVE = 'agave',\n FIREDANCER = 'firedancer',\n}\n\nexport enum JITO_TYPES {\n CO_HOST_RELAYER = 'co-host-relayer',\n SEPARATED_RELAYER = 'separated-relayer',\n WITHOUT_RELAYER = 'without-relayer',\n}\n\nexport enum FIREDANCER_TYPES {\n FIREDANCER = 'firedancer',\n FRANKENDANCER = 'frankendancer',\n}\n\nexport enum SOLV_TYPES {\n TESTNET_VALIDATOR,\n MAINNET_VALIDATOR,\n RPC_NODE,\n}\n\nexport const RPC_MODE = ['SOLANA_RPC', 'JITO_RPC']\n\nexport enum MAINNET_TYPES {\n SOLANA_CLIENT = 'SolanaClient',\n JITO_MEV = 'JitoMev',\n FIREDANCER = 'Firedancer',\n}\n\n// ⚠️ Please DO NOT forget to turn this to false if restart is not needed\nexport const NODE_RESTART_REQUIRED_MAINNET = false\nexport const NODE_RESTART_REQUIRED_TESTNET = true\nexport const FD_RESTART_REQUIRED_MAINNET = false\nexport const FD_RESTART_REQUIRED_TESTNET = false\n\nexport type CONFIG_TYPE = {\n ID: string\n LANG: LANGS\n USERNAME: string\n TESTNET_SOLANA_VERSION: string\n MAINNET_SOLANA_VERSION: string\n NODE_VERSION: string\n TESTNET_DELINQUENT_STAKE: number\n MAINNET_DELINQUENT_STAKE: number\n COMMISSION: number\n SOLANA_NETWORK: NETWORK_TYPES\n SOLV_TYPE: SOLV_TYPES\n DISK_TYPES: DISK_TYPES\n IS_SETUP: boolean\n LANG_SETUP: boolean\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY: string\n IS_CLIENT: boolean\n VALIDATOR_IPS: string[]\n MAINNET_TYPE: MAINNET_TYPES\n LEDGER_PATH: string\n STAKE_ACCOUNT: string[]\n HARVEST_ACCOUNT: string\n IS_MEV_MODE: boolean\n RPC_URL: string\n KEYPAIR_PATH: string\n DISCORD_WEBHOOK_URL: string\n AUTO_UPDATE: boolean\n AUTO_RESTART: boolean\n ACCOUNTS_PATH: string\n SNAPSHOTS_PATH: string\n MOD: boolean\n}\n\nexport type PartialConfigType = Partial<CONFIG_TYPE>\n\nexport const CONFIG: CONFIG_TYPE = {\n ID: 'solv',\n LANG: LANGS.EN,\n USERNAME: 'solv',\n TESTNET_SOLANA_VERSION: '3.0.0',\n MAINNET_SOLANA_VERSION: '2.3.7',\n NODE_VERSION: '20.17.0',\n TESTNET_DELINQUENT_STAKE: 5,\n MAINNET_DELINQUENT_STAKE: 5,\n COMMISSION: 5,\n SOLANA_NETWORK: NETWORK_TYPES.TESTNET,\n SOLV_TYPE: SOLV_TYPES.TESTNET_VALIDATOR,\n DISK_TYPES: DISK_TYPES.SINGLE,\n IS_SETUP: false,\n LANG_SETUP: false,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:\n 'ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG',\n IS_CLIENT: false,\n VALIDATOR_IPS: [],\n MAINNET_TYPE: MAINNET_TYPES.SOLANA_CLIENT,\n LEDGER_PATH: '/mnt/ledger',\n STAKE_ACCOUNT: [],\n HARVEST_ACCOUNT: '',\n IS_MEV_MODE: false,\n RPC_URL: 'https://mainnet-beta.solana.com',\n KEYPAIR_PATH: '/home/solv/testnet-validator-keypair.json',\n DISCORD_WEBHOOK_URL: '',\n AUTO_UPDATE: false,\n AUTO_RESTART: false,\n ACCOUNTS_PATH: '/mnt/accounts',\n SNAPSHOTS_PATH: '/mnt/snapshots',\n MOD: false\n}\n\nexport const HOME_PATHS = {\n ROOT: '/home/solv',\n AUTHORIZED_KEYS: '/home/solv/.ssh/authorized_keys',\n}\n\nexport const MT_PATHS = {\n ROOT: '/mnt',\n ACCOUNTS: '/mnt/accounts',\n LEDGER: '/mnt/ledger',\n SNAPSHOTS: '/mnt/snapshots',\n}\n\nexport const FILES = {\n LOG: 'solana-validator.log',\n STARTUP_SCRIPT: 'start-validator.sh',\n CONFIG: 'solv.config.json',\n JITO_CONFIG: 'jito.config.json',\n}\n\nexport const SERVICE_PATHS = {\n SOL_SERVICE: '/etc/systemd/system/solv.service',\n SOL_LOGROTATE: '/etc/logrotate.d/solana',\n FRANKENDANCER_LOGROTATE: '/etc/logrotate.d/frankendancer',\n SOL_SYSTEM_CONFIG21: '/etc/sysctl.d/21-solana-validator.conf',\n SOL_NOFILES_CONF: '/etc/security/limits.d/90-solana-nofiles.conf',\n SOL_SYSTEM_CONF: '/etc/systemd/system.conf',\n SOLANA_PATH: '/home/solv/.local/share/solana/install',\n}\n\nexport const KEYPAIRS = {\n MAINNET_VALIDATOR_KEY: 'mainnet-validator-keypair.json',\n MAINNET_VALIDATOR_VOTE_KEY: 'mainnet-vote-account-keypair.json',\n MAINNET_VALITATOR_AUTHORITY_KEY: 'mainnet-authority-keypair.json',\n TESTNET_VALIDATOR_KEY: 'testnet-validator-keypair.json',\n TESTNET_VALIDATOR_VOTE_KEY: 'testnet-vote-account-keypair.json',\n TESTNET_VALITATOR_AUTHORITY_KEY: 'testnet-authority-keypair.json',\n}\n\nexport const getAllKeyPaths = (path = HOME_PATHS.ROOT) => {\n const rootDir = path === HOME_PATHS.ROOT ? HOME_PATHS.ROOT : path\n const mainnetValidatorKey = `${rootDir}/${KEYPAIRS.MAINNET_VALIDATOR_KEY}`\n const mainnetValidatorVoteKey = `${rootDir}/${KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY}`\n const mainnetValidatorAuthorityKey = `${rootDir}/${KEYPAIRS.MAINNET_VALITATOR_AUTHORITY_KEY}`\n const testnetValidatorKey = `${rootDir}/${KEYPAIRS.TESTNET_VALIDATOR_KEY}`\n const testnetValidatorVoteKey = `${rootDir}/${KEYPAIRS.TESTNET_VALIDATOR_VOTE_KEY}`\n const testnetValidatorAuthorityKey = `${rootDir}/${KEYPAIRS.TESTNET_VALITATOR_AUTHORITY_KEY}`\n return {\n mainnetValidatorKey,\n mainnetValidatorVoteKey,\n mainnetValidatorAuthorityKey,\n testnetValidatorKey,\n testnetValidatorVoteKey,\n testnetValidatorAuthorityKey,\n }\n}\n\nexport const startupScriptPaths = (isTest = true) => {\n const identity = isTest\n ? `${HOME_PATHS.ROOT}/${KEYPAIRS.TESTNET_VALIDATOR_KEY}`\n : `${HOME_PATHS.ROOT}/${KEYPAIRS.MAINNET_VALIDATOR_KEY}`\n const voteAccount = isTest\n ? `${HOME_PATHS.ROOT}/${KEYPAIRS.TESTNET_VALIDATOR_VOTE_KEY}`\n : `${HOME_PATHS.ROOT}/${KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY}`\n const log = `${HOME_PATHS.ROOT}/${FILES.LOG}`\n const accounts = MT_PATHS.ACCOUNTS\n const ledger = MT_PATHS.LEDGER\n const snapshots = MT_PATHS.SNAPSHOTS\n const scriptPath = `${HOME_PATHS.ROOT}/${FILES.STARTUP_SCRIPT}`\n return {\n identity,\n voteAccount,\n log,\n accounts,\n ledger,\n scriptPath,\n snapshots,\n }\n}\n\nexport const SOLV_DISCORD_INVITE = 'https://discord.gg/y8tCMzPU9Y'\nexport const DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY =\n '76DafWkJ6pGK2hoD41HjrM4xTBhfKqrDYDazv13n5ir1'\nexport const SOLV_STAKE_POOL_ADDRESS =\n 'So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5'\nexport const SOLV_ELSOL_ACCOUNT_ADDRESS =\n '7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv'\nexport const SOLV_POOL_MANAGER_ADDRESS =\n 'EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV'\nexport const ELSOL_DECIMALS = 9\n\n// Token Mint Addresses\nexport const ELSOL_MINT_ADDRESS = 'ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC'\nexport const SOL_MINT_ADDRESS = 'So11111111111111111111111111111111111111112'\nexport const USDC_MINT_ADDRESS = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'\nexport const EPCT_MINT_ADDRESS = 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP'\n\nexport enum TOKEN_MINT_ADDRESS {\n ELSOL = ELSOL_MINT_ADDRESS,\n SOL = SOL_MINT_ADDRESS,\n USDC = USDC_MINT_ADDRESS,\n EPCT = EPCT_MINT_ADDRESS,\n}\n\nexport enum JUP_URL {\n V6_BASE_URL = 'https://quote-api.jup.ag/v6',\n V6_QUOTE_URL = V6_BASE_URL + '/quote',\n V6_SWAP_URL = V6_BASE_URL + '/swap',\n}\n\nexport const DECIMALS = {\n [SOL_MINT_ADDRESS]: 9,\n [ELSOL_MINT_ADDRESS]: 9,\n [USDC_MINT_ADDRESS]: 6,\n [EPCT_MINT_ADDRESS]: 6,\n}\n\nexport const EPOCH_TIMER_FILE_PATH = '/home/solv/currentEpoch.json'\nexport const MINIMUM_VALIDATOR_BALANCE = 0.5\nexport const SOLANA_TESTNET_RPC_URL = 'https://api.testnet.solana.com'\n","import { CONFIG } from '@/config/config'\nimport { spawnSync } from 'child_process'\n\nexport const updateSolv = () => {\n spawnSync('pnpm add -g pnpm', { shell: true, stdio: 'inherit' })\n const nodeVersion = CONFIG.NODE_VERSION\n spawnSync(`pnpm env use ${nodeVersion} --global`, {\n shell: true,\n stdio: 'inherit',\n })\n const cmd = `pnpm add -g @gabrielhicks/solv`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","export interface JitoConfig {\n version: string\n tag: string\n commissionBps: number\n relayerUrl: string\n blockEngineUrl: string\n shredReceiverAddr: string\n hasRelayer?: boolean\n}\n\nexport const JITO_CONFIG: JitoConfig = {\n version: '2.3.6',\n tag: 'v2.3.6',\n commissionBps: 1000,\n relayerUrl: 'http://frankfurt.mainnet.relayer.jito.wtf:8100',\n blockEngineUrl: 'https://frankfurt.mainnet.block-engine.jito.wtf',\n shredReceiverAddr: '64.130.50.14:1002',\n}\n\nexport const JITO_REGIONS = {\n TESTNET: {\n Dallas: {\n BLOCK_ENGINE_URL: 'https://dallas.testnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://dallas.testnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '141.98.218.12:1002',\n },\n NewYork: {\n BLOCK_ENGINE_URL: 'https://ny.testnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://ny.testnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.35.224:1002',\n },\n },\n MAINNET: {\n Amsterdam: {\n BLOCK_ENGINE_URL: 'https://amsterdam.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://amsterdam.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '74.118.140.240:1002',\n },\n London: {\n BLOCK_ENGINE_URL: 'https://london.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://london.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '142.91.127.175:1002',\n },\n Frankfurt: {\n BLOCK_ENGINE_URL: 'https://frankfurt.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://frankfurt.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.50.14:1002',\n },\n NewYork: {\n BLOCK_ENGINE_URL: 'https://ny.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://ny.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '141.98.216.96:1002',\n },\n Tokyo: {\n BLOCK_ENGINE_URL: 'https://tokyo.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://tokyo.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '202.8.9.160:1002',\n },\n SaltLakeCity: {\n BLOCK_ENGINE_URL: 'https://slc.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://slc.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.53.8:1002',\n },\n Singapore: {\n BLOCK_ENGINE_URL: 'https://singapore.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://singapore.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '202.8.11.224:1002',\n },\n },\n}\n","import { JITO_CONFIG } from '@/config/jitConfig'\nimport { spawnSync } from 'child_process'\n\nexport const jitoUpdate = (tag = JITO_CONFIG.tag, mod = false) => {\n if (mod) {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/gabrielhicks/jito-solana.git --recurse-submodules /tmp/${tag}-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag}-mod checkout ${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag}-mod submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag}-mod rev-parse HEAD) /tmp/${tag}-mod/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}-mod`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}-mod`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`solv get snapshot`, {\n shell: true,\n stdio: 'inherit',\n })\n } else {\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${tag}-jito`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag}-jito checkout ${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag}-jito submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag}-jito rev-parse HEAD) /tmp/${tag}-jito/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}-jito`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}-jito`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`solv get snapshot`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n}\n","import { FILES } from '@/config/config'\nimport { JitoConfig } from '@/config/jitConfig'\nimport { readFile, writeFile } from 'fs/promises'\nimport { homedir } from 'os'\nexport const updateJitoSolvConfig = async (config: Partial<JitoConfig>) => {\n // update ~/jito.config.json with new values\n const homeDir = homedir()\n const solvConfigFile = `${homeDir}/${FILES.JITO_CONFIG}`\n const solvConfig = JSON.parse(\n await readFile(solvConfigFile, 'utf8'),\n ) as JitoConfig\n // unique values\n const updatedConfig: JitoConfig = {\n ...solvConfig,\n ...config,\n }\n const updatedConfigString = JSON.stringify(updatedConfig, null, 2)\n await writeFile(solvConfigFile, updatedConfigString)\n console.log(`Updated ${solvConfigFile} with new values.`)\n}\n","import { spawnSync } from 'child_process'\nimport inquirer from 'inquirer'\n\nexport const updateCommission = (commission: number, isTest = true) => {\n const validatorKeypair = isTest\n ? '/home/solv/testnet-validator-keypair.json'\n : '/home/solv/mainnet-validator-keypair.json'\n const voteAccountKeypair = isTest\n ? '/home/solv/testnet-vote-account-keypair.json'\n : '/home/solv/mainnet-vote-account-keypair.json'\n const network = isTest ? 'testnet' : 'mainnet-beta'\n spawnSync(\n `solana config set --url ${network} --keypair ${validatorKeypair}`,\n { shell: true, stdio: 'inherit' },\n )\n const cmd = `solana vote-update-commission ${voteAccountKeypair} ${commission} ${validatorKeypair} --keypair ${validatorKeypair}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n\nexport type UpdateCommissionAsk = {\n commission: number\n}\n\nexport const updateCommissionAsk = async () => {\n const ansewr = await inquirer.prompt<UpdateCommissionAsk>([\n {\n type: 'number',\n name: 'commission',\n message: 'Enter new commission',\n default: 7,\n },\n ])\n return ansewr\n}\n","import { execAsync } from '@skeet-framework/utils'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\n\nexport const updateFirewall = async () => {\n const answer = await inquirer.prompt<{ ip: string; isRelayer: boolean }>([\n {\n name: 'ip',\n type: 'input',\n message: 'Enter your IP address to allow access to RPC NODE:',\n default: '1.2.3.4',\n },\n ])\n await execAsync(`sudo ufw delete allow 8899/udp`)\n await execAsync(`sudo ufw delete allow 8899/tcp`)\n await execAsync(`sudo ufw allow from ${answer.ip} to any port 8899 proto tcp`)\n await execAsync(`sudo ufw allow from ${answer.ip} to any port 8899 proto udp`)\n await execAsync(`sudo ufw reload`)\n console.log(chalk.white('✔️ Firewall updated!'))\n}\n","import * as packageJson from '../../../package.json'\n\nconst getSolvVersion = () => {\n const version = packageJson.version\n return version\n}\n\nexport default getSolvVersion\n","import { readFile, writeFile } from 'fs/promises'\nimport { SOLV4_CONFIG_FILE } from '@/config/constants'\nimport { existsAsync } from '@skeet-framework/utils'\nimport DEFAULT_CONFIG from '@/config/defaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { homedir } from 'os'\n\nconst readConfig = async () => {\n const homeDir = homedir()\n const configPath = `${homeDir}/${SOLV4_CONFIG_FILE}`\n if (!(await existsAsync(configPath))) {\n // create default config\n console.log('Creating default config file at', configPath)\n await writeFile(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2))\n return DEFAULT_CONFIG\n }\n const config = JSON.parse(\n await readFile(configPath, 'utf-8'),\n ) as DefaultConfigType\n return config\n}\n\nexport default readConfig\n","export enum LANG {\n EN = 'en',\n JA = 'ja',\n}\n\nexport const LANGS = Object.values(LANG)\n\nexport enum Network {\n MAINNET = 'mainnet-beta',\n // DEVNET = 'devnet',\n TESTNET = 'testnet',\n}\n\nexport const NETWORK_TYPES = Object.values(Network)\n\nexport enum NodeType {\n RPC = 'rpc',\n VALIDATOR = 'validator',\n}\n\nexport const NODE_TYPES = Object.values(NodeType)\n\nexport enum ValidatorType {\n SOLANA = 'solana',\n AGAVE = 'agave',\n JITO = 'jito',\n FRANKENDANCER = 'frankendancer',\n // FIREDANCER = 'firedancer',\n NONE = 'none',\n}\n\nexport const SOLANA_CLIENTS = Object.values(ValidatorType).filter(\n (type) => type !== ValidatorType.NONE,\n)\n\nexport enum RpcType {\n AGAVE = 'agave',\n JITO = 'jito',\n NONE = 'none',\n}\n\nexport const RPC_MODE = Object.values(RpcType).filter(\n (type) => type !== RpcType.NONE,\n)\n\nexport enum MNT_DISK_TYPE {\n SINGLE = 'single',\n DOUBLE = 'double',\n TRIPLE = 'triple',\n}\n","export const VERSION_TESTNET = '3.0.0'\nexport const VERSION_MAINNET = '2.3.7'\nexport const VERSION_JITO_TESTNET = '3.0.0'\nexport const VERSION_JITO_MAINNET = '2.3.7'\nexport const VERSION_JITO_RPC = '2.3.7'\nexport const VERSION_SOLANA_RPC = '2.3.7'\nexport const DELINQUENT_STAKE_TESTNET = 10\nexport const DELINQUENT_STAKE_MAINNET = 5\nexport const COMMISSION = 5\nexport const VERSION_NODE = '20.17.0'\nexport const VERSION_FIREDANCER_TESTNET = '0.707.20306'\nexport const VERSION_FIREDANCER = '0.707.20306'\n","import { DefaultConfigType } from '@/config/types'\nimport {\n MNT_DISK_TYPE,\n NodeType,\n Network,\n ValidatorType,\n RpcType,\n} from '@/config/enums'\nimport {\n COMMISSION,\n DELINQUENT_STAKE_MAINNET,\n DELINQUENT_STAKE_TESTNET,\n VERSION_MAINNET,\n VERSION_NODE,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport {\n ACCOUNTS_PATH,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,\n LEDGER_PATH,\n SNAPSHOTS_PATH,\n SOLANA_MAINNET_RPC_URL,\n} from '@/config/constants'\n\nconst DEFAULT_CONFIG: DefaultConfigType = {\n NETWORK: Network.TESTNET,\n NODE_TYPE: NodeType.RPC,\n VALIDATOR_TYPE: ValidatorType.NONE,\n RPC_TYPE: RpcType.AGAVE,\n MNT_DISK_TYPE: MNT_DISK_TYPE.TRIPLE,\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n NODE_VERSION: VERSION_NODE,\n TESTNET_DELINQUENT_STAKE: DELINQUENT_STAKE_TESTNET,\n MAINNET_DELINQUENT_STAKE: DELINQUENT_STAKE_MAINNET,\n COMMISSION: COMMISSION,\n DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY: DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,\n STAKE_ACCOUNTS: [],\n HARVEST_ACCOUNT: '',\n IS_MEV_MODE: false,\n RPC_URL: SOLANA_MAINNET_RPC_URL,\n KEYPAIR_PATH: '',\n DISCORD_WEBHOOK_URL: '',\n AUTO_UPDATE: false,\n AUTO_RESTART: false,\n IS_DUMMY: false,\n API_KEY: '',\n LEDGER_PATH: LEDGER_PATH,\n ACCOUNTS_PATH: ACCOUNTS_PATH,\n SNAPSHOTS_PATH: SNAPSHOTS_PATH,\n MOD: false\n}\n\nexport default DEFAULT_CONFIG\n","import readConfig from '@/config/readConfig'\nimport fetch from 'node-fetch'\n\nexport const sendDiscord = async (content: string) => {\n try {\n const config = await readConfig()\n if (config.DISCORD_WEBHOOK_URL === '')\n throw new Error(\n 'DISCORD_WEBHOOK_URL is empty\\nPlease set DISCORD_WEBHOOK_URL in .env',\n )\n\n const body = {\n content,\n username: '🪄 Solv Notifier',\n }\n const res = await fetch(config.DISCORD_WEBHOOK_URL, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n })\n if (res.status !== 204) return false\n return true\n } catch (e) {\n console.log({ error: `Skeet sendDiscord Error - ${content}` })\n return false\n }\n}\n","import getSolvVersion from '@/cli/epochTimer/getSolvVersion'\nimport {\n getAllKeyPaths,\n NODE_RESTART_REQUIRED_MAINNET,\n NODE_RESTART_REQUIRED_TESTNET,\n FD_RESTART_REQUIRED_MAINNET,\n FD_RESTART_REQUIRED_TESTNET,\n} from '@/config/config'\nimport { sendDiscord } from '@/lib/sendDiscord'\nimport { spawnSync } from 'child_process'\nimport waitCatchup from './waitCatchup'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport sleep from '@/lib/sleep'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, ValidatorType } from '@/config/enums'\n\n// NODE_RESTART_REQUIRED_MAINNET/TESTNET is a boolean\n// This is a global variable that is not defined in this file\n// It is defined in packages/solv/src/cli/config/config.ts\n// Please DO NOT forget to turn this to false if it's not needed\n\nconst autoUpdate = async (config: DefaultConfigType) => {\n const isMainnet = config.NETWORK === Network.MAINNET\n const isFrankendancer = config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n const { mainnetValidatorKey, testnetValidatorKey } = getAllKeyPaths()\n const validatorKey = isMainnet ? mainnetValidatorKey : testnetValidatorKey\n // const solanaVersion = getSolanaVersion()\n \n // Notify the user about the update\n let isUpdateRequired = false\n if (isFrankendancer) {\n isUpdateRequired = isMainnet\n ? FD_RESTART_REQUIRED_MAINNET\n : FD_RESTART_REQUIRED_TESTNET\n } else {\n isUpdateRequired = isMainnet\n ? NODE_RESTART_REQUIRED_MAINNET\n : NODE_RESTART_REQUIRED_TESTNET\n }\n isUpdateRequired = isUpdateRequired && config.AUTO_RESTART\n\n const address = getSolanaAddress(validatorKey)\n const msg = `**${address}** updated solv to **${getSolvVersion()}**`\n await sendDiscord(msg)\n\n if (isUpdateRequired) {\n // Restart the node\n const msg = `Restarting **${address}**`\n await sendDiscord(msg)\n try {\n spawnSync(`solv update && solv update --config && solv update -b`, {\n stdio: 'inherit',\n shell: true,\n })\n } catch (error: any) {\n const errorMsg = `Error restarting **${address}**: ${error?.message || 'Unknown error'}`\n await sendDiscord(errorMsg)\n return false\n }\n\n const restartMsg = `**${address}** has restarted, catching up...`\n await sendDiscord(restartMsg)\n await sleep(180 * 1000)\n \n // Wait for the node to catch up\n const catchup = await waitCatchup(config)\n if (catchup) {\n const msg = `**${address}** has caught up!`\n await sendDiscord(msg)\n } else {\n const errorMsg = `**${address}** failed to catch up after update`\n await sendDiscord(errorMsg)\n }\n return catchup\n }\n return true\n}\n\nexport default autoUpdate\n","import { Connection } from '@solana/web3.js'\n\nexport type ValidatorStatus = {\n pubkey: string\n isActive: boolean\n reason: string\n}\n\nexport const isValidatorActive = async (\n rpcUrl: string,\n voteAccountKey: string,\n isTest = false,\n slot = 200,\n) => {\n let validatorStatus: ValidatorStatus = {\n pubkey: voteAccountKey,\n isActive: false,\n reason: '',\n }\n try {\n const connection = isTest\n ? new Connection('https://api.testnet.solana.com')\n : new Connection(rpcUrl, 'confirmed')\n let voteAccounts = await connection.getVoteAccounts()\n let validator = voteAccounts.current.find(\n (v) => v.votePubkey === voteAccountKey,\n )\n\n if (!validator) {\n // Validator is not in the current list, it might be delinquent.\n const delinquentValidator = voteAccounts.delinquent.find(\n (v) => v.votePubkey === voteAccountKey,\n )\n if (delinquentValidator) {\n validatorStatus.isActive = false\n validatorStatus.reason = 'Validator is delinquent.'\n return validatorStatus\n } else {\n validatorStatus.isActive = false\n validatorStatus.reason =\n 'Validator is not found in both current and delinquent lists.'\n return validatorStatus\n }\n }\n // Refetch the validator from the current list.\n voteAccounts = await connection.getVoteAccounts()\n validator = voteAccounts.current.find(\n (v) => v.votePubkey === voteAccountKey,\n )\n if (!validator) {\n validatorStatus.isActive = false\n validatorStatus.reason = 'Validator is not found in the current list.'\n return validatorStatus\n }\n\n // Check the last vote timestamp.\n const lastVoteSlot = validator.lastVote\n const currentSlot = await connection.getSlot()\n const slotsSinceLastVote = currentSlot - lastVoteSlot\n if (slotsSinceLastVote > slot) {\n // This is an arbitrary number, adjust based on your needs.\n validatorStatus.isActive = false\n validatorStatus.reason = `Validator has not voted for ${slotsSinceLastVote} slots.`\n return validatorStatus\n }\n\n validatorStatus.isActive = true\n validatorStatus.reason = 'Validator is active and voting.'\n return validatorStatus\n } catch (error) {\n console.error(error)\n validatorStatus.isActive = false\n validatorStatus.reason = 'Failed to check validator status.'\n return validatorStatus\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const getSolanaAddress = (keypath: string) => {\n const cmd = `solana address --keypair ${keypath}`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n const address = stdout.toString().trim()\n return address\n}\n","const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport default sleep\n","import { isValidatorActive } from '@/cli/epochTimer/isValidatorActive'\nimport { getAllKeyPaths } from '@/config/config'\nimport { Network } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport sleep from '@/lib/sleep'\nimport { sendDiscord } from '@skeet-framework/utils'\n\nconst MAX_RETRIES = 10\n\nconst waitCatchup = async (config: DefaultConfigType) => {\n try {\n const isTestnet = config.NETWORK === Network.TESTNET\n const { mainnetValidatorVoteKey, testnetValidatorVoteKey } =\n getAllKeyPaths()\n const validatorKey = isTestnet\n ? testnetValidatorVoteKey\n : mainnetValidatorVoteKey\n const validatorPubkey = getSolanaAddress(validatorKey)\n let result = await isValidatorActive(\n config.RPC_URL,\n validatorPubkey,\n isTestnet,\n )\n let retries = 0\n while (!result.isActive) {\n if (retries >= MAX_RETRIES) {\n console.log('Max retries reached, exiting...')\n const msg = `⚠️ Validator is not active for ${MAX_RETRIES} minutes!\nAccount: ${result.pubkey}\nReason: ${result.reason}\nMessage: Max retries reached, exiting catchup check...\n Please check your validator node 👷‍♀️`\n await sendDiscord(msg)\n return false\n }\n\n console.log('Waiting for validator to catch up...')\n // Wait for 1 minute\n await sleep(60 * 1000)\n result = await isValidatorActive(\n config.RPC_URL,\n validatorPubkey,\n isTestnet,\n )\n retries++\n }\n return true\n } catch (error) {\n console.log('Error in waitCatchup:', error)\n return false\n }\n}\n\nexport default waitCatchup\n","import { homedir } from 'os'\nimport { DefaultConfigType } from './types'\nimport { SOLV4_CONFIG_FILE } from '@/config/constants'\nimport { readFile, writeFile } from 'fs/promises'\nimport { existsAsync } from '@skeet-framework/utils'\nimport DEFAULT_CONFIG from './defaultConfig'\n\nexport const updateDefaultConfig = async (\n config: Partial<DefaultConfigType>,\n) => {\n // update ~/solv4.config.json with new values\n const homeDir = homedir()\n const solvConfigFile = `${homeDir}/${SOLV4_CONFIG_FILE}`\n\n // Check if the file exists\n if (!(await existsAsync(solvConfigFile))) {\n // create default config\n console.log('Creating default config file at', solvConfigFile)\n await writeFile(solvConfigFile, JSON.stringify(DEFAULT_CONFIG, null, 2))\n }\n\n const solvConfig = JSON.parse(\n await readFile(solvConfigFile, 'utf8'),\n ) as DefaultConfigType\n // unique values\n const updatedConfig: DefaultConfigType = {\n ...solvConfig,\n ...config,\n }\n const updatedConfigString = JSON.stringify(updatedConfig, null, 2)\n await writeFile(solvConfigFile, updatedConfigString)\n}\n","import { DescriptionParams } from '../localeParams'\n\nconst cmdsEN: DescriptionParams = {\n description: '💎 Solana Validator All-in-One CLI 💎',\n version: 'Output the current version',\n help: 'Display help for solv commands',\n subcmdHelp: 'Display help for subcommands',\n server: 'Open solv Dashboard',\n start: 'Start Solana Validator',\n stop: 'Stop Solana Validator',\n status: 'Show Solana Validator Status',\n restart: 'Restart Solana Validator',\n update: 'Update Solana Validator Version',\n get: 'Get Solana Validator Info Commands',\n log: 'Tail Solana Validator Log',\n catchup: 'Catchup Solana Validator',\n monitor: 'Monitor Solana Validator',\n config: 'Show Solana Validator Config',\n install: 'Install/Update Solana Version',\n stake: 'Solana Delegate Stake',\n check: 'Check Solana Validator',\n scp: 'Download/Upload Solana Validator Keypairs',\n cron: 'Run Schedule Tasks',\n setup: 'Setup Solana Validator',\n epoch: 'Show Current Epoch',\n slot: 'Show Current Slot',\n solv: 'Endroll Solv AA',\n installer: 'Please select an option:',\n unstake: 'UnStake',\n}\n\nexport default cmdsEN\n","import { DescriptionParams } from '../localeParams'\n\nconst cmdsJA: DescriptionParams = {\n description: '💎 ソラナバリデーターオールインワン CLI ツール 💎',\n version: '現在のバージョンを出力',\n help: 'solv コマンドのオプション詳細を表示',\n subcmdHelp: 'サブコマンドのヘルプを表示',\n server: 'solv ダッシュボードを開く',\n start: 'ノードを起動',\n stop: 'ノードを停止',\n status: 'ノードのステータスを表示',\n restart: 'ノードを再起動',\n update: 'ノードのバージョンを更新',\n get: 'ノードの設定情報を取得 サブコマンド',\n log: 'ノードのログを表示',\n catchup: 'ノードをキャッチアップ',\n monitor: 'ノードを監視',\n config: 'ノードの設定を表示',\n install: 'ソラナのバージョンを更新/インストール',\n stake: 'ソラナのステーキングを行う',\n unstake: 'ソラナのアンステーキングを行う',\n check: 'ノードの状態をチェック',\n scp: 'scp サブコマンド',\n cron: 'スケジュールタスク サブコマンド',\n setup: 'ソラナバリデーターをセットアップ',\n epoch: '現在のエポックを表示',\n slot: '現在のスロットを表示',\n solv: 'Solvエンドロール AA を表示',\n installer: '以下からオプションを選択してください:',\n}\n\nexport default cmdsJA\n","import { LogParams } from '../localeParams'\n\nconst logsEN: LogParams = {\n success: {\n created: 'Created',\n },\n error: {\n failed: 'Failed',\n },\n installer: {\n welcomeMsg: '🔥 Welcome to the solv installer 🔥',\n description: 'solv is born and ready for running Solana Validator Nodes 🚀',\n },\n}\n\nexport default logsEN\n","import { LogParams } from '../localeParams'\n\nconst logsJA: LogParams = {\n success: {\n created: '作成されました',\n },\n error: {\n failed: '失敗しました',\n },\n installer: {\n welcomeMsg: '🔥 ソラナバリデーターツール solv へようこそ 🔥',\n description: 'あなたはもう、ソラナバリデーターになる準備ができています。',\n },\n}\n\nexport default logsJA\n","import { installerParams, installerSubParams } from '../localeParams'\n\nexport const installerEN: installerParams = [\n ') Upgrade - Update/Downgrade Solana Version',\n ') Check Validator Logs/Status or Start/Stop',\n ') Get Validator Config Info',\n ') Backup Validator Keyfiles',\n ') Staking',\n ') Uninstall',\n ') Exit',\n]\n\nexport const installerSubEN: installerSubParams = [\n [],\n [\n ') Check Validator Status',\n ') Show Validator Logs',\n ') Start Validator',\n ') Stop Validator',\n ') Restart Validator (no fetch snapshot)',\n ') Restart Validator (fetch snapshot)',\n ') Return to Main Menu',\n ],\n [\n ') Show Validator Config',\n ') Register Validator Info',\n ') Show Validator Keys Path/Address/Balance',\n ') Get Current Epoch/Slot',\n ') Get Solana Validator Catchup Info',\n ') Get Solana Validator Monitor Info',\n ') Return to Main Menu',\n ],\n [\n ') Backup Validator Keyfiles',\n ') Set Validator Keyfile/Network',\n ') Return to Main Menu',\n ],\n [') Stake', ') Unstake', ') Return to Main Menu'],\n [],\n [],\n]\n","import { installerParams, installerSubParams } from '@/locales/localeParams'\n\nexport const installerJA: installerParams = [\n ') アップグレード - Solanaバージョンのアップデート/ダウングレード',\n ') バリデータ-の状態/ログを確認・または開始/停止',\n ') バリデータ-の設定情報',\n ') 鍵の設定',\n ') ステーキング',\n ') アンインストール',\n ') 終了',\n]\n\nexport const installerSubJA: installerSubParams = [\n [],\n [\n ') バリデータ-の状態を確認',\n ') バリデーターのログを表示',\n ') バリデータ-を開始',\n ') バリデータ-を停止',\n ') バリデータ-を再起動 (fetch snapshot なし)',\n ') バリデータ-を再起動 (fetch snapshot あり)',\n ') メインメニューに戻る',\n ],\n [\n ') バリデータ-の設定を見る',\n ') バリデータ-情報を登録する',\n ') バリデータ-の鍵の パス/アドレス/残高 を見る',\n ') 現在の エポック/スロット を見る',\n ') バリデーターの Catchup 情報を見る',\n ') バリデーターのモニター情報を見る',\n ') メインメニューに戻る',\n ],\n [\n ') バリデーターの鍵をバックアップ',\n ') 鍵/ネットワークを設定する',\n ') メインメニューに戻る',\n ],\n [\n ') ステーキングを行う',\n ') アンステーキングを行う',\n ') メインメニューに戻る',\n ],\n [],\n [],\n]\n","const subCmdsEN = {\n server: {\n description: 'Open solv Dashboard',\n },\n start: {\n description: 'Start Solana Validator',\n },\n stop: {\n description: 'Stop Solana Validator',\n },\n status: {\n description: 'Show Solana Validator Status',\n },\n restart: {\n description: 'Restart Solana Validator',\n },\n update: {\n description: 'Update Solana Validator Version',\n },\n get: {\n description: 'Get Solana Validator Info',\n },\n log: {\n description: 'Tail Solana Validator Log',\n },\n catchup: {\n description: 'Catchup Solana Validator',\n },\n monitor: {\n description: 'Monitor Solana Validator',\n },\n config: {\n description: 'Show Solana Validator Config',\n },\n install: {\n description: 'Install/Update Solana Version',\n },\n stake: {\n description: 'Solana Delegate Stake',\n },\n unstake: {\n description: 'UnStake',\n },\n check: {\n description: 'Check Solana Validator',\n },\n scp: {\n description: 'Download/Upload Solana Validator Keypairs',\n },\n cron: {\n description: 'Run Schedule Tasks',\n },\n setup: {\n description: 'Setup Solana Validator',\n },\n epoch: {\n description: 'Show Current Epoch',\n },\n slot: {\n description: 'Show Current Slot',\n },\n solv: {\n description: 'Endroll Solv AA',\n },\n}\n\nexport default subCmdsEN\n","const subCmdsJA = {\n server: {\n description: 'Open solv Dashboard',\n },\n start: {\n description: 'Start Solana Validator',\n },\n stop: {\n description: 'Stop Solana Validator',\n },\n status: {\n description: 'Show Solana Validator Status',\n },\n restart: {\n description: 'Restart Solana Validator',\n },\n update: {\n description: 'Update Solana Validator Version',\n },\n get: {\n description: 'Get Solana Validator Info',\n },\n log: {\n description: 'Tail Solana Validator Log',\n },\n catchup: {\n description: 'Catchup Solana Validator',\n },\n monitor: {\n description: 'Monitor Solana Validator',\n },\n config: {\n description: 'Show Solana Validator Config',\n },\n install: {\n description: 'Install/Update Solana Version',\n },\n stake: {\n description: 'Solana Delegate Stake',\n },\n unstake: {\n description: 'UnStake',\n },\n check: {\n description: 'Check Solana Validator',\n },\n scp: {\n description: 'Download/Upload Solana Validator Keypairs',\n },\n cron: {\n description: 'Run Schedule Tasks',\n },\n setup: {\n description: 'Setup Solana Validator',\n },\n epoch: {\n description: 'Show Current Epoch',\n },\n slot: {\n description: 'Show Current Slot',\n },\n solv: {\n description: 'Endroll Solv AA',\n },\n}\n\nexport default subCmdsJA\n","import { ClientParams } from '../localeParams'\n\nexport const clientEN: ClientParams = [\n ') Check Validator Status',\n ') Download Validator Keyfiles',\n ') Generate Validator Keyfiles',\n ') Upload Validator Keyfiles',\n ') Set Validator Keyfile/Network',\n ') Uninstall',\n ') Exit',\n]\n\nexport const clientSubEN = [[]]\n","import { ClientParams } from '../localeParams'\n\nexport const clientJA: ClientParams = [\n ') バリデータ-の状態を確認',\n ') バリデーターの鍵をダウンロード',\n ') バリデーターの鍵を作成',\n ') バリデーターの鍵をアップロード',\n ') 鍵/ネットワークを設定する',\n ') アンインストール',\n ') 終了',\n]\n\nexport const clientSubJA = [\n [],\n [\n ') バリデータ-の状態を確認',\n ') バリデーターのログを表示',\n ') バリデータ-を開始',\n ') バリデータ-を停止',\n ') バリデータ-を再起動 (fetch snapshot なし)',\n ') バリデータ-を再起動 (fetch snapshot あり)',\n ') メインメニューに戻る',\n ],\n [\n ') バリデータ-の設定を見る',\n ') バリデータ-の鍵の パス/アドレス/残高 を見る',\n ') 現在の エポック/スロット を見る',\n ') バリデーターの Catchup 情報を見る',\n ') バリデーターのモニター情報を見る',\n ') メインメニューに戻る',\n ],\n [\n ') バリデーターの鍵をバックアップ',\n ') バリデーターの鍵をリストア',\n ') メインメニューに戻る',\n ],\n [],\n [],\n [],\n]\n","import { LANGS } from '@/config/langs'\nimport cmdsEN from '@/locales/en/cmds'\nimport cmdsJA from '@/locales/ja/cmds'\nimport logsEN from '@/locales/en/logs'\nimport logsJA from '@/locales/ja/logs'\nimport { installerEN, installerSubEN } from '@/locales/en/installer'\nimport { installerJA, installerSubJA } from '@/locales/ja/installer'\nimport { LocaleParams } from '@/locales/localeParams'\nimport subCmdsEN from '@/locales/en/subCmds'\nimport subCmdsJA from '@/locales/ja/subCmds'\nimport { clientEN } from './en/client'\nimport { clientJA } from './ja/client'\n\nconst readLocale = (lang: LANGS) => {\n let locales: LocaleParams = {\n cmds: cmdsEN,\n subCmds: subCmdsEN,\n logs: logsEN,\n installer: installerEN,\n installerSub: installerSubEN,\n clientCmds: clientEN,\n }\n switch (lang) {\n case LANGS.EN:\n locales = {\n cmds: cmdsEN,\n subCmds: subCmdsEN,\n logs: logsEN,\n installer: installerEN,\n installerSub: installerSubEN,\n clientCmds: clientEN,\n }\n break\n case LANGS.JA:\n locales = {\n cmds: cmdsJA,\n subCmds: subCmdsJA,\n logs: logsJA,\n installer: installerJA,\n installerSub: installerSubJA,\n clientCmds: clientJA,\n }\n break\n default:\n locales = {\n cmds: cmdsEN,\n subCmds: subCmdsEN,\n logs: logsEN,\n installer: installerEN,\n installerSub: installerSubEN,\n clientCmds: clientEN,\n }\n }\n return locales\n}\n\nexport default readLocale\n","import { CONFIG, CONFIG_TYPE, FILES } from '@/config/config'\nimport { LocaleParams } from '@/locales/localeParams'\nimport readLocale from '@/locales/readLocale'\nimport { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { updateSolvConfig } from './updateSolvConfig'\nimport { homedir } from 'os'\n\nexport type ConfigParams = {\n config: CONFIG_TYPE\n locale: LocaleParams\n}\n\nexport const readOrCreateDefaultConfig = () => {\n const homeDir = homedir()\n const configPath = `${homeDir}/${FILES.CONFIG}`\n if (!existsSync(configPath)) {\n writeFileSync(configPath, JSON.stringify(CONFIG, null, 2))\n console.log(`Created default config file at ${configPath}`)\n }\n let config: CONFIG_TYPE\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8')) as CONFIG_TYPE\n } catch (error) {\n console.log('Error parsing config file. Renewing config file.')\n writeFileSync(configPath, JSON.stringify(CONFIG, null, 2))\n config = CONFIG\n }\n const locale = readLocale(config.LANG)\n // Set default RPC_URL if not set\n if (!config.RPC_URL) {\n config.RPC_URL = CONFIG.RPC_URL\n updateSolvConfig({ RPC_URL: CONFIG.RPC_URL })\n }\n\n // Set IS_MEV_MODE to false if not set\n if (config.IS_MEV_MODE === undefined) {\n config.IS_MEV_MODE = false\n updateSolvConfig({ IS_MEV_MODE: false })\n }\n\n // Set DISCORD_WEBHOOK_URL to empty string if not set\n if (!config.DISCORD_WEBHOOK_URL) {\n config.DISCORD_WEBHOOK_URL = ''\n updateSolvConfig({ DISCORD_WEBHOOK_URL: '' })\n }\n return { config, locale } as ConfigParams\n}\n","import { CONFIG_TYPE, FILES, PartialConfigType } from '@/config/config'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { homedir } from 'os'\n\nexport const updateSolvConfig = (config: PartialConfigType) => {\n // update ~/solv.config.json with new values\n const homeDir = homedir()\n const solvConfigFile = `${homeDir}/${FILES.CONFIG}`\n const solvConfig = JSON.parse(\n readFileSync(solvConfigFile, 'utf8'),\n ) as CONFIG_TYPE\n // unique values\n const updatedConfig: CONFIG_TYPE = {\n ...solvConfig,\n ...config,\n }\n const updatedConfigString = JSON.stringify(updatedConfig, null, 2)\n writeFileSync(solvConfigFile, updatedConfigString)\n}\n","import { SNAPSHOTS_PATH } from '@/config/constants'\nimport { VERSION_MAINNET } from '@/config/versionConfig';\nimport { spawnSync } from 'node:child_process'\n\nexport const getSnapshot = (\n isTest = false,\n minDownloadSpeed = '45',\n snapshotPath = SNAPSHOTS_PATH,\n version = VERSION_MAINNET,\n rpcUrl = isTest ? 'https://api.testnet.solana.com' : 'https://api.mainnet-beta.solana.com',\n useAvorio = false,\n) => {\n try {\n let cmd = `docker run -it --rm -v ${snapshotPath}:${snapshotPath} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${snapshotPath} --min_download_speed ${minDownloadSpeed} --version ${version} --rpc ${rpcUrl}`\n if (isTest && useAvorio) {\n spawnSync(\n `wget --trust-server-names https://snapshots.avorio.network/testnet/snapshot.tar.bz2 https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2 && for file in snapshot-* incremental-snapshot-*; do mv \"$file\" \"$(echo \"$file\" | sed 's/\\\\?.*$//')\"; done`,\n { shell: true, stdio: 'inherit', cwd: snapshotPath },\n );\n return\n }\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n } catch (error) {\n throw new Error(`getSnapshot Error: ${error}`)\n }\n}\n","import { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nexport const frankendancerUpdate = async (config: DefaultConfigType, version?: string, mod = false) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const firedancerVersion = version || (isTestnet ? VERSION_FIREDANCER_TESTNET : VERSION_FIREDANCER)\n const isModified = mod || config.MOD\n\n // Update Firedancer\n if (isModified) {\n spawnSync(\n `git -C /home/solv/firedancer fetch origin`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer checkout v${firedancerVersion}-mod`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer submodule update --init --recursive`,\n { shell: true, stdio: 'inherit' },\n )\n } else {\n spawnSync(\n `git -C /home/solv/firedancer fetch origin`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer checkout v${firedancerVersion}`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer submodule update --init --recursive`,\n { shell: true, stdio: 'inherit' },\n )\n }\n \n\n // Temp rust bug\n // spawnSync(`rustup uninstall 1.84.1-x86_64-unknown-linux-gnu`, {\n // shell: true,\n // stdio: 'inherit',\n // cwd: '/home/solv/firedancer',\n // })\n // spawnSync(`rustup install 1.84.1`, {\n // shell: true,\n // stdio: 'inherit',\n // cwd: '/home/solv/firedancer',\n // })\n\n // Rebuild Firedancer\n spawnSync(\n `export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install`,\n {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n },\n )\n spawnSync(\n `make -j fdctl solana`,\n {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n },\n )\n\n // Restart services\n spawnSync(\n `sudo systemctl restart frankendancer`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`sudo rm -rf /mnt/accounts/snapshot`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `sudo systemctl restart port-relay`,\n { shell: true, stdio: 'inherit' },\n )\n}\n","import { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n\nexport const rmSnapshot = (config: DefaultConfigType) => {\n spawnSync(`sudo rm -rf /mnt/ledger/*`, {\n shell: true,\n stdio: 'inherit',\n })\n if(config.SNAPSHOTS_PATH !== '/mnt/ledger') {\n spawnSync(`sudo rm -rf ${config.SNAPSHOTS_PATH}/*`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n spawnSync(`sudo rm -rf /mnt/accounts/*`, {\n shell: true,\n stdio: 'inherit',\n })\n}\n","import { startupScriptPaths } from '@/config/config'\nimport { spawnSync } from 'node:child_process'\n\nexport type TailOptions = {\n info: boolean\n warning: boolean\n error: boolean\n all: boolean\n}\n\nexport const tail = (options: TailOptions) => {\n try {\n const { log } = startupScriptPaths()\n let cmd = `tail -f ${log}`\n if (options.error) {\n cmd += ` | grep '\\\\(WARN\\\\|ERR\\\\)'`\n } else if (options.info) {\n cmd += ` | grep INFO`\n } else if (options.warning) {\n cmd += ` | grep WARN`\n }\n\n console.log(cmd)\n const result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n\n if (result.error) {\n throw result.error\n }\n\n if (result.signal === 'SIGINT') {\n console.log('Child process terminated due to receipt of SIGINT signal')\n process.exit(0)\n } else if (result.status !== 0) {\n console.error(`Child process exited with code ${result.status}`)\n process.exit(result.status)\n }\n } catch (error) {\n console.error(`tail Error: ${error}`)\n process.exit(1)\n }\n}\n","import { program } from '@/index'\nimport { tail } from './tail'\n\nexport const logCommands = () => {\n program\n .command('log')\n .description('tail logs')\n .alias('l')\n .description('tail logs')\n .option('-i, --info', 'Follow INFO output', false)\n .option('-w, --warning', 'Follow WARN output', false)\n .option('-e, --error', 'Follow ERR/WARN output', false)\n .option('-a, --all', 'Follow All output', false)\n .action((options) => {\n tail(options)\n })\n}\n","import { program } from '@/index'\nimport chalk from 'chalk'\nimport { setupVoteAccount } from '@/cli/setup/setupVoteAccount'\nimport { createSolvKeyPairs } from '@/lib/createSolvKeys'\nimport { DefaultConfigType } from '@/config/types'\nimport jupiterAPISetup from '@/cli/setup/template/jupiter/jupiterAPISetup'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { daemonReload } from '@/lib/daemonReload'\nimport { setupV2 } from './setupV2'\nimport { jitoRelayerSetup } from './jitoRelayerSetup'\nimport rpcLog from '@/utils/rpcLog'\nimport { yellowstoneGeyser } from './template/geyser/yellowstoneGeyser'\nimport setupFiredancer from './firedancer/setupFiredancer'\n\ntype SetupOptions = {\n vote: boolean\n key: boolean\n relayer: boolean\n jupiter: boolean\n geyser: boolean\n firedancer: boolean\n skipInitConfig: boolean\n skipMount: boolean\n pivot: boolean\n mod: boolean\n}\n\nexport const setupCommands = (config: DefaultConfigType) => {\n program\n .command('setup')\n .description(`Setup Solana Validator`)\n .option('--vote', 'Setup Vote Account', false)\n .option('--key', 'Setup Validator Keypairs', false)\n .option('--relayer', 'Setup Jito Relayer', false)\n .option('--jupiter', 'Setup Jupiter Swap API', false)\n .option('--geyser', 'Setup Geyser', false)\n .option('--firedancer', 'Setup Firedancer', false)\n .option('--skip-init-config', 'Skip Initial Config', false)\n .option('--skip-mount', 'Skip Mount', false)\n .option('--pivot', 'Pivot install', false)\n .option('--mod', 'Modified install', false)\n .action(async (options: SetupOptions) => {\n const isModded = config.MOD || options.mod\n try {\n if (options.vote) {\n console.log(chalk.white('🗳️ Setting up Vote Account ...'))\n setupVoteAccount(config)\n process.exit(0)\n } else if (options.key) {\n console.log(chalk.white('🔑 Setting up Validator Keypairs ...'))\n createSolvKeyPairs(config)\n process.exit(0)\n } else if (options.relayer) {\n console.log(chalk.white('🛰️ Setting up Jito Relayer ...'))\n const jitoConfig = await readOrCreateJitoConfig()\n const blockEngineUrl = jitoConfig.blockEngineUrl\n const isCoHost = false\n await jitoRelayerSetup(blockEngineUrl, isCoHost)\n console.log(\n chalk.green(\n 'Jito Relayer Setup Completed\\n\\n$ solv relayer --help',\n ),\n )\n daemonReload()\n rpcLog()\n process.exit(0)\n } else if (options.jupiter) {\n console.log(chalk.white('🌏 Setting up Jupiter Swap API ...'))\n await jupiterAPISetup()\n daemonReload()\n rpcLog()\n process.exit(0)\n } else if (options.geyser) {\n console.log(chalk.white('⚡️ Setting up Geyser ...'))\n await yellowstoneGeyser()\n return\n } else if (options.firedancer) {\n console.log(chalk.white('🔥 Setting up Firedancer ...'))\n await setupFiredancer(isModded)\n return\n }\n await setupV2(\n options.skipInitConfig,\n options.skipMount,\n options.pivot,\n isModded,\n )\n } catch (error: any) {\n if (\n error.message.includes('User force closed the prompt') ||\n error.message.includes('initialConfigSetup')\n ) {\n console.error(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.error(chalk.red(`Setup Error: ${error.message}`))\n process.exit(0)\n }\n })\n}\n","import { NETWORK_TYPES, getAllKeyPaths } from '@/config/config'\nimport { Network } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'child_process'\nimport { homedir } from 'os'\n\nexport const setupVoteAccount = (config: DefaultConfigType) => {\n const homeDir = homedir()\n const allKeyPaths = getAllKeyPaths(homeDir)\n let validatorVoteKey = allKeyPaths.testnetValidatorVoteKey\n let validatorKey = allKeyPaths.testnetValidatorKey\n let validatorAuthorityKey = allKeyPaths.testnetValidatorAuthorityKey\n let network = NETWORK_TYPES.TESTNET\n const commision = config.COMMISSION\n\n if (config.NETWORK === Network.MAINNET) {\n validatorVoteKey = allKeyPaths.mainnetValidatorVoteKey\n validatorKey = allKeyPaths.mainnetValidatorKey\n validatorAuthorityKey = allKeyPaths.mainnetValidatorAuthorityKey\n network = NETWORK_TYPES.MAINNET\n }\n\n console.log(\n `⌛️ Creating vote account with commission ${commision} - ${network}`,\n )\n let url = config.RPC_URL || network\n if (config.NETWORK === Network.TESTNET) {\n url = NETWORK_TYPES.TESTNET\n }\n const cmd = `solana create-vote-account ${validatorVoteKey} ${validatorKey} ${validatorAuthorityKey} --commission ${commision} --url ${url} --keypair ${validatorKey}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'child_process'\nimport { existsSync, readdirSync, rmSync } from 'fs'\nimport { homedir } from 'os'\nimport { KEYPAIRS } from '@/config/config'\nimport path from 'path'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\n\nexport const createSolvKeyPairs = (config: DefaultConfigType) => {\n let genKeys = []\n let keyNum = 0\n if (config.NODE_TYPE === NodeType.RPC) {\n genKeys = [KEYPAIRS.MAINNET_VALIDATOR_KEY]\n keyNum = 1\n }\n if (config.NETWORK === Network.TESTNET) {\n genKeys = [\n KEYPAIRS.TESTNET_VALIDATOR_KEY,\n KEYPAIRS.TESTNET_VALITATOR_AUTHORITY_KEY,\n KEYPAIRS.TESTNET_VALIDATOR_VOTE_KEY,\n KEYPAIRS.MAINNET_VALIDATOR_KEY,\n KEYPAIRS.MAINNET_VALITATOR_AUTHORITY_KEY,\n KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY,\n ]\n keyNum = 6\n } else {\n genKeys = [\n KEYPAIRS.MAINNET_VALIDATOR_KEY,\n KEYPAIRS.MAINNET_VALITATOR_AUTHORITY_KEY,\n KEYPAIRS.MAINNET_VALIDATOR_VOTE_KEY,\n ]\n keyNum = 3\n }\n\n const cmd = `solana-keygen grind --starts-and-ends-with E:SV:${keyNum}`\n spawnSync(cmd, { shell: true, stdio: 'ignore' })\n const files = readdirSync('./').filter((f) => f.endsWith('SV.json'))\n const keyDir = homedir()\n const unstakedKeyPath = path.join(keyDir, 'unstaked-identity.json')\n if (existsSync(unstakedKeyPath)) {\n spawnSync(`mv ${unstakedKeyPath} ${keyDir}/unstaked-identity.backup.json`, {\n shell: true,\n stdio: 'ignore',\n })\n }\n let i = 0\n for (const file of files) {\n const keyPath = path.join(keyDir, genKeys[i])\n i++\n if (existsSync(keyPath)) {\n console.log(`${keyPath} is already exist!`)\n rmSync(file, { recursive: true })\n continue\n }\n const cmd = `mv ${file} ${keyPath}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n }\n spawnSync(\n 'solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json',\n { shell: true, stdio: 'ignore' },\n )\n console.log(`Generated keypairs - ${keyDir}`)\n}\n","import { spawnSync } from 'child_process'\nimport jupiterAPIService from '@/cli/setup/template/jupiter/jupiterAPIService'\nimport inquirer from 'inquirer'\nimport chalk from 'chalk'\nimport rpcLog from '@/utils/rpcLog'\n\ntype JupiterAPISetupOptions = {\n rpcUrl: string\n grpcUrl: string\n grpcToken: string\n}\n\nconst jupiterAPISetup = async () => {\n const questions = await inquirer.prompt<JupiterAPISetupOptions>([\n {\n name: 'rpcUrl',\n message: 'Enter RPC URL',\n type: 'input',\n default: 'http://localhost:8899',\n },\n {\n name: 'grpcUrl',\n message: 'Enter GRPC URL',\n type: 'input',\n default: 'http://localhost:10000',\n },\n {\n name: 'grpcToken',\n message: 'Enter GRPC Token',\n type: 'input',\n default: 'token',\n },\n ])\n const cmd = `sudo apt-get install unzip wget -y\nwget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip\nunzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip\nchmod +x jupiter-swap-api\nrm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n const { filePath, body } = jupiterAPIService(\n questions.rpcUrl,\n questions.grpcUrl,\n questions.grpcToken,\n )\n spawnSync(`echo '${body}' | sudo tee ${filePath}`, {\n shell: true,\n stdio: 'inherit',\n })\n console.log(\n chalk.white('🟢 Jupiter Swap API Setup Completed\\n\\n$ solv jupiter --help'),\n )\n}\n\nexport default jupiterAPISetup\n","const jupiterAPIService = (\n rpcUrl: string,\n grpcUrl: string,\n grpcToken: string,\n port = 2001,\n) => {\n const filePath = '/etc/systemd/system/jupiter-api.service'\n const body = `[Unit]\nDescription=Jupiter API Service Instance\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/home/solv/jupiter-swap-api --rpc-url ${rpcUrl} --yellowstone-grpc-endpoint ${grpcUrl} --yellowstone-grpc-x-token \"${grpcToken}\" --port ${port}\nWorkingDirectory=/home/solv\nRestart=always\nUser=solv\nEnvironment=NODE_ENV=production\nEnvironment=RUST_LOG=info\nEnvironment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx\n\n[Install]\nWantedBy=multi-user.target`\n return { filePath, body }\n}\n\nexport default jupiterAPIService\n","import { FILES } from '@/config/config'\nimport { JITO_CONFIG, JitoConfig } from '@/config/jitConfig'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { readFile, writeFile } from 'fs/promises'\nimport { homedir } from 'os'\nimport path from 'path'\n\nexport const readOrCreateJitoConfig = async () => {\n const homeDir = homedir()\n const configPath = path.join(homeDir, FILES.JITO_CONFIG)\n if (!(await existsAsync(configPath))) {\n await writeFile(configPath, JSON.stringify(JITO_CONFIG, null, 2))\n console.log(`Created jito config file at ${configPath}`)\n }\n let config: JitoConfig\n try {\n config = JSON.parse(await readFile(configPath, 'utf-8')) as JitoConfig\n } catch (error) {\n console.log(`readOrCreateJitoConfig - ${error}`)\n await writeFile(configPath, JSON.stringify(JITO_CONFIG, null, 2))\n config = JITO_CONFIG\n }\n return config\n}\n","import { spawnSync } from 'child_process'\n\nexport const daemonReload = () => {\n spawnSync('sudo systemctl daemon-reload', { shell: true, stdio: 'inherit' })\n}\n","import DEFAULT_CONFIG from '@/config/defaultConfig'\nimport {\n Network,\n NETWORK_TYPES,\n NODE_TYPES,\n NodeType,\n RPC_MODE,\n RpcType,\n ValidatorType,\n} from '@/config/enums'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport { askJitoSetting } from '../askJitoSetting'\nimport { updateJitoSolvConfig } from '@/lib/updateJitoSolvConfig'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\n\ntype SolvInitialConfig = {\n network: Network\n nodeType: NodeType\n}\n\n// Setup initial config in solv4.config.json\nconst initialConfigSetup = async () => {\n try {\n // Setup solv config\n let validatorType: ValidatorType = ValidatorType.NONE\n let rpcType: RpcType = RpcType.AGAVE\n let commission = DEFAULT_CONFIG.COMMISSION\n let isDummy = false\n const answer = await inquirer.prompt<SolvInitialConfig>([\n {\n name: 'network',\n type: 'list',\n message: 'Choose Network',\n choices: NETWORK_TYPES,\n default: Network.MAINNET,\n },\n {\n name: 'nodeType',\n type: 'list',\n message: 'Choose Node Type',\n choices: NODE_TYPES,\n default: NodeType.RPC,\n },\n ])\n let isTestnet = answer.network === Network.TESTNET\n if (answer.nodeType === NodeType.VALIDATOR) {\n const validatorChoices =\n answer.network === Network.MAINNET\n ? [ValidatorType.JITO, ValidatorType.SOLANA]\n : [\n ValidatorType.AGAVE,\n ValidatorType.JITO,\n ValidatorType.FRANKENDANCER,\n ]\n validatorType = await inquirer\n .prompt<{ validatorType: ValidatorType }>({\n name: 'validatorType',\n type: 'list',\n message: 'Choose Validator Type',\n choices: validatorChoices,\n default: ValidatorType.AGAVE,\n })\n .then((answer) => answer.validatorType)\n rpcType = RpcType.NONE\n }\n if (answer.nodeType === NodeType.RPC) {\n rpcType = await inquirer\n .prompt<{ rpcType: RpcType }>({\n name: 'rpcType',\n type: 'list',\n message: 'Choose RPC Type',\n choices: RPC_MODE,\n default: RpcType.AGAVE,\n })\n .then((answer) => answer.rpcType)\n }\n\n if (answer.nodeType === NodeType.VALIDATOR) {\n const answer = await inquirer.prompt<{\n commission: number\n isDummy: boolean\n }>([\n {\n name: 'commission',\n type: 'number',\n message: `What is your commission rate? You can change it later (default: ${DEFAULT_CONFIG.COMMISSION}%)'`,\n default: DEFAULT_CONFIG.COMMISSION,\n },\n {\n name: 'isDummy',\n type: 'confirm',\n message:\n 'Do you want to setup as a dummy(Inactive) node?(※For Migration)',\n default: true,\n },\n ])\n commission = answer.commission\n isDummy = answer.isDummy\n if (validatorType === ValidatorType.JITO || validatorType === ValidatorType.FRANKENDANCER) {\n await readOrCreateJitoConfig()\n const jitoConfig = await askJitoSetting(isTestnet)\n await updateJitoSolvConfig(jitoConfig)\n }\n }\n\n const { network, nodeType } = answer\n console.log(chalk.white('Network:', network))\n console.log(chalk.white('Node Type:', nodeType))\n console.log(chalk.white('Validator Type:', validatorType))\n console.log(chalk.white('RPC Type:', rpcType))\n if (nodeType === NodeType.VALIDATOR) {\n console.log(chalk.white('Commission:', commission))\n }\n\n await updateDefaultConfig({\n NETWORK: network,\n NODE_TYPE: nodeType,\n VALIDATOR_TYPE: validatorType,\n RPC_TYPE: rpcType,\n COMMISSION: commission,\n IS_DUMMY: isDummy,\n })\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport default initialConfigSetup\n","import { JITO_CONFIG, JITO_REGIONS, JitoConfig } from '@/config/jitConfig'\nimport inquirer from 'inquirer'\n\nexport const askJitoSetting = async (isTestnet: boolean) => {\n const commissionBps = 1000\n const jitRegions = isTestnet\n ? Object.keys(JITO_REGIONS.TESTNET)\n : Object.keys(JITO_REGIONS.MAINNET)\n const regionType = isTestnet ? JITO_REGIONS.TESTNET : JITO_REGIONS.MAINNET\n const answer = await inquirer.prompt<{\n commissionBps: number\n region: string\n isRelayer: boolean\n }>([\n {\n name: 'commissionBps',\n type: 'number',\n message: 'Enter commission bps',\n default: commissionBps,\n },\n {\n name: 'region',\n type: 'list',\n message: 'Select region',\n choices: jitRegions,\n },\n ])\n const regionKey = answer.region as keyof typeof regionType\n const regionArgs = regionType[regionKey]\n const result = {\n version: JITO_CONFIG.version,\n tag: JITO_CONFIG.tag,\n commissionBps: answer.commissionBps,\n blockEngineUrl: regionArgs.BLOCK_ENGINE_URL,\n relayerUrl: regionArgs.RELAYER_URL,\n shredReceiverAddr: regionArgs.SHRED_RECEIVER_ADDR,\n } as JitoConfig\n\n return result\n}\n","import { VERSION_JITO_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\n\nexport const installJito = (version = VERSION_JITO_TESTNET, mod = false) => {\n if(mod) {\n const tag = `v${version}-mod`\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `source /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`mkdir /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git -C /tmp/${tag} clone https://github.com/gabrielhicks/jito-solana.git --recurse-submodules .`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag} checkout ${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag} submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag} rev-parse HEAD) /tmp/${tag}/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n } else {\n const tag = `v${version}-jito`\n spawnSync(`sudo apt-get update`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo apt-get install -y libclang-18-dev clang-18 llvm-18-dev`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `grep -qxF 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' /home/solv/.profile || echo 'export LIBCLANG_PATH=/usr/lib/llvm-18/lib' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `grep -qxF 'export CLANG_PATH=/usr/bin/clang-18' /home/solv/.profile || echo 'export CLANG_PATH=/usr/bin/clang-18' >> /home/solv/.profile`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`source /home/solv/.profile`, { shell: true, stdio: 'inherit' })\n spawnSync(`mkdir /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git -C /tmp/${tag} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${tag} checkout ${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${tag} submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${tag} rev-parse HEAD) /tmp/${tag}/scripts/cargo-install-all.sh --validator-only /home/solv/.local/share/solana/install/releases/${tag}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `cp -r /home/solv/.local/share/solana/install/releases/${tag}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo sudo sed -i '/^LimitNOFILE=1000000$/{\n n\n /^LimitMEMLOCK=infinity$/!i LimitMEMLOCK=infinity\n}' /etc/systemd/system/solv.service`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n \"sudo sed -i 's|^--dynamic-port-range.*$|--dynamic-port-range 8000-8025 \\\\\\\\|' /home/solv/start-validator.sh\",\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo systemctl daemon-reload`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n}\n","import {\n ACCOUNTS_PATH,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n LOG_PATH,\n SNAPSHOTS_PATH,\n} from '@/config/constants'\n\nexport const startJitoRPCScript = () => {\n const script = `#!/bin/bash\nexec agave-validator \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${ACCOUNTS_PATH} \\\\\n--ledger ${LEDGER_PATH} \\\\\n--snapshots ${SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--only-known-rpc \\\\\n--full-rpc-api \\\\\n--no-voting \\\\\n--private-rpc \\\\\n--enable-cpi-and-log-storage \\\\\n--no-skip-initial-accounts-db-clean \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--rpc-port 8899 \\\\\n--no-port-check \\\\\n--account-index program-id spl-token-mint spl-token-owner \\\\\n--enable-rpc-transaction-history \\\\\n--rpc-pubsub-enable-block-subscription \\\\\n--rpc-pubsub-enable-vote-subscription \\\\\n--no-wait-for-vote-to-start-leader \\\\\n--account-index-include-key Stake11111111111111111111111111111111111111 \\\\\n--account-index-include-key Config1111111111111111111111111111111111111 \\\\\n--account-index-include-key AddressLookupTab1e1111111111111111111111111 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 400000000 \\\\\n`\n return script\n}\n","import installAgave from '@/cli/install/installAgave'\nimport { installJito } from '@/cli/install/installJito'\nimport { STARTUP_SCRIPT } from '@/config/constants'\nimport { RpcType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\n// import { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { startJitoRPCScript } from '@/template/startupScripts/startJitoRPCScript'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { writeFile } from 'fs/promises'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\nimport { VERSION_JITO_TESTNET } from '@/config/versionConfig'\nimport { startRPCNodeScript } from '@/template/startupScripts/startRPCNodeScript'\n\nconst setupRpcNode = async (config: DefaultConfigType) => {\n const rpcType = config.RPC_TYPE\n let startupScript = ''\n switch (rpcType) {\n case RpcType.AGAVE:\n console.log('Agave RPC Node Setup')\n installAgave(config.TESTNET_SOLANA_VERSION)\n startupScript = startRPCNodeScript()\n break\n case RpcType.JITO:\n console.log('JITO RPC Node Setup')\n installJito(VERSION_JITO_TESTNET)\n startupScript = startJitoRPCScript()\n break\n // case RpcType.JUPITER_GEYSER:\n // installJito(config.TESTNET_SOLANA_VERSION)\n // break\n default:\n console.log('Unknown RPC Node Setup')\n break\n }\n if (await existsAsync(STARTUP_SCRIPT)) {\n console.log('Startup script already exists. Skipping...')\n return\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n}\n\nexport default setupRpcNode\n","import { STARTUP_SCRIPT } from '@/config/constants'\nimport { spawnSync } from 'node:child_process'\n\nconst updateStartupScriptPermission = () => {\n const cmd = `sudo chmod +x ${STARTUP_SCRIPT}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n\nexport default updateStartupScriptPermission\n","import {\n ACCOUNTS_PATH,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n LOG_PATH,\n SNAPSHOTS_PATH,\n} from '@/config/constants'\nexport const startRPCNodeScript = () => {\n const script = `#!/bin/bash\nexec agave-validator \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${ACCOUNTS_PATH} \\\\\n--ledger ${LEDGER_PATH} \\\\\n--snapshots ${SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--only-known-rpc \\\\\n--full-rpc-api \\\\\n--no-voting \\\\\n--private-rpc \\\\\n--enable-cpi-and-log-storage \\\\\n--no-skip-initial-accounts-db-clean \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--rpc-port 8899 \\\\\n--no-port-check \\\\\n--account-index program-id spl-token-mint spl-token-owner \\\\\n--enable-rpc-transaction-history \\\\\n--rpc-pubsub-enable-block-subscription \\\\\n--rpc-pubsub-enable-vote-subscription \\\\\n--no-wait-for-vote-to-start-leader \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 400000000 \\\\\n`\n return script\n}\n","import { spawnSync } from 'node:child_process'\n\n// Agave Install e.g. installAgave('0.1.0')\nconst installSolana = (version: string) => {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.solana.com/v${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n}\n\nexport default installSolana\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n MAINNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startJitoMainnetScript = (\n commissionBps = 1000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const script = `#!/bin/bash\nexec ${solanaCLI} \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${MAINNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${MAINNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--known-validator phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2 \\\\\n--known-validator wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\\\\n--tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\\\\n--merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\\\\n--commission-bps ${commissionBps} \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--snapshot-interval-slots 0 \\\\\n--private-rpc \\\\\n--full-rpc-api \\\\\n`\n return script\n}\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startJitoTestnetScript = (\n commissionBps = 1000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const script = `#!/bin/bash\nexec ${solanaCLI} \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${TESTNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${TESTNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint2.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint3.testnet.solana.com:8001 \\\\\n--known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\\\\n--known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\\\\n--known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\\\\n--tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\\\\n--tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\\\\n--merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\\\\n--commission-bps ${commissionBps} \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--private-rpc \\\\\n--wait-for-supermajority 343175553 \\\\\n--expected-shred-version 9065 \\\\\n--expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--full-rpc-api \\\\\n`\n return script\n}\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n MAINNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startMainnetValidatorScript = (config: DefaultConfigType, solanaCLI = 'agave-validator') => {\n const script = `#!/bin/bash\nexec ${solanaCLI} \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${MAINNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${MAINNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\\\\n--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\\\\n--known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\\\\n--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\\\\n--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\\\\n--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\\\\n--known-validator phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2 \\\\\n--known-validator wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo \\\\\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--snapshot-interval-slots 0 \\\\\n--private-rpc \\\\\n`\n return script\n}\n","import {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startTestnetAgaveValidatorScript = (config: DefaultConfigType) => {\n const script = `#!/bin/bash\nexec agave-validator \\\\\n--identity ${IDENTITY_KEY_PATH} \\\\\n--vote-account ${TESTNET_VALIDATOR_VOTE_KEY_PATH} \\\\\n--authorized-voter ${TESTNET_VALIDATOR_KEY_PATH} \\\\\n--log ${LOG_PATH} \\\\\n--accounts ${config.ACCOUNTS_PATH} \\\\\n--ledger ${config.LEDGER_PATH} \\\\\n--snapshots ${config.SNAPSHOTS_PATH} \\\\\n--entrypoint entrypoint.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint2.testnet.solana.com:8001 \\\\\n--entrypoint entrypoint3.testnet.solana.com:8001 \\\\\n--known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\\\\n--known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\\\\n--known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\\\\n--only-known-rpc \\\\\n--rpc-bind-address 127.0.0.1 \\\\\n--private-rpc \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--dynamic-port-range 8000-8020 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--wait-for-supermajority 343175553 \\\\\n--expected-shred-version 9065 \\\\\n--expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--full-rpc-api \\\\\n`\n return script\n}\n","import installAgave from '@/cli/install/installAgave'\nimport { installJito } from '@/cli/install/installJito'\nimport installSolana from '@/cli/install/installSolana'\nimport { STARTUP_SCRIPT } from '@/config/constants'\nimport { Network, ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { startJitoMainnetScript } from '@/template/startupScripts/startJitoMainnetScript'\nimport { startJitoTestnetScript } from '@/template/startupScripts/startJitoTestnetScript'\nimport { startMainnetValidatorScript } from '@/template/startupScripts/startMainnetValidatorScript'\nimport { startTestnetAgaveValidatorScript } from '@/template/startupScripts/startTestnetAgaveValidatorScript'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { writeFile } from 'fs/promises'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\n\nconst setupValidatorNode = async (config: DefaultConfigType, mod = false) => {\n const { NETWORK: network, MOD: modConfig } = config\n mod = modConfig\n if (network === Network.MAINNET) {\n console.log('Mainnet Validator Node Setup')\n await setupMainnetValidator(config, mod)\n } else if (network === Network.TESTNET) {\n console.log('Testnet Validator Node Setup')\n await setupTestnetValidator(config, mod)\n } else {\n console.log('Unknown Network Validator Node Setup')\n }\n}\n\nconst setupMainnetValidator = async (config: DefaultConfigType, mod = false) => {\n const { VALIDATOR_TYPE: validatorType, MAINNET_SOLANA_VERSION: version, MOD: modConfig } =\n config\n mod = modConfig\n let startupScript = ''\n switch (validatorType) {\n case ValidatorType.SOLANA:\n installSolana(version)\n startupScript = startMainnetValidatorScript(config)\n break\n // case ValidatorType.AGAVE:\n // console.log('Coming soon...🌉')\n // break\n case ValidatorType.JITO:\n console.log('JITO Validator Setup for Mainnet')\n const jitoConfig = await readOrCreateJitoConfig()\n installJito(version, mod)\n startupScript = startJitoMainnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n // case ValidatorType.FRANKENDANCER:\n // console.log('Coming soon...🌉')\n // break\n // case ValidatorType.FIREDANCER:\n // console.log('Coming soon...🌉')\n // break\n default:\n console.log('Unknown Validator Type for Mainnet')\n break\n }\n if (await existsAsync(STARTUP_SCRIPT)) {\n console.log('Startup script already exists. Skipping...')\n return\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n}\n\nconst setupTestnetValidator = async (config: DefaultConfigType, mod = false) => {\n const { VALIDATOR_TYPE: validatorType, MOD: modConfig } = config\n mod = modConfig\n let startupScript = ''\n switch (validatorType) {\n case ValidatorType.SOLANA:\n installSolana(config.TESTNET_SOLANA_VERSION)\n startupScript = startTestnetAgaveValidatorScript(config)\n case ValidatorType.AGAVE:\n console.log('Agave Validator Setup for Testnet')\n installAgave(config.TESTNET_SOLANA_VERSION, mod)\n startupScript = startTestnetAgaveValidatorScript(config)\n break\n case ValidatorType.JITO:\n console.log('JITO Validator Setup for Testnet')\n const jitoConfig = await readOrCreateJitoConfig()\n installJito(config.TESTNET_SOLANA_VERSION, mod)\n startupScript = startJitoTestnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n // case ValidatorType.FRANKENDANCER:\n // console.log('Coming soon...🌉')\n // break\n // case ValidatorType.FIREDANCER:\n // console.log('Coming soon...🌉')\n // break\n default:\n console.log('Unknown Validator Type for Testnet')\n break\n }\n if (await existsAsync(STARTUP_SCRIPT)) {\n console.log('Startup script already exists. Skipping...')\n return\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n}\n\nexport default setupValidatorNode\n","import readConfig from '@/config/readConfig'\nimport initialConfigSetup from './question/initialConfigSetup'\nimport { Network, NodeType, ValidatorType } from '@/config/enums'\nimport setupRpcNode from './rpc'\nimport setupValidatorNode from './validator'\nimport chalk from 'chalk'\nimport { setupDirs } from './mkdirs'\nimport mountDirs from './mount/mountDirs'\nimport { setupPermissions } from './userPermissions'\nimport { makeServices } from './makeServices'\nimport { setupKeys } from './setupKeys'\nimport { daemonReload } from '@/lib/daemonReload'\nimport { getSnapshot } from '../get/snapshot'\nimport { startSolana } from '../start/startSolana'\nimport setupCpuGovernor from './setupCpuGovernor'\nimport updateSysctlConfig from '@/template/updateSysctlConfig'\nimport { restartLogrotate } from '@/lib/restartLogrotate'\nimport { enableSolv } from '@/lib/enableSolv'\nimport { createSymLink } from './createSymLink'\nimport rpcLog from '@/utils/rpcLog'\nimport setupFiredancer from './firedancer/setupFiredancer'\n\nexport const setupV2 = async (skipInitConfig = false, skipMount = false, pivot = false, mod = false) => {\n try {\n if (!skipInitConfig) {\n console.log(chalk.white(`🟢 Initializing Setup`))\n // Init Config File - solv4.config.json is the new config file\n await readConfig()\n await initialConfigSetup()\n }\n\n let latestConfig = await readConfig()\n const isTest = latestConfig.NETWORK === Network.TESTNET\n // Generate /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n setupDirs()\n if (!skipMount || !pivot) {\n // Mount /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n await mountDirs()\n }\n\n // Generate Systemd Service\n makeServices(isTest)\n // Restart Logrotate\n restartLogrotate()\n // Set CPU governor to performance\n setupCpuGovernor()\n // Update Sysctl Config if needed\n await updateSysctlConfig()\n // Generate Solana Keys\n setupKeys(latestConfig)\n createSymLink(latestConfig.IS_DUMMY, isTest)\n latestConfig = await readConfig()\n // Generate Soalna Startup Script\n switch (latestConfig.NODE_TYPE) {\n case NodeType.RPC:\n await setupRpcNode(latestConfig)\n break\n case NodeType.VALIDATOR:\n await setupValidatorNode(latestConfig, mod)\n // Setup Firedancer if needed\n if (latestConfig.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER) {\n await setupFiredancer(mod, latestConfig)\n }\n break\n default:\n throw new Error('Unknown Node Type')\n }\n if(!pivot) {\n // Setup Permissions\n setupPermissions()\n }\n // Reload Daemon\n daemonReload()\n if (latestConfig.VALIDATOR_TYPE !== ValidatorType.FRANKENDANCER) {\n if(!pivot) {\n latestConfig = await readConfig()\n // Enable Solv Service\n enableSolv()\n // Download Snapshot\n getSnapshot(isTest, `100`, latestConfig.SNAPSHOTS_PATH, isTest ? latestConfig.TESTNET_SOLANA_VERSION : latestConfig.MAINNET_SOLANA_VERSION)\n }\n }\n if(!pivot) {\n // Start Solana\n startSolana(latestConfig)\n }\n console.log(chalk.white(`🟢 Setup Completed`))\n rpcLog()\n } catch (error: any) {\n throw new Error(`Setup Error: ${error.message}`)\n }\n}\n","import { execSync } from 'node:child_process'\n\nexport function createDirectoryIfNotExists(path: string): void {\n try {\n // Check if the directory exists\n execSync(`test -d ${path}`)\n console.log(`${path} already exists.`)\n } catch {\n // If the directory does not exist, create it with sudo privileges\n execSync(`sudo mkdir -p ${path}`)\n console.log(`${path} has been created.`)\n }\n}\n","import { MT_PATHS } from '@/config/config'\nimport { createDirectoryIfNotExists } from '@/lib/createDirectoryIfNotExists'\n\nexport const setupDirs = () => {\n try {\n const dirs = [MT_PATHS.ACCOUNTS, MT_PATHS.LEDGER, MT_PATHS.SNAPSHOTS]\n for (const dir of dirs) {\n createDirectoryIfNotExists(dir)\n }\n } catch (error) {\n throw new Error(`setupDirs Error: ${error}`)\n }\n}\n","import { execSync } from 'child_process'\n\nexport type DiskInfo = {\n name: string\n size: number\n mountpoint: string\n isMounted: boolean\n hasPartition: boolean\n type: 'NVMe' | 'SATA'\n}\n\nexport type GetPreferredDisksResult = {\n disks: DiskInfo[]\n has850GB: boolean\n has400GB: boolean\n hasUsed1250GB: boolean\n hasThirdDisk400GB: boolean\n}\n\n// This method can be improved later - Prioritize the NVMe disks over SATA disks\n// Currently, it is just selecting the first disk\nfunction getPreferredDisks(): GetPreferredDisksResult {\n const commandOutput = execSync('lsblk -l -b -o NAME,SIZE,MOUNTPOINT', {\n encoding: 'utf8',\n })\n const lines = commandOutput.split('\\n').slice(1) // skip the header line\n\n const disks: DiskInfo[] = []\n\n // Collecting all disk names to identify which ones have partitions\n const allDiskNames = lines.map((line) => line.trim().split(/\\s+/)[0])\n\n // Initialize the boolean flags\n let has850GB = false\n let has400GB = false\n let hasUsed1250GB = false\n let hasThirdDisk400GB = false\n let rootDiskName = ''\n\n for (const line of lines) {\n const [name, sizeStr, mountpoint] = line.trim().split(/\\s+/)\n if (!name || !sizeStr) continue // Skip empty lines or lines without required data\n\n const size = parseInt(sizeStr, 10)\n if (isNaN(size)) continue // Skip lines where size is not a number\n const isMounted = mountpoint !== undefined && mountpoint !== ''\n if (mountpoint === '/') rootDiskName = name.replace(/p?\\d*$/, '') // Remove any trailing digits\n\n const hasPartition = allDiskNames.some(\n (diskName) => diskName !== name && diskName.startsWith(name),\n )\n\n\n // Soft check if a drive is an NVMe based on its name\n const isNVMe = name.startsWith('nvme')\n const diskType = isNVMe ? 'NVMe' : 'SATA'\n if (size >= 400 * 1024 * 1024 * 1024) {\n disks.push({\n name,\n size,\n mountpoint: mountpoint || '',\n isMounted,\n hasPartition,\n type: diskType\n })\n }\n }\n console.log(\"Found root disk name: \", rootDiskName)\n\n // Collect partitions of the root disk\n const rootDiskPartitions = allDiskNames.filter((diskName) =>\n diskName.startsWith(rootDiskName),\n )\n\n rootDiskPartitions.forEach((partition) => console.log(\"Found root disk partition: \", partition))\n\n // Remove root disk and its partitions from the list of disks\n const checkedDisks = disks.filter(\n (disk) => !rootDiskPartitions.includes(disk.name),\n )\n\n // Sort disks by size\n const sortedDisks = checkedDisks.sort((a, b) => b.size - a.size)\n\n // Separate NVMe and SATA disks, and sort by size (largest first)\n const nvmeDisks = sortedDisks\n .filter((disk) => disk.type === 'NVMe')\n .sort((a, b) => b.size - a.size);\n const sataDisks = sortedDisks\n .filter((disk) => disk.type === 'SATA')\n .sort((a, b) => b.size - a.size);\n\n // Combine NVMe and SATA disks, prioritizing NVMe first\n const prioritizedDisks = [...nvmeDisks, ...sataDisks];\n\n // Check conditions based on sorted disks\n if (prioritizedDisks.length > 0) {\n const largestDisk = prioritizedDisks[0]\n if (largestDisk.size >= 850 * 1024 * 1024 * 1024 && !largestDisk.isMounted)\n has850GB = true\n if (largestDisk.size >= 1250 * 1024 * 1024 * 1024 && largestDisk.isMounted)\n hasUsed1250GB = true\n\n // Check second largest disk for has400GB\n if (prioritizedDisks.length > 1) {\n const secondLargestDisk = prioritizedDisks[1]\n if (\n secondLargestDisk.size >= 400 * 1024 * 1024 * 1024 &&\n !secondLargestDisk.isMounted\n )\n has400GB = true\n }\n\n // Check if a third disk is present\n if (prioritizedDisks.length > 2) {\n const thirdDisk = prioritizedDisks[2]\n if (\n thirdDisk.size >= 400 * 1024 * 1024 * 1024 &&\n !thirdDisk.isMounted\n ) {\n hasThirdDisk400GB = true\n }\n }\n }\n\n prioritizedDisks.forEach((disk, index) => console.log(`Prioritized Disk ${index + 1}: ${disk.name} ${disk.size}`))\n\n return { disks: prioritizedDisks, has850GB, has400GB, hasUsed1250GB, hasThirdDisk400GB }\n}\n\nexport default getPreferredDisks\n","import { spawnSync } from 'child_process'\n\nexport const formatDisk = (fileSystem: string) => {\n // Check if the disk is already formatted\n const checkDisk = spawnSync(`sudo blkid ${fileSystem}`, {\n shell: true,\n encoding: 'utf8',\n })\n\n // If the output is empty, the disk is not formatted\n if (!checkDisk.stdout.trim()) {\n const cmd = `sudo mkfs.ext4 ${fileSystem}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n spawnSync(`sudo udevadm trigger --action=change`, { shell: true })\n spawnSync(`sudo udevadm settle`, { shell: true })\n console.log(`${fileSystem} has been formatted.`)\n return true\n } else {\n spawnSync(`sudo udevadm trigger --action=change`, { shell: true })\n spawnSync(`sudo udevadm settle`, { shell: true })\n console.log(`${fileSystem} is already formatted.`)\n return false\n }\n}\n","import { MT_PATHS } from '@/config/config'\nimport sleep from '@/lib/sleep'\nimport { spawnSync } from 'child_process'\n\n/**\n * Helper to get UUID for a given device path\n */\n\nexport async function getUUID(devicePath: string): Promise<string> {\n for (let attempt = 1; attempt <= 5; attempt++) {\n const blkid = spawnSync(`sudo blkid -s UUID -o value ${devicePath}`, {\n shell: true,\n encoding: 'utf8',\n })\n\n const uuid = blkid.stdout.trim()\n\n if (uuid) {\n console.log(`[SUCCESS] Found UUID for ${devicePath}: ${uuid}`)\n return `UUID=${uuid}`\n }\n\n console.warn(\n `[WARN] Attempt ${attempt}: Failed to get UUID for ${devicePath}`,\n )\n await sleep(5000) // wait 1 second before retrying\n }\n\n console.error(`[ERROR] Giving up: No UUID for ${devicePath}, using raw path`)\n return devicePath\n}\n\n\nexport const ensureFstabEntries = async (\n fileSystem: string,\n fileSystem2 = '',\n fileSystem3 = '',\n isDouble = false,\n isTriple = false\n) => {\n const fs1 = await getUUID(fileSystem);\n const fs2 = await getUUID(fileSystem2);\n const fs3 = await getUUID(fileSystem3);\n\n let mtLine = `${fs1} ${MT_PATHS.ROOT} ext4 defaults 0 0`\n\n if (isDouble) {\n mtLine = `${fs1} ${MT_PATHS.LEDGER} ext4 defaults 0 0\n${fs2} ${MT_PATHS.ACCOUNTS} ext4 defaults 0 0`\n }\n\n if (isTriple) {\n mtLine = `${fs1} ${MT_PATHS.LEDGER} ext4 defaults 0 0\n${fs2} ${MT_PATHS.ACCOUNTS} ext4 defaults 0 0\n${fs3} ${MT_PATHS.SNAPSHOTS} ext4 defaults 0 0`\n }\n\n const lines = [mtLine]\n const output = spawnSync(`cat /etc/fstab`, {\n shell: true,\n encoding: 'utf8',\n })\n\n const fstabContent = output.stdout\n\n const linesToAdd: string[] = []\n\n for (const line of lines) {\n if (!fstabContent.includes(line)) {\n console.log(`[INFO] Line to add: ${line}`)\n linesToAdd.push(line)\n }\n }\n\n if (linesToAdd.length) {\n console.log(`[INFO] Lines to add all: ${linesToAdd}`)\n const addCmd = `echo \"${linesToAdd.join('\\n')}\" | sudo tee -a /etc/fstab`\n spawnSync(addCmd, {\n shell: true,\n encoding: 'utf8',\n })\n const reloadCmd = `sudo mount --all --verbose`\n spawnSync(reloadCmd, {\n shell: true,\n encoding: 'utf8',\n })\n console.log(`Added lines to /etc/fstab: \\n${linesToAdd.join('\\n')}`)\n } else {\n console.log('All lines are already present in /etc/fstab')\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const umount = (mountPath: string) => {\n try {\n const cmd = `sudo umount ${mountPath}`\n const { stderr } = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n if (stderr.includes('busy')) {\n return false\n }\n return true\n } catch (error) {\n console.log(`umount: ${error}`)\n return false\n }\n}\n","import getPreferredDisks, {\n GetPreferredDisksResult,\n} from '@/cli/check/mt/getLargestDisk'\nimport { MNT_DISK_TYPE } from '@/config/enums'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { formatDisk } from '../formatDisk'\nimport { ensureFstabEntries } from '@/cli/check/ensureMountAndFiles'\nimport { umount } from '@/cli/check/mt/umount'\nimport sleep from '@/lib/sleep'\n\nconst mountDirs = async () => {\n // This method can be improved later - Prioritize the NVMe disks over SATA disks\n // Currently, it is just selecting the first disk\n const disks: GetPreferredDisksResult = getPreferredDisks()\n\n const mountPoint = disks.disks[0].mountpoint\n // Detect if DISK_TYPE is TRIPLE, DOUBLE or SINGLE\n if (disks.has850GB && disks.has400GB && disks.disks.length >= 3) {\n // TRIPLE\n console.log('Setting up TRIPLE DISK...')\n\n await updateDefaultConfig({\n MNT_DISK_TYPE: MNT_DISK_TYPE.TRIPLE,\n })\n const fileSystemName1 = '/dev/' + disks.disks[0].name\n const fileSystemName2 = '/dev/' + disks.disks[1].name\n const fileSystemName3 = '/dev/' + disks.disks[2].name\n const isDisk1Formatted = formatDisk(fileSystemName1)\n const isDisk2Formatted = formatDisk(fileSystemName2)\n const isDisk3Formatted = formatDisk(fileSystemName3)\n\n let fileSystem1 = isDisk1Formatted ? fileSystemName1 : ''\n let fileSystem2 = isDisk2Formatted ? fileSystemName2 : ''\n let fileSystem3 = isDisk3Formatted ? fileSystemName3 : ''\n\n console.log('Waiting for formatting to finish...')\n await sleep(5000)\n \n await ensureFstabEntries(\n isDisk1Formatted ? fileSystem1 : '',\n isDisk2Formatted ? fileSystem2 : '',\n isDisk3Formatted ? fileSystem3 : '',\n false, // isDouble\n true // isTriple\n )\n } else if (disks.has850GB && disks.has400GB) {\n // DOUBLE\n console.log('Setting up DOUBLE DISK...')\n\n await updateDefaultConfig({\n MNT_DISK_TYPE: MNT_DISK_TYPE.DOUBLE,\n })\n const fileSystemName1 = '/dev/' + disks.disks[0].name\n const fileSystemName2 = '/dev/' + disks.disks[1].name\n const isDisk1Formatted = formatDisk(fileSystemName1)\n const isDisk2Formatted = formatDisk(fileSystemName2)\n\n let fileSystem1 = isDisk1Formatted ? fileSystemName1 : ''\n let fileSystem2 = isDisk2Formatted ? fileSystemName2 : ''\n\n await ensureFstabEntries(\n isDisk1Formatted ? fileSystem1 : '',\n isDisk2Formatted ? fileSystem2 : '',\n '', // No third disk\n true // isDouble\n )\n } else {\n // SINGLE\n console.log('Setting up SINGLE DISK...')\n await updateDefaultConfig({\n MNT_DISK_TYPE: MNT_DISK_TYPE.SINGLE,\n })\n\n if (!mountPoint.includes('/mnt')) {\n const fileSystem = '/dev/' + disks.disks[0].name\n formatDisk(fileSystem)\n await ensureFstabEntries(fileSystem)\n } else {\n umount(mountPoint)\n const fileSystem = '/dev/' + disks.disks[0].name\n formatDisk(fileSystem)\n await ensureFstabEntries(fileSystem)\n }\n }\n}\n\nexport default mountDirs\n","import { MT_PATHS } from '@/config/config'\nimport { spawnSync } from 'child_process'\n\nexport const setupPermissions = () => {\n const cmds = [\n `sudo mkdir -p ${MT_PATHS.ROOT}`,\n `sudo chown -R solv:solv ${MT_PATHS.ROOT}`,\n `sudo chmod -R 755 ${MT_PATHS.ROOT}`,\n `sudo mkdir -p ${MT_PATHS.ACCOUNTS}`,\n `sudo chown -R solv:solv ${MT_PATHS.ACCOUNTS}`,\n `sudo chmod -R 755 ${MT_PATHS.ACCOUNTS}`,\n `sudo mkdir -p ${MT_PATHS.LEDGER}`,\n `sudo chown -R solv:solv ${MT_PATHS.LEDGER}`,\n `sudo chmod -R 755 ${MT_PATHS.LEDGER}`,\n `sudo mkdir -p ${MT_PATHS.SNAPSHOTS}`,\n `sudo chown -R solv:solv ${MT_PATHS.SNAPSHOTS}`,\n `sudo chmod -R 755 ${MT_PATHS.SNAPSHOTS}`,\n ]\n\n for (const line of cmds) {\n spawnSync(line, { shell: true, stdio: 'ignore' })\n }\n}\n","import { SERVICE_PATHS } from '@/config/config'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\n\nexport function setupSystemd(): void {\n if (!existsSync(SERVICE_PATHS.SOL_SYSTEM_CONFIG21)) {\n console.log('Creating solana-validator.conf sysctl configuration file')\n\n const sysctlConfig = `\n# Increase UDP buffer sizes\nnet.core.rmem_default = 134217728\nnet.core.rmem_max = 134217728\nnet.core.wmem_default = 134217728\nnet.core.wmem_max = 134217728\n\n# Increase memory mapped files limit\nvm.max_map_count = 1000000\n\n# Increase number of allowed open file descriptors\nfs.nr_open = 1000000\n`\n\n const nofilesConfig = `\n# Increase process file descriptor count limit\n* - nofile 1000000\n`\n\n // Write sysctl configuration\n execSync(\n `echo \"${sysctlConfig}\" | sudo tee ${SERVICE_PATHS.SOL_SYSTEM_CONFIG21} > /dev/null`\n )\n\n // Apply sysctl configuration\n execSync(`sudo sysctl -p ${SERVICE_PATHS.SOL_SYSTEM_CONFIG21}`)\n\n // Update systemd configuration\n execSync(\n `echo \"DefaultFILE=1000000\" | sudo tee -a ${SERVICE_PATHS.SOL_SYSTEM_CONF}`\n )\n\n // Write nofiles configuration\n execSync(\n `echo \"${nofilesConfig}\" | sudo tee ${SERVICE_PATHS.SOL_NOFILES_CONF} > /dev/null`\n )\n }\n}\n","import { CONFIG, startupScriptPaths } from '@/config/config'\n\nexport const logRotates = (username = CONFIG.USERNAME, frankendancer: boolean) => {\n const { log } = startupScriptPaths()\n const service = frankendancer ? 'frankendancer' : 'agave'\n let body = `${log} {\n su ${username} ${username} \n daily\n rotate 1\n size 4G\n missingok\n compress\n postrotate\n systemctl kill -s USR1 solv.service\n endscript\n }\n `\n if (service === 'agave') {\n body = `${log} {\n su ${username} ${username} \n daily\n rotate 1\n size 4G\n missingok\n compress\n postrotate\n systemctl kill -s USR1 solv.service\n endscript\n }\n `\n return body\n }\n if (service === 'frankendancer') {\n body = `${log} {\n su ${username} ${username} \n daily\n size 4G\n rotate 1\n missingok\n compress\n copytruncate\n }\n `\n return body\n }\n return body\n}","import { logRotates } from '@/template/logRotates'\nimport { existsSync } from 'fs'\nimport { execSync } from 'child_process'\nimport { SERVICE_PATHS } from '@/config/config'\n\nexport function setupLogrotate(frankendancer = false): void {\n console.log('Creating logrotate configuration for solana')\n\n if (!frankendancer && existsSync(SERVICE_PATHS.SOL_LOGROTATE)) {\n console.log(\n 'SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.',\n )\n } \n if (!frankendancer && !existsSync(SERVICE_PATHS.SOL_LOGROTATE)) {\n const body = logRotates('solv', frankendancer)\n // Use sudo tee to write the file with superuser privileges\n execSync(\n `echo \"${body}\" | sudo tee ${SERVICE_PATHS.SOL_LOGROTATE} > /dev/null`,\n )\n console.log('Logrotate configuration created.')\n }\n if (frankendancer && existsSync(SERVICE_PATHS.FRANKENDANCER_LOGROTATE)) {\n console.log(\n 'FRANKENDANCER_LOGROTATE_PATH already exists. Skipping logrotate configuration.',\n )\n }\n if (frankendancer && !existsSync(SERVICE_PATHS.SOL_LOGROTATE)) {\n const body = logRotates('solv', frankendancer)\n // Use sudo tee to write the file with superuser privileges\n execSync(\n `echo \"${body}\" | sudo tee ${SERVICE_PATHS.FRANKENDANCER_LOGROTATE} > /dev/null`,\n )\n console.log('Logrotate configuration created.')\n }\n}\n","import { CONFIG, HOME_PATHS, startupScriptPaths } from '@/config/config'\n\nconst envMainnet =\n 'SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password'\nconst envTestnet =\n 'SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea'\n\nconst normalSolanaPath = `/home/${CONFIG.USERNAME}/.local/share/solana/install/active_release/bin`\n\nexport const solvService = (isTest = true) => {\n const { scriptPath } = startupScriptPaths(isTest)\n const environment = isTest ? envTestnet : envMainnet\n const solanaPath = normalSolanaPath\n const body = `[Unit]\nDescription=Solana Validator\nAfter=network.target\nStartLimitIntervalSec=0\n\n[Service]\nType=simple\nRestart=always\nRestartSec=1\nLimitNOFILE=1000000\nLogRateLimitIntervalSec=0\nUser=${CONFIG.USERNAME}\nEnvironment=PATH=${solanaPath}\nWorkingDirectory=${HOME_PATHS.ROOT}\nEnvironment=\"${environment}\"\nExecStart=${scriptPath}\n\n[Install]\nWantedBy=multi-user.target`\n return body\n}\n","import { solvService } from '@/template/solvService'\n\nimport { execSync } from 'child_process'\nimport { SERVICE_PATHS } from '@/config/config'\n\n// This will overwrite the solv.service file with the new configuration to easily switch between testnet and mainnet\nexport function setupSolvService(isTest = true): void {\n console.log('Creating solvService configuration for solana')\n const body = solvService(isTest)\n // Use sudo tee to write the file with superuser privileges\n execSync(`echo \"${body}\" | sudo tee ${SERVICE_PATHS.SOL_SERVICE} > /dev/null`)\n console.log('solv.service configuration created.')\n}\n","import { setupSystemd } from '@/cli/setup/setupSystemd'\nimport { setupLogrotate } from './setupLogrotate'\nimport { setupSolvService } from './setupSolvService'\n\nexport const makeServices = (isTest = true) => {\n setupLogrotate()\n setupSolvService(isTest)\n setupSystemd()\n}\n","import { spawnSync } from 'node:child_process'\nimport { createSolvKeyPairs } from '@/lib/createSolvKeys'\nimport { setupVoteAccount } from '@/cli/setup/setupVoteAccount'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport {\n MAINNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n} from '@/config/constants'\n\nexport const setupKeys = (config: DefaultConfigType) => {\n try {\n createSolvKeyPairs(config)\n const network = config.NETWORK\n // AirDrop 1 SOL if it's a testnet\n if (network === Network.TESTNET) {\n spawnSync(\n `solana config set --url ${network} -k ${TESTNET_VALIDATOR_KEY_PATH}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `solana airdrop 1 --url ${network} -k ${TESTNET_VALIDATOR_KEY_PATH}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `solana config set --url ${network} -k ${MAINNET_VALIDATOR_KEY_PATH}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n\n if (config.NODE_TYPE !== NodeType.RPC) {\n setupVoteAccount(config)\n }\n return true\n } catch (error) {\n throw new Error(`setupKeys Error: ${error}`)\n }\n}\n","import { ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n\nexport const startSolana = (config: DefaultConfigType) => {\n const service =\n config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n ? 'frankendancer'\n : 'solv'\n const cmd = [`sudo systemctl start ${service}`]\n spawnSync(cmd[0], { shell: true, stdio: 'inherit' })\n}\n","import { execSync } from 'node:child_process'\n\nconst setupCpuGovernor = () => {\n try {\n const cmd = `echo \"performance\" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor`\n execSync(cmd)\n } catch (error) {\n // ppl complain if they see error messages\n // console.error(\n // 'Error setting up CPU Governor\\nPlease Check your cpu governor yourself',\n // error,\n // )\n }\n}\n\nexport default setupCpuGovernor\n","import fs from 'fs'\nimport { promisify } from 'util'\nimport { execSync } from 'child_process'\n\nconst readFile = promisify(fs.readFile)\nconst access = promisify(fs.access)\n\nconst path = '/etc/sysctl.conf'\n\nconst sysconfig = `# set default and maximum socket buffer sizes to 128MB\nnet.core.rmem_default=134217728\nnet.core.wmem_default=134217728\nnet.core.rmem_max=134217728\nnet.core.wmem_max=134217728\n\n# set minimum, default, and maximum tcp buffer sizes (10k, 87.38k (linux default), 128MB resp)\nnet.ipv4.tcp_rmem=10240 87380 134217728\nnet.ipv4.tcp_wmem=10240 87380 134217728\n\n# Enable TCP westwood for kernels greater than or equal to 2.6.13\nnet.ipv4.tcp_congestion_control=westwood`\n\nasync function updateSysctlConfig(): Promise<void> {\n try {\n // Check if the file exists\n await access(path, fs.constants.F_OK)\n } catch (err) {\n return console.log(`Skipping updateSysctlConfig: ${path} does not exist`)\n }\n try {\n const data = await readFile(path, 'utf8')\n\n if (!data.includes('rmem_default')) {\n console.log('No need to update sysctl.conf')\n return\n }\n // Remove existing relevant lines\n let updatedConfig = data.replace(\n /net\\.core\\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\\n/g,\n '',\n )\n updatedConfig = updatedConfig.replace(\n /net\\.ipv4\\.tcp_(rmem|wmem|congestion_control)=.*\\n/g,\n '',\n )\n\n // Append new configuration\n updatedConfig += `\\n${sysconfig}\\n`\n\n // Write to the file using execSync and sudo tee\n execSync(`echo \"${updatedConfig}\" | sudo tee ${path} > /dev/null`)\n execSync('sudo sysctl -p')\n console.log('sysctl.conf updated successfully')\n } catch (err) {\n console.error(`Error: ${err}`)\n }\n}\n\nexport default updateSysctlConfig\n","import { spawnSync } from 'child_process'\n\nexport const restartLogrotate = () => {\n spawnSync('sudo systemctl restart logrotate', {\n shell: true,\n stdio: 'inherit',\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const enableSolv = () => {\n spawnSync('sudo systemctl enable solv', { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'child_process'\n\nexport const createSymLink = (isDummy = false, isTest = false) => {\n if (isDummy) {\n createInactiveSymLink()\n } else {\n createActiveSymLink(isTest)\n }\n}\n\nexport const createActiveSymLink = (isTest = false) => {\n let network = 'mainnet'\n if (isTest) {\n network = 'testnet'\n }\n spawnSync(\n `ln -sf /home/solv/${network}-validator-keypair.json /home/solv/identity.json`,\n { shell: true, stdio: 'inherit' },\n )\n}\n\nexport const createInactiveSymLink = () => {\n spawnSync(\n `ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json`,\n { shell: true, stdio: 'inherit' },\n )\n}\n","import chalk from 'chalk'\n\nconst rpcLog = () => {\n const lighting = `${chalk.yellow('⚡️⚡️⚡️')}`\n const msg = `${chalk.blueBright(`${lighting} Solana Private RPC Connection API Key ${lighting}`)}\n\nWe're excited to offer a free API key exclusively for the Validators DAO community 🎉\nIt's our way of supporting the community and empowering you with fast, reliable connections.\n\nTo get your free API key, simply join us through the link below:\n\nValidators DAO: ${chalk.white('`https://discord.gg/X4BgkBHavp`')}\n\nUnlock fast connections and elevate your experience with your very own API key 🚀\n`\n console.log(chalk.cyan(msg))\n}\n\nexport default rpcLog\n","import { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET, VERSION_MAINNET, VERSION_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { promises as fs } from 'fs'\nimport startFiredancerScript from './startFiredancerScript'\nimport firedancerService from '../template/firedancer/firedancerService'\nimport configToml from '../template/firedancer/configToml'\nimport portRelayService from '../template/firedancer/portRelayService'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { setupLogrotate } from '../setupLogrotate'\n\nconst setupFiredancer = async (mod = false, config?: DefaultConfigType) => {\n const isTest = config && config.NETWORK === Network.TESTNET ? true : false\n const latestVersion = isTest ? VERSION_FIREDANCER_TESTNET : VERSION_FIREDANCER\n const latestSubmoduleVersion = isTest ? VERSION_TESTNET : VERSION_MAINNET\n\n if (mod) {\n spawnSync(\n `git clone --recurse-submodules https://github.com/gabrielhicks/firedancer.git`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`git checkout v${latestVersion}-mod`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git checkout v${latestSubmoduleVersion}-mod`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer/agave',\n })\n spawnSync(`git add .`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git commit -m \"add mods\"`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n } else {\n spawnSync(\n `git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(`git checkout v${latestVersion}`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n }\n // Temp rust bug\n spawnSync(`rustup uninstall 1.84.1-x86_64-unknown-linux-gnu`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`rustup install 1.84.1`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n\n spawnSync(\n `export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install`,\n {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n },\n )\n spawnSync(`make -j fdctl solana`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(\n `sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n const jitoConfig = await readOrCreateJitoConfig()\n const { filePath, body } = startFiredancerScript()\n spawnSync(`echo \"${body}\" | sudo tee ${filePath} > /dev/null`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`sudo chmod +x ${filePath}`, { shell: true, stdio: 'inherit' })\n const fdService = firedancerService()\n spawnSync(\n `echo \"${fdService.body}\" | sudo tee ${fdService.filePath} > /dev/null`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n const prService = portRelayService()\n spawnSync(`sudo apt install socat`, { shell: true, stdio: 'inherit' })\n spawnSync(`sudo ufw allow 9600/tcp`, { shell: true, stdio: 'inherit' })\n spawnSync(\n `echo \"${prService.body}\" | sudo tee ${prService.filePath} > /dev/null`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n spawnSync(`sudo systemctl daemon-reload`, { shell: true })\n const toml = configToml(isTest, jitoConfig)\n\n await fs.writeFile(toml.filePath, toml.body, 'utf-8')\n\n console.log(`config.toml written to ${toml.filePath}`)\n spawnSync(`sudo chown solv:solv \"${toml.filePath}\"`, {\n shell: true,\n stdio: 'inherit',\n })\n setupLogrotate(true)\n}\n\nexport default setupFiredancer\n","const startFiredancerScript = () => {\n const filePath = '/home/solv/start-firedancer.sh'\n const body = `#!/usr/bin/env bash\nsudo chmod -R 755 /mnt\nsudo fdctl configure init all --config /home/solv/firedancer/config.toml\nsudo chown -R solv:solv /mnt\nsudo fdctl run --config /home/solv/firedancer/config.toml`\n return {\n filePath,\n body,\n }\n}\n\nexport default startFiredancerScript\n","const firedancerService = () => {\n const filePath = '/etc/systemd/system/frankendancer.service'\n const body = `[Unit]\nDescription=Firedancer Solana\nAfter=network.target\nStartLimitIntervalSec=0\n\n[Service]\nType=simple\nRestart=always\nRestartSec=1\nUser=solv\nLimitNOFILE=1000000\nLogRateLimitIntervalSec=0\nExecStart=/home/solv/start-firedancer.sh\n\n[Install]\nWantedBy=multi-user.target\n`\n\n return {\n filePath,\n body,\n }\n}\n\nexport default firedancerService\n","import { JitoConfig } from \"@/config/jitConfig\"\n\nconst configToml = (isTest: boolean, jitoConfig: JitoConfig) => {\n const filePath = '/home/solv/firedancer/config.toml'\n const mainnetBody = `name = \\\"fd1\\\"\nuser = \\\"solv\\\"\n\n[log]\n path = \\\"/home/solv/solana-validator.log\\\"\n colorize = \\\"auto\\\"\n level_logfile = \\\"INFO\\\"\n level_stderr = \\\"NOTICE\\\"\n level_flush = \\\"WARNING\\\"\n\n[reporting]\n solana_metrics_config = \\\"host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password\"\n\n[ledger]\n path = \\\"/mnt/ledger\\\"\n accounts_path = \\\"/mnt/accounts\\\"\n account_indexes = []\n account_index_exclude_keys = []\n snapshot_archive_format = \\\"zstd\\\"\n require_tower = false\n limit_size = 50_000_000\n enable_accounts_disk_index = false\n\n[snapshots]\n enabled = true\n incremental_snapshots = true\n path = \\\"/mnt/snapshots\\\"\n incremental_path = \\\"/mnt/snapshots\\\"\n maximum_full_snapshots_to_retain = 1\n maximum_incremental_snapshots_to_retain = 2\n\n[gossip]\n entrypoints = [\n \\\"entrypoint.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint2.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint3.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint4.mainnet-beta.solana.com:8001\\\",\n \\\"entrypoint5.mainnet-beta.solana.com:8001\\\"\n ]\n\n[consensus]\n identity_path = \\\"/home/solv/identity.json\\\"\n vote_account_path = \\\"/home/solv/mainnet-vote-account-keypair.json\\\"\n authorized_voter_paths = [\n \\\"/home/solv/mainnet-validator-keypair.json\\\"\n ]\n expected_genesis_hash = \\\"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d\\\"\n known_validators = [\n \\\"Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24\\\", \n \\\"7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2\\\",\n \\\"GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ\\\",\n \\\"CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S\\\",\n \\\"rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg\\\",\n \\\"phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1\\\",\n \\\"wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo\\\",\n \\\"YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV\\\",\n \\\"dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S\\\"\n ]\n\n[rpc]\n port = 8899\n only_known = true\n full_api = true\n private = true\n\n[layout]\n affinity = \\\"auto\\\"\n agave_affinity = \\\"auto\\\"\n net_tile_count = 1\n quic_tile_count = 1\n verify_tile_count = 6\n bank_tile_count = 4\n shred_tile_count = 1\n\n[tiles.bundle]\n enabled = true\n url = \\\"${jitoConfig.blockEngineUrl}\\\"\n tip_distribution_program_addr = \\\"4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7\\\"\n tip_payment_program_addr = \\\"T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt\\\"\n tip_distribution_authority = \\\"GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib\\\"\n commission_bps = 1000\n\n[tiles.pack]\n schedule_strategy = \\\"balanced\\\"`\n\n const testnetBody = `name = \\\"fd1\\\"\nuser = \\\"solv\\\"\n\n[log]\n path = \\\"/home/solv/solana-validator.log\\\"\n colorize = \\\"auto\\\"\n level_logfile = \\\"INFO\\\"\n level_stderr = \\\"NOTICE\\\"\n level_flush = \\\"WARNING\\\"\n\n[reporting]\n solana_metrics_config = \\\"host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea\\\"\n\n[ledger]\n path = \\\"/mnt/ledger\\\"\n accounts_path = \\\"/mnt/accounts\\\"\n account_indexes = []\n account_index_exclude_keys = []\n snapshot_archive_format = \\\"zstd\\\"\n require_tower = false\n limit_size = 50_000_000\n\n[snapshots]\n enabled = true\n incremental_snapshots = true\n path = \\\"/mnt/snapshots\\\"\n maximum_full_snapshots_to_retain = 1\n maximum_incremental_snapshots_to_retain = 2\n\n[gossip]\n entrypoints = [\n \\\"entrypoint.testnet.solana.com:8001\\\",\n \\\"entrypoint2.testnet.solana.com:8001\\\",\n \\\"entrypoint3.testnet.solana.com:8001\\\"\n ]\n\n[consensus]\n identity_path = \\\"/home/solv/identity.json\\\"\n vote_account_path = \\\"/home/solv/testnet-vote-account-keypair.json\\\"\n authorized_voter_paths = [\n \\\"/home/solv/testnet-validator-keypair.json\\\"\n ]\n expected_genesis_hash = \\\"4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY\\\"\n expected_bank_hash = \\\"4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk\\\"\n expected_shred_version = 9065\n known_validators = [\n \\\"5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on\\\", \n \\\"dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs\\\",\n \\\"Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN\\\",\n \\\"eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ\\\",\n \\\"rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg\\\",\n \\\"phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1\\\",\n \\\"hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M\\\",\n \\\"naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi\\\",\n \\\"9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv\\\"\n ]\n\n[rpc]\n port = 8899\n only_known = true\n full_api = true\n private = true\n\n[layout]\n affinity = \\\"auto\\\"\n agave_affinity = \\\"auto\\\"\n shred_tile_count = 1\n verify_tile_count = 1\n bank_tile_count = 1\n quic_tile_count = 1\n \n[tiles.bundle]\n enabled = true\n url = \\\"https://ny.testnet.block-engine.jito.wtf\\\"\n tip_distribution_program_addr = \\\"F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2\\\"\n tip_payment_program_addr = \\\"GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy\\\"\n tip_distribution_authority = \\\"GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib\\\"\n commission_bps = 10000\n\n[tiles.pack]\n schedule_strategy = \"balanced\"`\n\n const body = isTest ? testnetBody : mainnetBody\n\n return { filePath, body }\n}\n\nexport default configToml\n","const portRelayService = () => {\n const filePath = '/etc/systemd/system/port-relay.service'\n const body = `[Unit]\nDescription=Relay port 9600 to localhost:80\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/socat TCP4-LISTEN:9600,reuseaddr,fork TCP:127.0.0.1:80\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\n`\n\n return {\n filePath,\n body,\n }\n}\n\nexport default portRelayService\n","export const relayerService = (blockEngineUrl: string) => {\n const filePath = '/etc/systemd/system/relayer.service'\n const body = `# Example Systemd File for Co-Hosted Relayer\n[Unit]\nDescription=Solana transaction relayer\nRequires=network-online.target\nAfter=network-online.target\n\n# User is required to install a keypair here that's used to auth against the block engine\nConditionPathExists=/home/solv/relayer-keypair.json\nConditionPathExists=/home/solv/private.pem\nConditionPathExists=/home/solv/public.pem\n\n[Service]\nType=exec\nUser=solv\nRestart=on-failure\nEnvironment=RUST_LOG=info\nEnvironment=SOLANA_METRICS_CONFIG=\"host=http://metrics.jito.wtf:8086,db=relayer,u=relayer-operators,p=jito-relayer-write\"\nEnvironment=BLOCK_ENGINE_URL=${blockEngineUrl}\nEnvironment=GRPC_BIND_IP=127.0.0.1\n\nExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\\\\n --keypair-path=/home/solv/relayer-keypair.json \\\\\n --signing-key-pem-path=/home/solv/private.pem \\\\\n --verifying-key-pem-path=/home/solv/public.pem\n\n[Install]\nWantedBy=multi-user.target`\n return { filePath, body }\n}\n\nexport const jitoRelayerSeparateService = (blockEngineUrl: string) => {\n const filePath = '/etc/systemd/system/relayer.service'\n const body = `[Unit]\nDescription=Solana transaction relayer\nRequires=network-online.target\nAfter=network-online.target\n\n# User is required to install a keypair here that's used to auth against the block engine\nConditionPathExists=/home/solv/relayer-keypair.json\nConditionPathExists=/home/solv/private.pem\nConditionPathExists=/home/solv/public.pem\n\n[Service]\nType=exec\nUser=solv\nRestart=on-failure\nEnvironment=RUST_LOG=info\nEnvironment=SOLANA_METRICS_CONFIG=\"host=http://metrics.jito.wtf:8086,db=relayer,u=relayer-operators,p=jito-relayer-write\"\nEnvironment=BLOCK_ENGINE_URL=${blockEngineUrl}\nEnvironment=RPC_SERVERS=https://your.rpc.server\nEnvironment=WEBSOCKET_SERVERS=wss://your.websocket.server\n\nExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\\n --keypair-path=/home/solv/relayer-keypair.json \\\n --signing-key-pem-path=/home/solv/private.pem \\\n --verifying-key-pem-path=/home/solv/public.pem \\\n --forward-all\n\n[Install]\nWantedBy=multi-user.target`\n return { filePath, body }\n}\n","import {\n jitoRelayerSeparateService,\n relayerService,\n} from '@/template/relayerService'\nimport { execSync, spawnSync } from 'child_process'\n\nexport const jitoRelayerSetup = async (\n blockEngineUrl: string,\n isCoHost = true,\n) => {\n // Create openssl keypair\n spawnSync('openssl', ['genrsa', '-out', '/home/solv/private.pem'], {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(\n 'openssl',\n [\n 'rsa',\n '-in',\n '/home/solv/private.pem',\n '-pubout',\n '-out',\n '/home/solv/public.pem',\n ],\n { stdio: 'inherit', shell: true },\n )\n\n // Create relayer keypair\n spawnSync(\n 'solana-keygen',\n [\n 'new',\n '--no-bip39-passphrase',\n '--outfile',\n '/home/solv/relayer-keypair.json',\n ],\n { stdio: 'inherit', shell: true },\n )\n\n // Clone and build relayer\n spawnSync(\n 'git',\n ['clone', 'https://github.com/jito-foundation/jito-relayer.git'],\n {\n stdio: 'inherit',\n shell: true,\n },\n )\n spawnSync('git', ['submodule', 'update', '--init', '--recursive'], {\n cwd: 'jito-relayer',\n stdio: 'inherit',\n shell: true,\n })\n spawnSync('cargo', ['build', '--release'], {\n cwd: 'jito-relayer',\n stdio: 'inherit',\n shell: true,\n })\n\n // Create relayer service\n const { filePath, body } = isCoHost\n ? relayerService(blockEngineUrl)\n : jitoRelayerSeparateService(blockEngineUrl)\n execSync(`echo \"${body}\" | sudo tee ${filePath} > /dev/null`)\n spawnSync('sudo', ['systemctl', 'enable', 'relayer'], { stdio: 'inherit' })\n spawnSync('sudo', ['systemctl', 'start', 'relayer'], { stdio: 'inherit' })\n\n // Update firewall\n execSync('sudo ufw allow 11228', { stdio: 'inherit' })\n execSync('sudo ufw allow 11229', { stdio: 'inherit' })\n execSync('sudo ufw allow 11226', { stdio: 'inherit' })\n\n // Update startup script\n}\n","import { spawnSync } from 'node:child_process'\nimport geyserConfig from './geyserConfig'\nimport addConfigToStartupScript from './addConfigToStartupScript'\nimport inquirer from 'inquirer'\nimport { writeFile } from 'node:fs/promises'\n\nexport const yellowstoneGeyser = async () => {\n const xTokenAnswer = await inquirer.prompt<{ xToken: string }>([\n {\n type: 'input',\n name: 'xToken',\n message: 'Enter the xToken',\n default: 'xToken',\n },\n ])\n const xToken = xTokenAnswer.xToken\n const cmd = `git clone https://github.com/rpcpool/yellowstone-grpc.git`\n const cmd2 = `cargo build -r`\n const cmd3 = `cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n spawnSync(cmd2, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/yellowstone-grpc',\n })\n spawnSync(cmd3, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/yellowstone-grpc',\n })\n const { filePath, defaultConfig } = geyserConfig(xToken)\n const jsonString = JSON.stringify(defaultConfig, null, 2)\n await writeFile(filePath, jsonString, { encoding: 'utf8' })\n\n // Add config to startup script\n await addConfigToStartupScript()\n}\n","const geyserConfig = (xToken: string) => {\n const filePath = `/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json`\n const defaultConfig = {\n libpath:\n '/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so',\n log: {\n level: 'info',\n },\n grpc: {\n address: '0.0.0.0:10000',\n compression: {\n accept: ['gzip'],\n send: ['gzip'],\n },\n max_decoding_message_size: '4_194_304',\n snapshot_plugin_channel_capacity: null,\n snapshot_client_channel_capacity: '50_000_000',\n channel_capacity: '100_000',\n unary_concurrency_limit: 100,\n unary_disabled: false,\n x_token: xToken,\n },\n prometheus: {\n address: '0.0.0.0:8999',\n },\n }\n return {\n filePath,\n defaultConfig,\n }\n}\n\nexport default geyserConfig\n","import { spawnSync } from 'node:child_process'\nimport { readFile, writeFile } from 'fs/promises'\n\nconst addConfigToStartupScript = async () => {\n const startupScriptPath = '/home/solv/start-validator.sh'\n const startupScript = await readFile(startupScriptPath, 'utf-8')\n // Add one line to the second from the last line of the startup script\n const lines = startupScript.split('\\n')\n lines.splice(\n -1,\n 0,\n '--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\\\',\n )\n const newStartupScript = lines.join('\\n')\n await writeFile(startupScriptPath, newStartupScript)\n spawnSync(`chmod +x ${startupScriptPath}`, {\n shell: true,\n stdio: 'inherit',\n })\n}\n\nexport default addConfigToStartupScript\n","import { UbuntuDhParams } from '@/types/solvTypes'\nimport { execSync } from 'child_process'\nimport { convertToBytes } from '.'\n\nexport const df = () => {\n const output = execSync('df -h').toString()\n const lines = output.split('\\n').slice(1)\n\n const parsedData = lines\n .filter((line) => line.split(/\\s+/)[0] !== '')\n .map((line) => {\n const segments = line.split(/\\s+/)\n return {\n Filesystem: segments[0],\n Size: segments[1],\n Used: segments[2],\n Avail: segments[3],\n Use: segments[4],\n MountedOn: segments[5],\n } as UbuntuDhParams\n })\n .sort((a, b) => convertToBytes(b.Avail) - convertToBytes(a.Avail))\n .slice(0, 10)\n\n const isMountedOnCorrect = parsedData.some(\n (data) =>\n data.MountedOn === '/mnt' && convertToBytes(data.Size) > 900e9 - 1,\n )\n\n parsedData.forEach((data) => {\n if (data.MountedOn === '/mnt' && convertToBytes(data.Size) > 900e9 - 1) {\n console.log(\n `%c${data.Filesystem}\\t${data.Size}\\t${data.MountedOn}`,\n 'color: green',\n )\n } else if (\n data.Filesystem.startsWith('/dev/') &&\n convertToBytes(data.Size) > 900e9 - 1\n ) {\n console.log(\n `%c${data.Filesystem}\\t${data.Size}\\t${data.MountedOn}`,\n 'color: red',\n )\n }\n })\n\n if (isMountedOnCorrect) {\n console.log('your mount point is correct')\n } else {\n const fsNames = parsedData\n .filter(\n (data) =>\n data.Filesystem.startsWith('/dev/') &&\n convertToBytes(data.Size) > 900e9 - 1,\n )\n .map((data) => data.Filesystem)\n if (fsNames.length > 0) {\n // console.log(\n // Logger.warningHex(\n // `\\nfileSystem might be one of ${fsNames.join(', ')} ...?`,\n // ),\n // )\n }\n }\n\n return parsedData\n}\n","import { UbuntuDhParams } from '@/types/solvTypes'\nimport chalk from 'chalk'\nimport Table from 'cli-table3'\n\nexport const displayTable = (data: UbuntuDhParams[]) => {\n const head = ['Filesystem', 'Size', 'Used', 'Avail', 'Use', 'MountedOn'].map(\n (item) => chalk.blue(item)\n )\n // テーブルのヘッダーを定義\n const table = new Table({\n head,\n colWidths: [20, 10, 10, 10, 10, 20],\n })\n\n // 各行のデータをテーブルに追加\n data.forEach((row) => {\n table.push(\n [\n row.Filesystem,\n row.Size,\n row.Used,\n row.Avail,\n row.Use,\n row.MountedOn,\n ].map((item) => chalk.white(item))\n )\n })\n\n // テーブルを表示\n console.log(table.toString())\n}\n","import { program } from '@/index'\nimport { df } from './df'\nimport { displayTable } from '@/lib/logger/table'\n\nexport const dfCommands = async () => {\n program\n .command('df')\n .description('Disk Free Command')\n .action(() => {\n const dirs = df()\n displayTable(dirs)\n })\n}\n\nexport const convertToBytes = (size: string): number => {\n const units: { [key: string]: number } = {\n K: 1e3,\n KB: 1e3,\n M: 1e6,\n MB: 1e6,\n G: 1e9,\n GB: 1e9,\n T: 1e12,\n TB: 1e12,\n }\n const unit = size.match(/[A-Za-z]+/)?.[0] || ''\n const number = parseFloat(size)\n\n return units[unit] ? number * units[unit] : number\n}\n","import { program } from '@/index'\nimport { startSolana } from './startSolana'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startCommand = (config: DefaultConfigType) => {\n program\n .command('start')\n .description('Start Solana Validator')\n .action(() => {\n startSolana(config)\n process.exit(0)\n })\n}\n","import { \n // Network, \n ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n// import { readlink } from 'fs/promises'\nimport chalk from 'chalk'\n// import readline from 'readline'\n\nexport const stopSolana = async (config: DefaultConfigType) => {\n chalk.white(console.log('Starting solv stop process...'))\n const service =\n config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n ? 'frankendancer'\n : 'solv'\n // const isTest = config.NETWORK === Network.TESTNET\n\n // const symlinkPath = '/home/solv/identity.json'\n // const targetPath = '/home/solv/mainnet-validator-keypair.json'\n\n // if (!isTest) {\n // let symlinkTarget = ''\n // try {\n // symlinkTarget = await readlink(symlinkPath)\n // chalk.white(console.log(`Confirmed symlink at: ${symlinkTarget}`))\n // } catch (err) {\n // chalk.white(console.log(`Could not verify symlink`))\n // }\n\n // if (symlinkTarget === targetPath) {\n // const confirmed = await promptConfirm(\n // `WARNING: You are about to stop a mainnet validator using the mainnet keypair (${targetPath}).\\nAre you sure? (yes/no): `,\n // )\n // if (!confirmed) {\n // chalk.white(console.log('Operation cancelled.'))\n // return\n // }\n // }\n // }\n\n const cmd = [`sudo systemctl stop ${service}`]\n spawnSync(cmd[0], { shell: true, stdio: 'inherit' })\n}\n\n// function promptConfirm(question: string): Promise<boolean> {\n// const rl = readline.createInterface({\n// input: process.stdin,\n// output: process.stdout,\n// })\n\n// return new Promise((resolve) => {\n// rl.question(question, (answer) => {\n// rl.close()\n// resolve(answer.trim().toLowerCase() === 'yes')\n// })\n// })\n// }\n","import { program } from '@/index'\nimport { stopSolana } from './stopSolana'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const stopCommand = (config: DefaultConfigType) => {\n program\n .command('stop')\n .description('Stop Solana Validator')\n .action(() => {\n stopSolana(config)\n process.exit(0)\n })\n}\n","import { program } from '@/index'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport { DefaultConfigType } from '@/config/types'\nimport getSolanaCLI from '@/config/getSolanaCLI'\nimport { Network } from '@/config/enums'\n\nexport const restartCommand = (config: DefaultConfigType) => {\n let solanaValidatorClient = getSolanaCLI()\n program\n .command('restart')\n .description('Restart Solana Validator')\n .option('-r, --rm', 'Remove Snapshot and Restart Validator', false)\n .action(async (options: { rm: boolean }) => {\n const isAutoRestart = config.AUTO_RESTART\n const isTestnet = config.NETWORK === Network.TESTNET\n const minIdleTime = isAutoRestart && isTestnet ? 10 : 30\n if (options.rm) {\n console.log(\n chalk.white('👷‍♀️ Removing Snapshot and Restarting Validator...'),\n )\n spawnSync('solv stop', { stdio: 'inherit', shell: true })\n spawnSync('solv rm:snapshot', { stdio: 'inherit', shell: true })\n spawnSync('solv get snapshot', { stdio: 'inherit', shell: true })\n spawnSync('solv start', { stdio: 'inherit', shell: true })\n console.log(chalk.green('✔︎ Successfully Restarted Validator'))\n process.exit(0)\n }\n const cmd = `${solanaValidatorClient} --ledger ${config.LEDGER_PATH} exit --max-delinquent-stake ${config.MAINNET_DELINQUENT_STAKE} --min-idle-time ${minIdleTime}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n process.exit(0)\n })\n}\n","import { program } from '@/index'\nimport { updateVersion } from '../update'\nimport { jitoUpdate } from '../update/jitoUpdate'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType, ValidatorType } from '@/config/enums'\nimport {\n VERSION_JITO_MAINNET,\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\n\nexport const installCommands = (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n let version = isTestnet ? VERSION_TESTNET : VERSION_MAINNET\n if (config.NODE_TYPE === NodeType.RPC) {\n version = VERSION_SOLANA_RPC\n }\n program\n .command('install')\n .alias('i')\n .description('Install Solana Client')\n .option(\n '-v, --version <version>',\n `Solana Version e.g. ${version}`,\n version,\n )\n .option(\n '-m, --mod <version>',\n `Use modified installer`,\n false,\n )\n .action(async (options: { version: string, mod: boolean }) => {\n const isJito = config.VALIDATOR_TYPE === ValidatorType.JITO\n const isModified = options.mod || config.MOD;\n if (isJito) {\n const jitoVersion = options.version || VERSION_JITO_MAINNET\n const jitoTag = `v${jitoVersion}`\n jitoUpdate(jitoTag, isModified)\n return\n }\n const isRPC = config.NODE_TYPE === NodeType.RPC\n if (isRPC) {\n version = VERSION_SOLANA_RPC\n }\n const solanaCLIVersion = options.version || version\n await updateVersion(solanaCLIVersion, isModified)\n })\n}\n","import { program } from '@/index'\nimport { spawnSync } from 'child_process'\nimport getPreferredDisk from './getLargestDisk'\n\nexport const mountCommands = () => {\n program\n .command('mtr')\n .description('Mount Reload Command')\n .action(() => {\n const cmd = `sudo mount --all --verbose`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n })\n\n program\n .command('disks')\n .description('Show unmounted disks')\n .action(() => {\n const disks = getPreferredDisk()\n console.log(disks)\n })\n}\n","import { program } from '@/index'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport hasEpochTimer from './hasEpochTimer'\n\ntype CronOptions = {\n cron: string\n epoch: string\n}\n\nexport const cronCommands = () => {\n const crond = program.command('cron').description(`Cron Job Commands`)\n\n crond\n .command('epoch')\n .description('Solv Epoch Timer Discord Notification Command')\n .option('-c, --cron <value>', 'Cron Job', '*/5 14-22 * * *')\n .action(async (options: CronOptions) => {\n const hasCron = await hasEpochTimer()\n if (hasCron) {\n console.log(chalk.green('⚠️ Epoch Timer Cron Job already set'))\n process.exit(1)\n }\n const cronJob = `(crontab -l 2>/dev/null; echo \"${options.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1\") | crontab -`\n spawnSync(cronJob, { shell: true, stdio: 'inherit' })\n console.log(chalk.green('✅ Epoch Timer Cron Job Set'))\n })\n}\n","import { spawnSync } from 'child_process'\n\nconst hasEpochTimer = async (): Promise<boolean> => {\n try {\n const result = spawnSync('crontab', ['-l'], { encoding: 'utf-8' })\n if (result.status !== 0) {\n console.log('No crontab for this user.')\n return false\n }\n\n const crontabList = result.stdout\n console.log(crontabList)\n return crontabList.includes('solv epochTimer')\n } catch (error) {\n console.error('Error reading crontab:', error)\n return false\n }\n}\n\nexport default hasEpochTimer\n","export const SOLV_CLIENT_PATHS = {\n SOLV_KEYPAIR_DOWNLOAD_PATH: '/solvKeys/download',\n SOLV_KEYPAIR_UPLOAD_PATH: '/solvKeys/upload',\n SOLV_KEYPAIR_UPLOAD_PATH_LINUX: '/home/solv',\n SOLV_KEYPAIR_TRASH_PATH: '/solvKeys/trash',\n SSH_PUBKEY_PATH: '/.ssh/id_rsa.pub',\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { SOLV_CLIENT_PATHS } from '@/config/solvClient'\nimport { existsSync, mkdirSync } from 'fs'\nimport inquirer from 'inquirer'\nimport { homedir } from 'os'\nimport { executeSCP } from './executeSCP'\nimport { RELAYER_KEY, UNSTAKED_KEY } from '@/config/constants'\n\nexport const download = async (ip = '') => {\n let migrateIP = ip\n if (ip === '') {\n const answer = await inquirer.prompt<{ ip: string }>([\n {\n type: 'input',\n name: 'ip',\n message: 'Enter your Ubuntu Server IP',\n default() {\n return '1.1.1.1'\n },\n },\n ])\n migrateIP = answer.ip\n }\n const solanaKeys = Object.values(getAllKeyPaths())\n const homeDirectory = homedir()\n const keyDir = homeDirectory.includes('/home/solv')\n ? '/home/solv'\n : homeDirectory + SOLV_CLIENT_PATHS.SOLV_KEYPAIR_DOWNLOAD_PATH\n if (!existsSync(keyDir)) {\n mkdirSync(keyDir, { recursive: true })\n }\n const isDownload = true\n const relayerKeyPath = homeDirectory + '/' + RELAYER_KEY\n solanaKeys.push(relayerKeyPath)\n for (const key of solanaKeys) {\n const splits = key.split('/')\n let fileName = splits[splits.length - 1]\n fileName = homeDirectory.includes('/home/solv')\n ? fileName\n : fileName.replace('.json', `-${migrateIP}.json`)\n const filePath = `${keyDir}/${fileName}`\n const result = executeSCP(migrateIP, key, filePath, isDownload)\n if (result) {\n console.log(`Successfully Exported - ${filePath} 🎉`)\n }\n }\n}\n","import { spawnSync } from 'node:child_process'\n\nexport function executeSCP(\n ip: string,\n key: string,\n filePath: string,\n isDownload: boolean,\n) {\n const cmd = isDownload\n ? `scp -o StrictHostKeyChecking=no solv@${ip}:${key} ${filePath}`\n : `scp -o StrictHostKeyChecking=no ${key} solv@${ip}:${filePath}`\n const result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n\n return result.status === 0\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { SOLV_CLIENT_PATHS } from '@/config/solvClient'\nimport { spawnSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport inquirer from 'inquirer'\nimport os from 'os'\n\nexport const upload = async (ip = '') => {\n const homeDirectory = os.userInfo().homedir\n let migrateIP = ip\n if (ip === '') {\n const answer = await inquirer.prompt<{ ip: string }>([\n {\n type: 'input',\n name: 'ip',\n message: 'Enter your Ubuntu Server IP',\n default() {\n return '1.1.1.1'\n },\n },\n ])\n migrateIP = answer.ip\n }\n let keyPath = `${homeDirectory}${SOLV_CLIENT_PATHS.SOLV_KEYPAIR_UPLOAD_PATH}`\n if (homeDirectory.includes('/home/solv')) {\n keyPath = SOLV_CLIENT_PATHS.SOLV_KEYPAIR_UPLOAD_PATH_LINUX\n }\n const solanaKeys = Object.values(getAllKeyPaths(keyPath))\n\n for (const key of solanaKeys) {\n const splits = key.split('/')\n const fileName = splits[splits.length - 1]\n if (!fileName.endsWith('keypair.json')) {\n continue\n }\n const filePath = `${keyPath}/${fileName}`\n if (!existsSync(filePath)) {\n continue\n }\n const cmd = `scp -o StrictHostKeyChecking=no ${filePath} solv@${migrateIP}:${key}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n console.log(`Successfully Uploaded - ${fileName} 🎉`)\n }\n}\n","import { HOME_PATHS } from '@/config/config'\nimport { spawnSync } from 'child_process'\nimport inquirer from 'inquirer'\n\nexport const scpCreate = async () => {\n const answer = await inquirer.prompt<{ pubkey: string }>({\n type: 'input',\n name: 'pubkey',\n message: 'Enter your SSH Public Key',\n default() {\n return 'xxxxxxxpubkeyxxxxxxxx'\n },\n })\n\n const cmd = `mkdir -p ${HOME_PATHS.ROOT}/.ssh && echo \"${answer.pubkey}\" >> ${HOME_PATHS.AUTHORIZED_KEYS}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n console.log(`Successfully Created SSH Login Setting 🎉`)\n}\n","import chalk from 'chalk'\nimport { readFileSync } from 'fs'\nimport os from 'os'\n\nexport const cat = () => {\n try {\n const homeDirectory = os.userInfo().homedir\n const publicKeyPath = `${homeDirectory}/.ssh/id_rsa.pub`\n const publicKey = readFileSync(publicKeyPath, 'utf8')\n console.log(chalk.white('Your SSH Public Key is:\\n'))\n console.log(chalk.white(publicKey))\n } catch (error) {\n console.error(chalk.white('Error reading SSH Public Key\\n'))\n console.error(chalk.white(error))\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const init = () => {\n const cmd = 'ssh-keygen -t rsa -b 4096'\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawn } from 'child_process'\nimport { readFileSync } from 'fs'\nimport { Readable } from 'stream'\nimport { SingleBar } from 'cli-progress'\n\nexport const search = async (bar: SingleBar): Promise<string[]> => {\n return new Promise((resolve, reject) => {\n try {\n const find = spawn('find', ['/', '-name', '*.json', '-size', '-301c'])\n const filePaths: string[] = []\n find.stdout.on('data', (data) => {\n filePaths.push(\n ...data\n .toString()\n .split('\\n')\n .filter((path: string) => path)\n )\n bar.increment()\n })\n\n find.stderr.on('data', (data) => {\n bar.increment()\n //console.error(`Error: ${data}`)\n })\n\n find.on('close', (code) => {\n if (code === 0) {\n resolve(filePaths)\n } else {\n resolve(filePaths)\n }\n })\n } catch (error) {\n reject(`search Error: ${error}`)\n }\n })\n}\n\nconst checkIfSolanaKey = (path: string): boolean => {\n try {\n const content = JSON.parse(readFileSync(path, 'utf-8'))\n return content.length === 64\n } catch (error) {\n return false\n }\n}\n\nexport const processPaths = async (\n paths: string[],\n bar: SingleBar\n): Promise<string[]> => {\n const validPaths: string[] = []\n const readable = Readable.from(paths)\n readable.on('data', async (path) => {\n if (checkIfSolanaKey(path)) {\n validPaths.push(path)\n }\n })\n\n return new Promise((resolve, reject) => {\n readable.on('end', () => {\n resolve(validPaths)\n })\n\n readable.on('error', (error) => {\n reject(error)\n })\n })\n}\n","import { program } from '@/index'\nimport { download } from './download'\nimport { upload } from './upload'\nimport { scpCreate } from './create'\nimport { cat } from './cat'\nimport { init } from './init'\nimport { processPaths, search } from './search'\nimport chalk from 'chalk'\nimport { Presets, SingleBar } from 'cli-progress'\nimport uploadVS from './uploadVS'\n\nexport type UploadOptions = {\n vs: boolean\n ip: string\n}\n\nexport const scpCommands = () => {\n const scp = program\n .command('scp')\n .description(`Scp Commands`)\n .argument('<cmd>')\n\n scp\n .command('download')\n .alias('dl')\n .option('--ip <ip>', 'Download Key to a Specific IP Address', '')\n .description('Export Solana Validator Keypair')\n .action(async (options: UploadOptions) => {\n if (options.ip) {\n await download(options.ip)\n return\n }\n await download()\n })\n\n scp\n .command('upload')\n .alias('up')\n .option('--vs', 'Upload Key to a New Validator Auto Operation Node', false)\n .option('--ip <ip>', 'Upload Key to a Specific IP Address', '')\n .description('Upload Solana Validator Keypair')\n .action(async (options: UploadOptions) => {\n if (options.vs) {\n await uploadVS()\n return\n }\n await upload(options.ip)\n })\n\n scp\n .command('create')\n .alias('c')\n .description('Create SSH Login Setting')\n .action(async () => {\n await scpCreate()\n })\n\n scp\n .command('cat')\n .description('Show SSH Public Key')\n .action(() => {\n cat()\n })\n\n scp\n .command('init')\n .description('Init SSH Key Pair')\n .action(() => {\n init()\n })\n\n scp\n .command('search')\n .alias('sc')\n .description('Search Solana Validator Key Pair')\n .action(async () => {\n console.log(`start searching...`)\n const progressBar = new SingleBar({}, Presets.shades_classic)\n progressBar.start(10000, 0)\n const solanaKeyPaths = await search(progressBar)\n let result = await processPaths(solanaKeyPaths, progressBar)\n progressBar.stop()\n console.log(\n chalk.white(`🔍 Found ${result.length} Potential Solana Key Pairs 🎉`),\n )\n result = result.slice(0, 10)\n console.log(chalk.green(`\\n${result.join('\\n')}`))\n console.log(chalk.white('\\nOnly showing the first 10 results\\n\\n'))\n console.log(chalk.white(`$ mv <your-key> /mt/solana/<solvKeyName>.json`))\n })\n}\n","import chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\nimport fetch from 'node-fetch'\nimport { VS_UPLOAD_ENDPOINT } from '@/config/constants'\n\nconst uploadVS = async () => {\n const result = await fetch(VS_UPLOAD_ENDPOINT, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n if (result.status !== 200) {\n console.log(\n chalk.yellow(\n '⚠️ This Node is not Registered as Auto Operation Node.\\nPlease contact Discord Channel',\n ),\n )\n return false\n }\n const data = (await result.json()) as { cmds: string[] }\n for (const cmd of data.cmds) {\n spawnSync(cmd, { shell: true, stdio: 'ignore' })\n }\n console.log(chalk.white('🟢 Upload completed successfully!'))\n return true\n}\n\nexport default uploadVS\n","import { ValidatorType } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport { program } from '@/index'\nimport { spawnSync } from 'child_process'\n\nexport const statusCommands = (config: DefaultConfigType) => {\n program\n .command('status')\n .description('Check Solana Validator Status')\n .action(() => {\n systemctlStatusSolv(config)\n })\n}\n\nexport const systemctlStatusSolv = (config: DefaultConfigType) => {\n const service =\n config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n ? 'frankendancer'\n : 'solv'\n const cmd = `sudo systemctl status ${service}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n process.exit(0)\n}\n","import { Network, NodeType } from '@/config/enums'\nimport readConfig from '@/config/readConfig'\nimport { spawnSync } from 'node:child_process'\n\nexport const delegateStake = async (\n stakeAccountPubkey: string,\n validatorVoteAccountPubkey: string,\n) => {\n try {\n const config = await readConfig()\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n const network = isRPC\n ? config.RPC_URL\n : isTestnet\n ? Network.TESTNET\n : config.RPC_URL\n const authorityKeyPath = isTestnet\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n const cmd = [\n `solana delegate-stake ${stakeAccountPubkey} ${validatorVoteAccountPubkey} --stake-authority ${authorityKeyPath} --url ${network}`,\n ]\n spawnSync(cmd.join(' && '), { shell: true, stdio: 'inherit' })\n return true\n } catch (error) {\n throw new Error(`delegateStake: ${error}`)\n }\n}\n","import inquirer from 'inquirer'\nimport { createStakeAccount } from './createStakeAccount'\nimport { updateSolvConfig } from '@/lib/updateSolvConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport { addLeadingZero, existsAsync } from '@skeet-framework/utils'\nimport { execSync, spawnSync } from 'node:child_process'\nimport os from 'node:os'\n\nexport type StakeAccountQuestion = {\n stakeAuthorityKeyPath: string\n solAmount: string\n}\n\nexport const stakeAccountQuestion = async (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const confirmCreateStakeAccount = await inquirer.prompt<{\n confirmCreateStakeAccount: boolean\n }>([\n {\n type: 'confirm',\n name: 'confirmCreateStakeAccount',\n message: 'Would you like to create a new stake account?',\n default: false,\n },\n ])\n if (!confirmCreateStakeAccount.confirmCreateStakeAccount) {\n return false\n }\n const authorityKeypair = isTestnet\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n spawnSync(`solana config set --keypair ${authorityKeypair}`, {\n shell: true,\n stdio: 'pipe',\n })\n const answer = await inquirer.prompt<StakeAccountQuestion>([\n {\n type: 'input',\n name: 'solAmount',\n message: 'How many SOL would you like to stake?',\n default: '1',\n },\n ])\n const { stakeKeypair, stakeKeypairPath } = await createStakeKeypair()\n\n const currentStakeAccount = config.STAKE_ACCOUNTS\n // Array of unique stake accounts\n const uniqueStakeAccount = Array.from(\n new Set([...currentStakeAccount, stakeKeypair]),\n )\n updateSolvConfig({ STAKE_ACCOUNT: uniqueStakeAccount })\n return createStakeAccount(stakeKeypairPath, Number(answer.solAmount))\n}\n\nconst homeDirectory = os.userInfo().homedir\nconst STAKE_ACCOUNT_DIR = homeDirectory + '/stake-account'\n\nexport type StakeKeypair = {\n stakeKeypair: string\n stakeKeypairPath: string\n}\n\nconst createStakeKeypair = async (): Promise<StakeKeypair> => {\n if (!(await existsAsync(STAKE_ACCOUNT_DIR))) {\n spawnSync(`mkdir -p ${STAKE_ACCOUNT_DIR}`, { shell: true })\n }\n\n const files = spawnSync(`ls ${STAKE_ACCOUNT_DIR}`, { shell: true })\n .stdout.toString()\n .split('\\n')\n .filter((file) => file.includes('.json'))\n const stakeAccountNum = addLeadingZero(files.length + 1)\n\n const outfile = `${STAKE_ACCOUNT_DIR}/stake${stakeAccountNum}.json`\n const cmd = `solana-keygen new --outfile ${outfile} --no-bip39-passphrase`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n const output = execSync(`solana-keygen pubkey ${outfile}`)\n return {\n stakeKeypair: output.toString().trim(),\n stakeKeypairPath: outfile,\n } as StakeKeypair\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const createStakeAccount = (\n stakeKeypair: string,\n sol: number,\n retryLimit: number = 5, // リトライの最大回数を設定\n): boolean => {\n let attempt = 0\n while (attempt < retryLimit) {\n const result = spawnSync(\n `solana create-stake-account ${stakeKeypair} ${sol}`,\n { shell: true, stdio: 'pipe' },\n )\n const output = result.stdout.toString() + result.stderr.toString()\n\n if (output.includes('Signature:')) {\n console.log('Stake account created successfully:', output)\n return true\n } else if (output.includes('Error:')) {\n console.log('Error encountered:', output)\n attempt++\n console.log(`Retrying... (${attempt}/${retryLimit})`)\n } else {\n console.log('Unknown output:', output)\n break\n }\n\n if (attempt === retryLimit) {\n console.log('Failed to create stake account after retries.')\n }\n }\n\n return false\n}\n","import { Network } from '@/config/enums'\nimport readConfig from '@/config/readConfig'\nimport { spawnSync } from 'node:child_process'\n\nexport const deactivateStake = async (stakeAccountPubkey: string) => {\n try {\n const config = await readConfig()\n const authorityKeyPath =\n config.NETWORK === Network.TESTNET\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n const cmd = `solana deactivate-stake ${stakeAccountPubkey} --stake-authority ${authorityKeyPath}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n return true\n } catch (error) {\n throw new Error(`deactivateStake: ${error}`)\n }\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const withdrawStake = async (\n stakeAccountPubkey: string,\n destinationPubkey: string,\n amount: string, // 例: '0.5' SOL\n) => {\n try {\n const cmd = `solana withdraw-stake ${stakeAccountPubkey} ${destinationPubkey} ${amount}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n return true\n } catch (error) {\n throw new Error(`withdrawStake: ${error}`)\n }\n}\n","import { program } from '@/index'\nimport { delegateStake } from './delegateStake'\nexport * from './delegateStake'\nimport { stakeAccountQuestion } from './stakeAccountQuestion'\nimport { deactivateStake } from './deactivateStake'\nimport { withdrawStake } from './withdrawStake'\nimport chalk from 'chalk'\nimport { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\nimport { selectLST } from './selectLST'\nimport { readFile } from 'fs/promises'\nimport inquirer from 'inquirer'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { elSOLdeposit } from './elSOLdeposit'\nimport { depositeLST } from './depositLST'\nimport { execSync } from 'node:child_process'\nimport { homedir } from 'os'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport readConfig from '@/config/readConfig'\n\nexport type StakeOptions = {\n lst: boolean\n elsol: boolean\n amount: string\n}\nexport const stakeCommands = (config: DefaultConfigType) => {\n program\n .command('stake')\n .description('Stake SOL')\n .option('-l, --lst', 'Convert to Liquid Stake Token')\n .option('-e, --elsol', 'Convert to elSOL', false)\n .option('-a, --amount <amount>', 'Amount of SOL to stake', '0')\n .action(async (options: StakeOptions) => {\n let amount = Number(options.amount)\n console.log('RPC URL:', config.RPC_URL)\n let poolAddress = SOLV_STAKE_POOL_ADDRESS\n const isTestnet = config.NETWORK === Network.TESTNET\n const keyRoot = homedir()\n const keypairPath = isTestnet\n ? `${keyRoot}/testnet-authority-keypair.json`\n : `${keyRoot}/mainnet-authority-keypair.json`\n execSync(`solana config set --keypair ${keypairPath}`)\n if (!(await existsAsync(keypairPath))) {\n console.log(\n chalk.yellow(\n '⚠️ No keypair found. Please place your keypair in the following path:\\n',\n ),\n )\n console.log(chalk.white(keypairPath))\n return\n }\n const fromWalletKey = JSON.parse(\n await readFile(keypairPath, 'utf-8'),\n ) as number[]\n if (options.elsol) {\n // Deposit SOL to elSOL\n await elSOLdeposit(config.RPC_URL, poolAddress, amount, fromWalletKey)\n return\n } else if (options.lst) {\n const lst = await selectLST(config.RPC_URL)\n if (!lst) {\n return\n }\n poolAddress = lst.stakePoolAddress\n // Deposit SOL to LST\n await depositeLST(\n config.RPC_URL,\n poolAddress,\n amount,\n fromWalletKey,\n lst.symbol,\n )\n return\n } else {\n // Solana Native Stake\n const result = await stakeAccountQuestion(config)\n if (!result) {\n return\n }\n const newSolvConfig = await readConfig()\n const { validatorVoteAccount, stakeAccounts } =\n await delegateStakeAsk(newSolvConfig)\n for await (const stakeAccount of stakeAccounts) {\n try {\n await delegateStake(stakeAccount, validatorVoteAccount)\n } catch (error) {\n console.log(\n chalk.yellow(\n `Network might be busy, please try again later\\nYou can use a custom RPC endpoint to avoid this issue\\n`,\n ),\n )\n }\n }\n }\n })\n\n program\n .command('unstake')\n .description('Unstake SOL')\n .action(async () => {\n const { unstakeOption } = await unstakeAsk()\n if (unstakeOption === 'Deactivate Stake') {\n const { stakeAccounts } = await deactivateStakeAsk()\n for await (const stakeAccount of stakeAccounts) {\n try {\n await deactivateStake(stakeAccount)\n } catch (error) {\n console.log(\n chalk.yellow(\n `Network might be busy, please try again later\\nYou can use a custom RPC endpoint to avoid this issue\\n`,\n ),\n )\n }\n }\n } else {\n const answer = await withdrawStakeAsk()\n await withdrawStake(\n answer.stakeAccounts,\n answer.destinationAddress,\n answer.solAmount,\n )\n }\n })\n}\n\nexport const askAmount = async () => {\n const currentAddress = execSync(`solana address`).toString().trim()\n const currentVoteAccountBalance = execSync(`solana balance`)\n .toString()\n .replace('SOL', '')\n .trim()\n console.log(\n chalk.white(\n `📗 Selected Wallet: ${currentAddress}\\n💰 Account Balance:`,\n currentVoteAccountBalance + ' SOL',\n ),\n )\n console.log(\n chalk.yellow(\n '⚠️ 0.03 SOL will be remaining in the account if you just press enter.',\n ),\n )\n const answer = await inquirer.prompt<{ amount: string }>([\n {\n type: 'input',\n name: 'amount',\n message: 'Enter amount of SOL to stake:',\n default: String(Number(currentVoteAccountBalance) - 0.03),\n },\n ])\n return Number(answer.amount)\n}\n\ntype deactivateStakeAskOption = {\n stakeAccounts: string[]\n}\n\nconst deactivateStakeAsk = async () => {\n const config = await readConfig()\n const answer = await inquirer.prompt<deactivateStakeAskOption>([\n {\n type: 'checkbox',\n name: 'stakeAccounts',\n message: `Which Stake Account would you like to deactivate stake from?`,\n choices: config.STAKE_ACCOUNTS,\n },\n ])\n return answer\n}\n\ntype delegateStakeOption = {\n stakeAccounts: string[]\n validatorVoteAccount: string\n}\n\nconst delegateStakeAsk = async (config: DefaultConfigType) => {\n const stakeAccount = config.STAKE_ACCOUNTS\n const defaultAddress =\n config.NETWORK === Network.TESTNET\n ? getVoteAccountAddress(config)\n : config.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY\n const answer = await inquirer.prompt<delegateStakeOption>([\n {\n type: 'checkbox',\n name: 'stakeAccounts',\n message: `Which Stake Account would you like to delegate stake to?`,\n choices: stakeAccount,\n },\n {\n type: 'input',\n name: 'validatorVoteAccount',\n message: `What is the Validator Vote Account Address?`,\n default() {\n return defaultAddress\n },\n },\n ])\n return answer\n}\n\nconst getVoteAccountAddress = (config: DefaultConfigType) => {\n const isTest = config.NETWORK === Network.TESTNET\n const voteAccount = isTest ? 'testnet-vote-account' : 'mainnet-vote-account'\n const cmd = `/home/solv/${voteAccount}-keypair.json`\n const address = execSync(`solana-keygen pubkey ${cmd}`).toString()\n return address\n}\n\ntype unstakeAskOption = {\n unstakeOption: string\n}\n\nconst unstakeAsk = async () => {\n const unstakeOptions = ['Deactivate Stake', 'Withdraw Stake']\n const answer = await inquirer.prompt<unstakeAskOption>([\n {\n type: 'list',\n name: 'unstakeOption',\n message: 'What would you like to do?',\n choices: unstakeOptions,\n default: unstakeOptions[0],\n },\n ])\n return answer\n}\n\ntype withdrawStakeAskOption = {\n stakeAccounts: string\n destinationAddress: string\n solAmount: string\n}\n\nconst withdrawStakeAsk = async () => {\n const stakeAccount = (await readConfig()).STAKE_ACCOUNTS\n const answer = await inquirer.prompt<withdrawStakeAskOption>([\n {\n type: 'checkbox',\n name: 'stakeAccounts',\n message: `Which Stake Account would you like to withdraw stake from?`,\n choices: stakeAccount,\n },\n {\n type: 'input',\n name: 'destinationAddress',\n message: `What is the destination address for the withdrawn SOL?`,\n default() {\n return 'xxxxxxxx'\n },\n },\n {\n type: 'input',\n name: 'solAmount',\n message: `How many SOL would you like to withdraw?`,\n default() {\n return '1'\n },\n },\n ])\n return answer\n}\n","import { Connection, PublicKey } from '@solana/web3.js'\nimport { stakePoolInfo } from '@solana/spl-stake-pool'\nimport { StakePoolInfoRes } from './stakePoolInfoRes'\nimport { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\n\nexport const getStakePoolInfo = async (\n rpcUrl: string,\n poolAddress = SOLV_STAKE_POOL_ADDRESS,\n) => {\n try {\n const connection = new Connection(rpcUrl)\n\n const stakePoolAddress = new PublicKey(poolAddress)\n const stakePool = await stakePoolInfo(connection, stakePoolAddress)\n return stakePool as StakePoolInfoRes\n } catch (error) {\n console.log(`Stake Pool not found: ${poolAddress}`)\n return null\n }\n}\n","import { fetchDigitalAsset } from '@metaplex-foundation/mpl-token-metadata'\nimport { createUmi } from '@metaplex-foundation/umi-bundle-defaults'\nimport { publicKey } from '@metaplex-foundation/umi'\n\nexport type TokenInfo = {\n name: string\n symbol: string\n uri: string\n mint: string\n}\n\nexport const getTokenInfo = async (rpcUrl: string, mintAddress: string) => {\n try {\n const mintPubkey = publicKey(mintAddress)\n console.log(`mintPubkey: ${mintPubkey}`)\n const umi = createUmi(rpcUrl)\n const nftMetadata = await fetchDigitalAsset(umi, mintPubkey)\n const res = {\n name: nftMetadata.metadata.name,\n symbol: nftMetadata.metadata.symbol,\n uri: nftMetadata.metadata.uri,\n mint: mintAddress,\n }\n return res as TokenInfo\n } catch (error) {\n return null\n }\n}\n","import { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\nimport { getStakePoolInfo } from '@/lib/solana/getStakePoolInfo'\nimport { TokenInfo, getTokenInfo } from '@/lib/solana/getTokenAccount'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\n\nexport interface StakePoolInfo extends TokenInfo {\n stakePoolAddress: string\n}\n\nexport const selectLST = async (rpcUrl: string) => {\n const answer = await inquirer.prompt<{ stakePoolAddress: string }>([\n {\n type: 'input',\n name: 'stakePoolAddress',\n message: 'Enter Stake Pool Address(default: elSOL)',\n default: SOLV_STAKE_POOL_ADDRESS,\n },\n ])\n try {\n const poolInfo = await getStakePoolInfo(rpcUrl, answer.stakePoolAddress)\n if (!poolInfo) {\n console.log(\n chalk.yellow(\n '⚠️ Invalid Stake Pool Address\\nPlease check the correct address and try again.\\n',\n ),\n )\n console.log(\n chalk.white(\n 'For stake pool information\\n🔗 https://solanacompass.com/stake-pools/',\n ),\n )\n return null\n }\n\n const poolMint = poolInfo.poolMint\n let tokenInfo = await getTokenInfo(rpcUrl, poolMint)\n\n if (!tokenInfo) {\n tokenInfo = {\n name: poolMint,\n symbol: poolMint,\n mint: poolMint,\n uri: 'no metadata',\n }\n }\n const result: StakePoolInfo = {\n ...tokenInfo,\n stakePoolAddress: answer.stakePoolAddress,\n }\n const stakeInfo = `🪙 ${result.symbol}\\nName: ${result.name} \\nToken Mint: ${result.mint}`\n const confirm = await inquirer.prompt<{ confirm: boolean }>([\n {\n type: 'confirm',\n name: 'confirm',\n message: stakeInfo + '\\nIs this the correct Stake Pool?',\n },\n ])\n if (!confirm.confirm) {\n console.log(chalk.yellow('✔️ Canceled'))\n return null\n }\n return result\n } catch (error) {\n console.log(\n chalk.yellow(\n '⚠️ Invalid Stake Pool Address\\nPlease check the correct address and try again.\\n',\n ),\n )\n console.log(\n chalk.white(\n 'For stake pool information\\n🔗 https://solanacompass.com/stake-pools/',\n ),\n )\n return null\n }\n}\n","import { Connection, Keypair, PublicKey } from '@solana/web3.js'\nimport { askAmount } from '.'\nimport { ELSOL_MINT_ADDRESS, SOLV_ELSOL_ACCOUNT_ADDRESS } from '@/config/config'\nimport { getOrCreateDestinationAddress } from '@/lib/solana/getOrCreateDestinationAddress'\nimport { Spinner } from 'cli-spinner'\nimport chalk from 'chalk'\nimport { depositSol } from '@/lib/solana/depositSOL'\nimport { sleep } from '@skeet-framework/utils'\n\nexport const elSOLdeposit = async (\n rpcUrl: string,\n poolAddress: string,\n amount: number,\n fromWalletKey: number[],\n) => {\n console.log(chalk.white('Solana RPC URL:', rpcUrl))\n let connection = new Connection(rpcUrl)\n if (amount === 0) {\n amount = await askAmount()\n }\n const spinner = new Spinner('%s')\n spinner.setSpinnerString(18)\n spinner.start()\n spinner.setSpinnerTitle(\n chalk.green(`✔︎ Checking Stake Pool ${poolAddress}...`),\n )\n const stakePoolAddress = new PublicKey(poolAddress)\n const depositAuthority = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const mintAddress = ELSOL_MINT_ADDRESS\n spinner.setSpinnerTitle(\n chalk.green(`🔍 Getting or Creating AssociatedTokenAccount`),\n )\n const destinationTokenAccount = await getOrCreateDestinationAddress(\n rpcUrl,\n fromWalletKey,\n mintAddress,\n depositAuthority.publicKey,\n )\n await sleep(1000)\n spinner.setSpinnerTitle(chalk.green('🔄 Converting SOL to elSOL'))\n\n let sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(SOLV_ELSOL_ACCOUNT_ADDRESS),\n depositAuthority.publicKey,\n )\n\n let retryCount = 0\n while (sig.status !== 'success') {\n retryCount++\n if (retryCount > 10) {\n spinner.stop(true)\n console.log(chalk.red('Failed to deposit.Please try again later 🙏'))\n return false\n }\n spinner.setSpinnerTitle(chalk.yellow(`⏳ ${retryCount} Times Retrying...`))\n await sleep(3000)\n connection = new Connection(rpcUrl)\n sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(SOLV_ELSOL_ACCOUNT_ADDRESS),\n depositAuthority.publicKey,\n )\n }\n spinner.stop(true)\n\n console.log(\n chalk.white(\n \"💰 Finished Deposit - You've got elSOL ✨\\n\\nSignature:\",\n sig.signature,\n ),\n )\n return true\n}\n","import { Connection, PublicKey, Keypair } from '@solana/web3.js'\nimport { getOrCreateAssociatedTokenAccount } from '@solana/spl-token'\n\nexport const getOrCreateDestinationAddress = async (\n rpcUrl: string,\n fromWalletKey: number[],\n mintAddress: string,\n owner: PublicKey,\n allowOwnerOffCurve = false,\n) => {\n try {\n const payer = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const mintPublicKey = new PublicKey(mintAddress)\n const connection = new Connection(rpcUrl)\n // SPLトークンの関連アドレスを計算します\n const associatedTokenAddress = await getOrCreateAssociatedTokenAccount(\n connection,\n payer,\n mintPublicKey,\n owner,\n allowOwnerOffCurve,\n )\n\n // 関連アドレスを返します\n return associatedTokenAddress.address.toBase58()\n } catch (error) {\n console.log('Error in getOrCreateDestinationAddress', error)\n throw new Error(JSON.stringify(error))\n }\n}\n","import {\n Connection,\n PublicKey,\n Keypair,\n Transaction,\n ComputeBudgetProgram,\n LAMPORTS_PER_SOL,\n} from '@solana/web3.js'\nimport { SOLV_STAKE_POOL_ADDRESS } from '@/config/config'\nimport * as solanaStakePool from '@solana/spl-stake-pool'\n\nexport type DepositSOLResponse = {\n status: 'success' | 'error'\n signature?: string\n error?: any\n}\n\nexport const depositSol = async (\n connection: Connection,\n fromWalletKey: number[],\n SOL: number,\n stakePoolAddress: PublicKey = new PublicKey(SOLV_STAKE_POOL_ADDRESS),\n destinationTokenAccount?: PublicKey,\n referrerTokenAccount?: PublicKey,\n depositAuthority?: PublicKey,\n) => {\n try {\n const fromWallet = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const lamport = SOL * LAMPORTS_PER_SOL\n const { instructions, signers } = await depositSOLInstruction(\n connection,\n fromWalletKey,\n lamport,\n stakePoolAddress,\n destinationTokenAccount,\n referrerTokenAccount,\n depositAuthority,\n )\n\n const txForEstimate = new Transaction().add(...instructions)\n txForEstimate.feePayer = fromWallet.publicKey\n const latestBlockhashAndContext =\n await connection.getLatestBlockhashAndContext({\n commitment: 'finalized',\n })\n\n txForEstimate.recentBlockhash = latestBlockhashAndContext.value.blockhash\n txForEstimate.sign(...signers, fromWallet)\n\n const tx = new Transaction().add(...instructions).add(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1000,\n }),\n )\n\n tx.feePayer = fromWallet.publicKey\n tx.recentBlockhash = latestBlockhashAndContext.value.blockhash\n tx.sign(...signers, fromWallet)\n const signature = await connection.sendRawTransaction(tx.serialize(), {\n skipPreflight: true,\n })\n\n await connection.confirmTransaction(\n {\n ...latestBlockhashAndContext.value,\n signature,\n },\n 'finalized',\n )\n return { status: 'success', signature } as DepositSOLResponse\n } catch (error) {\n console.log('depositSol error', error)\n return { status: 'error', error } as DepositSOLResponse\n }\n}\n\nconst depositSOLInstruction = async (\n connection: Connection,\n fromWalletKey: number[],\n lamport: number,\n stakePoolAddress: PublicKey = new PublicKey(SOLV_STAKE_POOL_ADDRESS),\n destinationTokenAccount?: PublicKey,\n referrerTokenAccount?: PublicKey,\n depositAuthority?: PublicKey,\n) => {\n const fromWallet = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const payerAddress = fromWallet.publicKey\n const res = await solanaStakePool.depositSol(\n connection,\n stakePoolAddress,\n payerAddress,\n lamport,\n destinationTokenAccount,\n referrerTokenAccount,\n depositAuthority,\n )\n return res\n}\n","import { Connection, Keypair, PublicKey } from '@solana/web3.js'\nimport { askAmount } from '.'\nimport { SOLV_POOL_MANAGER_ADDRESS } from '@/config/config'\nimport { getOrCreateDestinationAddress } from '@/lib/solana/getOrCreateDestinationAddress'\nimport { Spinner } from 'cli-spinner'\nimport chalk from 'chalk'\nimport { depositSol } from '@/lib/solana/depositSOL'\nimport { sleep } from '@skeet-framework/utils'\nimport { getStakePoolInfo } from '@/lib/solana/getStakePoolInfo'\n\nexport const depositeLST = async (\n rpcUrl: string,\n poolAddress: string,\n amount: number,\n fromWalletKey: number[],\n symbol?: string,\n) => {\n const connection = new Connection(rpcUrl)\n if (amount === 0) {\n amount = await askAmount()\n }\n const spinner = new Spinner('%s')\n spinner.setSpinnerString(18)\n spinner.start()\n spinner.setSpinnerTitle(\n chalk.green(`✔︎ Checking Stake Pool ${poolAddress}...`),\n )\n const stakePoolAddress = new PublicKey(poolAddress)\n const stakePool = await getStakePoolInfo(rpcUrl, poolAddress)\n if (!stakePool) {\n console.log('Stake Pool not found')\n return false\n }\n spinner.setSpinnerTitle(\n chalk.green(`🔍 Getting or Creating AssociatedTokenAccount`),\n )\n const mintAddress = stakePool.poolMint\n const depositAuthority = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const destinationTokenAccount = await getOrCreateDestinationAddress(\n rpcUrl,\n fromWalletKey,\n mintAddress,\n depositAuthority.publicKey,\n )\n const solvAssociatedTokenAccount = await getOrCreateDestinationAddress(\n rpcUrl,\n fromWalletKey,\n mintAddress,\n new PublicKey(SOLV_POOL_MANAGER_ADDRESS),\n true,\n )\n await sleep(1000)\n\n spinner.setSpinnerTitle(chalk.green(`🔄 Converting SOL to ${symbol}`))\n\n let sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(solvAssociatedTokenAccount),\n depositAuthority.publicKey,\n )\n\n let retryCount = 0\n while (sig.status !== 'success') {\n retryCount++\n if (retryCount > 10) {\n spinner.stop(true)\n console.log(chalk.red('Failed to deposit.Please try again later 🙏'))\n return false\n }\n console.log(chalk.yellow(`⏳ ${retryCount} Times Retrying...\\n`))\n await sleep(1000)\n sig = await depositSol(\n connection,\n fromWalletKey,\n amount,\n stakePoolAddress,\n new PublicKey(destinationTokenAccount),\n new PublicKey(solvAssociatedTokenAccount),\n depositAuthority.publicKey,\n )\n }\n spinner.stop(true)\n console.log(\n chalk.white(`💰 You've got ${symbol} ✨\\n\\nSignature:`, sig.signature),\n )\n return true\n}\n","import { execSync } from 'child_process'\n\nexport const getEpoch = () => {\n try {\n const cmd = `solana epoch --commitment finalized -ul`\n const epoch = execSync(cmd, { encoding: 'utf-8' }).toString()\n return epoch.replace(/\\n/g, '')\n } catch (error) {\n return `getEpoch Error: ${error}`\n }\n}\n\nexport const getEpochRemote = () => {\n try {\n const cmd = `solana epoch`\n const epoch = execSync(cmd, { encoding: 'utf-8' }).toString()\n return epoch.replace(/\\n/g, '')\n } catch (error) {\n return `getEpoch Error: ${error}`\n }\n}","import { execSync } from 'child_process'\n\nexport const getSlot = () => {\n try {\n const cmd = `solana --url http://127.0.0.1:8899 slot`\n const slot = execSync(cmd, { encoding: 'utf-8' }).toString()\n return slot.replace(/\\n/g, '')\n } catch (error) {\n return `getSlot Error: ${error}`\n }\n}\n","import chalk from 'chalk'\nimport { Spinner } from 'cli-spinner'\nimport { VERSION } from '@/lib/version'\n\nexport module Logger {\n export const successHex = chalk.hex('#39A845')\n export const warningHex = chalk.hex('#FFD02E')\n export const errorHex = chalk.hex('#B5332E')\n export const syncHex = chalk.hex('#3073B7')\n export const greyHex = chalk.hex('#BEBDBD')\n export const indigoHex = chalk.hex('#3950A0')\n export const pinkHex = chalk.hex('#D8A1C4')\n\n export const normal = (text: string) => {\n console.log(chalk.white(text))\n }\n\n export const syncSpinner = (text: string) => {\n const spinner = new Spinner(chalk.white(text) + ` %s\\n`)\n try {\n spinner.setSpinnerString(18)\n spinner.start()\n return spinner\n } catch (error) {\n spinner.stop(true)\n throw new Error(`syncSpinner Error: ${error}`)\n }\n }\n\n export const solvAA = () => {\n const row1 = Logger.syncHex(' _ ')\n const row2 = Logger.syncHex(' | | ')\n const row3 = Logger.syncHex(' ___ ___ | |') + Logger.errorHex('_ __ ')\n const row4 = Logger.syncHex('/ __|/ _ \\\\| |') + Logger.errorHex('\\\\ \\\\ / /')\n const row5 = Logger.syncHex('\\\\__ \\\\ (_) | |') + Logger.errorHex(' \\\\ V / ')\n const row6 = Logger.syncHex('|___/\\\\___/|_|') + Logger.errorHex(' \\\\_/ ')\n\n console.log(`\\n${row1}`)\n console.log(`${row2}`)\n console.log(`${row3}`)\n console.log(`${row4}`)\n console.log(`${row5}`)\n console.log(`${row6}\\n`)\n console.log(`Solv Version: v${VERSION}\\n`)\n }\n\n export const installMessage = () => {\n const msg = warningHex(`🔥 Welcome to Solana Validator Tool Solv 🔥`)\n const msg2 = `\nSolv is born and ready for running Solana Validator 🚀\n\n$ cd ~ && source ~/.profile\n$ solv setup\n\n$ solv --help for more information\n`\n console.log(msg)\n console.log(greyHex(msg2))\n }\n\n export const installClientMessage = () => {\n const msg = warningHex(`🔥 Welcome to Solana Validator Tool Solv 🔥`)\n const msg2 = `\nThis is solv CLI mode for Solana Validator Management ⭐️\n\n$ cd ~ && source ~/.profile\n$ solv c\n\n$ solv --help for more information\n`\n console.log(msg)\n console.log(greyHex(msg2))\n }\n\n export const mtCommandsLog = () => {\n const msg = warningHex(`🔨 Mount Commands 🔨`)\n const msg2 = `mount\\n$ solv mt -p <fileSystem>\\n`\n const msg3 = `unmount\\n$ solv umt -p <fileSystem>\\n`\n const msg4 = `mount reload\\n$ solv mtr\\n`\n console.log(msg)\n console.log(greyHex(msg2))\n console.log(greyHex(msg3))\n console.log(greyHex(msg4))\n }\n}\n","import { SERVICE_PATHS, startupScriptPaths } from '@/config/config'\nimport { DefaultConfigType } from '@/config/types'\nimport chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\n\nexport const showConfig = (solvConfig: DefaultConfigType) => {\n const cmd = `solana config get`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n const config = startupScriptPaths()\n console.log(chalk.white('start-validator.sh: ') + config.scriptPath)\n console.log(chalk.white('solv.service: ') + SERVICE_PATHS.SOL_SERVICE)\n console.log(chalk.white('logrotate: ') + SERVICE_PATHS.SOL_LOGROTATE)\n console.log(chalk.white('logrotate (fd): ') + SERVICE_PATHS.FRANKENDANCER_LOGROTATE)\n console.log(chalk.white('sysctl.d: ') + SERVICE_PATHS.SOL_SYSTEM_CONFIG21)\n console.log(chalk.white('limits.d: ') + SERVICE_PATHS.SOL_NOFILES_CONF)\n console.log(chalk.white('system.conf: ') + SERVICE_PATHS.SOL_SYSTEM_CONF)\n console.log(chalk.white('ledger: ') + config.ledger)\n console.log(chalk.white('accounts: ') + config.accounts)\n console.log(chalk.white('snapshots: ') + config.snapshots)\n console.log(chalk.white('mount type: ') + solvConfig.MNT_DISK_TYPE)\n}\n","import { program } from '@/index'\nimport { getEpoch } from '../cron/getEpoch'\nimport { getSlot } from '../cron/getSlot'\nimport { Logger } from '@/lib/logger'\nimport { showConfig } from './showConfig'\nimport { getSnapshot } from './snapshot'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport {\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport getSolanaCLI from '@/config/getSolanaCLI'\n\nexport const getCommands = (config: DefaultConfigType) => {\n const isTest = config.NETWORK === Network.TESTNET\n let version = isTest ? VERSION_TESTNET : VERSION_MAINNET\n if (config.NODE_TYPE === NodeType.RPC) {\n version = VERSION_SOLANA_RPC\n }\n const get = program\n .command('get')\n .description(`Get Solana Validator's Information`)\n .argument(\n '<cmd>',\n `Subcommands: epoch, slot, catchup, snapshot, contact, config`,\n )\n\n get\n .command('epoch')\n .description(`Show Validator's Epoch`)\n .action(() => {\n const epoch = getEpoch()\n console.log({ epoch })\n })\n\n get\n .command('ip')\n .description(`Show Validator's IP Address`)\n .action(() => {\n const cmd = `curl ipinfo.io/ip`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n console.log(chalk.white(`${stdout}`))\n })\n\n get\n .command('slot')\n .description(`Show Current Slot`)\n .action(() => {\n const slot = getSlot()\n console.log({ slot })\n })\n\n get\n .command('snapshot')\n .alias('sn')\n .option(\n '-m, --minDownloadSpeed <minDownloadSpeed>',\n 'Minimum download speed',\n '100',\n )\n .option(\n '-s, --snapshotPath <snapshotPath>',\n 'Snapshot Path',\n config.SNAPSHOTS_PATH,\n )\n .option('-v, --version <version>', 'Specific Version Node', version)\n .option('-r, --rpcUrl <rpcUrl>', 'RPC URL', isTest ? 'https://api.testnet.solana.com' : 'https://api.mainnet-beta.solana.com')\n .option('-a, --avorio <version>', 'Use Avorio Network (Testnet only)', false)\n .description(`Download the latest snapshot`)\n .action(\n (options: {\n minDownloadSpeed: string\n ledgerPath: string\n snapshotPath: string\n version: string\n rpcUrl: string\n avorio: boolean\n }) => {\n const minDownloadSpeed = options.minDownloadSpeed\n const snapshotPath = options.snapshotPath\n const version = options.version\n const rpcUrl = options.rpcUrl\n const useAvorio = options.avorio\n getSnapshot(isTest, minDownloadSpeed, snapshotPath, version, rpcUrl, useAvorio)\n },\n )\n\n get\n .command('contact')\n .description('Show Validator Contact Information')\n .action(() => {\n const solanaValidatorClient = getSolanaCLI()\n const cmd = `${solanaValidatorClient} --ledger /mnt/ledger/ contact-info`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n })\n\n get\n .command('config')\n .description('Show Solv Config')\n .alias('c')\n .action(async () => {\n showConfig(config)\n })\n\n get\n .command('aa')\n .description('Show Solv AA')\n .option('-c, --client', 'Show Solv Client Mode AA', false)\n .action((options: { client: boolean }) => {\n Logger.solvAA()\n if (options.client) {\n Logger.installClientMessage()\n } else {\n Logger.installMessage()\n }\n })\n get.addHelpCommand('help [cmd]', 'Get Solana Validator Information')\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerStatus = () => {\n const cmd = `sudo systemctl status relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerStart = () => {\n const cmd = `sudo systemctl start relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerStop = () => {\n const cmd = `sudo systemctl stop relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerRestart = () => {\n const cmd = `sudo systemctl restart relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerLog = (error = false) => {\n const cmd = error\n ? `journalctl -u relayer.service -xef | grep ERROR`\n : `journalctl -u relayer.service -xef`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport { relayerStatus } from './relayerStatus'\nimport { relayerStart } from './relayerStart'\nimport { relayerStop } from './relayerStop'\nimport { relayerRestart } from './relayerRestart'\nimport { relayerLog } from './relayerLog'\nimport chalk from 'chalk'\nimport { LEDGER_PATH } from '@/config/constants'\nimport { spawnSync } from 'child_process'\nimport { relayerEnable } from './relayerEnable'\nimport getSolanaCLI from '@/config/getSolanaCLI'\n\nexport const relayerCommands = () => {\n const relayer = program\n .command('relayer')\n .description('Jito Relayer Commands')\n\n relayer\n .command('status')\n .description('Show Relayer Status')\n .action(() => {\n relayerStatus()\n })\n\n relayer\n .command('start')\n .description('Start Relayer')\n .action(() => {\n relayerStart()\n })\n\n relayer\n .command('stop')\n .description('Stop Relayer')\n .action(() => {\n relayerStop()\n })\n\n relayer\n .command('log')\n .option('-e, --error', 'Show Error Logs', false)\n .description('Show Relayer Logs')\n .action((options: { error: boolean }) => {\n relayerLog(options.error)\n })\n\n relayer\n .command('restart')\n .description('Restart Relayer')\n .action(() => {\n relayerRestart()\n })\n\n relayer\n .command('enable')\n .description('Enable Relayer')\n .action(() => {\n relayerEnable()\n })\n\n relayer\n .command('set:url')\n .option('-u, --url <url>', 'Set Relayer URL', '')\n .description('Set Relayer URL on Validator')\n .action((options: { url: string }) => {\n if (options.url === '') {\n console.log(chalk.red('Please provide a URL'))\n return\n }\n const cmd = `${getSolanaCLI()} --ledger ${LEDGER_PATH} set-relayer-config --relayer-url ${options.url}`\n console.log(chalk.white('Setting Relayer URL ...'))\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n console.log(chalk.green('🟢 Relayer URL Set'))\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const relayerEnable = () => {\n const cmd = `sudo systemctl enable relayer.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import chalk from 'chalk'\nimport { spawnSync } from 'child_process'\n\nexport const splBalance = async (keyPath: string) => {\n try {\n const cmd = `spl-token accounts --owner ${keyPath}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n } catch (error) {\n console.log(chalk.yellow(`You might need to install the Solana SPL CLI:\\n`))\n console.log(chalk.white(`$ cargo install spl-token-cli`))\n }\n}\n","import { program } from '@/index'\nimport { splBalance } from '@/lib/solana/splBalance'\nimport { homedir } from 'os'\nimport { DefaultConfigType } from '@/config/types'\nimport { getAllKeyPaths } from '@/config/config'\nimport { getSolBalance } from '@/lib/getSolBalance'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { Network, NodeType } from '@/config/enums'\nimport chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\nimport { IDENTITY_KEY_PATH } from '@/config/constants'\n\nexport type BalanceOptions = {\n spl: boolean\n}\n\nexport const balanceCommands = (config: DefaultConfigType) => {\n program\n .command('balance')\n .alias('bal')\n .alias('b')\n .option('-s, --spl', 'Show SPL Token Balance', false)\n .description('Show Keypairs Balance')\n .action(async (options: BalanceOptions) => {\n if (options.spl) {\n const defaultKey = 'mainnet-authority-keypair.json'\n const keyPath = `${homedir()}/${defaultKey}`\n await splBalance(keyPath)\n process.exit(0)\n }\n await showKeypairsInfo(config)\n process.exit(0)\n })\n}\n\nconst showKeypairsInfo = async (config: DefaultConfigType) => {\n const keyInfo = getKeypairsInfo(config)\n let output = `Validator Key: ${keyInfo.validatorKey}\nAddress: ${keyInfo.validatorKeyAddress}\nBalance: ${keyInfo.validatorKeyBalance}\nVote Key: ${keyInfo.voteKey} \nAddress: ${keyInfo.voteKeyAddress}\nBalance: ${keyInfo.voteKeyBalance}\nAuthority Key: ${keyInfo.authorityKey}\nAddress: ${keyInfo.authorityKeyAddress}\nBalance: ${keyInfo.authorityKeyBalance}\nActive Identity:`\n if (config.NODE_TYPE === NodeType.RPC) {\n output = `Validator Key: ${keyInfo.validatorKey}\nAddress: ${keyInfo.validatorKeyAddress}\nBalance: ${keyInfo.validatorKeyBalance}\nActive Identity:`\n }\n console.log(chalk.white(output))\n spawnSync(`solana-keygen pubkey ${IDENTITY_KEY_PATH}`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n\nexport const getKeypairsInfo = (config: DefaultConfigType) => {\n const keypairs = getAllKeyPaths()\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n\n if (isRPC) {\n return {\n validatorKey: keypairs.mainnetValidatorKey,\n validatorKeyAddress: getSolanaAddress(keypairs.mainnetValidatorKey),\n validatorKeyBalance: getSolBalance(keypairs.mainnetValidatorKey),\n }\n }\n\n if (isTestnet) {\n return {\n validatorKey: keypairs.testnetValidatorKey,\n validatorKeyAddress: getSolanaAddress(keypairs.testnetValidatorKey),\n validatorKeyBalance: getSolBalance(keypairs.testnetValidatorKey),\n voteKey: keypairs.testnetValidatorVoteKey,\n voteKeyAddress: getSolanaAddress(keypairs.testnetValidatorVoteKey),\n voteKeyBalance: getSolBalance(keypairs.testnetValidatorVoteKey),\n authorityKey: keypairs.testnetValidatorAuthorityKey,\n authorityKeyAddress: getSolanaAddress(\n keypairs.testnetValidatorAuthorityKey,\n ),\n authorityKeyBalance: getSolBalance(keypairs.testnetValidatorAuthorityKey),\n }\n }\n\n return {\n validatorKey: keypairs.mainnetValidatorKey,\n validatorKeyAddress: getSolanaAddress(keypairs.mainnetValidatorKey),\n validatorKeyBalance: getSolBalance(keypairs.mainnetValidatorKey),\n voteKey: keypairs.mainnetValidatorVoteKey,\n voteKeyAddress: getSolanaAddress(keypairs.mainnetValidatorVoteKey),\n voteKeyBalance: getSolBalance(keypairs.mainnetValidatorVoteKey),\n authorityKey: keypairs.mainnetValidatorAuthorityKey,\n authorityKeyAddress: getSolanaAddress(\n keypairs.mainnetValidatorAuthorityKey,\n ),\n authorityKeyBalance: getSolBalance(keypairs.mainnetValidatorAuthorityKey),\n }\n}\n","import { spawnSync } from 'child_process'\n\nexport const getSolBalance = (keyPath: string) => {\n const cmd = `solana balance --keypair ${keyPath}`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n const balance = stdout.toString().trim()\n return balance\n}\n","import { spawnSync } from 'child_process'\n\nexport const rmLogs = () => {\n const cmd = `sudo rm -rf /home/solv/solana-validator.log.*`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import getSolanaCLI from '@/config/getSolanaCLI'\nimport { DefaultConfigType } from '@/config/types'\nimport { spawnSync } from 'node:child_process'\n\nexport const monitorSolana = (config: DefaultConfigType) => {\n const solanaValidatorClient = getSolanaCLI()\n const cmd = `${solanaValidatorClient} --ledger ${config.LEDGER_PATH} monitor`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const solanaCatchup = () => {\n const cmd = `solana catchup --our-localhost`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport inquirer from 'inquirer'\nimport { execSync, spawnSync } from 'child_process'\nimport chalk from 'chalk'\nimport sleep from '@/lib/sleep'\nimport { homedir } from 'os'\nimport { MAX_RETRIES } from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nconst RETRY_DELAY = 1000\n\nexport type BalanceOptions = {\n spl: boolean\n}\n\nexport enum TransferFrom {\n VALIDATOR = 'Validator Account',\n AUTHORITY = 'Authority Account',\n}\n\nexport enum TransferTo {\n VALIDATOR = 'Validator Account',\n AUTHORITY = 'Authority Account',\n OTHER = 'Other Account',\n}\n\nexport type SelectTransferRes = {\n fromWalletPath: string\n fromAddress: string\n toAddress: string\n}\n\nexport const transferFromArray: string[] = Object.values(TransferFrom)\n\nexport const transferCommands = (config: DefaultConfigType) => {\n program\n .command('transfer')\n .alias('tr')\n .option('-s, --spl', 'Show SPL Token Balance', false)\n .description('Transfer Solana Tokens/SPL Tokens')\n .action(async (options: BalanceOptions) => {\n if (options.spl) {\n console.log(\n chalk.blue(\n '✨ Coming Soon\\nThis Feature is Currently Under Development\\nPlease Check Back Later',\n ),\n )\n process.exit(0)\n }\n const { fromWalletPath, fromAddress, toAddress } =\n await selectFromKeypairs()\n let toBalance = '0'\n try {\n const out = spawnSync(\n `solana balance ${toAddress} --url ${config.RPC_URL}`,\n { shell: true },\n )\n if (out.status !== 0) {\n throw new Error('Invalid Wallet Address')\n }\n toBalance = out.stdout.toString()\n console.log('toBalance:', toBalance)\n } catch (error) {\n console.log(\n chalk.red(`❌ To Wallet is Invalid\\nPlease Check the Wallet Address`),\n )\n process.exit(0)\n }\n\n const fromBalance = execSync(\n `solana balance ${fromAddress} --url ${config.RPC_URL}`,\n ).toString()\n\n console.log(\n chalk.white(\n `🏦 From Wallet: ${fromAddress}\\n💰 Balance: ${fromBalance}`,\n ),\n )\n console.log(\n chalk.white(`🏦 To Wallet: ${toAddress}\\n💰 Balance: ${toBalance}`),\n )\n const { amount } = await inquirer.prompt<{ amount: number }>([\n {\n type: 'number',\n name: 'amount',\n message: 'Enter Amount to Transfer',\n default: 0.1,\n },\n ])\n const cmd = `solana transfer ${toAddress} ${amount} --allow-unfunded-recipient --keypair ${fromWalletPath} --url ${config.RPC_URL}`\n let result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n let maxRetries = MAX_RETRIES\n while (result.status !== 0 && maxRetries > 0) {\n console.log(\n chalk.red(\n `❌ Transaction Failed\\nRetrying Transaction in ${RETRY_DELAY}ms\\nRetries Left: ${maxRetries}`,\n ),\n )\n await sleep(RETRY_DELAY)\n result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n maxRetries--\n }\n process.exit(0)\n })\n}\n\nexport const validateSolanaKey = (input: string): boolean | string => {\n const regex = /^[1-9A-HJ-NP-Za-km-z]{43,44}$/\n if (regex.test(input)) {\n return true\n }\n return 'Invalid Solana keygen string. Please enter a valid key.'\n}\n\nconst selectFromKeypairs = async () => {\n const homeDir = homedir()\n const authorityKey = 'mainnet-authority-keypair.json'\n const validatorKey = 'mainnet-validator-keypair.json'\n let toKeyPath = `${homeDir}/${authorityKey}`\n\n let toAddress = execSync(`solana address -k ${toKeyPath}`).toString().trim()\n const answer = await inquirer.prompt<{ from: string }>([\n {\n type: 'list',\n name: 'from',\n message: 'Select Transfer From Account',\n choices: transferFromArray,\n },\n ])\n const secondChoice =\n answer.from === TransferFrom.VALIDATOR\n ? Object.values(TransferTo).filter(\n (value) => value !== TransferTo.VALIDATOR,\n )\n : Object.values(TransferTo).filter(\n (value) => value !== TransferTo.AUTHORITY,\n )\n\n const second = await inquirer.prompt<{ to: string }>([\n {\n type: 'list',\n name: 'to',\n message: 'Select Transfer To Account',\n choices: secondChoice,\n },\n ])\n if (second.to === TransferTo.OTHER) {\n const { to } = await inquirer.prompt<{ to: string }>([\n {\n type: 'input',\n name: 'to',\n message: 'Enter Transfer To Account',\n validate: validateSolanaKey,\n },\n ])\n toAddress = to\n } else {\n const toKey =\n answer.from === TransferFrom.VALIDATOR ? authorityKey : validatorKey\n toKeyPath = `${homeDir}/${toKey}`\n toAddress = execSync(`solana address -k ${toKeyPath}`).toString().trim()\n }\n const key =\n answer.from === TransferFrom.VALIDATOR ? validatorKey : authorityKey\n const fromWalletPath = `${homeDir}/${key}`\n const fromAddress = execSync(`solana address -k ${fromWalletPath}`)\n .toString()\n .trim()\n return { fromWalletPath, fromAddress, toAddress } as SelectTransferRes\n}\n","import { SOLANA_TESTNET_RPC_URL } from '@/config/config'\nimport { Network } from '@/config/enums'\nimport { DefaultConfigType } from '@/config/types'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport { execSync, spawnSync } from 'node:child_process'\n\nexport const withdraw = async (config: DefaultConfigType, isAll = false) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const RPC_URL = isTestnet ? SOLANA_TESTNET_RPC_URL : config.RPC_URL\n const validatorKeypair = isTestnet\n ? '~/testnet-validator-keypair.json'\n : '~/mainnet-validator-keypair.json'\n const authorityKeypair = isTestnet\n ? '~/testnet-authority-keypair.json'\n : '~/mainnet-authority-keypair.json'\n const voteAccount = isTestnet\n ? '~/testnet-vote-account-keypair.json'\n : '~/mainnet-vote-account-keypair.json'\n\n const currentVoteAccountBalance = execSync(`solana balance ${voteAccount}`)\n .toString()\n .replace('SOL', '')\n .trim()\n\n let withdrawAmount = 0\n const defaultMax = Number(currentVoteAccountBalance) - 0.03\n if (isAll) {\n withdrawAmount = defaultMax\n } else {\n console.log(\n chalk.white(\n '💰 Current Vote Account Balance:',\n currentVoteAccountBalance + ' SOL',\n ),\n )\n console.log(\n chalk.yellow(\n '⚠️ 0.03 SOL will be left in the account if you just press enter.',\n ),\n )\n const answer = await inquirer.prompt<{ sol: string }>([\n {\n type: 'input',\n name: 'sol',\n message: `How many SOL? e.g. ${defaultMax}`,\n default: String(defaultMax),\n },\n ])\n withdrawAmount = Number(answer.sol)\n }\n\n const votePubkey = execSync(`solana address --keypair ${voteAccount}`)\n .toString()\n .trim()\n const targetPubkey = execSync(`solana address --keypair ${authorityKeypair}`)\n .toString()\n .trim()\n const cmd = `solana withdraw-from-vote-account --keypair ${validatorKeypair} --commitment finalized ${votePubkey} ${targetPubkey} ${withdrawAmount} --authorized-withdrawer ${authorityKeypair} --url ${RPC_URL}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport { withdraw } from './withdraw'\nimport { DefaultConfigType } from '@/config/types'\n\ntype WithdrawOptions = {\n all: boolean\n}\n\nexport const withdrawCommands = (config: DefaultConfigType) => {\n program\n .command('withdraw')\n .option('-a, --all', 'Withdraw All SOL', false)\n .description('Withdraw SOL from Vote Account to Authority Account')\n .action(async (options: WithdrawOptions) => {\n await withdraw(config, options.all)\n process.exit(0)\n })\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { execSync, spawnSync } from 'node:child_process'\nimport { getHarvestBalance } from './getHarvestBalance'\nimport getBalance, { KeyType } from '@/lib/solana/getBalance'\nimport chalk from 'chalk'\nimport { solanaTransfer } from '@/lib/solana/solanaTransfer'\nimport { readFile } from 'fs/promises'\nimport { LAMPORTS_PER_SOL } from '@solana/web3.js'\n\n// Collect SOL from Vote Account to Authority Account and Validator Account to Authority Account\n// 1. Withdraw all SOL from Vote Account to Authority Account\n// 2. Transfer SOL from Validator Account to Authority Account\n\nexport const collectSOL = async (rpcUrl: string) => {\n const { mainnetValidatorAuthorityKey, mainnetValidatorKey } = getAllKeyPaths()\n\n // Check Vote Account Balance\n const voteAccountBalance = await getBalance(rpcUrl, KeyType.VOTE)\n\n // Skip this step if Vote Account Balance is less than 1 SOL\n if (voteAccountBalance < 1) {\n console.log(chalk.white('Vote Account Balance is less than 1 SOL'))\n console.log(\n chalk.white(\n 'Skip withdrawing SOL from Vote Account to Authority Account',\n ),\n )\n } else {\n // Withdraw all SOL from Vote Account to Authority Account\n const cmd = `solv withdraw --all`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n }\n\n // Check Validator Key Balance\n const validatorTransferableBalance = await getHarvestBalance(rpcUrl)\n console.log(\n chalk.white(`Transferable Balance: ${validatorTransferableBalance} SOL`),\n )\n const transferLamports = validatorTransferableBalance * LAMPORTS_PER_SOL\n\n // Skip this step if Validator Account Balance is less than 1 SOL\n if (validatorTransferableBalance < 1) {\n console.log(chalk.white('Validator Account Balance is less than 1 SOL'))\n console.log(\n chalk.white(\n 'Skip transferring SOL from Validator Account to Authority Account',\n ),\n )\n } else {\n // Transfer SOL from Validator Account to Authority Account\n const toAddress = execSync(\n `solana address --keypair ${mainnetValidatorAuthorityKey}`,\n )\n .toString()\n .trim()\n\n const fromWalletKey = JSON.parse(\n await readFile(mainnetValidatorKey, 'utf-8'),\n ) as number[]\n\n await solanaTransfer(rpcUrl, fromWalletKey, toAddress, transferLamports)\n }\n return true\n}\n","import { BN } from 'bn.js'\nimport { LAMPORTS_PER_SOL } from '@solana/web3.js'\nimport getBalance, { KeyType } from '@/lib/solana/getBalance'\n\n// Havrst Settings\nconst MINIMUM_EPOCH_START_BALANCE = new BN(3 * LAMPORTS_PER_SOL) // LAMPORTS\n\nexport const getHarvestBalance = async (rpcUrl: string) => {\n const validatorBalance = await getBalance(rpcUrl, KeyType.VALIDATOR)\n const validatorBalanceBN = new BN(\n Number(Number(validatorBalance) * LAMPORTS_PER_SOL),\n )\n const withdrawableBalanceLamport = validatorBalanceBN.sub(\n MINIMUM_EPOCH_START_BALANCE,\n )\n let withdrawableBalance =\n Number(withdrawableBalanceLamport) / LAMPORTS_PER_SOL\n // round to 9 decimal places\n withdrawableBalance = Math.round(withdrawableBalance * 1e9) / 1e9\n return withdrawableBalance // SOL\n}\n","import { getAllKeyPaths } from '@/config/config'\nimport { Connection, LAMPORTS_PER_SOL } from '@solana/web3.js'\nimport loadKeypairFromFile from './loadKeypairFromFile'\nimport { homedir } from 'os'\n\nexport enum KeyType {\n VALIDATOR = 'validator',\n AUTH = 'auth',\n VOTE = 'vote',\n}\n\ntype NetworkPrefix = 'mainnet' | 'testnet'\n\ntype KeySuffix = 'ValidatorKey' | 'ValidatorVoteKey' | 'ValidatorAuthorityKey'\n\ntype AccountKey =\n | 'mainnetValidatorKey'\n | 'mainnetValidatorVoteKey'\n | 'mainnetValidatorAuthorityKey'\n | 'testnetValidatorKey'\n | 'testnetValidatorVoteKey'\n | 'testnetValidatorAuthorityKey'\n\nconst keySuffixMap: Record<KeyType, KeySuffix> = {\n [KeyType.VALIDATOR]: 'ValidatorKey',\n [KeyType.AUTH]: 'ValidatorAuthorityKey',\n [KeyType.VOTE]: 'ValidatorVoteKey',\n}\n\nconst getBalance = async (\n rpcUrl: string,\n key: KeyType = KeyType.AUTH,\n isTestnet: boolean = false,\n): Promise<number> => {\n const connection = new Connection(rpcUrl)\n const home = homedir()\n const keyPaths = getAllKeyPaths(home)\n\n const prefix: NetworkPrefix = isTestnet ? 'testnet' : 'mainnet'\n\n const accountKey = `${prefix}${keySuffixMap[key]}` as AccountKey\n const account = keyPaths[accountKey]\n\n const keypair = await loadKeypairFromFile(account)\n const balance = await connection.getBalance(keypair.publicKey)\n const lamports = Number(balance)\n const SOL = lamports / LAMPORTS_PER_SOL\n\n if (isNaN(SOL)) throw new Error('Failed to get balance')\n return SOL\n}\n\nexport default getBalance\n","import { Keypair } from '@solana/web3.js'\nimport { readFile } from 'fs/promises'\n\nconst loadKeypairFromFile = async (filePath: string) => {\n const secretKey = JSON.parse(await readFile(filePath, 'utf8')) as number[]\n return Keypair.fromSecretKey(new Uint8Array(secretKey))\n}\n\nexport default loadKeypairFromFile\n","import {\n Keypair,\n Connection,\n PublicKey,\n SystemProgram,\n ComputeBudgetProgram,\n VersionedTransaction,\n TransactionMessage,\n} from '@solana/web3.js'\nimport sleep from '../sleep'\nimport { MAX_RETRIES } from '@/config/constants'\n\nexport const solanaTransfer = async (\n endpoint: string,\n fromWalletKey: number[],\n toAddressPubkey: string,\n transferAmountLamport: number,\n) => {\n let retry = 0\n try {\n const connection = new Connection(endpoint, 'finalized')\n\n const fromWallet = Keypair.fromSecretKey(\n new Uint8Array(Array.from(fromWalletKey)),\n )\n const toPubkey = new PublicKey(toAddressPubkey)\n const lamports = transferAmountLamport\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const testInstructions = [\n SystemProgram.transfer({\n fromPubkey: fromWallet.publicKey,\n toPubkey,\n lamports,\n }),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: Math.ceil(5000000),\n }),\n ]\n\n const latestBlockhashAndContext =\n await connection.getLatestBlockhashAndContext({\n commitment: 'finalized',\n })\n\n const testVersionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions: testInstructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n const simulationResult = await connection.simulateTransaction(\n testVersionedTx,\n {\n replaceRecentBlockhash: true,\n sigVerify: false,\n },\n )\n\n testVersionedTx.sign([fromWallet])\n\n const instructions = [\n SystemProgram.transfer({\n fromPubkey: fromWallet.publicKey,\n toPubkey,\n lamports,\n }),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: simulationResult.value.unitsConsumed\n ? Math.trunc(simulationResult.value.unitsConsumed * 1.2)\n : 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1000,\n }),\n ]\n\n const versionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n versionedTx.sign([fromWallet])\n const signature = await connection.sendRawTransaction(\n versionedTx.serialize(),\n )\n\n await connection.confirmTransaction(\n {\n ...latestBlockhashAndContext.value,\n signature,\n },\n 'finalized',\n )\n console.log('finalized signature:', signature)\n return signature\n } catch (error) {\n retry++\n if (retry > MAX_RETRIES) {\n throw new Error(JSON.stringify(error))\n }\n console.log(\n `solanaTransfer failed, ${retry} times retrying... Error: ${error}`,\n )\n await sleep(1000)\n }\n }\n } catch (error) {\n console.log(`solanaTransfer: ${error}`)\n throw new Error(JSON.stringify(error))\n }\n}\n","import { program } from '@/index'\nimport { collectSOL } from './collectSOL'\nimport getBalance, { KeyType } from '@/lib/solana/getBalance'\nimport sleep from '@/lib/sleep'\nimport { elSOLdeposit } from '../stake/elSOLdeposit'\nimport {\n ELSOL_DECIMALS,\n ELSOL_MINT_ADDRESS,\n SOLV_STAKE_POOL_ADDRESS,\n getAllKeyPaths,\n} from '@/config/config'\nimport { readFile } from 'fs/promises'\nimport inquirer from 'inquirer'\nimport { validateSolanaKey } from '../transfer'\nimport getElSOLBalance from '@/lib/solana/getElSOLBalance'\nimport chalk from 'chalk'\nimport { transferSPLToken } from '@/lib/solana/transferSPLToken'\nimport { sendDiscord } from '@/lib/sendDiscord'\nimport mevOn from './mevOn'\nimport { spawnSync } from 'node:child_process'\nimport { getEpochInfo } from '@/lib/getEpochInfo'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { DefaultConfigType } from '@/config/types'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\n\nconst MINIMUM_AUTHORITY_BALANCE = 0.03\n\nexport const harvestCommands = (config: DefaultConfigType) => {\n program\n .command('harvest')\n .alias('hv')\n .description('Harvest SOL from Validator Account to Authority Account')\n .action(async () => {\n const harvestAddress = await getHarvestAddress(config)\n const { mainnetValidatorAuthorityKey } = getAllKeyPaths()\n console.log('Harvesting SOL...')\n await collectSOL(config.RPC_URL)\n let voteBalance = await getBalance(config.RPC_URL, KeyType.VOTE)\n let retryCount = 0\n while (voteBalance > 1 && retryCount < 3) {\n console.log('Retrying Harvesting SOL...')\n await sleep(1000)\n await collectSOL(config.RPC_URL)\n voteBalance = await getBalance(config.RPC_URL, KeyType.VOTE)\n retryCount++\n }\n const fromWalletKey = JSON.parse(\n await readFile(mainnetValidatorAuthorityKey, 'utf-8'),\n ) as number[]\n\n // Convert SOL to elSOL\n const authorityBalance = await getBalance(config.RPC_URL, KeyType.AUTH)\n if (authorityBalance < 1) {\n console.log(chalk.white('Authority Account Balance is less than 1 SOL'))\n console.log(chalk.white('Skip converting SOL to elSOL'))\n } else {\n let convertibleBalance = authorityBalance - MINIMUM_AUTHORITY_BALANCE\n convertibleBalance = Math.round(convertibleBalance * 1e9) / 1e9\n console.log(`Converting ${convertibleBalance} SOL to elSOL`)\n const result = await elSOLdeposit(\n config.RPC_URL,\n SOLV_STAKE_POOL_ADDRESS,\n convertibleBalance,\n fromWalletKey,\n )\n if (!result) {\n throw new Error('Failed to convert SOL to elSOL')\n }\n }\n\n // Transfer elSOL to Harvest Address\n const elSOLBalance = await getElSOLBalance(config.RPC_URL)\n if (elSOLBalance < 1) {\n const epoch = await getEpochInfo(config.RPC_URL)\n console.log('elSOL Balance is less than 1 elSOL')\n const msg = `elSOL Balance is less than 1 elSOL for ${epoch.epoch}`\n await sendDiscord(msg)\n\n process.exit(0)\n }\n console.log(`Transferring ${elSOLBalance} elSOL to Harvest Address`)\n await transferSPLToken(\n config.RPC_URL,\n fromWalletKey,\n harvestAddress,\n elSOLBalance,\n ELSOL_MINT_ADDRESS,\n ELSOL_DECIMALS,\n )\n if (config.IS_MEV_MODE) {\n const epoch = await getEpochInfo(config.RPC_URL)\n const msg = `💰 Harvested Rewards for ${epoch.epoch} 💰\nValidator Address: ${getSolanaAddress(mainnetValidatorAuthorityKey)}\nTotal Reward: ${elSOLBalance} elSOL\nHarvest Address: ${harvestAddress}`\n await sendDiscord(msg)\n }\n console.log(chalk.green('✔︎ Successfully Harvested SOL'))\n process.exit(0)\n })\n\n program\n .command('auto')\n .alias('mev')\n .description('Enable Auto Operation Mode')\n .action(async () => {\n const res = await mevOn(config)\n if (res) {\n spawnSync(`solv cron epoch`, {\n stdio: 'inherit',\n shell: true,\n })\n console.log(chalk.green('✔︎ Auto Operation Mode Enabled'))\n }\n process.exit(0)\n })\n}\n\nexport const getHarvestAddress = async (config: DefaultConfigType) => {\n try {\n const harvestAddress = config.HARVEST_ACCOUNT\n if (harvestAddress === '') {\n throw new Error('Harvest Address not found')\n }\n return harvestAddress\n } catch (error) {\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'harvestAddress',\n message: 'Enter Harvest Address',\n validate: validateSolanaKey,\n },\n ])\n await updateDefaultConfig({ HARVEST_ACCOUNT: answer.harvestAddress })\n return answer.harvestAddress as string\n }\n}\n","import { ELSOL_MINT_ADDRESS, getAllKeyPaths } from '@/config/config'\nimport chalk from 'chalk'\nimport { execSync } from 'child_process'\nimport { homedir } from 'os'\n\nconst getElSOLBalance = async (rpcUrl: string) => {\n try {\n const home = homedir()\n const { mainnetValidatorAuthorityKey } = getAllKeyPaths(home)\n const cmd = `spl-token balance ${ELSOL_MINT_ADDRESS} --owner ${mainnetValidatorAuthorityKey} --url ${rpcUrl}`\n const balance = execSync(cmd).toString().trim()\n return Number(balance)\n } catch (error) {\n console.log(chalk.red(`Error: ${error}`))\n console.log(chalk.yellow(`You might need to install the Solana SPL CLI:\\n`))\n console.log(chalk.white(`$ cargo install spl-token-cli`))\n return 0\n }\n}\n\nexport default getElSOLBalance\n","import {\n Connection,\n PublicKey,\n Keypair,\n ComputeBudgetProgram,\n VersionedTransaction,\n TransactionMessage,\n} from '@solana/web3.js'\nimport {\n getOrCreateAssociatedTokenAccount,\n createTransferInstruction,\n TOKEN_PROGRAM_ID,\n} from '@solana/spl-token'\n\nexport const transferSPLToken = async (\n endpoint: string,\n fromWalletKey: number[],\n toAddressPubkey: string,\n amount: number,\n tokenMintAddress: string,\n tokenDecimals: number,\n) => {\n try {\n const connection = new Connection(endpoint, 'finalized')\n\n const fromWallet = Keypair.fromSecretKey(new Uint8Array(fromWalletKey))\n const toPubkey = new PublicKey(toAddressPubkey)\n const mintPubkey = new PublicKey(tokenMintAddress)\n\n const amountInSmallestUnit = Math.trunc(\n amount * Math.pow(10, tokenDecimals),\n )\n\n const fromTokenAccount = await getOrCreateAssociatedTokenAccount(\n connection,\n fromWallet,\n mintPubkey,\n fromWallet.publicKey,\n )\n const toTokenAccount = await getOrCreateAssociatedTokenAccount(\n connection,\n fromWallet,\n mintPubkey,\n toPubkey,\n true,\n )\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const testInstructions = [\n createTransferInstruction(\n fromTokenAccount.address,\n toTokenAccount.address,\n fromWallet.publicKey,\n amountInSmallestUnit,\n [],\n TOKEN_PROGRAM_ID,\n ),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: Math.ceil(5000000),\n }),\n ]\n\n const latestBlockhashAndContext =\n await connection.getLatestBlockhashAndContext({\n commitment: 'finalized',\n })\n\n const testVersionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions: testInstructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n const simulationResult = await connection.simulateTransaction(\n testVersionedTx,\n {\n replaceRecentBlockhash: true,\n sigVerify: false,\n },\n )\n testVersionedTx.sign([fromWallet])\n\n const instructions = [\n createTransferInstruction(\n fromTokenAccount.address,\n toTokenAccount.address,\n fromWallet.publicKey,\n amountInSmallestUnit,\n [],\n TOKEN_PROGRAM_ID,\n ),\n ComputeBudgetProgram.setComputeUnitLimit({\n units: simulationResult.value.unitsConsumed\n ? Math.trunc(simulationResult.value.unitsConsumed * 1.2)\n : 200_000,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 1000,\n }),\n ]\n const versionedTx = new VersionedTransaction(\n new TransactionMessage({\n instructions,\n payerKey: fromWallet.publicKey,\n recentBlockhash: latestBlockhashAndContext.value.blockhash,\n }).compileToV0Message(),\n )\n\n versionedTx.sign([fromWallet])\n const signature = await connection.sendRawTransaction(\n versionedTx.serialize(),\n )\n\n await connection.confirmTransaction(\n {\n ...latestBlockhashAndContext.value,\n signature,\n },\n 'finalized',\n )\n console.log('finalized signature:', signature)\n return signature\n } catch (error) {\n console.error('Transfer failed, retrying...', error)\n }\n }\n } catch (error) {\n console.error(error)\n throw error\n }\n}\n","import inquirer from 'inquirer'\nimport { validateSolanaKey } from '../transfer'\nimport hasEpochTimer from '../cron/hasEpochTimer'\nimport removeCronJob from '../cron/removeCronJob'\nimport chalk from 'chalk'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\ntype MevOnParam1 = {\n mevOn: boolean\n}\ntype MevOnAutoParam = {\n autoUpdate: boolean\n autoRestart: boolean\n}\n\ntype MevOnParam2 = {\n discordWebhookUrl: string\n}\n\ntype MevOnParam3 = {\n rpcUrl: string\n}\n\nconst mevOn = async (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const ask = await inquirer.prompt<MevOnParam1>([\n {\n type: 'confirm',\n name: 'mevOn',\n message:\n 'Do you want to enable solv Auto Operation Mode?(You can change it again)',\n default: false,\n },\n ])\n if (!ask.mevOn) {\n const hasCron = await hasEpochTimer()\n if (hasCron) {\n // Delete the cron job\n await removeCronJob()\n }\n await updateDefaultConfig({\n IS_MEV_MODE: ask.mevOn,\n AUTO_UPDATE: false,\n AUTO_RESTART: false,\n })\n return false\n }\n const autoText = `✨ About Auto Update & Restart ✨\n${chalk.green('No more Login to the server to update 🌱')}\n\nIf you enable this, solv will update automatically when the solv/solana version is updated.\n\nAUTO UPDATE: If you enable this, solv will update automatically when the solv version is updated.\n\nAUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.\n※ Please turn off if you are using no-downtime migration.\n`\n console.log(chalk.white(autoText))\n const askIfAuto = await inquirer.prompt<MevOnAutoParam>([\n {\n type: 'confirm',\n name: 'autoUpdate',\n message: 'Do you want to enable AUTO UPDATE? (Recommended)',\n default: false,\n },\n {\n type: 'confirm',\n name: 'autoRestart',\n message: 'Do you want to enable AUTO RESTART?',\n default: false,\n },\n ])\n let rpcUrl = config.RPC_URL\n let harvestAddress = ''\n const ask2 = await inquirer.prompt<MevOnParam2>([\n {\n type: 'input',\n name: 'discordWebhookUrl',\n message: 'Enter your Discord Webhook URL',\n default: config.DISCORD_WEBHOOK_URL,\n },\n ])\n if (isTestnet) {\n harvestAddress = ''\n } else {\n const ask3 = await inquirer.prompt<MevOnParam3>([\n {\n type: 'input',\n name: 'rpcUrl',\n message: 'Enter your RPC URL',\n default: config.RPC_URL,\n },\n ])\n rpcUrl = ask3.rpcUrl\n }\n\n await updateDefaultConfig({\n HARVEST_ACCOUNT: harvestAddress,\n IS_MEV_MODE: ask.mevOn,\n RPC_URL: rpcUrl,\n DISCORD_WEBHOOK_URL: ask2.discordWebhookUrl,\n AUTO_UPDATE: askIfAuto.autoUpdate,\n AUTO_RESTART: askIfAuto.autoRestart,\n })\n return true\n}\n\nexport default mevOn\n","import { spawnSync } from 'child_process'\nimport chalk from 'chalk'\nimport { promises as fs } from 'fs'\n\nconst removeCronJob = async (cronPattern = 'epochTimer'): Promise<void> => {\n try {\n // 現在のcrontabの内容を取得\n const crontabResult = spawnSync('crontab', ['-l'], { encoding: 'utf-8' })\n if (crontabResult.status !== 0) {\n console.log(chalk.red('⚠️ Could not read crontab.'))\n process.exit(1)\n }\n\n const crontab = crontabResult.stdout.split('\\n')\n\n // 指定したcronPatternを含まない行だけを抽出\n const newCronBody = crontab\n .filter((line) => !line.includes(cronPattern))\n .join('\\n')\n\n // 新しいcrontabの内容を設定\n const tempCrontabFile = '/tmp/temp_crontab'\n await fs.writeFile(tempCrontabFile, newCronBody, 'utf-8')\n spawnSync('crontab', [tempCrontabFile])\n await fs.unlink(tempCrontabFile) // 一時ファイルを削除\n\n console.log(chalk.green('✅ Cron Job successfully removed.'))\n } catch (error) {\n console.log(chalk.red('Error removing cron job:', error))\n }\n}\n\nexport default removeCronJob\n","import { Connection, EpochInfo } from '@solana/web3.js'\nimport getAverageSlotTime from './getAverageSlotTime'\n\nexport interface EpochInfoType extends EpochInfo {\n estimatedTimeUntilNextEpoch: string\n displayRatio: string\n}\n\nexport const getEpochInfo = async (rpcUrl: string) => {\n try {\n const connection = new Connection(rpcUrl)\n const epochInfo = await connection.getEpochInfo()\n if (epochInfo.slotsInEpoch === 0) {\n throw new Error('slotsInEpoch is 0, causing division by zero.')\n }\n\n const timePerSlotSeconds = await getAverageSlotTime(rpcUrl)\n console.log('timePerSlotSeconds', timePerSlotSeconds)\n const remainingSlots = epochInfo.slotsInEpoch - epochInfo.slotIndex\n const estimatedSecondsUntilNextEpoch = remainingSlots * timePerSlotSeconds\n const displayRatio = (\n (epochInfo.slotIndex / epochInfo.slotsInEpoch) *\n 100\n ).toFixed(2)\n // 時間の表示方法を調整\n const days = Math.floor(estimatedSecondsUntilNextEpoch / (3600 * 24))\n const hours = Math.floor(\n (estimatedSecondsUntilNextEpoch % (3600 * 24)) / 3600,\n )\n const minutes = Math.floor((estimatedSecondsUntilNextEpoch % 3600) / 60)\n const seconds = Math.floor(estimatedSecondsUntilNextEpoch % 60)\n let estimatedTimeUntilNextEpoch = `${days}d ${hours}h ${minutes}m ${seconds}s`\n if (days === 0) {\n estimatedTimeUntilNextEpoch = `${hours}h ${minutes}m ${seconds}s`\n }\n return {\n ...epochInfo,\n estimatedTimeUntilNextEpoch,\n displayRatio,\n } as EpochInfoType\n } catch (error) {\n throw new Error(`getEpochInfo failed: ${error}`)\n }\n}\n","import { Connection } from '@solana/web3.js'\n\nconst getAverageSlotTime = async (\n rpcUrl: string,\n sampleCount = 10,\n fallbackSlotTime = 0.4, // Set a reasonable fallback slot time in seconds\n): Promise<number> => {\n try {\n const connection = new Connection(rpcUrl)\n const samples = await connection.getRecentPerformanceSamples(sampleCount)\n\n // Handle the case where no samples are available\n if (samples.length === 0) {\n console.warn(\n 'No performance samples available. Using fallback slot time.',\n )\n return fallbackSlotTime\n }\n\n // Filter out samples with numSlots equal to 0\n const validSamples = samples.filter((sample) => sample.numSlots !== 0)\n\n // If no valid samples, use the fallback slot time\n if (validSamples.length === 0) {\n console.warn(\n 'All performance samples have numSlots equal to 0. Using fallback slot time.',\n )\n return fallbackSlotTime\n }\n\n // Calculate the average slot time from valid samples\n const averageSlotTime =\n validSamples.reduce((acc, sample) => {\n return acc + sample.samplePeriodSecs / sample.numSlots\n }, 0) / validSamples.length\n\n return averageSlotTime\n } catch (error) {\n console.error(\n `getAverageSlotTime failed: ${error}. Using fallback slot time.`,\n )\n return fallbackSlotTime // Return fallback slot time in case of error\n }\n}\n\nexport default getAverageSlotTime\n","import { format } from '@skeet-framework/utils'\nimport isLessThan1Day from './lessThan1Day'\nimport lessThan8Hour from './lessThan8Hour'\nimport lessThan1Hour from './lessThan1Hour'\nimport newEpoch from './newEpoch'\nimport initOrReadEpochFile from './initEpochFile'\nimport checkBalance from './checkBalance'\nimport { isValidatorActive } from './isValidatorActive'\nimport { getAllKeyPaths, SOLANA_TESTNET_RPC_URL } from '@/config/config'\n// import { sendDiscord } from '@/lib/sendDiscord'\nimport isVersionSame from './isVersionSame'\nimport { spawnSync } from 'child_process'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { getEpochInfoByRust } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nexport type EpochData = {\n epoch: number\n isLessThan1Hour: boolean\n isLessThan8Hours: boolean\n isLessThan1Day: boolean\n}\n\nexport const epochTimer = async (config: DefaultConfigType) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const rpcUrl = isTestnet ? SOLANA_TESTNET_RPC_URL : config.RPC_URL\n const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss')\n console.log(`Checking Epoch at ${now}`)\n const getD1Epoch = await initOrReadEpochFile()\n const currentEpoch = getEpochInfoByRust(rpcUrl)\n // Check if Validator is running\n const { mainnetValidatorVoteKey, testnetValidatorVoteKey } = getAllKeyPaths()\n let voteAccountKey = isTestnet\n ? testnetValidatorVoteKey\n : mainnetValidatorVoteKey\n\n const isActive = await isValidatorActive(\n rpcUrl,\n getSolanaAddress(voteAccountKey),\n )\n // if (!isActive.isActive) {\n // await sendDiscord(\n // `⚠️ Validator is not active!\\nVoteAccount: ${isActive.pubkey}\\nReason: ${isActive.reason}\\nNetwork: ${config.NETWORK}\\nPlease check your validator node 👷‍♀️`,\n // )\n // }\n console.log(`Validator is active: ${isActive.isActive}`)\n // Check Validator Account's Balance\n await checkBalance(config)\n\n // Check if solv/Solana version update is required\n const isSolvVersionSame = await isVersionSame()\n if (!isSolvVersionSame && config.AUTO_UPDATE) {\n console.log(`Found new version of solv! Updating...`)\n spawnSync(`solv update && solv update --config && solv update --auto`, {\n stdio: 'inherit',\n shell: true,\n })\n return 'Node has been restarted!'\n }\n\n // New epoch has been updated\n if (getD1Epoch.epoch < currentEpoch.epoch) {\n await newEpoch(currentEpoch, config)\n return 'Epoch has been updated!'\n }\n\n // Get the total minutes until the next epoch\n const totalMinutes = currentEpoch.totalMinutes\n\n // Check conditions in sequence and stop if any condition is met\n const checks = [lessThan1Hour, lessThan8Hour, isLessThan1Day]\n for (const check of checks) {\n const result = await check(totalMinutes, getD1Epoch, currentEpoch, config)\n if (result) {\n break\n }\n }\n\n return 'Epoch has not been changed!'\n}\n\nexport default epochTimer\n","import { EPOCH_TIMER_FILE_PATH } from '@/config/config'\nimport { writeFile } from 'fs/promises'\nimport { EpochData } from './epochTimer'\n\nconst writeEpochDataToFile = async (epochData: EpochData) => {\n await writeFile(\n EPOCH_TIMER_FILE_PATH,\n JSON.stringify({ ...epochData }, null, 2),\n 'utf-8',\n )\n}\n\nexport default writeEpochDataToFile\n","import { EpochData } from './epochTimer'\nimport writeEpochDataToFile from './writeEpochDataToFile'\n// import alertMessage from './alertMessage'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\n\nconst isLessThan1Day = async (\n totalMinutes: number,\n epochData: EpochData,\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n if (\n totalMinutes < 24 * 60 &&\n totalMinutes >= 8 * 60 &&\n !epochData.isLessThan1Day\n ) {\n // Update the database and send a notification\n await writeEpochDataToFile({ ...epochData, isLessThan1Day: true })\n // await alertMessage(currentEpoch, '1 Day', config)\n }\n}\n\nexport default isLessThan1Day\n","import { EpochData } from './epochTimer'\nimport writeEpochDataToFile from './writeEpochDataToFile'\n// import alertMessage from './alertMessage'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\n\nconst lessThan8Hour = async (\n totalMinutes: number,\n epochData: EpochData,\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n if (\n totalMinutes < 8 * 60 &&\n totalMinutes >= 60 &&\n !epochData.isLessThan8Hours\n ) {\n // Update the database and send a notification\n await writeEpochDataToFile({ ...epochData, isLessThan8Hours: true })\n // await alertMessage(currentEpoch, '8 Hours', config)\n }\n}\n\nexport default lessThan8Hour\n","import { EpochData } from './epochTimer'\n// import { spawnSync } from 'child_process'\nimport writeEpochDataToFile from './writeEpochDataToFile'\n// import alertMessage from './alertMessage'\n// import chalk from 'chalk'\n// import randomSleep from './randomSleep'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\n// import { Network } from '@/config/enums'\n\nconst lessThan1Hour = async (\n totalMinutes: number,\n epochData: EpochData,\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n // const isMEV = config.IS_MEV_MODE\n // const isMainnet = config.NETWORK === Network.MAINNET\n if (totalMinutes < 60 && !epochData.isLessThan1Hour) {\n // Update the database and send a notification\n await writeEpochDataToFile({ ...epochData, isLessThan1Hour: true })\n // await alertMessage(currentEpoch, '1 Hour', config)\n\n // If MEV is enabled, run `solv harvest` command\n // if (isMEV && isMainnet) {\n // Random Sleep to avoid network congestion\n // const waitTime = await randomSleep(1, 100)\n // console.log(\n // chalk.white(\n // `⏳ Waiting for ${waitTime} seconds before running solv harvest...`,\n // ),\n // )\n // run `solv harvest` command\n // spawnSync('solv', ['harvest'], { stdio: 'inherit', shell: true })\n // }\n return true\n }\n return false\n}\n\nexport default lessThan1Hour\n","import { EpochData } from './epochTimer'\n// import { sendDiscord } from '@/lib/sendDiscord'\nimport writeEpochDataToFile from './writeEpochDataToFile'\nimport { getAllKeyPaths } from '@/config/config'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { EpochInfoCLIType } from '@/lib/getEpochInfoByRust'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nconst newEpoch = async (\n currentEpoch: EpochInfoCLIType,\n config: DefaultConfigType,\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const params: EpochData = {\n epoch: currentEpoch.epoch,\n isLessThan1Hour: false,\n isLessThan8Hours: false,\n isLessThan1Day: false,\n }\n const { mainnetValidatorKey, testnetValidatorKey } = getAllKeyPaths()\n const address = isTestnet\n ? getSolanaAddress(testnetValidatorKey)\n : getSolanaAddress(mainnetValidatorKey)\n await writeEpochDataToFile(params)\n console.log('Epoch has been updated!')\n\n const content = `===⏳ ${currentEpoch.epoch} ⏳===\nValidator: ${address}\nNetwork: ${config.NETWORK}\nCurrentEpoch: ${currentEpoch.epoch}\nEpoch has been updated!\nUntil Next Epoch: Approximately 2 days`\n // await sendDiscord(content)\n return 'Epoch has been updated!'\n}\n\nexport default newEpoch\n","import { EPOCH_TIMER_FILE_PATH } from '@/config/config'\nimport { existsAsync } from '@skeet-framework/utils'\nimport { EpochData } from './epochTimer'\nimport { readFile, writeFile } from 'fs/promises'\nimport chalk from 'chalk'\nimport { homedir } from 'os'\n\nconst initOrReadEpochFile = async () => {\n const homeDir = homedir()\n const epochFilePath = homeDir.includes('/home/solv')\n ? EPOCH_TIMER_FILE_PATH\n : `./currentEpoch.json`\n if (await existsAsync(epochFilePath)) {\n return JSON.parse(await readFile(epochFilePath, 'utf-8')) as EpochData\n }\n const initialData: EpochData = {\n epoch: 0,\n isLessThan1Hour: false,\n isLessThan8Hours: false,\n isLessThan1Day: false,\n }\n await writeFile(epochFilePath, JSON.stringify(initialData, null, 2), 'utf-8')\n console.log(chalk.white('✔️ Initial epoch data has been created!'))\n return initialData\n}\n\nexport default initOrReadEpochFile\n","import getBalance, { KeyType } from '@/lib/solana/getBalance'\nimport { MINIMUM_VALIDATOR_BALANCE, getAllKeyPaths } from '@/config/config'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport { sendDiscord } from '@/lib/sendDiscord'\nimport chalk from 'chalk'\nimport { SOLANA_TESTNET_RPC_URL } from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\n\nconst checkBalance = async (config: DefaultConfigType) => {\n let rpcUrl = config.RPC_URL\n const isTestnet = config.NETWORK === Network.TESTNET\n if (isTestnet) {\n rpcUrl = SOLANA_TESTNET_RPC_URL\n }\n const balance = await getBalance(rpcUrl, KeyType.VALIDATOR, isTestnet)\n if (balance < MINIMUM_VALIDATOR_BALANCE) {\n const { mainnetValidatorKey, testnetValidatorKey } = getAllKeyPaths()\n const address = isTestnet\n ? getSolanaAddress(testnetValidatorKey)\n : getSolanaAddress(mainnetValidatorKey)\n const msg = `⚠️ Validator Account Balance is less than ${MINIMUM_VALIDATOR_BALANCE} SOL\\nPlease top up your Validator Account\\nAddress: ${address}`\n await sendDiscord(msg)\n return false\n }\n console.log(chalk.green('✔️ Validator Account Balance is sufficient'))\n return true\n}\nexport default checkBalance\n","async function getNpmLatestVersion(packageName = '@gabrielhicks/solv') {\n try {\n const url = `https://registry.npmjs.org/${packageName}`\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n const data = (await response.json()) as Record<string, any>\n const latestVersion = data['dist-tags'].latest\n return latestVersion as string\n } catch (error) {\n console.error(\n `Error fetching latest version for package ${packageName}:`,\n error,\n )\n return null\n }\n}\n\nexport default getNpmLatestVersion\n","import getNpmLatestVersion from './getNpmLatestVersion'\nimport getSolvVersion from './getSolvVersion'\n\nasync function isVersionSame() {\n const solvVersion = getSolvVersion()\n const latestVersion = await getNpmLatestVersion()\n if (!latestVersion) {\n throw new Error('Failed to get NPM API')\n }\n console.log('currentVersion:', solvVersion)\n console.log('latestVersion:', latestVersion)\n return solvVersion === latestVersion\n}\n\nexport default isVersionSame\n","import { spawnSync } from 'node:child_process'\n\nexport type EpochInfoCLIType = {\n epoch: number\n day: number\n hour: number\n min: number\n sec: number\n totalMinutes: number\n epochRemainingTime: string\n epochCompletedPercent: string\n}\n\nexport const getEpochInfoByRust = (rpcUrl: string) => {\n try {\n const cmd = `solana epoch-info --url '${rpcUrl}'`\n const { stdout } = spawnSync(cmd, { shell: true, stdio: 'pipe' })\n const epochInfo = stdout.toString()\n\n // 'Epoch Completed Time:' 行を探す\n const splitedLine = epochInfo.split('\\n')\n const epochCompletedTime = splitedLine.find((line) =>\n line.includes('Epoch Completed Time:'),\n )\n const epochCompletedPercent = splitedLine\n .find((line) => line.includes('Epoch Completed Percent:'))\n ?.replace('Epoch Completed Percent:', '')\n const epoch = Number(\n splitedLine\n .find((line) => line.includes('Epoch:'))\n ?.replace('Epoch:', ''),\n )\n\n if (!epochCompletedTime || !epochCompletedPercent || !epoch) {\n throw new Error('Epoch Completed Time not found')\n }\n\n // 'remaining' の時間部分を抽出\n const splitedEpochCompletedTime = epochCompletedTime.split('(')\n const remainingTime = splitedEpochCompletedTime[1].replace(\n ' remaining)',\n '',\n )\n console.log('remainingTime:', remainingTime)\n\n // 正規表現で day, hour, min, sec を抽出\n const timeRegex =\n /(?:(\\d+)day\\s*)?(?:(\\d+)h\\s*)?(?:(\\d+)m\\s*)?(?:(\\d+)s\\s*)?/\n\n const match = remainingTime.match(timeRegex)\n if (match) {\n const day = match[1] ? parseInt(match[1]) : 0\n const hour = match[2] ? parseInt(match[2]) : 0\n const min = match[3] ? parseInt(match[3]) : 0\n const sec = match[4] ? parseInt(match[4]) : 0\n\n // 分に変換\n const totalMinutes =\n day * 24 * 60 + hour * 60 + min + Math.floor(sec / 60)\n\n const res: EpochInfoCLIType = {\n epoch,\n day,\n hour,\n min,\n sec,\n totalMinutes,\n epochRemainingTime: remainingTime,\n epochCompletedPercent,\n }\n return res\n } else {\n throw new Error('Time information could not be parsed')\n }\n } catch (error) {\n throw new Error(`getEpochInfoByRust failed: ${error}`)\n }\n}\n","import { program } from '@/index'\nimport epochTimer from './epochTimer'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const epochTimerCommands = (config: DefaultConfigType) => {\n program\n .command('epochTimer')\n .description('Check Solana Epoch Timer')\n .action(async () => {\n await epochTimer(config)\n process.exit(0)\n })\n}\n","import { Command } from 'commander'\nimport inquirer from 'inquirer'\nimport { changeIdentityIncoming } from './changeIdentityIncoming'\nimport { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport {\n MAINNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n} from '@/config/constants'\nimport { changeIdentityOutgoing } from './changeIdentityOutgoing'\nimport { checkSSHConnection } from '../scp/checkSSHConnection'\nimport chalk from 'chalk'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport { changeIdentityIncomingV1toV2 } from './changeIdentityIncomingV1toV2'\n\ntype SwitchType = 'Incoming' | 'Outgoing' | ''\nconst SWITCH_TYPES: SwitchType[] = ['Incoming', 'Outgoing']\n\ntype SwitchOptions = {\n switchType: SwitchType\n ip: string\n v2MigrateIncoming: boolean\n user: string\n unsafe: boolean\n}\n\nexport const switchCommand = async (\n program: Command,\n config: DefaultConfigType,\n) => {\n program\n .command('switch')\n .option('--ip <ip>', 'IP Address of the New Validator', '')\n .option('--switchType <switchType>', 'Switch Type', '')\n .option('--v2-migrate-incoming', 'Switch V1 to V2 Incoming', false)\n .option('--user <user>', 'SSH User', 'solv')\n\n .option('--unsafe', 'Switch without waiting for a restart window', false)\n .description('Switch Validator Identity with No Downtime')\n .action(async (options: SwitchOptions) => {\n try {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n const isSafe = options.unsafe === false;\n let keyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n\n if (isRPC) {\n keyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n let user = options.user\n const pubkey = getSolanaAddress(keyPath)\n let switchType = options.switchType\n let ip = options.ip\n if (switchType === '' || ip === '' || user === '') {\n const answer = await inquirer.prompt<{\n switchType: SwitchType\n ip: string\n user: string\n }>([\n {\n name: 'switchType',\n type: 'list',\n message: 'Which switch type do you want to perform?',\n choices: ['Incoming', 'Outgoing'],\n },\n {\n name: 'ip',\n type: 'input',\n message: 'What is the IP address of the new validator?',\n default() {\n return '1.1.1.1'\n },\n },\n {\n name: 'user',\n type: 'list',\n message: 'Which user would you want to SSH as?',\n choices: ['solv'],\n },\n ])\n switchType = answer.switchType\n ip = answer.ip\n user = answer.user\n }\n if (!SWITCH_TYPES.includes(switchType)) {\n console.log(\n chalk.yellow(\n '⚠️ Invalid Switch Type\\nYou can choose only Incoming or Outgoing',\n ),\n )\n return\n }\n\n const result = checkSSHConnection(ip, user)\n if (!result) {\n console.log('SSH Connection Failed')\n return\n }\n if (switchType === 'Incoming') {\n if (options.v2MigrateIncoming) {\n const confirm = await inquirer.prompt<{ confirm: boolean }>([\n {\n name: 'confirm',\n type: 'confirm',\n message:\n 'Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1.',\n },\n ])\n if (!confirm.confirm) {\n console.log(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.log(chalk.white('🟢 Migrating V1 to V2 Incoming...'))\n await changeIdentityIncomingV1toV2(ip, pubkey, config, user, isSafe)\n return\n }\n await changeIdentityIncoming(ip, pubkey, config, user, isSafe)\n } else {\n await changeIdentityOutgoing(ip, pubkey, config, user, isSafe)\n }\n process.exit(0)\n } catch (error: any) {\n if (error.message.includes('User force closed the prompt')) {\n console.error(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.error(chalk.red(`Switch Error: ${error.message}`))\n process.exit(0)\n }\n })\n}\n","import {\n IDENTITY_KEY,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n SOLV_HOME,\n TESTNET_VALIDATOR_KEY_PATH,\n UNSTAKED_KEY,\n} from '@/config/constants'\nimport { join } from 'path'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport checkValidatorKey from './checkValidatorKey'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport getSolanaCLIActive from '@/config/getSolanaCLIActive'\nimport getSolanaCLIAgave from '@/config/getSolanaCLIAgave'\nimport { getRemoteClientType } from './getRemoteClientType'\nimport { getLocalClientType } from './getLocalClientType'\n\nconst unstakedKeyPath = join(SOLV_HOME, UNSTAKED_KEY)\nconst identityKeyPath = join(SOLV_HOME, IDENTITY_KEY)\n\nexport const changeIdentityIncoming = async (\n ip: string,\n pubkey: string,\n config: DefaultConfigType,\n user: string,\n safe = true,\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n let validatorKeyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n if (isRPC) {\n validatorKeyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n // Auto-detect both local and remote client types\n const localClientResult = await getLocalClientType()\n const remoteClientResult = await getRemoteClientType(ip, user)\n \n const localClient = localClientResult.success ? localClientResult.client : 'agave'\n const remoteClient = remoteClientResult.success ? remoteClientResult.client : 'agave'\n \n console.log(chalk.green(`✅ Local client: ${localClient}, Remote client: ${remoteClient}`))\n\n const [localSolanaClient, localSolanaClientConfig] = getSolanaCLIActive(localClient)\n const [remoteSolanaClient, remoteSolanaClientConfig] = getSolanaCLIActive(remoteClient)\n const agaveSolanaClient = getSolanaCLIAgave()\n\n const isKeyOkay = checkValidatorKey(validatorKeyPath, ip, user)\n if (!isKeyOkay) {\n return\n }\n \n if (safe) {\n console.log(chalk.white('🟢 Waiting for restart window...'))\n const restartWindowCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${agaveSolanaClient} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`\n const result1 = spawnSync(restartWindowCmd, { shell: true, stdio: 'inherit' })\n if (result1.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ wait-for-restart-window Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${agaveSolanaClient} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,\n ),\n )\n return\n }\n }\n\n // Set the identity on the unstaked key (remote)\n console.log(chalk.white('🟢 Setting identity on the remote validator...'))\n const setIdentityCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${remoteSolanaClient} set-identity ${remoteSolanaClientConfig}${unstakedKeyPath}'`\n const result2 = spawnSync(setIdentityCmd, { shell: true, stdio: 'inherit' })\n if (result2.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${remoteSolanaClient} set-identity ${remoteSolanaClientConfig}${unstakedKeyPath}`,\n ),\n )\n return\n }\n\n // Change the Symlink to the unstaked keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const result3 = spawnSync(\n `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ln -sf ${unstakedKeyPath} ${identityKeyPath}'`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n if (result3.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ln -sf ${unstakedKeyPath} ${identityKeyPath}`,\n ),\n )\n return\n }\n\n // Download the tower file to the new validator\n console.log(\n chalk.white('🟢 Uploading the tower file to the new validator...'),\n )\n const result4 = spawnSync(\n `scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n { shell: true, stdio: 'inherit' },\n )\n if (result4.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Upload Tower File Failed. Please check your tower file\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n ),\n )\n return\n }\n\n // Set the identity on the local validator\n console.log(chalk.white('🟢 Setting identity on the local validator...'))\n const result5 = spawnSync(\n `${localSolanaClient} set-identity ${localSolanaClientConfig}--require-tower ${validatorKeyPath}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n if (result5.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n\\nFailed Cmd: ${localSolanaClient} set-identity ${localSolanaClientConfig}${validatorKeyPath}\\nln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n const result6 = spawnSync(`ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`, {\n shell: true,\n stdio: 'inherit',\n })\n\n if (result6.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n console.log(chalk.white('🟢 Identity changed successfully!'))\n await updateDefaultConfig({\n IS_DUMMY: false,\n })\n}\n","import { CommonSpawnOptions, spawnSync } from 'node:child_process'\n\nexport type ScpSSHResult = {\n status: number | null\n stdout: string\n stderr: string\n}\n\nconst scpSSH = (\n ip: string,\n cmd: string,\n user: string,\n stdio = 'pipe' as CommonSpawnOptions['stdio'],\n sshKeyPath = '~/.ssh/id_rsa',\n) => {\n let scpSSHResult: ScpSSHResult\n try {\n const result = spawnSync(\n `ssh -i ${sshKeyPath} -o StrictHostKeyChecking=no solv@${ip} -p 22 'cd ~ && source ~/.profile && ${cmd}'`,\n { shell: true, stdio },\n )\n if (result.status !== 0) {\n console.log(\n `⚠️ CMD Failed. Please check your SSH connection.\\n$ ssh solv@${ip}\\n\\nFailed Cmd: ${cmd}`,\n )\n scpSSHResult = {\n status: result.status,\n stdout: String(result.stdout),\n stderr: result.stderr.toString(),\n }\n return scpSSHResult\n }\n scpSSHResult = {\n status: result.status,\n stdout: result.stdout.toString(),\n stderr: result.stderr.toString(),\n }\n return scpSSHResult\n } catch (error) {\n console.log(`scpSSH Error: ${error}`)\n scpSSHResult = {\n status: null,\n stdout: '',\n stderr: String(error),\n }\n return scpSSHResult\n }\n}\n\nexport default scpSSH\n","import { getSolanaAddress } from '@/lib/getSolanaAddress'\nimport scpSSH from '@/lib/scpSSH'\nimport chalk from 'chalk'\n\nconst checkValidatorKey = (\n validatorKeyPath: string,\n ip: string,\n user: string,\n) => {\n console.log(\n chalk.white('🔍 Checking If Destination Validator Key is the same...'),\n )\n const localValidatorIdentityAddress =\n getSolanaAddress(validatorKeyPath).trim()\n const destinationValidatorIdentityAddress = scpSSH(\n ip,\n `solana-keygen pubkey ${validatorKeyPath}`,\n user,\n )\n .stdout.toString()\n .trim()\n\n if (localValidatorIdentityAddress !== destinationValidatorIdentityAddress) {\n console.log(\n chalk.yellow(\n `⚠️ Destination Identity Key is different. \nPlease check your Validator\n$ ssh ${user}@${ip}\n\nLocal Identity Key: ${localValidatorIdentityAddress}\nDestination Identity Key: ${destinationValidatorIdentityAddress}`,\n ),\n )\n return false\n }\n return true\n}\n\nexport default checkValidatorKey\n","const AGAVE_CLI = 'agave-validator -l /mnt/ledger'\nconst FD_CLI = 'sudo fdctl'\nconst FC_CLI_CONFIG = '--config /home/solv/firedancer/config.toml '\n\nconst getSolanaCLIActive = (client: string) => {\n if(client === \"agave\") {\n return [AGAVE_CLI, '']\n } else {\n return [FD_CLI, FC_CLI_CONFIG]\n }\n}\nexport default getSolanaCLIActive\n","const AGAVE_CLI = 'agave-validator -l /mnt/ledger'\n\nconst getSolanaCLIAgave = () => {\n try {\n return AGAVE_CLI\n } catch (error) {\n console.error(error)\n return AGAVE_CLI\n }\n}\nexport default getSolanaCLIAgave\n","import scpSSH from '@/lib/scpSSH'\nimport { ValidatorType } from '@/config/enums'\nimport chalk from 'chalk'\n\nexport type RemoteConfigResult = {\n client: string\n validatorType: ValidatorType\n success: boolean\n error?: string\n}\n\nexport const getRemoteClientType = async (\n ip: string,\n user: string\n): Promise<RemoteConfigResult> => {\n try {\n console.log(chalk.white('🔍 Detecting client type from remote configuration...'))\n \n // Read the remote solv config file\n const configResult = scpSSH(\n ip,\n 'cat /home/solv/solv4.config.json',\n user,\n 'pipe'\n )\n\n if (configResult.status !== 0) {\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: 'Could not read remote configuration file'\n }\n }\n\n // Parse the config\n const remoteConfig = JSON.parse(configResult.stdout)\n const validatorType = remoteConfig.VALIDATOR_TYPE\n\n // Map validator type to client string\n let client: string\n switch (validatorType) {\n case ValidatorType.AGAVE:\n client = 'agave'\n break\n case ValidatorType.FRANKENDANCER:\n client = 'frankendancer'\n break\n case ValidatorType.JITO:\n client = 'agave' // Jito uses agave client\n break\n default:\n client = 'agave' // Default fallback\n }\n\n console.log(chalk.green(`✅ Detected remote client type: ${client} (${validatorType})`))\n \n return {\n client,\n validatorType,\n success: true\n }\n } catch (error) {\n console.log(chalk.yellow(`⚠️ Could not auto-detect client type: ${error}`))\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: String(error)\n }\n }\n} ","import { readFile } from 'fs/promises'\nimport { ValidatorType } from '@/config/enums'\nimport chalk from 'chalk'\nimport { existsSync } from 'fs'\n\nexport type LocalConfigResult = {\n client: string\n validatorType: ValidatorType\n success: boolean\n error?: string\n}\n\nexport const getLocalClientType = async (): Promise<LocalConfigResult> => {\n try {\n console.log(chalk.white('🔍 Detecting local client type from configuration...'))\n \n const configPath = '/home/solv/solv4.config.json'\n \n if (!existsSync(configPath)) {\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: 'Local configuration file not found'\n }\n }\n\n // Read the local solv config file\n const configContent = await readFile(configPath, 'utf-8')\n const localConfig = JSON.parse(configContent)\n const validatorType = localConfig.VALIDATOR_TYPE\n\n // Map validator type to client string\n let client: string\n switch (validatorType) {\n case ValidatorType.AGAVE:\n client = 'agave'\n break\n case ValidatorType.FRANKENDANCER:\n client = 'frankendancer'\n break\n case ValidatorType.JITO:\n client = 'agave' // Jito uses agave client\n break\n default:\n client = 'agave' // Default fallback\n }\n\n console.log(chalk.green(`✅ Detected local client type: ${client} (${validatorType})`))\n \n return {\n client,\n validatorType,\n success: true\n }\n } catch (error) {\n console.log(chalk.yellow(`⚠️ Could not auto-detect local client type: ${error}`))\n return {\n client: 'agave',\n validatorType: ValidatorType.AGAVE,\n success: false,\n error: String(error)\n }\n }\n} ","import {\n IDENTITY_KEY,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n SOLV_HOME,\n TESTNET_VALIDATOR_KEY_PATH,\n UNSTAKED_KEY,\n} from '@/config/constants'\nimport { join } from 'path'\nimport chalk from 'chalk'\nimport { spawnSync } from 'node:child_process'\nimport checkValidatorKey from './checkValidatorKey'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\nimport getSolanaCLIActive from '@/config/getSolanaCLIActive'\nimport getSolanaCLIAgave from '@/config/getSolanaCLIAgave'\nimport { getRemoteClientType } from './getRemoteClientType'\nimport { getLocalClientType } from './getLocalClientType'\n\nconst unstakedKeyPath = join(SOLV_HOME, UNSTAKED_KEY)\nconst identityKeyPath = join(SOLV_HOME, IDENTITY_KEY)\nconst sshKeyPath = '~/.ssh/id_rsa'\n\nexport const changeIdentityOutgoing = async (\n ip: string,\n pubkey: string,\n config: DefaultConfigType,\n user: string,\n safe = true,\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n let validatorKeyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n if (isRPC) {\n validatorKeyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n // Auto-detect both local and remote client types\n const localClientResult = await getLocalClientType()\n const remoteClientResult = await getRemoteClientType(ip, user)\n \n const localClient = localClientResult.success ? localClientResult.client : 'agave'\n const remoteClient = remoteClientResult.success ? remoteClientResult.client : 'agave'\n \n console.log(chalk.green(`✅ Local client: ${localClient}, Remote client: ${remoteClient}`))\n\n const [localSolanaClient, localSolanaClientConfig] = getSolanaCLIActive(localClient)\n const [remoteSolanaClient, remoteSolanaClientConfig] = getSolanaCLIActive(remoteClient)\n const agaveSolanaClient = getSolanaCLIAgave()\n\n const isKeyOkay = checkValidatorKey(validatorKeyPath, ip, user)\n if (!isKeyOkay) {\n return\n }\n\n // Commands to run on the source validator (local) - SpawnSync\n const step1 = `${agaveSolanaClient} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`\n const step2 = `${localSolanaClient} set-identity ${localSolanaClientConfig}${unstakedKeyPath}`\n const step3 = `ln -sf ${unstakedKeyPath} ${identityKeyPath}`\n const step4 = `scp ${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${user}@${ip}:${LEDGER_PATH}`\n\n // Commands to run on the destination validator (remote) - scpSSH\n const step5 = `${remoteSolanaClient} set-identity ${remoteSolanaClientConfig}--require-tower ${validatorKeyPath}`\n const step6 = `ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`\n\n if (safe) {\n console.log(chalk.white('🟢 Waiting for restart window...'))\n const result1 = spawnSync(step1, { shell: true, stdio: 'inherit' })\n if (result1.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ wait-for-restart-window Failed. Please check your Validator\\n\\nFailed Cmd: ${step1}`,\n ),\n )\n return\n }\n }\n\n // Set the identity to the unstaked key\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const result2 = spawnSync(step2, { shell: true, stdio: 'inherit' })\n if (result2.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ set-identity Failed. Please check your Validator\\n\\nFailed Cmd: ${step2}`,\n ),\n )\n return\n }\n\n // Change the Symlink to the unstaked keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const result3 = spawnSync(step3, { shell: true, stdio: 'inherit' })\n if (result3.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ${step3}`,\n ),\n )\n return\n }\n\n // Upload the tower file to the new validator\n console.log(\n chalk.white('🟢 Uploading the tower file to the new validator...'),\n )\n const result4 = spawnSync(step4, { shell: true, stdio: 'inherit' })\n if (result4.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Upload Tower File Failed. Please check your Validator\\n\\nFailed Cmd: ${step4}`,\n ),\n )\n return\n }\n\n // Set the identity on the identity key\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const cmd5 = `ssh -i ${sshKeyPath} -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${step5}'`\n const result5 = spawnSync(cmd5, { shell: true, stdio: 'inherit' })\n if (result5.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ set-identity Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${step5}`,\n ),\n )\n //return\n }\n\n // Change the Symlink to the identity keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const cmd6 = `ssh -i ${sshKeyPath} -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${step6}'`\n const result6 = spawnSync(cmd6, { shell: true, stdio: 'inherit' })\n if (result6.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ${step6}`,\n ),\n )\n return\n }\n console.log(chalk.white('🟢 Identity changed successfully!'))\n await updateDefaultConfig({\n IS_DUMMY: true,\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport function checkSSHConnection(ip: string, user: string) {\n const cmd = `ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${ip} exit`\n const result = spawnSync(cmd, { shell: true, stdio: 'inherit' })\n\n return result.status === 0\n}\n","import {\n AGAVE_VALIDATOR,\n IDENTITY_KEY,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n MAINNET_VALIDATOR_KEY_PATH,\n SOLANA_VALIDATOR,\n SOLV_HOME,\n TESTNET_VALIDATOR_KEY_PATH,\n UNSTAKED_KEY,\n} from '@/config/constants'\nimport { join } from 'path'\nimport { spawnSync } from 'node:child_process'\nimport chalk from 'chalk'\nimport checkValidatorKey from './checkValidatorKey'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport { DefaultConfigType } from '@/config/types'\nimport { Network, NodeType } from '@/config/enums'\n\nconst unstakedKeyPath = join(SOLV_HOME, UNSTAKED_KEY)\nconst identityKeyPath = join(SOLV_HOME, IDENTITY_KEY)\n\nexport const changeIdentityIncomingV1toV2 = async (\n ip: string,\n pubkey: string,\n config: DefaultConfigType,\n user: string,\n safe = true\n) => {\n const isTestnet = config.NETWORK === Network.TESTNET\n const isRPC = config.NODE_TYPE === NodeType.RPC\n let validatorKeyPath = isTestnet\n ? TESTNET_VALIDATOR_KEY_PATH\n : MAINNET_VALIDATOR_KEY_PATH\n if (isRPC) {\n validatorKeyPath = TESTNET_VALIDATOR_KEY_PATH\n }\n\n const isKeyOkay = checkValidatorKey(validatorKeyPath, ip, user)\n if (!isKeyOkay) {\n return\n }\n\n // old version of solana client\n const solanaClient = SOLANA_VALIDATOR\n // new version of solana client\n const agaveClient = AGAVE_VALIDATOR\n\n if (safe) {\n console.log(chalk.white('🟢 Waiting for restart window...'))\n const restartWindowCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${solanaClient} -l ${LEDGER_PATH} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`\n const result1 = spawnSync(restartWindowCmd, { shell: true, stdio: 'inherit' })\n if (result1.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ wait-for-restart-window Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${solanaClient} -l ${LEDGER_PATH} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,\n ),\n )\n return\n }\n } \n\n // Set the identity on the unstaked key\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const setIdentityCmd = `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ${solanaClient} -l ${LEDGER_PATH} set-identity ${unstakedKeyPath}'`\n const result2 = spawnSync(setIdentityCmd, { shell: true, stdio: 'inherit' })\n if (result2.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ${solanaClient} -l ${LEDGER_PATH} set-identity ${unstakedKeyPath}`,\n ),\n )\n return\n }\n\n // Change the Symlink to the unstaked keypair\n console.log(\n chalk.white('🟢 Changing the Symlink to the new validator keypair...'),\n )\n const result3 = spawnSync(\n `ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${user}@${ip} -p 22 'cd ~ && source ~/.profile && ln -sf ${unstakedKeyPath} ${identityKeyPath}'`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n\n if (result3.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: ln -sf ${unstakedKeyPath} ${identityKeyPath}`,\n ),\n )\n return\n }\n\n // Download the tower file to the new validator\n console.log(\n chalk.white('🟢 Uploading the tower file to the new validator...'),\n )\n const result4 = spawnSync(\n `scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n { shell: true, stdio: 'inherit' },\n )\n if (result4.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Upload Tower File Failed. Please check your tower file\\n$ ssh ${user}@${ip}\\n\\nFailed Cmd: scp ${user}@${ip}:${LEDGER_PATH}/tower-1_9-${pubkey}.bin ${LEDGER_PATH}`,\n ),\n )\n return\n }\n\n // Set the identity on the new validator\n console.log(chalk.white('🟢 Setting identity on the new validator...'))\n const result5 = spawnSync(\n `${agaveClient} -l ${LEDGER_PATH} set-identity --require-tower ${validatorKeyPath}`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n if (result5.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Set Identity Failed. Please check your Validator\\n\\nFailed Cmd: ${agaveClient} -l ${LEDGER_PATH} set-identity ${validatorKeyPath}\\nln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n const result6 = spawnSync(`ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`, {\n shell: true,\n stdio: 'inherit',\n })\n\n if (result6.status !== 0) {\n console.log(\n chalk.yellow(\n `⚠️ Chaning Identity Key Symlink Failed. Please check your Validator\\n\\nFailed Cmd: ln -sf ${validatorKeyPath} ${IDENTITY_KEY_PATH}`,\n ),\n )\n return\n }\n\n console.log(chalk.white('🟢 Identity changed successfully!'))\n await updateDefaultConfig({\n IS_DUMMY: false,\n })\n}\n","import { LEDGER_PATH, SNAPSHOTS_PATH } from '@/config/constants'\nimport { spawnSync } from 'node:child_process'\n\nconst createSnapshot = (slot = '306450862', ledgerPath = LEDGER_PATH, snapshotPath = SNAPSHOTS_PATH) => {\n try {\n const cmd = `agave-ledger-tool --ledger ${ledgerPath} create-snapshot \\\n--incremental \\\n--snapshot-archive-path ${snapshotPath} \\\n--hard-fork ${slot} \\\n-- ${slot} ${ledgerPath}`\n console.log('Parameters to createSnapshot:', slot, ledgerPath, snapshotPath)\n console.log('Command:', cmd)\n const result = spawnSync(cmd, {\n shell: true,\n stdio: 'pipe',\n cwd: ledgerPath,\n })\n if (result.status !== 0) {\n throw new Error(`createSnapshot: ${result.error}`)\n }\n } catch (error) {\n throw new Error(`createSnapshot: ${error}`)\n }\n}\nexport default createSnapshot\n","import inquirer from 'inquirer'\nimport dotenv from 'dotenv'\nimport {\n JUPITER_ENDPOINT,\n SOL_TOKEN_MINT,\n SOLV_SWAP,\n SWAP_TOKENS,\n USDC_TOKEN_MINT,\n} from '@/config/constants'\nimport chalk from 'chalk'\nimport { TokenInfo } from '@/config/tokenInfo'\nimport { swap } from './swap'\nimport { Command } from 'commander'\nimport { ELSOL_MINT_ADDRESS } from '@/config/config'\nimport { DefaultConfigType } from '@/config/types'\nimport { updateDefaultConfig } from '@/config/updateDefaultConfig'\nimport rpcLog from '@/utils/rpcLog'\ndotenv.config()\n\nexport const swapCommand = async (\n program: Command,\n config: DefaultConfigType,\n) => {\n program\n .command('swap')\n .description('Swap tokens')\n .option('-i, --input <input>', 'Input token mint', '')\n .option('-o, --output <output>', 'Output token mint', '')\n .option('-a, --amount <amount>', 'Input amount in lamports', '0')\n .option('-s, --skip-confirm', 'Skip confirmation', false)\n .option('-c, --init-config', 'Initialize config', false)\n .action(\n async (options: {\n input: string\n output: string\n amount: number\n skipConfirm: boolean\n initConfig: boolean\n }) => {\n try {\n await swapCmd(\n config.RPC_URL,\n config.KEYPAIR_PATH,\n config.API_KEY,\n options.input,\n options.output,\n Number(options.amount),\n !options.skipConfirm,\n options.initConfig,\n )\n } catch (error: any) {\n if (error.message.includes('User force closed the prompt')) {\n console.error(chalk.cyan(`Exiting...🌛`))\n process.exit(0)\n }\n console.error(chalk.red(`Swap Error: ${error.message}`))\n process.exit(0)\n }\n },\n )\n}\n\nconst swapCmd = async (\n solanaRpcUrl: string,\n keyfilePath: string,\n jupiterApiKey: string,\n inputMint = '',\n outputMint = '',\n inputAmountLamport = 0,\n isNeedConfirm = true,\n initConfig = false,\n) => {\n console.log(chalk.white('Solana RPC URL:', solanaRpcUrl))\n console.log(chalk.white('KeyfilePath:', keyfilePath))\n if (!keyfilePath || keyfilePath === '' || initConfig) {\n await askForConfig()\n }\n const jupiterEndpoint = JUPITER_ENDPOINT\n let inputTokenChoice = [...SWAP_TOKENS, 'Other']\n let inputTokenAdress = inputMint\n let inputTokenSymbol = '' as keyof typeof TokenInfo\n let outputTokenAdress = outputMint\n let inputAmount = inputAmountLamport\n // If inputTokenAdress is not provided, prompt user to select input mint\n if (inputTokenAdress === '') {\n const inputToken = await inquirer.prompt([\n {\n type: 'list',\n name: 'name',\n message: 'Select input mint',\n choices: inputTokenChoice,\n default: SOL_TOKEN_MINT,\n },\n ])\n if (inputToken.name === 'Other') {\n const inputTokenAddress = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Enter input mint address',\n default: USDC_TOKEN_MINT,\n },\n ])\n inputTokenAdress = inputTokenAddress.address\n } else {\n inputTokenSymbol = inputToken.name\n inputTokenAdress = TokenInfo[inputTokenSymbol].tokenMint\n }\n }\n\n // If outputTokenAdress is not provided, prompt user to select output mint\n if (outputTokenAdress === '') {\n inputTokenChoice = inputTokenChoice.filter(\n (item) => item !== inputTokenSymbol,\n )\n const outputToken = await inquirer.prompt([\n {\n type: 'list',\n name: 'name',\n message: 'Select output mint',\n choices: inputTokenChoice,\n },\n ])\n\n if (outputToken.name === 'Other') {\n const outputTokenAddress = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Enter output mint address',\n default: ELSOL_MINT_ADDRESS,\n },\n ])\n outputTokenAdress = outputTokenAddress.address\n } else {\n const tokenName = outputToken.name as keyof typeof TokenInfo\n outputTokenAdress = TokenInfo[tokenName].tokenMint\n }\n const tokenName = outputToken.name as keyof typeof TokenInfo\n outputTokenAdress = TokenInfo[tokenName].tokenMint\n }\n\n // If inputAmount is not provided, prompt user to enter input amount\n if (inputAmount === 0) {\n const inputAmountPrompt = await inquirer.prompt([\n {\n type: 'input',\n name: 'amount',\n message: 'Enter input amount in LAMPORTS. e.g. 0.01 SOL',\n default: '10000000',\n },\n ])\n inputAmount = Number(inputAmountPrompt.amount)\n }\n\n const apiKey =\n !jupiterApiKey || jupiterApiKey === '' ? SOLV_SWAP : jupiterApiKey\n const txid = await swap(\n solanaRpcUrl,\n jupiterEndpoint,\n apiKey,\n keyfilePath,\n inputTokenAdress,\n outputTokenAdress,\n inputAmount,\n isNeedConfirm,\n )\n if (!txid) {\n process.exit(0)\n }\n console.log(chalk.green('✔︎ Sent Tx Successfully!'))\n console.log(chalk.white(`Check Your TX 👉: https://solscan.io/tx/${txid}`))\n}\n\nexport default swapCmd\n\nexport type SwapConfig = {\n RPC_URL: string\n KEYPAIR_PATH: string\n API_KEY: string\n}\n\nconst askForConfig = async () => {\n const config = await inquirer.prompt<SwapConfig>([\n {\n type: 'input',\n name: 'RPC_URL',\n message: 'Enter Solana RPC URL',\n default: 'https://api.mainnet-beta.solana.com',\n },\n {\n type: 'input',\n name: 'KEYPAIR_PATH',\n message: 'Enter Keypair Path',\n default: '/home/solv/mainnet-validator-keypair.json',\n },\n {\n type: 'input',\n name: 'API_KEY',\n message: 'Enter Jupiter API Key(Optional)',\n default: '',\n },\n ])\n await updateDefaultConfig(config)\n console.log(chalk.green('✔︎ Config Updated Successfully!\\n'))\n rpcLog()\n}\n","import { ELSOL_TOKEN_MINT, SOL_TOKEN_MINT, USDC_TOKEN_MINT } from './constants'\n\nexport const TokenInfo = {\n SOL: {\n tokenMint: 'So11111111111111111111111111111111111111112',\n associationAccount: '4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra',\n decimal: 9,\n },\n USDC: {\n tokenMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n associationAccount: 'J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj',\n decimal: 6,\n },\n elSOL: {\n tokenMint: ELSOL_TOKEN_MINT,\n associationAccount: '',\n decimal: 9,\n },\n JitoSOL: {\n tokenMint: 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn',\n associationAccount: 'HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a',\n decimal: 9,\n },\n mSOL: {\n tokenMint: 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So',\n associationAccount: '8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9',\n decimal: 9,\n },\n bSOL: {\n tokenMint: 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1',\n associationAccount: '782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH',\n decimal: 9,\n },\n EPCT: {\n tokenMint: 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP',\n associationAccount: 'BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB',\n decimal: 6,\n },\n JUP: {\n tokenMint: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN',\n associationAccount: '212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg',\n decimal: 6,\n },\n BONK: {\n tokenMint: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263',\n associationAccount: '61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U',\n decimal: 5,\n },\n JTO: {\n tokenMint: 'jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL',\n associationAccount: '2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo',\n decimal: 9,\n },\n}\n\nexport const TokenInfoByMint = {\n So11111111111111111111111111111111111111112: {\n symbol: 'SOL',\n tokenMint: SOL_TOKEN_MINT,\n associationAccount: '4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra',\n decimal: 9,\n },\n EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: {\n symbol: 'USDC',\n tokenMint: USDC_TOKEN_MINT,\n associationAccount: 'J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj',\n decimal: 6,\n },\n ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC: {\n symbol: 'elSOL',\n tokenMint: ELSOL_TOKEN_MINT,\n associationAccount: '',\n decimal: 9,\n },\n J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn: {\n symbol: 'jitoSOL',\n tokenMint: 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn',\n associationAccount: 'HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a',\n decimal: 9,\n },\n mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So: {\n symbol: 'mSOL',\n tokenMint: 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So',\n associationAccount: '8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9',\n decimal: 9,\n },\n bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1: {\n symbol: 'bSOL',\n tokenMint: 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1',\n associationAccount: '782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH',\n decimal: 9,\n },\n CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP: {\n symbol: 'EPCT',\n tokenMint: 'CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP',\n associationAccount: 'BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB',\n decimal: 6,\n },\n JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN: {\n symbol: 'JUP',\n tokenMint: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN',\n associationAccount: '212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg',\n decimal: 6,\n },\n DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263: {\n symbol: 'BONK',\n tokenMint: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263',\n associationAccount: '61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U',\n decimal: 5,\n },\n jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL: {\n symbol: 'JTO',\n tokenMint: 'jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL',\n associationAccount: '2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo',\n decimal: 9,\n },\n}\n","import { readFile } from 'fs/promises'\nimport { Connection, Keypair, VersionedTransaction } from '@solana/web3.js'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport dotenv from 'dotenv'\nimport { TokenInfoByMint } from '@/config/tokenInfo'\nimport getJupiterQuote from './getJupiterQuote'\nimport postJupiterSwap from './postJupiterSwap'\nimport { WEB_VALIDATORS_SOLUTIONS } from '@/config/constants'\ndotenv.config()\n\nexport const swap = async (\n solanaRpcUrl: string,\n jupiterEndpoint: string,\n JupiterApiKey: string,\n keyfilePath: string,\n inputMint: string,\n outputMint: string,\n inputAmountLamport: number,\n isNeedConfirm: boolean = true,\n) => {\n const connection = new Connection(solanaRpcUrl, 'confirmed')\n const quoteResponse = await getJupiterQuote(\n jupiterEndpoint,\n JupiterApiKey,\n inputMint,\n outputMint,\n inputAmountLamport,\n )\n if (typeof quoteResponse === 'string') {\n if (quoteResponse.includes('Unauthorized')) {\n console.error(\n chalk.yellow('⚠️ Invalid API key, please check your API key ⚠️\\n'),\n )\n console.log(chalk.white('Get Your API key 👇'))\n console.log(chalk.white(WEB_VALIDATORS_SOLUTIONS + '\\n'))\n process.exit(0)\n }\n const msg = `${chalk.yellow('⚠️ Too many requests, please try again later ⚠️')}\n\nYou can upgrade your API key to increase your rate limits.\nGet Your API key 👇\nValidators Solutions: ${WEB_VALIDATORS_SOLUTIONS}\n`\n console.error(chalk.white(msg))\n process.exit(0)\n }\n const inputTokneInfo =\n TokenInfoByMint[inputMint as keyof typeof TokenInfoByMint]\n const outputTokenInfo =\n TokenInfoByMint[outputMint as keyof typeof TokenInfoByMint]\n const log = `🔄 Swap Quote 🔄\n\n- 🏦 Input Token: ${inputTokneInfo.symbol} (${inputMint})\n- 💰 Input Amount: ${inputAmountLamport / Math.pow(10, inputTokneInfo.decimal)} ${inputTokneInfo.symbol}\n\n- 🏦 Output Token: ${outputTokenInfo.symbol} (${outputMint})\n- 💰 Output Amount: ${Number(quoteResponse?.outAmount) / Math.pow(10, outputTokenInfo.decimal)} ${outputTokenInfo.symbol}\n\n※ This quote is based on the current market rate and may change before the swap is completed.\n`\n console.log(chalk.white(log))\n console.log(\n chalk.gray(`You can also swap using the following command: \n$ solv swap --input ${inputMint} --output ${outputMint} --amount ${inputAmountLamport} --skip-confirm\n`),\n )\n let confirm = false\n if (isNeedConfirm) {\n const answer = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Do you want to proceed with the swap?',\n default: false,\n },\n ])\n confirm = answer.confirm\n } else {\n console.log(chalk.cyan('Skipping confirmation...'))\n confirm = true\n }\n if (!confirm) {\n console.log(chalk.yellow('⚠️ Swap cancelled'))\n process.exit(0)\n }\n\n if (!quoteResponse) {\n process.exit(0)\n }\n\n const fromWalletKey = JSON.parse(\n await readFile(keyfilePath, 'utf8'),\n ) as number[]\n const fromWallet = Keypair.fromSecretKey(\n new Uint8Array(Array.from(fromWalletKey)),\n )\n\n const swapResponse = await postJupiterSwap(\n jupiterEndpoint,\n JupiterApiKey,\n quoteResponse,\n fromWallet.publicKey.toString(),\n )\n if (typeof swapResponse === 'string') {\n if (swapResponse.includes('Unauthorized')) {\n console.error(\n chalk.yellow('⚠️ Invalid API key, please check your API key ⚠️\\n'),\n )\n console.log(chalk.white('Get Your API key 👇'))\n console.log(chalk.white(WEB_VALIDATORS_SOLUTIONS + '\\n'))\n process.exit(0)\n }\n const msg = `${chalk.yellow('⚠️ Too many requests, please try again later ⚠️')}\n\nYou can upgrade your API key to increase your rate limits.\nGet Your API key 👇\nValidators Solutions: ${WEB_VALIDATORS_SOLUTIONS}\n`\n console.error(chalk.white(msg))\n process.exit(0)\n }\n\n const swapTransactionBuf = Buffer.from(\n swapResponse.swapTransaction as string,\n 'base64',\n )\n let transaction = VersionedTransaction.deserialize(swapTransactionBuf)\n // Sign transaction\n transaction.sign([fromWallet])\n const rawTransaction = transaction.serialize()\n const txid = await connection.sendRawTransaction(rawTransaction, {\n skipPreflight: true,\n maxRetries: 2,\n })\n const blockhash = transaction.message.recentBlockhash\n console.log(`Swapping...\\nTransaction ID: ${txid}`)\n await connection.confirmTransaction(\n {\n blockhash,\n lastValidBlockHeight: swapResponse.lastValidBlockHeight,\n signature: txid,\n },\n 'confirmed',\n )\n return txid\n}\n","import { QuoteResponse } from '@jup-ag/api'\n\nconst getJupiterQuote = async (\n jupiterEndpoint: string,\n apiKey: string,\n inputMint: string,\n outputMint: string,\n inputAmountLamport: number,\n) => {\n try {\n const url = `${jupiterEndpoint}/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${inputAmountLamport}`\n const result = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n Authorization: `Bearer ${apiKey}`,\n },\n })\n if (result.status === 429) {\n const error = 'Too many requests, please try again later'\n return error\n }\n if (result.status === 401) {\n const error = 'Unauthorized, please check your API key'\n return error\n }\n\n const json = (await result.json()) as QuoteResponse\n return json\n } catch (error) {\n throw new Error(`Error getJupiterQuote: ${error}`)\n }\n}\n\nexport default getJupiterQuote\n","import { AssociationAccount } from '@/config/constants'\nimport { QuoteResponse, SwapPostRequest, SwapResponse } from '@jup-ag/api'\n\nconst postJupiterSwap = async (\n jupiterEndpoint: string,\n jupiterApiKey: string,\n quoteResponse: QuoteResponse,\n fromWalletPubkey: string,\n) => {\n try {\n const outputMint = quoteResponse.outputMint\n let swapBody: SwapPostRequest\n const associationAccount =\n AssociationAccount[outputMint as keyof typeof AssociationAccount]\n\n if (associationAccount) {\n swapBody = {\n swapRequest: {\n quoteResponse,\n userPublicKey: fromWalletPubkey,\n feeAccount: associationAccount,\n dynamicComputeUnitLimit: true,\n prioritizationFeeLamports: 'auto',\n dynamicSlippage: { maxBps: 500 },\n },\n }\n } else {\n swapBody = {\n swapRequest: {\n quoteResponse,\n userPublicKey: fromWalletPubkey,\n dynamicComputeUnitLimit: true,\n prioritizationFeeLamports: 'auto',\n dynamicSlippage: { maxBps: 500 },\n },\n }\n }\n const url = `${jupiterEndpoint}/swap`\n const result = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': jupiterApiKey,\n Authorization: `Bearer ${jupiterApiKey}`,\n },\n body: JSON.stringify(swapBody.swapRequest),\n })\n if (result.status === 429) {\n const error = 'Too many requests, please try again later'\n return error\n }\n const json = (await result.json()) as SwapResponse\n return json\n } catch (error) {\n throw new Error(`Error postJupiterSwap: ${error}`)\n }\n}\n\nexport default postJupiterSwap\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterStatus = () => {\n const cmd = `sudo systemctl status jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterStart = () => {\n const cmd = `sudo systemctl start jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterStop = () => {\n const cmd = `sudo systemctl stop jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterRestart = () => {\n const cmd = `sudo systemctl restart jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterLog = (error = false) => {\n const cmd = error\n ? `journalctl -u jupiter-api.service -xef | grep ERROR`\n : `journalctl -u jupiter-api.service -xef`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const jupiterEnable = () => {\n const cmd = `sudo systemctl enable jupiter-api.service`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { program } from '@/index'\nimport { jupiterStatus } from '@/cli/jupiter/jupiterStatus'\nimport { jupiterStart } from '@/cli/jupiter/jupiterStart'\nimport { jupiterStop } from '@/cli/jupiter/jupiterStop'\nimport { jupiterRestart } from '@/cli/jupiter/jupiterRestart'\nimport { jupiterLog } from '@/cli/jupiter/jupiterLog'\nimport { jupiterEnable } from '@/cli/jupiter/jupiterEnable'\n\nexport const jupiterCommands = () => {\n const jupiter = program.command('jupiter').description('Jupiter API Commands')\n\n jupiter\n .command('status')\n .description('Show Jupiter Status')\n .action(() => {\n jupiterStatus()\n })\n\n jupiter\n .command('start')\n .description('Start Jupiter')\n .action(() => {\n jupiterStart()\n })\n\n jupiter\n .command('stop')\n .description('Stop Jupiter')\n .action(() => {\n jupiterStop()\n })\n\n jupiter\n .command('log')\n .option('-e, --error', 'Show Error Logs', false)\n .description('Show Jupiter Logs')\n .action((options: { error: boolean }) => {\n jupiterLog(options.error)\n process.exit(0)\n })\n\n jupiter\n .command('restart')\n .description('Restart Jupiter')\n .action(() => {\n jupiterRestart()\n })\n\n jupiter\n .command('enable')\n .description('Enable Jupiter')\n .action(() => {\n jupiterEnable()\n })\n}\n","import { spawnSync } from 'node:child_process'\n\nconst getSolanaVersion = (): string => {\n const { stdout } = spawnSync('solana --version', { shell: true })\n const version = stdout ? String(stdout) : 'Unknown'\n return version.trim()\n}\n\nexport default getSolanaVersion\n"],"mappings":"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","names":["Command","version","package_default","version","VERSION","packageJson","version","WEB_VALIDATORS_SOLUTIONS","SOLV4_CONFIG_FILE","IDENTITY_KEY","UNSTAKED_KEY","RELAYER_KEY","MAINNET_VALIDATOR_KEY","MAINNET_VALIDATOR_VOTE_KEY","MAINNET_VALITATOR_AUTHORITY_KEY","TESTNET_VALIDATOR_KEY","TESTNET_VALIDATOR_VOTE_KEY","TESTNET_VALITATOR_AUTHORITY_KEY","SOLV_HOME","IDENTITY_KEY_PATH","UNSTAKED_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALITATOR_AUTHORITY_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALITATOR_AUTHORITY_KEY_PATH","LOG_PATH","STARTUP_SCRIPT","LEDGER_PATH","ACCOUNTS_PATH","SNAPSHOTS_PATH","SOLANA_VALIDATOR","AGAVE_VALIDATOR","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","MAX_RETRIES","SOLANA_TESTNET_RPC_URL","SOLANA_MAINNET_RPC_URL","VS_UPLOAD_ENDPOINT","JUPITER_ENDPOINT","SWAP_TOKEN","SWAP_TOKENS","Object","values","SOL_TOKEN_MINT","USDC_TOKEN_MINT","ELSOL_TOKEN_MINT","SOLV_SWAP","AssociationAccount","So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn","mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So","bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1","CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP","JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN","DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL","spawnSync","spawnSync","installAgave","__name","version","mod","spawnSync","shell","stdio","installAgave_default","AGAVE_CLI","getSolanaCLI","__name","error","console","getSolanaCLI_default","updateVersion","__name","version","mod","installAgave","monitorUpdate","maxDelinquentStake","noMonitor","minIdleTime","solanaValidatorClient","getSolanaCLI","cmd","LEDGER_PATH","spawnSync","shell","stdio","chalk","LANGS","DISK_TYPES","MOUNT_TYPES","NETWORK_TYPES","NODE_TYPES","SOLANA_CLIENTS","JITO_TYPES","FIREDANCER_TYPES","SOLV_TYPES","MAINNET_TYPES","NODE_RESTART_REQUIRED_MAINNET","NODE_RESTART_REQUIRED_TESTNET","FD_RESTART_REQUIRED_MAINNET","FD_RESTART_REQUIRED_TESTNET","CONFIG","ID","LANG","LANGS","EN","USERNAME","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","NODE_VERSION","TESTNET_DELINQUENT_STAKE","MAINNET_DELINQUENT_STAKE","COMMISSION","SOLANA_NETWORK","SOLV_TYPE","DISK_TYPES","IS_SETUP","LANG_SETUP","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","IS_CLIENT","VALIDATOR_IPS","MAINNET_TYPE","LEDGER_PATH","STAKE_ACCOUNT","HARVEST_ACCOUNT","IS_MEV_MODE","RPC_URL","KEYPAIR_PATH","DISCORD_WEBHOOK_URL","AUTO_UPDATE","AUTO_RESTART","ACCOUNTS_PATH","SNAPSHOTS_PATH","MOD","HOME_PATHS","ROOT","AUTHORIZED_KEYS","MT_PATHS","ACCOUNTS","LEDGER","SNAPSHOTS","FILES","LOG","STARTUP_SCRIPT","JITO_CONFIG","SERVICE_PATHS","SOL_SERVICE","SOL_LOGROTATE","FRANKENDANCER_LOGROTATE","SOL_SYSTEM_CONFIG21","SOL_NOFILES_CONF","SOL_SYSTEM_CONF","SOLANA_PATH","KEYPAIRS","MAINNET_VALIDATOR_KEY","MAINNET_VALIDATOR_VOTE_KEY","MAINNET_VALITATOR_AUTHORITY_KEY","TESTNET_VALIDATOR_KEY","TESTNET_VALIDATOR_VOTE_KEY","TESTNET_VALITATOR_AUTHORITY_KEY","getAllKeyPaths","__name","path","rootDir","mainnetValidatorKey","mainnetValidatorVoteKey","mainnetValidatorAuthorityKey","testnetValidatorKey","testnetValidatorVoteKey","testnetValidatorAuthorityKey","startupScriptPaths","isTest","identity","voteAccount","log","accounts","ledger","snapshots","scriptPath","SOLV_STAKE_POOL_ADDRESS","SOLV_ELSOL_ACCOUNT_ADDRESS","SOLV_POOL_MANAGER_ADDRESS","ELSOL_DECIMALS","ELSOL_MINT_ADDRESS","SOL_MINT_ADDRESS","USDC_MINT_ADDRESS","EPCT_MINT_ADDRESS","TOKEN_MINT_ADDRESS","JUP_URL","DECIMALS","EPOCH_TIMER_FILE_PATH","MINIMUM_VALIDATOR_BALANCE","SOLANA_TESTNET_RPC_URL","spawnSync","updateSolv","__name","spawnSync","shell","stdio","nodeVersion","CONFIG","NODE_VERSION","JITO_CONFIG","version","tag","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","JITO_REGIONS","TESTNET","Dallas","BLOCK_ENGINE_URL","RELAYER_URL","SHRED_RECEIVER_ADDR","NewYork","MAINNET","Amsterdam","London","Frankfurt","Tokyo","SaltLakeCity","Singapore","spawnSync","jitoUpdate","__name","tag","JITO_CONFIG","mod","spawnSync","shell","stdio","readFile","writeFile","homedir","updateJitoSolvConfig","__name","config","solvConfigFile","homedir","homeDir","FILES","JITO_CONFIG","updatedConfig","JSON","parse","readFile","updatedConfigString","stringify","writeFile","console","log","spawnSync","inquirer","updateCommission","__name","commission","isTest","validatorKeypair","voteAccountKeypair","spawnSync","network","shell","stdio","cmd","updateCommissionAsk","inquirer","prompt","type","name","message","default","execAsync","chalk","inquirer","updateFirewall","__name","answer","inquirer","prompt","name","type","message","default","execAsync","ip","console","log","chalk","white","getSolvVersion","__name","version","getSolvVersion_default","readFile","writeFile","existsAsync","LANG","LANGS","Object","values","Network","NETWORK_TYPES","NodeType","NODE_TYPES","ValidatorType","SOLANA_CLIENTS","filter","type","RpcType","RPC_MODE","MNT_DISK_TYPE","VERSION_TESTNET","VERSION_MAINNET","VERSION_JITO_TESTNET","VERSION_JITO_MAINNET","VERSION_JITO_RPC","VERSION_SOLANA_RPC","VERSION_NODE","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","DEFAULT_CONFIG","NETWORK","Network","TESTNET","NODE_TYPE","NodeType","RPC","VALIDATOR_TYPE","ValidatorType","NONE","RPC_TYPE","RpcType","AGAVE","MNT_DISK_TYPE","TRIPLE","TESTNET_SOLANA_VERSION","VERSION_TESTNET","MAINNET_SOLANA_VERSION","VERSION_MAINNET","NODE_VERSION","VERSION_NODE","TESTNET_DELINQUENT_STAKE","DELINQUENT_STAKE_TESTNET","MAINNET_DELINQUENT_STAKE","DELINQUENT_STAKE_MAINNET","COMMISSION","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","STAKE_ACCOUNTS","HARVEST_ACCOUNT","IS_MEV_MODE","RPC_URL","SOLANA_MAINNET_RPC_URL","KEYPAIR_PATH","DISCORD_WEBHOOK_URL","AUTO_UPDATE","AUTO_RESTART","IS_DUMMY","API_KEY","LEDGER_PATH","ACCOUNTS_PATH","SNAPSHOTS_PATH","MOD","defaultConfig_default","homedir","readConfig","__name","configPath","homedir","homeDir","SOLV4_CONFIG_FILE","existsAsync","JSON","parse","readFile","console","log","writeFile","stringify","DEFAULT_CONFIG","readConfig_default","fetch","sendDiscord","__name","content","config","readConfig","DISCORD_WEBHOOK_URL","Error","body","username","fetch","method","JSON","stringify","headers","status","console","log","error","spawnSync","Connection","isValidatorActive","__name","rpcUrl","voteAccountKey","isTest","slot","validatorStatus","pubkey","isActive","reason","connection","Connection","voteAccounts","getVoteAccounts","validator","current","find","v","votePubkey","delinquent","lastVoteSlot","lastVote","slotsSinceLastVote","getSlot","error","console","spawnSync","getSolanaAddress","__name","keypath","cmd","stdout","spawnSync","shell","stdio","toString","trim","sleep","__name","ms","Promise","resolve","setTimeout","sleep_default","sendDiscord","MAX_RETRIES","waitCatchup","__name","config","isTestnet","NETWORK","Network","TESTNET","mainnetValidatorVoteKey","testnetValidatorVoteKey","getAllKeyPaths","validatorPubkey","getSolanaAddress","validatorKey","result","isValidatorActive","RPC_URL","retries","isActive","console","log","msg","pubkey","reason","sendDiscord","sleep","error","waitCatchup_default","autoUpdate","__name","config","isMainnet","NETWORK","Network","MAINNET","isFrankendancer","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","validatorKey","isUpdateRequired","FD_RESTART_REQUIRED_MAINNET","FD_RESTART_REQUIRED_TESTNET","NODE_RESTART_REQUIRED_MAINNET","NODE_RESTART_REQUIRED_TESTNET","AUTO_RESTART","address","getSolanaAddress","msg","getSolvVersion","sendDiscord","spawnSync","stdio","shell","error","errorMsg","message","restartMsg","sleep","catchup","waitCatchup","autoUpdate_default","homedir","readFile","writeFile","existsAsync","updateDefaultConfig","__name","config","solvConfigFile","homedir","homeDir","SOLV4_CONFIG_FILE","existsAsync","console","log","writeFile","JSON","stringify","DEFAULT_CONFIG","updatedConfig","parse","readFile","updatedConfigString","cmdsEN","description","version","help","subcmdHelp","server","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","check","scp","cron","setup","epoch","slot","solv","installer","unstake","cmds_default","cmdsJA","description","version","help","subcmdHelp","server","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","unstake","check","scp","cron","setup","epoch","slot","solv","installer","cmds_default","logsEN","success","created","error","failed","installer","welcomeMsg","description","logs_default","logsJA","success","created","error","failed","installer","welcomeMsg","description","logs_default","installerEN","installerSubEN","installerJA","installerSubJA","subCmdsEN","server","description","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","unstake","check","scp","cron","setup","epoch","slot","solv","subCmds_default","subCmdsJA","server","description","start","stop","status","restart","update","get","log","catchup","monitor","config","install","stake","unstake","check","scp","cron","setup","epoch","slot","solv","subCmds_default","clientEN","clientJA","readLocale","__name","lang","locales","cmds","cmdsEN","subCmds","subCmdsEN","logs","logsEN","installer","installerEN","installerSub","installerSubEN","clientCmds","clientEN","LANGS","EN","JA","cmdsJA","subCmdsJA","logsJA","installerJA","installerSubJA","clientJA","readLocale_default","existsSync","readFileSync","writeFileSync","readFileSync","writeFileSync","homedir","updateSolvConfig","__name","config","solvConfigFile","homedir","homeDir","FILES","CONFIG","updatedConfig","JSON","parse","readFileSync","updatedConfigString","stringify","writeFileSync","homedir","readOrCreateDefaultConfig","__name","configPath","homedir","homeDir","FILES","CONFIG","existsSync","writeFileSync","JSON","stringify","console","log","config","parse","readFileSync","locale","readLocale","LANG","RPC_URL","updateSolvConfig","IS_MEV_MODE","undefined","DISCORD_WEBHOOK_URL","spawnSync","getSnapshot","__name","isTest","minDownloadSpeed","snapshotPath","SNAPSHOTS_PATH","version","VERSION_MAINNET","rpcUrl","useAvorio","cmd","spawnSync","shell","stdio","cwd","error","Error","spawnSync","frankendancerUpdate","__name","config","version","mod","isTestnet","NETWORK","Network","TESTNET","firedancerVersion","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","MOD","spawnSync","shell","stdio","cwd","spawnSync","rmSnapshot","__name","config","spawnSync","shell","stdio","SNAPSHOTS_PATH","updateCommands","__name","config","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","isJito","VALIDATOR_TYPE","ValidatorType","JITO","isFrankendancer","FRANKENDANCER","isAutoRestart","AUTO_RESTART","isModded","MOD","minIdleTime","version","VERSION_TESTNET","VERSION_MAINNET","VERSION_JITO_MAINNET","VERSION_JITO_TESTNET","VERSION_FIREDANCER","VERSION_FIREDANCER_TESTNET","VERSION_SOLANA_RPC","VERSION_JITO_RPC","program","command","alias","description","option","action","options","solvVersion","getSolvVersion","deliquentStake","TESTNET_DELINQUENT_STAKE","MAINNET_DELINQUENT_STAKE","console","log","chalk","white","auto","autoUpdate","migrateConfig","oldConfig","readOrCreateDefaultConfig","diskType","MNT_DISK_TYPE","TRIPLE","DISK_TYPES","DOUBLE","SINGLE","isTestnetOld","SOLANA_NETWORK","NETWORK_TYPES","isRPCOld","SOLV_TYPE","SOLV_TYPES","RPC_NODE","isJitoOld","MAINNET_TYPE","MAINNET_TYPES","JITO_MEV","newConfigBody","MAINNET","VALIDATOR","RPC_TYPE","RpcType","NONE","AGAVE","SOLANA","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","NODE_VERSION","COMMISSION","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","STAKE_ACCOUNTS","STAKE_ACCOUNT","HARVEST_ACCOUNT","IS_MEV_MODE","RPC_URL","KEYPAIR_PATH","DISCORD_WEBHOOK_URL","AUTO_UPDATE","IS_DUMMY","API_KEY","LEDGER_PATH","ACCOUNTS_PATH","SNAPSHOTS_PATH","updateDefaultConfig","jitoVersion","updateJitoSolvConfig","tag","green","firewall","updateFirewall","background","rmSnapshot","jitoUpdate","mod","monitorUpdate","getSnapshot","frankendancerUpdate","updateVersion","DELINQUENT_STAKE_TESTNET","DELINQUENT_STAKE_MAINNET","commission","ansewr","updateCommissionAsk","updateCommission","updateSolv","spawnSync","tail","__name","options","log","startupScriptPaths","cmd","error","info","warning","console","result","spawnSync","shell","stdio","signal","process","exit","status","logCommands","__name","program","command","description","alias","option","action","options","tail","chalk","spawnSync","homedir","setupVoteAccount","__name","config","homeDir","homedir","allKeyPaths","getAllKeyPaths","validatorVoteKey","testnetValidatorVoteKey","validatorKey","testnetValidatorKey","validatorAuthorityKey","testnetValidatorAuthorityKey","network","NETWORK_TYPES","TESTNET","commision","COMMISSION","NETWORK","Network","MAINNET","mainnetValidatorVoteKey","mainnetValidatorKey","mainnetValidatorAuthorityKey","console","log","url","RPC_URL","cmd","spawnSync","shell","stdio","spawnSync","existsSync","readdirSync","rmSync","homedir","path","createSolvKeyPairs","__name","config","genKeys","keyNum","NODE_TYPE","NodeType","RPC","KEYPAIRS","MAINNET_VALIDATOR_KEY","NETWORK","Network","TESTNET","TESTNET_VALIDATOR_KEY","TESTNET_VALITATOR_AUTHORITY_KEY","TESTNET_VALIDATOR_VOTE_KEY","MAINNET_VALITATOR_AUTHORITY_KEY","MAINNET_VALIDATOR_VOTE_KEY","cmd","spawnSync","shell","stdio","files","readdirSync","filter","f","endsWith","keyDir","homedir","unstakedKeyPath","path","join","existsSync","i","file","keyPath","console","log","rmSync","recursive","spawnSync","jupiterAPIService","__name","rpcUrl","grpcUrl","grpcToken","port","filePath","body","jupiterAPIService_default","inquirer","chalk","jupiterAPISetup","__name","questions","inquirer","prompt","name","message","type","default","spawnSync","shell","stdio","filePath","body","jupiterAPIService","rpcUrl","grpcUrl","grpcToken","console","log","chalk","white","jupiterAPISetup_default","existsAsync","readFile","writeFile","homedir","path","readOrCreateJitoConfig","__name","homeDir","homedir","configPath","path","join","FILES","JITO_CONFIG","existsAsync","writeFile","JSON","stringify","console","log","config","parse","readFile","error","spawnSync","daemonReload","__name","spawnSync","shell","stdio","chalk","inquirer","inquirer","askJitoSetting","__name","isTestnet","jitRegions","Object","keys","JITO_REGIONS","TESTNET","MAINNET","regionType","answer","inquirer","prompt","name","type","message","default","commissionBps","choices","regionKey","region","regionArgs","version","JITO_CONFIG","tag","blockEngineUrl","BLOCK_ENGINE_URL","relayerUrl","RELAYER_URL","shredReceiverAddr","SHRED_RECEIVER_ADDR","initialConfigSetup","__name","validatorType","ValidatorType","NONE","rpcType","RpcType","AGAVE","commission","DEFAULT_CONFIG","COMMISSION","isDummy","answer","inquirer","prompt","name","type","message","choices","NETWORK_TYPES","default","Network","MAINNET","NODE_TYPES","NodeType","RPC","isTestnet","network","TESTNET","nodeType","VALIDATOR","validatorChoices","JITO","SOLANA","FRANKENDANCER","then","RPC_MODE","readOrCreateJitoConfig","jitoConfig","askJitoSetting","updateJitoSolvConfig","console","log","chalk","white","updateDefaultConfig","NETWORK","NODE_TYPE","VALIDATOR_TYPE","RPC_TYPE","IS_DUMMY","error","Error","initialConfigSetup_default","spawnSync","installJito","__name","version","VERSION_JITO_TESTNET","mod","tag","spawnSync","shell","stdio","startJitoRPCScript","__name","IDENTITY_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","existsAsync","writeFile","spawnSync","updateStartupScriptPermission","__name","cmd","STARTUP_SCRIPT","spawnSync","shell","stdio","updateStartupScriptPermission_default","startRPCNodeScript","__name","IDENTITY_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","setupRpcNode","__name","config","rpcType","RPC_TYPE","startupScript","RpcType","AGAVE","console","log","installAgave","TESTNET_SOLANA_VERSION","startRPCNodeScript","JITO","installJito","VERSION_JITO_TESTNET","startJitoRPCScript","existsAsync","STARTUP_SCRIPT","writeFile","updateStartupScriptPermissions","rpc_default","spawnSync","installSolana","__name","version","spawnSync","shell","stdio","installSolana_default","startJitoMainnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startJitoTestnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startMainnetValidatorScript","__name","config","solanaCLI","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startTestnetAgaveValidatorScript","__name","config","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","existsAsync","writeFile","setupValidatorNode","__name","config","mod","NETWORK","network","MOD","modConfig","Network","MAINNET","console","log","setupMainnetValidator","TESTNET","setupTestnetValidator","VALIDATOR_TYPE","validatorType","MAINNET_SOLANA_VERSION","version","startupScript","ValidatorType","SOLANA","installSolana","startMainnetValidatorScript","JITO","jitoConfig","readOrCreateJitoConfig","installJito","startJitoMainnetScript","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","existsAsync","STARTUP_SCRIPT","writeFile","updateStartupScriptPermissions","TESTNET_SOLANA_VERSION","startTestnetAgaveValidatorScript","AGAVE","installAgave","startJitoTestnetScript","validator_default","chalk","execSync","createDirectoryIfNotExists","path","execSync","console","log","setupDirs","__name","dirs","MT_PATHS","ACCOUNTS","LEDGER","SNAPSHOTS","dir","createDirectoryIfNotExists","error","Error","execSync","getPreferredDisks","lines","execSync","encoding","split","slice","disks","allDiskNames","map","line","trim","has850GB","has400GB","hasUsed1250GB","hasThirdDisk400GB","rootDiskName","name","sizeStr","mountpoint","size","parseInt","isNaN","isMounted","undefined","replace","hasPartition","some","diskName","startsWith","diskType","push","type","console","log","rootDiskPartitions","filter","forEach","partition","sortedDisks","disk","includes","sort","a","b","nvmeDisks","sataDisks","prioritizedDisks","length","largestDisk","secondLargestDisk","thirdDisk","index","getLargestDisk_default","spawnSync","formatDisk","__name","fileSystem","spawnSync","shell","encoding","stdout","trim","console","log","cmd","stdio","spawnSync","getUUID","devicePath","attempt","uuid","spawnSync","shell","encoding","stdout","trim","console","log","warn","sleep","error","ensureFstabEntries","__name","fileSystem","fileSystem2","fileSystem3","isDouble","isTriple","fs1","fs2","fs3","mtLine","MT_PATHS","ROOT","LEDGER","ACCOUNTS","SNAPSHOTS","lines","fstabContent","linesToAdd","line","includes","push","length","addCmd","join","spawnSync","umount","__name","mountPath","cmd","stderr","spawnSync","shell","stdio","includes","error","console","log","mountDirs","__name","disks","getPreferredDisks","mountPoint","mountpoint","has850GB","has400GB","length","console","log","updateDefaultConfig","MNT_DISK_TYPE","TRIPLE","fileSystemName1","name","fileSystemName2","fileSystemName3","isDisk1Formatted","formatDisk","isDisk2Formatted","isDisk3Formatted","fileSystem1","fileSystem2","fileSystem3","sleep","ensureFstabEntries","DOUBLE","SINGLE","includes","umount","fileSystem","mountDirs_default","spawnSync","setupPermissions","__name","cmds","MT_PATHS","ROOT","ACCOUNTS","LEDGER","SNAPSHOTS","line","spawnSync","shell","stdio","execSync","existsSync","setupSystemd","existsSync","SERVICE_PATHS","SOL_SYSTEM_CONFIG21","console","log","sysctlConfig","nofilesConfig","execSync","SOL_SYSTEM_CONF","SOL_NOFILES_CONF","logRotates","__name","username","CONFIG","USERNAME","frankendancer","log","startupScriptPaths","service","body","existsSync","execSync","setupLogrotate","frankendancer","console","log","existsSync","SERVICE_PATHS","SOL_LOGROTATE","body","logRotates","execSync","FRANKENDANCER_LOGROTATE","envMainnet","envTestnet","normalSolanaPath","CONFIG","USERNAME","solvService","__name","isTest","scriptPath","startupScriptPaths","environment","solanaPath","HOME_PATHS","ROOT","execSync","setupSolvService","isTest","console","log","body","solvService","execSync","SERVICE_PATHS","SOL_SERVICE","makeServices","__name","isTest","setupLogrotate","setupSolvService","setupSystemd","spawnSync","setupKeys","__name","config","createSolvKeyPairs","network","NETWORK","Network","TESTNET","spawnSync","TESTNET_VALIDATOR_KEY_PATH","shell","stdio","MAINNET_VALIDATOR_KEY_PATH","NODE_TYPE","NodeType","RPC","setupVoteAccount","error","Error","spawnSync","startSolana","__name","config","cmd","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","service","spawnSync","shell","stdio","execSync","setupCpuGovernor","__name","execSync","cmd","setupCpuGovernor_default","fs","promisify","execSync","readFile","promisify","fs","access","path","sysconfig","updateSysctlConfig","constants","F_OK","console","log","data","includes","updatedConfig","replace","execSync","err","error","updateSysctlConfig_default","spawnSync","restartLogrotate","__name","spawnSync","shell","stdio","spawnSync","enableSolv","__name","spawnSync","shell","stdio","spawnSync","createSymLink","__name","isDummy","isTest","createInactiveSymLink","createActiveSymLink","network","spawnSync","shell","stdio","chalk","rpcLog","__name","lighting","chalk","yellow","msg","blueBright","white","console","log","cyan","rpcLog_default","spawnSync","promises","fs","startFiredancerScript","__name","filePath","body","startFiredancerScript_default","firedancerService","__name","filePath","body","firedancerService_default","configToml","__name","isTest","jitoConfig","filePath","mainnetBody","blockEngineUrl","body","configToml_default","portRelayService","__name","filePath","body","portRelayService_default","setupFiredancer","__name","mod","config","isTest","NETWORK","Network","TESTNET","latestVersion","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","latestSubmoduleVersion","VERSION_TESTNET","VERSION_MAINNET","spawnSync","shell","stdio","cwd","jitoConfig","readOrCreateJitoConfig","filePath","body","startFiredancerScript","fdService","firedancerService","prService","portRelayService","toml","configToml","fs","writeFile","console","log","setupLogrotate","setupFiredancer_default","setupV2","__name","skipInitConfig","skipMount","pivot","mod","console","log","chalk","white","readConfig","initialConfigSetup","latestConfig","isTest","NETWORK","Network","TESTNET","setupDirs","mountDirs","makeServices","restartLogrotate","setupCpuGovernor","updateSysctlConfig","setupKeys","createSymLink","IS_DUMMY","NODE_TYPE","NodeType","RPC","setupRpcNode","VALIDATOR","setupValidatorNode","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","setupFiredancer","Error","setupPermissions","daemonReload","enableSolv","getSnapshot","SNAPSHOTS_PATH","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","startSolana","rpcLog","error","message","relayerService","__name","blockEngineUrl","filePath","body","jitoRelayerSeparateService","execSync","spawnSync","jitoRelayerSetup","__name","blockEngineUrl","isCoHost","spawnSync","stdio","shell","cwd","filePath","body","relayerService","jitoRelayerSeparateService","execSync","spawnSync","geyserConfig","__name","xToken","filePath","defaultConfig","libpath","log","level","grpc","address","compression","accept","send","max_decoding_message_size","snapshot_plugin_channel_capacity","snapshot_client_channel_capacity","channel_capacity","unary_concurrency_limit","unary_disabled","x_token","prometheus","geyserConfig_default","spawnSync","readFile","writeFile","addConfigToStartupScript","__name","startupScriptPath","lines","readFile","split","splice","newStartupScript","join","writeFile","spawnSync","shell","stdio","addConfigToStartupScript_default","inquirer","writeFile","yellowstoneGeyser","__name","xToken","inquirer","prompt","type","name","message","default","cmd","cmd2","cmd3","spawnSync","shell","stdio","cwd","filePath","defaultConfig","geyserConfig","jsonString","JSON","stringify","writeFile","encoding","addConfigToStartupScript","setupCommands","__name","config","program","command","description","option","action","options","isModded","MOD","mod","vote","console","log","chalk","white","setupVoteAccount","process","exit","key","createSolvKeyPairs","relayer","blockEngineUrl","readOrCreateJitoConfig","jitoRelayerSetup","isCoHost","green","daemonReload","rpcLog","jupiter","jupiterAPISetup","geyser","yellowstoneGeyser","firedancer","setupFiredancer","setupV2","skipInitConfig","skipMount","pivot","error","message","includes","cyan","red","execSync","df","__name","parsedData","execSync","toString","split","slice","filter","line","map","segments","Filesystem","Size","Used","Avail","Use","MountedOn","sort","a","b","convertToBytes","isMountedOnCorrect","some","data","forEach","console","log","startsWith","length","chalk","Table","displayTable","__name","data","head","map","item","chalk","blue","table","Table","colWidths","forEach","row","push","Filesystem","Size","Used","Avail","Use","MountedOn","white","console","log","toString","dfCommands","__name","program","command","description","action","dirs","df","displayTable","convertToBytes","size","units","K","KB","M","MB","G","GB","T","TB","unit","match","number","parseFloat","startCommand","__name","config","program","command","description","action","startSolana","process","exit","spawnSync","chalk","stopSolana","__name","config","chalk","white","console","log","cmd","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","service","spawnSync","shell","stdio","stopCommand","__name","config","program","command","description","action","stopSolana","process","exit","spawnSync","chalk","restartCommand","__name","config","solanaValidatorClient","getSolanaCLI","program","command","description","option","action","options","isAutoRestart","AUTO_RESTART","isTestnet","NETWORK","Network","TESTNET","minIdleTime","rm","console","log","chalk","white","spawnSync","stdio","shell","green","process","exit","cmd","LEDGER_PATH","MAINNET_DELINQUENT_STAKE","installCommands","__name","config","version","NETWORK","Network","TESTNET","VERSION_TESTNET","VERSION_MAINNET","NODE_TYPE","NodeType","RPC","VERSION_SOLANA_RPC","program","command","alias","description","option","action","options","isJito","VALIDATOR_TYPE","ValidatorType","JITO","isModified","mod","MOD","jitoTag","VERSION_JITO_MAINNET","jitoVersion","jitoUpdate","solanaCLIVersion","updateVersion","spawnSync","mountCommands","__name","program","command","description","action","spawnSync","shell","stdio","disks","getPreferredDisk","console","log","spawnSync","chalk","spawnSync","hasEpochTimer","__name","result","spawnSync","encoding","status","console","log","crontabList","stdout","includes","error","hasEpochTimer_default","cronCommands","__name","program","command","description","option","action","options","hasEpochTimer","console","log","chalk","green","process","exit","cronJob","cron","spawnSync","shell","stdio","SOLV_CLIENT_PATHS","SOLV_KEYPAIR_DOWNLOAD_PATH","SOLV_KEYPAIR_UPLOAD_PATH","SOLV_KEYPAIR_UPLOAD_PATH_LINUX","SOLV_KEYPAIR_TRASH_PATH","SSH_PUBKEY_PATH","existsSync","mkdirSync","inquirer","homedir","spawnSync","executeSCP","ip","key","filePath","isDownload","cmd","spawnSync","shell","stdio","status","download","__name","ip","migrateIP","inquirer","prompt","type","name","message","default","solanaKeys","Object","values","getAllKeyPaths","homeDirectory","homedir","keyDir","includes","SOLV_CLIENT_PATHS","SOLV_KEYPAIR_DOWNLOAD_PATH","existsSync","mkdirSync","recursive","isDownload","relayerKeyPath","RELAYER_KEY","push","key","splits","split","fileName","length","replace","filePath","executeSCP","console","log","spawnSync","existsSync","inquirer","os","upload","__name","ip","homeDirectory","os","userInfo","homedir","migrateIP","inquirer","prompt","type","name","message","default","keyPath","SOLV_CLIENT_PATHS","SOLV_KEYPAIR_UPLOAD_PATH","includes","SOLV_KEYPAIR_UPLOAD_PATH_LINUX","solanaKeys","Object","values","getAllKeyPaths","key","splits","split","fileName","length","endsWith","filePath","existsSync","cmd","spawnSync","shell","stdio","console","log","spawnSync","inquirer","scpCreate","__name","answer","inquirer","prompt","type","name","message","default","cmd","HOME_PATHS","ROOT","pubkey","AUTHORIZED_KEYS","spawnSync","shell","stdio","console","log","chalk","readFileSync","os","cat","__name","publicKeyPath","os","userInfo","homedir","homeDirectory","publicKey","readFileSync","console","log","chalk","white","error","spawnSync","init","__name","spawnSync","shell","stdio","spawn","readFileSync","Readable","search","__name","bar","Promise","resolve","reject","find","spawn","filePaths","stdout","on","data","push","toString","split","filter","path","increment","stderr","code","error","checkIfSolanaKey","JSON","parse","readFileSync","length","processPaths","paths","validPaths","readable","Readable","from","chalk","Presets","SingleBar","chalk","spawnSync","fetch","uploadVS","__name","result","fetch","VS_UPLOAD_ENDPOINT","method","headers","status","console","log","chalk","yellow","data","json","cmd","cmds","spawnSync","shell","stdio","white","uploadVS_default","scpCommands","__name","scp","program","command","description","argument","alias","option","action","options","ip","download","vs","uploadVS","upload","scpCreate","cat","init","console","log","progressBar","SingleBar","Presets","shades_classic","start","solanaKeyPaths","search","result","processPaths","stop","chalk","white","length","slice","green","join","spawnSync","statusCommands","__name","config","program","command","description","action","systemctlStatusSolv","cmd","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","service","spawnSync","shell","stdio","process","exit","spawnSync","delegateStake","__name","stakeAccountPubkey","validatorVoteAccountPubkey","config","readConfig","isTestnet","NETWORK","Network","TESTNET","network","NODE_TYPE","NodeType","RPC","RPC_URL","cmd","authorityKeyPath","spawnSync","join","shell","stdio","error","Error","inquirer","spawnSync","createStakeAccount","__name","stakeKeypair","sol","retryLimit","attempt","result","spawnSync","shell","stdio","output","stdout","toString","stderr","includes","console","log","addLeadingZero","existsAsync","execSync","spawnSync","os","stakeAccountQuestion","__name","config","isTestnet","NETWORK","Network","TESTNET","inquirer","prompt","type","name","message","default","confirmCreateStakeAccount","spawnSync","authorityKeypair","shell","stdio","answer","stakeKeypair","stakeKeypairPath","createStakeKeypair","currentStakeAccount","STAKE_ACCOUNTS","uniqueStakeAccount","Array","from","Set","updateSolvConfig","STAKE_ACCOUNT","createStakeAccount","Number","solAmount","homeDirectory","os","userInfo","homedir","STAKE_ACCOUNT_DIR","existsAsync","files","stdout","toString","split","filter","file","includes","stakeAccountNum","addLeadingZero","length","outfile","cmd","execSync","trim","spawnSync","deactivateStake","__name","stakeAccountPubkey","authorityKeyPath","readConfig","NETWORK","Network","TESTNET","cmd","spawnSync","shell","stdio","error","Error","spawnSync","withdrawStake","__name","stakeAccountPubkey","destinationPubkey","amount","cmd","spawnSync","shell","stdio","error","Error","chalk","Connection","PublicKey","stakePoolInfo","getStakePoolInfo","__name","rpcUrl","poolAddress","SOLV_STAKE_POOL_ADDRESS","connection","Connection","stakePoolAddress","PublicKey","stakePoolInfo","console","log","fetchDigitalAsset","createUmi","publicKey","getTokenInfo","__name","rpcUrl","mintAddress","mintPubkey","publicKey","console","log","umi","createUmi","nftMetadata","fetchDigitalAsset","name","metadata","symbol","uri","mint","chalk","inquirer","selectLST","__name","rpcUrl","answer","inquirer","prompt","type","name","message","default","SOLV_STAKE_POOL_ADDRESS","poolInfo","getStakePoolInfo","stakePoolAddress","console","log","chalk","yellow","white","poolMint","tokenInfo","getTokenInfo","symbol","mint","uri","result","stakeInfo","confirm","readFile","inquirer","existsAsync","Connection","Keypair","PublicKey","Connection","PublicKey","Keypair","getOrCreateAssociatedTokenAccount","getOrCreateDestinationAddress","__name","rpcUrl","fromWalletKey","mintAddress","owner","allowOwnerOffCurve","payer","Keypair","fromSecretKey","Uint8Array","mintPublicKey","PublicKey","connection","Connection","getOrCreateAssociatedTokenAccount","address","toBase58","error","console","log","Error","JSON","stringify","Spinner","chalk","PublicKey","Keypair","Transaction","ComputeBudgetProgram","LAMPORTS_PER_SOL","solanaStakePool","depositSol","__name","connection","fromWalletKey","SOL","stakePoolAddress","PublicKey","SOLV_STAKE_POOL_ADDRESS","destinationTokenAccount","referrerTokenAccount","depositAuthority","fromWallet","Keypair","fromSecretKey","Uint8Array","lamport","LAMPORTS_PER_SOL","instructions","signers","depositSOLInstruction","txForEstimate","Transaction","add","feePayer","publicKey","latestBlockhashAndContext","getLatestBlockhashAndContext","commitment","recentBlockhash","value","blockhash","sign","tx","ComputeBudgetProgram","setComputeUnitPrice","microLamports","signature","sendRawTransaction","serialize","skipPreflight","confirmTransaction","status","error","console","log","payerAddress","sleep","elSOLdeposit","__name","rpcUrl","poolAddress","amount","fromWalletKey","console","log","chalk","white","connection","Connection","askAmount","spinner","Spinner","setSpinnerString","start","setSpinnerTitle","green","stakePoolAddress","PublicKey","depositAuthority","Keypair","fromSecretKey","Uint8Array","mintAddress","ELSOL_MINT_ADDRESS","destinationTokenAccount","getOrCreateDestinationAddress","publicKey","sleep","sig","depositSol","SOLV_ELSOL_ACCOUNT_ADDRESS","retryCount","status","stop","red","yellow","signature","Connection","Keypair","PublicKey","Spinner","chalk","sleep","depositeLST","__name","rpcUrl","poolAddress","amount","fromWalletKey","symbol","connection","Connection","askAmount","spinner","Spinner","setSpinnerString","start","setSpinnerTitle","chalk","green","stakePoolAddress","PublicKey","stakePool","getStakePoolInfo","console","log","mintAddress","poolMint","depositAuthority","Keypair","fromSecretKey","Uint8Array","destinationTokenAccount","getOrCreateDestinationAddress","publicKey","solvAssociatedTokenAccount","SOLV_POOL_MANAGER_ADDRESS","sleep","sig","depositSol","retryCount","status","stop","red","yellow","white","signature","execSync","homedir","stakeCommands","__name","config","program","command","description","option","action","options","amount","Number","console","log","RPC_URL","poolAddress","SOLV_STAKE_POOL_ADDRESS","isTestnet","NETWORK","Network","TESTNET","keyRoot","homedir","keypairPath","execSync","existsAsync","chalk","yellow","white","fromWalletKey","JSON","parse","readFile","elsol","elSOLdeposit","lst","selectLST","stakePoolAddress","depositeLST","symbol","stakeAccountQuestion","newSolvConfig","readConfig","validatorVoteAccount","stakeAccounts","delegateStakeAsk","stakeAccount","delegateStake","unstakeOption","unstakeAsk","deactivateStakeAsk","deactivateStake","answer","withdrawStakeAsk","withdrawStake","destinationAddress","solAmount","askAmount","currentAddress","toString","trim","currentVoteAccountBalance","replace","inquirer","prompt","type","name","message","default","String","choices","STAKE_ACCOUNTS","defaultAddress","getVoteAccountAddress","DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY","cmd","voteAccount","unstakeOptions","execSync","getEpoch","__name","execSync","encoding","toString","replace","error","execSync","getSlot","__name","execSync","encoding","toString","replace","error","chalk","Spinner","Logger","successHex","chalk","hex","warningHex","errorHex","syncHex","greyHex","indigoHex","pinkHex","normal","text","console","log","white","syncSpinner","spinner","Spinner","setSpinnerString","start","error","stop","Error","solvAA","row1","row2","row3","row4","row5","row6","VERSION","installMessage","msg","msg2","installClientMessage","mtCommandsLog","msg3","msg4","chalk","spawnSync","showConfig","__name","solvConfig","spawnSync","shell","stdio","config","startupScriptPaths","console","log","chalk","white","scriptPath","SERVICE_PATHS","SOL_SERVICE","SOL_LOGROTATE","FRANKENDANCER_LOGROTATE","SOL_SYSTEM_CONFIG21","SOL_NOFILES_CONF","SOL_SYSTEM_CONF","ledger","accounts","snapshots","MNT_DISK_TYPE","spawnSync","chalk","getCommands","__name","config","isTest","NETWORK","Network","TESTNET","version","VERSION_TESTNET","VERSION_MAINNET","NODE_TYPE","NodeType","RPC","VERSION_SOLANA_RPC","get","program","command","description","argument","action","epoch","getEpoch","console","log","cmd","stdout","spawnSync","shell","stdio","chalk","white","slot","getSlot","alias","option","SNAPSHOTS_PATH","options","minDownloadSpeed","snapshotPath","rpcUrl","useAvorio","avorio","getSnapshot","getSolanaCLI","solanaValidatorClient","showConfig","Logger","solvAA","client","installClientMessage","installMessage","addHelpCommand","spawnSync","relayerStatus","__name","spawnSync","shell","stdio","spawnSync","relayerStart","__name","spawnSync","shell","stdio","spawnSync","relayerStop","__name","spawnSync","shell","stdio","spawnSync","relayerRestart","__name","spawnSync","shell","stdio","spawnSync","relayerLog","__name","error","spawnSync","shell","stdio","chalk","spawnSync","spawnSync","relayerEnable","__name","spawnSync","shell","stdio","relayerCommands","__name","relayer","program","command","description","action","relayerStatus","relayerStart","relayerStop","option","options","relayerLog","error","relayerRestart","relayerEnable","url","console","log","chalk","red","cmd","getSolanaCLI","LEDGER_PATH","white","spawnSync","shell","stdio","green","chalk","spawnSync","splBalance","__name","keyPath","cmd","spawnSync","shell","stdio","console","log","chalk","yellow","white","homedir","spawnSync","getSolBalance","__name","keyPath","cmd","stdout","spawnSync","shell","stdio","toString","trim","chalk","spawnSync","balanceCommands","__name","config","program","command","alias","option","description","action","options","spl","keyPath","homedir","splBalance","process","exit","showKeypairsInfo","keyInfo","getKeypairsInfo","output","validatorKey","validatorKeyAddress","validatorKeyBalance","voteKey","voteKeyAddress","voteKeyBalance","authorityKey","authorityKeyAddress","authorityKeyBalance","NODE_TYPE","NodeType","RPC","console","log","chalk","white","spawnSync","IDENTITY_KEY_PATH","stdio","shell","keypairs","getAllKeyPaths","isTestnet","NETWORK","Network","TESTNET","mainnetValidatorKey","getSolanaAddress","getSolBalance","testnetValidatorKey","testnetValidatorVoteKey","testnetValidatorAuthorityKey","mainnetValidatorVoteKey","mainnetValidatorAuthorityKey","spawnSync","rmLogs","__name","spawnSync","shell","stdio","spawnSync","monitorSolana","__name","config","cmd","getSolanaCLI","solanaValidatorClient","LEDGER_PATH","spawnSync","shell","stdio","spawnSync","solanaCatchup","__name","spawnSync","shell","stdio","inquirer","execSync","spawnSync","chalk","homedir","RETRY_DELAY","TransferFrom","TransferTo","transferFromArray","Object","values","transferCommands","__name","config","program","command","alias","option","description","action","options","spl","console","log","chalk","blue","process","exit","fromWalletPath","fromAddress","toAddress","selectFromKeypairs","toBalance","out","spawnSync","RPC_URL","shell","status","Error","stdout","toString","red","fromBalance","execSync","white","amount","inquirer","prompt","type","name","message","default","cmd","result","stdio","maxRetries","MAX_RETRIES","sleep","validateSolanaKey","input","test","homeDir","homedir","authorityKey","validatorKey","toKeyPath","trim","answer","choices","secondChoice","from","filter","value","to","validate","toKey","key","chalk","inquirer","execSync","spawnSync","withdraw","__name","config","isAll","isTestnet","NETWORK","Network","TESTNET","RPC_URL","SOLANA_TESTNET_RPC_URL","validatorKeypair","authorityKeypair","voteAccount","currentVoteAccountBalance","execSync","toString","replace","trim","withdrawAmount","defaultMax","Number","console","log","chalk","white","yellow","answer","inquirer","prompt","type","name","message","default","String","sol","votePubkey","targetPubkey","cmd","spawnSync","shell","stdio","withdrawCommands","__name","config","program","command","option","description","action","options","withdraw","all","process","exit","execSync","spawnSync","BN","LAMPORTS_PER_SOL","Connection","LAMPORTS_PER_SOL","Keypair","readFile","loadKeypairFromFile","__name","filePath","secretKey","JSON","parse","readFile","Keypair","fromSecretKey","Uint8Array","loadKeypairFromFile_default","homedir","KeyType","keySuffixMap","getBalance","__name","rpcUrl","key","isTestnet","connection","Connection","home","homedir","keyPaths","getAllKeyPaths","accountKey","prefix","account","keypair","loadKeypairFromFile","balance","publicKey","SOL","Number","LAMPORTS_PER_SOL","isNaN","Error","getBalance_default","MINIMUM_EPOCH_START_BALANCE","BN","LAMPORTS_PER_SOL","getHarvestBalance","__name","rpcUrl","validatorBalance","getBalance","KeyType","VALIDATOR","withdrawableBalanceLamport","Number","sub","withdrawableBalance","Math","round","chalk","Keypair","Connection","PublicKey","SystemProgram","ComputeBudgetProgram","VersionedTransaction","TransactionMessage","solanaTransfer","__name","endpoint","fromWalletKey","toAddressPubkey","transferAmountLamport","retry","connection","Connection","fromWallet","Keypair","fromSecretKey","Uint8Array","Array","from","toPubkey","PublicKey","lamports","testInstructions","SystemProgram","transfer","fromPubkey","publicKey","ComputeBudgetProgram","setComputeUnitLimit","units","setComputeUnitPrice","microLamports","Math","ceil","latestBlockhashAndContext","getLatestBlockhashAndContext","commitment","testVersionedTx","VersionedTransaction","TransactionMessage","instructions","payerKey","recentBlockhash","value","blockhash","compileToV0Message","simulationResult","simulateTransaction","replaceRecentBlockhash","sigVerify","sign","unitsConsumed","trunc","versionedTx","signature","sendRawTransaction","serialize","confirmTransaction","console","log","error","MAX_RETRIES","Error","JSON","stringify","sleep","readFile","LAMPORTS_PER_SOL","collectSOL","__name","rpcUrl","mainnetValidatorAuthorityKey","mainnetValidatorKey","getAllKeyPaths","getBalance","KeyType","VOTE","console","log","chalk","white","spawnSync","shell","stdio","validatorTransferableBalance","getHarvestBalance","transferLamports","LAMPORTS_PER_SOL","toAddress","execSync","toString","trim","fromWalletKey","JSON","parse","readFile","solanaTransfer","readFile","inquirer","chalk","execSync","homedir","getElSOLBalance","__name","rpcUrl","home","homedir","mainnetValidatorAuthorityKey","getAllKeyPaths","cmd","ELSOL_MINT_ADDRESS","balance","execSync","toString","trim","Number","error","console","log","chalk","red","yellow","white","getElSOLBalance_default","chalk","Connection","PublicKey","Keypair","ComputeBudgetProgram","VersionedTransaction","TransactionMessage","getOrCreateAssociatedTokenAccount","createTransferInstruction","TOKEN_PROGRAM_ID","transferSPLToken","__name","endpoint","fromWalletKey","toAddressPubkey","amount","tokenMintAddress","tokenDecimals","connection","Connection","fromWallet","Keypair","fromSecretKey","Uint8Array","toPubkey","PublicKey","mintPubkey","amountInSmallestUnit","Math","trunc","pow","fromTokenAccount","getOrCreateAssociatedTokenAccount","publicKey","toTokenAccount","testInstructions","createTransferInstruction","address","TOKEN_PROGRAM_ID","ComputeBudgetProgram","setComputeUnitLimit","units","setComputeUnitPrice","microLamports","ceil","latestBlockhashAndContext","getLatestBlockhashAndContext","commitment","testVersionedTx","VersionedTransaction","TransactionMessage","instructions","payerKey","recentBlockhash","value","blockhash","compileToV0Message","simulationResult","simulateTransaction","replaceRecentBlockhash","sigVerify","sign","unitsConsumed","versionedTx","signature","sendRawTransaction","serialize","confirmTransaction","console","log","error","inquirer","spawnSync","chalk","promises","fs","removeCronJob","__name","cronPattern","crontabResult","spawnSync","encoding","status","console","log","chalk","red","process","exit","newCronBody","stdout","split","filter","line","includes","join","tempCrontabFile","fs","writeFile","unlink","green","error","removeCronJob_default","chalk","mevOn","__name","config","isTestnet","NETWORK","Network","TESTNET","ask","inquirer","prompt","type","name","message","default","hasEpochTimer","removeCronJob","updateDefaultConfig","IS_MEV_MODE","AUTO_UPDATE","AUTO_RESTART","autoText","chalk","green","console","log","white","askIfAuto","rpcUrl","RPC_URL","harvestAddress","ask2","DISCORD_WEBHOOK_URL","HARVEST_ACCOUNT","discordWebhookUrl","autoUpdate","autoRestart","mevOn_default","spawnSync","Connection","Connection","getAverageSlotTime","__name","rpcUrl","sampleCount","fallbackSlotTime","samples","Connection","getRecentPerformanceSamples","length","console","warn","validSamples","filter","sample","numSlots","reduce","acc","samplePeriodSecs","error","getAverageSlotTime_default","getEpochInfo","__name","rpcUrl","epochInfo","Connection","slotsInEpoch","Error","timePerSlotSeconds","getAverageSlotTime","console","log","estimatedSecondsUntilNextEpoch","slotIndex","displayRatio","toFixed","days","Math","floor","hours","minutes","seconds","estimatedTimeUntilNextEpoch","error","MINIMUM_AUTHORITY_BALANCE","harvestCommands","__name","config","program","command","alias","description","action","harvestAddress","getHarvestAddress","mainnetValidatorAuthorityKey","getAllKeyPaths","console","log","collectSOL","RPC_URL","voteBalance","getBalance","KeyType","VOTE","retryCount","sleep","fromWalletKey","JSON","parse","readFile","authorityBalance","AUTH","chalk","white","convertibleBalance","Math","round","elSOLdeposit","SOLV_STAKE_POOL_ADDRESS","Error","elSOLBalance","getElSOLBalance","epoch","getEpochInfo","msg","sendDiscord","process","exit","transferSPLToken","ELSOL_MINT_ADDRESS","ELSOL_DECIMALS","IS_MEV_MODE","getSolanaAddress","green","mevOn","spawnSync","stdio","shell","HARVEST_ACCOUNT","answer","inquirer","prompt","type","name","message","validate","validateSolanaKey","updateDefaultConfig","format","writeFile","writeEpochDataToFile","__name","epochData","writeFile","EPOCH_TIMER_FILE_PATH","JSON","stringify","writeEpochDataToFile_default","isLessThan1Day","__name","totalMinutes","epochData","currentEpoch","config","writeEpochDataToFile","lessThan1Day_default","lessThan8Hour","__name","totalMinutes","epochData","currentEpoch","config","isLessThan8Hours","writeEpochDataToFile","lessThan8Hour_default","lessThan1Hour","__name","totalMinutes","epochData","currentEpoch","config","isLessThan1Hour","writeEpochDataToFile","lessThan1Hour_default","newEpoch","__name","currentEpoch","config","isTestnet","NETWORK","Network","TESTNET","params","epoch","isLessThan1Hour","isLessThan8Hours","isLessThan1Day","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","address","getSolanaAddress","writeEpochDataToFile","console","log","content","newEpoch_default","existsAsync","readFile","writeFile","chalk","homedir","initOrReadEpochFile","__name","epochFilePath","homedir","includes","EPOCH_TIMER_FILE_PATH","existsAsync","JSON","parse","readFile","initialData","epoch","isLessThan1Hour","isLessThan8Hours","isLessThan1Day","writeFile","stringify","console","log","chalk","white","initEpochFile_default","chalk","checkBalance","__name","config","rpcUrl","RPC_URL","isTestnet","NETWORK","Network","TESTNET","SOLANA_TESTNET_RPC_URL","getBalance","KeyType","VALIDATOR","MINIMUM_VALIDATOR_BALANCE","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","address","getSolanaAddress","msg","sendDiscord","console","log","chalk","green","checkBalance_default","getNpmLatestVersion","packageName","url","response","fetch","ok","Error","status","json","latest","error","console","getNpmLatestVersion_default","isVersionSame","solvVersion","getSolvVersion","latestVersion","getNpmLatestVersion","Error","console","log","isVersionSame_default","spawnSync","spawnSync","getEpochInfoByRust","__name","rpcUrl","cmd","stdout","spawnSync","shell","stdio","splitedLine","toString","split","epochCompletedTime","find","line","includes","epochCompletedPercent","replace","epoch","Number","Error","remainingTime","console","log","timeRegex","match","day","parseInt","hour","min","sec","totalMinutes","Math","floor","epochRemainingTime","error","epochTimer","__name","config","isTestnet","NETWORK","Network","TESTNET","rpcUrl","SOLANA_TESTNET_RPC_URL","RPC_URL","now","format","Date","console","log","getD1Epoch","initOrReadEpochFile","currentEpoch","getEpochInfoByRust","mainnetValidatorVoteKey","testnetValidatorVoteKey","getAllKeyPaths","isActive","isValidatorActive","getSolanaAddress","voteAccountKey","checkBalance","isVersionSame","AUTO_UPDATE","spawnSync","stdio","shell","epoch","newEpoch","totalMinutes","checks","lessThan1Hour","lessThan8Hour","isLessThan1Day","check","epochTimer_default","epochTimerCommands","__name","config","program","command","description","action","epochTimer","process","exit","inquirer","join","spawnSync","chalk","spawnSync","scpSSH","__name","ip","cmd","user","stdio","sshKeyPath","scpSSHResult","result","spawnSync","shell","status","console","log","stdout","String","stderr","toString","error","scpSSH_default","chalk","checkValidatorKey","__name","validatorKeyPath","ip","user","console","log","chalk","white","localValidatorIdentityAddress","getSolanaAddress","trim","destinationValidatorIdentityAddress","scpSSH","stdout","toString","yellow","checkValidatorKey_default","AGAVE_CLI","FD_CLI","FC_CLI_CONFIG","getSolanaCLIActive","__name","client","getSolanaCLIActive_default","AGAVE_CLI","getSolanaCLIAgave","__name","error","console","getSolanaCLIAgave_default","chalk","getRemoteClientType","__name","ip","user","console","log","chalk","white","configResult","scpSSH","status","client","validatorType","ValidatorType","AGAVE","success","error","JSON","parse","stdout","VALIDATOR_TYPE","FRANKENDANCER","JITO","green","yellow","String","readFile","chalk","existsSync","getLocalClientType","__name","console","log","chalk","white","configPath","existsSync","client","validatorType","ValidatorType","AGAVE","success","error","configContent","readFile","JSON","parse","VALIDATOR_TYPE","FRANKENDANCER","JITO","green","yellow","String","unstakedKeyPath","join","SOLV_HOME","UNSTAKED_KEY","identityKeyPath","IDENTITY_KEY","changeIdentityIncoming","__name","ip","pubkey","config","user","safe","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","validatorKeyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","localClientResult","getLocalClientType","remoteClientResult","getRemoteClientType","localClient","success","client","remoteClient","console","log","chalk","green","localSolanaClient","localSolanaClientConfig","getSolanaCLIActive","remoteSolanaClient","remoteSolanaClientConfig","agaveSolanaClient","getSolanaCLIAgave","checkValidatorKey","white","restartWindowCmd","spawnSync","shell","stdio","status","yellow","setIdentityCmd","LEDGER_PATH","IDENTITY_KEY_PATH","updateDefaultConfig","IS_DUMMY","join","chalk","spawnSync","unstakedKeyPath","join","SOLV_HOME","UNSTAKED_KEY","identityKeyPath","IDENTITY_KEY","sshKeyPath","changeIdentityOutgoing","__name","ip","pubkey","config","user","safe","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","validatorKeyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","localClientResult","getLocalClientType","remoteClientResult","getRemoteClientType","localClient","success","client","remoteClient","console","log","chalk","green","localSolanaClient","localSolanaClientConfig","getSolanaCLIActive","remoteSolanaClient","remoteSolanaClientConfig","agaveSolanaClient","getSolanaCLIAgave","checkValidatorKey","step1","step2","step3","step4","LEDGER_PATH","step5","step6","IDENTITY_KEY_PATH","white","spawnSync","shell","stdio","status","yellow","cmd5","cmd6","updateDefaultConfig","IS_DUMMY","spawnSync","checkSSHConnection","ip","user","cmd","spawnSync","shell","stdio","status","chalk","join","spawnSync","chalk","unstakedKeyPath","join","SOLV_HOME","UNSTAKED_KEY","identityKeyPath","IDENTITY_KEY","changeIdentityIncomingV1toV2","__name","ip","pubkey","config","user","safe","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","validatorKeyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","checkValidatorKey","solanaClient","SOLANA_VALIDATOR","agaveClient","AGAVE_VALIDATOR","console","log","chalk","white","restartWindowCmd","LEDGER_PATH","spawnSync","shell","stdio","status","yellow","setIdentityCmd","IDENTITY_KEY_PATH","updateDefaultConfig","IS_DUMMY","SWITCH_TYPES","switchCommand","__name","program","config","command","option","description","action","options","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","isSafe","unsafe","keyPath","TESTNET_VALIDATOR_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","user","pubkey","getSolanaAddress","switchType","ip","answer","inquirer","prompt","name","type","message","choices","default","includes","console","log","chalk","yellow","checkSSHConnection","v2MigrateIncoming","confirm","cyan","process","exit","white","changeIdentityIncomingV1toV2","changeIdentityIncoming","changeIdentityOutgoing","error","red","spawnSync","createSnapshot","__name","slot","ledgerPath","LEDGER_PATH","snapshotPath","SNAPSHOTS_PATH","cmd","console","log","result","spawnSync","shell","stdio","cwd","status","Error","error","createSnapshot_default","inquirer","dotenv","chalk","TokenInfo","SOL","tokenMint","associationAccount","decimal","USDC","elSOL","ELSOL_TOKEN_MINT","JitoSOL","mSOL","bSOL","EPCT","JUP","BONK","JTO","TokenInfoByMint","So11111111111111111111111111111111111111112","symbol","SOL_TOKEN_MINT","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","USDC_TOKEN_MINT","ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC","J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn","mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So","bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1","CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP","JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN","DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL","readFile","Connection","Keypair","VersionedTransaction","chalk","inquirer","dotenv","getJupiterQuote","__name","jupiterEndpoint","apiKey","inputMint","outputMint","inputAmountLamport","url","result","fetch","method","headers","Authorization","status","json","error","Error","getJupiterQuote_default","postJupiterSwap","__name","jupiterEndpoint","jupiterApiKey","quoteResponse","fromWalletPubkey","outputMint","swapBody","associationAccount","AssociationAccount","swapRequest","userPublicKey","feeAccount","dynamicComputeUnitLimit","prioritizationFeeLamports","dynamicSlippage","maxBps","url","result","fetch","method","headers","Authorization","body","JSON","stringify","status","json","error","Error","postJupiterSwap_default","dotenv","config","swap","__name","solanaRpcUrl","jupiterEndpoint","JupiterApiKey","keyfilePath","inputMint","outputMint","inputAmountLamport","isNeedConfirm","connection","Connection","quoteResponse","getJupiterQuote","includes","console","error","chalk","yellow","log","white","WEB_VALIDATORS_SOLUTIONS","process","exit","msg","inputTokneInfo","TokenInfoByMint","outputTokenInfo","symbol","Math","pow","decimal","Number","outAmount","gray","confirm","inquirer","prompt","type","name","message","default","cyan","fromWalletKey","JSON","parse","readFile","fromWallet","Keypair","fromSecretKey","Uint8Array","Array","from","swapResponse","postJupiterSwap","publicKey","toString","swapTransactionBuf","Buffer","swapTransaction","transaction","VersionedTransaction","deserialize","sign","rawTransaction","serialize","txid","sendRawTransaction","skipPreflight","maxRetries","blockhash","recentBlockhash","confirmTransaction","lastValidBlockHeight","signature","dotenv","config","swapCommand","__name","program","command","description","option","action","options","swapCmd","RPC_URL","KEYPAIR_PATH","API_KEY","input","output","Number","amount","skipConfirm","initConfig","error","message","includes","console","chalk","cyan","process","exit","red","solanaRpcUrl","keyfilePath","jupiterApiKey","inputMint","outputMint","inputAmountLamport","isNeedConfirm","log","white","askForConfig","jupiterEndpoint","JUPITER_ENDPOINT","inputTokenChoice","SWAP_TOKENS","inputTokenAdress","inputTokenSymbol","outputTokenAdress","inputAmount","inputToken","inquirer","prompt","type","name","choices","default","SOL_TOKEN_MINT","USDC_TOKEN_MINT","address","TokenInfo","tokenMint","filter","item","outputToken","ELSOL_MINT_ADDRESS","tokenName","inputAmountPrompt","txid","swap","SOLV_SWAP","green","askForConfig","__name","config","inquirer","prompt","type","name","message","default","updateDefaultConfig","console","log","chalk","green","rpcLog","spawnSync","jupiterStatus","__name","spawnSync","shell","stdio","spawnSync","jupiterStart","__name","spawnSync","shell","stdio","spawnSync","jupiterStop","__name","spawnSync","shell","stdio","spawnSync","jupiterRestart","__name","spawnSync","shell","stdio","spawnSync","jupiterLog","__name","error","spawnSync","shell","stdio","spawnSync","jupiterEnable","__name","spawnSync","shell","stdio","jupiterCommands","__name","jupiter","program","command","description","action","jupiterStatus","jupiterStart","jupiterStop","option","options","jupiterLog","error","process","exit","jupiterRestart","jupiterEnable","chalk","spawnSync","getSolanaVersion","__name","stdout","spawnSync","shell","String","trim","getSolanaVersion_default","program","Command","name","description","helpOption","version","VERSION","main","config","readConfig","startCommand","restartCommand","stopCommand","statusCommands","updateCommands","logCommands","installCommands","stakeCommands","getCommands","scpCommands","cronCommands","setupCommands","balanceCommands","mountCommands","relayerCommands","transferCommands","withdrawCommands","harvestCommands","dfCommands","swapCommand","epochTimerCommands","switchCommand","jupiterCommands","command","action","rmLogs","rmSnapshot","option","LEDGER_PATH","SNAPSHOTS_PATH","options","console","log","chalk","white","createSnapshot","slot","ledger","snapshots","alias","monitorSolana","solanaCatchup","showConfig","getSolanaVersion","addHelpCommand","parseAsync","process","argv","exit","error"]}