@gabrielhicks/solv 5.5.21 → 5.5.23

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/config/versionConfig.ts","../src/cli/update/index.ts","../src/config/langs.ts","../src/config/config.ts","../src/cli/update/updateSolv.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/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/update/frankendancerUpdate.ts","../src/cli/setup/template/firedancer/mod.ts","../src/cli/update/bamUpdate.ts","../src/template/startupScripts/startTestnetValidatorScript.ts","../src/lib/solana/splBalance.ts","../src/cli/balance/index.ts","../src/lib/getSolBalance.ts","../src/template/startupScripts/startMainnetValidatorScript.ts","../src/template/startupScripts/startTestnetAgaveValidatorScript.ts","../src/template/startupScripts/startJitoTestnetScript.ts","../src/template/startupScripts/startBamTestnetScript.ts","../src/config/jitConfig.ts","../src/lib/readOrCreateJitoConfig.ts","../src/template/startupScripts/startJitoMainnetScript.ts","../src/template/startupScripts/startBamMainnetScript.ts","../src/cli/setup/updateStartupScriptPermission.ts","../src/cli/setup/updateLogrotate.ts","../src/template/logRotates.ts","../src/cli/setup/setupLogrotate.ts","../src/cli/setup/rmLogs.ts","../src/cli/setup/restartLogrotate.ts","../src/lib/restartFiredancer.ts","../src/cli/setup/syncFirewall.ts.ts","../src/lib/enableSolv.ts","../src/template/solvService.ts","../src/cli/setup/setupSolvService.ts","../src/lib/startSolv.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/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/template/startupScripts/startRPCNodeScript.ts","../src/cli/install/installSolana.ts","../src/cli/setup/validator/index.ts","../src/cli/install/installBam.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/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/cli/setup/setupFiredancerService.ts","../src/cli/setup/makeServices.ts","../src/cli/setup/setupKeys.ts","../src/cli/get/snapshot.ts","../src/cli/start/startSolana.ts","../src/cli/setup/setupCpuGovernor.ts","../src/template/updateSysctlConfig.ts","../src/lib/restartLogrotate.ts","../src/cli/setup/createSymLink.ts","../src/utils/rpcLog.ts","../src/lib/enableFiredancer.ts","../src/lib/disableFiredancer.ts","../src/lib/disableSolv.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/cli/logrotate/index.ts","../src/cli/setup/rmSnapshot.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/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 logrotateCommand,\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 logrotateCommand(config)\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.5.21\",\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 \"overrides\": {\n \"chalk\": \"5.3.0\",\n \"strip-ansi\": \"7.1.0\",\n \"color-convert\": \"2.0.1\",\n \"color-name\": \"1.1.4\",\n \"is-core-module\": \"2.13.1\",\n \"error-ex\": \"1.3.2\",\n \"has-ansi\": \"5.0.1\"\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\nexport const TESTNET_KNOWN_VALIDATORS = [\n 'adreoi6W1MGA7eegERNcQTwQH3UuJaAnWjVZEq2cxcF',\n 'naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi',\n 'th734sEwvZZ5XfemLcvo6TXepPfawWBjz3HMYeQdhPi',\n 'BAPExw4zFmwSUjyPfQorenucofeafHLUetcoWTB4Gwnt',\n 'bay3c7G89NTxSULyM45gqJx3JoWtBBeXHvifCywwiwZ',\n 'BeRTyZTveVQsekrF63WhFvfGiABThym95x8uZaicDPgo',\n 'EF8o3aQnu853EEPJKUfqAgoa8szkVs28sv64xtBrRPSV',\n 'chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL',\n 'GsVJ62qt2nbRLT4f67LAo6Ve8eGhChJquYaK3wT1iG2v',\n 'ctz4yB16kvGiMrA4vdtKXEMYgkkfJLo6hMwDk9DZ3Vf',\n 'PARaNF4kcQW3BmaeMD3ELLAqUV7MDS8bMudaCEZ72NM',\n 'dedxpgLN1VXLHpekKra1JKkMGrw7tW1uuYz7Ec28iLK',\n 'DegEnNCbn6PrsvHvsErneRNv7KFTwnjW3uFVjf43e28v',\n 'Dcky7CK3aEHzdV9EF5YR1NaTJ9QfSyzW5cACbqEFKZNv',\n 'dksYs1gzQ7FzqyadN5XtcaeVbqKSN7X2SpfN3fcUW7G',\n 'dstCt4sDCQx1QFFJekmM5RjyFLsDRkaEjTgXd5gbpDB',\n 'eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK',\n 'ExCHpAsqeaDJGfUj41bhU2BuZK4fhRnJKvhG486rfKg',\n 'farmoWMKdJBxLxhMZpgU1uVjvjVJnQqrGhwAyDmcn8R',\n 'G1EaM8gLQU7DifPnCTQKP2PLvFf63tHvaXBAR8QFLg5Z',\n 'goJirTtcRjP6Wqkw7cHNvzjEva5rpvPDtj2ZnEmPAr6',\n 'wetfCN7bhjhBT8GTSAnah8ftoRoHB8H8Q87KkxDdRgK',\n '8H6qQ2FKUjY8wmggSKHUENY38Nr9sQxDUbEZB6fiCHSX',\n 'hy1oTqvrknqoNmPWq2JtQMdDDnWkEGH2ab7N4r4rnJJ',\n 'jntrbAHjcxhP2eRUgCSACb6cMVhYm3jEQ3eQDZKicmz',\n 'akicJSdNFWszP2Le38t1NtVeywXtvoxdiGciaELwZHz',\n '1i1yarXXz55VdvVL4v2HXcjMJPAv4fWJhY8x43bmwfL',\n 'LoV31z7KC5CZ8sdGovmRSDGB6csP1fJip1hiM7xDozw',\n 'magiCagux3C7nMKo2jKSbX6yWzYWMGKJ6ABRnw1zQ8U',\n 'JAfBCSxx2fZwdM5wTiLRAfJm3MpqXz3KnxjPhCQixGVh',\n 'mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe',\n 'phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1',\n 'pineBbb5K6SdV6KG1xibsR5DM1XsWuajtXSy3YYGY4N',\n 'prt1stdbFCFXpEcx9rxwJK63zhYo43V5JCXzGWXkPGn',\n 'rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg',\n 'rapTWQhZD2dPjJ91BXW4UnVKBt6NvX2aZxWSSYg66Y4',\n 'royLQKzrsSs9VbMZMDjZkMM8j3buBnwx7oH3wdifAk4',\n 'CitYBuKSE5W6CXEBAgY1B9fEMUdHXYSmZbXbAWd31Cr',\n 'axyaGn2eZM1dnDCagpd9aYa92gKWTrtEYb8vwc21ddr',\n 'sTeV1NswjBBo15qosoyQj1aYrgvoxomAduN1zFV6gCf',\n 'txtXxyX13G7h899vnZwNJsVRAMfWcwYZNT3jucRqqiW',\n 'hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M',\n 'te1emnh77qnpsdjcCi9FsyX8t4gf4HYWC4kTVHuH4MQ',\n 'tstidz7tN8armqvZ7ia2ck62mY9RD2BrwMtW2w8hcwk',\n 'vnd1sXYmA8YY9xHQBkKKurZeq7iCe6EQ9bGYNZJwh1c',\n 'YE11vEiXKKx95onU1EpjgwrHovgXamRTQvY52Mvde8i',\n '5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on',\n]\n\nexport const MAINNET_KNOWN_VALIDATORS = [\n 'adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ',\n 'nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC',\n 'BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP',\n 'b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF',\n 'chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1',\n 'chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe',\n 'CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP',\n 'parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz',\n 'dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S',\n 'DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup',\n 'dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH',\n 'eyeY8HangkSYirSBtopAfThXzhHL855wPnddz8WnemV',\n 'ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD',\n 'G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN',\n 'wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo',\n 'hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o',\n 'hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu',\n 'jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA',\n 'NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk',\n '1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i',\n 'Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s',\n 'MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV',\n 'D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e',\n 'mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk',\n 'phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2',\n 'pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw',\n 'prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW',\n 'radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9',\n 'rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC',\n 'RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4',\n 'ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj',\n 'axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4',\n 'sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu',\n 'TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ',\n 'hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj',\n 'te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY',\n 'UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL',\n 'vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd',\n 'YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV',\n 'Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24',\n '7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2',\n 'GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ',\n 'CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S',\n]\n","import { LEDGER_PATH } from '@/config/constants'\nimport { spawnSync } from 'child_process'\nimport installAgave from '../install/installAgave'\nimport getSolanaCLI from '@/config/getSolanaCLI'\nimport { AGAVE_PATCH } from '@/config/versionConfig'\n\nexport const updateVersion = async (version: string, mod = false, isMajorThree = false) => {\n const agavePatch = AGAVE_PATCH;\n const agaveTagBase = `v${version}`\n const agaveTag = `${agaveTagBase}${agavePatch}`\n installAgave(agaveTag, mod, isMajorThree)\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} --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, isMajorThree = false) => {\n if(isMajorThree) {\n if(mod) {\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version}-agave-mod /home/solv/.local/share/solana/install/active_release`,\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 } else {\n spawnSync(`mkdir /tmp/${version}-agave`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${version}-agave`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${version}-agave`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${version}-agave checkout ${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${version}-agave submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${version}-agave rev-parse HEAD) /tmp/${version}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${version}-agave`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version}-agave /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${version}-agave`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/${version}-mod/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.anza.xyz/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\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","export const VERSION_TESTNET = '3.1.2'\nexport const VERSION_MAINNET = '3.0.11'\nexport const AGAVE_PATCH = ''\nexport const VERSION_JITO_TESTNET = '3.1.2'\nexport const VERSION_JITO_MAINNET = '3.0.11'\nexport const JITO_PATCH = ''\nexport const VERSION_BAM_TESTNET = '3.0.11'\nexport const VERSION_BAM_MAINNET = '3.0.11'\nexport const BAM_PATCH = ''\nexport const VERSION_JITO_RPC = '3.1.2'\nexport const VERSION_SOLANA_RPC = '3.0.11'\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.804.30008'\nexport const VERSION_FIREDANCER = '0.714.30008'\nexport const FIREDANCER_PATCH = ''","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 BAM_PATCH,\n DELINQUENT_STAKE_MAINNET,\n DELINQUENT_STAKE_TESTNET,\n JITO_PATCH,\n VERSION_BAM_MAINNET,\n VERSION_BAM_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'\n// import { getSnapshot } from '../get/snapshot'\nimport { frankendancerUpdate } from './frankendancerUpdate'\nimport { bamUpdate } from './bamUpdate'\nimport { STARTUP_SCRIPT } from '@/config/constants'\nimport { startTestnetValidatorScript } from '@/template/startupScripts/startTestnetValidatorScript'\nimport { startMainnetValidatorScript } from '@/template/startupScripts/startMainnetValidatorScript'\nimport { startTestnetAgaveValidatorScript } from '@/template/startupScripts/startTestnetAgaveValidatorScript'\nimport { startJitoTestnetScript } from '@/template/startupScripts/startJitoTestnetScript'\nimport { startBamTestnetScript } from '@/template/startupScripts/startBamTestnetScript'\nimport { writeFile } from 'node:fs/promises'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { startJitoMainnetScript } from '@/template/startupScripts/startJitoMainnetScript'\nimport { startBamMainnetScript } from '@/template/startupScripts/startBamMainnetScript'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\nimport { updateLogrotate } from '../setup/updateLogrotate'\nimport { restartFiredancer } from '@/lib/restartFiredancer'\nimport { syncFirewall } from '../setup/syncFirewall.ts'\nimport { enableSolv } from '@/lib/enableSolv'\nimport { setupSolvService } from '../setup/setupSolvService'\nimport { startSolv } from '@/lib/startSolv'\n// import { 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 startup: boolean\n service: 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 isBam = config.VALIDATOR_TYPE === ValidatorType.BAM\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 (isBam) {\n version = VERSION_BAM_MAINNET\n if (isTestnet) {\n version = VERSION_BAM_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 .option('--startup', 'Start up Script', false)\n .option('--service', 'SystemD Service', 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 if (options.service) {\n await syncFirewall()\n updateLogrotate(isFrankendancer)\n setupSolvService(isTestnet)\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 XDP: false,\n ZERO_COPY: 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 if (isBam) {\n const bamVersion = isTestnet\n ? VERSION_BAM_TESTNET\n : VERSION_BAM_MAINNET\n await updateJitoSolvConfig({\n version: bamVersion,\n tag: `v${bamVersion}`,\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 if (options.startup) {\n const validatorType = config.VALIDATOR_TYPE\n let startupScript = ''\n switch (validatorType) {\n case ValidatorType.SOLANA:\n startupScript = isTestnet ? startTestnetValidatorScript() : startMainnetValidatorScript(config)\n break\n case ValidatorType.AGAVE:\n startupScript = isTestnet ? startTestnetAgaveValidatorScript(config) : startMainnetValidatorScript(config)\n break\n case ValidatorType.JITO:\n const jitoConfig = await readOrCreateJitoConfig()\n startupScript = isTestnet ? startJitoTestnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n ) : startJitoMainnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n case ValidatorType.BAM:\n const bamConfig = await readOrCreateJitoConfig()\n startupScript = isTestnet ? \n startBamTestnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n :\n startBamMainnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n break\n default:\n console.log('Unknown Validator Type for Update Script')\n break\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n return\n }\n if (options.background) {\n let version = options.version\n let isMajorThree = version.startsWith(\"3\") ? true : false;\n await updateDefaultConfig({\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n })\n if (isTestnet) {\n await syncFirewall()\n }\n updateLogrotate(isFrankendancer)\n setupSolvService(isTestnet)\n if (isJito) {\n const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${version}-jito`\n const jitoModBase = `v${version}-mod`\n const jitoTag = options.mod || isModded ? `${jitoModBase}${jitoPatch}` : `${jitoTagBase}${jitoPatch}`\n jitoUpdate(jitoTag, options.mod || isModded, isMajorThree)\n await updateJitoSolvConfig({ version, tag: `v${version}` })\n await monitorUpdate(deliquentStake, true, minIdleTime)\n enableSolv()\n startSolv()\n return\n }\n if (isBam) {\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${version}-bam`\n const bamModBase = `v${version}-mod`\n const bamTag = options.mod || isModded ? `${bamModBase}${bamPatch}` : `${bamTagBase}${bamPatch}`\n bamUpdate(bamTag, options.mod || isModded, isMajorThree)\n await updateJitoSolvConfig({ version, tag: `v${version}` })\n await monitorUpdate(deliquentStake, true, minIdleTime)\n enableSolv()\n startSolv()\n return\n }\n if (isFrankendancer) {\n await frankendancerUpdate(config, version, options.mod || isModded)\n await monitorUpdate(deliquentStake, true, minIdleTime)\n restartFiredancer()\n return\n }\n\n await updateVersion(version, options.mod || isModded, isMajorThree)\n const deliquentStakeNum = isTestnet\n ? DELINQUENT_STAKE_TESTNET\n : DELINQUENT_STAKE_MAINNET\n\n await monitorUpdate(deliquentStakeNum, true, minIdleTime)\n enableSolv()\n startSolv()\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 = false\nexport const FD_RESTART_REQUIRED_MAINNET = false\nexport const FD_RESTART_REQUIRED_TESTNET = false\nexport const BAM_RESTART_REQUIRED_MAINNET = false\nexport const BAM_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 XDP: boolean\n ZERO_COPY: 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.1.2',\n MAINNET_SOLANA_VERSION: '3.0.10',\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 XDP: false,\n ZERO_COPY: 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","import { spawnSync } from 'child_process'\n\nexport const jitoUpdate = (tag: string, mod = false, isMajorThree = false) => {\n // Update DZ\n spawnSync(\n `sudo apt install --only-upgrade doublezero doublezero-solana -y`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `sudo systemctl restart doublezerod`,\n { shell: true, stdio: 'inherit' },\n )\n if (isMajorThree) {\n if (mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\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 clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${tag}`,\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${tag} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${tag}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\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 BAM = 'bam',\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","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 XDP: false,\n ZERO_COPY: 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 BAM_RESTART_REQUIRED_TESTNET,\n BAM_RESTART_REQUIRED_MAINNET,\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 isBam = config.VALIDATOR_TYPE === ValidatorType.BAM\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 if (isBam) {\n isUpdateRequired = isMainnet\n ? BAM_RESTART_REQUIRED_MAINNET\n : BAM_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` + `_ _`\n await sendDiscord(msg)\n try {\n spawnSync(`solv update && solv update --config && solv update --startup && sudo systemctl daemon-reload && 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 const timestampRestart = Math.floor(Date.now() / 1000)\n const restartMsg = `**${address}** has restarted, catching up...\\n` + `at: <t:${timestampRestart}> (${timestampRestart})\\n` + `_ _`\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 // epoch seconds when catchup completes\n const timestampCatchup = Math.floor(Date.now() / 1000)\n\n const diffSeconds = timestampCatchup - timestampRestart\n const minutes = Math.floor(diffSeconds / 60)\n const seconds = diffSeconds % 60\n const durationStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`\n const msg = `**${address}** has caught up!\\n` + `at: <t:${timestampRestart}> (${timestampRestart})\\n` + `**${address}** took **${durationStr}** to catch up after restart!\\n` + `_ _`\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 = 30\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 { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { promises as fs } from 'fs'\nimport path from 'path';\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport modDiff from '../setup/template/firedancer/mod';\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 const {filePath: modFilePath, body: modDiffContent} = modDiff();\n // Update and restart DZ\n spawnSync(\n `sudo apt install --only-upgrade doublezero doublezero-solana -y`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `sudo systemctl restart doublezerod`,\n { shell: true, stdio: 'inherit' },\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}`,\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 spawnSync(\n `git -C /home/solv/firedancer config --global user.email \"you@example.com\"`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer config --global user.name \"Your Name\"`,\n { shell: true, stdio: 'inherit' },\n )\n await fs.mkdir(path.dirname(modFilePath), { recursive: true });\n await fs.writeFile(modFilePath, modDiffContent, \"utf8\");\n spawnSync(`sudo chown solv:solv \"${modFilePath}\"`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /home/solv/firedancer apply ${modFilePath}`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git -C /home/solv/firedancer add /home/solv/firedancer/src/*`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git -C /home/solv/firedancer add /home/solv/firedancer/book/*`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git -C /home/solv/firedancer commit -m \"add mods\"`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\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 // 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 spawnSync(\n `sudo systemctl restart port-relay`,\n { shell: true, stdio: 'inherit' },\n )\n\n spawnSync(`sudo systemctl disable solv.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop solv.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n","const modDiff = () => {\n const filePath = '/home/solv/firedancer/mod.diff'\n const body = String.raw`diff --git a/src/app/fdctl/commands/run_agave.c b/src/app/fdctl/commands/run_agave.c\nindex 1cfd98e148a..e2a347164c4 100644\n--- a/src/app/fdctl/commands/run_agave.c\n+++ b/src/app/fdctl/commands/run_agave.c\n@@ -37,7 +37,8 @@ clone_labs_memory_space_tiles( config_t * config ) {\n !strcmp( wksp->name, \"metric_in\" ) ||\n !strcmp( wksp->name, \"bank\" ) ||\n !strcmp( wksp->name, \"poh\" ) ||\n- !strcmp( wksp->name, \"store\" ) ) ) {\n+ !strcmp( wksp->name, \"store\" ) ||\n+ !strcmp( wksp->name, \"leader_state\" ) ) ) {\n fd_topo_join_workspace( &config->topo, wksp, FD_SHMEM_JOIN_MODE_READ_WRITE );\n }\n }\ndiff --git a/src/app/fdctl/config/default.toml b/src/app/fdctl/config/default.toml\nindex 9c3c5ed0a9b..475f4958f75 100644\n--- a/src/app/fdctl/config/default.toml\n+++ b/src/app/fdctl/config/default.toml\n@@ -814,6 +814,21 @@ dynamic_port_range = \"8900-9000\"\n # very high TPS rates because the cluster size will be very small.\n shred_tile_count = 1\n \n+ # Enable low power mode for tiles to reduce CPU usage when idle.\n+ #\n+ # By default, Firedancer is designed to maximize performance by\n+ # dedicating CPU cores exclusively to each tile, spinning continuously\n+ # to minimize latency. This ensures the fastest possible response to\n+ # incoming work and is optimal for low-latency, high-throughput environments.\n+ #\n+ # In contrast, this option allows tiles to sleep after detecting inactivity\n+ # rather than continuously spinning for new work. This significantly reduces\n+ # power consumption and CPU usage but introduces a slight latency overhead.\n+ # Enable this if power efficiency is a priority.\n+ #\n+ # The default is false to maintain optimal performance.\n+ low_power_mode = false\n+\n # All memory that will be used in Firedancer is pre-allocated in two\n # kinds of pages: huge and gigantic. Huge pages are 2 MiB and gigantic\n # pages are 1 GiB. This is done to prevent TLB misses which can have a\ndiff --git a/src/app/fdctl/topology.c b/src/app/fdctl/topology.c\nindex 64b77824372..3598a9a580f 100644\n--- a/src/app/fdctl/topology.c\n+++ b/src/app/fdctl/topology.c\n@@ -42,6 +42,7 @@ fd_topo_initialize( config_t * config ) {\n fd_topo_t * topo = { fd_topob_new( &config->topo, config->name ) };\n topo->max_page_size = fd_cstr_to_shmem_page_sz( config->hugetlbfs.max_page_size );\n topo->gigantic_page_threshold = config->hugetlbfs.gigantic_page_threshold_mib << 20;\n+ topo->low_power_mode = config->layout.low_power_mode;\n \n /* topo, name */\n fd_topob_wksp( topo, \"metric_in\" );\n@@ -352,6 +353,26 @@ fd_topo_initialize( config_t * config ) {\n }\n }\n \n+ /* Leader state fseq for low-power mode.\n+ Signals whether validator is currently leader (1) or not (0). PoH tile\n+ writes when leader status changes; other tiles read to determine if they\n+ should sleep when idle. Enables power savings while maintaining peak\n+ performance during leader slots. */\n+\n+ if( FD_UNLIKELY( topo->low_power_mode ) ) {\n+ fd_topob_wksp( topo, \"leader_state\" );\n+ fd_topo_obj_t * leader_state_obj = fd_topob_obj( topo, \"fseq\", \"leader_state\" );\n+ for( ulong i=0UL; i<topo->tile_cnt; i++ ) {\n+ if( FD_UNLIKELY( topo->tiles[i].idle_sleep ) ) {\n+ if( FD_UNLIKELY( !strcmp(topo->tiles[i].name, \"poh\") ) )\n+ fd_topob_tile_uses(topo, &topo->tiles[i], leader_state_obj, FD_SHMEM_JOIN_MODE_READ_WRITE);\n+ else\n+ fd_topob_tile_uses(topo, &topo->tiles[i], leader_state_obj, FD_SHMEM_JOIN_MODE_READ_ONLY);\n+ }\n+ }\n+ FD_TEST( fd_pod_insertf_ulong( topo->props, leader_state_obj->id, \"leader_state\" ));\n+ }\n+\n /* There is a special fseq that sits between the pack, bank, and poh\n tiles to indicate when the bank/poh tiles are done processing a\n microblock. Pack uses this to determine when to \"unlock\" accounts\ndiff --git a/src/app/shared/commands/monitor/monitor.c b/src/app/shared/commands/monitor/monitor.c\nindex 790befe9c83..7c646562e3a 100644\n--- a/src/app/shared/commands/monitor/monitor.c\n+++ b/src/app/shared/commands/monitor/monitor.c\n@@ -362,8 +362,8 @@ run_monitor( config_t const * config,\n char now_cstr[ FD_LOG_WALLCLOCK_CSTR_BUF_SZ ];\n if( !monitor_pane ) {\n PRINT( \"snapshot for %s | Use TAB to switch panes\" TEXT_NEWLINE, fd_log_wallclock_cstr( now, now_cstr ) );\n- PRINT( \" tile | pid | stale | heart | nivcsw | nvcsw | in backp | backp cnt | %% hkeep | %% wait | %% backp | %% finish\" TEXT_NEWLINE );\n- PRINT( \"---------+---------+------------+-------+---------------------+---------------------+----------+---------------------+----------+----------+----------+----------\" TEXT_NEWLINE );\n+ PRINT( \" tile | pid | stale | heart | nivcsw | nvcsw | in backp | backp cnt | %% hkeep | %% wait | %% backp | %% finish | %% sleep\" TEXT_NEWLINE );\n+ PRINT( \"---------+---------+------------+-------+---------------------+---------------------+----------+---------------------+----------+----------+----------+----------+-----------\" TEXT_NEWLINE );\n for( ulong tile_idx=0UL; tile_idx<topo->tile_cnt; tile_idx++ ) {\n tile_snap_t * prv = &tile_snap_prv[ tile_idx ];\n tile_snap_t * cur = &tile_snap_cur[ tile_idx ];\n@@ -385,6 +385,9 @@ run_monitor( config_t const * config,\n ulong cur_backp_ticks = cur->regime_ticks[5];\n ulong prv_backp_ticks = prv->regime_ticks[5];\n \n+ ulong cur_sleeping_ticks = cur->regime_ticks[8];\n+ ulong prv_sleeping_ticks = prv->regime_ticks[8];\n+\n ulong cur_processing_ticks = cur->regime_ticks[4]+cur->regime_ticks[7];\n ulong prv_processing_ticks = prv->regime_ticks[4]+prv->regime_ticks[7];\n \n@@ -392,6 +395,7 @@ run_monitor( config_t const * config,\n PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_wait_ticks, prv_wait_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_backp_ticks, prv_backp_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_processing_ticks, prv_processing_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n+ PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_sleeping_ticks, prv_sleeping_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n PRINT( TEXT_NEWLINE );\n }\n } else {\ndiff --git a/src/app/shared/commands/monitor/monitor.seccomppolicy b/src/app/shared/commands/monitor/monitor.seccomppolicy\nindex 0054eefaf15..2984e700c09 100644\n--- a/src/app/shared/commands/monitor/monitor.seccomppolicy\n+++ b/src/app/shared/commands/monitor/monitor.seccomppolicy\n@@ -33,8 +33,10 @@ fsync: (eq (arg 0) logfile_fd)\n #\n # The monitor calls fd_log_wait_until() to wait until the diagnostic\n # output screen should be refreshed, and that function can call\n-# nanosleep depending on the amount of time left to wait.\n-nanosleep\n+# clock_nanosleep (syscall used by glibc's nanosleep) depending\n+# on the amount of time left to wait.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n \n # monitor: wait until we need to print again\n #\ndiff --git a/src/app/shared/fd_config.h b/src/app/shared/fd_config.h\nindex 57412457518..f6b34830e6b 100644\n--- a/src/app/shared/fd_config.h\n+++ b/src/app/shared/fd_config.h\n@@ -259,6 +259,7 @@ struct fd_config {\n uint verify_tile_count;\n uint bank_tile_count;\n uint shred_tile_count;\n+ int low_power_mode;\n } layout;\n \n struct {\ndiff --git a/src/app/shared/fd_config_parse.c b/src/app/shared/fd_config_parse.c\nindex 3cdf8e40820..9124448e31c 100644\n--- a/src/app/shared/fd_config_parse.c\n+++ b/src/app/shared/fd_config_parse.c\n@@ -162,6 +162,7 @@ fd_config_extract_pod( uchar * pod,\n CFG_POP ( uint, layout.verify_tile_count );\n CFG_POP ( uint, layout.bank_tile_count );\n CFG_POP ( uint, layout.shred_tile_count );\n+ CFG_POP ( bool, layout.low_power_mode );\n \n CFG_POP ( cstr, hugetlbfs.mount_path );\n CFG_POP ( cstr, hugetlbfs.max_page_size );\ndiff --git a/src/app/shared_dev/commands/pktgen/pktgen.c b/src/app/shared_dev/commands/pktgen/pktgen.c\nindex 347a9a5fd28..47cb549bce9 100644\n--- a/src/app/shared_dev/commands/pktgen/pktgen.c\n+++ b/src/app/shared_dev/commands/pktgen/pktgen.c\n@@ -130,6 +130,7 @@ render_status( ulong volatile const * net_metrics ) {\n /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_PROCESSING_PREFRAG ) ];\n /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];\n /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_PROCESSING_POSTFRAG ) ];\n+ /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_SLEEPING ) ];\n ulong rx_ok_now = net_metrics[ MIDX( COUNTER, NET, RX_PKT_CNT ) ];\n ulong rx_byte_now = net_metrics[ MIDX( COUNTER, NET, RX_BYTES_TOTAL ) ];\n ulong rx_drop_now = net_metrics[ MIDX( COUNTER, NET, RX_FILL_BLOCKED_CNT ) ];\ndiff --git a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c\nindex 2ebdf453673..0afb7022de2 100644\n--- a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c\n+++ b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c\n@@ -70,19 +70,21 @@ fd_quic_trace_log_tile( fd_frag_meta_t const * in_mcache ) {\n \n uchar scratch[ sizeof(fd_stem_tile_in_t)+128 ] __attribute__((aligned(FD_STEM_SCRATCH_ALIGN)));\n \n- stem_run1( /* in_cnt */ 1UL,\n- /* in_mcache */ in_mcache_tbl,\n- /* in_fseq */ fseq_tbl,\n- /* out_cnt */ 0UL,\n- /* out_mcache */ NULL,\n- /* cons_cnt */ 0UL,\n- /* cons_out */ NULL,\n- /* cons_fseq */ NULL,\n- /* stem_burst */ 1UL,\n- /* stem_lazy */ 0L,\n- /* rng */ rng,\n- /* scratch */ scratch,\n- /* ctx */ NULL );\n+ stem_run1( /* in_cnt */ 1UL,\n+ /* in_mcache */ in_mcache_tbl,\n+ /* in_fseq */ fseq_tbl,\n+ /* out_cnt */ 0UL,\n+ /* out_mcache */ NULL,\n+ /* cons_cnt */ 0UL,\n+ /* cons_out */ NULL,\n+ /* cons_fseq */ NULL,\n+ /* idle_sleep */ 0,\n+ /* stem_burst */ 1UL,\n+ /* stem_lazy */ 0L,\n+ /* rng */ rng,\n+ /* leader_state */ NULL,\n+ /* scratch */ scratch,\n+ /* ctx */ NULL );\n \n fd_fseq_delete( fd_fseq_leave( fseq ) );\n }\ndiff --git a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c\nindex a8463e4423e..cd570bd345c 100644\n--- a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c\n+++ b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c\n@@ -539,19 +539,21 @@ fd_quic_trace_rx_tile( fd_quic_trace_ctx_t * trace_ctx,\n \n fd_frag_meta_t const * in_mcache_tbl[2] = { rx_mcache, tx_mcache };\n \n- stem_run1( /* in_cnt */ 2UL,\n- /* in_mcache */ in_mcache_tbl,\n- /* in_fseq */ fseq_tbl,\n- /* out_cnt */ 0UL,\n- /* out_mcache */ NULL,\n- /* cons_cnt */ 0UL,\n- /* cons_out */ NULL,\n- /* cons_fseq */ NULL,\n- /* stem_burst */ 1UL,\n- /* stem_lazy */ 0L,\n- /* rng */ rng,\n- /* scratch */ scratch,\n- /* ctx */ trace_ctx );\n+ stem_run1( /* in_cnt */ 2UL,\n+ /* in_mcache */ in_mcache_tbl,\n+ /* in_fseq */ fseq_tbl,\n+ /* out_cnt */ 0UL,\n+ /* out_mcache */ NULL,\n+ /* cons_cnt */ 0UL,\n+ /* cons_out */ NULL,\n+ /* cons_fseq */ NULL,\n+ /* idle_sleep */ 0,\n+ /* stem_burst */ 1UL,\n+ /* stem_lazy */ 0L,\n+ /* rng */ rng,\n+ /* leader_state */ NULL,\n+ /* scratch */ scratch,\n+ /* ctx */ trace_ctx );\n \n for( int j = 0; j < 2; ++j ){\n fd_fseq_delete( fd_fseq_leave( fseq_tbl[j] ) );\ndiff --git a/src/disco/cswtch/fd_cswtch_tile.c b/src/disco/cswtch/fd_cswtch_tile.c\nindex 6332d01594c..af9b2bec5fd 100644\n--- a/src/disco/cswtch/fd_cswtch_tile.c\n+++ b/src/disco/cswtch/fd_cswtch_tile.c\n@@ -228,6 +228,7 @@ populate_allowed_fds( fd_topo_t const * topo,\n \n #define STEM_BURST (1UL)\n #define STEM_LAZY ((long)10e6) /* 10ms */\n+#define STEM_IDLE_SLEEP_ENABLED (0)\n \n #define STEM_CALLBACK_CONTEXT_TYPE fd_cswtch_ctx_t\n #define STEM_CALLBACK_CONTEXT_ALIGN alignof(fd_cswtch_ctx_t)\ndiff --git a/src/disco/dedup/fd_dedup_tile.seccomppolicy b/src/disco/dedup/fd_dedup_tile.seccomppolicy\nindex a5880d7c085..adcf27ca3f1 100644\n--- a/src/disco/dedup/fd_dedup_tile.seccomppolicy\n+++ b/src/disco/dedup/fd_dedup_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/gui/fd_gui.c b/src/disco/gui/fd_gui.c\nindex 7a493dd5b08..11ff0207cae 100644\n--- a/src/disco/gui/fd_gui.c\n+++ b/src/disco/gui/fd_gui.c\n@@ -229,6 +229,7 @@ fd_gui_tile_timers_snap( fd_gui_t * gui ) {\n cur[ i ].backpressure_prefrag_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];\n cur[ i ].caughtup_postfrag_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ];\n cur[ i ].processing_postfrag_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_PROCESSING_POSTFRAG ) ];\n+ cur[ i ].sleeping_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_SLEEPING ) ];\n }\n }\n \ndiff --git a/src/disco/gui/fd_gui.h b/src/disco/gui/fd_gui.h\nindex 948b0050d3b..4f6a8aeba2a 100644\n--- a/src/disco/gui/fd_gui.h\n+++ b/src/disco/gui/fd_gui.h\n@@ -155,6 +155,7 @@ struct fd_gui_tile_timers {\n \n ulong caughtup_postfrag_ticks;\n ulong processing_postfrag_ticks;\n+ ulong sleeping_ticks;\n };\n \n typedef struct fd_gui_tile_timers fd_gui_tile_timers_t;\ndiff --git a/src/disco/gui/fd_gui_printf.c b/src/disco/gui/fd_gui_printf.c\nindex ec2e9f30fda..5f40aaee194 100644\n--- a/src/disco/gui/fd_gui_printf.c\n+++ b/src/disco/gui/fd_gui_printf.c\n@@ -675,7 +675,8 @@ fd_gui_printf_tile_timers( fd_gui_t * gui,\n + cur[ i ].processing_prefrag_ticks\n + cur[ i ].backpressure_prefrag_ticks\n + cur[ i ].caughtup_postfrag_ticks\n- + cur[ i ].processing_postfrag_ticks);\n+ + cur[ i ].processing_postfrag_ticks\n+ + cur[ i ].sleeping_ticks);\n \n double prev_total = (double)(prev[ i ].caughtup_housekeeping_ticks\n + prev[ i ].processing_housekeeping_ticks\n@@ -684,7 +685,8 @@ fd_gui_printf_tile_timers( fd_gui_t * gui,\n + prev[ i ].processing_prefrag_ticks\n + prev[ i ].backpressure_prefrag_ticks\n + prev[ i ].caughtup_postfrag_ticks\n- + prev[ i ].processing_postfrag_ticks);\n+ + prev[ i ].processing_postfrag_ticks\n+ + prev[ i ].sleeping_ticks);\n \n double idle;\n if( FD_UNLIKELY( cur_total==prev_total ) ) {\ndiff --git a/src/disco/gui/fd_gui_tile.seccomppolicy b/src/disco/gui/fd_gui_tile.seccomppolicy\nindex 9b1186782da..28a04f01536 100644\n--- a/src/disco/gui/fd_gui_tile.seccomppolicy\n+++ b/src/disco/gui/fd_gui_tile.seccomppolicy\n@@ -64,6 +64,20 @@ close: (not (or (eq (arg 0) 2)\n (eq (arg 0) gui_socket_fd)))\n \n # server: serving pages over HTTP requires polling connections\n-#\n-# arg 2 is the timeout.\n poll: (eq (arg 2) 0)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/metrics/fd_metric_tile.c b/src/disco/metrics/fd_metric_tile.c\nindex f4df88a5fd8..ec317297434 100644\n--- a/src/disco/metrics/fd_metric_tile.c\n+++ b/src/disco/metrics/fd_metric_tile.c\n@@ -163,6 +163,7 @@ populate_allowed_fds( fd_topo_t const * topo,\n \n #define STEM_BURST (1UL)\n #define STEM_LAZY ((long)10e6) /* 10ms */\n+#define STEM_IDLE_SLEEP_ENABLED (0)\n \n #define STEM_CALLBACK_CONTEXT_TYPE fd_metric_ctx_t\n #define STEM_CALLBACK_CONTEXT_ALIGN alignof(fd_metric_ctx_t)\ndiff --git a/src/disco/metrics/metrics.xml b/src/disco/metrics/metrics.xml\nindex 7997eb311fe..0c1a36e05d9 100644\n--- a/src/disco/metrics/metrics.xml\n+++ b/src/disco/metrics/metrics.xml\n@@ -37,6 +37,8 @@ metric introduced.\n \n <int value=\"6\" name=\"CaughtUpPostfrag\" label=\"Caught up + Postfrag\" />\n <int value=\"7\" name=\"ProcessingPostfrag\" label=\"Processing + Postfrag\" />\n+\n+ <int value=\"8\" name=\"Sleeping\" label=\"Sleeping\" />\n </enum>\n \n <common>\ndiff --git a/src/disco/net/sock/sock.seccomppolicy b/src/disco/net/sock/sock.seccomppolicy\nindex c3a9afb7dd8..5f2d87363c7 100644\n--- a/src/disco/net/sock/sock.seccomppolicy\n+++ b/src/disco/net/sock/sock.seccomppolicy\n@@ -32,3 +32,19 @@ write: (or (eq (arg 0) 2)\n # arg 0 is the file descriptor to fsync. The boot process ensures that\n # descriptor 3 is always the logfile.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/net/xdp/xdp.seccomppolicy b/src/disco/net/xdp/xdp.seccomppolicy\nindex e4622dc1394..8120b8fc1a7 100644\n--- a/src/disco/net/xdp/xdp.seccomppolicy\n+++ b/src/disco/net/xdp/xdp.seccomppolicy\n@@ -67,3 +67,19 @@ getsockopt: (and (or (eq (arg 0) xsk_fd)\n (eq (arg 0) lo_xsk_fd))\n (eq (arg 1) SOL_XDP)\n (eq (arg 2) XDP_STATISTICS))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/netlink/fd_netlink_tile.c b/src/disco/netlink/fd_netlink_tile.c\nindex c765a0fbbc1..5f0d578fc07 100644\n--- a/src/disco/netlink/fd_netlink_tile.c\n+++ b/src/disco/netlink/fd_netlink_tile.c\n@@ -414,6 +414,7 @@ after_frag( fd_netlink_tile_ctx_t * ctx,\n \n #define STEM_BURST (1UL)\n #define STEM_LAZY ((ulong)13e6) /* 13ms */\n+#define STEM_IDLE_SLEEP_ENABLED 0\n \n #define STEM_CALLBACK_CONTEXT_TYPE fd_netlink_tile_ctx_t\n #define STEM_CALLBACK_CONTEXT_ALIGN alignof(fd_netlink_tile_ctx_t)\ndiff --git a/src/disco/pack/fd_pack_tile.seccomppolicy b/src/disco/pack/fd_pack_tile.seccomppolicy\nindex efb7dec4f42..e7062f56515 100644\n--- a/src/disco/pack/fd_pack_tile.seccomppolicy\n+++ b/src/disco/pack/fd_pack_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/plugin/fd_plugin_tile.seccomppolicy b/src/disco/plugin/fd_plugin_tile.seccomppolicy\nindex a5880d7c085..adcf27ca3f1 100644\n--- a/src/disco/plugin/fd_plugin_tile.seccomppolicy\n+++ b/src/disco/plugin/fd_plugin_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/quic/quic.seccomppolicy b/src/disco/quic/quic.seccomppolicy\nindex 2f1a9d90ddc..0c4eaa7dd53 100644\n--- a/src/disco/quic/quic.seccomppolicy\n+++ b/src/disco/quic/quic.seccomppolicy\n@@ -20,3 +20,19 @@ fsync: (eq (arg 0) logfile_fd)\n \n # QUIC uses getrandom for cryptographically secure randomness.\n getrandom\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/quic/test_quic_metrics.txt b/src/disco/quic/test_quic_metrics.txt\nindex 76627b5dc82..86bdfa27e1e 100644\n--- a/src/disco/quic/test_quic_metrics.txt\n+++ b/src/disco/quic/test_quic_metrics.txt\n@@ -1,75 +1,76 @@\n # HELP quic_txns_overrun Count of txns overrun before reassembled (too small txn_reassembly_count).\n # TYPE quic_txns_overrun counter\n-quic_txns_overrun{kind=\"quic\",kind_id=\"0\"} 16\n+quic_txns_overrun{kind=\"quic\",kind_id=\"0\"} 17\n \n # HELP quic_txn_reasms_started Count of fragmented txn receive ops started.\n # TYPE quic_txn_reasms_started counter\n-quic_txn_reasms_started{kind=\"quic\",kind_id=\"0\"} 17\n+quic_txn_reasms_started{kind=\"quic\",kind_id=\"0\"} 18\n \n # HELP quic_txn_reasms_active Number of fragmented txn receive ops currently active.\n # TYPE quic_txn_reasms_active gauge\n-quic_txn_reasms_active{kind=\"quic\",kind_id=\"0\"} 18\n+quic_txn_reasms_active{kind=\"quic\",kind_id=\"0\"} 19\n \n # HELP quic_frags_ok Count of txn frags received\n # TYPE quic_frags_ok counter\n-quic_frags_ok{kind=\"quic\",kind_id=\"0\"} 19\n+quic_frags_ok{kind=\"quic\",kind_id=\"0\"} 20\n \n # HELP quic_frags_gap Count of txn frags dropped due to data gap\n # TYPE quic_frags_gap counter\n-quic_frags_gap{kind=\"quic\",kind_id=\"0\"} 20\n+quic_frags_gap{kind=\"quic\",kind_id=\"0\"} 21\n \n # HELP quic_frags_dup Count of txn frags dropped due to dup (stream already completed)\n # TYPE quic_frags_dup counter\n-quic_frags_dup{kind=\"quic\",kind_id=\"0\"} 21\n+quic_frags_dup{kind=\"quic\",kind_id=\"0\"} 22\n \n # HELP quic_txns_received Count of txns received via TPU.\n # TYPE quic_txns_received counter\n-quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"udp\"} 22\n-quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_fast\"} 23\n-quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_frag\"} 24\n+quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"udp\"} 23\n+quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_fast\"} 24\n+quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_frag\"} 25\n \n # HELP quic_txns_abandoned Count of txns abandoned because a conn was lost.\n # TYPE quic_txns_abandoned counter\n-quic_txns_abandoned{kind=\"quic\",kind_id=\"0\"} 25\n+quic_txns_abandoned{kind=\"quic\",kind_id=\"0\"} 26\n \n # HELP quic_txn_undersz Count of txns received via QUIC dropped because they were too small.\n # TYPE quic_txn_undersz counter\n-quic_txn_undersz{kind=\"quic\",kind_id=\"0\"} 26\n+quic_txn_undersz{kind=\"quic\",kind_id=\"0\"} 27\n \n # HELP quic_txn_oversz Count of txns received via QUIC dropped because they were too large.\n # TYPE quic_txn_oversz counter\n-quic_txn_oversz{kind=\"quic\",kind_id=\"0\"} 27\n+quic_txn_oversz{kind=\"quic\",kind_id=\"0\"} 28\n \n # HELP quic_legacy_txn_undersz Count of packets received on the non-QUIC port that were too small to be a valid IP packet.\n # TYPE quic_legacy_txn_undersz counter\n-quic_legacy_txn_undersz{kind=\"quic\",kind_id=\"0\"} 28\n+quic_legacy_txn_undersz{kind=\"quic\",kind_id=\"0\"} 29\n \n # HELP quic_legacy_txn_oversz Count of packets received on the non-QUIC port that were too large to be a valid transaction.\n # TYPE quic_legacy_txn_oversz counter\n-quic_legacy_txn_oversz{kind=\"quic\",kind_id=\"0\"} 29\n+quic_legacy_txn_oversz{kind=\"quic\",kind_id=\"0\"} 30\n \n # HELP quic_received_packets Number of IP packets received.\n # TYPE quic_received_packets counter\n-quic_received_packets{kind=\"quic\",kind_id=\"0\"} 30\n+quic_received_packets{kind=\"quic\",kind_id=\"0\"} 31\n \n # HELP quic_received_bytes Total bytes received (including IP, UDP, QUIC headers).\n # TYPE quic_received_bytes counter\n-quic_received_bytes{kind=\"quic\",kind_id=\"0\"} 31\n+quic_received_bytes{kind=\"quic\",kind_id=\"0\"} 32\n \n # HELP quic_sent_packets Number of IP packets sent.\n # TYPE quic_sent_packets counter\n-quic_sent_packets{kind=\"quic\",kind_id=\"0\"} 32\n+quic_sent_packets{kind=\"quic\",kind_id=\"0\"} 33\n \n # HELP quic_sent_bytes Total bytes sent (including IP, UDP, QUIC headers).\n # TYPE quic_sent_bytes counter\n-quic_sent_bytes{kind=\"quic\",kind_id=\"0\"} 33\n+quic_sent_bytes{kind=\"quic\",kind_id=\"0\"} 34\n \n # HELP quic_connections_alloc The number of currently allocated QUIC connections.\n # TYPE quic_connections_alloc gauge\n-quic_connections_alloc{kind=\"quic\",kind_id=\"0\"} 34\n+quic_connections_alloc{kind=\"quic\",kind_id=\"0\"} 35\n \n # HELP quic_connections_state The number of QUIC connections in each state.\n # TYPE quic_connections_state gauge\n+<<<<<<< HEAD\n quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"invalid\"} 35\n quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake\"} 36\n quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake_complete\"} 37\n@@ -263,3 +264,207 @@ quic_retry_sent{kind=\"quic\",kind_id=\"0\"} 137\n # HELP quic_pkt_retransmissions Number of QUIC packets that retransmitted.\n # TYPE quic_pkt_retransmissions counter\n quic_pkt_retransmissions{kind=\"quic\",kind_id=\"0\"} 138\n+=======\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"invalid\"} 36\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake\"} 37\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake_complete\"} 38\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"active\"} 39\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"peer_close\"} 40\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"abort\"} 41\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"close_pending\"} 42\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"dead\"} 43\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"timeout\"} 44\n+\n+# HELP quic_connections_created The total number of connections that have been created.\n+# TYPE quic_connections_created counter\n+quic_connections_created{kind=\"quic\",kind_id=\"0\"} 45\n+\n+# HELP quic_connections_closed Number of connections gracefully closed.\n+# TYPE quic_connections_closed counter\n+quic_connections_closed{kind=\"quic\",kind_id=\"0\"} 46\n+\n+# HELP quic_connections_aborted Number of connections aborted.\n+# TYPE quic_connections_aborted counter\n+quic_connections_aborted{kind=\"quic\",kind_id=\"0\"} 47\n+\n+# HELP quic_connections_timed_out Number of connections timed out.\n+# TYPE quic_connections_timed_out counter\n+quic_connections_timed_out{kind=\"quic\",kind_id=\"0\"} 48\n+\n+# HELP quic_connections_timeout_revived Number of connections revived after timing out.\n+# TYPE quic_connections_timeout_revived counter\n+quic_connections_timeout_revived{kind=\"quic\",kind_id=\"0\"} 49\n+\n+# HELP quic_connections_timeout_freed Number of connections freed after timing out.\n+# TYPE quic_connections_timeout_freed counter\n+quic_connections_timeout_freed{kind=\"quic\",kind_id=\"0\"} 50\n+\n+# HELP quic_connections_retried Number of connections established with retry.\n+# TYPE quic_connections_retried counter\n+quic_connections_retried{kind=\"quic\",kind_id=\"0\"} 51\n+\n+# HELP quic_connection_error_no_slots Number of connections that failed to create due to lack of slots.\n+# TYPE quic_connection_error_no_slots counter\n+quic_connection_error_no_slots{kind=\"quic\",kind_id=\"0\"} 52\n+\n+# HELP quic_connection_error_retry_fail Number of connections that failed during retry (e.g. invalid token).\n+# TYPE quic_connection_error_retry_fail counter\n+quic_connection_error_retry_fail{kind=\"quic\",kind_id=\"0\"} 53\n+\n+# HELP quic_pkt_no_conn Number of packets with an unknown connection ID.\n+# TYPE quic_pkt_no_conn counter\n+quic_pkt_no_conn{kind=\"quic\",kind_id=\"0\"} 54\n+\n+# HELP quic_frame_tx_alloc Results of attempts to acquire QUIC frame metadata.\n+# TYPE quic_frame_tx_alloc counter\n+quic_frame_tx_alloc{kind=\"quic\",kind_id=\"0\",frame_tx_alloc_result=\"success\"} 55\n+quic_frame_tx_alloc{kind=\"quic\",kind_id=\"0\",frame_tx_alloc_result=\"fail_empty_pool\"} 56\n+quic_frame_tx_alloc{kind=\"quic\",kind_id=\"0\",frame_tx_alloc_result=\"fail_conn_max\"} 57\n+\n+# HELP quic_initial_token_len Number of Initial packets grouped by token length.\n+# TYPE quic_initial_token_len counter\n+quic_initial_token_len{kind=\"quic\",kind_id=\"0\",quic_initial_token_len=\"zero\"} 58\n+quic_initial_token_len{kind=\"quic\",kind_id=\"0\",quic_initial_token_len=\"fd_quic_len\"} 59\n+quic_initial_token_len{kind=\"quic\",kind_id=\"0\",quic_initial_token_len=\"invalid_len\"} 60\n+\n+# HELP quic_handshakes_created Number of handshake flows created.\n+# TYPE quic_handshakes_created counter\n+quic_handshakes_created{kind=\"quic\",kind_id=\"0\"} 61\n+\n+# HELP quic_handshake_error_alloc_fail Number of handshakes dropped due to alloc fail.\n+# TYPE quic_handshake_error_alloc_fail counter\n+quic_handshake_error_alloc_fail{kind=\"quic\",kind_id=\"0\"} 62\n+\n+# HELP quic_handshake_evicted Number of handshakes dropped due to eviction.\n+# TYPE quic_handshake_evicted counter\n+quic_handshake_evicted{kind=\"quic\",kind_id=\"0\"} 63\n+\n+# HELP quic_stream_received_events Number of stream RX events.\n+# TYPE quic_stream_received_events counter\n+quic_stream_received_events{kind=\"quic\",kind_id=\"0\"} 64\n+\n+# HELP quic_stream_received_bytes Total stream payload bytes received.\n+# TYPE quic_stream_received_bytes counter\n+quic_stream_received_bytes{kind=\"quic\",kind_id=\"0\"} 65\n+\n+# HELP quic_received_frames Number of QUIC frames received.\n+# TYPE quic_received_frames counter\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"unknown\"} 66\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"ack\"} 67\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"reset_stream\"} 68\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"stop_sending\"} 69\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"crypto\"} 70\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"new_token\"} 71\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"stream\"} 72\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"max_data\"} 73\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"max_stream_data\"} 74\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"max_streams\"} 75\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"data_blocked\"} 76\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"stream_data_blocked\"} 77\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"streams_blocked\"} 78\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"new_conn_id\"} 79\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"retire_conn_id\"} 80\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"path_challenge\"} 81\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"path_response\"} 82\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"conn_close_quic\"} 83\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"conn_close_app\"} 84\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"handshake_done\"} 85\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"ping\"} 86\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"padding\"} 87\n+\n+# HELP quic_ack_tx ACK events\n+# TYPE quic_ack_tx counter\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"noop\"} 88\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"new\"} 89\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"merged\"} 90\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"drop\"} 91\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"cancel\"} 92\n+\n+# HELP quic_service_duration_seconds Duration spent in service\n+# TYPE quic_service_duration_seconds histogram\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"8.9999999999999995e-09\"} 93\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1e-08\"} 187\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"9.9999999999999995e-08\"} 282\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1800000000000002e-07\"} 378\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0070000000000001e-06\"} 475\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1839999999999999e-06\"} 573\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0063e-05\"} 672\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1798999999999998e-05\"} 772\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.000100479\"} 873\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.00031749099999999999\"} 975\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.001003196\"} 1078\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.003169856\"} 1182\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.010015971\"} 1287\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.031648018999999999\"} 1393\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.099999999000000006\"} 1500\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"+Inf\"} 1608\n+quic_service_duration_seconds_sum{kind=\"quic\",kind_id=\"0\"} 1.09e-07\n+quic_service_duration_seconds_count{kind=\"quic\",kind_id=\"0\"} 1608\n+\n+# HELP quic_receive_duration_seconds Duration spent processing packets\n+# TYPE quic_receive_duration_seconds histogram\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"8.9999999999999995e-09\"} 110\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1e-08\"} 221\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"9.9999999999999995e-08\"} 333\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1800000000000002e-07\"} 446\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0070000000000001e-06\"} 560\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1839999999999999e-06\"} 675\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0063e-05\"} 791\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1798999999999998e-05\"} 908\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.000100479\"} 1026\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.00031749099999999999\"} 1145\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.001003196\"} 1265\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.003169856\"} 1386\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.010015971\"} 1508\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.031648018999999999\"} 1631\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.099999999000000006\"} 1755\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"+Inf\"} 1880\n+quic_receive_duration_seconds_sum{kind=\"quic\",kind_id=\"0\"} 1.2599999999999999e-07\n+quic_receive_duration_seconds_count{kind=\"quic\",kind_id=\"0\"} 1880\n+\n+# HELP quic_frame_fail_parse Number of QUIC frames failed to parse.\n+# TYPE quic_frame_fail_parse counter\n+quic_frame_fail_parse{kind=\"quic\",kind_id=\"0\"} 127\n+\n+# HELP quic_pkt_crypto_failed Number of packets that failed decryption.\n+# TYPE quic_pkt_crypto_failed counter\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"initial\"} 128\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"early\"} 129\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"handshake\"} 130\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"app\"} 131\n+\n+# HELP quic_pkt_no_key Number of packets that failed decryption due to missing key.\n+# TYPE quic_pkt_no_key counter\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"initial\"} 132\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"early\"} 133\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"handshake\"} 134\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"app\"} 135\n+\n+# HELP quic_pkt_net_header_invalid Number of packets dropped due to weird IP or UDP header.\n+# TYPE quic_pkt_net_header_invalid counter\n+quic_pkt_net_header_invalid{kind=\"quic\",kind_id=\"0\"} 136\n+\n+# HELP quic_pkt_quic_header_invalid Number of packets dropped due to weird QUIC header.\n+# TYPE quic_pkt_quic_header_invalid counter\n+quic_pkt_quic_header_invalid{kind=\"quic\",kind_id=\"0\"} 137\n+\n+# HELP quic_pkt_undersz Number of QUIC packets dropped due to being too small.\n+# TYPE quic_pkt_undersz counter\n+quic_pkt_undersz{kind=\"quic\",kind_id=\"0\"} 138\n+\n+# HELP quic_pkt_oversz Number of QUIC packets dropped due to being too large.\n+# TYPE quic_pkt_oversz counter\n+quic_pkt_oversz{kind=\"quic\",kind_id=\"0\"} 139\n+\n+# HELP quic_pkt_verneg Number of QUIC version negotiation packets received.\n+# TYPE quic_pkt_verneg counter\n+quic_pkt_verneg{kind=\"quic\",kind_id=\"0\"} 140\n+\n+# HELP quic_retry_sent Number of QUIC Retry packets sent.\n+# TYPE quic_retry_sent counter\n+quic_retry_sent{kind=\"quic\",kind_id=\"0\"} 141\n+\n+# HELP quic_pkt_retransmissions Number of QUIC packets that retransmitted.\n+# TYPE quic_pkt_retransmissions counter\n+quic_pkt_retransmissions{kind=\"quic\",kind_id=\"0\"} 142\n+>>>>>>> bf98b9a50 (bz)\ndiff --git a/src/disco/shred/fd_shred_tile.seccomppolicy b/src/disco/shred/fd_shred_tile.seccomppolicy\nindex efb7dec4f42..e7062f56515 100644\n--- a/src/disco/shred/fd_shred_tile.seccomppolicy\n+++ b/src/disco/shred/fd_shred_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/sign/fd_sign_tile.seccomppolicy b/src/disco/sign/fd_sign_tile.seccomppolicy\nindex efb7dec4f42..e7062f56515 100644\n--- a/src/disco/sign/fd_sign_tile.seccomppolicy\n+++ b/src/disco/sign/fd_sign_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/stem/fd_stem.c b/src/disco/stem/fd_stem.c\nindex 4bcfa0675b5..d00f7ff5721 100644\n--- a/src/disco/stem/fd_stem.c\n+++ b/src/disco/stem/fd_stem.c\n@@ -190,6 +190,16 @@\n #define STEM_LAZY (0L)\n #endif\n \n+#define STEM_SHUTDOWN_SEQ (ULONG_MAX-1UL)\n+\n+#ifndef STEM_IDLE_SLEEP_ENABLED\n+#define STEM_IDLE_SLEEP_ENABLED (1)\n+#endif\n+\n+#ifndef STEM_IDLE_THRESHOLD\n+#define STEM_IDLE_THRESHOLD (2048UL)\n+#endif\n+\n static inline void\n STEM_(in_update)( fd_stem_tile_in_t * in ) {\n fd_fseq_update( in->fseq, in->seq );\n@@ -239,16 +249,19 @@ STEM_(run1)( ulong in_cnt,\n ulong cons_cnt,\n ulong * _cons_out,\n ulong ** _cons_fseq,\n+ int idle_sleep,\n ulong burst,\n long lazy,\n fd_rng_t * rng,\n+ ulong * leader_state,\n void * scratch,\n STEM_CALLBACK_CONTEXT_TYPE * ctx ) {\n /* in frag stream state */\n- ulong in_seq; /* current position in input poll sequence, in [0,in_cnt) */\n- fd_stem_tile_in_t * in; /* in[in_seq] for in_seq in [0,in_cnt) has information about input fragment stream currently at\n- position in_seq in the in_idx polling sequence. The ordering of this array is continuously\n- shuffled to avoid lighthousing effects in the output fragment stream at extreme fan-in and load */\n+ ulong in_seq; /* current position in input poll sequence, in [0,in_cnt) */\n+ fd_stem_tile_in_t * in; /* in[in_seq] for in_seq in [0,in_cnt) has information about input fragment stream currently at\n+ position in_seq in the in_idx polling sequence. The ordering of this array is continuously\n+ shuffled to avoid lighthousing effects in the output fragment stream at extreme fan-in and load */\n+ ulong idle_iter_cnt; /* consecutive iterations without processing any fragments, tile can sleep when threshold is exceeded */\n \n /* out frag stream state */\n ulong * out_depth; /* ==fd_mcache_depth( out_mcache[out_idx] ) for out_idx in [0, out_cnt) */\n@@ -263,10 +276,12 @@ STEM_(run1)( ulong in_cnt,\n ulong * cons_seq; /* cons_seq [cons_idx] is the most recent observation of cons_fseq[cons_idx] */\n \n /* housekeeping state */\n- ulong event_cnt; /* ==in_cnt+cons_cnt+1, total number of housekeeping events */\n- ulong event_seq; /* current position in housekeeping event sequence, in [0,event_cnt) */\n- ushort * event_map; /* current mapping of event_seq to event idx, event_map[ event_seq ] is next event to process */\n- ulong async_min; /* minimum number of ticks between processing a housekeeping event, positive integer power of 2 */\n+ ulong event_cnt; /* ==in_cnt+cons_cnt+1, total number of housekeeping events */\n+ ulong event_seq; /* current position in housekeeping event sequence, in [0,event_cnt) */\n+ ushort * event_map; /* current mapping of event_seq to event idx, event_map[ event_seq ] is next event to process */\n+ ulong async_min; /* minimum number of ticks between processing a housekeeping event, positive integer power of 2 */\n+ double ticks_per_ns; /* ticks per nanosecond for timing calculations */\n+ ulong is_leader; /* leader state flag (0/1), read from leader_state fseq; disables idle sleep when non-zero */\n \n /* performance metrics */\n ulong metric_in_backp; /* is the run loop currently backpressured by one or more of the outs, in [0,1] */\n@@ -314,6 +329,15 @@ STEM_(run1)( ulong in_cnt,\n this_in->accum[3] = 0U; this_in->accum[4] = 0U; this_in->accum[5] = 0U;\n }\n \n+ idle_iter_cnt = 0;\n+ is_leader = 0;\n+#if !STEM_IDLE_SLEEP_ENABLED\n+ (void)idle_sleep;\n+ (void)idle_iter_cnt;\n+ (void)leader_state;\n+ (void)is_leader;\n+#endif\n+\n /* out frag stream init */\n \n cr_avail = (ulong *)FD_SCRATCH_ALLOC_APPEND( l, alignof(ulong), out_cnt*sizeof(ulong) );\n@@ -365,7 +389,8 @@ STEM_(run1)( ulong in_cnt,\n for( ulong cons_idx=0UL; cons_idx<cons_cnt; cons_idx++ ) event_map[ event_seq++ ] = (ushort)cons_idx;\n event_seq = 0UL;\n \n- async_min = fd_tempo_async_min( lazy, event_cnt, (float)fd_tempo_tick_per_ns( NULL ) );\n+ ticks_per_ns = fd_tempo_tick_per_ns( NULL );\n+ async_min = fd_tempo_async_min( lazy, event_cnt, (float)ticks_per_ns );\n if( FD_UNLIKELY( !async_min ) ) FD_LOG_ERR(( \"bad lazy %lu %lu\", (ulong)lazy, event_cnt ));\n \n FD_LOG_INFO(( \"Running stem, cr_max = %lu\", cr_max ));\n@@ -445,6 +470,10 @@ STEM_(run1)( ulong in_cnt,\n }\n }\n \n+#if STEM_IDLE_SLEEP_ENABLED\n+ if ( FD_UNLIKELY( idle_sleep ) ) is_leader = fd_fseq_query(leader_state);\n+#endif\n+\n #ifdef STEM_CALLBACK_DURING_HOUSEKEEPING\n STEM_CALLBACK_DURING_HOUSEKEEPING( ctx );\n #else\n@@ -489,6 +518,24 @@ STEM_(run1)( ulong in_cnt,\n now = next;\n }\n \n+ idle_iter_cnt++;\n+\n+#if STEM_IDLE_SLEEP_ENABLED\n+ if ( FD_UNLIKELY( idle_sleep && idle_iter_cnt>STEM_IDLE_THRESHOLD ) ) {\n+ if ( FD_UNLIKELY( !is_leader ) ) {\n+ long ticks_until_deadline = then - now;\n+ long ns_until_deadline = (long)((double)ticks_until_deadline / ticks_per_ns);\n+ fd_log_sleep( ns_until_deadline );\n+\n+ metric_regime_ticks[0] += housekeeping_ticks;\n+ housekeeping_ticks = 0;\n+ long next = fd_tickcount();\n+ metric_regime_ticks[8] += (ulong)(next - now);\n+ now = next;\n+ } else idle_iter_cnt = 0;\n+ }\n+#endif\n+\n #if defined(STEM_CALLBACK_BEFORE_CREDIT) || defined(STEM_CALLBACK_AFTER_CREDIT) || defined(STEM_CALLBACK_AFTER_FRAG) || defined(STEM_CALLBACK_RETURNABLE_FRAG)\n fd_stem_context_t stem = {\n .mcaches = out_mcache,\n@@ -548,6 +595,7 @@ STEM_(run1)( ulong in_cnt,\n if( FD_UNLIKELY( was_busy ) ) metric_regime_ticks[3] += (ulong)(next - now);\n else metric_regime_ticks[6] += (ulong)(next - now);\n now = next;\n+ if( FD_UNLIKELY( was_busy ) ) idle_iter_cnt = 0;\n continue;\n }\n \n@@ -564,6 +612,7 @@ STEM_(run1)( ulong in_cnt,\n long prefrag_next = fd_tickcount();\n prefrag_ticks = (ulong)(prefrag_next - now);\n now = prefrag_next;\n+ idle_iter_cnt = 0;\n }\n #endif\n \n@@ -694,6 +743,7 @@ STEM_(run1)( ulong in_cnt,\n #endif\n \n /* Windup for the next in poll and accumulate diagnostics */\n+ idle_iter_cnt = 0;\n \n this_in_seq = fd_seq_inc( this_in_seq, 1UL );\n this_in->seq = this_in_seq;\n@@ -757,6 +807,16 @@ STEM_(run)( fd_topo_t * topo,\n fd_rng_t rng[1];\n FD_TEST( fd_rng_join( fd_rng_new( rng, 0, 0UL ) ) );\n \n+ ulong * leader_state = NULL;\n+#if STEM_IDLE_SLEEP_ENABLED\n+ if( FD_UNLIKELY( tile->idle_sleep ) ) {\n+ ulong leader_state_obj_id = fd_pod_query_ulong( topo->props, \"leader_state\", ULONG_MAX );\n+ FD_TEST( leader_state_obj_id!=ULONG_MAX );\n+ leader_state = fd_fseq_join( fd_topo_obj_laddr(topo, leader_state_obj_id) );\n+ FD_TEST( leader_state );\n+ }\n+#endif\n+\n STEM_CALLBACK_CONTEXT_TYPE * ctx = (STEM_CALLBACK_CONTEXT_TYPE*)fd_ulong_align_up( (ulong)fd_topo_obj_laddr( topo, tile->tile_obj_id ), STEM_CALLBACK_CONTEXT_ALIGN );\n \n STEM_(run1)( polled_in_cnt,\n@@ -767,9 +827,11 @@ STEM_(run)( fd_topo_t * topo,\n reliable_cons_cnt,\n cons_out,\n cons_fseq,\n+ tile->idle_sleep,\n STEM_BURST,\n STEM_LAZY,\n rng,\n+ leader_state,\n fd_alloca( FD_STEM_SCRATCH_ALIGN, STEM_(scratch_footprint)( polled_in_cnt, tile->out_cnt, reliable_cons_cnt ) ),\n ctx );\n \ndiff --git a/src/disco/stem/fd_stem.h b/src/disco/stem/fd_stem.h\nindex d8e9777fab8..2d57e883a75 100644\n--- a/src/disco/stem/fd_stem.h\n+++ b/src/disco/stem/fd_stem.h\n@@ -2,6 +2,7 @@\n #define HEADER_fd_src_disco_stem_fd_stem_h\n \n #include \"../fd_disco_base.h\"\n+#include \"../../util/pod/fd_pod.h\"\n \n #define FD_STEM_SCRATCH_ALIGN (128UL)\n \ndiff --git a/src/disco/topo/fd_topo.h b/src/disco/topo/fd_topo.h\nindex 900f5529c51..2b0a720efc0 100644\n--- a/src/disco/topo/fd_topo.h\n+++ b/src/disco/topo/fd_topo.h\n@@ -121,6 +121,7 @@ struct fd_topo_tile {\n ulong kind_id; /* The ID of this tile within its name. If there are n tile of a particular name, they have IDs [0, N). The pair (name, kind_id) uniquely identifies a tile, as does \"id\" on its own. */\n int is_agave; /* If the tile needs to run in the Agave (Anza) address space or not. */\n int allow_shutdown; /* If the tile is allowed to shutdown gracefully. If false, when the tile exits it will tear down the entire application. */\n+ int idle_sleep; /* If the tile should sleep when idle. */\n \n ulong cpu_idx; /* The CPU index to pin the tile on. A value of ULONG_MAX or more indicates the tile should be floating and not pinned to a core. */\n \n@@ -522,6 +523,8 @@ struct fd_topo {\n \n ulong max_page_size; /* 2^21 or 2^30 */\n ulong gigantic_page_threshold; /* see [hugetlbfs.gigantic_page_threshold_mib]*/\n+\n+ int low_power_mode;\n };\n typedef struct fd_topo fd_topo_t;\n \ndiff --git a/src/disco/topo/fd_topob.c b/src/disco/topo/fd_topob.c\nindex 11a122a5b3e..4c33028b087 100644\n--- a/src/disco/topo/fd_topob.c\n+++ b/src/disco/topo/fd_topob.c\n@@ -142,6 +142,7 @@ fd_topob_tile( fd_topo_t * topo,\n tile->id = topo->tile_cnt;\n tile->kind_id = kind_id;\n tile->is_agave = is_agave;\n+ tile->idle_sleep = topo->low_power_mode;\n tile->cpu_idx = cpu_idx;\n tile->in_cnt = 0UL;\n tile->out_cnt = 0UL;\n@@ -340,11 +341,17 @@ fd_topob_auto_layout( fd_topo_t * topo,\n tiles to CPU cores in NUMA sequential order, except for a few tiles\n which should be floating. */\n \n+ fd_topo_cpus_t cpus[1];\n+ fd_topo_cpus_init( cpus );\n+\n char const * FLOATING[] = {\n \"netlnk\",\n \"metric\",\n \"cswtch\",\n \"bencho\",\n+ \"plugin\",\n+ \"gui\",\n+ \"store\"\n };\n \n char const * ORDERED[] = {\n@@ -391,29 +398,26 @@ fd_topob_auto_layout( fd_topo_t * topo,\n tile->cpu_idx = ULONG_MAX;\n }\n \n- fd_topo_cpus_t cpus[1];\n- fd_topo_cpus_init( cpus );\n-\n ulong cpu_ordering[ FD_TILE_MAX ] = { 0UL };\n- int pairs_assigned[ FD_TILE_MAX ] = { 0 };\n+ // int pairs_assigned[ FD_TILE_MAX ] = { 0 };\n \n ulong next_cpu_idx = 0UL;\n for( ulong i=0UL; i<cpus->numa_node_cnt; i++ ) {\n for( ulong j=0UL; j<cpus->cpu_cnt; j++ ) {\n- fd_topo_cpu_t * cpu = &cpus->cpu[ j ];\n+ // fd_topo_cpu_t * cpu = &cpus->cpu[ j ];\n \n- if( FD_UNLIKELY( pairs_assigned[ j ] || cpu->numa_node!=i ) ) continue;\n+ // if( FD_UNLIKELY( pairs_assigned[ j ] || cpu->numa_node!=i ) ) continue;\n \n FD_TEST( next_cpu_idx<FD_TILE_MAX );\n cpu_ordering[ next_cpu_idx++ ] = j;\n \n- if( FD_UNLIKELY( cpu->sibling!=ULONG_MAX ) ) {\n- /* If the CPU has a HT pair, place it immediately after so they\n- are sequentially assigned. */\n- FD_TEST( next_cpu_idx<FD_TILE_MAX );\n- cpu_ordering[ next_cpu_idx++ ] = cpu->sibling;\n- pairs_assigned[ cpu->sibling ] = 1;\n- }\n+ // if( FD_UNLIKELY( cpu->sibling!=ULONG_MAX ) ) {\n+ // /* If the CPU has a HT pair, place it immediately after so they\n+ // are sequentially assigned. */\n+ // FD_TEST( next_cpu_idx<FD_TILE_MAX );\n+ // cpu_ordering[ next_cpu_idx++ ] = cpu->sibling;\n+ // pairs_assigned[ cpu->sibling ] = 1;\n+ // }\n }\n }\n \n@@ -484,8 +488,9 @@ fd_topob_auto_layout( fd_topo_t * topo,\n }\n \n if( FD_UNLIKELY( reserve_agave_cores ) ) {\n- for( ulong i=cpu_idx; i<cpus->cpu_cnt; i++ ) {\n+ for( ulong i=1UL; i<cpus->cpu_cnt; i++ ) {\n if( FD_UNLIKELY( !cpus->cpu[ cpu_ordering[ i ] ].online ) ) continue;\n+ if( FD_UNLIKELY( cpu_assigned[ cpu_ordering[ i ] ] ) ) continue;\n \n if( FD_LIKELY( topo->agave_affinity_cnt<sizeof(topo->agave_affinity_cpu_idx)/sizeof(topo->agave_affinity_cpu_idx[0]) ) ) {\n topo->agave_affinity_cpu_idx[ topo->agave_affinity_cnt++ ] = cpu_ordering[ i ];\ndiff --git a/src/disco/verify/fd_verify_tile.seccomppolicy b/src/disco/verify/fd_verify_tile.seccomppolicy\nindex efb7dec4f42..e7062f56515 100644\n--- a/src/disco/verify/fd_verify_tile.seccomppolicy\n+++ b/src/disco/verify/fd_verify_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/discoh/poh/fd_poh_tile.c b/src/discoh/poh/fd_poh_tile.c\nindex 304965ac8ab..7eb08a64ff4 100644\n--- a/src/discoh/poh/fd_poh_tile.c\n+++ b/src/discoh/poh/fd_poh_tile.c\n@@ -528,6 +528,12 @@ typedef struct {\n so that they can resume the replay stage if it was suspended waiting. */\n void * signal_leader_change;\n \n+ /* Leader fseq for low power mode. When non-NULL, the PoH tile updates\n+ this fseq to 1 when it becomes leader and to 0 when it stops being\n+ leader. When leader, all tiles busy spin regardless of low-power settings\n+ to ensure peak performance when leader. */\n+ ulong * leader_state;\n+\n /* These are temporarily set in during_frag so they can be used in\n after_frag once the frag has been validated as not overrun. */\n uchar _txns[ USHORT_MAX ];\n@@ -1764,6 +1770,15 @@ during_housekeeping( fd_poh_ctx_t * ctx ) {\n FD_COMPILER_MFENCE();\n fd_ext_poh_signal_leader_change( ctx->signal_leader_change );\n }\n+\n+ if ( FD_UNLIKELY( ctx->leader_state ) ) {\n+ ulong is_leader = ctx->slot+1UL>=ctx->next_leader_slot;\n+ ulong current = fd_fseq_query( ctx->leader_state );\n+ if ( FD_UNLIKELY( current!=is_leader) ) {\n+ fd_fseq_update( ctx->leader_state, is_leader );\n+ FD_LOG_WARNING(( \"fd_poh_leader_state_changed, is_leader=%lu, current=%lu, slot=%lu, next_leader_slot=%lu\", is_leader, current, ctx->slot, ctx->next_leader_slot ));\n+ }\n+ }\n }\n \n static inline void\n@@ -2230,6 +2245,7 @@ unprivileged_init( fd_topo_t * topo,\n ctx->sha256 = NONNULL( fd_sha256_join( fd_sha256_new( sha256 ) ) );\n ctx->current_leader_bank = NULL;\n ctx->signal_leader_change = NULL;\n+ ctx->leader_state = NULL;\n \n ctx->shred_seq = ULONG_MAX;\n ctx->halted_switching_key = 0;\n@@ -2268,6 +2284,14 @@ unprivileged_init( fd_topo_t * topo,\n fd_shred_version = fd_fseq_join( fd_topo_obj_laddr( topo, poh_shred_obj_id ) );\n FD_TEST( fd_shred_version );\n \n+ if( FD_UNLIKELY( tile->idle_sleep ) ) {\n+ ulong leader_state_obj_id = fd_pod_query_ulong( topo->props, \"leader_state\", ULONG_MAX );\n+ FD_TEST( leader_state_obj_id!=ULONG_MAX );\n+ ctx->leader_state = fd_fseq_join( fd_topo_obj_laddr(topo, leader_state_obj_id) );\n+ FD_TEST( ctx->leader_state );\n+ fd_fseq_update( ctx->leader_state, 0UL );\n+ }\n+\n poh_link_init( &gossip_dedup, topo, tile, out1( topo, tile, \"gossip_dedup\" ).idx );\n poh_link_init( &stake_out, topo, tile, out1( topo, tile, \"stake_out\" ).idx );\n poh_link_init( &crds_shred, topo, tile, out1( topo, tile, \"crds_shred\" ).idx );\ndiff --git a/src/util/log/fd_log.c b/src/util/log/fd_log.c\nindex d13bbe900c8..be02c243711 100644\n--- a/src/util/log/fd_log.c\n+++ b/src/util/log/fd_log.c\n@@ -31,7 +31,6 @@\n #include <unistd.h>\n #include <signal.h>\n #include <sched.h>\n-#include <time.h>\n #if defined(__linux__)\n #include <syscall.h>\n #endif\ndiff --git a/src/util/log/fd_log.h b/src/util/log/fd_log.h\nindex 479e0f18299..a97f5778d47 100644\n--- a/src/util/log/fd_log.h\n+++ b/src/util/log/fd_log.h\n@@ -142,6 +142,7 @@\n \n #include \"../env/fd_env.h\"\n #include \"../io/fd_io.h\"\n+#include <time.h>\n \n /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message\n at the NOTICE level to the logger. E.g. for a typical fd_log\n`\n\n\n return { filePath, body }\n}\n\nexport default modDiff\n","import { spawnSync } from 'child_process'\n\nexport const bamUpdate = (tag: string, mod = false, isMajorThree = false) => {\n // Update DZ\n spawnSync(\n `sudo apt install --only-upgrade doublezero doublezero-solana -y`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `sudo systemctl restart doublezerod`,\n { shell: true, stdio: 'inherit' },\n )\n\n if (isMajorThree) {\n if (mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(`mkdir /tmp/${tag}-bam`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}-bam`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/jito-labs/bam-client.git --recurse-submodules /tmp/${tag}`,\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${tag} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${tag}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n","import {\n ACCOUNTS_PATH,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n LOG_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\n\nexport const startTestnetValidatorScript = () => {\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 ${ACCOUNTS_PATH} \\\\\n--ledger ${LEDGER_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--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--dynamic-port-range 8000-8025 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--wait-for-supermajority 361144649 \\\\\n--expected-shred-version 41708 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--experimental-retransmit-xdp-cpu-cores 2 \\\\\n--experimental-retransmit-xdp-zero-copy \\\\\n--experimental-poh-pinned-cpu-core 6 \\\\\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\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 { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_KNOWN_VALIDATORS,\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 {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = MAINNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\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${validatorArgs}\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--private-rpc \\\\\n--experimental-retransmit-xdp-cpu-cores 2 \\\\\n--experimental-retransmit-xdp-zero-copy \\\\\n--experimental-poh-pinned-cpu-core 6 \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_KNOWN_VALIDATORS,\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 {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = TESTNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\n--only-known-rpc \\\\\n--rpc-bind-address 0.0.0.0 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--dynamic-port-range 8000-8025 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--expected-shred-version 41708 \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_KNOWN_VALIDATORS,\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 = 10000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = TESTNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\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${validatorArgs}\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 0.0.0.0 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--expected-shred-version 41708 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_KNOWN_VALIDATORS,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startBamTestnetScript = (\n commissionBps = 10000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n bamUrl: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = TESTNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\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 0.0.0.0 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--bam-url ${bamUrl} \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--expected-shred-version 41708 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","export interface JitoConfig {\n version: string\n tag: string\n commissionBps: number\n relayerUrl: string\n blockEngineUrl: string\n shredReceiverAddr: string\n bamUrl: string\n hasRelayer?: boolean\n}\n\nexport const JITO_CONFIG: JitoConfig = {\n version: '2.3.10',\n tag: 'v2.3.10',\n commissionBps: 0,\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 bamUrl: 'http://frankfurt.mainnet.bam.jito.wtf'\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 BAM_URL: 'http://dallas.testnet.bam.jito.wtf',\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 BAM_URL: 'http://ny.testnet.bam.jito.wtf',\n },\n SaltLakeCity: {\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 BAM_URL: 'http://ny.testnet.bam.jito.wtf',\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 BAM_URL: 'http://amsterdam.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://london.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://frankfurt.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://ny.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://tokyo.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://slc.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://singapore.mainnet.bam.jito.wtf',\n },\n Dublin: {\n BLOCK_ENGINE_URL: 'https://dublin.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://dublin.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.61.8:1002',\n BAM_URL: '',\n },\n },\n}\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 { getKeypairsInfo } from '@/cli/balance'\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_KNOWN_VALIDATORS,\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 = 0,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = MAINNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\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-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--private-rpc \\\\\n--full-rpc-api \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_KNOWN_VALIDATORS,\n MAINNET_VALIDATOR_KEY_PATH,\n MAINNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startBamMainnetScript = (\n commissionBps = 0,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n bamUrl: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n const knownValidators = MAINNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\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--bam-url ${bamUrl} \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--private-rpc \\\\\n--full-rpc-api \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\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 { SERVICE_PATHS } from '@/config/config'\nimport { spawnSync } from 'child_process'\nimport { setupLogrotate } from '@/cli/setup/setupLogrotate'\nimport { rmLogs } from '@/cli/setup/rmLogs'\nimport { restartLogrotate } from '@/cli/setup/restartLogrotate'\n\nexport const updateLogrotate = (isFiredancer: boolean) => {\n rmLogs()\n const cmd = `sudo rm -rf ${SERVICE_PATHS.SOL_LOGROTATE} && sudo rm -rf ${SERVICE_PATHS.FRANKENDANCER_LOGROTATE}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n setupLogrotate(isFiredancer)\n restartLogrotate()\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 notifempty\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 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 if (frankendancer && existsSync(SERVICE_PATHS.FRANKENDANCER_LOGROTATE)) {\n console.log(\n 'FRANKENDANCER_LOGROTATE already exists. Skipping logrotate configuration.',\n )\n }\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 { spawnSync } from 'child_process'\n\nexport const restartLogrotate = () => {\n const cmd = 'sudo systemctl restart logrotate'\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'child_process'\n\nexport const restartFiredancer = () => {\n spawnSync('sudo systemctl restart frankendancer', {\n shell: true,\n stdio: 'inherit',\n })\n}\n","import { execAsync } from '@skeet-framework/utils'\nimport chalk from 'chalk'\n\n\nexport const syncFirewall = async () => {\n await execAsync(`echo \"yes\" | sudo ufw restart`)\n await execAsync(`echo \"yes\" | sudo ufw enable`)\n await execAsync(`sudo ufw allow ssh`)\n await execAsync(`sudo ufw allow 53`)\n await execAsync(`sudo ufw allow 8899/udp`)\n await execAsync(`sudo ufw allow 8899/tcp`)\n await execAsync(`sudo ufw allow 8000:8898/udp`)\n await execAsync(`sudo ufw allow 8000:8898/tcp`)\n await execAsync(`sudo ufw allow 8900:10000/tcp`)\n await execAsync(`sudo ufw allow 8900:10000/udp`)\n await execAsync(`sudo ufw allow 179/tcp`)\n await execAsync(`sudo ufw allow 9600/tcp`)\n await execAsync(`sudo ufw reload`)\n console.log(chalk.white('✔️ Firewall updated!'))\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 { 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]\nCapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN CAP_BPF CAP_PERFMON\nAmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN CAP_BPF CAP_PERFMON\nNoNewPrivileges=false\nType=simple\nRestart=always\nRestartSec=1\nLimitNOFILE=1000000\nLimitMEMLOCK=infinity\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 execSync(`sudo systemctl daemon-reload`)\n console.log('solv.service configuration created.')\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const startSolv = () => {\n spawnSync('sudo systemctl start solv', { shell: true, stdio: 'inherit' })\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 // console.log(chalk.white('⏳ Options: ...'))\n // console.log(chalk.white('1️⃣ --skip-mount: ', options.skipMount))\n // console.log(chalk.white('2️⃣ --skip-init-config: ', options.skipInitConfig))\n // console.log(chalk.white('3️⃣ --pivot: ', options.pivot))\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 { 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 ValidatorType.BAM,\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 || validatorType === ValidatorType.BAM) {\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 bamUrl: regionArgs.BAM_URL,\n } as JitoConfig\n\n return result\n}\n","import { VERSION_JITO_MAINNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\n\nexport const installJito = (version = VERSION_JITO_MAINNET, mod = false, isMajorThree = false) => {\n if(isMajorThree) {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\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 -C /tmp/${version} 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/${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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\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 } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\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-8025 \\\\\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 { JITO_PATCH, 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 const jitoPatch = JITO_PATCH\n const jitoTagBase = `v${VERSION_JITO_TESTNET}-jito`\n const jitoTag = `${jitoTagBase}${jitoPatch}`\n installJito(jitoTag)\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 {\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-8025 \\\\\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/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n\nexport default installSolana\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 { writeFile } from 'fs/promises'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\nimport { startBamMainnetScript } from '@/template/startupScripts/startBamMainnetScript'\nimport { installBam } from '@/cli/install/installBam'\nimport { startBamTestnetScript } from '@/template/startupScripts/startBamTestnetScript'\nimport setupFiredancer from '../firedancer/setupFiredancer'\nimport { AGAVE_PATCH, BAM_PATCH, JITO_PATCH } from '@/config/versionConfig'\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 let isMajorThree = version.startsWith(\"3\") ? true : false;\n switch (validatorType) {\n case ValidatorType.SOLANA:\n const agavePatch = AGAVE_PATCH;\n const agaveTagBase = `v${version}`\n const agaveTag = `${agaveTagBase}${agavePatch}`\n installSolana(agaveTag)\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 const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${version}-jito`\n const jitoModBase = `v${version}-mod`\n const jitoTag = mod ? `${jitoModBase}${jitoPatch}` :`${jitoTagBase}${jitoPatch}`\n installJito(jitoTag, mod, isMajorThree)\n startupScript = startJitoMainnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n case ValidatorType.BAM:\n console.log('JITO Validator Setup for Mainnet')\n const bamConfig = await readOrCreateJitoConfig()\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${version}-bam`\n const bamModBase = `v${version}-mod`\n const bamTag = mod ? `${bamModBase}${bamPatch}` :`${bamTagBase}${bamPatch}`\n installBam(bamTag, mod, isMajorThree)\n startupScript = startBamMainnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n break\n case ValidatorType.FRANKENDANCER:\n await setupFiredancer(mod, config)\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, TESTNET_SOLANA_VERSION: version } = config\n mod = modConfig\n let startupScript = ''\n let isMajorThree = version.startsWith(\"3\") ? true : false;\n const agavePatch = AGAVE_PATCH;\n const agaveTagBase = `v${version}`\n const agaveTag = `${agaveTagBase}${agavePatch}`\n const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${version}-jito`\n const jitoModBase = `v${version}-mod`\n const jitoTag = mod ? `${jitoModBase}${jitoPatch}` :`${jitoTagBase}${jitoPatch}`\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${version}-bam`\n const bamModBase = `v${version}-mod`\n const bamTag = mod ? `${bamModBase}${bamPatch}` :`${bamTagBase}${bamPatch}`\n switch (validatorType) {\n case ValidatorType.SOLANA:\n installSolana(agaveTag)\n startupScript = startTestnetAgaveValidatorScript(config)\n case ValidatorType.AGAVE:\n console.log('Agave Validator Setup for Testnet')\n installAgave(agaveTag, mod, isMajorThree)\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(jitoTag, mod, isMajorThree)\n startupScript = startJitoTestnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n case ValidatorType.BAM:\n console.log('BAM Validator Setup for Mainnet')\n const bamConfig = await readOrCreateJitoConfig()\n installBam(bamTag, mod, isMajorThree)\n startupScript = startBamTestnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n break\n case ValidatorType.FRANKENDANCER:\n console.log('FRANKENDANCER Validator Setup for Mainnet')\n await setupFiredancer(mod, config)\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 { spawnSync } from 'child_process'\n\nexport const installBam = (version: string, mod = false, isMajorThree = false) => {\n if(isMajorThree) {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\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 -C /tmp/${version} clone https://github.com/jito-labs/bam-client.git --recurse-submodules .`,\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\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 } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n","import { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { promises as fs } from 'fs'\nimport path from 'path';\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'\nimport modDiff from '../template/firedancer/mod'\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 {filePath: modFilePath, body: modDiffContent} = modDiff();\n if (mod) {\n spawnSync(\n `git -C /home/solv/firedancer config --global user.email \"you@example.com\"`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer config --global user.name \"Your Name\"`,\n { shell: true, stdio: 'inherit' },\n )\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 await fs.mkdir(path.dirname(modFilePath), { recursive: true });\n await fs.writeFile(modFilePath, modDiffContent, \"utf8\");\n spawnSync(`sudo chown solv:solv \"${modFilePath}\"`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git apply ${modFilePath}`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git add ./src/*`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git add ./book/*`, {\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 = 0\n\n[tiles.pack]\n schedule_strategy = \\\"balanced\\\"\n\n[net]\n provider = \\\"socket\\\"`\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 = \\\"4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT\\\"\n expected_shred_version = 41708\n wait_for_supermajority_at_slot = 361144649\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","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 { enableFiredancer } from '@/lib/enableFiredancer'\nimport { disableFiredancer } from '@/lib/disableFiredancer'\nimport { disableSolv } from '@/lib/disableSolv'\n\nexport const setupV2 = async (skipInitConfig: boolean, skipMount: boolean, pivot: boolean, mod: boolean) => {\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 const isFiredancer = latestConfig.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n // Generate /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n if (!skipMount) {\n console.log(chalk.white(`🟢 Entering Mount Phase`))\n // Mount /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n setupDirs()\n await mountDirs()\n }\n // Generate Systemd Service\n makeServices(isTest, isFiredancer)\n // Restart Logrotate\n restartLogrotate()\n // Set CPU governor to performance\n setupCpuGovernor()\n // Update Sysctl Config if needed\n await updateSysctlConfig()\n if (!skipMount) {\n // Generate Solana Keys\n setupKeys(latestConfig)\n }\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 break\n default:\n throw new Error('Unknown Node Type')\n }\n if(!skipMount) {\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 disableFiredancer()\n enableSolv()\n // Download Snapshot\n getSnapshot(isTest, `100`, latestConfig.SNAPSHOTS_PATH, isTest ? latestConfig.TESTNET_SOLANA_VERSION : latestConfig.MAINNET_SOLANA_VERSION)\n }\n } else {\n disableSolv()\n enableFiredancer()\n getSnapshot(isTest, `100`, latestConfig.SNAPSHOTS_PATH, isTest ? latestConfig.TESTNET_SOLANA_VERSION : latestConfig.MAINNET_SOLANA_VERSION)\n }\n if(!skipMount) {\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 { execSync } from 'child_process'\nimport firedancerService from './template/firedancer/firedancerService'\n\n// This will overwrite the solv.service file with the new configuration to easily switch between testnet and mainnet\nexport function setupFiredancerService(): void {\n console.log('Creating solvService configuration for solana')\n const fdService = firedancerService()\n // Use sudo tee to write the file with superuser privileges\n execSync(`echo \"${fdService.body}\" | sudo tee ${fdService.filePath} > /dev/null`)\n console.log('frankendancer.service configuration created.')\n}\n","import { setupSystemd } from '@/cli/setup/setupSystemd'\nimport { setupLogrotate } from './setupLogrotate'\nimport { setupSolvService } from './setupSolvService'\nimport { setupFiredancerService } from './setupFiredancerService'\n\nexport const makeServices = (isTest: boolean, isFiredancer: boolean) => {\n setupLogrotate(isFiredancer)\n setupSolvService(isTest)\n setupFiredancerService()\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 { 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 { 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 '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 { spawnSync } from 'node:child_process'\n\nexport const enableFiredancer = () => {\n spawnSync('sudo systemctl enable frankendancer', { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const disableFiredancer = () => {\n spawnSync('sudo systemctl disable frankendancer', { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const disableSolv = () => {\n spawnSync('sudo systemctl disable solv', { shell: true, stdio: 'inherit' })\n}\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 BAM_PATCH,\n JITO_PATCH,\n VERSION_BAM_MAINNET,\n VERSION_FIREDANCER,\n VERSION_JITO_MAINNET,\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport { bamUpdate } from '../update/bamUpdate'\nimport { frankendancerUpdate } from '../update/frankendancerUpdate'\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 isJitoBam = config.VALIDATOR_TYPE === ValidatorType.BAM\n const isFrankendancer = config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n const isModified = options.mod || config.MOD;\n if (isJito) {\n const jitoVersion = options.version || VERSION_JITO_MAINNET\n const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${jitoVersion}-jito`\n const jitoModBase = `v${jitoVersion}-mod`\n const jitoTag = isModified ? `${jitoModBase}${jitoPatch}` :`${jitoTagBase}${jitoPatch}`\n const isMajorThree = jitoVersion.startsWith(\"3\") ? true : false;\n jitoUpdate(jitoTag, isModified, isMajorThree)\n return\n }\n if (isJitoBam) {\n const bamVersion = options.version || VERSION_BAM_MAINNET\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${bamVersion}-bam`\n const bamModBase = `v${bamVersion}-mod`\n const bamTag = isModified ? `${bamModBase}${bamPatch}` :`${bamTagBase}${bamPatch}`\n const isMajorThree = bamVersion.startsWith(\"3\") ? true : false;\n bamUpdate(bamTag, isModified, isMajorThree)\n return\n }\n if (isFrankendancer) {\n const frankendancerVersion = options.version || VERSION_FIREDANCER\n frankendancerUpdate(config, frankendancerVersion, 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 * * * *')\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 { program } from '@/index'\nimport { DefaultConfigType } from '@/config/types'\nimport { updateLogrotate } from '../setup/updateLogrotate'\n\nexport const logrotateCommand = (config: DefaultConfigType) => {\n program\n .command('logrotate')\n .description('Refresh Logrotate')\n .action(() => {\n const isFiredancer = config.VALIDATOR_TYPE === 'frankendancer';\n updateLogrotate(isFiredancer)\n process.exit(0)\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 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'\n// import 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","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":"iFAAA,MAAO,gBACP,OAASA,WAAAA,OAAe,YCCtB,IAAAC,GAAW,SAFb,IAAAC,GAAA,CACE,KAAQ,qBACR,QAAAC,GACA,YAAe,4BACf,KAAQ,gBACR,KAAQ,SACR,WAAc,uCACd,SAAY,CACV,SACA,YACA,MACA,iBACA,UACA,MACF,EACA,MAAS,CACP,MACF,EACA,OAAU,mBACV,QAAW,GACX,QAAW,aACX,IAAO,CACL,KAAQ,iBACV,EACA,QAAW,CACT,KAAQ,SACR,MAAS,2CACT,IAAO,UACP,MAAS,oBACX,EACA,aAAgB,CACd,cAAe,SACf,0CAA2C,QAC3C,2BAA4B,QAC5B,2CAA4C,QAC5C,yBAA0B,SAC1B,yBAA0B,QAC1B,oBAAqB,QACrB,kBAAmB,SACnB,gBAAiB,QACjB,QAAS,QACT,KAAQ,QACR,MAAS,QACT,aAAc,QACd,eAAgB,SAChB,cAAe,SACf,aAAc,QACd,UAAa,SACb,OAAU,SACV,SAAY,SACZ,aAAc,QACd,OAAU,OACZ,EACA,gBAAmB,CACjB,+BAAgC,QAChC,kBAAmB,SACnB,6BAA8B,SAC9B,YAAa,SACb,eAAgB,QAChB,sBAAuB,SACvB,qBAAsB,QACtB,kBAAmB,QACnB,cAAe,SACf,oBAAqB,SACrB,gBAAiB,QACjB,mCAAoC,QACpC,4BAA6B,QAC7B,OAAU,QACV,yBAA0B,QAC1B,QAAW,QACX,SAAY,QACZ,KAAQ,QACR,WAAc,QACd,KAAQ,QACR,sBAAuB,QACvB,OAAU,OACZ,EACA,UAAa,CACX,MAAS,QACT,aAAc,QACd,gBAAiB,QACjB,aAAc,QACd,iBAAkB,SAClB,WAAY,QACZ,WAAY,OACd,CACF,ECpFO,IAAMC,GAAUC,GAAYC,QCA5B,IAAMC,GAA2B,+BAKjC,IAAMC,GAAoB,oBAW1B,IAAMC,GAAe,gBACfC,GAAe,yBACfC,GAAc,uBACdC,GAAwB,iCACxBC,GAA6B,oCAC7BC,GAAkC,iCAClCC,GAAwB,iCACxBC,GAA6B,oCAC7BC,GAAkC,iCAGlCC,EAAY,aACZC,EAAoB,GAAGD,CAAAA,IAAaT,EAAAA,GACpCW,GAAoB,GAAGF,CAAAA,IAAaR,EAAAA,GACpCW,EAA6B,GAAGH,CAAAA,IAAaN,EAAAA,GAC7CU,GAAkC,GAAGJ,CAAAA,IAAaL,EAAAA,GAClDU,GAAuC,GAAGL,CAAAA,IAAaJ,EAAAA,GACvDU,EAA6B,GAAGN,CAAAA,IAAaH,EAAAA,GAC7CU,GAAkC,GAAGP,CAAAA,IAAaF,EAAAA,GAClDU,GAAuC,GAAGR,CAAAA,IAAaD,EAAAA,GAGvDU,EAAW,GAAGT,CAAAA,wBAGdU,GAAiBV,EAAY,sBAG7BW,EAAc,cACdC,GAAgB,gBAChBC,GAAiB,iBAGjBC,GAAmB,mBACnBC,GAAkB,kBAElBC,GACX,+CAIK,IAAMC,GAAc,EAIpB,IAAMC,GAAyB,sCACzBC,GACX,mDACWC,GAAmB,uDAEpBC,EAAAA,iJAAAA,KAAAA,GAAAA,CAAAA,EAAAA,EAaL,IAAMC,GAAcC,OAAOC,OAAOH,EAAAA,EAG5BI,GAAiB,8CACjBC,GAAkB,+CAClBC,GAAmB,+CAEzB,IAAMC,GAAY,UAEZC,GAAqB,CAChCC,4CACE,+CACFC,6CACE,+CACFC,6CACE,+CACFC,4CACE,+CACFC,4CACE,+CACFC,6CACE,8CACFC,4CACE,+CACFC,6CACE,+CACFC,4CACE,8CACJ,EAEaC,GAA2B,CACpC,8CACA,8CACA,8CACA,+CACA,8CACA,+CACA,+CACA,8CACA,+CACA,8CACA,8CACA,8CACA,+CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,gDAGSC,GAA2B,CACpC,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,+CACA,8CACA,8CACA,+CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8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CACE,wEACA,8EACA,4HACA,4FACA,sFACA,qGACA,kEAEF,CACE,+FACA,8EACA,kEAEF,CACE,2DACA,uEACA,kEAEF,CAAA,EACA,CAAA,GC3CF,IAAMC,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,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,YAA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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_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","TESTNET_KNOWN_VALIDATORS","MAINNET_KNOWN_VALIDATORS","spawnSync","spawnSync","installAgave","__name","version","mod","isMajorThree","spawnSync","shell","stdio","installAgave_default","AGAVE_CLI","getSolanaCLI","__name","error","console","getSolanaCLI_default","VERSION_TESTNET","VERSION_MAINNET","AGAVE_PATCH","VERSION_JITO_TESTNET","VERSION_JITO_MAINNET","JITO_PATCH","VERSION_BAM_TESTNET","VERSION_BAM_MAINNET","BAM_PATCH","VERSION_JITO_RPC","VERSION_SOLANA_RPC","VERSION_NODE","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","updateVersion","__name","version","mod","isMajorThree","agavePatch","AGAVE_PATCH","agaveTag","agaveTagBase","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","BAM_RESTART_REQUIRED_MAINNET","BAM_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","XDP","ZERO_COPY","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","SOLANA_TESTNET_RPC_URL","spawnSync","updateSolv","__name","spawnSync","shell","stdio","nodeVersion","CONFIG","NODE_VERSION","spawnSync","jitoUpdate","__name","tag","mod","isMajorThree","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","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","XDP","ZERO_COPY","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","isBam","BAM","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","validatorKey","isUpdateRequired","FD_RESTART_REQUIRED_MAINNET","FD_RESTART_REQUIRED_TESTNET","BAM_RESTART_REQUIRED_MAINNET","BAM_RESTART_REQUIRED_TESTNET","NODE_RESTART_REQUIRED_MAINNET","NODE_RESTART_REQUIRED_TESTNET","AUTO_RESTART","address","getSolanaAddress","msg","getSolvVersion","sendDiscord","spawnSync","stdio","shell","error","errorMsg","message","timestampRestart","Math","floor","Date","now","restartMsg","sleep","catchup","waitCatchup","diffSeconds","minutes","seconds","durationStr","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","promises","fs","path","modDiff","__name","filePath","body","String","raw","mod_default","frankendancerUpdate","__name","config","version","mod","isTestnet","NETWORK","Network","TESTNET","firedancerVersion","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","isModified","MOD","filePath","modFilePath","body","modDiffContent","modDiff","spawnSync","shell","stdio","fs","mkdir","path","dirname","recursive","writeFile","cwd","spawnSync","bamUpdate","__name","tag","mod","isMajorThree","spawnSync","shell","stdio","startTestnetValidatorScript","__name","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","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","startMainnetValidatorScript","__name","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","MAINNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startTestnetAgaveValidatorScript","__name","config","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","TESTNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startJitoTestnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","TESTNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startBamTestnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","bamUrl","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","TESTNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","writeFile","JITO_CONFIG","version","tag","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","bamUrl","JITO_REGIONS","TESTNET","Dallas","BLOCK_ENGINE_URL","RELAYER_URL","SHRED_RECEIVER_ADDR","BAM_URL","NewYork","SaltLakeCity","MAINNET","Amsterdam","London","Frankfurt","Tokyo","Singapore","Dublin","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","startJitoMainnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","MAINNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startBamMainnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","bamUrl","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","MAINNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","spawnSync","updateStartupScriptPermission","__name","cmd","STARTUP_SCRIPT","spawnSync","shell","stdio","updateStartupScriptPermission_default","spawnSync","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","spawnSync","rmLogs","__name","spawnSync","shell","stdio","spawnSync","restartLogrotate","__name","spawnSync","shell","stdio","updateLogrotate","__name","isFiredancer","rmLogs","cmd","SERVICE_PATHS","SOL_LOGROTATE","FRANKENDANCER_LOGROTATE","spawnSync","shell","stdio","setupLogrotate","restartLogrotate","spawnSync","restartFiredancer","__name","spawnSync","shell","stdio","execAsync","chalk","syncFirewall","__name","execAsync","console","log","chalk","white","spawnSync","enableSolv","__name","spawnSync","shell","stdio","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","spawnSync","startSolv","__name","spawnSync","shell","stdio","updateCommands","__name","config","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","isJito","VALIDATOR_TYPE","ValidatorType","JITO","isBam","BAM","isFrankendancer","FRANKENDANCER","isAutoRestart","AUTO_RESTART","isModded","MOD","minIdleTime","version","VERSION_TESTNET","VERSION_MAINNET","VERSION_JITO_MAINNET","VERSION_JITO_TESTNET","VERSION_BAM_MAINNET","VERSION_BAM_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","service","syncFirewall","updateLogrotate","setupSolvService","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","XDP","ZERO_COPY","updateDefaultConfig","jitoVersion","updateJitoSolvConfig","tag","bamVersion","green","firewall","updateFirewall","startup","validatorType","startupScript","startTestnetValidatorScript","startMainnetValidatorScript","startTestnetAgaveValidatorScript","jitoConfig","readOrCreateJitoConfig","startJitoTestnetScript","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","startJitoMainnetScript","bamConfig","startBamTestnetScript","bamUrl","startBamMainnetScript","writeFile","STARTUP_SCRIPT","updateStartupScriptPermissions","background","isMajorThree","startsWith","jitoPatch","JITO_PATCH","jitoTagBase","jitoModBase","jitoTag","mod","jitoUpdate","monitorUpdate","enableSolv","startSolv","bamPatch","BAM_PATCH","bamTagBase","bamModBase","bamTag","bamUpdate","frankendancerUpdate","restartFiredancer","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","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","bamUrl","BAM_URL","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","BAM","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_MAINNET","mod","isMajorThree","spawnSync","shell","stdio","startJitoRPCScript","__name","IDENTITY_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","existsAsync","writeFile","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","jitoPatch","JITO_PATCH","jitoTag","VERSION_JITO_TESTNET","jitoTagBase","installJito","startJitoRPCScript","existsAsync","STARTUP_SCRIPT","writeFile","updateStartupScriptPermissions","rpc_default","spawnSync","installSolana","__name","version","spawnSync","shell","stdio","installSolana_default","writeFile","spawnSync","installBam","__name","version","mod","isMajorThree","spawnSync","shell","stdio","spawnSync","promises","fs","path","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","filePath","modFilePath","body","modDiffContent","modDiff","spawnSync","shell","stdio","cwd","fs","mkdir","path","dirname","recursive","writeFile","jitoConfig","readOrCreateJitoConfig","startFiredancerScript","fdService","firedancerService","prService","portRelayService","toml","configToml","console","log","setupLogrotate","setupFiredancer_default","setupValidatorNode","__name","config","mod","NETWORK","network","MOD","modConfig","Network","MAINNET","console","log","setupMainnetValidator","TESTNET","setupTestnetValidator","VALIDATOR_TYPE","validatorType","MAINNET_SOLANA_VERSION","version","startupScript","isMajorThree","startsWith","ValidatorType","SOLANA","agavePatch","AGAVE_PATCH","agaveTag","agaveTagBase","installSolana","startMainnetValidatorScript","JITO","jitoConfig","readOrCreateJitoConfig","jitoPatch","JITO_PATCH","jitoTagBase","jitoModBase","jitoTag","installJito","startJitoMainnetScript","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","BAM","bamConfig","bamPatch","BAM_PATCH","bamTagBase","bamModBase","bamTag","installBam","startBamMainnetScript","bamUrl","FRANKENDANCER","setupFiredancer","writeFile","STARTUP_SCRIPT","updateStartupScriptPermissions","TESTNET_SOLANA_VERSION","startTestnetAgaveValidatorScript","AGAVE","installAgave","startJitoTestnetScript","startBamTestnetScript","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","execSync","setupFiredancerService","console","log","fdService","firedancerService","execSync","body","filePath","makeServices","__name","isTest","isFiredancer","setupLogrotate","setupSolvService","setupFiredancerService","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","getSnapshot","__name","isTest","minDownloadSpeed","snapshotPath","SNAPSHOTS_PATH","version","VERSION_MAINNET","rpcUrl","useAvorio","cmd","spawnSync","shell","stdio","cwd","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","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","enableFiredancer","__name","spawnSync","shell","stdio","spawnSync","disableFiredancer","__name","spawnSync","shell","stdio","spawnSync","disableSolv","__name","spawnSync","shell","stdio","setupV2","__name","skipInitConfig","skipMount","pivot","mod","console","log","chalk","white","readConfig","initialConfigSetup","latestConfig","isTest","NETWORK","Network","TESTNET","isFiredancer","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","setupDirs","mountDirs","makeServices","restartLogrotate","setupCpuGovernor","updateSysctlConfig","setupKeys","createSymLink","IS_DUMMY","NODE_TYPE","NodeType","RPC","setupRpcNode","VALIDATOR","setupValidatorNode","Error","setupPermissions","daemonReload","disableFiredancer","enableSolv","getSnapshot","SNAPSHOTS_PATH","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","disableSolv","enableFiredancer","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","isJitoBam","BAM","isFrankendancer","FRANKENDANCER","isModified","mod","MOD","jitoVersion","VERSION_JITO_MAINNET","jitoPatch","JITO_PATCH","jitoTagBase","jitoModBase","jitoTag","isMajorThree","startsWith","jitoUpdate","bamVersion","VERSION_BAM_MAINNET","bamPatch","BAM_PATCH","bamTagBase","bamModBase","bamTag","bamUpdate","frankendancerVersion","VERSION_FIREDANCER","frankendancerUpdate","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","logrotateCommand","__name","config","program","command","description","action","isFiredancer","VALIDATOR_TYPE","updateLogrotate","process","exit","spawnSync","rmSnapshot","__name","config","spawnSync","shell","stdio","SNAPSHOTS_PATH","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","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","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","logrotateCommand","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/config/versionConfig.ts","../src/cli/update/index.ts","../src/config/langs.ts","../src/config/config.ts","../src/cli/update/updateSolv.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/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/update/frankendancerUpdate.ts","../src/cli/setup/template/firedancer/mod.ts","../src/cli/update/bamUpdate.ts","../src/template/startupScripts/startTestnetValidatorScript.ts","../src/lib/solana/splBalance.ts","../src/cli/balance/index.ts","../src/lib/getSolBalance.ts","../src/template/startupScripts/startMainnetValidatorScript.ts","../src/template/startupScripts/startTestnetAgaveValidatorScript.ts","../src/template/startupScripts/startJitoTestnetScript.ts","../src/template/startupScripts/startBamTestnetScript.ts","../src/config/jitConfig.ts","../src/lib/readOrCreateJitoConfig.ts","../src/template/startupScripts/startJitoMainnetScript.ts","../src/template/startupScripts/startBamMainnetScript.ts","../src/cli/setup/updateStartupScriptPermission.ts","../src/cli/setup/updateLogrotate.ts","../src/template/logRotates.ts","../src/cli/setup/setupLogrotate.ts","../src/cli/setup/rmLogs.ts","../src/cli/setup/restartLogrotate.ts","../src/lib/restartFiredancer.ts","../src/cli/setup/syncFirewall.ts.ts","../src/lib/enableSolv.ts","../src/template/solvService.ts","../src/cli/setup/setupSolvService.ts","../src/lib/startSolv.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/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/template/startupScripts/startRPCNodeScript.ts","../src/cli/install/installSolana.ts","../src/cli/setup/validator/index.ts","../src/cli/install/installBam.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/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/cli/setup/setupFiredancerService.ts","../src/cli/setup/makeServices.ts","../src/cli/setup/setupKeys.ts","../src/cli/get/snapshot.ts","../src/cli/start/startSolana.ts","../src/cli/setup/setupCpuGovernor.ts","../src/template/updateSysctlConfig.ts","../src/lib/restartLogrotate.ts","../src/cli/setup/createSymLink.ts","../src/utils/rpcLog.ts","../src/lib/enableFiredancer.ts","../src/lib/disableFiredancer.ts","../src/lib/disableSolv.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/cli/logrotate/index.ts","../src/cli/setup/rmSnapshot.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/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 logrotateCommand,\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 logrotateCommand(config)\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.5.23\",\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 \"overrides\": {\n \"chalk\": \"5.3.0\",\n \"strip-ansi\": \"7.1.0\",\n \"color-convert\": \"2.0.1\",\n \"color-name\": \"1.1.4\",\n \"is-core-module\": \"2.13.1\",\n \"error-ex\": \"1.3.2\",\n \"has-ansi\": \"5.0.1\"\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\nexport const TESTNET_KNOWN_VALIDATORS = [\n 'adreoi6W1MGA7eegERNcQTwQH3UuJaAnWjVZEq2cxcF',\n 'naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi',\n 'th734sEwvZZ5XfemLcvo6TXepPfawWBjz3HMYeQdhPi',\n 'BAPExw4zFmwSUjyPfQorenucofeafHLUetcoWTB4Gwnt',\n 'bay3c7G89NTxSULyM45gqJx3JoWtBBeXHvifCywwiwZ',\n 'BeRTyZTveVQsekrF63WhFvfGiABThym95x8uZaicDPgo',\n 'EF8o3aQnu853EEPJKUfqAgoa8szkVs28sv64xtBrRPSV',\n 'chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL',\n 'GsVJ62qt2nbRLT4f67LAo6Ve8eGhChJquYaK3wT1iG2v',\n 'ctz4yB16kvGiMrA4vdtKXEMYgkkfJLo6hMwDk9DZ3Vf',\n 'PARaNF4kcQW3BmaeMD3ELLAqUV7MDS8bMudaCEZ72NM',\n 'dedxpgLN1VXLHpekKra1JKkMGrw7tW1uuYz7Ec28iLK',\n 'DegEnNCbn6PrsvHvsErneRNv7KFTwnjW3uFVjf43e28v',\n 'Dcky7CK3aEHzdV9EF5YR1NaTJ9QfSyzW5cACbqEFKZNv',\n 'dksYs1gzQ7FzqyadN5XtcaeVbqKSN7X2SpfN3fcUW7G',\n 'dstCt4sDCQx1QFFJekmM5RjyFLsDRkaEjTgXd5gbpDB',\n 'eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK',\n 'ExCHpAsqeaDJGfUj41bhU2BuZK4fhRnJKvhG486rfKg',\n 'farmoWMKdJBxLxhMZpgU1uVjvjVJnQqrGhwAyDmcn8R',\n 'G1EaM8gLQU7DifPnCTQKP2PLvFf63tHvaXBAR8QFLg5Z',\n 'goJirTtcRjP6Wqkw7cHNvzjEva5rpvPDtj2ZnEmPAr6',\n 'wetfCN7bhjhBT8GTSAnah8ftoRoHB8H8Q87KkxDdRgK',\n '8H6qQ2FKUjY8wmggSKHUENY38Nr9sQxDUbEZB6fiCHSX',\n 'hy1oTqvrknqoNmPWq2JtQMdDDnWkEGH2ab7N4r4rnJJ',\n 'jntrbAHjcxhP2eRUgCSACb6cMVhYm3jEQ3eQDZKicmz',\n 'akicJSdNFWszP2Le38t1NtVeywXtvoxdiGciaELwZHz',\n '1i1yarXXz55VdvVL4v2HXcjMJPAv4fWJhY8x43bmwfL',\n 'LoV31z7KC5CZ8sdGovmRSDGB6csP1fJip1hiM7xDozw',\n 'magiCagux3C7nMKo2jKSbX6yWzYWMGKJ6ABRnw1zQ8U',\n 'JAfBCSxx2fZwdM5wTiLRAfJm3MpqXz3KnxjPhCQixGVh',\n 'mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe',\n 'phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1',\n 'pineBbb5K6SdV6KG1xibsR5DM1XsWuajtXSy3YYGY4N',\n 'prt1stdbFCFXpEcx9rxwJK63zhYo43V5JCXzGWXkPGn',\n 'rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg',\n 'rapTWQhZD2dPjJ91BXW4UnVKBt6NvX2aZxWSSYg66Y4',\n 'royLQKzrsSs9VbMZMDjZkMM8j3buBnwx7oH3wdifAk4',\n 'CitYBuKSE5W6CXEBAgY1B9fEMUdHXYSmZbXbAWd31Cr',\n 'axyaGn2eZM1dnDCagpd9aYa92gKWTrtEYb8vwc21ddr',\n 'sTeV1NswjBBo15qosoyQj1aYrgvoxomAduN1zFV6gCf',\n 'txtXxyX13G7h899vnZwNJsVRAMfWcwYZNT3jucRqqiW',\n 'hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M',\n 'te1emnh77qnpsdjcCi9FsyX8t4gf4HYWC4kTVHuH4MQ',\n 'tstidz7tN8armqvZ7ia2ck62mY9RD2BrwMtW2w8hcwk',\n 'vnd1sXYmA8YY9xHQBkKKurZeq7iCe6EQ9bGYNZJwh1c',\n 'YE11vEiXKKx95onU1EpjgwrHovgXamRTQvY52Mvde8i',\n '5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on',\n]\n\nexport const MAINNET_KNOWN_VALIDATORS = [\n 'adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ',\n 'nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC',\n 'BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP',\n 'b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF',\n 'chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1',\n 'chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe',\n 'CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP',\n 'parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz',\n 'dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S',\n 'DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup',\n 'dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH',\n 'eyeY8HangkSYirSBtopAfThXzhHL855wPnddz8WnemV',\n 'ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD',\n 'G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN',\n 'wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo',\n 'hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o',\n 'hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu',\n 'jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA',\n 'NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk',\n '1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i',\n 'Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s',\n 'MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV',\n 'D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e',\n 'mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk',\n 'phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2',\n 'pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw',\n 'prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW',\n 'radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9',\n 'rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC',\n 'RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4',\n 'ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj',\n 'axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4',\n 'sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu',\n 'TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ',\n 'hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj',\n 'te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY',\n 'UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL',\n 'vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd',\n 'YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV',\n 'Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24',\n '7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2',\n 'GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ',\n 'CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S',\n]\n","import { LEDGER_PATH } from '@/config/constants'\nimport { spawnSync } from 'child_process'\nimport installAgave from '../install/installAgave'\nimport getSolanaCLI from '@/config/getSolanaCLI'\nimport { AGAVE_PATCH } from '@/config/versionConfig'\n\nexport const updateVersion = async (version: string, mod = false, isMajorThree = false) => {\n const agavePatch = AGAVE_PATCH;\n const agaveTagBase = `v${version}`\n const agaveTag = `${agaveTagBase}${agavePatch}`\n installAgave(agaveTag, mod, isMajorThree)\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} --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, isMajorThree = false) => {\n if(isMajorThree) {\n if(mod) {\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version}-agave-mod /home/solv/.local/share/solana/install/active_release`,\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 } else {\n spawnSync(`mkdir /tmp/${version}-agave`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${version}-agave`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${version}-agave`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`git -C /tmp/${version}-agave checkout ${version}`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /tmp/${version}-agave submodule update --init --recursive`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `CI_COMMIT=$(git -C /tmp/${version}-agave rev-parse HEAD) /tmp/${version}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${version}-agave`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo rm -rf /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version}-agave /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${version}-agave`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/${version}-mod/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.anza.xyz/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\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","export const VERSION_TESTNET = '3.1.2'\nexport const VERSION_MAINNET = '3.0.11'\nexport const AGAVE_PATCH = ''\nexport const VERSION_JITO_TESTNET = '3.1.2'\nexport const VERSION_JITO_MAINNET = '3.0.11'\nexport const JITO_PATCH = ''\nexport const VERSION_BAM_TESTNET = '3.0.11'\nexport const VERSION_BAM_MAINNET = '3.0.11'\nexport const BAM_PATCH = ''\nexport const VERSION_JITO_RPC = '3.1.2'\nexport const VERSION_SOLANA_RPC = '3.0.11'\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.804.30008'\nexport const VERSION_FIREDANCER = '0.714.30008'\nexport const FIREDANCER_PATCH = ''","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 BAM_PATCH,\n DELINQUENT_STAKE_MAINNET,\n DELINQUENT_STAKE_TESTNET,\n JITO_PATCH,\n VERSION_BAM_MAINNET,\n VERSION_BAM_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'\n// import { getSnapshot } from '../get/snapshot'\nimport { frankendancerUpdate } from './frankendancerUpdate'\nimport { bamUpdate } from './bamUpdate'\nimport { STARTUP_SCRIPT } from '@/config/constants'\nimport { startTestnetValidatorScript } from '@/template/startupScripts/startTestnetValidatorScript'\nimport { startMainnetValidatorScript } from '@/template/startupScripts/startMainnetValidatorScript'\nimport { startTestnetAgaveValidatorScript } from '@/template/startupScripts/startTestnetAgaveValidatorScript'\nimport { startJitoTestnetScript } from '@/template/startupScripts/startJitoTestnetScript'\nimport { startBamTestnetScript } from '@/template/startupScripts/startBamTestnetScript'\nimport { writeFile } from 'node:fs/promises'\nimport { readOrCreateJitoConfig } from '@/lib/readOrCreateJitoConfig'\nimport { startJitoMainnetScript } from '@/template/startupScripts/startJitoMainnetScript'\nimport { startBamMainnetScript } from '@/template/startupScripts/startBamMainnetScript'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\nimport { updateLogrotate } from '../setup/updateLogrotate'\nimport { restartFiredancer } from '@/lib/restartFiredancer'\nimport { syncFirewall } from '../setup/syncFirewall.ts'\nimport { enableSolv } from '@/lib/enableSolv'\nimport { setupSolvService } from '../setup/setupSolvService'\nimport { startSolv } from '@/lib/startSolv'\n// import { 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 startup: boolean\n service: 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 isBam = config.VALIDATOR_TYPE === ValidatorType.BAM\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 (isBam) {\n version = VERSION_BAM_MAINNET\n if (isTestnet) {\n version = VERSION_BAM_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 .option('--startup', 'Start up Script', false)\n .option('--service', 'SystemD Service', 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 if (options.service) {\n await syncFirewall()\n updateLogrotate(isFrankendancer)\n setupSolvService(isTestnet)\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 XDP: false,\n ZERO_COPY: 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 if (isBam) {\n const bamVersion = isTestnet\n ? VERSION_BAM_TESTNET\n : VERSION_BAM_MAINNET\n await updateJitoSolvConfig({\n version: bamVersion,\n tag: `v${bamVersion}`,\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 if (options.startup) {\n const validatorType = config.VALIDATOR_TYPE\n let startupScript = ''\n switch (validatorType) {\n case ValidatorType.SOLANA:\n startupScript = isTestnet ? startTestnetValidatorScript() : startMainnetValidatorScript(config)\n break\n case ValidatorType.AGAVE:\n startupScript = isTestnet ? startTestnetAgaveValidatorScript(config) : startMainnetValidatorScript(config)\n break\n case ValidatorType.JITO:\n const jitoConfig = await readOrCreateJitoConfig()\n startupScript = isTestnet ? startJitoTestnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n ) : startJitoMainnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n case ValidatorType.BAM:\n const bamConfig = await readOrCreateJitoConfig()\n startupScript = isTestnet ? \n startBamTestnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n :\n startBamMainnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n break\n default:\n console.log('Unknown Validator Type for Update Script')\n break\n }\n await writeFile(STARTUP_SCRIPT, startupScript, 'utf-8')\n updateStartupScriptPermissions()\n return\n }\n if (options.background) {\n let version = options.version\n let isMajorThree = version.startsWith(\"3\") ? true : false;\n await updateDefaultConfig({\n TESTNET_SOLANA_VERSION: VERSION_TESTNET,\n MAINNET_SOLANA_VERSION: VERSION_MAINNET,\n })\n if (isTestnet) {\n await syncFirewall()\n }\n updateLogrotate(isFrankendancer)\n setupSolvService(isTestnet)\n if (isJito) {\n const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${version}-jito`\n const jitoModBase = `v${version}-mod`\n const jitoTag = options.mod || isModded ? `${jitoModBase}${jitoPatch}` : `${jitoTagBase}${jitoPatch}`\n jitoUpdate(jitoTag, options.mod || isModded, isMajorThree)\n await updateJitoSolvConfig({ version, tag: `v${version}` })\n await monitorUpdate(deliquentStake, true, minIdleTime)\n enableSolv()\n startSolv()\n return\n }\n if (isBam) {\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${version}-bam`\n const bamModBase = `v${version}-mod`\n const bamTag = options.mod || isModded ? `${bamModBase}${bamPatch}` : `${bamTagBase}${bamPatch}`\n bamUpdate(bamTag, options.mod || isModded, isMajorThree)\n await updateJitoSolvConfig({ version, tag: `v${version}` })\n await monitorUpdate(deliquentStake, true, minIdleTime)\n enableSolv()\n startSolv()\n return\n }\n if (isFrankendancer) {\n await frankendancerUpdate(config, version, options.mod || isModded)\n await monitorUpdate(deliquentStake, true, minIdleTime)\n restartFiredancer()\n return\n }\n\n await updateVersion(version, options.mod || isModded, isMajorThree)\n const deliquentStakeNum = isTestnet\n ? DELINQUENT_STAKE_TESTNET\n : DELINQUENT_STAKE_MAINNET\n\n await monitorUpdate(deliquentStakeNum, true, minIdleTime)\n enableSolv()\n startSolv()\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\nexport const BAM_RESTART_REQUIRED_MAINNET = false\nexport const BAM_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 XDP: boolean\n ZERO_COPY: 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.1.2',\n MAINNET_SOLANA_VERSION: '3.0.10',\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 XDP: false,\n ZERO_COPY: 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","import { spawnSync } from 'child_process'\n\nexport const jitoUpdate = (tag: string, mod = false, isMajorThree = false) => {\n // Update DZ\n spawnSync(\n `sudo apt install --only-upgrade doublezero doublezero-solana -y`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `sudo systemctl restart doublezerod`,\n { shell: true, stdio: 'inherit' },\n )\n if (isMajorThree) {\n if (mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\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 clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${tag}`,\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${tag} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${tag}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\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 BAM = 'bam',\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","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 XDP: false,\n ZERO_COPY: 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 BAM_RESTART_REQUIRED_TESTNET,\n BAM_RESTART_REQUIRED_MAINNET,\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 isBam = config.VALIDATOR_TYPE === ValidatorType.BAM\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 if (isBam) {\n isUpdateRequired = isMainnet\n ? BAM_RESTART_REQUIRED_MAINNET\n : BAM_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` + `_ _`\n await sendDiscord(msg)\n try {\n spawnSync(`solv update && solv update --config && solv update --startup && sudo systemctl daemon-reload && 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 const timestampRestart = Math.floor(Date.now() / 1000)\n const restartMsg = `**${address}** has restarted, catching up...\\n` + `at: <t:${timestampRestart}> (${timestampRestart})\\n` + `_ _`\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 // epoch seconds when catchup completes\n const timestampCatchup = Math.floor(Date.now() / 1000)\n\n const diffSeconds = timestampCatchup - timestampRestart\n const minutes = Math.floor(diffSeconds / 60)\n const seconds = diffSeconds % 60\n const durationStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`\n const msg = `**${address}** has caught up!\\n` + `at: <t:${timestampRestart}> (${timestampRestart})\\n` + `**${address}** took **${durationStr}** to catch up after restart!\\n` + `_ _`\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 = 30\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 { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { promises as fs } from 'fs'\nimport path from 'path';\nimport { DefaultConfigType } from '@/config/types'\nimport { Network } from '@/config/enums'\nimport modDiff from '../setup/template/firedancer/mod';\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 const {filePath: modFilePath, body: modDiffContent} = modDiff();\n // Update and restart DZ\n spawnSync(\n `sudo apt install --only-upgrade doublezero doublezero-solana -y`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `sudo systemctl restart doublezerod`,\n { shell: true, stdio: 'inherit' },\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}`,\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 spawnSync(\n `git -C /home/solv/firedancer config --global user.email \"you@example.com\"`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer config --global user.name \"Your Name\"`,\n { shell: true, stdio: 'inherit' },\n )\n await fs.mkdir(path.dirname(modFilePath), { recursive: true });\n await fs.writeFile(modFilePath, modDiffContent, \"utf8\");\n spawnSync(`sudo chown solv:solv \"${modFilePath}\"`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git -C /home/solv/firedancer apply ${modFilePath}`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git -C /home/solv/firedancer add /home/solv/firedancer/src/*`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git -C /home/solv/firedancer add /home/solv/firedancer/book/*`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git -C /home/solv/firedancer commit -m \"add mods\"`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\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 // 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 spawnSync(\n `sudo systemctl restart port-relay`,\n { shell: true, stdio: 'inherit' },\n )\n\n spawnSync(`sudo systemctl disable solv.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop solv.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n","const modDiff = () => {\n const filePath = '/home/solv/firedancer/mod.diff'\n const body = String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md\nindex a0c631ee9f..048b118660 100644\n--- a/book/api/metrics-generated.md\n+++ b/book/api/metrics-generated.md\n@@ -40,6 +40,7 @@\n | <span class=\"metrics-name\">tile_&#8203;regime_&#8203;duration_&#8203;nanos</span><br/>{tile_&#8203;regime=\"<span class=\"metrics-enum\">backpressure_&#8203;prefrag</span>\"} | counter | Mutually exclusive and exhaustive duration of time the tile spent in each of the regimes. (Backpressure + Prefrag) |\n | <span class=\"metrics-name\">tile_&#8203;regime_&#8203;duration_&#8203;nanos</span><br/>{tile_&#8203;regime=\"<span class=\"metrics-enum\">caught_&#8203;up_&#8203;postfrag</span>\"} | counter | Mutually exclusive and exhaustive duration of time the tile spent in each of the regimes. (Caught up + Postfrag) |\n | <span class=\"metrics-name\">tile_&#8203;regime_&#8203;duration_&#8203;nanos</span><br/>{tile_&#8203;regime=\"<span class=\"metrics-enum\">processing_&#8203;postfrag</span>\"} | counter | Mutually exclusive and exhaustive duration of time the tile spent in each of the regimes. (Processing + Postfrag) |\n+| <span class=\"metrics-name\">tile_&#8203;regime_&#8203;duration_&#8203;nanos</span><br/>{tile_&#8203;regime=\"<span class=\"metrics-enum\">sleeping</span>\"} | counter | Mutually exclusive and exhaustive duration of time the tile spent in each of the regimes. (Sleeping) |\n \n </div>\n \ndiff --git a/src/app/fdctl/commands/run_agave.c b/src/app/fdctl/commands/run_agave.c\nindex 1cfd98e148..e2a347164c 100644\n--- a/src/app/fdctl/commands/run_agave.c\n+++ b/src/app/fdctl/commands/run_agave.c\n@@ -37,7 +37,8 @@ clone_labs_memory_space_tiles( config_t * config ) {\n !strcmp( wksp->name, \"metric_in\" ) ||\n !strcmp( wksp->name, \"bank\" ) ||\n !strcmp( wksp->name, \"poh\" ) ||\n- !strcmp( wksp->name, \"store\" ) ) ) {\n+ !strcmp( wksp->name, \"store\" ) ||\n+ !strcmp( wksp->name, \"leader_state\" ) ) ) {\n fd_topo_join_workspace( &config->topo, wksp, FD_SHMEM_JOIN_MODE_READ_WRITE );\n }\n }\ndiff --git a/src/app/fdctl/config/default.toml b/src/app/fdctl/config/default.toml\nindex 9c3c5ed0a9..475f4958f7 100644\n--- a/src/app/fdctl/config/default.toml\n+++ b/src/app/fdctl/config/default.toml\n@@ -814,6 +814,21 @@ dynamic_port_range = \"8900-9000\"\n # very high TPS rates because the cluster size will be very small.\n shred_tile_count = 1\n \n+ # Enable low power mode for tiles to reduce CPU usage when idle.\n+ #\n+ # By default, Firedancer is designed to maximize performance by\n+ # dedicating CPU cores exclusively to each tile, spinning continuously\n+ # to minimize latency. This ensures the fastest possible response to\n+ # incoming work and is optimal for low-latency, high-throughput environments.\n+ #\n+ # In contrast, this option allows tiles to sleep after detecting inactivity\n+ # rather than continuously spinning for new work. This significantly reduces\n+ # power consumption and CPU usage but introduces a slight latency overhead.\n+ # Enable this if power efficiency is a priority.\n+ #\n+ # The default is false to maintain optimal performance.\n+ low_power_mode = false\n+\n # All memory that will be used in Firedancer is pre-allocated in two\n # kinds of pages: huge and gigantic. Huge pages are 2 MiB and gigantic\n # pages are 1 GiB. This is done to prevent TLB misses which can have a\ndiff --git a/src/app/fdctl/topology.c b/src/app/fdctl/topology.c\nindex 64b7782437..3598a9a580 100644\n--- a/src/app/fdctl/topology.c\n+++ b/src/app/fdctl/topology.c\n@@ -42,6 +42,7 @@ fd_topo_initialize( config_t * config ) {\n fd_topo_t * topo = { fd_topob_new( &config->topo, config->name ) };\n topo->max_page_size = fd_cstr_to_shmem_page_sz( config->hugetlbfs.max_page_size );\n topo->gigantic_page_threshold = config->hugetlbfs.gigantic_page_threshold_mib << 20;\n+ topo->low_power_mode = config->layout.low_power_mode;\n \n /* topo, name */\n fd_topob_wksp( topo, \"metric_in\" );\n@@ -352,6 +353,26 @@ fd_topo_initialize( config_t * config ) {\n }\n }\n \n+ /* Leader state fseq for low-power mode.\n+ Signals whether validator is currently leader (1) or not (0). PoH tile\n+ writes when leader status changes; other tiles read to determine if they\n+ should sleep when idle. Enables power savings while maintaining peak\n+ performance during leader slots. */\n+\n+ if( FD_UNLIKELY( topo->low_power_mode ) ) {\n+ fd_topob_wksp( topo, \"leader_state\" );\n+ fd_topo_obj_t * leader_state_obj = fd_topob_obj( topo, \"fseq\", \"leader_state\" );\n+ for( ulong i=0UL; i<topo->tile_cnt; i++ ) {\n+ if( FD_UNLIKELY( topo->tiles[i].idle_sleep ) ) {\n+ if( FD_UNLIKELY( !strcmp(topo->tiles[i].name, \"poh\") ) )\n+ fd_topob_tile_uses(topo, &topo->tiles[i], leader_state_obj, FD_SHMEM_JOIN_MODE_READ_WRITE);\n+ else\n+ fd_topob_tile_uses(topo, &topo->tiles[i], leader_state_obj, FD_SHMEM_JOIN_MODE_READ_ONLY);\n+ }\n+ }\n+ FD_TEST( fd_pod_insertf_ulong( topo->props, leader_state_obj->id, \"leader_state\" ));\n+ }\n+\n /* There is a special fseq that sits between the pack, bank, and poh\n tiles to indicate when the bank/poh tiles are done processing a\n microblock. Pack uses this to determine when to \"unlock\" accounts\ndiff --git a/src/app/firedancer/topology.c b/src/app/firedancer/topology.c\nindex f8918eaceb..54ea76d24f 100644\n--- a/src/app/firedancer/topology.c\n+++ b/src/app/firedancer/topology.c\n@@ -232,6 +232,7 @@ fd_topo_initialize( config_t * config ) {\n fd_topo_t * topo = { fd_topob_new( &config->topo, config->name ) };\n topo->max_page_size = fd_cstr_to_shmem_page_sz( config->hugetlbfs.max_page_size );\n topo->gigantic_page_threshold = config->hugetlbfs.gigantic_page_threshold_mib << 20;\n+ topo->low_power_mode = config->layout.low_power_mode;\n \n /* topo, name */\n fd_topob_wksp( topo, \"metric_in\" );\n@@ -445,7 +446,7 @@ fd_topo_initialize( config_t * config ) {\n /**/ fd_topob_tile( topo, \"sign\", \"sign\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 1 );\n /**/ fd_topob_tile( topo, \"metric\", \"metric\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 0 );\n fd_topo_tile_t * pack_tile = fd_topob_tile( topo, \"pack\", \"pack\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 0 );\n- /**/ fd_topob_tile( topo, \"poh\", \"poh\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 1 );\n+ /**/ fd_topob_tile( topo, \"poh\", \"poh\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 1 );\n /**/ fd_topob_tile( topo, \"gossip\", \"gossip\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 0 );\n fd_topo_tile_t * repair_tile = fd_topob_tile( topo, \"repair\", \"repair\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 0 );\n /**/ fd_topob_tile( topo, \"send\", \"send\", \"metric_in\", tile_to_cpu[ topo->tile_cnt ], 0, 0 );\ndiff --git a/src/app/shared/commands/monitor/generated/monitor_seccomp.h b/src/app/shared/commands/monitor/generated/monitor_seccomp.h\nindex c374b8cf95..eb7a17dcf4 100644\n--- a/src/app/shared/commands/monitor/generated/monitor_seccomp.h\n+++ b/src/app/shared/commands/monitor/generated/monitor_seccomp.h\n@@ -21,75 +21,83 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_monitor_instr_cnt = 36;\n+static const unsigned int sock_filter_policy_monitor_instr_cnt = 40;\n \n static void populate_sock_filter_policy_monitor( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd, unsigned int drain_output_fd) {\n- FD_TEST( out_cnt >= 36 );\n- struct sock_filter filter[36] = {\n+ FD_TEST( out_cnt >= 40 );\n+ struct sock_filter filter[40] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 32 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 36 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 8, 0 ),\n /* allow fsync based on expression */\n BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 13, 0 ),\n- /* simply allow nanosleep */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_nanosleep, /* RET_ALLOW */ 29, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 14, 0 ),\n /* simply allow sched_yield */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 28, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 32, 0 ),\n /* simply allow exit_group */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_exit_group, /* RET_ALLOW */ 27, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_exit_group, /* RET_ALLOW */ 31, 0 ),\n /* allow read based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_read, /* check_read */ 11, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_read, /* check_read */ 15, 0 ),\n /* allow ioctl based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_ioctl, /* check_ioctl */ 14, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_ioctl, /* check_ioctl */ 18, 0 ),\n /* allow pselect6 based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_pselect6, /* check_pselect6 */ 19, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_pselect6, /* check_pselect6 */ 23, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 22 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 26 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 1, /* RET_ALLOW */ 21, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 1, /* RET_ALLOW */ 25, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 19, /* lbl_2 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 23, /* lbl_2 */ 0 ),\n // lbl_2:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 17, /* RET_KILL_PROCESS */ 16 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 21, /* RET_KILL_PROCESS */ 20 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 15, /* RET_KILL_PROCESS */ 14 ),\n-// check_read:\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 19, /* RET_KILL_PROCESS */ 18 ),\n+// check_clock_nanosleep:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, drain_output_fd, /* RET_ALLOW */ 13, /* lbl_3 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_3 */ 0, /* RET_KILL_PROCESS */ 16 ),\n // lbl_3:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 15, /* RET_KILL_PROCESS */ 14 ),\n+// check_read:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, drain_output_fd, /* RET_ALLOW */ 13, /* lbl_4 */ 0 ),\n+// lbl_4:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 11, /* RET_KILL_PROCESS */ 10 ),\n // check_ioctl:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 8 ),\n-// lbl_4:\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 8 ),\n+// lbl_5:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCGETS, /* RET_ALLOW */ 7, /* lbl_5 */ 0 ),\n-// lbl_5:\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCGETS, /* RET_ALLOW */ 7, /* lbl_6 */ 0 ),\n+// lbl_6:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCSETS, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n // check_pselect6:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 1, /* lbl_6 */ 0, /* RET_KILL_PROCESS */ 2 ),\n-// lbl_6:\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 1, /* lbl_7 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_7:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\ndiff --git a/src/app/shared/commands/monitor/monitor.c b/src/app/shared/commands/monitor/monitor.c\nindex 790befe9c8..7c646562e3 100644\n--- a/src/app/shared/commands/monitor/monitor.c\n+++ b/src/app/shared/commands/monitor/monitor.c\n@@ -362,8 +362,8 @@ run_monitor( config_t const * config,\n char now_cstr[ FD_LOG_WALLCLOCK_CSTR_BUF_SZ ];\n if( !monitor_pane ) {\n PRINT( \"snapshot for %s | Use TAB to switch panes\" TEXT_NEWLINE, fd_log_wallclock_cstr( now, now_cstr ) );\n- PRINT( \" tile | pid | stale | heart | nivcsw | nvcsw | in backp | backp cnt | %% hkeep | %% wait | %% backp | %% finish\" TEXT_NEWLINE );\n- PRINT( \"---------+---------+------------+-------+---------------------+---------------------+----------+---------------------+----------+----------+----------+----------\" TEXT_NEWLINE );\n+ PRINT( \" tile | pid | stale | heart | nivcsw | nvcsw | in backp | backp cnt | %% hkeep | %% wait | %% backp | %% finish | %% sleep\" TEXT_NEWLINE );\n+ PRINT( \"---------+---------+------------+-------+---------------------+---------------------+----------+---------------------+----------+----------+----------+----------+-----------\" TEXT_NEWLINE );\n for( ulong tile_idx=0UL; tile_idx<topo->tile_cnt; tile_idx++ ) {\n tile_snap_t * prv = &tile_snap_prv[ tile_idx ];\n tile_snap_t * cur = &tile_snap_cur[ tile_idx ];\n@@ -385,6 +385,9 @@ run_monitor( config_t const * config,\n ulong cur_backp_ticks = cur->regime_ticks[5];\n ulong prv_backp_ticks = prv->regime_ticks[5];\n \n+ ulong cur_sleeping_ticks = cur->regime_ticks[8];\n+ ulong prv_sleeping_ticks = prv->regime_ticks[8];\n+\n ulong cur_processing_ticks = cur->regime_ticks[4]+cur->regime_ticks[7];\n ulong prv_processing_ticks = prv->regime_ticks[4]+prv->regime_ticks[7];\n \n@@ -392,6 +395,7 @@ run_monitor( config_t const * config,\n PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_wait_ticks, prv_wait_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_backp_ticks, prv_backp_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_processing_ticks, prv_processing_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n+ PRINT( \" | \" ); printf_pct( &buf, &buf_sz, cur_sleeping_ticks, prv_sleeping_ticks, 0., tile_total_ticks( cur ), tile_total_ticks( prv ), DBL_MIN );\n PRINT( TEXT_NEWLINE );\n }\n } else {\ndiff --git a/src/app/shared/commands/monitor/monitor.seccomppolicy b/src/app/shared/commands/monitor/monitor.seccomppolicy\nindex 0054eefaf1..2984e700c0 100644\n--- a/src/app/shared/commands/monitor/monitor.seccomppolicy\n+++ b/src/app/shared/commands/monitor/monitor.seccomppolicy\n@@ -33,8 +33,10 @@ fsync: (eq (arg 0) logfile_fd)\n #\n # The monitor calls fd_log_wait_until() to wait until the diagnostic\n # output screen should be refreshed, and that function can call\n-# nanosleep depending on the amount of time left to wait.\n-nanosleep\n+# clock_nanosleep (syscall used by glibc's nanosleep) depending\n+# on the amount of time left to wait.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n \n # monitor: wait until we need to print again\n #\ndiff --git a/src/app/shared/fd_config.h b/src/app/shared/fd_config.h\nindex 5741245751..f6b34830e6 100644\n--- a/src/app/shared/fd_config.h\n+++ b/src/app/shared/fd_config.h\n@@ -259,6 +259,7 @@ struct fd_config {\n uint verify_tile_count;\n uint bank_tile_count;\n uint shred_tile_count;\n+ int low_power_mode;\n } layout;\n \n struct {\ndiff --git a/src/app/shared/fd_config_parse.c b/src/app/shared/fd_config_parse.c\nindex 3cdf8e4082..9124448e31 100644\n--- a/src/app/shared/fd_config_parse.c\n+++ b/src/app/shared/fd_config_parse.c\n@@ -162,6 +162,7 @@ fd_config_extract_pod( uchar * pod,\n CFG_POP ( uint, layout.verify_tile_count );\n CFG_POP ( uint, layout.bank_tile_count );\n CFG_POP ( uint, layout.shred_tile_count );\n+ CFG_POP ( bool, layout.low_power_mode );\n \n CFG_POP ( cstr, hugetlbfs.mount_path );\n CFG_POP ( cstr, hugetlbfs.max_page_size );\ndiff --git a/src/app/shared_dev/commands/pktgen/pktgen.c b/src/app/shared_dev/commands/pktgen/pktgen.c\nindex 347a9a5fd2..47cb549bce 100644\n--- a/src/app/shared_dev/commands/pktgen/pktgen.c\n+++ b/src/app/shared_dev/commands/pktgen/pktgen.c\n@@ -130,6 +130,7 @@ render_status( ulong volatile const * net_metrics ) {\n /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_PROCESSING_PREFRAG ) ];\n /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];\n /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_PROCESSING_POSTFRAG ) ];\n+ /* */ cum_tick_now += net_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_SLEEPING ) ];\n ulong rx_ok_now = net_metrics[ MIDX( COUNTER, NET, RX_PKT_CNT ) ];\n ulong rx_byte_now = net_metrics[ MIDX( COUNTER, NET, RX_BYTES_TOTAL ) ];\n ulong rx_drop_now = net_metrics[ MIDX( COUNTER, NET, RX_FILL_BLOCKED_CNT ) ];\ndiff --git a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c\nindex 2ebdf45367..0afb7022de 100644\n--- a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c\n+++ b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_log_tile.c\n@@ -70,19 +70,21 @@ fd_quic_trace_log_tile( fd_frag_meta_t const * in_mcache ) {\n \n uchar scratch[ sizeof(fd_stem_tile_in_t)+128 ] __attribute__((aligned(FD_STEM_SCRATCH_ALIGN)));\n \n- stem_run1( /* in_cnt */ 1UL,\n- /* in_mcache */ in_mcache_tbl,\n- /* in_fseq */ fseq_tbl,\n- /* out_cnt */ 0UL,\n- /* out_mcache */ NULL,\n- /* cons_cnt */ 0UL,\n- /* cons_out */ NULL,\n- /* cons_fseq */ NULL,\n- /* stem_burst */ 1UL,\n- /* stem_lazy */ 0L,\n- /* rng */ rng,\n- /* scratch */ scratch,\n- /* ctx */ NULL );\n+ stem_run1( /* in_cnt */ 1UL,\n+ /* in_mcache */ in_mcache_tbl,\n+ /* in_fseq */ fseq_tbl,\n+ /* out_cnt */ 0UL,\n+ /* out_mcache */ NULL,\n+ /* cons_cnt */ 0UL,\n+ /* cons_out */ NULL,\n+ /* cons_fseq */ NULL,\n+ /* idle_sleep */ 0,\n+ /* stem_burst */ 1UL,\n+ /* stem_lazy */ 0L,\n+ /* rng */ rng,\n+ /* leader_state */ NULL,\n+ /* scratch */ scratch,\n+ /* ctx */ NULL );\n \n fd_fseq_delete( fd_fseq_leave( fseq ) );\n }\ndiff --git a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c\nindex a8463e4423..cd570bd345 100644\n--- a/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c\n+++ b/src/app/shared_dev/commands/quic_trace/fd_quic_trace_rx_tile.c\n@@ -539,19 +539,21 @@ fd_quic_trace_rx_tile( fd_quic_trace_ctx_t * trace_ctx,\n \n fd_frag_meta_t const * in_mcache_tbl[2] = { rx_mcache, tx_mcache };\n \n- stem_run1( /* in_cnt */ 2UL,\n- /* in_mcache */ in_mcache_tbl,\n- /* in_fseq */ fseq_tbl,\n- /* out_cnt */ 0UL,\n- /* out_mcache */ NULL,\n- /* cons_cnt */ 0UL,\n- /* cons_out */ NULL,\n- /* cons_fseq */ NULL,\n- /* stem_burst */ 1UL,\n- /* stem_lazy */ 0L,\n- /* rng */ rng,\n- /* scratch */ scratch,\n- /* ctx */ trace_ctx );\n+ stem_run1( /* in_cnt */ 2UL,\n+ /* in_mcache */ in_mcache_tbl,\n+ /* in_fseq */ fseq_tbl,\n+ /* out_cnt */ 0UL,\n+ /* out_mcache */ NULL,\n+ /* cons_cnt */ 0UL,\n+ /* cons_out */ NULL,\n+ /* cons_fseq */ NULL,\n+ /* idle_sleep */ 0,\n+ /* stem_burst */ 1UL,\n+ /* stem_lazy */ 0L,\n+ /* rng */ rng,\n+ /* leader_state */ NULL,\n+ /* scratch */ scratch,\n+ /* ctx */ trace_ctx );\n \n for( int j = 0; j < 2; ++j ){\n fd_fseq_delete( fd_fseq_leave( fseq_tbl[j] ) );\ndiff --git a/src/disco/bundle/fd_bundle_tile.seccomppolicy b/src/disco/bundle/fd_bundle_tile.seccomppolicy\nindex 645e63a964..13e8a87312 100644\n--- a/src/disco/bundle/fd_bundle_tile.seccomppolicy\n+++ b/src/disco/bundle/fd_bundle_tile.seccomppolicy\n@@ -119,3 +119,19 @@ lseek: (and (or (eq (arg 0) etc_resolv_conf)\n (eq (arg 0) etc_hosts_fd))\n (eq (arg 1) 0)\n (eq (arg 2) \"SEEK_SET\"))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/bundle/generated/fd_bundle_tile_seccomp.h b/src/disco/bundle/generated/fd_bundle_tile_seccomp.h\nindex a4459a5b31..8261274a81 100644\n--- a/src/disco/bundle/generated/fd_bundle_tile_seccomp.h\n+++ b/src/disco/bundle/generated/fd_bundle_tile_seccomp.h\n@@ -21,92 +21,96 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_bundle_tile_instr_cnt = 95;\n+static const unsigned int sock_filter_policy_fd_bundle_tile_instr_cnt = 101;\n \n static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct sock_filter * out, uint logfile_fd, uint keylog_fd, uint etc_hosts_fd, uint etc_resolv_conf) {\n- FD_TEST( out_cnt >= 95 );\n- struct sock_filter filter[95] = {\n+ FD_TEST( out_cnt >= 101 );\n+ struct sock_filter filter[101] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 91 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 97 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* simply allow read */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_read, /* RET_ALLOW */ 90, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_read, /* RET_ALLOW */ 96, 0 ),\n /* allow recvmsg based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_recvmsg, /* check_recvmsg */ 18, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_recvmsg, /* check_recvmsg */ 20, 0 ),\n /* simply allow write */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* RET_ALLOW */ 88, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* RET_ALLOW */ 94, 0 ),\n /* allow writev based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_writev, /* check_writev */ 20, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_writev, /* check_writev */ 22, 0 ),\n /* allow sendmsg based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendmsg, /* check_sendmsg */ 23, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendmsg, /* check_sendmsg */ 25, 0 ),\n /* allow sendto based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendto, /* check_sendto */ 28, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendto, /* check_sendto */ 30, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 29, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 31, 0 ),\n /* allow socket based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_socket, /* check_socket */ 30, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_socket, /* check_socket */ 32, 0 ),\n /* simply allow connect */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_connect, /* RET_ALLOW */ 82, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_connect, /* RET_ALLOW */ 88, 0 ),\n /* allow shutdown based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_shutdown, /* check_shutdown */ 46, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_shutdown, /* check_shutdown */ 48, 0 ),\n /* simply allow close */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_close, /* RET_ALLOW */ 80, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_close, /* RET_ALLOW */ 86, 0 ),\n /* allow fcntl based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fcntl, /* check_fcntl */ 46, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fcntl, /* check_fcntl */ 48, 0 ),\n /* allow bind based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_bind, /* check_bind */ 49, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_bind, /* check_bind */ 51, 0 ),\n /* simply allow poll */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_poll, /* RET_ALLOW */ 77, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_poll, /* RET_ALLOW */ 83, 0 ),\n /* allow setsockopt based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_setsockopt, /* check_setsockopt */ 51, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_setsockopt, /* check_setsockopt */ 53, 0 ),\n /* simply allow getsockname */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getsockname, /* RET_ALLOW */ 75, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getsockname, /* RET_ALLOW */ 81, 0 ),\n /* simply allow getpid */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getpid, /* RET_ALLOW */ 74, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getpid, /* RET_ALLOW */ 80, 0 ),\n /* simply allow getrandom */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getrandom, /* RET_ALLOW */ 73, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getrandom, /* RET_ALLOW */ 79, 0 ),\n /* allow lseek based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_lseek, /* check_lseek */ 63, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_lseek, /* check_lseek */ 65, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 72, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 76, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 70 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 74 },\n // check_recvmsg:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL|MSG_DONTWAIT, /* RET_ALLOW */ 69, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL|MSG_DONTWAIT, /* RET_ALLOW */ 73, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 67, /* RET_KILL_PROCESS */ 66 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 71, /* RET_KILL_PROCESS */ 70 ),\n // check_writev:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, keylog_fd, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 64 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, keylog_fd, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 68 ),\n // lbl_2:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 63, /* RET_KILL_PROCESS */ 62 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 67, /* RET_KILL_PROCESS */ 66 ),\n // check_sendmsg:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL|MSG_DONTWAIT, /* RET_ALLOW */ 61, /* lbl_3 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL|MSG_DONTWAIT, /* RET_ALLOW */ 65, /* lbl_3 */ 0 ),\n // lbl_3:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_FASTOPEN|MSG_NOSIGNAL, /* RET_ALLOW */ 59, /* lbl_4 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_FASTOPEN|MSG_NOSIGNAL, /* RET_ALLOW */ 63, /* lbl_4 */ 0 ),\n // lbl_4:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL, /* RET_ALLOW */ 57, /* RET_KILL_PROCESS */ 56 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL, /* RET_ALLOW */ 61, /* RET_KILL_PROCESS */ 60 ),\n // check_sendto:\n /* load syscall argument 3 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[3])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL, /* RET_ALLOW */ 55, /* RET_KILL_PROCESS */ 54 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_NOSIGNAL, /* RET_ALLOW */ 59, /* RET_KILL_PROCESS */ 58 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 53, /* RET_KILL_PROCESS */ 52 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 57, /* RET_KILL_PROCESS */ 56 ),\n // check_socket:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n@@ -114,7 +118,7 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_6:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, AF_INET6, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 48 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, AF_INET6, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 52 ),\n // lbl_5:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n@@ -126,7 +130,7 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_8:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 43, /* lbl_7 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 47, /* lbl_7 */ 0 ),\n // lbl_7:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n@@ -134,35 +138,35 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_11:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 39, /* lbl_10 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 43, /* lbl_10 */ 0 ),\n // lbl_10:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SOCK_DGRAM|SOCK_CLOEXEC, /* lbl_12 */ 0, /* RET_KILL_PROCESS */ 36 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SOCK_DGRAM|SOCK_CLOEXEC, /* lbl_12 */ 0, /* RET_KILL_PROCESS */ 40 ),\n // lbl_12:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_UDP, /* RET_ALLOW */ 35, /* RET_KILL_PROCESS */ 34 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_UDP, /* RET_ALLOW */ 39, /* RET_KILL_PROCESS */ 38 ),\n // check_shutdown:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SHUT_WR, /* RET_ALLOW */ 33, /* RET_KILL_PROCESS */ 32 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SHUT_WR, /* RET_ALLOW */ 37, /* RET_KILL_PROCESS */ 36 ),\n // check_fcntl:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, F_SETFL, /* lbl_13 */ 0, /* RET_KILL_PROCESS */ 30 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, F_SETFL, /* lbl_13 */ 0, /* RET_KILL_PROCESS */ 34 ),\n // lbl_13:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, O_NONBLOCK, /* RET_ALLOW */ 29, /* RET_KILL_PROCESS */ 28 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, O_NONBLOCK, /* RET_ALLOW */ 33, /* RET_KILL_PROCESS */ 32 ),\n // check_bind:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, sizeof(struct sockaddr_in), /* RET_ALLOW */ 27, /* lbl_14 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, sizeof(struct sockaddr_in), /* RET_ALLOW */ 31, /* lbl_14 */ 0 ),\n // lbl_14:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, sizeof(struct sockaddr_in6), /* RET_ALLOW */ 25, /* RET_KILL_PROCESS */ 24 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, sizeof(struct sockaddr_in6), /* RET_ALLOW */ 29, /* RET_KILL_PROCESS */ 28 ),\n // check_setsockopt:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n@@ -170,7 +174,7 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_16:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SO_RCVBUF, /* RET_ALLOW */ 21, /* lbl_15 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SO_RCVBUF, /* RET_ALLOW */ 25, /* lbl_15 */ 0 ),\n // lbl_15:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n@@ -178,7 +182,7 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_18:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCP_NODELAY, /* RET_ALLOW */ 17, /* lbl_17 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCP_NODELAY, /* RET_ALLOW */ 21, /* lbl_17 */ 0 ),\n // lbl_17:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n@@ -186,15 +190,15 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_20:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCP_FASTOPEN_CONNECT, /* RET_ALLOW */ 13, /* lbl_19 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, TCP_FASTOPEN_CONNECT, /* RET_ALLOW */ 17, /* lbl_19 */ 0 ),\n // lbl_19:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_IPV6, /* lbl_21 */ 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_IPV6, /* lbl_21 */ 0, /* RET_KILL_PROCESS */ 14 ),\n // lbl_21:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, IPV6_V6ONLY, /* RET_ALLOW */ 9, /* RET_KILL_PROCESS */ 8 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, IPV6_V6ONLY, /* RET_ALLOW */ 13, /* RET_KILL_PROCESS */ 12 ),\n // check_lseek:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n@@ -202,15 +206,23 @@ static void populate_sock_filter_policy_fd_bundle_tile( ulong out_cnt, struct so\n // lbl_23:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, etc_hosts_fd, /* lbl_22 */ 0, /* RET_KILL_PROCESS */ 4 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, etc_hosts_fd, /* lbl_22 */ 0, /* RET_KILL_PROCESS */ 8 ),\n // lbl_22:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_24 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_24 */ 0, /* RET_KILL_PROCESS */ 6 ),\n // lbl_24:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SEEK_SET, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SEEK_SET, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_25 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_25:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/cswtch/fd_cswtch_tile.c b/src/disco/cswtch/fd_cswtch_tile.c\nindex 6332d01594..af9b2bec5f 100644\n--- a/src/disco/cswtch/fd_cswtch_tile.c\n+++ b/src/disco/cswtch/fd_cswtch_tile.c\n@@ -228,6 +228,7 @@ populate_allowed_fds( fd_topo_t const * topo,\n \n #define STEM_BURST (1UL)\n #define STEM_LAZY ((long)10e6) /* 10ms */\n+#define STEM_IDLE_SLEEP_ENABLED (0)\n \n #define STEM_CALLBACK_CONTEXT_TYPE fd_cswtch_ctx_t\n #define STEM_CALLBACK_CONTEXT_ALIGN alignof(fd_cswtch_ctx_t)\ndiff --git a/src/disco/dedup/fd_dedup_tile.seccomppolicy b/src/disco/dedup/fd_dedup_tile.seccomppolicy\nindex a5880d7c08..adcf27ca3f 100644\n--- a/src/disco/dedup/fd_dedup_tile.seccomppolicy\n+++ b/src/disco/dedup/fd_dedup_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/dedup/generated/fd_dedup_tile_seccomp.h b/src/disco/dedup/generated/fd_dedup_tile_seccomp.h\nindex 164375a06d..4073dee8b7 100644\n--- a/src/disco/dedup/generated/fd_dedup_tile_seccomp.h\n+++ b/src/disco/dedup/generated/fd_dedup_tile_seccomp.h\n@@ -21,34 +21,46 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_dedup_tile_instr_cnt = 14;\n+static const unsigned int sock_filter_policy_fd_dedup_tile_instr_cnt = 20;\n \n static void populate_sock_filter_policy_fd_dedup_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd) {\n- FD_TEST( out_cnt >= 14 );\n- struct sock_filter filter[14] = {\n+ FD_TEST( out_cnt >= 20 );\n+ struct sock_filter filter[20] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 16 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 2, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 4, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 7, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 8, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 12, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 6 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 10 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_2:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/gui/fd_gui.c b/src/disco/gui/fd_gui.c\nindex 7a493dd5b0..11ff0207ca 100644\n--- a/src/disco/gui/fd_gui.c\n+++ b/src/disco/gui/fd_gui.c\n@@ -229,6 +229,7 @@ fd_gui_tile_timers_snap( fd_gui_t * gui ) {\n cur[ i ].backpressure_prefrag_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];\n cur[ i ].caughtup_postfrag_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ];\n cur[ i ].processing_postfrag_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_PROCESSING_POSTFRAG ) ];\n+ cur[ i ].sleeping_ticks = tile_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_SLEEPING ) ];\n }\n }\n \ndiff --git a/src/disco/gui/fd_gui.h b/src/disco/gui/fd_gui.h\nindex 948b0050d3..4f6a8aeba2 100644\n--- a/src/disco/gui/fd_gui.h\n+++ b/src/disco/gui/fd_gui.h\n@@ -155,6 +155,7 @@ struct fd_gui_tile_timers {\n \n ulong caughtup_postfrag_ticks;\n ulong processing_postfrag_ticks;\n+ ulong sleeping_ticks;\n };\n \n typedef struct fd_gui_tile_timers fd_gui_tile_timers_t;\ndiff --git a/src/disco/gui/fd_gui_printf.c b/src/disco/gui/fd_gui_printf.c\nindex ec2e9f30fd..5f40aaee19 100644\n--- a/src/disco/gui/fd_gui_printf.c\n+++ b/src/disco/gui/fd_gui_printf.c\n@@ -675,7 +675,8 @@ fd_gui_printf_tile_timers( fd_gui_t * gui,\n + cur[ i ].processing_prefrag_ticks\n + cur[ i ].backpressure_prefrag_ticks\n + cur[ i ].caughtup_postfrag_ticks\n- + cur[ i ].processing_postfrag_ticks);\n+ + cur[ i ].processing_postfrag_ticks\n+ + cur[ i ].sleeping_ticks);\n \n double prev_total = (double)(prev[ i ].caughtup_housekeeping_ticks\n + prev[ i ].processing_housekeeping_ticks\n@@ -684,7 +685,8 @@ fd_gui_printf_tile_timers( fd_gui_t * gui,\n + prev[ i ].processing_prefrag_ticks\n + prev[ i ].backpressure_prefrag_ticks\n + prev[ i ].caughtup_postfrag_ticks\n- + prev[ i ].processing_postfrag_ticks);\n+ + prev[ i ].processing_postfrag_ticks\n+ + prev[ i ].sleeping_ticks);\n \n double idle;\n if( FD_UNLIKELY( cur_total==prev_total ) ) {\ndiff --git a/src/disco/gui/fd_gui_tile.seccomppolicy b/src/disco/gui/fd_gui_tile.seccomppolicy\nindex 9b1186782d..28a04f0153 100644\n--- a/src/disco/gui/fd_gui_tile.seccomppolicy\n+++ b/src/disco/gui/fd_gui_tile.seccomppolicy\n@@ -64,6 +64,20 @@ close: (not (or (eq (arg 0) 2)\n (eq (arg 0) gui_socket_fd)))\n \n # server: serving pages over HTTP requires polling connections\n-#\n-# arg 2 is the timeout.\n poll: (eq (arg 2) 0)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/gui/generated/fd_gui_tile_seccomp.h b/src/disco/gui/generated/fd_gui_tile_seccomp.h\nindex 096e69a69e..75b0a79209 100644\n--- a/src/disco/gui/generated/fd_gui_tile_seccomp.h\n+++ b/src/disco/gui/generated/fd_gui_tile_seccomp.h\n@@ -21,99 +21,111 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_gui_tile_instr_cnt = 47;\n+static const unsigned int sock_filter_policy_fd_gui_tile_instr_cnt = 53;\n \n static void populate_sock_filter_policy_fd_gui_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd, unsigned int gui_socket_fd) {\n- FD_TEST( out_cnt >= 47 );\n- struct sock_filter filter[47] = {\n+ FD_TEST( out_cnt >= 53 );\n+ struct sock_filter filter[53] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 43 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 49 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 7, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 9, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 10, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 12, 0 ),\n /* allow accept4 based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_accept4, /* check_accept4 */ 11, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_accept4, /* check_accept4 */ 13, 0 ),\n /* allow read based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_read, /* check_read */ 18, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_read, /* check_read */ 20, 0 ),\n /* allow sendto based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendto, /* check_sendto */ 23, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendto, /* check_sendto */ 25, 0 ),\n /* allow close based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_close, /* check_close */ 28, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_close, /* check_close */ 30, 0 ),\n /* allow poll based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_poll, /* check_poll */ 33, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_poll, /* check_poll */ 35, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 36, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 40, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 34 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 38 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 33, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 37, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 31, /* RET_KILL_PROCESS */ 30 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 35, /* RET_KILL_PROCESS */ 34 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 29, /* RET_KILL_PROCESS */ 28 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 33, /* RET_KILL_PROCESS */ 32 ),\n // check_accept4:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 26 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 30 ),\n // lbl_2:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_3 */ 0, /* RET_KILL_PROCESS */ 24 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_3 */ 0, /* RET_KILL_PROCESS */ 28 ),\n // lbl_3:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 22 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 26 ),\n // lbl_4:\n /* load syscall argument 3 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[3])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SOCK_CLOEXEC|SOCK_NONBLOCK, /* RET_ALLOW */ 21, /* RET_KILL_PROCESS */ 20 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SOCK_CLOEXEC|SOCK_NONBLOCK, /* RET_ALLOW */ 25, /* RET_KILL_PROCESS */ 24 ),\n // check_read:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_KILL_PROCESS */ 18, /* lbl_5 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_KILL_PROCESS */ 22, /* lbl_5 */ 0 ),\n // lbl_5:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_KILL_PROCESS */ 16, /* lbl_6 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_KILL_PROCESS */ 20, /* lbl_6 */ 0 ),\n // lbl_6:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* RET_KILL_PROCESS */ 14, /* RET_ALLOW */ 15 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* RET_KILL_PROCESS */ 18, /* RET_ALLOW */ 19 ),\n // check_sendto:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_KILL_PROCESS */ 12, /* lbl_7 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_KILL_PROCESS */ 16, /* lbl_7 */ 0 ),\n // lbl_7:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_KILL_PROCESS */ 10, /* lbl_8 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_KILL_PROCESS */ 14, /* lbl_8 */ 0 ),\n // lbl_8:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* RET_KILL_PROCESS */ 8, /* RET_ALLOW */ 9 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* RET_KILL_PROCESS */ 12, /* RET_ALLOW */ 13 ),\n // check_close:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_KILL_PROCESS */ 6, /* lbl_9 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_KILL_PROCESS */ 10, /* lbl_9 */ 0 ),\n // lbl_9:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_KILL_PROCESS */ 4, /* lbl_10 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_KILL_PROCESS */ 8, /* lbl_10 */ 0 ),\n // lbl_10:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* RET_KILL_PROCESS */ 2, /* RET_ALLOW */ 3 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, gui_socket_fd, /* RET_KILL_PROCESS */ 6, /* RET_ALLOW */ 7 ),\n // check_poll:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_11 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_11:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\ndiff --git a/src/disco/metrics/fd_metric_tile.c b/src/disco/metrics/fd_metric_tile.c\nindex f4df88a5fd..ec31729743 100644\n--- a/src/disco/metrics/fd_metric_tile.c\n+++ b/src/disco/metrics/fd_metric_tile.c\n@@ -163,6 +163,7 @@ populate_allowed_fds( fd_topo_t const * topo,\n \n #define STEM_BURST (1UL)\n #define STEM_LAZY ((long)10e6) /* 10ms */\n+#define STEM_IDLE_SLEEP_ENABLED (0)\n \n #define STEM_CALLBACK_CONTEXT_TYPE fd_metric_ctx_t\n #define STEM_CALLBACK_CONTEXT_ALIGN alignof(fd_metric_ctx_t)\ndiff --git a/src/disco/metrics/generated/fd_metrics_all.c b/src/disco/metrics/generated/fd_metrics_all.c\nindex 739137b449..ea0d1bfa7b 100644\n--- a/src/disco/metrics/generated/fd_metrics_all.c\n+++ b/src/disco/metrics/generated/fd_metrics_all.c\n@@ -18,6 +18,7 @@ const fd_metrics_meta_t FD_METRICS_ALL[FD_METRICS_ALL_TOTAL] = {\n DECLARE_METRIC_ENUM( TILE_REGIME_DURATION_NANOS, COUNTER, TILE_REGIME, BACKPRESSURE_PREFRAG ),\n DECLARE_METRIC_ENUM( TILE_REGIME_DURATION_NANOS, COUNTER, TILE_REGIME, CAUGHT_UP_POSTFRAG ),\n DECLARE_METRIC_ENUM( TILE_REGIME_DURATION_NANOS, COUNTER, TILE_REGIME, PROCESSING_POSTFRAG ),\n+ DECLARE_METRIC_ENUM( TILE_REGIME_DURATION_NANOS, COUNTER, TILE_REGIME, SLEEPING ),\n };\n \n const fd_metrics_meta_t FD_METRICS_ALL_LINK_IN[FD_METRICS_ALL_LINK_IN_TOTAL] = {\ndiff --git a/src/disco/metrics/generated/fd_metrics_all.h b/src/disco/metrics/generated/fd_metrics_all.h\nindex c51d94ed88..e383fd384d 100644\n--- a/src/disco/metrics/generated/fd_metrics_all.h\n+++ b/src/disco/metrics/generated/fd_metrics_all.h\n@@ -137,7 +137,7 @@\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_DESC \"Mutually exclusive and exhaustive duration of time the tile spent in each of the regimes.\"\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_CVT (FD_METRICS_CONVERTER_NANOSECONDS)\n-#define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_CNT (8UL)\n+#define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_CNT (9UL)\n \n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_CAUGHT_UP_HOUSEKEEPING_OFF (8UL)\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_PROCESSING_HOUSEKEEPING_OFF (9UL)\n@@ -147,9 +147,10 @@\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG_OFF (13UL)\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG_OFF (14UL)\n #define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_PROCESSING_POSTFRAG_OFF (15UL)\n+#define FD_METRICS_COUNTER_TILE_REGIME_DURATION_NANOS_SLEEPING_OFF (16UL)\n \n \n-#define FD_METRICS_ALL_TOTAL (16UL)\n+#define FD_METRICS_ALL_TOTAL (17UL)\n extern const fd_metrics_meta_t FD_METRICS_ALL[FD_METRICS_ALL_TOTAL];\n \n #define FD_METRICS_ALL_LINK_IN_TOTAL (8UL)\n@@ -158,7 +159,7 @@ extern const fd_metrics_meta_t FD_METRICS_ALL_LINK_IN[FD_METRICS_ALL_LINK_IN_TOT\n #define FD_METRICS_ALL_LINK_OUT_TOTAL (1UL)\n extern const fd_metrics_meta_t FD_METRICS_ALL_LINK_OUT[FD_METRICS_ALL_LINK_OUT_TOTAL];\n \n-#define FD_METRICS_TOTAL_SZ (8UL*253UL)\n+#define FD_METRICS_TOTAL_SZ (8UL*254UL)\n \n #define FD_METRICS_TILE_KIND_CNT 22\n extern const char * FD_METRICS_TILE_KIND_NAMES[FD_METRICS_TILE_KIND_CNT];\ndiff --git a/src/disco/metrics/generated/fd_metrics_bank.h b/src/disco/metrics/generated/fd_metrics_bank.h\nindex bb0bbe1681..535f71a27b 100644\n--- a/src/disco/metrics/generated/fd_metrics_bank.h\n+++ b/src/disco/metrics/generated/fd_metrics_bank.h\n@@ -3,117 +3,117 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_SANITIZE_FAILURE_OFF (16UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_SANITIZE_FAILURE_OFF (17UL)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_SANITIZE_FAILURE_NAME \"bank_transaction_sanitize_failure\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_SANITIZE_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_SANITIZE_FAILURE_DESC \"Number of transactions that failed to sanitize.\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_SANITIZE_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_NOT_EXECUTED_FAILURE_OFF (17UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_NOT_EXECUTED_FAILURE_OFF (18UL)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_NOT_EXECUTED_FAILURE_NAME \"bank_transaction_not_executed_failure\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_NOT_EXECUTED_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_NOT_EXECUTED_FAILURE_DESC \"Number of transactions that did not execute. This is different than transactions which fail to execute, which make it onto the chain.\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_NOT_EXECUTED_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_OFF (18UL)\n+#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_OFF (19UL)\n #define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_NAME \"bank_slot_acquire\"\n #define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_DESC \"Result of acquiring a slot.\"\n #define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_SUCCESS_OFF (18UL)\n-#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_TOO_HIGH_OFF (19UL)\n-#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_TOO_LOW_OFF (20UL)\n+#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_SUCCESS_OFF (19UL)\n+#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_TOO_HIGH_OFF (20UL)\n+#define FD_METRICS_COUNTER_BANK_SLOT_ACQUIRE_TOO_LOW_OFF (21UL)\n \n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_OFF (21UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_OFF (22UL)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_NAME \"bank_transaction_load_address_tables\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_DESC \"Result of loading address lookup tables for a transaction. If there are multiple errors for the transaction, only the first one is reported.\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_CNT (6UL)\n \n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_SUCCESS_OFF (21UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_SLOT_HASHES_SYSVAR_NOT_FOUND_OFF (22UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_ACCOUNT_NOT_FOUND_OFF (23UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_INVALID_ACCOUNT_OWNER_OFF (24UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_INVALID_ACCOUNT_DATA_OFF (25UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_INVALID_INDEX_OFF (26UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_SUCCESS_OFF (22UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_SLOT_HASHES_SYSVAR_NOT_FOUND_OFF (23UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_ACCOUNT_NOT_FOUND_OFF (24UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_INVALID_ACCOUNT_OWNER_OFF (25UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_INVALID_ACCOUNT_DATA_OFF (26UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_LOAD_ADDRESS_TABLES_INVALID_INDEX_OFF (27UL)\n \n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_OFF (27UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_OFF (28UL)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_NAME \"bank_transaction_result\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_DESC \"Result of loading and executing a transaction.\"\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_CNT (41UL)\n \n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_SUCCESS_OFF (27UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_IN_USE_OFF (28UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_LOADED_TWICE_OFF (29UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_NOT_FOUND_OFF (30UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_PROGRAM_ACCOUNT_NOT_FOUND_OFF (31UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INSUFFICIENT_FUNDS_FOR_FEE_OFF (32UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ACCOUNT_FOR_FEE_OFF (33UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ALREADY_PROCESSED_OFF (34UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_BLOCKHASH_NOT_FOUND_OFF (35UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INSTRUCTION_ERROR_OFF (36UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_CALL_CHAIN_TOO_DEEP_OFF (37UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_MISSING_SIGNATURE_FOR_FEE_OFF (38UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ACCOUNT_INDEX_OFF (39UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_SIGNATURE_FAILURE_OFF (40UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_PROGRAM_FOR_EXECUTION_OFF (41UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_SANITIZE_FAILURE_OFF (42UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_CLUSTER_MAINTENANCE_OFF (43UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_BORROW_OUTSTANDING_OFF (44UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_MAX_BLOCK_COST_LIMIT_OFF (45UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_UNSUPPORTED_VERSION_OFF (46UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_WRITABLE_ACCOUNT_OFF (47UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT_OFF (48UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT_OFF (49UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_TOO_MANY_ACCOUNT_LOCKS_OFF (50UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ADDRESS_LOOKUP_TABLE_NOT_FOUND_OFF (51UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ADDRESS_LOOKUP_TABLE_OWNER_OFF (52UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ADDRESS_LOOKUP_TABLE_DATA_OFF (53UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ADDRESS_LOOKUP_TABLE_INDEX_OFF (54UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_RENT_PAYING_ACCOUNT_OFF (55UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_MAX_VOTE_COST_LIMIT_OFF (56UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT_OFF (57UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_DUPLICATE_INSTRUCTION_OFF (58UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INSUFFICIENT_FUNDS_FOR_RENT_OFF (59UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED_OFF (60UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_OFF (61UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_RESANITIZATION_NEEDED_OFF (62UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED_OFF (63UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_UNBALANCED_TRANSACTION_OFF (64UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_PROGRAM_CACHE_HIT_MAX_LIMIT_OFF (65UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_COMMIT_CANCELLED_OFF (66UL)\n-#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_BUNDLE_PEER_OFF (67UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_SUCCESS_OFF (28UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_IN_USE_OFF (29UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_LOADED_TWICE_OFF (30UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_NOT_FOUND_OFF (31UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_PROGRAM_ACCOUNT_NOT_FOUND_OFF (32UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INSUFFICIENT_FUNDS_FOR_FEE_OFF (33UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ACCOUNT_FOR_FEE_OFF (34UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ALREADY_PROCESSED_OFF (35UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_BLOCKHASH_NOT_FOUND_OFF (36UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INSTRUCTION_ERROR_OFF (37UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_CALL_CHAIN_TOO_DEEP_OFF (38UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_MISSING_SIGNATURE_FOR_FEE_OFF (39UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ACCOUNT_INDEX_OFF (40UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_SIGNATURE_FAILURE_OFF (41UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_PROGRAM_FOR_EXECUTION_OFF (42UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_SANITIZE_FAILURE_OFF (43UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_CLUSTER_MAINTENANCE_OFF (44UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ACCOUNT_BORROW_OUTSTANDING_OFF (45UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_MAX_BLOCK_COST_LIMIT_OFF (46UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_UNSUPPORTED_VERSION_OFF (47UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_WRITABLE_ACCOUNT_OFF (48UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT_OFF (49UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT_OFF (50UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_TOO_MANY_ACCOUNT_LOCKS_OFF (51UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_ADDRESS_LOOKUP_TABLE_NOT_FOUND_OFF (52UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ADDRESS_LOOKUP_TABLE_OWNER_OFF (53UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ADDRESS_LOOKUP_TABLE_DATA_OFF (54UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_ADDRESS_LOOKUP_TABLE_INDEX_OFF (55UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_RENT_PAYING_ACCOUNT_OFF (56UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_MAX_VOTE_COST_LIMIT_OFF (57UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT_OFF (58UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_DUPLICATE_INSTRUCTION_OFF (59UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INSUFFICIENT_FUNDS_FOR_RENT_OFF (60UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED_OFF (61UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT_OFF (62UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_RESANITIZATION_NEEDED_OFF (63UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED_OFF (64UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_UNBALANCED_TRANSACTION_OFF (65UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_PROGRAM_CACHE_HIT_MAX_LIMIT_OFF (66UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_COMMIT_CANCELLED_OFF (67UL)\n+#define FD_METRICS_COUNTER_BANK_TRANSACTION_RESULT_BUNDLE_PEER_OFF (68UL)\n \n-#define FD_METRICS_COUNTER_BANK_PROCESSING_FAILED_OFF (68UL)\n+#define FD_METRICS_COUNTER_BANK_PROCESSING_FAILED_OFF (69UL)\n #define FD_METRICS_COUNTER_BANK_PROCESSING_FAILED_NAME \"bank_processing_failed\"\n #define FD_METRICS_COUNTER_BANK_PROCESSING_FAILED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_PROCESSING_FAILED_DESC \"Count of transactions for which the processing stage failed and won't land on chain\"\n #define FD_METRICS_COUNTER_BANK_PROCESSING_FAILED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BANK_FEE_ONLY_TRANSACTIONS_OFF (69UL)\n+#define FD_METRICS_COUNTER_BANK_FEE_ONLY_TRANSACTIONS_OFF (70UL)\n #define FD_METRICS_COUNTER_BANK_FEE_ONLY_TRANSACTIONS_NAME \"bank_fee_only_transactions\"\n #define FD_METRICS_COUNTER_BANK_FEE_ONLY_TRANSACTIONS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_FEE_ONLY_TRANSACTIONS_DESC \"Count of transactions that will land on chain but without executing\"\n #define FD_METRICS_COUNTER_BANK_FEE_ONLY_TRANSACTIONS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BANK_EXECUTED_FAILED_TRANSACTIONS_OFF (70UL)\n+#define FD_METRICS_COUNTER_BANK_EXECUTED_FAILED_TRANSACTIONS_OFF (71UL)\n #define FD_METRICS_COUNTER_BANK_EXECUTED_FAILED_TRANSACTIONS_NAME \"bank_executed_failed_transactions\"\n #define FD_METRICS_COUNTER_BANK_EXECUTED_FAILED_TRANSACTIONS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_EXECUTED_FAILED_TRANSACTIONS_DESC \"Count of transactions that execute on chain but failed\"\n #define FD_METRICS_COUNTER_BANK_EXECUTED_FAILED_TRANSACTIONS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BANK_SUCCESSFUL_TRANSACTIONS_OFF (71UL)\n+#define FD_METRICS_COUNTER_BANK_SUCCESSFUL_TRANSACTIONS_OFF (72UL)\n #define FD_METRICS_COUNTER_BANK_SUCCESSFUL_TRANSACTIONS_NAME \"bank_successful_transactions\"\n #define FD_METRICS_COUNTER_BANK_SUCCESSFUL_TRANSACTIONS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_SUCCESSFUL_TRANSACTIONS_DESC \"Count of transactions that execute on chain and succeed\"\n #define FD_METRICS_COUNTER_BANK_SUCCESSFUL_TRANSACTIONS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BANK_COST_MODEL_UNDERCOUNT_OFF (72UL)\n+#define FD_METRICS_COUNTER_BANK_COST_MODEL_UNDERCOUNT_OFF (73UL)\n #define FD_METRICS_COUNTER_BANK_COST_MODEL_UNDERCOUNT_NAME \"bank_cost_model_undercount\"\n #define FD_METRICS_COUNTER_BANK_COST_MODEL_UNDERCOUNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BANK_COST_MODEL_UNDERCOUNT_DESC \"Count of transactions that used more CUs than the cost model should have permitted them to\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_bundle.h b/src/disco/metrics/generated/fd_metrics_bundle.h\nindex 66e45eb899..92f585d7cf 100644\n--- a/src/disco/metrics/generated/fd_metrics_bundle.h\n+++ b/src/disco/metrics/generated/fd_metrics_bundle.h\n@@ -3,86 +3,86 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_BUNDLE_TRANSACTION_RECEIVED_OFF (16UL)\n+#define FD_METRICS_COUNTER_BUNDLE_TRANSACTION_RECEIVED_OFF (17UL)\n #define FD_METRICS_COUNTER_BUNDLE_TRANSACTION_RECEIVED_NAME \"bundle_transaction_received\"\n #define FD_METRICS_COUNTER_BUNDLE_TRANSACTION_RECEIVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BUNDLE_TRANSACTION_RECEIVED_DESC \"Total count of transactions received, including transactions within bundles\"\n #define FD_METRICS_COUNTER_BUNDLE_TRANSACTION_RECEIVED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BUNDLE_PACKET_RECEIVED_OFF (17UL)\n+#define FD_METRICS_COUNTER_BUNDLE_PACKET_RECEIVED_OFF (18UL)\n #define FD_METRICS_COUNTER_BUNDLE_PACKET_RECEIVED_NAME \"bundle_packet_received\"\n #define FD_METRICS_COUNTER_BUNDLE_PACKET_RECEIVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BUNDLE_PACKET_RECEIVED_DESC \"Total count of packets received\"\n #define FD_METRICS_COUNTER_BUNDLE_PACKET_RECEIVED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BUNDLE_BUNDLE_RECEIVED_OFF (18UL)\n+#define FD_METRICS_COUNTER_BUNDLE_BUNDLE_RECEIVED_OFF (19UL)\n #define FD_METRICS_COUNTER_BUNDLE_BUNDLE_RECEIVED_NAME \"bundle_bundle_received\"\n #define FD_METRICS_COUNTER_BUNDLE_BUNDLE_RECEIVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BUNDLE_BUNDLE_RECEIVED_DESC \"Total count of bundles received\"\n #define FD_METRICS_COUNTER_BUNDLE_BUNDLE_RECEIVED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BUNDLE_ERRORS_OFF (19UL)\n+#define FD_METRICS_COUNTER_BUNDLE_ERRORS_OFF (20UL)\n #define FD_METRICS_COUNTER_BUNDLE_ERRORS_NAME \"bundle_errors\"\n #define FD_METRICS_COUNTER_BUNDLE_ERRORS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BUNDLE_ERRORS_DESC \"Number of gRPC errors encountered\"\n #define FD_METRICS_COUNTER_BUNDLE_ERRORS_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_BUNDLE_ERRORS_CNT (5UL)\n \n-#define FD_METRICS_COUNTER_BUNDLE_ERRORS_PROTOBUF_OFF (19UL)\n-#define FD_METRICS_COUNTER_BUNDLE_ERRORS_TRANSPORT_OFF (20UL)\n-#define FD_METRICS_COUNTER_BUNDLE_ERRORS_TIMEOUT_OFF (21UL)\n-#define FD_METRICS_COUNTER_BUNDLE_ERRORS_NO_FEE_INFO_OFF (22UL)\n-#define FD_METRICS_COUNTER_BUNDLE_ERRORS_SSL_ALLOC_OFF (23UL)\n+#define FD_METRICS_COUNTER_BUNDLE_ERRORS_PROTOBUF_OFF (20UL)\n+#define FD_METRICS_COUNTER_BUNDLE_ERRORS_TRANSPORT_OFF (21UL)\n+#define FD_METRICS_COUNTER_BUNDLE_ERRORS_TIMEOUT_OFF (22UL)\n+#define FD_METRICS_COUNTER_BUNDLE_ERRORS_NO_FEE_INFO_OFF (23UL)\n+#define FD_METRICS_COUNTER_BUNDLE_ERRORS_SSL_ALLOC_OFF (24UL)\n \n-#define FD_METRICS_GAUGE_BUNDLE_HEAP_SIZE_OFF (24UL)\n+#define FD_METRICS_GAUGE_BUNDLE_HEAP_SIZE_OFF (25UL)\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_SIZE_NAME \"bundle_heap_size\"\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_SIZE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_SIZE_DESC \"Workspace heap size\"\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_SIZE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_BUNDLE_HEAP_FREE_BYTES_OFF (25UL)\n+#define FD_METRICS_GAUGE_BUNDLE_HEAP_FREE_BYTES_OFF (26UL)\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_FREE_BYTES_NAME \"bundle_heap_free_bytes\"\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_FREE_BYTES_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_FREE_BYTES_DESC \"Approx free space in workspace\"\n #define FD_METRICS_GAUGE_BUNDLE_HEAP_FREE_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BUNDLE_SHREDSTREAM_HEARTBEATS_OFF (26UL)\n+#define FD_METRICS_COUNTER_BUNDLE_SHREDSTREAM_HEARTBEATS_OFF (27UL)\n #define FD_METRICS_COUNTER_BUNDLE_SHREDSTREAM_HEARTBEATS_NAME \"bundle_shredstream_heartbeats\"\n #define FD_METRICS_COUNTER_BUNDLE_SHREDSTREAM_HEARTBEATS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BUNDLE_SHREDSTREAM_HEARTBEATS_DESC \"Number of ShredStream heartbeats successfully sent\"\n #define FD_METRICS_COUNTER_BUNDLE_SHREDSTREAM_HEARTBEATS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_BUNDLE_KEEPALIVES_OFF (27UL)\n+#define FD_METRICS_COUNTER_BUNDLE_KEEPALIVES_OFF (28UL)\n #define FD_METRICS_COUNTER_BUNDLE_KEEPALIVES_NAME \"bundle_keepalives\"\n #define FD_METRICS_COUNTER_BUNDLE_KEEPALIVES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_BUNDLE_KEEPALIVES_DESC \"Number of HTTP/2 PINGs acknowledged by server\"\n #define FD_METRICS_COUNTER_BUNDLE_KEEPALIVES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_BUNDLE_CONNECTED_OFF (28UL)\n+#define FD_METRICS_GAUGE_BUNDLE_CONNECTED_OFF (29UL)\n #define FD_METRICS_GAUGE_BUNDLE_CONNECTED_NAME \"bundle_connected\"\n #define FD_METRICS_GAUGE_BUNDLE_CONNECTED_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_BUNDLE_CONNECTED_DESC \"1 if connected to the bundle server, 0 if not\"\n #define FD_METRICS_GAUGE_BUNDLE_CONNECTED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_BUNDLE_RTT_SAMPLE_OFF (29UL)\n+#define FD_METRICS_GAUGE_BUNDLE_RTT_SAMPLE_OFF (30UL)\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SAMPLE_NAME \"bundle_rtt_sample\"\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SAMPLE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SAMPLE_DESC \"Latest RTT sample at scrape time (nanoseconds)\"\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SAMPLE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_BUNDLE_RTT_SMOOTHED_OFF (30UL)\n+#define FD_METRICS_GAUGE_BUNDLE_RTT_SMOOTHED_OFF (31UL)\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SMOOTHED_NAME \"bundle_rtt_smoothed\"\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SMOOTHED_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SMOOTHED_DESC \"RTT moving average (nanoseconds)\"\n #define FD_METRICS_GAUGE_BUNDLE_RTT_SMOOTHED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_BUNDLE_RTT_VAR_OFF (31UL)\n+#define FD_METRICS_GAUGE_BUNDLE_RTT_VAR_OFF (32UL)\n #define FD_METRICS_GAUGE_BUNDLE_RTT_VAR_NAME \"bundle_rtt_var\"\n #define FD_METRICS_GAUGE_BUNDLE_RTT_VAR_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_BUNDLE_RTT_VAR_DESC \"RTT variance (nanoseconds)\"\n #define FD_METRICS_GAUGE_BUNDLE_RTT_VAR_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_HISTOGRAM_BUNDLE_MESSAGE_RX_DELAY_NANOS_OFF (32UL)\n+#define FD_METRICS_HISTOGRAM_BUNDLE_MESSAGE_RX_DELAY_NANOS_OFF (33UL)\n #define FD_METRICS_HISTOGRAM_BUNDLE_MESSAGE_RX_DELAY_NANOS_NAME \"bundle_message_rx_delay_nanos\"\n #define FD_METRICS_HISTOGRAM_BUNDLE_MESSAGE_RX_DELAY_NANOS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_BUNDLE_MESSAGE_RX_DELAY_NANOS_DESC \"Message receive delay in nanoseconds from bundle server to bundle client\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_dedup.h b/src/disco/metrics/generated/fd_metrics_dedup.h\nindex ef7f41bd82..d5923d99d7 100644\n--- a/src/disco/metrics/generated/fd_metrics_dedup.h\n+++ b/src/disco/metrics/generated/fd_metrics_dedup.h\n@@ -3,19 +3,19 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_DEDUP_TRANSACTION_BUNDLE_PEER_FAILURE_OFF (16UL)\n+#define FD_METRICS_COUNTER_DEDUP_TRANSACTION_BUNDLE_PEER_FAILURE_OFF (17UL)\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_BUNDLE_PEER_FAILURE_NAME \"dedup_transaction_bundle_peer_failure\"\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_BUNDLE_PEER_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_BUNDLE_PEER_FAILURE_DESC \"Count of transactions that failed to dedup because a peer transaction in the bundle failed\"\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_BUNDLE_PEER_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_DEDUP_TRANSACTION_DEDUP_FAILURE_OFF (17UL)\n+#define FD_METRICS_COUNTER_DEDUP_TRANSACTION_DEDUP_FAILURE_OFF (18UL)\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_DEDUP_FAILURE_NAME \"dedup_transaction_dedup_failure\"\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_DEDUP_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_DEDUP_FAILURE_DESC \"Count of transactions that failed to deduplicate in the dedup stage\"\n #define FD_METRICS_COUNTER_DEDUP_TRANSACTION_DEDUP_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_DEDUP_GOSSIPED_VOTES_RECEIVED_OFF (18UL)\n+#define FD_METRICS_COUNTER_DEDUP_GOSSIPED_VOTES_RECEIVED_OFF (19UL)\n #define FD_METRICS_COUNTER_DEDUP_GOSSIPED_VOTES_RECEIVED_NAME \"dedup_gossiped_votes_received\"\n #define FD_METRICS_COUNTER_DEDUP_GOSSIPED_VOTES_RECEIVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_DEDUP_GOSSIPED_VOTES_RECEIVED_DESC \"Count of simple vote transactions received over gossip instead of via the normal TPU path\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_enums.h b/src/disco/metrics/generated/fd_metrics_enums.h\nindex eee5ff556d..679ade4b8d 100644\n--- a/src/disco/metrics/generated/fd_metrics_enums.h\n+++ b/src/disco/metrics/generated/fd_metrics_enums.h\n@@ -1,7 +1,7 @@\n /* THIS FILE IS GENERATED BY gen_metrics.py. DO NOT HAND EDIT. */\n \n #define FD_METRICS_ENUM_TILE_REGIME_NAME \"tile_regime\"\n-#define FD_METRICS_ENUM_TILE_REGIME_CNT (8UL)\n+#define FD_METRICS_ENUM_TILE_REGIME_CNT (9UL)\n #define FD_METRICS_ENUM_TILE_REGIME_V_CAUGHT_UP_HOUSEKEEPING_IDX 0\n #define FD_METRICS_ENUM_TILE_REGIME_V_CAUGHT_UP_HOUSEKEEPING_NAME \"caught_up_housekeeping\"\n #define FD_METRICS_ENUM_TILE_REGIME_V_PROCESSING_HOUSEKEEPING_IDX 1\n@@ -18,6 +18,8 @@\n #define FD_METRICS_ENUM_TILE_REGIME_V_CAUGHT_UP_POSTFRAG_NAME \"caught_up_postfrag\"\n #define FD_METRICS_ENUM_TILE_REGIME_V_PROCESSING_POSTFRAG_IDX 7\n #define FD_METRICS_ENUM_TILE_REGIME_V_PROCESSING_POSTFRAG_NAME \"processing_postfrag\"\n+#define FD_METRICS_ENUM_TILE_REGIME_V_SLEEPING_IDX 8\n+#define FD_METRICS_ENUM_TILE_REGIME_V_SLEEPING_NAME \"sleeping\"\n \n #define FD_METRICS_ENUM_SOCK_ERR_NAME \"sock_err\"\n #define FD_METRICS_ENUM_SOCK_ERR_CNT (6UL)\ndiff --git a/src/disco/metrics/generated/fd_metrics_gossip.h b/src/disco/metrics/generated/fd_metrics_gossip.h\nindex d628b77f6a..68378bffbf 100644\n--- a/src/disco/metrics/generated/fd_metrics_gossip.h\n+++ b/src/disco/metrics/generated/fd_metrics_gossip.h\n@@ -3,414 +3,414 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_GOSSIP_LAST_CRDS_PUSH_CONTACT_INFO_PUBLISH_TIMESTAMP_NANOS_OFF (16UL)\n+#define FD_METRICS_GAUGE_GOSSIP_LAST_CRDS_PUSH_CONTACT_INFO_PUBLISH_TIMESTAMP_NANOS_OFF (17UL)\n #define FD_METRICS_GAUGE_GOSSIP_LAST_CRDS_PUSH_CONTACT_INFO_PUBLISH_TIMESTAMP_NANOS_NAME \"gossip_last_crds_push_contact_info_publish_timestamp_nanos\"\n #define FD_METRICS_GAUGE_GOSSIP_LAST_CRDS_PUSH_CONTACT_INFO_PUBLISH_TIMESTAMP_NANOS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_LAST_CRDS_PUSH_CONTACT_INFO_PUBLISH_TIMESTAMP_NANOS_DESC \"Time (in nanoseconds) of last CRDS Push ContactInfo message publish\"\n #define FD_METRICS_GAUGE_GOSSIP_LAST_CRDS_PUSH_CONTACT_INFO_PUBLISH_TIMESTAMP_NANOS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_MISMATCHED_CONTACT_INFO_SHRED_VERSION_OFF (17UL)\n+#define FD_METRICS_COUNTER_GOSSIP_MISMATCHED_CONTACT_INFO_SHRED_VERSION_OFF (18UL)\n #define FD_METRICS_COUNTER_GOSSIP_MISMATCHED_CONTACT_INFO_SHRED_VERSION_NAME \"gossip_mismatched_contact_info_shred_version\"\n #define FD_METRICS_COUNTER_GOSSIP_MISMATCHED_CONTACT_INFO_SHRED_VERSION_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_MISMATCHED_CONTACT_INFO_SHRED_VERSION_DESC \"Mismatched Contact Info Shred Version\"\n #define FD_METRICS_COUNTER_GOSSIP_MISMATCHED_CONTACT_INFO_SHRED_VERSION_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_OFF (18UL)\n+#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_OFF (19UL)\n #define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_NAME \"gossip_ipv6_contact_info\"\n #define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_DESC \"IPv6 Contact Info (by peer type)\"\n #define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_TVU_OFF (18UL)\n-#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_REPAIR_OFF (19UL)\n-#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_SEND_OFF (20UL)\n+#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_TVU_OFF (19UL)\n+#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_REPAIR_OFF (20UL)\n+#define FD_METRICS_COUNTER_GOSSIP_IPV6_CONTACT_INFO_SEND_OFF (21UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_OFF (21UL)\n+#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_OFF (22UL)\n #define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_NAME \"gossip_zero_ipv4_contact_info\"\n #define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_DESC \"Zero IPv4 Contact Info (by peer type)\"\n #define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_TVU_OFF (21UL)\n-#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_REPAIR_OFF (22UL)\n-#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_SEND_OFF (23UL)\n+#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_TVU_OFF (22UL)\n+#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_REPAIR_OFF (23UL)\n+#define FD_METRICS_COUNTER_GOSSIP_ZERO_IPV4_CONTACT_INFO_SEND_OFF (24UL)\n \n-#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_OFF (24UL)\n+#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_OFF (25UL)\n #define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_NAME \"gossip_peer_counts\"\n #define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_DESC \"Number of peers of each type\"\n #define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_CNT (3UL)\n \n-#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_TVU_OFF (24UL)\n-#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_REPAIR_OFF (25UL)\n-#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_SEND_OFF (26UL)\n+#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_TVU_OFF (25UL)\n+#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_REPAIR_OFF (26UL)\n+#define FD_METRICS_GAUGE_GOSSIP_PEER_COUNTS_SEND_OFF (27UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_SHRED_VERSION_ZERO_OFF (27UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SHRED_VERSION_ZERO_OFF (28UL)\n #define FD_METRICS_COUNTER_GOSSIP_SHRED_VERSION_ZERO_NAME \"gossip_shred_version_zero\"\n #define FD_METRICS_COUNTER_GOSSIP_SHRED_VERSION_ZERO_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_SHRED_VERSION_ZERO_DESC \"Shred version zero\"\n #define FD_METRICS_COUNTER_GOSSIP_SHRED_VERSION_ZERO_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_GOSSIP_VALUE_META_SIZE_OFF (28UL)\n+#define FD_METRICS_GAUGE_GOSSIP_VALUE_META_SIZE_OFF (29UL)\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_META_SIZE_NAME \"gossip_value_meta_size\"\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_META_SIZE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_META_SIZE_DESC \"Current size of the CRDS value metas map\"\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_META_SIZE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_GOSSIP_VALUE_VEC_SIZE_OFF (29UL)\n+#define FD_METRICS_GAUGE_GOSSIP_VALUE_VEC_SIZE_OFF (30UL)\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_VEC_SIZE_NAME \"gossip_value_vec_size\"\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_VEC_SIZE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_VEC_SIZE_DESC \"Current size of the CRDS value vector\"\n #define FD_METRICS_GAUGE_GOSSIP_VALUE_VEC_SIZE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_PACKETS_OFF (30UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_PACKETS_OFF (31UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_PACKETS_NAME \"gossip_received_packets\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_PACKETS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_PACKETS_DESC \"Number of all gossip packets received\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_CORRUPTED_MESSAGES_OFF (31UL)\n+#define FD_METRICS_COUNTER_GOSSIP_CORRUPTED_MESSAGES_OFF (32UL)\n #define FD_METRICS_COUNTER_GOSSIP_CORRUPTED_MESSAGES_NAME \"gossip_corrupted_messages\"\n #define FD_METRICS_COUNTER_GOSSIP_CORRUPTED_MESSAGES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_CORRUPTED_MESSAGES_DESC \"Number of corrupted gossip messages received\"\n #define FD_METRICS_COUNTER_GOSSIP_CORRUPTED_MESSAGES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_OFF (32UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_OFF (33UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_NAME \"gossip_received_gossip_messages\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_DESC \"Number of gossip messages received\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_CNT (6UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PULL_REQUEST_OFF (32UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PULL_RESPONSE_OFF (33UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PUSH_OFF (34UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PRUNE_OFF (35UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PING_OFF (36UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PONG_OFF (37UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PULL_REQUEST_OFF (33UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PULL_RESPONSE_OFF (34UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PUSH_OFF (35UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PRUNE_OFF (36UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PING_OFF (37UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_GOSSIP_MESSAGES_PONG_OFF (38UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_UNKNOWN_MESSAGE_OFF (38UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_UNKNOWN_MESSAGE_OFF (39UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_UNKNOWN_MESSAGE_NAME \"gossip_received_unknown_message\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_UNKNOWN_MESSAGE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_UNKNOWN_MESSAGE_DESC \"Number of gossip messages received that have an unknown discriminant\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_UNKNOWN_MESSAGE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_OFF (39UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_OFF (40UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_NAME \"gossip_received_crds_push\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_DESC \"Number of CRDS values received from push messages\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_CNT (14UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_CONTACT_INFO_V1_OFF (39UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_VOTE_OFF (40UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_LOWEST_SLOT_OFF (41UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_SNAPSHOT_HASHES_OFF (42UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_ACCOUNTS_HASHES_OFF (43UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_EPOCH_SLOTS_OFF (44UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_VERSION_V1_OFF (45UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_VERSION_V2_OFF (46UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_NODE_INSTANCE_OFF (47UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_DUPLICATE_SHRED_OFF (48UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_INCREMENTAL_SNAPSHOT_HASHES_OFF (49UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_CONTACT_INFO_V2_OFF (50UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_RESTART_LAST_VOTED_FORK_SLOTS_OFF (51UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_RESTART_HEAVIEST_FORK_OFF (52UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_OFF (53UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_CONTACT_INFO_V1_OFF (40UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_VOTE_OFF (41UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_LOWEST_SLOT_OFF (42UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_SNAPSHOT_HASHES_OFF (43UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_ACCOUNTS_HASHES_OFF (44UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_EPOCH_SLOTS_OFF (45UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_VERSION_V1_OFF (46UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_VERSION_V2_OFF (47UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_NODE_INSTANCE_OFF (48UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_DUPLICATE_SHRED_OFF (49UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_INCREMENTAL_SNAPSHOT_HASHES_OFF (50UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_CONTACT_INFO_V2_OFF (51UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_RESTART_LAST_VOTED_FORK_SLOTS_OFF (52UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PUSH_RESTART_HEAVIEST_FORK_OFF (53UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_OFF (54UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_NAME \"gossip_received_crds_pull\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_DESC \"Number of CRDS values received from pull response messages\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_CNT (14UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_CONTACT_INFO_V1_OFF (53UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_VOTE_OFF (54UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_LOWEST_SLOT_OFF (55UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_SNAPSHOT_HASHES_OFF (56UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_ACCOUNTS_HASHES_OFF (57UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_EPOCH_SLOTS_OFF (58UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_VERSION_V1_OFF (59UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_VERSION_V2_OFF (60UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_NODE_INSTANCE_OFF (61UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_DUPLICATE_SHRED_OFF (62UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_INCREMENTAL_SNAPSHOT_HASHES_OFF (63UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_CONTACT_INFO_V2_OFF (64UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_RESTART_LAST_VOTED_FORK_SLOTS_OFF (65UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_RESTART_HEAVIEST_FORK_OFF (66UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_OFF (67UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_CONTACT_INFO_V1_OFF (54UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_VOTE_OFF (55UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_LOWEST_SLOT_OFF (56UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_SNAPSHOT_HASHES_OFF (57UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_ACCOUNTS_HASHES_OFF (58UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_EPOCH_SLOTS_OFF (59UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_VERSION_V1_OFF (60UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_VERSION_V2_OFF (61UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_NODE_INSTANCE_OFF (62UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_DUPLICATE_SHRED_OFF (63UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_INCREMENTAL_SNAPSHOT_HASHES_OFF (64UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_CONTACT_INFO_V2_OFF (65UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_RESTART_LAST_VOTED_FORK_SLOTS_OFF (66UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_PULL_RESTART_HEAVIEST_FORK_OFF (67UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_OFF (68UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_NAME \"gossip_received_crds_duplicate_message_push\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_DESC \"Number of duplicate CRDS values received from push messages\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_CNT (14UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_CONTACT_INFO_V1_OFF (67UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_VOTE_OFF (68UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_LOWEST_SLOT_OFF (69UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_SNAPSHOT_HASHES_OFF (70UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_ACCOUNTS_HASHES_OFF (71UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_EPOCH_SLOTS_OFF (72UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_VERSION_V1_OFF (73UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_VERSION_V2_OFF (74UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_NODE_INSTANCE_OFF (75UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_DUPLICATE_SHRED_OFF (76UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_INCREMENTAL_SNAPSHOT_HASHES_OFF (77UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_CONTACT_INFO_V2_OFF (78UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_RESTART_LAST_VOTED_FORK_SLOTS_OFF (79UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_RESTART_HEAVIEST_FORK_OFF (80UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_OFF (81UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_CONTACT_INFO_V1_OFF (68UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_VOTE_OFF (69UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_LOWEST_SLOT_OFF (70UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_SNAPSHOT_HASHES_OFF (71UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_ACCOUNTS_HASHES_OFF (72UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_EPOCH_SLOTS_OFF (73UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_VERSION_V1_OFF (74UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_VERSION_V2_OFF (75UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_NODE_INSTANCE_OFF (76UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_DUPLICATE_SHRED_OFF (77UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_INCREMENTAL_SNAPSHOT_HASHES_OFF (78UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_CONTACT_INFO_V2_OFF (79UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_RESTART_LAST_VOTED_FORK_SLOTS_OFF (80UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PUSH_RESTART_HEAVIEST_FORK_OFF (81UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_OFF (82UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_NAME \"gossip_received_crds_duplicate_message_pull\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_DESC \"Number of duplicate CRDS values received from pull response messages\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_CNT (14UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_CONTACT_INFO_V1_OFF (81UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_VOTE_OFF (82UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_LOWEST_SLOT_OFF (83UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_SNAPSHOT_HASHES_OFF (84UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_ACCOUNTS_HASHES_OFF (85UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_EPOCH_SLOTS_OFF (86UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_VERSION_V1_OFF (87UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_VERSION_V2_OFF (88UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_NODE_INSTANCE_OFF (89UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_DUPLICATE_SHRED_OFF (90UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_INCREMENTAL_SNAPSHOT_HASHES_OFF (91UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_CONTACT_INFO_V2_OFF (92UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_RESTART_LAST_VOTED_FORK_SLOTS_OFF (93UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_RESTART_HEAVIEST_FORK_OFF (94UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_OFF (95UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_CONTACT_INFO_V1_OFF (82UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_VOTE_OFF (83UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_LOWEST_SLOT_OFF (84UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_SNAPSHOT_HASHES_OFF (85UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_ACCOUNTS_HASHES_OFF (86UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_EPOCH_SLOTS_OFF (87UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_VERSION_V1_OFF (88UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_VERSION_V2_OFF (89UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_NODE_INSTANCE_OFF (90UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_DUPLICATE_SHRED_OFF (91UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_INCREMENTAL_SNAPSHOT_HASHES_OFF (92UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_CONTACT_INFO_V2_OFF (93UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_RESTART_LAST_VOTED_FORK_SLOTS_OFF (94UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DUPLICATE_MESSAGE_PULL_RESTART_HEAVIEST_FORK_OFF (95UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_OFF (96UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_NAME \"gossip_received_crds_drop\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_DESC \"Number of CRDS values dropped on receive\"\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_CNT (12UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_SUCCESS_OFF (95UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_DUPLICATE_OFF (96UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_UNKNOWN_DISCRIMINANT_OFF (97UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_OWN_MESSAGE_OFF (98UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_INVALID_SIGNATURE_OFF (99UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_TABLE_FULL_OFF (100UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_PUSH_QUEUE_FULL_OFF (101UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_INVALID_GOSSIP_PORT_OFF (102UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_PEER_TABLE_FULL_OFF (103UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_INACTIVES_QUEUE_FULL_OFF (104UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_DISCARDED_PEER_OFF (105UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_ENCODING_FAILED_OFF (106UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_OFF (107UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_SUCCESS_OFF (96UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_DUPLICATE_OFF (97UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_UNKNOWN_DISCRIMINANT_OFF (98UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_OWN_MESSAGE_OFF (99UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_INVALID_SIGNATURE_OFF (100UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_TABLE_FULL_OFF (101UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_PUSH_QUEUE_FULL_OFF (102UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_INVALID_GOSSIP_PORT_OFF (103UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_PEER_TABLE_FULL_OFF (104UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_INACTIVES_QUEUE_FULL_OFF (105UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_DISCARDED_PEER_OFF (106UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECEIVED_CRDS_DROP_ENCODING_FAILED_OFF (107UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_OFF (108UL)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_NAME \"gossip_push_crds\"\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DESC \"Number of CRDS values pushed\"\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_CNT (14UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_CONTACT_INFO_V1_OFF (107UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_VOTE_OFF (108UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_LOWEST_SLOT_OFF (109UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_SNAPSHOT_HASHES_OFF (110UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_ACCOUNTS_HASHES_OFF (111UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_EPOCH_SLOTS_OFF (112UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_VERSION_V1_OFF (113UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_VERSION_V2_OFF (114UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_NODE_INSTANCE_OFF (115UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_SHRED_OFF (116UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_INCREMENTAL_SNAPSHOT_HASHES_OFF (117UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_CONTACT_INFO_V2_OFF (118UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_RESTART_LAST_VOTED_FORK_SLOTS_OFF (119UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_RESTART_HEAVIEST_FORK_OFF (120UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_OFF (121UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_CONTACT_INFO_V1_OFF (108UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_VOTE_OFF (109UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_LOWEST_SLOT_OFF (110UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_SNAPSHOT_HASHES_OFF (111UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_ACCOUNTS_HASHES_OFF (112UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_EPOCH_SLOTS_OFF (113UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_VERSION_V1_OFF (114UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_VERSION_V2_OFF (115UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_NODE_INSTANCE_OFF (116UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_SHRED_OFF (117UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_INCREMENTAL_SNAPSHOT_HASHES_OFF (118UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_CONTACT_INFO_V2_OFF (119UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_RESTART_LAST_VOTED_FORK_SLOTS_OFF (120UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_RESTART_HEAVIEST_FORK_OFF (121UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_OFF (122UL)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_NAME \"gossip_push_crds_duplicate_message\"\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_DESC \"Number of duplicate CRDS values inserted (internally)\"\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CNT (14UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CONTACT_INFO_V1_OFF (121UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_VOTE_OFF (122UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_LOWEST_SLOT_OFF (123UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_SNAPSHOT_HASHES_OFF (124UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_ACCOUNTS_HASHES_OFF (125UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_EPOCH_SLOTS_OFF (126UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_VERSION_V1_OFF (127UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_VERSION_V2_OFF (128UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_NODE_INSTANCE_OFF (129UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_DUPLICATE_SHRED_OFF (130UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_INCREMENTAL_SNAPSHOT_HASHES_OFF (131UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CONTACT_INFO_V2_OFF (132UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_RESTART_LAST_VOTED_FORK_SLOTS_OFF (133UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_RESTART_HEAVIEST_FORK_OFF (134UL)\n-\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_OFF (135UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CONTACT_INFO_V1_OFF (122UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_VOTE_OFF (123UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_LOWEST_SLOT_OFF (124UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_SNAPSHOT_HASHES_OFF (125UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_ACCOUNTS_HASHES_OFF (126UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_EPOCH_SLOTS_OFF (127UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_VERSION_V1_OFF (128UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_VERSION_V2_OFF (129UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_NODE_INSTANCE_OFF (130UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_DUPLICATE_SHRED_OFF (131UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_INCREMENTAL_SNAPSHOT_HASHES_OFF (132UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_CONTACT_INFO_V2_OFF (133UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_RESTART_LAST_VOTED_FORK_SLOTS_OFF (134UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DUPLICATE_MESSAGE_RESTART_HEAVIEST_FORK_OFF (135UL)\n+\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_OFF (136UL)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_NAME \"gossip_push_crds_drop\"\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_DESC \"Number of CRDS values dropped on push\"\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_CNT (12UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_SUCCESS_OFF (135UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_DUPLICATE_OFF (136UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_UNKNOWN_DISCRIMINANT_OFF (137UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_OWN_MESSAGE_OFF (138UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_INVALID_SIGNATURE_OFF (139UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_TABLE_FULL_OFF (140UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_PUSH_QUEUE_FULL_OFF (141UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_INVALID_GOSSIP_PORT_OFF (142UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_PEER_TABLE_FULL_OFF (143UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_INACTIVES_QUEUE_FULL_OFF (144UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_DISCARDED_PEER_OFF (145UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_ENCODING_FAILED_OFF (146UL)\n-\n-#define FD_METRICS_GAUGE_GOSSIP_PUSH_CRDS_QUEUE_COUNT_OFF (147UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_SUCCESS_OFF (136UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_DUPLICATE_OFF (137UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_UNKNOWN_DISCRIMINANT_OFF (138UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_OWN_MESSAGE_OFF (139UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_INVALID_SIGNATURE_OFF (140UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_TABLE_FULL_OFF (141UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_PUSH_QUEUE_FULL_OFF (142UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_INVALID_GOSSIP_PORT_OFF (143UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_PEER_TABLE_FULL_OFF (144UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_INACTIVES_QUEUE_FULL_OFF (145UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_DISCARDED_PEER_OFF (146UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_ENCODING_FAILED_OFF (147UL)\n+\n+#define FD_METRICS_GAUGE_GOSSIP_PUSH_CRDS_QUEUE_COUNT_OFF (148UL)\n #define FD_METRICS_GAUGE_GOSSIP_PUSH_CRDS_QUEUE_COUNT_NAME \"gossip_push_crds_queue_count\"\n #define FD_METRICS_GAUGE_GOSSIP_PUSH_CRDS_QUEUE_COUNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_PUSH_CRDS_QUEUE_COUNT_DESC \"Number of CRDS values in the queue to be pushed\"\n #define FD_METRICS_GAUGE_GOSSIP_PUSH_CRDS_QUEUE_COUNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_GOSSIP_ACTIVE_PUSH_DESTINATIONS_OFF (148UL)\n+#define FD_METRICS_GAUGE_GOSSIP_ACTIVE_PUSH_DESTINATIONS_OFF (149UL)\n #define FD_METRICS_GAUGE_GOSSIP_ACTIVE_PUSH_DESTINATIONS_NAME \"gossip_active_push_destinations\"\n #define FD_METRICS_GAUGE_GOSSIP_ACTIVE_PUSH_DESTINATIONS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_ACTIVE_PUSH_DESTINATIONS_DESC \"Number of active Push destinations\"\n #define FD_METRICS_GAUGE_GOSSIP_ACTIVE_PUSH_DESTINATIONS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_REFRESH_PUSH_STATES_FAIL_COUNT_OFF (149UL)\n+#define FD_METRICS_COUNTER_GOSSIP_REFRESH_PUSH_STATES_FAIL_COUNT_OFF (150UL)\n #define FD_METRICS_COUNTER_GOSSIP_REFRESH_PUSH_STATES_FAIL_COUNT_NAME \"gossip_refresh_push_states_fail_count\"\n #define FD_METRICS_COUNTER_GOSSIP_REFRESH_PUSH_STATES_FAIL_COUNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_REFRESH_PUSH_STATES_FAIL_COUNT_DESC \"Number of failures whilst refreshing push states\"\n #define FD_METRICS_COUNTER_GOSSIP_REFRESH_PUSH_STATES_FAIL_COUNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_OFF (150UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_OFF (151UL)\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_NAME \"gossip_pull_req_fail\"\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_DESC \"Number of PullReq messages that failed\"\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_PEER_NOT_IN_ACTIVES_OFF (150UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_UNRESPONSIVE_PEER_OFF (151UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_PENDING_POOL_FULL_OFF (152UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_ENCODING_FAILED_OFF (153UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_PEER_NOT_IN_ACTIVES_OFF (151UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_UNRESPONSIVE_PEER_OFF (152UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_PENDING_POOL_FULL_OFF (153UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_FAIL_ENCODING_FAILED_OFF (154UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_OFF (154UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_OFF (155UL)\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_NAME \"gossip_pull_req_bloom_filter\"\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_DESC \"Result of the bloom filter check for a PullReq\"\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_CNT (2UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_HIT_OFF (154UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_MISS_OFF (155UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_HIT_OFF (155UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PULL_REQ_BLOOM_FILTER_MISS_OFF (156UL)\n \n-#define FD_METRICS_GAUGE_GOSSIP_PULL_REQ_RESP_PACKETS_OFF (156UL)\n+#define FD_METRICS_GAUGE_GOSSIP_PULL_REQ_RESP_PACKETS_OFF (157UL)\n #define FD_METRICS_GAUGE_GOSSIP_PULL_REQ_RESP_PACKETS_NAME \"gossip_pull_req_resp_packets\"\n #define FD_METRICS_GAUGE_GOSSIP_PULL_REQ_RESP_PACKETS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_PULL_REQ_RESP_PACKETS_DESC \"Number of packets used to respond to a PullReq\"\n #define FD_METRICS_GAUGE_GOSSIP_PULL_REQ_RESP_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_OFF (157UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_OFF (158UL)\n #define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_NAME \"gossip_prune_fail_count\"\n #define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_DESC \"Number of Prune messages that failed\"\n #define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_NOT_FOR_ME_OFF (157UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_SIGN_ENCODING_FAILED_OFF (158UL)\n-#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_INVALID_SIGNATURE_OFF (159UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_NOT_FOR_ME_OFF (158UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_SIGN_ENCODING_FAILED_OFF (159UL)\n+#define FD_METRICS_COUNTER_GOSSIP_PRUNE_FAIL_COUNT_INVALID_SIGNATURE_OFF (160UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_STALE_ENTRY_OFF (160UL)\n+#define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_STALE_ENTRY_OFF (161UL)\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_STALE_ENTRY_NAME \"gossip_make_prune_stale_entry\"\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_STALE_ENTRY_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_STALE_ENTRY_DESC \"Number of stale entries removed from the stats table while making prune messages\"\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_STALE_ENTRY_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_HIGH_DUPLICATES_OFF (161UL)\n+#define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_HIGH_DUPLICATES_OFF (162UL)\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_HIGH_DUPLICATES_NAME \"gossip_make_prune_high_duplicates\"\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_HIGH_DUPLICATES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_HIGH_DUPLICATES_DESC \"Number of origins with high duplicate counts found while making prune messages\"\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_HIGH_DUPLICATES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_GOSSIP_MAKE_PRUNE_REQUESTED_ORIGINS_OFF (162UL)\n+#define FD_METRICS_GAUGE_GOSSIP_MAKE_PRUNE_REQUESTED_ORIGINS_OFF (163UL)\n #define FD_METRICS_GAUGE_GOSSIP_MAKE_PRUNE_REQUESTED_ORIGINS_NAME \"gossip_make_prune_requested_origins\"\n #define FD_METRICS_GAUGE_GOSSIP_MAKE_PRUNE_REQUESTED_ORIGINS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_MAKE_PRUNE_REQUESTED_ORIGINS_DESC \"Number of requested origins in the last prune message we made\"\n #define FD_METRICS_GAUGE_GOSSIP_MAKE_PRUNE_REQUESTED_ORIGINS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_SIGN_DATA_ENCODE_FAILED_OFF (163UL)\n+#define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_SIGN_DATA_ENCODE_FAILED_OFF (164UL)\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_SIGN_DATA_ENCODE_FAILED_NAME \"gossip_make_prune_sign_data_encode_failed\"\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_SIGN_DATA_ENCODE_FAILED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_SIGN_DATA_ENCODE_FAILED_DESC \"Number of times we failed to encode the sign data\"\n #define FD_METRICS_COUNTER_GOSSIP_MAKE_PRUNE_SIGN_DATA_ENCODE_FAILED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_OFF (164UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_OFF (165UL)\n #define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_NAME \"gossip_sent_gossip_messages\"\n #define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_DESC \"Number of gossip messages sent\"\n #define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_CNT (6UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PULL_REQUEST_OFF (164UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PULL_RESPONSE_OFF (165UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PUSH_OFF (166UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PRUNE_OFF (167UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PING_OFF (168UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PONG_OFF (169UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PULL_REQUEST_OFF (165UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PULL_RESPONSE_OFF (166UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PUSH_OFF (167UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PRUNE_OFF (168UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PING_OFF (169UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_GOSSIP_MESSAGES_PONG_OFF (170UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_SENT_PACKETS_OFF (170UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SENT_PACKETS_OFF (171UL)\n #define FD_METRICS_COUNTER_GOSSIP_SENT_PACKETS_NAME \"gossip_sent_packets\"\n #define FD_METRICS_COUNTER_GOSSIP_SENT_PACKETS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_SENT_PACKETS_DESC \"Number of Packets sent\"\n #define FD_METRICS_COUNTER_GOSSIP_SENT_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_OFF (171UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_OFF (172UL)\n #define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_NAME \"gossip_send_ping_event\"\n #define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_DESC \"Number of Ping messages sent with non-standard outcomes\"\n #define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_ACTIVES_TABLE_FULL_OFF (171UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_ACTIVES_TABLE_INSERT_OFF (172UL)\n-#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_MAX_PING_COUNT_EXCEEDED_OFF (173UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_ACTIVES_TABLE_FULL_OFF (172UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_ACTIVES_TABLE_INSERT_OFF (173UL)\n+#define FD_METRICS_COUNTER_GOSSIP_SEND_PING_EVENT_MAX_PING_COUNT_EXCEEDED_OFF (174UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PING_INVALID_SIGNATURE_OFF (174UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PING_INVALID_SIGNATURE_OFF (175UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PING_INVALID_SIGNATURE_NAME \"gossip_recv_ping_invalid_signature\"\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PING_INVALID_SIGNATURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PING_INVALID_SIGNATURE_DESC \"Number of times we received a Ping message with an invalid signature\"\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PING_INVALID_SIGNATURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_OFF (175UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_OFF (176UL)\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_NAME \"gossip_recv_pong_event\"\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_DESC \"Number of Pong messages processed with non-standard outcomes\"\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_CNT (5UL)\n \n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_NEW_PEER_OFF (175UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_WRONG_TOKEN_OFF (176UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_INVALID_SIGNATURE_OFF (177UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_EXPIRED_OFF (178UL)\n-#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_TABLE_FULL_OFF (179UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_NEW_PEER_OFF (176UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_WRONG_TOKEN_OFF (177UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_INVALID_SIGNATURE_OFF (178UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_EXPIRED_OFF (179UL)\n+#define FD_METRICS_COUNTER_GOSSIP_RECV_PONG_EVENT_TABLE_FULL_OFF (180UL)\n \n-#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_OFF (180UL)\n+#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_OFF (181UL)\n #define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_NAME \"gossip_gossip_peer_counts\"\n #define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_DESC \"Number of gossip peers tracked\"\n #define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_CNT (3UL)\n \n-#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_TOTAL_OFF (180UL)\n-#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_ACTIVE_OFF (181UL)\n-#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_INACTIVE_OFF (182UL)\n+#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_TOTAL_OFF (181UL)\n+#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_ACTIVE_OFF (182UL)\n+#define FD_METRICS_GAUGE_GOSSIP_GOSSIP_PEER_COUNTS_INACTIVE_OFF (183UL)\n \n #define FD_METRICS_GOSSIP_TOTAL (167UL)\n extern const fd_metrics_meta_t FD_METRICS_GOSSIP[FD_METRICS_GOSSIP_TOTAL];\ndiff --git a/src/disco/metrics/generated/fd_metrics_ipecho.h b/src/disco/metrics/generated/fd_metrics_ipecho.h\nnew file mode 100644\nindex 0000000000..9693a0124e\n--- /dev/null\n+++ b/src/disco/metrics/generated/fd_metrics_ipecho.h\n@@ -0,0 +1,43 @@\n+/* THIS FILE IS GENERATED BY gen_metrics.py. DO NOT HAND EDIT. */\n+\n+#include \"../fd_metrics_base.h\"\n+#include \"fd_metrics_enums.h\"\n+\n+#define FD_METRICS_GAUGE_IPECHO_SHRED_VERSION_OFF (17UL)\n+#define FD_METRICS_GAUGE_IPECHO_SHRED_VERSION_NAME \"ipecho_shred_version\"\n+#define FD_METRICS_GAUGE_IPECHO_SHRED_VERSION_TYPE (FD_METRICS_TYPE_GAUGE)\n+#define FD_METRICS_GAUGE_IPECHO_SHRED_VERSION_DESC \"The current shred version used by the validator\"\n+#define FD_METRICS_GAUGE_IPECHO_SHRED_VERSION_CVT (FD_METRICS_CONVERTER_NONE)\n+\n+#define FD_METRICS_GAUGE_IPECHO_CONNECTION_COUNT_OFF (18UL)\n+#define FD_METRICS_GAUGE_IPECHO_CONNECTION_COUNT_NAME \"ipecho_connection_count\"\n+#define FD_METRICS_GAUGE_IPECHO_CONNECTION_COUNT_TYPE (FD_METRICS_TYPE_GAUGE)\n+#define FD_METRICS_GAUGE_IPECHO_CONNECTION_COUNT_DESC \"The number of active connections to the ipecho service\"\n+#define FD_METRICS_GAUGE_IPECHO_CONNECTION_COUNT_CVT (FD_METRICS_CONVERTER_NONE)\n+\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_OK_OFF (19UL)\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_OK_NAME \"ipecho_connections_closed_ok\"\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_OK_TYPE (FD_METRICS_TYPE_COUNTER)\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_OK_DESC \"The number of connections to the ipecho service that have been made and closed normally\"\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_OK_CVT (FD_METRICS_CONVERTER_NONE)\n+\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_ERROR_OFF (20UL)\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_ERROR_NAME \"ipecho_connections_closed_error\"\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_ERROR_TYPE (FD_METRICS_TYPE_COUNTER)\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_ERROR_DESC \"The number of connections to the ipecho service that have been made and closed abnormally\"\n+#define FD_METRICS_COUNTER_IPECHO_CONNECTIONS_CLOSED_ERROR_CVT (FD_METRICS_CONVERTER_NONE)\n+\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_READ_OFF (21UL)\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_READ_NAME \"ipecho_bytes_read\"\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_READ_TYPE (FD_METRICS_TYPE_COUNTER)\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_READ_DESC \"The total number of bytes read from all connections to the ipecho service\"\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n+\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_WRITTEN_OFF (22UL)\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_WRITTEN_NAME \"ipecho_bytes_written\"\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_WRITTEN_TYPE (FD_METRICS_TYPE_COUNTER)\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_WRITTEN_DESC \"The total number of bytes written to all connections to the ipecho service\"\n+#define FD_METRICS_COUNTER_IPECHO_BYTES_WRITTEN_CVT (FD_METRICS_CONVERTER_NONE)\n+\n+#define FD_METRICS_IPECHO_TOTAL (6UL)\n+extern const fd_metrics_meta_t FD_METRICS_IPECHO[FD_METRICS_IPECHO_TOTAL];\ndiff --git a/src/disco/metrics/generated/fd_metrics_metric.h b/src/disco/metrics/generated/fd_metrics_metric.h\nindex b832debaf0..3d94174210 100644\n--- a/src/disco/metrics/generated/fd_metrics_metric.h\n+++ b/src/disco/metrics/generated/fd_metrics_metric.h\n@@ -3,7 +3,7 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_METRIC_BOOT_TIMESTAMP_NANOS_OFF (16UL)\n+#define FD_METRICS_GAUGE_METRIC_BOOT_TIMESTAMP_NANOS_OFF (17UL)\n #define FD_METRICS_GAUGE_METRIC_BOOT_TIMESTAMP_NANOS_NAME \"metric_boot_timestamp_nanos\"\n #define FD_METRICS_GAUGE_METRIC_BOOT_TIMESTAMP_NANOS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_METRIC_BOOT_TIMESTAMP_NANOS_DESC \"Timestamp when validator was started (nanoseconds since epoch)\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_net.h b/src/disco/metrics/generated/fd_metrics_net.h\nindex b1bad7cca2..82ee12737a 100644\n--- a/src/disco/metrics/generated/fd_metrics_net.h\n+++ b/src/disco/metrics/generated/fd_metrics_net.h\n@@ -3,169 +3,169 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_OFF (16UL)\n+#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_OFF (17UL)\n #define FD_METRICS_COUNTER_NET_RX_PKT_CNT_NAME \"net_rx_pkt_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_PKT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_PKT_CNT_DESC \"Packet receive count.\"\n #define FD_METRICS_COUNTER_NET_RX_PKT_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_BYTES_TOTAL_OFF (17UL)\n+#define FD_METRICS_COUNTER_NET_RX_BYTES_TOTAL_OFF (18UL)\n #define FD_METRICS_COUNTER_NET_RX_BYTES_TOTAL_NAME \"net_rx_bytes_total\"\n #define FD_METRICS_COUNTER_NET_RX_BYTES_TOTAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_BYTES_TOTAL_DESC \"Total number of bytes received (including Ethernet header).\"\n #define FD_METRICS_COUNTER_NET_RX_BYTES_TOTAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_UNDERSZ_CNT_OFF (18UL)\n+#define FD_METRICS_COUNTER_NET_RX_UNDERSZ_CNT_OFF (19UL)\n #define FD_METRICS_COUNTER_NET_RX_UNDERSZ_CNT_NAME \"net_rx_undersz_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_UNDERSZ_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_UNDERSZ_CNT_DESC \"Number of incoming packets dropped due to being too small.\"\n #define FD_METRICS_COUNTER_NET_RX_UNDERSZ_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_FILL_BLOCKED_CNT_OFF (19UL)\n+#define FD_METRICS_COUNTER_NET_RX_FILL_BLOCKED_CNT_OFF (20UL)\n #define FD_METRICS_COUNTER_NET_RX_FILL_BLOCKED_CNT_NAME \"net_rx_fill_blocked_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_FILL_BLOCKED_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_FILL_BLOCKED_CNT_DESC \"Number of incoming packets dropped due to fill ring being full.\"\n #define FD_METRICS_COUNTER_NET_RX_FILL_BLOCKED_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_BACKPRESSURE_CNT_OFF (20UL)\n+#define FD_METRICS_COUNTER_NET_RX_BACKPRESSURE_CNT_OFF (21UL)\n #define FD_METRICS_COUNTER_NET_RX_BACKPRESSURE_CNT_NAME \"net_rx_backpressure_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_BACKPRESSURE_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_BACKPRESSURE_CNT_DESC \"Number of incoming packets dropped due to backpressure.\"\n #define FD_METRICS_COUNTER_NET_RX_BACKPRESSURE_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_NET_RX_BUSY_CNT_OFF (21UL)\n+#define FD_METRICS_GAUGE_NET_RX_BUSY_CNT_OFF (22UL)\n #define FD_METRICS_GAUGE_NET_RX_BUSY_CNT_NAME \"net_rx_busy_cnt\"\n #define FD_METRICS_GAUGE_NET_RX_BUSY_CNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_NET_RX_BUSY_CNT_DESC \"Number of receive buffers currently busy.\"\n #define FD_METRICS_GAUGE_NET_RX_BUSY_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_NET_RX_IDLE_CNT_OFF (22UL)\n+#define FD_METRICS_GAUGE_NET_RX_IDLE_CNT_OFF (23UL)\n #define FD_METRICS_GAUGE_NET_RX_IDLE_CNT_NAME \"net_rx_idle_cnt\"\n #define FD_METRICS_GAUGE_NET_RX_IDLE_CNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_NET_RX_IDLE_CNT_DESC \"Number of receive buffers currently idle.\"\n #define FD_METRICS_GAUGE_NET_RX_IDLE_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_SUBMIT_CNT_OFF (23UL)\n+#define FD_METRICS_COUNTER_NET_TX_SUBMIT_CNT_OFF (24UL)\n #define FD_METRICS_COUNTER_NET_TX_SUBMIT_CNT_NAME \"net_tx_submit_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_SUBMIT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_SUBMIT_CNT_DESC \"Number of packet transmit jobs submitted.\"\n #define FD_METRICS_COUNTER_NET_TX_SUBMIT_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_COMPLETE_CNT_OFF (24UL)\n+#define FD_METRICS_COUNTER_NET_TX_COMPLETE_CNT_OFF (25UL)\n #define FD_METRICS_COUNTER_NET_TX_COMPLETE_CNT_NAME \"net_tx_complete_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_COMPLETE_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_COMPLETE_CNT_DESC \"Number of packet transmit jobs marked as completed by the kernel.\"\n #define FD_METRICS_COUNTER_NET_TX_COMPLETE_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_OFF (25UL)\n+#define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_OFF (26UL)\n #define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_NAME \"net_tx_bytes_total\"\n #define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_DESC \"Total number of bytes transmitted (including Ethernet header).\"\n #define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_OFF (26UL)\n+#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_OFF (27UL)\n #define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_NAME \"net_tx_route_fail_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_DESC \"Number of packet transmit jobs dropped due to route failure.\"\n #define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_OFF (27UL)\n+#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_OFF (28UL)\n #define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_NAME \"net_tx_neighbor_fail_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_DESC \"Number of packet transmit jobs dropped due to unresolved neighbor.\"\n #define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_OFF (28UL)\n+#define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_OFF (29UL)\n #define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_NAME \"net_tx_full_fail_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_DESC \"Number of packet transmit jobs dropped due to XDP TX ring full or missing completions.\"\n #define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_NET_TX_BUSY_CNT_OFF (29UL)\n+#define FD_METRICS_GAUGE_NET_TX_BUSY_CNT_OFF (30UL)\n #define FD_METRICS_GAUGE_NET_TX_BUSY_CNT_NAME \"net_tx_busy_cnt\"\n #define FD_METRICS_GAUGE_NET_TX_BUSY_CNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_NET_TX_BUSY_CNT_DESC \"Number of transmit buffers currently busy.\"\n #define FD_METRICS_GAUGE_NET_TX_BUSY_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_NET_TX_IDLE_CNT_OFF (30UL)\n+#define FD_METRICS_GAUGE_NET_TX_IDLE_CNT_OFF (31UL)\n #define FD_METRICS_GAUGE_NET_TX_IDLE_CNT_NAME \"net_tx_idle_cnt\"\n #define FD_METRICS_GAUGE_NET_TX_IDLE_CNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_NET_TX_IDLE_CNT_DESC \"Number of transmit buffers currently idle.\"\n #define FD_METRICS_GAUGE_NET_TX_IDLE_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XSK_TX_WAKEUP_CNT_OFF (31UL)\n+#define FD_METRICS_COUNTER_NET_XSK_TX_WAKEUP_CNT_OFF (32UL)\n #define FD_METRICS_COUNTER_NET_XSK_TX_WAKEUP_CNT_NAME \"net_xsk_tx_wakeup_cnt\"\n #define FD_METRICS_COUNTER_NET_XSK_TX_WAKEUP_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XSK_TX_WAKEUP_CNT_DESC \"Number of XSK sendto syscalls dispatched.\"\n #define FD_METRICS_COUNTER_NET_XSK_TX_WAKEUP_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XSK_RX_WAKEUP_CNT_OFF (32UL)\n+#define FD_METRICS_COUNTER_NET_XSK_RX_WAKEUP_CNT_OFF (33UL)\n #define FD_METRICS_COUNTER_NET_XSK_RX_WAKEUP_CNT_NAME \"net_xsk_rx_wakeup_cnt\"\n #define FD_METRICS_COUNTER_NET_XSK_RX_WAKEUP_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XSK_RX_WAKEUP_CNT_DESC \"Number of XSK recvmsg syscalls dispatched.\"\n #define FD_METRICS_COUNTER_NET_XSK_RX_WAKEUP_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XDP_RX_DROPPED_OTHER_OFF (33UL)\n+#define FD_METRICS_COUNTER_NET_XDP_RX_DROPPED_OTHER_OFF (34UL)\n #define FD_METRICS_COUNTER_NET_XDP_RX_DROPPED_OTHER_NAME \"net_xdp_rx_dropped_other\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_DROPPED_OTHER_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XDP_RX_DROPPED_OTHER_DESC \"xdp_statistics_v0.rx_dropped: Dropped for other reasons\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_DROPPED_OTHER_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XDP_RX_INVALID_DESCS_OFF (34UL)\n+#define FD_METRICS_COUNTER_NET_XDP_RX_INVALID_DESCS_OFF (35UL)\n #define FD_METRICS_COUNTER_NET_XDP_RX_INVALID_DESCS_NAME \"net_xdp_rx_invalid_descs\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_INVALID_DESCS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XDP_RX_INVALID_DESCS_DESC \"xdp_statistics_v0.rx_invalid_descs: Dropped due to invalid descriptor\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_INVALID_DESCS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XDP_TX_INVALID_DESCS_OFF (35UL)\n+#define FD_METRICS_COUNTER_NET_XDP_TX_INVALID_DESCS_OFF (36UL)\n #define FD_METRICS_COUNTER_NET_XDP_TX_INVALID_DESCS_NAME \"net_xdp_tx_invalid_descs\"\n #define FD_METRICS_COUNTER_NET_XDP_TX_INVALID_DESCS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XDP_TX_INVALID_DESCS_DESC \"xdp_statistics_v0.tx_invalid_descs: Dropped due to invalid descriptor\"\n #define FD_METRICS_COUNTER_NET_XDP_TX_INVALID_DESCS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XDP_RX_RING_FULL_OFF (36UL)\n+#define FD_METRICS_COUNTER_NET_XDP_RX_RING_FULL_OFF (37UL)\n #define FD_METRICS_COUNTER_NET_XDP_RX_RING_FULL_NAME \"net_xdp_rx_ring_full\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_RING_FULL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XDP_RX_RING_FULL_DESC \"xdp_statistics_v1.rx_ring_full: Dropped due to rx ring being full\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_RING_FULL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XDP_RX_FILL_RING_EMPTY_DESCS_OFF (37UL)\n+#define FD_METRICS_COUNTER_NET_XDP_RX_FILL_RING_EMPTY_DESCS_OFF (38UL)\n #define FD_METRICS_COUNTER_NET_XDP_RX_FILL_RING_EMPTY_DESCS_NAME \"net_xdp_rx_fill_ring_empty_descs\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_FILL_RING_EMPTY_DESCS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XDP_RX_FILL_RING_EMPTY_DESCS_DESC \"xdp_statistics_v1.rx_fill_ring_empty_descs: Failed to retrieve item from fill ring\"\n #define FD_METRICS_COUNTER_NET_XDP_RX_FILL_RING_EMPTY_DESCS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_XDP_TX_RING_EMPTY_DESCS_OFF (38UL)\n+#define FD_METRICS_COUNTER_NET_XDP_TX_RING_EMPTY_DESCS_OFF (39UL)\n #define FD_METRICS_COUNTER_NET_XDP_TX_RING_EMPTY_DESCS_NAME \"net_xdp_tx_ring_empty_descs\"\n #define FD_METRICS_COUNTER_NET_XDP_TX_RING_EMPTY_DESCS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_XDP_TX_RING_EMPTY_DESCS_DESC \"xdp_statistics_v1.tx_ring_empty_descs: Failed to retrieve item from tx ring\"\n #define FD_METRICS_COUNTER_NET_XDP_TX_RING_EMPTY_DESCS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_GRE_CNT_OFF (39UL)\n+#define FD_METRICS_COUNTER_NET_RX_GRE_CNT_OFF (40UL)\n #define FD_METRICS_COUNTER_NET_RX_GRE_CNT_NAME \"net_rx_gre_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_GRE_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_GRE_CNT_DESC \"Number of valid GRE packets received\"\n #define FD_METRICS_COUNTER_NET_RX_GRE_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_GRE_INVALID_CNT_OFF (40UL)\n+#define FD_METRICS_COUNTER_NET_RX_GRE_INVALID_CNT_OFF (41UL)\n #define FD_METRICS_COUNTER_NET_RX_GRE_INVALID_CNT_NAME \"net_rx_gre_invalid_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_GRE_INVALID_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_GRE_INVALID_CNT_DESC \"Number of invalid GRE packets received\"\n #define FD_METRICS_COUNTER_NET_RX_GRE_INVALID_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_RX_GRE_IGNORED_CNT_OFF (41UL)\n+#define FD_METRICS_COUNTER_NET_RX_GRE_IGNORED_CNT_OFF (42UL)\n #define FD_METRICS_COUNTER_NET_RX_GRE_IGNORED_CNT_NAME \"net_rx_gre_ignored_cnt\"\n #define FD_METRICS_COUNTER_NET_RX_GRE_IGNORED_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_RX_GRE_IGNORED_CNT_DESC \"Number of received but ignored GRE packets\"\n #define FD_METRICS_COUNTER_NET_RX_GRE_IGNORED_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_GRE_CNT_OFF (42UL)\n+#define FD_METRICS_COUNTER_NET_TX_GRE_CNT_OFF (43UL)\n #define FD_METRICS_COUNTER_NET_TX_GRE_CNT_NAME \"net_tx_gre_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_GRE_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_GRE_CNT_DESC \"Number of GRE packet transmit jobs submitted\"\n #define FD_METRICS_COUNTER_NET_TX_GRE_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_OFF (43UL)\n+#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_OFF (44UL)\n #define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_NAME \"net_tx_gre_route_fail_cnt\"\n #define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_DESC \"Number of GRE packets transmit jobs dropped due to route failure\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_netlnk.h b/src/disco/metrics/generated/fd_metrics_netlnk.h\nindex dd884acdb0..e6289549a2 100644\n--- a/src/disco/metrics/generated/fd_metrics_netlnk.h\n+++ b/src/disco/metrics/generated/fd_metrics_netlnk.h\n@@ -3,70 +3,70 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_NETLNK_DROP_EVENTS_OFF (16UL)\n+#define FD_METRICS_COUNTER_NETLNK_DROP_EVENTS_OFF (17UL)\n #define FD_METRICS_COUNTER_NETLNK_DROP_EVENTS_NAME \"netlnk_drop_events\"\n #define FD_METRICS_COUNTER_NETLNK_DROP_EVENTS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_DROP_EVENTS_DESC \"Number of netlink drop events caught\"\n #define FD_METRICS_COUNTER_NETLNK_DROP_EVENTS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NETLNK_LINK_FULL_SYNCS_OFF (17UL)\n+#define FD_METRICS_COUNTER_NETLNK_LINK_FULL_SYNCS_OFF (18UL)\n #define FD_METRICS_COUNTER_NETLNK_LINK_FULL_SYNCS_NAME \"netlnk_link_full_syncs\"\n #define FD_METRICS_COUNTER_NETLNK_LINK_FULL_SYNCS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_LINK_FULL_SYNCS_DESC \"Number of full link table syncs done\"\n #define FD_METRICS_COUNTER_NETLNK_LINK_FULL_SYNCS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NETLNK_ROUTE_FULL_SYNCS_OFF (18UL)\n+#define FD_METRICS_COUNTER_NETLNK_ROUTE_FULL_SYNCS_OFF (19UL)\n #define FD_METRICS_COUNTER_NETLNK_ROUTE_FULL_SYNCS_NAME \"netlnk_route_full_syncs\"\n #define FD_METRICS_COUNTER_NETLNK_ROUTE_FULL_SYNCS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_ROUTE_FULL_SYNCS_DESC \"Number of full route table syncs done\"\n #define FD_METRICS_COUNTER_NETLNK_ROUTE_FULL_SYNCS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NETLNK_UPDATES_OFF (19UL)\n+#define FD_METRICS_COUNTER_NETLNK_UPDATES_OFF (20UL)\n #define FD_METRICS_COUNTER_NETLNK_UPDATES_NAME \"netlnk_updates\"\n #define FD_METRICS_COUNTER_NETLNK_UPDATES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_UPDATES_DESC \"Number of netlink live updates processed\"\n #define FD_METRICS_COUNTER_NETLNK_UPDATES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_NETLNK_UPDATES_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_NETLNK_UPDATES_LINK_OFF (19UL)\n-#define FD_METRICS_COUNTER_NETLNK_UPDATES_NEIGH_OFF (20UL)\n-#define FD_METRICS_COUNTER_NETLNK_UPDATES_IPV4_ROUTE_OFF (21UL)\n+#define FD_METRICS_COUNTER_NETLNK_UPDATES_LINK_OFF (20UL)\n+#define FD_METRICS_COUNTER_NETLNK_UPDATES_NEIGH_OFF (21UL)\n+#define FD_METRICS_COUNTER_NETLNK_UPDATES_IPV4_ROUTE_OFF (22UL)\n \n-#define FD_METRICS_GAUGE_NETLNK_INTERFACE_COUNT_OFF (22UL)\n+#define FD_METRICS_GAUGE_NETLNK_INTERFACE_COUNT_OFF (23UL)\n #define FD_METRICS_GAUGE_NETLNK_INTERFACE_COUNT_NAME \"netlnk_interface_count\"\n #define FD_METRICS_GAUGE_NETLNK_INTERFACE_COUNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_NETLNK_INTERFACE_COUNT_DESC \"Number of network interfaces\"\n #define FD_METRICS_GAUGE_NETLNK_INTERFACE_COUNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_OFF (23UL)\n+#define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_OFF (24UL)\n #define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_NAME \"netlnk_route_count\"\n #define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_DESC \"Number of IPv4 routes\"\n #define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_CNT (2UL)\n \n-#define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_LOCAL_OFF (23UL)\n-#define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_MAIN_OFF (24UL)\n+#define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_LOCAL_OFF (24UL)\n+#define FD_METRICS_GAUGE_NETLNK_ROUTE_COUNT_MAIN_OFF (25UL)\n \n-#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_SENT_OFF (25UL)\n+#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_SENT_OFF (26UL)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_SENT_NAME \"netlnk_neigh_probe_sent\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_SENT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_SENT_DESC \"Number of neighbor solicit requests sent to kernel\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_SENT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_FAILS_OFF (26UL)\n+#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_FAILS_OFF (27UL)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_FAILS_NAME \"netlnk_neigh_probe_fails\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_FAILS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_FAILS_DESC \"Number of neighbor solicit requests that failed to send (kernel too slow)\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_FAILS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_HOST_OFF (27UL)\n+#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_HOST_OFF (28UL)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_HOST_NAME \"netlnk_neigh_probe_rate_limit_host\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_HOST_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_HOST_DESC \"Number of neighbor solicit that exceeded the per-host rate limit\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_HOST_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_GLOBAL_OFF (28UL)\n+#define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_GLOBAL_OFF (29UL)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_GLOBAL_NAME \"netlnk_neigh_probe_rate_limit_global\"\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_GLOBAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_NETLNK_NEIGH_PROBE_RATE_LIMIT_GLOBAL_DESC \"Number of neighbor solicit that exceeded the global rate limit\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_pack.h b/src/disco/metrics/generated/fd_metrics_pack.h\nindex 9e45d92034..3e7b6cf384 100644\n--- a/src/disco/metrics/generated/fd_metrics_pack.h\n+++ b/src/disco/metrics/generated/fd_metrics_pack.h\n@@ -3,7 +3,7 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_OFF (16UL)\n+#define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_OFF (17UL)\n #define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_NAME \"pack_schedule_microblock_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_DESC \"Duration of scheduling one microblock\"\n@@ -11,7 +11,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_PACK_SCHEDULE_MICROBLOCK_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_OFF (33UL)\n+#define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_OFF (34UL)\n #define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_NAME \"pack_no_sched_microblock_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_DESC \"Duration of discovering that there are no schedulable transactions\"\n@@ -19,7 +19,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_PACK_NO_SCHED_MICROBLOCK_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_OFF (50UL)\n+#define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_OFF (51UL)\n #define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_NAME \"pack_insert_transaction_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_DESC \"Duration of inserting one transaction into the pool of available transactions\"\n@@ -27,7 +27,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_PACK_INSERT_TRANSACTION_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_OFF (67UL)\n+#define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_OFF (68UL)\n #define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_NAME \"pack_complete_microblock_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_DESC \"Duration of the computation associated with marking one microblock as complete\"\n@@ -35,7 +35,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_PACK_COMPLETE_MICROBLOCK_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_OFF (84UL)\n+#define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_OFF (85UL)\n #define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_NAME \"pack_total_transactions_per_microblock_count\"\n #define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_DESC \"Count of transactions in a scheduled microblock, including both votes and non-votes\"\n@@ -43,7 +43,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_MIN (0UL)\n #define FD_METRICS_HISTOGRAM_PACK_TOTAL_TRANSACTIONS_PER_MICROBLOCK_COUNT_MAX (64UL)\n \n-#define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_OFF (101UL)\n+#define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_OFF (102UL)\n #define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_NAME \"pack_votes_per_microblock_count\"\n #define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_DESC \"Count of simple vote transactions in a scheduled microblock\"\n@@ -51,172 +51,172 @@\n #define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_MIN (0UL)\n #define FD_METRICS_HISTOGRAM_PACK_VOTES_PER_MICROBLOCK_COUNT_MAX (64UL)\n \n-#define FD_METRICS_COUNTER_PACK_NORMAL_TRANSACTION_RECEIVED_OFF (118UL)\n+#define FD_METRICS_COUNTER_PACK_NORMAL_TRANSACTION_RECEIVED_OFF (119UL)\n #define FD_METRICS_COUNTER_PACK_NORMAL_TRANSACTION_RECEIVED_NAME \"pack_normal_transaction_received\"\n #define FD_METRICS_COUNTER_PACK_NORMAL_TRANSACTION_RECEIVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_NORMAL_TRANSACTION_RECEIVED_DESC \"Count of transactions received via the normal TPU path\"\n #define FD_METRICS_COUNTER_PACK_NORMAL_TRANSACTION_RECEIVED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_OFF (119UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_OFF (120UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NAME \"pack_transaction_inserted\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_DESC \"Result of inserting a transaction into the pack object\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_CNT (21UL)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_CONFLICT_OFF (119UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_BUNDLE_BLACKLIST_OFF (120UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_INVALID_NONCE_OFF (121UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_WRITE_SYSVAR_OFF (122UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_ESTIMATION_FAIL_OFF (123UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_DUPLICATE_ACCOUNT_OFF (124UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TOO_MANY_ACCOUNTS_OFF (125UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TOO_LARGE_OFF (126UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_EXPIRED_OFF (127UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_ADDR_LUT_OFF (128UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_UNAFFORDABLE_OFF (129UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_DUPLICATE_OFF (130UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_PRIORITY_OFF (131UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_PRIORITY_OFF (132UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONVOTE_ADD_OFF (133UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_VOTE_ADD_OFF (134UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONVOTE_REPLACE_OFF (135UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_VOTE_REPLACE_OFF (136UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_NONVOTE_ADD_OFF (137UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_UNUSED_OFF (138UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_NONVOTE_REPLACE_OFF (139UL)\n-\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_OFF (140UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_CONFLICT_OFF (120UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_BUNDLE_BLACKLIST_OFF (121UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_INVALID_NONCE_OFF (122UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_WRITE_SYSVAR_OFF (123UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_ESTIMATION_FAIL_OFF (124UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_DUPLICATE_ACCOUNT_OFF (125UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TOO_MANY_ACCOUNTS_OFF (126UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TOO_LARGE_OFF (127UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_EXPIRED_OFF (128UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_ADDR_LUT_OFF (129UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_UNAFFORDABLE_OFF (130UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_DUPLICATE_OFF (131UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_PRIORITY_OFF (132UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_PRIORITY_OFF (133UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONVOTE_ADD_OFF (134UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_VOTE_ADD_OFF (135UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONVOTE_REPLACE_OFF (136UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_VOTE_REPLACE_OFF (137UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_NONVOTE_ADD_OFF (138UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_UNUSED_OFF (139UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_NONCE_NONVOTE_REPLACE_OFF (140UL)\n+\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_OFF (141UL)\n #define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NAME \"pack_metric_timing\"\n #define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_METRIC_TIMING_DESC \"Time in nanos spent in each state\"\n #define FD_METRICS_COUNTER_PACK_METRIC_TIMING_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_PACK_METRIC_TIMING_CNT (16UL)\n \n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_NO_LEADER_NO_MICROBLOCK_OFF (140UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_NO_LEADER_NO_MICROBLOCK_OFF (141UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_NO_LEADER_NO_MICROBLOCK_OFF (142UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_NO_LEADER_NO_MICROBLOCK_OFF (143UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_LEADER_NO_MICROBLOCK_OFF (144UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_LEADER_NO_MICROBLOCK_OFF (145UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_LEADER_NO_MICROBLOCK_OFF (146UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_LEADER_NO_MICROBLOCK_OFF (147UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_NO_LEADER_MICROBLOCK_OFF (148UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_NO_LEADER_MICROBLOCK_OFF (149UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_NO_LEADER_MICROBLOCK_OFF (150UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_NO_LEADER_MICROBLOCK_OFF (151UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_LEADER_MICROBLOCK_OFF (152UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_LEADER_MICROBLOCK_OFF (153UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_LEADER_MICROBLOCK_OFF (154UL)\n-#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_LEADER_MICROBLOCK_OFF (155UL)\n-\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_FROM_EXTRA_OFF (156UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_NO_LEADER_NO_MICROBLOCK_OFF (141UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_NO_LEADER_NO_MICROBLOCK_OFF (142UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_NO_LEADER_NO_MICROBLOCK_OFF (143UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_NO_LEADER_NO_MICROBLOCK_OFF (144UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_LEADER_NO_MICROBLOCK_OFF (145UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_LEADER_NO_MICROBLOCK_OFF (146UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_LEADER_NO_MICROBLOCK_OFF (147UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_LEADER_NO_MICROBLOCK_OFF (148UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_NO_LEADER_MICROBLOCK_OFF (149UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_NO_LEADER_MICROBLOCK_OFF (150UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_NO_LEADER_MICROBLOCK_OFF (151UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_NO_LEADER_MICROBLOCK_OFF (152UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_NO_BANK_LEADER_MICROBLOCK_OFF (153UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_NO_BANK_LEADER_MICROBLOCK_OFF (154UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_NO_TXN_BANK_LEADER_MICROBLOCK_OFF (155UL)\n+#define FD_METRICS_COUNTER_PACK_METRIC_TIMING_TXN_BANK_LEADER_MICROBLOCK_OFF (156UL)\n+\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_FROM_EXTRA_OFF (157UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_FROM_EXTRA_NAME \"pack_transaction_dropped_from_extra\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_FROM_EXTRA_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_FROM_EXTRA_DESC \"Transactions dropped from the extra transaction storage because it was full\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_FROM_EXTRA_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TO_EXTRA_OFF (157UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TO_EXTRA_OFF (158UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TO_EXTRA_NAME \"pack_transaction_inserted_to_extra\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TO_EXTRA_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TO_EXTRA_DESC \"Transactions inserted into the extra transaction storage because pack's primary storage was full\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_TO_EXTRA_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_FROM_EXTRA_OFF (158UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_FROM_EXTRA_OFF (159UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_FROM_EXTRA_NAME \"pack_transaction_inserted_from_extra\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_FROM_EXTRA_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_FROM_EXTRA_DESC \"Transactions pulled from the extra transaction storage and inserted into pack's primary storage\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_INSERTED_FROM_EXTRA_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_EXPIRED_OFF (159UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_EXPIRED_OFF (160UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_EXPIRED_NAME \"pack_transaction_expired\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_EXPIRED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_EXPIRED_DESC \"Transactions deleted from pack because their TTL expired\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_EXPIRED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_DELETED_OFF (160UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_DELETED_OFF (161UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DELETED_NAME \"pack_transaction_deleted\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DELETED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DELETED_DESC \"Transactions dropped from pack because they were requested to be deleted\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DELETED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_PARTIAL_BUNDLE_OFF (161UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_PARTIAL_BUNDLE_OFF (162UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_PARTIAL_BUNDLE_NAME \"pack_transaction_dropped_partial_bundle\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_PARTIAL_BUNDLE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_PARTIAL_BUNDLE_DESC \"Transactions dropped from pack because they were part of a partial bundle\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_DROPPED_PARTIAL_BUNDLE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_OFF (162UL)\n+#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_OFF (163UL)\n #define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_NAME \"pack_available_transactions\"\n #define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_DESC \"The total number of pending transactions in pack's pool that are available to be scheduled\"\n #define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_CNT (5UL)\n \n-#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_ALL_OFF (162UL)\n-#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_REGULAR_OFF (163UL)\n-#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_VOTES_OFF (164UL)\n-#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_CONFLICTING_OFF (165UL)\n-#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_BUNDLES_OFF (166UL)\n+#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_ALL_OFF (163UL)\n+#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_REGULAR_OFF (164UL)\n+#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_VOTES_OFF (165UL)\n+#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_CONFLICTING_OFF (166UL)\n+#define FD_METRICS_GAUGE_PACK_AVAILABLE_TRANSACTIONS_BUNDLES_OFF (167UL)\n \n-#define FD_METRICS_GAUGE_PACK_PENDING_TRANSACTIONS_HEAP_SIZE_OFF (167UL)\n+#define FD_METRICS_GAUGE_PACK_PENDING_TRANSACTIONS_HEAP_SIZE_OFF (168UL)\n #define FD_METRICS_GAUGE_PACK_PENDING_TRANSACTIONS_HEAP_SIZE_NAME \"pack_pending_transactions_heap_size\"\n #define FD_METRICS_GAUGE_PACK_PENDING_TRANSACTIONS_HEAP_SIZE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_PACK_PENDING_TRANSACTIONS_HEAP_SIZE_DESC \"The maximum number of pending transactions that pack can consider. This value is fixed at Firedancer startup but is a useful reference for AvailableTransactions.\"\n #define FD_METRICS_GAUGE_PACK_PENDING_TRANSACTIONS_HEAP_SIZE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_PACK_SMALLEST_PENDING_TRANSACTION_OFF (168UL)\n+#define FD_METRICS_GAUGE_PACK_SMALLEST_PENDING_TRANSACTION_OFF (169UL)\n #define FD_METRICS_GAUGE_PACK_SMALLEST_PENDING_TRANSACTION_NAME \"pack_smallest_pending_transaction\"\n #define FD_METRICS_GAUGE_PACK_SMALLEST_PENDING_TRANSACTION_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_PACK_SMALLEST_PENDING_TRANSACTION_DESC \"A lower bound on the smallest non-vote transaction (in cost units) that is immediately available for scheduling\"\n #define FD_METRICS_GAUGE_PACK_SMALLEST_PENDING_TRANSACTION_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_MICROBLOCK_PER_BLOCK_LIMIT_OFF (169UL)\n+#define FD_METRICS_COUNTER_PACK_MICROBLOCK_PER_BLOCK_LIMIT_OFF (170UL)\n #define FD_METRICS_COUNTER_PACK_MICROBLOCK_PER_BLOCK_LIMIT_NAME \"pack_microblock_per_block_limit\"\n #define FD_METRICS_COUNTER_PACK_MICROBLOCK_PER_BLOCK_LIMIT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_MICROBLOCK_PER_BLOCK_LIMIT_DESC \"The number of times pack did not pack a microblock because the limit on microblocks/block had been reached\"\n #define FD_METRICS_COUNTER_PACK_MICROBLOCK_PER_BLOCK_LIMIT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_DATA_PER_BLOCK_LIMIT_OFF (170UL)\n+#define FD_METRICS_COUNTER_PACK_DATA_PER_BLOCK_LIMIT_OFF (171UL)\n #define FD_METRICS_COUNTER_PACK_DATA_PER_BLOCK_LIMIT_NAME \"pack_data_per_block_limit\"\n #define FD_METRICS_COUNTER_PACK_DATA_PER_BLOCK_LIMIT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_DATA_PER_BLOCK_LIMIT_DESC \"The number of times pack did not pack a microblock because it reached the data per block limit at the start of trying to schedule a microblock\"\n #define FD_METRICS_COUNTER_PACK_DATA_PER_BLOCK_LIMIT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_OFF (171UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_OFF (172UL)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_NAME \"pack_transaction_schedule\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_DESC \"Result of trying to consider a transaction for scheduling\"\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_CNT (7UL)\n \n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_TAKEN_OFF (171UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_CU_LIMIT_OFF (172UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_FAST_PATH_OFF (173UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_BYTE_LIMIT_OFF (174UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_WRITE_COST_OFF (175UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_SLOW_PATH_OFF (176UL)\n-#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_DEFER_SKIP_OFF (177UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_TAKEN_OFF (172UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_CU_LIMIT_OFF (173UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_FAST_PATH_OFF (174UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_BYTE_LIMIT_OFF (175UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_WRITE_COST_OFF (176UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_SLOW_PATH_OFF (177UL)\n+#define FD_METRICS_COUNTER_PACK_TRANSACTION_SCHEDULE_DEFER_SKIP_OFF (178UL)\n \n-#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_OFF (178UL)\n+#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_OFF (179UL)\n #define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_NAME \"pack_bundle_crank_status\"\n #define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_DESC \"Result of considering whether bundle cranks are needed\"\n #define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_NOT_NEEDED_OFF (178UL)\n-#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_INSERTED_OFF (179UL)\n-#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_CREATION_FAILED_OFF (180UL)\n-#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_INSERTION_FAILED_OFF (181UL)\n+#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_NOT_NEEDED_OFF (179UL)\n+#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_INSERTED_OFF (180UL)\n+#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_CREATION_FAILED_OFF (181UL)\n+#define FD_METRICS_COUNTER_PACK_BUNDLE_CRANK_STATUS_INSERTION_FAILED_OFF (182UL)\n \n-#define FD_METRICS_GAUGE_PACK_CUS_CONSUMED_IN_BLOCK_OFF (182UL)\n+#define FD_METRICS_GAUGE_PACK_CUS_CONSUMED_IN_BLOCK_OFF (183UL)\n #define FD_METRICS_GAUGE_PACK_CUS_CONSUMED_IN_BLOCK_NAME \"pack_cus_consumed_in_block\"\n #define FD_METRICS_GAUGE_PACK_CUS_CONSUMED_IN_BLOCK_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_PACK_CUS_CONSUMED_IN_BLOCK_DESC \"The number of cost units consumed in the current block, or 0 if pack is not currently packing a block\"\n #define FD_METRICS_GAUGE_PACK_CUS_CONSUMED_IN_BLOCK_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_OFF (183UL)\n+#define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_OFF (184UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_NAME \"pack_cus_scheduled\"\n #define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_DESC \"The number of cost units scheduled for each block pack produced. This can be higher than the block limit because of returned CUs.\"\n@@ -224,7 +224,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_MIN (1000000UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_SCHEDULED_MAX (240000000UL)\n \n-#define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_OFF (200UL)\n+#define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_OFF (201UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_NAME \"pack_cus_rebated\"\n #define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_DESC \"The number of compute units rebated for each block pack produced. Compute units are rebated when a transaction fails prior to execution or requests more compute units than it uses.\"\n@@ -232,7 +232,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_MIN (1000000UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_REBATED_MAX (240000000UL)\n \n-#define FD_METRICS_HISTOGRAM_PACK_CUS_NET_OFF (217UL)\n+#define FD_METRICS_HISTOGRAM_PACK_CUS_NET_OFF (218UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_NET_NAME \"pack_cus_net\"\n #define FD_METRICS_HISTOGRAM_PACK_CUS_NET_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_NET_DESC \"The net number of cost units (scheduled - rebated) in each block pack produced.\"\n@@ -240,7 +240,7 @@\n #define FD_METRICS_HISTOGRAM_PACK_CUS_NET_MIN (1000000UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_NET_MAX (100000000UL)\n \n-#define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_OFF (234UL)\n+#define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_OFF (235UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_NAME \"pack_cus_pct\"\n #define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_DESC \"The percent of the total block cost limit used for each block pack produced.\"\n@@ -248,13 +248,13 @@\n #define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_MIN (0UL)\n #define FD_METRICS_HISTOGRAM_PACK_CUS_PCT_MAX (100UL)\n \n-#define FD_METRICS_COUNTER_PACK_DELETE_MISSED_OFF (251UL)\n+#define FD_METRICS_COUNTER_PACK_DELETE_MISSED_OFF (252UL)\n #define FD_METRICS_COUNTER_PACK_DELETE_MISSED_NAME \"pack_delete_missed\"\n #define FD_METRICS_COUNTER_PACK_DELETE_MISSED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_DELETE_MISSED_DESC \"Count of attempts to delete a transaction that wasn't found\"\n #define FD_METRICS_COUNTER_PACK_DELETE_MISSED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_PACK_DELETE_HIT_OFF (252UL)\n+#define FD_METRICS_COUNTER_PACK_DELETE_HIT_OFF (253UL)\n #define FD_METRICS_COUNTER_PACK_DELETE_HIT_NAME \"pack_delete_hit\"\n #define FD_METRICS_COUNTER_PACK_DELETE_HIT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_PACK_DELETE_HIT_DESC \"Count of attempts to delete a transaction that was found and deleted\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_poh.h b/src/disco/metrics/generated/fd_metrics_poh.h\nindex 147b9d9c03..263f761af5 100644\n--- a/src/disco/metrics/generated/fd_metrics_poh.h\n+++ b/src/disco/metrics/generated/fd_metrics_poh.h\n@@ -3,7 +3,7 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_OFF (16UL)\n+#define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_OFF (17UL)\n #define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_NAME \"poh_begin_leader_delay_seconds\"\n #define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_DESC \"Delay between when we become leader in a slot and when we receive the bank.\"\n@@ -11,7 +11,7 @@\n #define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_POH_BEGIN_LEADER_DELAY_SECONDS_MAX (0.01)\n \n-#define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_OFF (33UL)\n+#define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_OFF (34UL)\n #define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_NAME \"poh_first_microblock_delay_seconds\"\n #define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_DESC \"Delay between when we become leader in a slot and when we receive the first microblock.\"\n@@ -19,7 +19,7 @@\n #define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_POH_FIRST_MICROBLOCK_DELAY_SECONDS_MAX (0.01)\n \n-#define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_OFF (50UL)\n+#define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_OFF (51UL)\n #define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_NAME \"poh_slot_done_delay_seconds\"\n #define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_DESC \"Delay between when we become leader in a slot and when we finish the slot.\"\n@@ -27,7 +27,7 @@\n #define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_MIN (0.001)\n #define FD_METRICS_HISTOGRAM_POH_SLOT_DONE_DELAY_SECONDS_MAX (0.6)\n \n-#define FD_METRICS_HISTOGRAM_POH_BUNDLE_INITIALIZE_DELAY_SECONDS_OFF (67UL)\n+#define FD_METRICS_HISTOGRAM_POH_BUNDLE_INITIALIZE_DELAY_SECONDS_OFF (68UL)\n #define FD_METRICS_HISTOGRAM_POH_BUNDLE_INITIALIZE_DELAY_SECONDS_NAME \"poh_bundle_initialize_delay_seconds\"\n #define FD_METRICS_HISTOGRAM_POH_BUNDLE_INITIALIZE_DELAY_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_POH_BUNDLE_INITIALIZE_DELAY_SECONDS_DESC \"Delay in starting the slot caused by loading the information needed to generate the bundle crank transactions\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_quic.h b/src/disco/metrics/generated/fd_metrics_quic.h\nindex 0a68cc5152..d4fa11652c 100644\n--- a/src/disco/metrics/generated/fd_metrics_quic.h\n+++ b/src/disco/metrics/generated/fd_metrics_quic.h\n@@ -3,273 +3,273 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_QUIC_TXNS_OVERRUN_OFF (16UL)\n+#define FD_METRICS_COUNTER_QUIC_TXNS_OVERRUN_OFF (17UL)\n #define FD_METRICS_COUNTER_QUIC_TXNS_OVERRUN_NAME \"quic_txns_overrun\"\n #define FD_METRICS_COUNTER_QUIC_TXNS_OVERRUN_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_TXNS_OVERRUN_DESC \"Count of txns overrun before reassembled (too small txn_reassembly_count).\"\n #define FD_METRICS_COUNTER_QUIC_TXNS_OVERRUN_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_TXN_REASMS_STARTED_OFF (17UL)\n+#define FD_METRICS_COUNTER_QUIC_TXN_REASMS_STARTED_OFF (18UL)\n #define FD_METRICS_COUNTER_QUIC_TXN_REASMS_STARTED_NAME \"quic_txn_reasms_started\"\n #define FD_METRICS_COUNTER_QUIC_TXN_REASMS_STARTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_TXN_REASMS_STARTED_DESC \"Count of fragmented txn receive ops started.\"\n #define FD_METRICS_COUNTER_QUIC_TXN_REASMS_STARTED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_QUIC_TXN_REASMS_ACTIVE_OFF (18UL)\n+#define FD_METRICS_GAUGE_QUIC_TXN_REASMS_ACTIVE_OFF (19UL)\n #define FD_METRICS_GAUGE_QUIC_TXN_REASMS_ACTIVE_NAME \"quic_txn_reasms_active\"\n #define FD_METRICS_GAUGE_QUIC_TXN_REASMS_ACTIVE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_QUIC_TXN_REASMS_ACTIVE_DESC \"Number of fragmented txn receive ops currently active.\"\n #define FD_METRICS_GAUGE_QUIC_TXN_REASMS_ACTIVE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_FRAGS_OK_OFF (19UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAGS_OK_OFF (20UL)\n #define FD_METRICS_COUNTER_QUIC_FRAGS_OK_NAME \"quic_frags_ok\"\n #define FD_METRICS_COUNTER_QUIC_FRAGS_OK_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_FRAGS_OK_DESC \"Count of txn frags received\"\n #define FD_METRICS_COUNTER_QUIC_FRAGS_OK_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_FRAGS_GAP_OFF (20UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAGS_GAP_OFF (21UL)\n #define FD_METRICS_COUNTER_QUIC_FRAGS_GAP_NAME \"quic_frags_gap\"\n #define FD_METRICS_COUNTER_QUIC_FRAGS_GAP_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_FRAGS_GAP_DESC \"Count of txn frags dropped due to data gap\"\n #define FD_METRICS_COUNTER_QUIC_FRAGS_GAP_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_FRAGS_DUP_OFF (21UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAGS_DUP_OFF (22UL)\n #define FD_METRICS_COUNTER_QUIC_FRAGS_DUP_NAME \"quic_frags_dup\"\n #define FD_METRICS_COUNTER_QUIC_FRAGS_DUP_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_FRAGS_DUP_DESC \"Count of txn frags dropped due to dup (stream already completed)\"\n #define FD_METRICS_COUNTER_QUIC_FRAGS_DUP_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_OFF (22UL)\n+#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_OFF (23UL)\n #define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_NAME \"quic_txns_received\"\n #define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_DESC \"Count of txns received via TPU.\"\n #define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_UDP_OFF (22UL)\n-#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_QUIC_FAST_OFF (23UL)\n-#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_QUIC_FRAG_OFF (24UL)\n+#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_UDP_OFF (23UL)\n+#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_QUIC_FAST_OFF (24UL)\n+#define FD_METRICS_COUNTER_QUIC_TXNS_RECEIVED_QUIC_FRAG_OFF (25UL)\n \n-#define FD_METRICS_COUNTER_QUIC_TXNS_ABANDONED_OFF (25UL)\n+#define FD_METRICS_COUNTER_QUIC_TXNS_ABANDONED_OFF (26UL)\n #define FD_METRICS_COUNTER_QUIC_TXNS_ABANDONED_NAME \"quic_txns_abandoned\"\n #define FD_METRICS_COUNTER_QUIC_TXNS_ABANDONED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_TXNS_ABANDONED_DESC \"Count of txns abandoned because a conn was lost.\"\n #define FD_METRICS_COUNTER_QUIC_TXNS_ABANDONED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_TXN_UNDERSZ_OFF (26UL)\n+#define FD_METRICS_COUNTER_QUIC_TXN_UNDERSZ_OFF (27UL)\n #define FD_METRICS_COUNTER_QUIC_TXN_UNDERSZ_NAME \"quic_txn_undersz\"\n #define FD_METRICS_COUNTER_QUIC_TXN_UNDERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_TXN_UNDERSZ_DESC \"Count of txns received via QUIC dropped because they were too small.\"\n #define FD_METRICS_COUNTER_QUIC_TXN_UNDERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_TXN_OVERSZ_OFF (27UL)\n+#define FD_METRICS_COUNTER_QUIC_TXN_OVERSZ_OFF (28UL)\n #define FD_METRICS_COUNTER_QUIC_TXN_OVERSZ_NAME \"quic_txn_oversz\"\n #define FD_METRICS_COUNTER_QUIC_TXN_OVERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_TXN_OVERSZ_DESC \"Count of txns received via QUIC dropped because they were too large.\"\n #define FD_METRICS_COUNTER_QUIC_TXN_OVERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_UNDERSZ_OFF (28UL)\n+#define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_UNDERSZ_OFF (29UL)\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_UNDERSZ_NAME \"quic_legacy_txn_undersz\"\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_UNDERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_UNDERSZ_DESC \"Count of packets received on the non-QUIC port that were too small to be a valid IP packet.\"\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_UNDERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_OVERSZ_OFF (29UL)\n+#define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_OVERSZ_OFF (30UL)\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_OVERSZ_NAME \"quic_legacy_txn_oversz\"\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_OVERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_OVERSZ_DESC \"Count of packets received on the non-QUIC port that were too large to be a valid transaction.\"\n #define FD_METRICS_COUNTER_QUIC_LEGACY_TXN_OVERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_PACKETS_OFF (30UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_PACKETS_OFF (31UL)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_PACKETS_NAME \"quic_received_packets\"\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_PACKETS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_PACKETS_DESC \"Number of IP packets received.\"\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_BYTES_OFF (31UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_BYTES_OFF (32UL)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_BYTES_NAME \"quic_received_bytes\"\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_BYTES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_BYTES_DESC \"Total bytes received (including IP, UDP, QUIC headers).\"\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_SENT_PACKETS_OFF (32UL)\n+#define FD_METRICS_COUNTER_QUIC_SENT_PACKETS_OFF (33UL)\n #define FD_METRICS_COUNTER_QUIC_SENT_PACKETS_NAME \"quic_sent_packets\"\n #define FD_METRICS_COUNTER_QUIC_SENT_PACKETS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_SENT_PACKETS_DESC \"Number of IP packets sent.\"\n #define FD_METRICS_COUNTER_QUIC_SENT_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_SENT_BYTES_OFF (33UL)\n+#define FD_METRICS_COUNTER_QUIC_SENT_BYTES_OFF (34UL)\n #define FD_METRICS_COUNTER_QUIC_SENT_BYTES_NAME \"quic_sent_bytes\"\n #define FD_METRICS_COUNTER_QUIC_SENT_BYTES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_SENT_BYTES_DESC \"Total bytes sent (including IP, UDP, QUIC headers).\"\n #define FD_METRICS_COUNTER_QUIC_SENT_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_ALLOC_OFF (34UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_ALLOC_OFF (35UL)\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_ALLOC_NAME \"quic_connections_alloc\"\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_ALLOC_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_ALLOC_DESC \"The number of currently allocated QUIC connections.\"\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_ALLOC_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_OFF (35UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_OFF (36UL)\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_NAME \"quic_connections_state\"\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_DESC \"The number of QUIC connections in each state.\"\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_CNT (8UL)\n \n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_INVALID_OFF (35UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_HANDSHAKE_OFF (36UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_HANDSHAKE_COMPLETE_OFF (37UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_ACTIVE_OFF (38UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_PEER_CLOSE_OFF (39UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_ABORT_OFF (40UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_CLOSE_PENDING_OFF (41UL)\n-#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_DEAD_OFF (42UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_INVALID_OFF (36UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_HANDSHAKE_OFF (37UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_HANDSHAKE_COMPLETE_OFF (38UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_ACTIVE_OFF (39UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_PEER_CLOSE_OFF (40UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_ABORT_OFF (41UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_CLOSE_PENDING_OFF (42UL)\n+#define FD_METRICS_GAUGE_QUIC_CONNECTIONS_STATE_DEAD_OFF (43UL)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CREATED_OFF (43UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CREATED_OFF (44UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CREATED_NAME \"quic_connections_created\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CREATED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CREATED_DESC \"The total number of connections that have been created.\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CREATED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CLOSED_OFF (44UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CLOSED_OFF (45UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CLOSED_NAME \"quic_connections_closed\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CLOSED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CLOSED_DESC \"Number of connections gracefully closed.\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_CLOSED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_ABORTED_OFF (45UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_ABORTED_OFF (46UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_ABORTED_NAME \"quic_connections_aborted\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_ABORTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_ABORTED_DESC \"Number of connections aborted.\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_ABORTED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_TIMED_OUT_OFF (46UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_TIMED_OUT_OFF (47UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_TIMED_OUT_NAME \"quic_connections_timed_out\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_TIMED_OUT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_TIMED_OUT_DESC \"Number of connections timed out.\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_TIMED_OUT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_RETRIED_OFF (47UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTIONS_RETRIED_OFF (48UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_RETRIED_NAME \"quic_connections_retried\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_RETRIED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_RETRIED_DESC \"Number of connections established with retry.\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTIONS_RETRIED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_NO_SLOTS_OFF (48UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_NO_SLOTS_OFF (49UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_NO_SLOTS_NAME \"quic_connection_error_no_slots\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_NO_SLOTS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_NO_SLOTS_DESC \"Number of connections that failed to create due to lack of slots.\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_NO_SLOTS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_RETRY_FAIL_OFF (49UL)\n+#define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_RETRY_FAIL_OFF (50UL)\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_RETRY_FAIL_NAME \"quic_connection_error_retry_fail\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_RETRY_FAIL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_RETRY_FAIL_DESC \"Number of connections that failed during retry (e.g. invalid token).\"\n #define FD_METRICS_COUNTER_QUIC_CONNECTION_ERROR_RETRY_FAIL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_NO_CONN_OFF (50UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NO_CONN_OFF (51UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_CONN_NAME \"quic_pkt_no_conn\"\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_CONN_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_CONN_DESC \"Number of packets with an unknown connection ID.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_CONN_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_OFF (51UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_OFF (52UL)\n #define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_NAME \"quic_frame_tx_alloc\"\n #define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_DESC \"Results of attempts to acquire QUIC frame metadata.\"\n #define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_SUCCESS_OFF (51UL)\n-#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_FAIL_EMPTY_POOL_OFF (52UL)\n-#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_FAIL_CONN_MAX_OFF (53UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_SUCCESS_OFF (52UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_FAIL_EMPTY_POOL_OFF (53UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAME_TX_ALLOC_FAIL_CONN_MAX_OFF (54UL)\n \n-#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_OFF (54UL)\n+#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_OFF (55UL)\n #define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_NAME \"quic_initial_token_len\"\n #define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_DESC \"Number of Initial packets grouped by token length.\"\n #define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_ZERO_OFF (54UL)\n-#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_FD_QUIC_LEN_OFF (55UL)\n-#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_INVALID_LEN_OFF (56UL)\n+#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_ZERO_OFF (55UL)\n+#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_FD_QUIC_LEN_OFF (56UL)\n+#define FD_METRICS_COUNTER_QUIC_INITIAL_TOKEN_LEN_INVALID_LEN_OFF (57UL)\n \n-#define FD_METRICS_COUNTER_QUIC_HANDSHAKES_CREATED_OFF (57UL)\n+#define FD_METRICS_COUNTER_QUIC_HANDSHAKES_CREATED_OFF (58UL)\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKES_CREATED_NAME \"quic_handshakes_created\"\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKES_CREATED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKES_CREATED_DESC \"Number of handshake flows created.\"\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKES_CREATED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_HANDSHAKE_ERROR_ALLOC_FAIL_OFF (58UL)\n+#define FD_METRICS_COUNTER_QUIC_HANDSHAKE_ERROR_ALLOC_FAIL_OFF (59UL)\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_ERROR_ALLOC_FAIL_NAME \"quic_handshake_error_alloc_fail\"\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_ERROR_ALLOC_FAIL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_ERROR_ALLOC_FAIL_DESC \"Number of handshakes dropped due to alloc fail.\"\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_ERROR_ALLOC_FAIL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_HANDSHAKE_EVICTED_OFF (59UL)\n+#define FD_METRICS_COUNTER_QUIC_HANDSHAKE_EVICTED_OFF (60UL)\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_EVICTED_NAME \"quic_handshake_evicted\"\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_EVICTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_EVICTED_DESC \"Number of handshakes dropped due to eviction.\"\n #define FD_METRICS_COUNTER_QUIC_HANDSHAKE_EVICTED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_EVENTS_OFF (60UL)\n+#define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_EVENTS_OFF (61UL)\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_EVENTS_NAME \"quic_stream_received_events\"\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_EVENTS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_EVENTS_DESC \"Number of stream RX events.\"\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_EVENTS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_BYTES_OFF (61UL)\n+#define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_BYTES_OFF (62UL)\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_BYTES_NAME \"quic_stream_received_bytes\"\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_BYTES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_BYTES_DESC \"Total stream payload bytes received.\"\n #define FD_METRICS_COUNTER_QUIC_STREAM_RECEIVED_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_OFF (62UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_OFF (63UL)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_NAME \"quic_received_frames\"\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_DESC \"Number of QUIC frames received.\"\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CNT (22UL)\n \n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_UNKNOWN_OFF (62UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_ACK_OFF (63UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_RESET_STREAM_OFF (64UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STOP_SENDING_OFF (65UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CRYPTO_OFF (66UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_NEW_TOKEN_OFF (67UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STREAM_OFF (68UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_MAX_DATA_OFF (69UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_MAX_STREAM_DATA_OFF (70UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_MAX_STREAMS_OFF (71UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_DATA_BLOCKED_OFF (72UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STREAM_DATA_BLOCKED_OFF (73UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STREAMS_BLOCKED_OFF (74UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_NEW_CONN_ID_OFF (75UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_RETIRE_CONN_ID_OFF (76UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PATH_CHALLENGE_OFF (77UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PATH_RESPONSE_OFF (78UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CONN_CLOSE_QUIC_OFF (79UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CONN_CLOSE_APP_OFF (80UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_HANDSHAKE_DONE_OFF (81UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PING_OFF (82UL)\n-#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PADDING_OFF (83UL)\n-\n-#define FD_METRICS_COUNTER_QUIC_ACK_TX_OFF (84UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_UNKNOWN_OFF (63UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_ACK_OFF (64UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_RESET_STREAM_OFF (65UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STOP_SENDING_OFF (66UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CRYPTO_OFF (67UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_NEW_TOKEN_OFF (68UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STREAM_OFF (69UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_MAX_DATA_OFF (70UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_MAX_STREAM_DATA_OFF (71UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_MAX_STREAMS_OFF (72UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_DATA_BLOCKED_OFF (73UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STREAM_DATA_BLOCKED_OFF (74UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_STREAMS_BLOCKED_OFF (75UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_NEW_CONN_ID_OFF (76UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_RETIRE_CONN_ID_OFF (77UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PATH_CHALLENGE_OFF (78UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PATH_RESPONSE_OFF (79UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CONN_CLOSE_QUIC_OFF (80UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_CONN_CLOSE_APP_OFF (81UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_HANDSHAKE_DONE_OFF (82UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PING_OFF (83UL)\n+#define FD_METRICS_COUNTER_QUIC_RECEIVED_FRAMES_PADDING_OFF (84UL)\n+\n+#define FD_METRICS_COUNTER_QUIC_ACK_TX_OFF (85UL)\n #define FD_METRICS_COUNTER_QUIC_ACK_TX_NAME \"quic_ack_tx\"\n #define FD_METRICS_COUNTER_QUIC_ACK_TX_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_ACK_TX_DESC \"ACK events\"\n #define FD_METRICS_COUNTER_QUIC_ACK_TX_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_ACK_TX_CNT (5UL)\n \n-#define FD_METRICS_COUNTER_QUIC_ACK_TX_NOOP_OFF (84UL)\n-#define FD_METRICS_COUNTER_QUIC_ACK_TX_NEW_OFF (85UL)\n-#define FD_METRICS_COUNTER_QUIC_ACK_TX_MERGED_OFF (86UL)\n-#define FD_METRICS_COUNTER_QUIC_ACK_TX_DROP_OFF (87UL)\n-#define FD_METRICS_COUNTER_QUIC_ACK_TX_CANCEL_OFF (88UL)\n+#define FD_METRICS_COUNTER_QUIC_ACK_TX_NOOP_OFF (85UL)\n+#define FD_METRICS_COUNTER_QUIC_ACK_TX_NEW_OFF (86UL)\n+#define FD_METRICS_COUNTER_QUIC_ACK_TX_MERGED_OFF (87UL)\n+#define FD_METRICS_COUNTER_QUIC_ACK_TX_DROP_OFF (88UL)\n+#define FD_METRICS_COUNTER_QUIC_ACK_TX_CANCEL_OFF (89UL)\n \n-#define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_OFF (89UL)\n+#define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_OFF (90UL)\n #define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_NAME \"quic_service_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_DESC \"Duration spent in service\"\n@@ -277,7 +277,7 @@\n #define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_QUIC_SERVICE_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_OFF (106UL)\n+#define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_OFF (107UL)\n #define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_NAME \"quic_receive_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_DESC \"Duration spent processing packets\"\n@@ -285,73 +285,73 @@\n #define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_QUIC_RECEIVE_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_COUNTER_QUIC_FRAME_FAIL_PARSE_OFF (123UL)\n+#define FD_METRICS_COUNTER_QUIC_FRAME_FAIL_PARSE_OFF (124UL)\n #define FD_METRICS_COUNTER_QUIC_FRAME_FAIL_PARSE_NAME \"quic_frame_fail_parse\"\n #define FD_METRICS_COUNTER_QUIC_FRAME_FAIL_PARSE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_FRAME_FAIL_PARSE_DESC \"Number of QUIC frames failed to parse.\"\n #define FD_METRICS_COUNTER_QUIC_FRAME_FAIL_PARSE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_OFF (124UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_OFF (125UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_NAME \"quic_pkt_crypto_failed\"\n #define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_DESC \"Number of packets that failed decryption.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_INITIAL_OFF (124UL)\n-#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_EARLY_OFF (125UL)\n-#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_HANDSHAKE_OFF (126UL)\n-#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_APP_OFF (127UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_INITIAL_OFF (125UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_EARLY_OFF (126UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_HANDSHAKE_OFF (127UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_CRYPTO_FAILED_APP_OFF (128UL)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_OFF (128UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_OFF (129UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_NAME \"quic_pkt_no_key\"\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_DESC \"Number of packets that failed decryption due to missing key.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_INITIAL_OFF (128UL)\n-#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_EARLY_OFF (129UL)\n-#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_HANDSHAKE_OFF (130UL)\n-#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_APP_OFF (131UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_INITIAL_OFF (129UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_EARLY_OFF (130UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_HANDSHAKE_OFF (131UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NO_KEY_APP_OFF (132UL)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_NET_HEADER_INVALID_OFF (132UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_NET_HEADER_INVALID_OFF (133UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_NET_HEADER_INVALID_NAME \"quic_pkt_net_header_invalid\"\n #define FD_METRICS_COUNTER_QUIC_PKT_NET_HEADER_INVALID_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_NET_HEADER_INVALID_DESC \"Number of packets dropped due to weird IP or UDP header.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_NET_HEADER_INVALID_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_QUIC_HEADER_INVALID_OFF (133UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_QUIC_HEADER_INVALID_OFF (134UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_QUIC_HEADER_INVALID_NAME \"quic_pkt_quic_header_invalid\"\n #define FD_METRICS_COUNTER_QUIC_PKT_QUIC_HEADER_INVALID_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_QUIC_HEADER_INVALID_DESC \"Number of packets dropped due to weird QUIC header.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_QUIC_HEADER_INVALID_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_UNDERSZ_OFF (134UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_UNDERSZ_OFF (135UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_UNDERSZ_NAME \"quic_pkt_undersz\"\n #define FD_METRICS_COUNTER_QUIC_PKT_UNDERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_UNDERSZ_DESC \"Number of QUIC packets dropped due to being too small.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_UNDERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_OVERSZ_OFF (135UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_OVERSZ_OFF (136UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_OVERSZ_NAME \"quic_pkt_oversz\"\n #define FD_METRICS_COUNTER_QUIC_PKT_OVERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_OVERSZ_DESC \"Number of QUIC packets dropped due to being too large.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_OVERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_VERNEG_OFF (136UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_VERNEG_OFF (137UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_VERNEG_NAME \"quic_pkt_verneg\"\n #define FD_METRICS_COUNTER_QUIC_PKT_VERNEG_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_VERNEG_DESC \"Number of QUIC version negotiation packets received.\"\n #define FD_METRICS_COUNTER_QUIC_PKT_VERNEG_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_RETRY_SENT_OFF (137UL)\n+#define FD_METRICS_COUNTER_QUIC_RETRY_SENT_OFF (138UL)\n #define FD_METRICS_COUNTER_QUIC_RETRY_SENT_NAME \"quic_retry_sent\"\n #define FD_METRICS_COUNTER_QUIC_RETRY_SENT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_RETRY_SENT_DESC \"Number of QUIC Retry packets sent.\"\n #define FD_METRICS_COUNTER_QUIC_RETRY_SENT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_OFF (138UL)\n+#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_OFF (139UL)\n #define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_NAME \"quic_pkt_retransmissions\"\n #define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_DESC \"Number of QUIC packets that retransmitted.\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_repair.h b/src/disco/metrics/generated/fd_metrics_repair.h\nindex 0993d05d83..333b1ee0de 100644\n--- a/src/disco/metrics/generated/fd_metrics_repair.h\n+++ b/src/disco/metrics/generated/fd_metrics_repair.h\n@@ -3,71 +3,71 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_CLNT_PKT_OFF (16UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_CLNT_PKT_OFF (17UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_CLNT_PKT_NAME \"repair_recv_clnt_pkt\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_CLNT_PKT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_CLNT_PKT_DESC \"Now many client packets have we received\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_CLNT_PKT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_OFF (17UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_OFF (18UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_NAME \"repair_recv_serv_pkt\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_DESC \"How many server packets have we received\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_CORRUPT_PKT_OFF (18UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_CORRUPT_PKT_OFF (19UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_CORRUPT_PKT_NAME \"repair_recv_serv_corrupt_pkt\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_CORRUPT_PKT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_CORRUPT_PKT_DESC \"How many corrupt server packets have we received\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_CORRUPT_PKT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_INVALID_SIGNATURE_OFF (19UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_INVALID_SIGNATURE_OFF (20UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_INVALID_SIGNATURE_NAME \"repair_recv_serv_invalid_signature\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_INVALID_SIGNATURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_INVALID_SIGNATURE_DESC \"How many invalid signatures have we received\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_INVALID_SIGNATURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_FULL_PING_TABLE_OFF (20UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_FULL_PING_TABLE_OFF (21UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_FULL_PING_TABLE_NAME \"repair_recv_serv_full_ping_table\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_FULL_PING_TABLE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_FULL_PING_TABLE_DESC \"Is our ping table full and causing packet drops\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_FULL_PING_TABLE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_OFF (21UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_OFF (22UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_NAME \"repair_recv_serv_pkt_types\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_DESC \"Server messages received\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_CNT (5UL)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_PONG_OFF (21UL)\n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_WINDOW_OFF (22UL)\n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_HIGHEST_WINDOW_OFF (23UL)\n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_ORPHAN_OFF (24UL)\n-#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_UNKNOWN_OFF (25UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_PONG_OFF (22UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_WINDOW_OFF (23UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_HIGHEST_WINDOW_OFF (24UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_ORPHAN_OFF (25UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_SERV_PKT_TYPES_UNKNOWN_OFF (26UL)\n \n-#define FD_METRICS_COUNTER_REPAIR_RECV_PKT_CORRUPTED_MSG_OFF (26UL)\n+#define FD_METRICS_COUNTER_REPAIR_RECV_PKT_CORRUPTED_MSG_OFF (27UL)\n #define FD_METRICS_COUNTER_REPAIR_RECV_PKT_CORRUPTED_MSG_NAME \"repair_recv_pkt_corrupted_msg\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_PKT_CORRUPTED_MSG_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_RECV_PKT_CORRUPTED_MSG_DESC \"How many corrupt messages have we received\"\n #define FD_METRICS_COUNTER_REPAIR_RECV_PKT_CORRUPTED_MSG_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_SEND_PKT_CNT_OFF (27UL)\n+#define FD_METRICS_COUNTER_REPAIR_SEND_PKT_CNT_OFF (28UL)\n #define FD_METRICS_COUNTER_REPAIR_SEND_PKT_CNT_NAME \"repair_send_pkt_cnt\"\n #define FD_METRICS_COUNTER_REPAIR_SEND_PKT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_SEND_PKT_CNT_DESC \"How many packets have sent\"\n #define FD_METRICS_COUNTER_REPAIR_SEND_PKT_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_OFF (28UL)\n+#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_OFF (29UL)\n #define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NAME \"repair_sent_pkt_types\"\n #define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_DESC \"What types of client messages are we sending\"\n #define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NEEDED_WINDOW_OFF (28UL)\n-#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NEEDED_HIGHEST_WINDOW_OFF (29UL)\n-#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NEEDED_ORPHAN_OFF (30UL)\n+#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NEEDED_WINDOW_OFF (29UL)\n+#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NEEDED_HIGHEST_WINDOW_OFF (30UL)\n+#define FD_METRICS_COUNTER_REPAIR_SENT_PKT_TYPES_NEEDED_ORPHAN_OFF (31UL)\n \n #define FD_METRICS_REPAIR_TOTAL (15UL)\n extern const fd_metrics_meta_t FD_METRICS_REPAIR[FD_METRICS_REPAIR_TOTAL];\ndiff --git a/src/disco/metrics/generated/fd_metrics_replay.h b/src/disco/metrics/generated/fd_metrics_replay.h\nindex d5bddf36ed..9b37d2ec35 100644\n--- a/src/disco/metrics/generated/fd_metrics_replay.h\n+++ b/src/disco/metrics/generated/fd_metrics_replay.h\n@@ -3,13 +3,13 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_REPLAY_SLOT_OFF (16UL)\n+#define FD_METRICS_GAUGE_REPLAY_SLOT_OFF (17UL)\n #define FD_METRICS_GAUGE_REPLAY_SLOT_NAME \"replay_slot\"\n #define FD_METRICS_GAUGE_REPLAY_SLOT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_REPLAY_SLOT_DESC \"\"\n #define FD_METRICS_GAUGE_REPLAY_SLOT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_REPLAY_LAST_VOTED_SLOT_OFF (17UL)\n+#define FD_METRICS_GAUGE_REPLAY_LAST_VOTED_SLOT_OFF (18UL)\n #define FD_METRICS_GAUGE_REPLAY_LAST_VOTED_SLOT_NAME \"replay_last_voted_slot\"\n #define FD_METRICS_GAUGE_REPLAY_LAST_VOTED_SLOT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_REPLAY_LAST_VOTED_SLOT_DESC \"\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_resolv.h b/src/disco/metrics/generated/fd_metrics_resolv.h\nindex 8161478c44..218a2d9e44 100644\n--- a/src/disco/metrics/generated/fd_metrics_resolv.h\n+++ b/src/disco/metrics/generated/fd_metrics_resolv.h\n@@ -3,45 +3,45 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_RESOLV_NO_BANK_DROP_OFF (16UL)\n+#define FD_METRICS_COUNTER_RESOLV_NO_BANK_DROP_OFF (17UL)\n #define FD_METRICS_COUNTER_RESOLV_NO_BANK_DROP_NAME \"resolv_no_bank_drop\"\n #define FD_METRICS_COUNTER_RESOLV_NO_BANK_DROP_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_RESOLV_NO_BANK_DROP_DESC \"Count of transactions dropped because the bank was not available\"\n #define FD_METRICS_COUNTER_RESOLV_NO_BANK_DROP_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_OFF (17UL)\n+#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_OFF (18UL)\n #define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_NAME \"resolv_stash_operation\"\n #define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_DESC \"Count of operations that happened on the transaction stash\"\n #define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_INSERTED_OFF (17UL)\n-#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_OVERRUN_OFF (18UL)\n-#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_PUBLISHED_OFF (19UL)\n-#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_REMOVED_OFF (20UL)\n+#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_INSERTED_OFF (18UL)\n+#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_OVERRUN_OFF (19UL)\n+#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_PUBLISHED_OFF (20UL)\n+#define FD_METRICS_COUNTER_RESOLV_STASH_OPERATION_REMOVED_OFF (21UL)\n \n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_OFF (21UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_OFF (22UL)\n #define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_NAME \"resolv_lut_resolved\"\n #define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_DESC \"Count of address lookup tables resolved\"\n #define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_CNT (6UL)\n \n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_INVALID_LOOKUP_INDEX_OFF (21UL)\n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_ACCOUNT_UNINITIALIZED_OFF (22UL)\n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_INVALID_ACCOUNT_DATA_OFF (23UL)\n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_INVALID_ACCOUNT_OWNER_OFF (24UL)\n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_ACCOUNT_NOT_FOUND_OFF (25UL)\n-#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_SUCCESS_OFF (26UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_INVALID_LOOKUP_INDEX_OFF (22UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_ACCOUNT_UNINITIALIZED_OFF (23UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_INVALID_ACCOUNT_DATA_OFF (24UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_INVALID_ACCOUNT_OWNER_OFF (25UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_ACCOUNT_NOT_FOUND_OFF (26UL)\n+#define FD_METRICS_COUNTER_RESOLV_LUT_RESOLVED_SUCCESS_OFF (27UL)\n \n-#define FD_METRICS_COUNTER_RESOLV_BLOCKHASH_EXPIRED_OFF (27UL)\n+#define FD_METRICS_COUNTER_RESOLV_BLOCKHASH_EXPIRED_OFF (28UL)\n #define FD_METRICS_COUNTER_RESOLV_BLOCKHASH_EXPIRED_NAME \"resolv_blockhash_expired\"\n #define FD_METRICS_COUNTER_RESOLV_BLOCKHASH_EXPIRED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_RESOLV_BLOCKHASH_EXPIRED_DESC \"Count of transactions that failed to resolve because the blockhash was expired\"\n #define FD_METRICS_COUNTER_RESOLV_BLOCKHASH_EXPIRED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_RESOLV_TRANSACTION_BUNDLE_PEER_FAILURE_OFF (28UL)\n+#define FD_METRICS_COUNTER_RESOLV_TRANSACTION_BUNDLE_PEER_FAILURE_OFF (29UL)\n #define FD_METRICS_COUNTER_RESOLV_TRANSACTION_BUNDLE_PEER_FAILURE_NAME \"resolv_transaction_bundle_peer_failure\"\n #define FD_METRICS_COUNTER_RESOLV_TRANSACTION_BUNDLE_PEER_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_RESOLV_TRANSACTION_BUNDLE_PEER_FAILURE_DESC \"Count of transactions that failed to resolve because a peer transaction in the bundle failed\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_send.h b/src/disco/metrics/generated/fd_metrics_send.h\nindex bb85209ac2..c41b65e6c5 100644\n--- a/src/disco/metrics/generated/fd_metrics_send.h\n+++ b/src/disco/metrics/generated/fd_metrics_send.h\n@@ -3,305 +3,305 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_SEND_LEADER_NOT_FOUND_OFF (16UL)\n+#define FD_METRICS_COUNTER_SEND_LEADER_NOT_FOUND_OFF (17UL)\n #define FD_METRICS_COUNTER_SEND_LEADER_NOT_FOUND_NAME \"send_leader_not_found\"\n #define FD_METRICS_COUNTER_SEND_LEADER_NOT_FOUND_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_LEADER_NOT_FOUND_DESC \"Total number of times slot leader not found\"\n #define FD_METRICS_COUNTER_SEND_LEADER_NOT_FOUND_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_OFF (17UL)\n+#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_OFF (18UL)\n #define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_NAME \"send_new_contact_info\"\n #define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_DESC \"Total number of contact infos received and handled\"\n #define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_CNT (5UL)\n \n-#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_CONNECT_OFF (17UL)\n-#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_UNROUTABLE_OFF (18UL)\n-#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_UNSTAKED_OFF (19UL)\n-#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_CHANGED_OFF (20UL)\n-#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_NO_CHANGE_OFF (21UL)\n+#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_CONNECT_OFF (18UL)\n+#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_UNROUTABLE_OFF (19UL)\n+#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_UNSTAKED_OFF (20UL)\n+#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_CHANGED_OFF (21UL)\n+#define FD_METRICS_COUNTER_SEND_NEW_CONTACT_INFO_NO_CHANGE_OFF (22UL)\n \n-#define FD_METRICS_COUNTER_SEND_CONTACT_STALE_OFF (22UL)\n+#define FD_METRICS_COUNTER_SEND_CONTACT_STALE_OFF (23UL)\n #define FD_METRICS_COUNTER_SEND_CONTACT_STALE_NAME \"send_contact_stale\"\n #define FD_METRICS_COUNTER_SEND_CONTACT_STALE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONTACT_STALE_DESC \"Total number of reconnects skipped due to stale contact info\"\n #define FD_METRICS_COUNTER_SEND_CONTACT_STALE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_OFF (23UL)\n+#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_OFF (24UL)\n #define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_NAME \"send_quic_send_result\"\n #define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_DESC \"Total number of transactions we attempted to send via QUIC\"\n #define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_SUCCESS_OFF (23UL)\n-#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_NO_CONN_OFF (24UL)\n-#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_NO_STREAM_OFF (25UL)\n+#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_SUCCESS_OFF (24UL)\n+#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_NO_CONN_OFF (25UL)\n+#define FD_METRICS_COUNTER_SEND_QUIC_SEND_RESULT_NO_STREAM_OFF (26UL)\n \n-#define FD_METRICS_COUNTER_SEND_QUIC_CONN_CREATE_FAILED_OFF (26UL)\n+#define FD_METRICS_COUNTER_SEND_QUIC_CONN_CREATE_FAILED_OFF (27UL)\n #define FD_METRICS_COUNTER_SEND_QUIC_CONN_CREATE_FAILED_NAME \"send_quic_conn_create_failed\"\n #define FD_METRICS_COUNTER_SEND_QUIC_CONN_CREATE_FAILED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_QUIC_CONN_CREATE_FAILED_DESC \"Total number of QUIC connection creation failures\"\n #define FD_METRICS_COUNTER_SEND_QUIC_CONN_CREATE_FAILED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_RECEIVED_PACKETS_OFF (27UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_PACKETS_OFF (28UL)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_PACKETS_NAME \"send_received_packets\"\n #define FD_METRICS_COUNTER_SEND_RECEIVED_PACKETS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_PACKETS_DESC \"Total count of QUIC packets received\"\n #define FD_METRICS_COUNTER_SEND_RECEIVED_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_RECEIVED_BYTES_OFF (28UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_BYTES_OFF (29UL)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_BYTES_NAME \"send_received_bytes\"\n #define FD_METRICS_COUNTER_SEND_RECEIVED_BYTES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_BYTES_DESC \"Total bytes received via QUIC\"\n #define FD_METRICS_COUNTER_SEND_RECEIVED_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_SENT_PACKETS_OFF (29UL)\n+#define FD_METRICS_COUNTER_SEND_SENT_PACKETS_OFF (30UL)\n #define FD_METRICS_COUNTER_SEND_SENT_PACKETS_NAME \"send_sent_packets\"\n #define FD_METRICS_COUNTER_SEND_SENT_PACKETS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_SENT_PACKETS_DESC \"Total count of QUIC packets sent\"\n #define FD_METRICS_COUNTER_SEND_SENT_PACKETS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_SENT_BYTES_OFF (30UL)\n+#define FD_METRICS_COUNTER_SEND_SENT_BYTES_OFF (31UL)\n #define FD_METRICS_COUNTER_SEND_SENT_BYTES_NAME \"send_sent_bytes\"\n #define FD_METRICS_COUNTER_SEND_SENT_BYTES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_SENT_BYTES_DESC \"Total bytes sent via QUIC\"\n #define FD_METRICS_COUNTER_SEND_SENT_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_RETRY_SENT_OFF (31UL)\n+#define FD_METRICS_COUNTER_SEND_RETRY_SENT_OFF (32UL)\n #define FD_METRICS_COUNTER_SEND_RETRY_SENT_NAME \"send_retry_sent\"\n #define FD_METRICS_COUNTER_SEND_RETRY_SENT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_RETRY_SENT_DESC \"Total count of QUIC retry packets sent\"\n #define FD_METRICS_COUNTER_SEND_RETRY_SENT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_ALLOC_OFF (32UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_ALLOC_OFF (33UL)\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_ALLOC_NAME \"send_connections_alloc\"\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_ALLOC_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_ALLOC_DESC \"Number of currently allocated QUIC connections\"\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_ALLOC_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_OFF (33UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_OFF (34UL)\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_NAME \"send_connections_state\"\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_DESC \"Number of QUIC connections in each state\"\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_CNT (8UL)\n \n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_INVALID_OFF (33UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_HANDSHAKE_OFF (34UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_HANDSHAKE_COMPLETE_OFF (35UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_ACTIVE_OFF (36UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_PEER_CLOSE_OFF (37UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_ABORT_OFF (38UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_CLOSE_PENDING_OFF (39UL)\n-#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_DEAD_OFF (40UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_INVALID_OFF (34UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_HANDSHAKE_OFF (35UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_HANDSHAKE_COMPLETE_OFF (36UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_ACTIVE_OFF (37UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_PEER_CLOSE_OFF (38UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_ABORT_OFF (39UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_CLOSE_PENDING_OFF (40UL)\n+#define FD_METRICS_GAUGE_SEND_CONNECTIONS_STATE_DEAD_OFF (41UL)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTIONS_CREATED_OFF (41UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTIONS_CREATED_OFF (42UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CREATED_NAME \"send_connections_created\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CREATED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CREATED_DESC \"Total count of QUIC connections created\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CREATED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTIONS_CLOSED_OFF (42UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTIONS_CLOSED_OFF (43UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CLOSED_NAME \"send_connections_closed\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CLOSED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CLOSED_DESC \"Total count of QUIC connections closed\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_CLOSED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTIONS_ABORTED_OFF (43UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTIONS_ABORTED_OFF (44UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_ABORTED_NAME \"send_connections_aborted\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_ABORTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_ABORTED_DESC \"Total count of QUIC connections aborted\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_ABORTED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTIONS_TIMED_OUT_OFF (44UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTIONS_TIMED_OUT_OFF (45UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_TIMED_OUT_NAME \"send_connections_timed_out\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_TIMED_OUT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_TIMED_OUT_DESC \"Total count of QUIC connections timed out\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_TIMED_OUT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTIONS_RETRIED_OFF (45UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTIONS_RETRIED_OFF (46UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_RETRIED_NAME \"send_connections_retried\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_RETRIED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_RETRIED_DESC \"Total count of QUIC connections retried\"\n #define FD_METRICS_COUNTER_SEND_CONNECTIONS_RETRIED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_NO_SLOTS_OFF (46UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_NO_SLOTS_OFF (47UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_NO_SLOTS_NAME \"send_connection_error_no_slots\"\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_NO_SLOTS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_NO_SLOTS_DESC \"Total count of connection errors due to no slots\"\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_NO_SLOTS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_RETRY_FAIL_OFF (47UL)\n+#define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_RETRY_FAIL_OFF (48UL)\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_RETRY_FAIL_NAME \"send_connection_error_retry_fail\"\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_RETRY_FAIL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_RETRY_FAIL_DESC \"Total count of connection retry failures\"\n #define FD_METRICS_COUNTER_SEND_CONNECTION_ERROR_RETRY_FAIL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_OFF (48UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_OFF (49UL)\n #define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_NAME \"send_pkt_crypto_failed\"\n #define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_DESC \"Total count of packets with crypto failures\"\n #define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_INITIAL_OFF (48UL)\n-#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_EARLY_OFF (49UL)\n-#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_HANDSHAKE_OFF (50UL)\n-#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_APP_OFF (51UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_INITIAL_OFF (49UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_EARLY_OFF (50UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_HANDSHAKE_OFF (51UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_CRYPTO_FAILED_APP_OFF (52UL)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_OFF (52UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_OFF (53UL)\n #define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_NAME \"send_pkt_no_key\"\n #define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_DESC \"Total count of packets with no key\"\n #define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_CNT (4UL)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_INITIAL_OFF (52UL)\n-#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_EARLY_OFF (53UL)\n-#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_HANDSHAKE_OFF (54UL)\n-#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_APP_OFF (55UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_INITIAL_OFF (53UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_EARLY_OFF (54UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_HANDSHAKE_OFF (55UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NO_KEY_APP_OFF (56UL)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_NO_CONN_OFF (56UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NO_CONN_OFF (57UL)\n #define FD_METRICS_COUNTER_SEND_PKT_NO_CONN_NAME \"send_pkt_no_conn\"\n #define FD_METRICS_COUNTER_SEND_PKT_NO_CONN_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_NO_CONN_DESC \"Total count of packets with no connection\"\n #define FD_METRICS_COUNTER_SEND_PKT_NO_CONN_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_TX_ALLOC_FAIL_OFF (57UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_TX_ALLOC_FAIL_OFF (58UL)\n #define FD_METRICS_COUNTER_SEND_PKT_TX_ALLOC_FAIL_NAME \"send_pkt_tx_alloc_fail\"\n #define FD_METRICS_COUNTER_SEND_PKT_TX_ALLOC_FAIL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_TX_ALLOC_FAIL_DESC \"Total count of packet TX allocation failures\"\n #define FD_METRICS_COUNTER_SEND_PKT_TX_ALLOC_FAIL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_NET_HEADER_INVALID_OFF (58UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_NET_HEADER_INVALID_OFF (59UL)\n #define FD_METRICS_COUNTER_SEND_PKT_NET_HEADER_INVALID_NAME \"send_pkt_net_header_invalid\"\n #define FD_METRICS_COUNTER_SEND_PKT_NET_HEADER_INVALID_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_NET_HEADER_INVALID_DESC \"Total count of packets with invalid network headers\"\n #define FD_METRICS_COUNTER_SEND_PKT_NET_HEADER_INVALID_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_QUIC_HEADER_INVALID_OFF (59UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_QUIC_HEADER_INVALID_OFF (60UL)\n #define FD_METRICS_COUNTER_SEND_PKT_QUIC_HEADER_INVALID_NAME \"send_pkt_quic_header_invalid\"\n #define FD_METRICS_COUNTER_SEND_PKT_QUIC_HEADER_INVALID_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_QUIC_HEADER_INVALID_DESC \"Total count of packets with invalid QUIC headers\"\n #define FD_METRICS_COUNTER_SEND_PKT_QUIC_HEADER_INVALID_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_UNDERSZ_OFF (60UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_UNDERSZ_OFF (61UL)\n #define FD_METRICS_COUNTER_SEND_PKT_UNDERSZ_NAME \"send_pkt_undersz\"\n #define FD_METRICS_COUNTER_SEND_PKT_UNDERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_UNDERSZ_DESC \"Total count of undersized packets\"\n #define FD_METRICS_COUNTER_SEND_PKT_UNDERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_OVERSZ_OFF (61UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_OVERSZ_OFF (62UL)\n #define FD_METRICS_COUNTER_SEND_PKT_OVERSZ_NAME \"send_pkt_oversz\"\n #define FD_METRICS_COUNTER_SEND_PKT_OVERSZ_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_OVERSZ_DESC \"Total count of oversized packets\"\n #define FD_METRICS_COUNTER_SEND_PKT_OVERSZ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_VERNEG_OFF (62UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_VERNEG_OFF (63UL)\n #define FD_METRICS_COUNTER_SEND_PKT_VERNEG_NAME \"send_pkt_verneg\"\n #define FD_METRICS_COUNTER_SEND_PKT_VERNEG_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_VERNEG_DESC \"Total count of version negotiation packets\"\n #define FD_METRICS_COUNTER_SEND_PKT_VERNEG_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_PKT_RETRANSMISSIONS_OFF (63UL)\n+#define FD_METRICS_COUNTER_SEND_PKT_RETRANSMISSIONS_OFF (64UL)\n #define FD_METRICS_COUNTER_SEND_PKT_RETRANSMISSIONS_NAME \"send_pkt_retransmissions\"\n #define FD_METRICS_COUNTER_SEND_PKT_RETRANSMISSIONS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_PKT_RETRANSMISSIONS_DESC \"Total count of packet retransmissions\"\n #define FD_METRICS_COUNTER_SEND_PKT_RETRANSMISSIONS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_HANDSHAKES_CREATED_OFF (64UL)\n+#define FD_METRICS_COUNTER_SEND_HANDSHAKES_CREATED_OFF (65UL)\n #define FD_METRICS_COUNTER_SEND_HANDSHAKES_CREATED_NAME \"send_handshakes_created\"\n #define FD_METRICS_COUNTER_SEND_HANDSHAKES_CREATED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_HANDSHAKES_CREATED_DESC \"Total count of QUIC handshakes created\"\n #define FD_METRICS_COUNTER_SEND_HANDSHAKES_CREATED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_HANDSHAKE_ERROR_ALLOC_FAIL_OFF (65UL)\n+#define FD_METRICS_COUNTER_SEND_HANDSHAKE_ERROR_ALLOC_FAIL_OFF (66UL)\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_ERROR_ALLOC_FAIL_NAME \"send_handshake_error_alloc_fail\"\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_ERROR_ALLOC_FAIL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_ERROR_ALLOC_FAIL_DESC \"Total count of handshake allocation failures\"\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_ERROR_ALLOC_FAIL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_HANDSHAKE_EVICTED_OFF (66UL)\n+#define FD_METRICS_COUNTER_SEND_HANDSHAKE_EVICTED_OFF (67UL)\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_EVICTED_NAME \"send_handshake_evicted\"\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_EVICTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_EVICTED_DESC \"Total count of handshakes evicted\"\n #define FD_METRICS_COUNTER_SEND_HANDSHAKE_EVICTED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_EVENTS_OFF (67UL)\n+#define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_EVENTS_OFF (68UL)\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_EVENTS_NAME \"send_stream_received_events\"\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_EVENTS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_EVENTS_DESC \"Total count of stream events received\"\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_EVENTS_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_BYTES_OFF (68UL)\n+#define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_BYTES_OFF (69UL)\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_BYTES_NAME \"send_stream_received_bytes\"\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_BYTES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_BYTES_DESC \"Total bytes received via streams\"\n #define FD_METRICS_COUNTER_SEND_STREAM_RECEIVED_BYTES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_OFF (69UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_OFF (70UL)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_NAME \"send_received_frames\"\n #define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_DESC \"Total count of QUIC frames received\"\n #define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CNT (22UL)\n \n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_UNKNOWN_OFF (69UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_ACK_OFF (70UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_RESET_STREAM_OFF (71UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STOP_SENDING_OFF (72UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CRYPTO_OFF (73UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_NEW_TOKEN_OFF (74UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STREAM_OFF (75UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_MAX_DATA_OFF (76UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_MAX_STREAM_DATA_OFF (77UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_MAX_STREAMS_OFF (78UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_DATA_BLOCKED_OFF (79UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STREAM_DATA_BLOCKED_OFF (80UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STREAMS_BLOCKED_OFF (81UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_NEW_CONN_ID_OFF (82UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_RETIRE_CONN_ID_OFF (83UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PATH_CHALLENGE_OFF (84UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PATH_RESPONSE_OFF (85UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CONN_CLOSE_QUIC_OFF (86UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CONN_CLOSE_APP_OFF (87UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_HANDSHAKE_DONE_OFF (88UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PING_OFF (89UL)\n-#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PADDING_OFF (90UL)\n-\n-#define FD_METRICS_COUNTER_SEND_FRAME_FAIL_PARSE_OFF (91UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_UNKNOWN_OFF (70UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_ACK_OFF (71UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_RESET_STREAM_OFF (72UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STOP_SENDING_OFF (73UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CRYPTO_OFF (74UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_NEW_TOKEN_OFF (75UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STREAM_OFF (76UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_MAX_DATA_OFF (77UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_MAX_STREAM_DATA_OFF (78UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_MAX_STREAMS_OFF (79UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_DATA_BLOCKED_OFF (80UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STREAM_DATA_BLOCKED_OFF (81UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_STREAMS_BLOCKED_OFF (82UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_NEW_CONN_ID_OFF (83UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_RETIRE_CONN_ID_OFF (84UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PATH_CHALLENGE_OFF (85UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PATH_RESPONSE_OFF (86UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CONN_CLOSE_QUIC_OFF (87UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_CONN_CLOSE_APP_OFF (88UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_HANDSHAKE_DONE_OFF (89UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PING_OFF (90UL)\n+#define FD_METRICS_COUNTER_SEND_RECEIVED_FRAMES_PADDING_OFF (91UL)\n+\n+#define FD_METRICS_COUNTER_SEND_FRAME_FAIL_PARSE_OFF (92UL)\n #define FD_METRICS_COUNTER_SEND_FRAME_FAIL_PARSE_NAME \"send_frame_fail_parse\"\n #define FD_METRICS_COUNTER_SEND_FRAME_FAIL_PARSE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_FRAME_FAIL_PARSE_DESC \"Total count of frame parse failures\"\n #define FD_METRICS_COUNTER_SEND_FRAME_FAIL_PARSE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_OFF (92UL)\n+#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_OFF (93UL)\n #define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_NAME \"send_frame_tx_alloc\"\n #define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_DESC \"Results of attempts to acquire QUIC frame metadata.\"\n #define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_CNT (3UL)\n \n-#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_SUCCESS_OFF (92UL)\n-#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_FAIL_EMPTY_POOL_OFF (93UL)\n-#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_FAIL_CONN_MAX_OFF (94UL)\n+#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_SUCCESS_OFF (93UL)\n+#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_FAIL_EMPTY_POOL_OFF (94UL)\n+#define FD_METRICS_COUNTER_SEND_FRAME_TX_ALLOC_FAIL_CONN_MAX_OFF (95UL)\n \n-#define FD_METRICS_COUNTER_SEND_ACK_TX_OFF (95UL)\n+#define FD_METRICS_COUNTER_SEND_ACK_TX_OFF (96UL)\n #define FD_METRICS_COUNTER_SEND_ACK_TX_NAME \"send_ack_tx\"\n #define FD_METRICS_COUNTER_SEND_ACK_TX_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SEND_ACK_TX_DESC \"Total count of ACK frames transmitted\"\n #define FD_METRICS_COUNTER_SEND_ACK_TX_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SEND_ACK_TX_CNT (5UL)\n \n-#define FD_METRICS_COUNTER_SEND_ACK_TX_NOOP_OFF (95UL)\n-#define FD_METRICS_COUNTER_SEND_ACK_TX_NEW_OFF (96UL)\n-#define FD_METRICS_COUNTER_SEND_ACK_TX_MERGED_OFF (97UL)\n-#define FD_METRICS_COUNTER_SEND_ACK_TX_DROP_OFF (98UL)\n-#define FD_METRICS_COUNTER_SEND_ACK_TX_CANCEL_OFF (99UL)\n+#define FD_METRICS_COUNTER_SEND_ACK_TX_NOOP_OFF (96UL)\n+#define FD_METRICS_COUNTER_SEND_ACK_TX_NEW_OFF (97UL)\n+#define FD_METRICS_COUNTER_SEND_ACK_TX_MERGED_OFF (98UL)\n+#define FD_METRICS_COUNTER_SEND_ACK_TX_DROP_OFF (99UL)\n+#define FD_METRICS_COUNTER_SEND_ACK_TX_CANCEL_OFF (100UL)\n \n-#define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_OFF (100UL)\n+#define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_OFF (101UL)\n #define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_NAME \"send_service_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_DESC \"Duration spent in service\"\n@@ -309,7 +309,7 @@\n #define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_SEND_SERVICE_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_OFF (117UL)\n+#define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_OFF (118UL)\n #define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_NAME \"send_receive_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_DESC \"Duration spent processing packets\"\n@@ -317,7 +317,7 @@\n #define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_SEND_RECEIVE_DURATION_SECONDS_MAX (0.1)\n \n-#define FD_METRICS_HISTOGRAM_SEND_SIGN_DURATION_SECONDS_OFF (134UL)\n+#define FD_METRICS_HISTOGRAM_SEND_SIGN_DURATION_SECONDS_OFF (135UL)\n #define FD_METRICS_HISTOGRAM_SEND_SIGN_DURATION_SECONDS_NAME \"send_sign_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_SEND_SIGN_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SEND_SIGN_DURATION_SECONDS_DESC \"Duration spent waiting for tls_cv signatures\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_shred.h b/src/disco/metrics/generated/fd_metrics_shred.h\nindex 20b2a69e12..47da1109dc 100644\n--- a/src/disco/metrics/generated/fd_metrics_shred.h\n+++ b/src/disco/metrics/generated/fd_metrics_shred.h\n@@ -3,7 +3,7 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_OFF (16UL)\n+#define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_OFF (17UL)\n #define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_NAME \"shred_cluster_contact_info_cnt\"\n #define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_DESC \"Number of contact infos in the cluster contact info message\"\n@@ -11,19 +11,19 @@\n #define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_MIN (0UL)\n #define FD_METRICS_HISTOGRAM_SHRED_CLUSTER_CONTACT_INFO_CNT_MAX (40200UL)\n \n-#define FD_METRICS_COUNTER_SHRED_MICROBLOCKS_ABANDONED_OFF (33UL)\n+#define FD_METRICS_COUNTER_SHRED_MICROBLOCKS_ABANDONED_OFF (34UL)\n #define FD_METRICS_COUNTER_SHRED_MICROBLOCKS_ABANDONED_NAME \"shred_microblocks_abandoned\"\n #define FD_METRICS_COUNTER_SHRED_MICROBLOCKS_ABANDONED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_MICROBLOCKS_ABANDONED_DESC \"The number of microblocks that were abandoned because we switched slots without finishing the current slot\"\n #define FD_METRICS_COUNTER_SHRED_MICROBLOCKS_ABANDONED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_INVALID_BLOCK_ID_OFF (34UL)\n+#define FD_METRICS_COUNTER_SHRED_INVALID_BLOCK_ID_OFF (35UL)\n #define FD_METRICS_COUNTER_SHRED_INVALID_BLOCK_ID_NAME \"shred_invalid_block_id\"\n #define FD_METRICS_COUNTER_SHRED_INVALID_BLOCK_ID_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_INVALID_BLOCK_ID_DESC \"The number of times a block was created with unknown parent block_id\"\n #define FD_METRICS_COUNTER_SHRED_INVALID_BLOCK_ID_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_OFF (35UL)\n+#define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_OFF (36UL)\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_NAME \"shred_batch_sz\"\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_DESC \"The size (in bytes) of each microblock batch that is shredded\"\n@@ -31,7 +31,7 @@\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_MIN (1024UL)\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_SZ_MAX (65536UL)\n \n-#define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_OFF (52UL)\n+#define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_OFF (53UL)\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_NAME \"shred_batch_microblock_cnt\"\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_DESC \"The number of microblocks in each microblock batch that is shredded\"\n@@ -39,7 +39,7 @@\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_MIN (2UL)\n #define FD_METRICS_HISTOGRAM_SHRED_BATCH_MICROBLOCK_CNT_MAX (256UL)\n \n-#define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_OFF (69UL)\n+#define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_OFF (70UL)\n #define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_NAME \"shred_shredding_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_DESC \"Duration of producing one FEC set from the shredder\"\n@@ -47,7 +47,7 @@\n #define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_MIN (1e-05)\n #define FD_METRICS_HISTOGRAM_SHRED_SHREDDING_DURATION_SECONDS_MAX (0.01)\n \n-#define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_OFF (86UL)\n+#define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_OFF (87UL)\n #define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_NAME \"shred_add_shred_duration_seconds\"\n #define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n #define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_DESC \"Duration of verifying and processing one shred received from the network\"\n@@ -55,57 +55,57 @@\n #define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_MIN (1e-08)\n #define FD_METRICS_HISTOGRAM_SHRED_ADD_SHRED_DURATION_SECONDS_MAX (0.001)\n \n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_OFF (103UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_OFF (104UL)\n #define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_NAME \"shred_shred_processed\"\n #define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_DESC \"The result of processing a thread from the network\"\n #define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_CNT (6UL)\n \n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_BAD_SLOT_OFF (103UL)\n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_PARSE_FAILED_OFF (104UL)\n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_REJECTED_OFF (105UL)\n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_IGNORED_OFF (106UL)\n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_OKAY_OFF (107UL)\n-#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_COMPLETES_OFF (108UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_BAD_SLOT_OFF (104UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_PARSE_FAILED_OFF (105UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_REJECTED_OFF (106UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_IGNORED_OFF (107UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_OKAY_OFF (108UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_PROCESSED_COMPLETES_OFF (109UL)\n \n-#define FD_METRICS_COUNTER_SHRED_FEC_SET_SPILLED_OFF (109UL)\n+#define FD_METRICS_COUNTER_SHRED_FEC_SET_SPILLED_OFF (110UL)\n #define FD_METRICS_COUNTER_SHRED_FEC_SET_SPILLED_NAME \"shred_fec_set_spilled\"\n #define FD_METRICS_COUNTER_SHRED_FEC_SET_SPILLED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_FEC_SET_SPILLED_DESC \"The number of FEC sets that were spilled because they didn't complete in time and we needed space\"\n #define FD_METRICS_COUNTER_SHRED_FEC_SET_SPILLED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_INITIAL_OFF (110UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_INITIAL_OFF (111UL)\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_INITIAL_NAME \"shred_shred_rejected_initial\"\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_INITIAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_INITIAL_DESC \"The number of shreds that were rejected before any resources were allocated for the FEC set\"\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_INITIAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_UNCHAINED_OFF (111UL)\n+#define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_UNCHAINED_OFF (112UL)\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_UNCHAINED_NAME \"shred_shred_rejected_unchained\"\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_UNCHAINED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_UNCHAINED_DESC \"The number of shreds that were rejected because they're not chained merkle shreds\"\n #define FD_METRICS_COUNTER_SHRED_SHRED_REJECTED_UNCHAINED_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_FEC_REJECTED_FATAL_OFF (112UL)\n+#define FD_METRICS_COUNTER_SHRED_FEC_REJECTED_FATAL_OFF (113UL)\n #define FD_METRICS_COUNTER_SHRED_FEC_REJECTED_FATAL_NAME \"shred_fec_rejected_fatal\"\n #define FD_METRICS_COUNTER_SHRED_FEC_REJECTED_FATAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_FEC_REJECTED_FATAL_DESC \"The number of FEC sets that were rejected for reasons that cause the whole FEC set to become invalid\"\n #define FD_METRICS_COUNTER_SHRED_FEC_REJECTED_FATAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_REQUEST_OFF (113UL)\n+#define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_REQUEST_OFF (114UL)\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_REQUEST_NAME \"shred_force_complete_request\"\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_REQUEST_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_REQUEST_DESC \"The number of times we received a FEC force complete message\"\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_REQUEST_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_FAILURE_OFF (114UL)\n+#define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_FAILURE_OFF (115UL)\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_FAILURE_NAME \"shred_force_complete_failure\"\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_FAILURE_DESC \"The number of times we failed to force complete a FEC set on request\"\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_SUCCESS_OFF (115UL)\n+#define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_SUCCESS_OFF (116UL)\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_SUCCESS_NAME \"shred_force_complete_success\"\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_SUCCESS_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SHRED_FORCE_COMPLETE_SUCCESS_DESC \"The number of times we successfully forced completed a FEC set on request\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_sign.h b/src/disco/metrics/generated/fd_metrics_sign.h\nnew file mode 100644\nindex 0000000000..42a0151c57\n--- /dev/null\n+++ b/src/disco/metrics/generated/fd_metrics_sign.h\n@@ -0,0 +1,15 @@\n+/* THIS FILE IS GENERATED BY gen_metrics.py. DO NOT HAND EDIT. */\n+\n+#include \"../fd_metrics_base.h\"\n+#include \"fd_metrics_enums.h\"\n+\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_OFF (17UL)\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_NAME \"sign_sign_duration_seconds\"\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_TYPE (FD_METRICS_TYPE_HISTOGRAM)\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_DESC \"Duration of signing a message\"\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_CVT (FD_METRICS_CONVERTER_SECONDS)\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_MIN (1e-08)\n+#define FD_METRICS_HISTOGRAM_SIGN_SIGN_DURATION_SECONDS_MAX (0.001)\n+\n+#define FD_METRICS_SIGN_TOTAL (1UL)\n+extern const fd_metrics_meta_t FD_METRICS_SIGN[FD_METRICS_SIGN_TOTAL];\ndiff --git a/src/disco/metrics/generated/fd_metrics_snapdc.h b/src/disco/metrics/generated/fd_metrics_snapdc.h\nindex 315bc31bd8..0af4b51574 100644\n--- a/src/disco/metrics/generated/fd_metrics_snapdc.h\n+++ b/src/disco/metrics/generated/fd_metrics_snapdc.h\n@@ -3,31 +3,31 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_SNAPDC_STATE_OFF (16UL)\n+#define FD_METRICS_GAUGE_SNAPDC_STATE_OFF (17UL)\n #define FD_METRICS_GAUGE_SNAPDC_STATE_NAME \"snapdc_state\"\n #define FD_METRICS_GAUGE_SNAPDC_STATE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPDC_STATE_DESC \"State of the tile. 0 = waiting for compressed byte stream, 1 = decompressing full snapshot, 2 = decompressing incremental snapshot, 3 = done.\"\n #define FD_METRICS_GAUGE_SNAPDC_STATE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPDC_FULL_COMPRESSED_BYTES_READ_OFF (17UL)\n+#define FD_METRICS_GAUGE_SNAPDC_FULL_COMPRESSED_BYTES_READ_OFF (18UL)\n #define FD_METRICS_GAUGE_SNAPDC_FULL_COMPRESSED_BYTES_READ_NAME \"snapdc_full_compressed_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPDC_FULL_COMPRESSED_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPDC_FULL_COMPRESSED_BYTES_READ_DESC \"Number of bytes read so far from the compressed full snapshot file. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPDC_FULL_COMPRESSED_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPDC_FULL_DECOMPRESSED_BYTES_READ_OFF (18UL)\n+#define FD_METRICS_GAUGE_SNAPDC_FULL_DECOMPRESSED_BYTES_READ_OFF (19UL)\n #define FD_METRICS_GAUGE_SNAPDC_FULL_DECOMPRESSED_BYTES_READ_NAME \"snapdc_full_decompressed_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPDC_FULL_DECOMPRESSED_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPDC_FULL_DECOMPRESSED_BYTES_READ_DESC \"Number of bytes read so far from the decompressed file. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPDC_FULL_DECOMPRESSED_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_COMPRESSED_BYTES_READ_OFF (19UL)\n+#define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_COMPRESSED_BYTES_READ_OFF (20UL)\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_COMPRESSED_BYTES_READ_NAME \"snapdc_incremental_compressed_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_COMPRESSED_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_COMPRESSED_BYTES_READ_DESC \"Number of bytes read so far from the compressed incremental snapshot file. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_COMPRESSED_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_DECOMPRESSED_BYTES_READ_OFF (20UL)\n+#define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_DECOMPRESSED_BYTES_READ_OFF (21UL)\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_DECOMPRESSED_BYTES_READ_NAME \"snapdc_incremental_decompressed_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_DECOMPRESSED_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPDC_INCREMENTAL_DECOMPRESSED_BYTES_READ_DESC \"Number of bytes read so far from the decompressed incremental snapshot file. Might decrease if snapshot load is aborted and restarted\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_snapin.h b/src/disco/metrics/generated/fd_metrics_snapin.h\nindex 80b6c66025..0148c64a4a 100644\n--- a/src/disco/metrics/generated/fd_metrics_snapin.h\n+++ b/src/disco/metrics/generated/fd_metrics_snapin.h\n@@ -3,25 +3,25 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_SNAPIN_STATE_OFF (16UL)\n+#define FD_METRICS_GAUGE_SNAPIN_STATE_OFF (17UL)\n #define FD_METRICS_GAUGE_SNAPIN_STATE_NAME \"snapin_state\"\n #define FD_METRICS_GAUGE_SNAPIN_STATE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPIN_STATE_DESC \"State of the tile. 0 = waiting for decompressed snapshot bytestream, 1 = processing full snapshot, 2 = processing incremental snapshot, 3 = done.\"\n #define FD_METRICS_GAUGE_SNAPIN_STATE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPIN_FULL_BYTES_READ_OFF (17UL)\n+#define FD_METRICS_GAUGE_SNAPIN_FULL_BYTES_READ_OFF (18UL)\n #define FD_METRICS_GAUGE_SNAPIN_FULL_BYTES_READ_NAME \"snapin_full_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPIN_FULL_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPIN_FULL_BYTES_READ_DESC \"Number of bytes read so far from the full snapshot. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPIN_FULL_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPIN_INCREMENTAL_BYTES_READ_OFF (18UL)\n+#define FD_METRICS_GAUGE_SNAPIN_INCREMENTAL_BYTES_READ_OFF (19UL)\n #define FD_METRICS_GAUGE_SNAPIN_INCREMENTAL_BYTES_READ_NAME \"snapin_incremental_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPIN_INCREMENTAL_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPIN_INCREMENTAL_BYTES_READ_DESC \"Number of bytes read so far from the incremental snapshot. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPIN_INCREMENTAL_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPIN_ACCOUNTS_INSERTED_OFF (19UL)\n+#define FD_METRICS_GAUGE_SNAPIN_ACCOUNTS_INSERTED_OFF (20UL)\n #define FD_METRICS_GAUGE_SNAPIN_ACCOUNTS_INSERTED_NAME \"snapin_accounts_inserted\"\n #define FD_METRICS_GAUGE_SNAPIN_ACCOUNTS_INSERTED_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPIN_ACCOUNTS_INSERTED_DESC \"Number of accounts inserted during snpashot loading. Might decrease if snapshot load is aborted and restarted\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_snaprd.h b/src/disco/metrics/generated/fd_metrics_snaprd.h\nindex 95bab8ab66..3bf569d2f8 100644\n--- a/src/disco/metrics/generated/fd_metrics_snaprd.h\n+++ b/src/disco/metrics/generated/fd_metrics_snaprd.h\n@@ -3,67 +3,67 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_SNAPRD_STATE_OFF (16UL)\n+#define FD_METRICS_GAUGE_SNAPRD_STATE_OFF (17UL)\n #define FD_METRICS_GAUGE_SNAPRD_STATE_NAME \"snaprd_state\"\n #define FD_METRICS_GAUGE_SNAPRD_STATE_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_STATE_DESC \"State of the tile. 0 = waiting for at least one peer from gossip, 1 = collecting peers from gossip, 2 = pinging peers, 3 = collecting ping responses, 4 = reading full snapshot file, 5 = reading incremental snapshot file, 6 = downloading full snapshot file, 7 = downloading incremental snapshot file, 8 = pinging peers before loading the incremental snapshot, 0 = collecting ping responses before loading the incremental snapshot, 10 = waiting for full snapshot to finish loading, 11 = waiting for incremental snapshot to finish loading, 12 = done.\"\n #define FD_METRICS_GAUGE_SNAPRD_STATE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SNAPRD_FULL_NUM_RETRIES_OFF (17UL)\n+#define FD_METRICS_COUNTER_SNAPRD_FULL_NUM_RETRIES_OFF (18UL)\n #define FD_METRICS_COUNTER_SNAPRD_FULL_NUM_RETRIES_NAME \"snaprd_full_num_retries\"\n #define FD_METRICS_COUNTER_SNAPRD_FULL_NUM_RETRIES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SNAPRD_FULL_NUM_RETRIES_DESC \"Number of times we aborted and retried full snapshot download because the peer was too slow\"\n #define FD_METRICS_COUNTER_SNAPRD_FULL_NUM_RETRIES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SNAPRD_INCREMENTAL_NUM_RETRIES_OFF (18UL)\n+#define FD_METRICS_COUNTER_SNAPRD_INCREMENTAL_NUM_RETRIES_OFF (19UL)\n #define FD_METRICS_COUNTER_SNAPRD_INCREMENTAL_NUM_RETRIES_NAME \"snaprd_incremental_num_retries\"\n #define FD_METRICS_COUNTER_SNAPRD_INCREMENTAL_NUM_RETRIES_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SNAPRD_INCREMENTAL_NUM_RETRIES_DESC \"Number of times we aborted and retried incremental snapshot download because the peer was too slow\"\n #define FD_METRICS_COUNTER_SNAPRD_INCREMENTAL_NUM_RETRIES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_READ_OFF (19UL)\n+#define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_READ_OFF (20UL)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_READ_NAME \"snaprd_full_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_READ_DESC \"Number of bytes read so far from the full snapshot. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_WRITTEN_OFF (20UL)\n+#define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_WRITTEN_OFF (21UL)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_WRITTEN_NAME \"snaprd_full_bytes_written\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_WRITTEN_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_WRITTEN_DESC \"Number of bytes written so far from the full snapshot. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_WRITTEN_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_TOTAL_OFF (21UL)\n+#define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_TOTAL_OFF (22UL)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_TOTAL_NAME \"snaprd_full_bytes_total\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_TOTAL_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_TOTAL_DESC \"Total size of the full snapshot file. Might change if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_BYTES_TOTAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_FULL_DOWNLOAD_RETRIES_OFF (22UL)\n+#define FD_METRICS_GAUGE_SNAPRD_FULL_DOWNLOAD_RETRIES_OFF (23UL)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_DOWNLOAD_RETRIES_NAME \"snaprd_full_download_retries\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_DOWNLOAD_RETRIES_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_FULL_DOWNLOAD_RETRIES_DESC \"Number of times we retried the full snapshot download because the peer was too slow\"\n #define FD_METRICS_GAUGE_SNAPRD_FULL_DOWNLOAD_RETRIES_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_READ_OFF (23UL)\n+#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_READ_OFF (24UL)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_READ_NAME \"snaprd_incremental_bytes_read\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_READ_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_READ_DESC \"Number of bytes read so far from the incremental snapshot. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_READ_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_WRITTEN_OFF (24UL)\n+#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_WRITTEN_OFF (25UL)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_WRITTEN_NAME \"snaprd_incremental_bytes_written\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_WRITTEN_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_WRITTEN_DESC \"Number of bytes written so far from the incremental snapshot. Might decrease if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_WRITTEN_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_TOTAL_OFF (25UL)\n+#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_TOTAL_OFF (26UL)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_TOTAL_NAME \"snaprd_incremental_bytes_total\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_TOTAL_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_TOTAL_DESC \"Total size of the incremental snapshot file. Might change if snapshot load is aborted and restarted\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_BYTES_TOTAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_DOWNLOAD_RETRIES_OFF (26UL)\n+#define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_DOWNLOAD_RETRIES_OFF (27UL)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_DOWNLOAD_RETRIES_NAME \"snaprd_incremental_download_retries\"\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_DOWNLOAD_RETRIES_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_SNAPRD_INCREMENTAL_DOWNLOAD_RETRIES_DESC \"Number of times we retried the incremental snapshot download because the peer was too slow\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_sock.h b/src/disco/metrics/generated/fd_metrics_sock.h\nindex 5456794ce2..dedaa01928 100644\n--- a/src/disco/metrics/generated/fd_metrics_sock.h\n+++ b/src/disco/metrics/generated/fd_metrics_sock.h\n@@ -3,51 +3,51 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_OFF (16UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_OFF (17UL)\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_NAME \"sock_syscalls_sendmmsg\"\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_DESC \"Number of sendmmsg syscalls dispatched\"\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_CVT (FD_METRICS_CONVERTER_NONE)\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_CNT (6UL)\n \n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_NO_ERROR_OFF (16UL)\n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_SLOW_OFF (17UL)\n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_PERM_OFF (18UL)\n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_UNREACH_OFF (19UL)\n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_DOWN_OFF (20UL)\n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_OTHER_OFF (21UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_NO_ERROR_OFF (17UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_SLOW_OFF (18UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_PERM_OFF (19UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_UNREACH_OFF (20UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_DOWN_OFF (21UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_SENDMMSG_OTHER_OFF (22UL)\n \n-#define FD_METRICS_COUNTER_SOCK_SYSCALLS_RECVMMSG_OFF (22UL)\n+#define FD_METRICS_COUNTER_SOCK_SYSCALLS_RECVMMSG_OFF (23UL)\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_RECVMMSG_NAME \"sock_syscalls_recvmmsg\"\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_RECVMMSG_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_RECVMMSG_DESC \"Number of recvmsg syscalls dispatched\"\n #define FD_METRICS_COUNTER_SOCK_SYSCALLS_RECVMMSG_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SOCK_RX_PKT_CNT_OFF (23UL)\n+#define FD_METRICS_COUNTER_SOCK_RX_PKT_CNT_OFF (24UL)\n #define FD_METRICS_COUNTER_SOCK_RX_PKT_CNT_NAME \"sock_rx_pkt_cnt\"\n #define FD_METRICS_COUNTER_SOCK_RX_PKT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_RX_PKT_CNT_DESC \"Number of packets received\"\n #define FD_METRICS_COUNTER_SOCK_RX_PKT_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SOCK_TX_PKT_CNT_OFF (24UL)\n+#define FD_METRICS_COUNTER_SOCK_TX_PKT_CNT_OFF (25UL)\n #define FD_METRICS_COUNTER_SOCK_TX_PKT_CNT_NAME \"sock_tx_pkt_cnt\"\n #define FD_METRICS_COUNTER_SOCK_TX_PKT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_TX_PKT_CNT_DESC \"Number of packets sent\"\n #define FD_METRICS_COUNTER_SOCK_TX_PKT_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SOCK_TX_DROP_CNT_OFF (25UL)\n+#define FD_METRICS_COUNTER_SOCK_TX_DROP_CNT_OFF (26UL)\n #define FD_METRICS_COUNTER_SOCK_TX_DROP_CNT_NAME \"sock_tx_drop_cnt\"\n #define FD_METRICS_COUNTER_SOCK_TX_DROP_CNT_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_TX_DROP_CNT_DESC \"Number of packets failed to send\"\n #define FD_METRICS_COUNTER_SOCK_TX_DROP_CNT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SOCK_TX_BYTES_TOTAL_OFF (26UL)\n+#define FD_METRICS_COUNTER_SOCK_TX_BYTES_TOTAL_OFF (27UL)\n #define FD_METRICS_COUNTER_SOCK_TX_BYTES_TOTAL_NAME \"sock_tx_bytes_total\"\n #define FD_METRICS_COUNTER_SOCK_TX_BYTES_TOTAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_TX_BYTES_TOTAL_DESC \"Total number of bytes transmitted (including Ethernet header).\"\n #define FD_METRICS_COUNTER_SOCK_TX_BYTES_TOTAL_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_SOCK_RX_BYTES_TOTAL_OFF (27UL)\n+#define FD_METRICS_COUNTER_SOCK_RX_BYTES_TOTAL_OFF (28UL)\n #define FD_METRICS_COUNTER_SOCK_RX_BYTES_TOTAL_NAME \"sock_rx_bytes_total\"\n #define FD_METRICS_COUNTER_SOCK_RX_BYTES_TOTAL_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_SOCK_RX_BYTES_TOTAL_DESC \"Total number of bytes received (including Ethernet header).\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_store.h b/src/disco/metrics/generated/fd_metrics_store.h\nindex fa21047dad..ff2a4b18b2 100644\n--- a/src/disco/metrics/generated/fd_metrics_store.h\n+++ b/src/disco/metrics/generated/fd_metrics_store.h\n@@ -3,7 +3,7 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_STORE_TRANSACTIONS_INSERTED_OFF (16UL)\n+#define FD_METRICS_COUNTER_STORE_TRANSACTIONS_INSERTED_OFF (17UL)\n #define FD_METRICS_COUNTER_STORE_TRANSACTIONS_INSERTED_NAME \"store_transactions_inserted\"\n #define FD_METRICS_COUNTER_STORE_TRANSACTIONS_INSERTED_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_STORE_TRANSACTIONS_INSERTED_DESC \"Count of transactions produced while we were leader in the shreds that have been inserted so far\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_storei.h b/src/disco/metrics/generated/fd_metrics_storei.h\nindex 1f26e317ab..e333562efd 100644\n--- a/src/disco/metrics/generated/fd_metrics_storei.h\n+++ b/src/disco/metrics/generated/fd_metrics_storei.h\n@@ -3,13 +3,13 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_GAUGE_STOREI_FIRST_TURBINE_SLOT_OFF (16UL)\n+#define FD_METRICS_GAUGE_STOREI_FIRST_TURBINE_SLOT_OFF (17UL)\n #define FD_METRICS_GAUGE_STOREI_FIRST_TURBINE_SLOT_NAME \"storei_first_turbine_slot\"\n #define FD_METRICS_GAUGE_STOREI_FIRST_TURBINE_SLOT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_STOREI_FIRST_TURBINE_SLOT_DESC \"\"\n #define FD_METRICS_GAUGE_STOREI_FIRST_TURBINE_SLOT_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_GAUGE_STOREI_CURRENT_TURBINE_SLOT_OFF (17UL)\n+#define FD_METRICS_GAUGE_STOREI_CURRENT_TURBINE_SLOT_OFF (18UL)\n #define FD_METRICS_GAUGE_STOREI_CURRENT_TURBINE_SLOT_NAME \"storei_current_turbine_slot\"\n #define FD_METRICS_GAUGE_STOREI_CURRENT_TURBINE_SLOT_TYPE (FD_METRICS_TYPE_GAUGE)\n #define FD_METRICS_GAUGE_STOREI_CURRENT_TURBINE_SLOT_DESC \"\"\ndiff --git a/src/disco/metrics/generated/fd_metrics_verify.h b/src/disco/metrics/generated/fd_metrics_verify.h\nindex cfe911fd19..c576823af0 100644\n--- a/src/disco/metrics/generated/fd_metrics_verify.h\n+++ b/src/disco/metrics/generated/fd_metrics_verify.h\n@@ -3,25 +3,25 @@\n #include \"../fd_metrics_base.h\"\n #include \"fd_metrics_enums.h\"\n \n-#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_BUNDLE_PEER_FAILURE_OFF (16UL)\n+#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_BUNDLE_PEER_FAILURE_OFF (17UL)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_BUNDLE_PEER_FAILURE_NAME \"verify_transaction_bundle_peer_failure\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_BUNDLE_PEER_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_BUNDLE_PEER_FAILURE_DESC \"Count of transactions that failed to verify because a peer transaction in the bundle failed\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_BUNDLE_PEER_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_PARSE_FAILURE_OFF (17UL)\n+#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_PARSE_FAILURE_OFF (18UL)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_PARSE_FAILURE_NAME \"verify_transaction_parse_failure\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_PARSE_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_PARSE_FAILURE_DESC \"Count of transactions that failed to parse\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_PARSE_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_DEDUP_FAILURE_OFF (18UL)\n+#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_DEDUP_FAILURE_OFF (19UL)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_DEDUP_FAILURE_NAME \"verify_transaction_dedup_failure\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_DEDUP_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_DEDUP_FAILURE_DESC \"Count of transactions that failed to deduplicate in the verify stage\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_DEDUP_FAILURE_CVT (FD_METRICS_CONVERTER_NONE)\n \n-#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_VERIFY_FAILURE_OFF (19UL)\n+#define FD_METRICS_COUNTER_VERIFY_TRANSACTION_VERIFY_FAILURE_OFF (20UL)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_VERIFY_FAILURE_NAME \"verify_transaction_verify_failure\"\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_VERIFY_FAILURE_TYPE (FD_METRICS_TYPE_COUNTER)\n #define FD_METRICS_COUNTER_VERIFY_TRANSACTION_VERIFY_FAILURE_DESC \"Count of transactions that failed to deduplicate in the verify stage\"\ndiff --git a/src/disco/metrics/metrics.xml b/src/disco/metrics/metrics.xml\nindex 7997eb311f..0c1a36e05d 100644\n--- a/src/disco/metrics/metrics.xml\n+++ b/src/disco/metrics/metrics.xml\n@@ -37,6 +37,8 @@ metric introduced.\n \n <int value=\"6\" name=\"CaughtUpPostfrag\" label=\"Caught up + Postfrag\" />\n <int value=\"7\" name=\"ProcessingPostfrag\" label=\"Processing + Postfrag\" />\n+\n+ <int value=\"8\" name=\"Sleeping\" label=\"Sleeping\" />\n </enum>\n \n <common>\ndiff --git a/src/disco/net/sock/generated/sock_seccomp.h b/src/disco/net/sock/generated/sock_seccomp.h\nindex 068abcc6b3..2bc83c928c 100644\n--- a/src/disco/net/sock/generated/sock_seccomp.h\n+++ b/src/disco/net/sock/generated/sock_seccomp.h\n@@ -21,76 +21,88 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_sock_instr_cnt = 35;\n+static const unsigned int sock_filter_policy_sock_instr_cnt = 41;\n \n static void populate_sock_filter_policy_sock( ulong out_cnt, struct sock_filter * out, uint logfile_fd, uint tx_fd, uint rx_fd0, uint rx_fd1) {\n- FD_TEST( out_cnt >= 35 );\n- struct sock_filter filter[35] = {\n+ FD_TEST( out_cnt >= 41 );\n+ struct sock_filter filter[41] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 31 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 37 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow poll based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_poll, /* check_poll */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_poll, /* check_poll */ 7, 0 ),\n /* allow recvmmsg based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_recvmmsg, /* check_recvmmsg */ 6, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_recvmmsg, /* check_recvmmsg */ 8, 0 ),\n /* allow sendmmsg based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendmmsg, /* check_sendmmsg */ 15, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendmmsg, /* check_sendmmsg */ 17, 0 ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 20, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 22, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 23, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 25, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 26, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 30, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 24 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 28 },\n // check_poll:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 23, /* RET_KILL_PROCESS */ 22 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 27, /* RET_KILL_PROCESS */ 26 ),\n // check_recvmmsg:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JGE | BPF_K, rx_fd0, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 20 ),\n+ BPF_JUMP( BPF_JMP | BPF_JGE | BPF_K, rx_fd0, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 24 ),\n // lbl_2:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JGE | BPF_K, rx_fd1, /* RET_KILL_PROCESS */ 18, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JGE | BPF_K, rx_fd1, /* RET_KILL_PROCESS */ 22, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JGT | BPF_K, 64, /* RET_KILL_PROCESS */ 16, /* lbl_3 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JGT | BPF_K, 64, /* RET_KILL_PROCESS */ 20, /* lbl_3 */ 0 ),\n // lbl_3:\n /* load syscall argument 3 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[3])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 14 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 18 ),\n // lbl_4:\n /* load syscall argument 4 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[4])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 13, /* RET_KILL_PROCESS */ 12 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 17, /* RET_KILL_PROCESS */ 16 ),\n // check_sendmmsg:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, tx_fd, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, tx_fd, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 14 ),\n // lbl_5:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JGT | BPF_K, 64, /* RET_KILL_PROCESS */ 8, /* lbl_6 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JGT | BPF_K, 64, /* RET_KILL_PROCESS */ 12, /* lbl_6 */ 0 ),\n // lbl_6:\n /* load syscall argument 3 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[3])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* RET_ALLOW */ 11, /* RET_KILL_PROCESS */ 10 ),\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_7 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_7 */ 0 ),\n // lbl_7:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_8 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_8:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/net/sock/sock.seccomppolicy b/src/disco/net/sock/sock.seccomppolicy\nindex c3a9afb7dd..5f2d87363c 100644\n--- a/src/disco/net/sock/sock.seccomppolicy\n+++ b/src/disco/net/sock/sock.seccomppolicy\n@@ -32,3 +32,19 @@ write: (or (eq (arg 0) 2)\n # arg 0 is the file descriptor to fsync. The boot process ensures that\n # descriptor 3 is always the logfile.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/net/xdp/generated/xdp_seccomp.h b/src/disco/net/xdp/generated/xdp_seccomp.h\nindex 36d8ac50ea..211ef51e11 100644\n--- a/src/disco/net/xdp/generated/xdp_seccomp.h\n+++ b/src/disco/net/xdp/generated/xdp_seccomp.h\n@@ -21,40 +21,44 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_xdp_instr_cnt = 45;\n+static const unsigned int sock_filter_policy_xdp_instr_cnt = 51;\n \n static void populate_sock_filter_policy_xdp( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd, unsigned int xsk_fd, unsigned int lo_xsk_fd) {\n- FD_TEST( out_cnt >= 45 );\n- struct sock_filter filter[45] = {\n+ FD_TEST( out_cnt >= 51 );\n+ struct sock_filter filter[51] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 41 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 47 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 7, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 8, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 10, 0 ),\n /* allow sendto based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendto, /* check_sendto */ 9, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sendto, /* check_sendto */ 11, 0 ),\n /* allow recvmsg based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_recvmsg, /* check_recvmsg */ 22, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_recvmsg, /* check_recvmsg */ 24, 0 ),\n /* allow getsockopt based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getsockopt, /* check_getsockopt */ 27, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getsockopt, /* check_getsockopt */ 29, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 36, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 40, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 34 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 38 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 33, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 37, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 31, /* RET_KILL_PROCESS */ 30 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 35, /* RET_KILL_PROCESS */ 34 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 29, /* RET_KILL_PROCESS */ 28 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 33, /* RET_KILL_PROCESS */ 32 ),\n // check_sendto:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n@@ -62,27 +66,27 @@ static void populate_sock_filter_policy_xdp( ulong out_cnt, struct sock_filter *\n // lbl_3:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, lo_xsk_fd, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 24 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, lo_xsk_fd, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 28 ),\n // lbl_2:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 22 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_4 */ 0, /* RET_KILL_PROCESS */ 26 ),\n // lbl_4:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 20 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_5 */ 0, /* RET_KILL_PROCESS */ 24 ),\n // lbl_5:\n /* load syscall argument 3 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[3])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* lbl_6 */ 0, /* RET_KILL_PROCESS */ 18 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* lbl_6 */ 0, /* RET_KILL_PROCESS */ 22 ),\n // lbl_6:\n /* load syscall argument 4 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[4])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_7 */ 0, /* RET_KILL_PROCESS */ 16 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* lbl_7 */ 0, /* RET_KILL_PROCESS */ 20 ),\n // lbl_7:\n /* load syscall argument 5 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[5])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 15, /* RET_KILL_PROCESS */ 14 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 19, /* RET_KILL_PROCESS */ 18 ),\n // check_recvmsg:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n@@ -90,11 +94,11 @@ static void populate_sock_filter_policy_xdp( ulong out_cnt, struct sock_filter *\n // lbl_9:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, lo_xsk_fd, /* lbl_8 */ 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, lo_xsk_fd, /* lbl_8 */ 0, /* RET_KILL_PROCESS */ 14 ),\n // lbl_8:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* RET_ALLOW */ 9, /* RET_KILL_PROCESS */ 8 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, MSG_DONTWAIT, /* RET_ALLOW */ 13, /* RET_KILL_PROCESS */ 12 ),\n // check_getsockopt:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n@@ -102,15 +106,23 @@ static void populate_sock_filter_policy_xdp( ulong out_cnt, struct sock_filter *\n // lbl_11:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, lo_xsk_fd, /* lbl_10 */ 0, /* RET_KILL_PROCESS */ 4 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, lo_xsk_fd, /* lbl_10 */ 0, /* RET_KILL_PROCESS */ 8 ),\n // lbl_10:\n /* load syscall argument 1 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SOL_XDP, /* lbl_12 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SOL_XDP, /* lbl_12 */ 0, /* RET_KILL_PROCESS */ 6 ),\n // lbl_12:\n /* load syscall argument 2 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[2])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, XDP_STATISTICS, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, XDP_STATISTICS, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_13 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_13:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/net/xdp/xdp.seccomppolicy b/src/disco/net/xdp/xdp.seccomppolicy\nindex e4622dc139..8120b8fc1a 100644\n--- a/src/disco/net/xdp/xdp.seccomppolicy\n+++ b/src/disco/net/xdp/xdp.seccomppolicy\n@@ -67,3 +67,19 @@ getsockopt: (and (or (eq (arg 0) xsk_fd)\n (eq (arg 0) lo_xsk_fd))\n (eq (arg 1) SOL_XDP)\n (eq (arg 2) XDP_STATISTICS))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/netlink/fd_netlink_tile.c b/src/disco/netlink/fd_netlink_tile.c\nindex c765a0fbbc..5f0d578fc0 100644\n--- a/src/disco/netlink/fd_netlink_tile.c\n+++ b/src/disco/netlink/fd_netlink_tile.c\n@@ -414,6 +414,7 @@ after_frag( fd_netlink_tile_ctx_t * ctx,\n \n #define STEM_BURST (1UL)\n #define STEM_LAZY ((ulong)13e6) /* 13ms */\n+#define STEM_IDLE_SLEEP_ENABLED 0\n \n #define STEM_CALLBACK_CONTEXT_TYPE fd_netlink_tile_ctx_t\n #define STEM_CALLBACK_CONTEXT_ALIGN alignof(fd_netlink_tile_ctx_t)\ndiff --git a/src/disco/pack/fd_pack_tile.c b/src/disco/pack/fd_pack_tile.c\nindex 2cce656b85..00cc504c43 100644\n--- a/src/disco/pack/fd_pack_tile.c\n+++ b/src/disco/pack/fd_pack_tile.c\n@@ -693,7 +693,7 @@ after_credit( fd_pack_ctx_t * ctx,\n break;\n case FD_PACK_STRATEGY_BUNDLE:\n flags = FD_PACK_SCHEDULE_VOTE | FD_PACK_SCHEDULE_BUNDLE\n- | fd_int_if( ctx->slot_end_ns - ctx->approx_wallclock_ns<50000000L, FD_PACK_SCHEDULE_TXN, 0 );\n+ | fd_int_if( ctx->slot_end_ns - ctx->approx_wallclock_ns<100000000L, FD_PACK_SCHEDULE_TXN, 0 );\n break;\n }\n \ndiff --git a/src/disco/pack/fd_pack_tile.seccomppolicy b/src/disco/pack/fd_pack_tile.seccomppolicy\nindex efb7dec4f4..e7062f5651 100644\n--- a/src/disco/pack/fd_pack_tile.seccomppolicy\n+++ b/src/disco/pack/fd_pack_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/pack/generated/fd_pack_tile_seccomp.h b/src/disco/pack/generated/fd_pack_tile_seccomp.h\nindex 83a86c8e32..c2c7bcc45a 100644\n--- a/src/disco/pack/generated/fd_pack_tile_seccomp.h\n+++ b/src/disco/pack/generated/fd_pack_tile_seccomp.h\n@@ -21,34 +21,46 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_pack_tile_instr_cnt = 14;\n+static const unsigned int sock_filter_policy_fd_pack_tile_instr_cnt = 20;\n \n static void populate_sock_filter_policy_fd_pack_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd) {\n- FD_TEST( out_cnt >= 14 );\n- struct sock_filter filter[14] = {\n+ FD_TEST( out_cnt >= 20 );\n+ struct sock_filter filter[20] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 16 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 2, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 4, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 7, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 8, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 12, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 6 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 10 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_2:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/plugin/fd_plugin_tile.seccomppolicy b/src/disco/plugin/fd_plugin_tile.seccomppolicy\nindex a5880d7c08..adcf27ca3f 100644\n--- a/src/disco/plugin/fd_plugin_tile.seccomppolicy\n+++ b/src/disco/plugin/fd_plugin_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/plugin/generated/fd_plugin_tile_seccomp.h b/src/disco/plugin/generated/fd_plugin_tile_seccomp.h\nindex c67ab8aa13..d89d2b037e 100644\n--- a/src/disco/plugin/generated/fd_plugin_tile_seccomp.h\n+++ b/src/disco/plugin/generated/fd_plugin_tile_seccomp.h\n@@ -21,34 +21,46 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_plugin_tile_instr_cnt = 14;\n+static const unsigned int sock_filter_policy_fd_plugin_tile_instr_cnt = 20;\n \n static void populate_sock_filter_policy_fd_plugin_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd) {\n- FD_TEST( out_cnt >= 14 );\n- struct sock_filter filter[14] = {\n+ FD_TEST( out_cnt >= 20 );\n+ struct sock_filter filter[20] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 16 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 2, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 4, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 7, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 8, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 12, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 6 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 10 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_2:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/quic/generated/quic_seccomp.h b/src/disco/quic/generated/quic_seccomp.h\nindex ebb5db8fef..53abec58ef 100644\n--- a/src/disco/quic/generated/quic_seccomp.h\n+++ b/src/disco/quic/generated/quic_seccomp.h\n@@ -21,40 +21,52 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_quic_instr_cnt = 17;\n+static const unsigned int sock_filter_policy_quic_instr_cnt = 23;\n \n static void populate_sock_filter_policy_quic( ulong out_cnt, struct sock_filter * out, uint logfile_fd, uint keylog_fd) {\n- FD_TEST( out_cnt >= 17 );\n- struct sock_filter filter[17] = {\n+ FD_TEST( out_cnt >= 23 );\n+ struct sock_filter filter[23] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 13 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 19 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 3, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 5, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 8, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 10, 0 ),\n /* simply allow getrandom */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getrandom, /* RET_ALLOW */ 10, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_getrandom, /* RET_ALLOW */ 16, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 10, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 14, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 8 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 12 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 7, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 11, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* lbl_2 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 9, /* lbl_2 */ 0 ),\n // lbl_2:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, keylog_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, keylog_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_3 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_3:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/quic/quic.seccomppolicy b/src/disco/quic/quic.seccomppolicy\nindex 2f1a9d90dd..0c4eaa7dd5 100644\n--- a/src/disco/quic/quic.seccomppolicy\n+++ b/src/disco/quic/quic.seccomppolicy\n@@ -20,3 +20,19 @@ fsync: (eq (arg 0) logfile_fd)\n \n # QUIC uses getrandom for cryptographically secure randomness.\n getrandom\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/quic/test_quic_metrics.txt b/src/disco/quic/test_quic_metrics.txt\nindex 76627b5dc8..86bdfa27e1 100644\n--- a/src/disco/quic/test_quic_metrics.txt\n+++ b/src/disco/quic/test_quic_metrics.txt\n@@ -1,75 +1,76 @@\n # HELP quic_txns_overrun Count of txns overrun before reassembled (too small txn_reassembly_count).\n # TYPE quic_txns_overrun counter\n-quic_txns_overrun{kind=\"quic\",kind_id=\"0\"} 16\n+quic_txns_overrun{kind=\"quic\",kind_id=\"0\"} 17\n \n # HELP quic_txn_reasms_started Count of fragmented txn receive ops started.\n # TYPE quic_txn_reasms_started counter\n-quic_txn_reasms_started{kind=\"quic\",kind_id=\"0\"} 17\n+quic_txn_reasms_started{kind=\"quic\",kind_id=\"0\"} 18\n \n # HELP quic_txn_reasms_active Number of fragmented txn receive ops currently active.\n # TYPE quic_txn_reasms_active gauge\n-quic_txn_reasms_active{kind=\"quic\",kind_id=\"0\"} 18\n+quic_txn_reasms_active{kind=\"quic\",kind_id=\"0\"} 19\n \n # HELP quic_frags_ok Count of txn frags received\n # TYPE quic_frags_ok counter\n-quic_frags_ok{kind=\"quic\",kind_id=\"0\"} 19\n+quic_frags_ok{kind=\"quic\",kind_id=\"0\"} 20\n \n # HELP quic_frags_gap Count of txn frags dropped due to data gap\n # TYPE quic_frags_gap counter\n-quic_frags_gap{kind=\"quic\",kind_id=\"0\"} 20\n+quic_frags_gap{kind=\"quic\",kind_id=\"0\"} 21\n \n # HELP quic_frags_dup Count of txn frags dropped due to dup (stream already completed)\n # TYPE quic_frags_dup counter\n-quic_frags_dup{kind=\"quic\",kind_id=\"0\"} 21\n+quic_frags_dup{kind=\"quic\",kind_id=\"0\"} 22\n \n # HELP quic_txns_received Count of txns received via TPU.\n # TYPE quic_txns_received counter\n-quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"udp\"} 22\n-quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_fast\"} 23\n-quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_frag\"} 24\n+quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"udp\"} 23\n+quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_fast\"} 24\n+quic_txns_received{kind=\"quic\",kind_id=\"0\",tpu_recv_type=\"quic_frag\"} 25\n \n # HELP quic_txns_abandoned Count of txns abandoned because a conn was lost.\n # TYPE quic_txns_abandoned counter\n-quic_txns_abandoned{kind=\"quic\",kind_id=\"0\"} 25\n+quic_txns_abandoned{kind=\"quic\",kind_id=\"0\"} 26\n \n # HELP quic_txn_undersz Count of txns received via QUIC dropped because they were too small.\n # TYPE quic_txn_undersz counter\n-quic_txn_undersz{kind=\"quic\",kind_id=\"0\"} 26\n+quic_txn_undersz{kind=\"quic\",kind_id=\"0\"} 27\n \n # HELP quic_txn_oversz Count of txns received via QUIC dropped because they were too large.\n # TYPE quic_txn_oversz counter\n-quic_txn_oversz{kind=\"quic\",kind_id=\"0\"} 27\n+quic_txn_oversz{kind=\"quic\",kind_id=\"0\"} 28\n \n # HELP quic_legacy_txn_undersz Count of packets received on the non-QUIC port that were too small to be a valid IP packet.\n # TYPE quic_legacy_txn_undersz counter\n-quic_legacy_txn_undersz{kind=\"quic\",kind_id=\"0\"} 28\n+quic_legacy_txn_undersz{kind=\"quic\",kind_id=\"0\"} 29\n \n # HELP quic_legacy_txn_oversz Count of packets received on the non-QUIC port that were too large to be a valid transaction.\n # TYPE quic_legacy_txn_oversz counter\n-quic_legacy_txn_oversz{kind=\"quic\",kind_id=\"0\"} 29\n+quic_legacy_txn_oversz{kind=\"quic\",kind_id=\"0\"} 30\n \n # HELP quic_received_packets Number of IP packets received.\n # TYPE quic_received_packets counter\n-quic_received_packets{kind=\"quic\",kind_id=\"0\"} 30\n+quic_received_packets{kind=\"quic\",kind_id=\"0\"} 31\n \n # HELP quic_received_bytes Total bytes received (including IP, UDP, QUIC headers).\n # TYPE quic_received_bytes counter\n-quic_received_bytes{kind=\"quic\",kind_id=\"0\"} 31\n+quic_received_bytes{kind=\"quic\",kind_id=\"0\"} 32\n \n # HELP quic_sent_packets Number of IP packets sent.\n # TYPE quic_sent_packets counter\n-quic_sent_packets{kind=\"quic\",kind_id=\"0\"} 32\n+quic_sent_packets{kind=\"quic\",kind_id=\"0\"} 33\n \n # HELP quic_sent_bytes Total bytes sent (including IP, UDP, QUIC headers).\n # TYPE quic_sent_bytes counter\n-quic_sent_bytes{kind=\"quic\",kind_id=\"0\"} 33\n+quic_sent_bytes{kind=\"quic\",kind_id=\"0\"} 34\n \n # HELP quic_connections_alloc The number of currently allocated QUIC connections.\n # TYPE quic_connections_alloc gauge\n-quic_connections_alloc{kind=\"quic\",kind_id=\"0\"} 34\n+quic_connections_alloc{kind=\"quic\",kind_id=\"0\"} 35\n \n # HELP quic_connections_state The number of QUIC connections in each state.\n # TYPE quic_connections_state gauge\n+<<<<<<< HEAD\n quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"invalid\"} 35\n quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake\"} 36\n quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake_complete\"} 37\n@@ -263,3 +264,207 @@ quic_retry_sent{kind=\"quic\",kind_id=\"0\"} 137\n # HELP quic_pkt_retransmissions Number of QUIC packets that retransmitted.\n # TYPE quic_pkt_retransmissions counter\n quic_pkt_retransmissions{kind=\"quic\",kind_id=\"0\"} 138\n+=======\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"invalid\"} 36\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake\"} 37\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"handshake_complete\"} 38\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"active\"} 39\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"peer_close\"} 40\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"abort\"} 41\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"close_pending\"} 42\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"dead\"} 43\n+quic_connections_state{kind=\"quic\",kind_id=\"0\",quic_conn_state=\"timeout\"} 44\n+\n+# HELP quic_connections_created The total number of connections that have been created.\n+# TYPE quic_connections_created counter\n+quic_connections_created{kind=\"quic\",kind_id=\"0\"} 45\n+\n+# HELP quic_connections_closed Number of connections gracefully closed.\n+# TYPE quic_connections_closed counter\n+quic_connections_closed{kind=\"quic\",kind_id=\"0\"} 46\n+\n+# HELP quic_connections_aborted Number of connections aborted.\n+# TYPE quic_connections_aborted counter\n+quic_connections_aborted{kind=\"quic\",kind_id=\"0\"} 47\n+\n+# HELP quic_connections_timed_out Number of connections timed out.\n+# TYPE quic_connections_timed_out counter\n+quic_connections_timed_out{kind=\"quic\",kind_id=\"0\"} 48\n+\n+# HELP quic_connections_timeout_revived Number of connections revived after timing out.\n+# TYPE quic_connections_timeout_revived counter\n+quic_connections_timeout_revived{kind=\"quic\",kind_id=\"0\"} 49\n+\n+# HELP quic_connections_timeout_freed Number of connections freed after timing out.\n+# TYPE quic_connections_timeout_freed counter\n+quic_connections_timeout_freed{kind=\"quic\",kind_id=\"0\"} 50\n+\n+# HELP quic_connections_retried Number of connections established with retry.\n+# TYPE quic_connections_retried counter\n+quic_connections_retried{kind=\"quic\",kind_id=\"0\"} 51\n+\n+# HELP quic_connection_error_no_slots Number of connections that failed to create due to lack of slots.\n+# TYPE quic_connection_error_no_slots counter\n+quic_connection_error_no_slots{kind=\"quic\",kind_id=\"0\"} 52\n+\n+# HELP quic_connection_error_retry_fail Number of connections that failed during retry (e.g. invalid token).\n+# TYPE quic_connection_error_retry_fail counter\n+quic_connection_error_retry_fail{kind=\"quic\",kind_id=\"0\"} 53\n+\n+# HELP quic_pkt_no_conn Number of packets with an unknown connection ID.\n+# TYPE quic_pkt_no_conn counter\n+quic_pkt_no_conn{kind=\"quic\",kind_id=\"0\"} 54\n+\n+# HELP quic_frame_tx_alloc Results of attempts to acquire QUIC frame metadata.\n+# TYPE quic_frame_tx_alloc counter\n+quic_frame_tx_alloc{kind=\"quic\",kind_id=\"0\",frame_tx_alloc_result=\"success\"} 55\n+quic_frame_tx_alloc{kind=\"quic\",kind_id=\"0\",frame_tx_alloc_result=\"fail_empty_pool\"} 56\n+quic_frame_tx_alloc{kind=\"quic\",kind_id=\"0\",frame_tx_alloc_result=\"fail_conn_max\"} 57\n+\n+# HELP quic_initial_token_len Number of Initial packets grouped by token length.\n+# TYPE quic_initial_token_len counter\n+quic_initial_token_len{kind=\"quic\",kind_id=\"0\",quic_initial_token_len=\"zero\"} 58\n+quic_initial_token_len{kind=\"quic\",kind_id=\"0\",quic_initial_token_len=\"fd_quic_len\"} 59\n+quic_initial_token_len{kind=\"quic\",kind_id=\"0\",quic_initial_token_len=\"invalid_len\"} 60\n+\n+# HELP quic_handshakes_created Number of handshake flows created.\n+# TYPE quic_handshakes_created counter\n+quic_handshakes_created{kind=\"quic\",kind_id=\"0\"} 61\n+\n+# HELP quic_handshake_error_alloc_fail Number of handshakes dropped due to alloc fail.\n+# TYPE quic_handshake_error_alloc_fail counter\n+quic_handshake_error_alloc_fail{kind=\"quic\",kind_id=\"0\"} 62\n+\n+# HELP quic_handshake_evicted Number of handshakes dropped due to eviction.\n+# TYPE quic_handshake_evicted counter\n+quic_handshake_evicted{kind=\"quic\",kind_id=\"0\"} 63\n+\n+# HELP quic_stream_received_events Number of stream RX events.\n+# TYPE quic_stream_received_events counter\n+quic_stream_received_events{kind=\"quic\",kind_id=\"0\"} 64\n+\n+# HELP quic_stream_received_bytes Total stream payload bytes received.\n+# TYPE quic_stream_received_bytes counter\n+quic_stream_received_bytes{kind=\"quic\",kind_id=\"0\"} 65\n+\n+# HELP quic_received_frames Number of QUIC frames received.\n+# TYPE quic_received_frames counter\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"unknown\"} 66\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"ack\"} 67\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"reset_stream\"} 68\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"stop_sending\"} 69\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"crypto\"} 70\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"new_token\"} 71\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"stream\"} 72\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"max_data\"} 73\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"max_stream_data\"} 74\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"max_streams\"} 75\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"data_blocked\"} 76\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"stream_data_blocked\"} 77\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"streams_blocked\"} 78\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"new_conn_id\"} 79\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"retire_conn_id\"} 80\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"path_challenge\"} 81\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"path_response\"} 82\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"conn_close_quic\"} 83\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"conn_close_app\"} 84\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"handshake_done\"} 85\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"ping\"} 86\n+quic_received_frames{kind=\"quic\",kind_id=\"0\",quic_frame_type=\"padding\"} 87\n+\n+# HELP quic_ack_tx ACK events\n+# TYPE quic_ack_tx counter\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"noop\"} 88\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"new\"} 89\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"merged\"} 90\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"drop\"} 91\n+quic_ack_tx{kind=\"quic\",kind_id=\"0\",quic_ack_tx=\"cancel\"} 92\n+\n+# HELP quic_service_duration_seconds Duration spent in service\n+# TYPE quic_service_duration_seconds histogram\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"8.9999999999999995e-09\"} 93\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1e-08\"} 187\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"9.9999999999999995e-08\"} 282\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1800000000000002e-07\"} 378\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0070000000000001e-06\"} 475\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1839999999999999e-06\"} 573\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0063e-05\"} 672\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1798999999999998e-05\"} 772\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.000100479\"} 873\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.00031749099999999999\"} 975\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.001003196\"} 1078\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.003169856\"} 1182\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.010015971\"} 1287\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.031648018999999999\"} 1393\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.099999999000000006\"} 1500\n+quic_service_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"+Inf\"} 1608\n+quic_service_duration_seconds_sum{kind=\"quic\",kind_id=\"0\"} 1.09e-07\n+quic_service_duration_seconds_count{kind=\"quic\",kind_id=\"0\"} 1608\n+\n+# HELP quic_receive_duration_seconds Duration spent processing packets\n+# TYPE quic_receive_duration_seconds histogram\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"8.9999999999999995e-09\"} 110\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1e-08\"} 221\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"9.9999999999999995e-08\"} 333\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1800000000000002e-07\"} 446\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0070000000000001e-06\"} 560\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1839999999999999e-06\"} 675\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"1.0063e-05\"} 791\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"3.1798999999999998e-05\"} 908\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.000100479\"} 1026\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.00031749099999999999\"} 1145\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.001003196\"} 1265\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.003169856\"} 1386\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.010015971\"} 1508\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.031648018999999999\"} 1631\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"0.099999999000000006\"} 1755\n+quic_receive_duration_seconds_bucket{kind=\"quic\",kind_id=\"0\",le=\"+Inf\"} 1880\n+quic_receive_duration_seconds_sum{kind=\"quic\",kind_id=\"0\"} 1.2599999999999999e-07\n+quic_receive_duration_seconds_count{kind=\"quic\",kind_id=\"0\"} 1880\n+\n+# HELP quic_frame_fail_parse Number of QUIC frames failed to parse.\n+# TYPE quic_frame_fail_parse counter\n+quic_frame_fail_parse{kind=\"quic\",kind_id=\"0\"} 127\n+\n+# HELP quic_pkt_crypto_failed Number of packets that failed decryption.\n+# TYPE quic_pkt_crypto_failed counter\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"initial\"} 128\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"early\"} 129\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"handshake\"} 130\n+quic_pkt_crypto_failed{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"app\"} 131\n+\n+# HELP quic_pkt_no_key Number of packets that failed decryption due to missing key.\n+# TYPE quic_pkt_no_key counter\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"initial\"} 132\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"early\"} 133\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"handshake\"} 134\n+quic_pkt_no_key{kind=\"quic\",kind_id=\"0\",quic_enc_level=\"app\"} 135\n+\n+# HELP quic_pkt_net_header_invalid Number of packets dropped due to weird IP or UDP header.\n+# TYPE quic_pkt_net_header_invalid counter\n+quic_pkt_net_header_invalid{kind=\"quic\",kind_id=\"0\"} 136\n+\n+# HELP quic_pkt_quic_header_invalid Number of packets dropped due to weird QUIC header.\n+# TYPE quic_pkt_quic_header_invalid counter\n+quic_pkt_quic_header_invalid{kind=\"quic\",kind_id=\"0\"} 137\n+\n+# HELP quic_pkt_undersz Number of QUIC packets dropped due to being too small.\n+# TYPE quic_pkt_undersz counter\n+quic_pkt_undersz{kind=\"quic\",kind_id=\"0\"} 138\n+\n+# HELP quic_pkt_oversz Number of QUIC packets dropped due to being too large.\n+# TYPE quic_pkt_oversz counter\n+quic_pkt_oversz{kind=\"quic\",kind_id=\"0\"} 139\n+\n+# HELP quic_pkt_verneg Number of QUIC version negotiation packets received.\n+# TYPE quic_pkt_verneg counter\n+quic_pkt_verneg{kind=\"quic\",kind_id=\"0\"} 140\n+\n+# HELP quic_retry_sent Number of QUIC Retry packets sent.\n+# TYPE quic_retry_sent counter\n+quic_retry_sent{kind=\"quic\",kind_id=\"0\"} 141\n+\n+# HELP quic_pkt_retransmissions Number of QUIC packets that retransmitted.\n+# TYPE quic_pkt_retransmissions counter\n+quic_pkt_retransmissions{kind=\"quic\",kind_id=\"0\"} 142\n+>>>>>>> bf98b9a50 (bz)\ndiff --git a/src/disco/shred/fd_shred_tile.seccomppolicy b/src/disco/shred/fd_shred_tile.seccomppolicy\nindex efb7dec4f4..e7062f5651 100644\n--- a/src/disco/shred/fd_shred_tile.seccomppolicy\n+++ b/src/disco/shred/fd_shred_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/shred/generated/fd_shred_tile_seccomp.h b/src/disco/shred/generated/fd_shred_tile_seccomp.h\nindex a30de774c4..eeaf804d61 100644\n--- a/src/disco/shred/generated/fd_shred_tile_seccomp.h\n+++ b/src/disco/shred/generated/fd_shred_tile_seccomp.h\n@@ -21,34 +21,46 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_shred_tile_instr_cnt = 14;\n+static const unsigned int sock_filter_policy_fd_shred_tile_instr_cnt = 20;\n \n static void populate_sock_filter_policy_fd_shred_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd) {\n- FD_TEST( out_cnt >= 14 );\n- struct sock_filter filter[14] = {\n+ FD_TEST( out_cnt >= 20 );\n+ struct sock_filter filter[20] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 16 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 2, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 4, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 7, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 8, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 12, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 6 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 10 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_2:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/sign/fd_sign_tile.seccomppolicy b/src/disco/sign/fd_sign_tile.seccomppolicy\nindex efb7dec4f4..e7062f5651 100644\n--- a/src/disco/sign/fd_sign_tile.seccomppolicy\n+++ b/src/disco/sign/fd_sign_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/sign/generated/fd_sign_tile_seccomp.h b/src/disco/sign/generated/fd_sign_tile_seccomp.h\nindex 7a682b41e3..842b478141 100644\n--- a/src/disco/sign/generated/fd_sign_tile_seccomp.h\n+++ b/src/disco/sign/generated/fd_sign_tile_seccomp.h\n@@ -21,34 +21,46 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_sign_tile_instr_cnt = 14;\n+static const unsigned int sock_filter_policy_fd_sign_tile_instr_cnt = 20;\n \n static void populate_sock_filter_policy_fd_sign_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd) {\n- FD_TEST( out_cnt >= 14 );\n- struct sock_filter filter[14] = {\n+ FD_TEST( out_cnt >= 20 );\n+ struct sock_filter filter[20] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 16 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 2, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 4, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 7, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 8, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 12, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 6 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 10 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_2:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/disco/stem/fd_stem.c b/src/disco/stem/fd_stem.c\nindex 4bcfa0675b..d00f7ff572 100644\n--- a/src/disco/stem/fd_stem.c\n+++ b/src/disco/stem/fd_stem.c\n@@ -190,6 +190,16 @@\n #define STEM_LAZY (0L)\n #endif\n \n+#define STEM_SHUTDOWN_SEQ (ULONG_MAX-1UL)\n+\n+#ifndef STEM_IDLE_SLEEP_ENABLED\n+#define STEM_IDLE_SLEEP_ENABLED (1)\n+#endif\n+\n+#ifndef STEM_IDLE_THRESHOLD\n+#define STEM_IDLE_THRESHOLD (2048UL)\n+#endif\n+\n static inline void\n STEM_(in_update)( fd_stem_tile_in_t * in ) {\n fd_fseq_update( in->fseq, in->seq );\n@@ -239,16 +249,19 @@ STEM_(run1)( ulong in_cnt,\n ulong cons_cnt,\n ulong * _cons_out,\n ulong ** _cons_fseq,\n+ int idle_sleep,\n ulong burst,\n long lazy,\n fd_rng_t * rng,\n+ ulong * leader_state,\n void * scratch,\n STEM_CALLBACK_CONTEXT_TYPE * ctx ) {\n /* in frag stream state */\n- ulong in_seq; /* current position in input poll sequence, in [0,in_cnt) */\n- fd_stem_tile_in_t * in; /* in[in_seq] for in_seq in [0,in_cnt) has information about input fragment stream currently at\n- position in_seq in the in_idx polling sequence. The ordering of this array is continuously\n- shuffled to avoid lighthousing effects in the output fragment stream at extreme fan-in and load */\n+ ulong in_seq; /* current position in input poll sequence, in [0,in_cnt) */\n+ fd_stem_tile_in_t * in; /* in[in_seq] for in_seq in [0,in_cnt) has information about input fragment stream currently at\n+ position in_seq in the in_idx polling sequence. The ordering of this array is continuously\n+ shuffled to avoid lighthousing effects in the output fragment stream at extreme fan-in and load */\n+ ulong idle_iter_cnt; /* consecutive iterations without processing any fragments, tile can sleep when threshold is exceeded */\n \n /* out frag stream state */\n ulong * out_depth; /* ==fd_mcache_depth( out_mcache[out_idx] ) for out_idx in [0, out_cnt) */\n@@ -263,10 +276,12 @@ STEM_(run1)( ulong in_cnt,\n ulong * cons_seq; /* cons_seq [cons_idx] is the most recent observation of cons_fseq[cons_idx] */\n \n /* housekeeping state */\n- ulong event_cnt; /* ==in_cnt+cons_cnt+1, total number of housekeeping events */\n- ulong event_seq; /* current position in housekeeping event sequence, in [0,event_cnt) */\n- ushort * event_map; /* current mapping of event_seq to event idx, event_map[ event_seq ] is next event to process */\n- ulong async_min; /* minimum number of ticks between processing a housekeeping event, positive integer power of 2 */\n+ ulong event_cnt; /* ==in_cnt+cons_cnt+1, total number of housekeeping events */\n+ ulong event_seq; /* current position in housekeeping event sequence, in [0,event_cnt) */\n+ ushort * event_map; /* current mapping of event_seq to event idx, event_map[ event_seq ] is next event to process */\n+ ulong async_min; /* minimum number of ticks between processing a housekeeping event, positive integer power of 2 */\n+ double ticks_per_ns; /* ticks per nanosecond for timing calculations */\n+ ulong is_leader; /* leader state flag (0/1), read from leader_state fseq; disables idle sleep when non-zero */\n \n /* performance metrics */\n ulong metric_in_backp; /* is the run loop currently backpressured by one or more of the outs, in [0,1] */\n@@ -314,6 +329,15 @@ STEM_(run1)( ulong in_cnt,\n this_in->accum[3] = 0U; this_in->accum[4] = 0U; this_in->accum[5] = 0U;\n }\n \n+ idle_iter_cnt = 0;\n+ is_leader = 0;\n+#if !STEM_IDLE_SLEEP_ENABLED\n+ (void)idle_sleep;\n+ (void)idle_iter_cnt;\n+ (void)leader_state;\n+ (void)is_leader;\n+#endif\n+\n /* out frag stream init */\n \n cr_avail = (ulong *)FD_SCRATCH_ALLOC_APPEND( l, alignof(ulong), out_cnt*sizeof(ulong) );\n@@ -365,7 +389,8 @@ STEM_(run1)( ulong in_cnt,\n for( ulong cons_idx=0UL; cons_idx<cons_cnt; cons_idx++ ) event_map[ event_seq++ ] = (ushort)cons_idx;\n event_seq = 0UL;\n \n- async_min = fd_tempo_async_min( lazy, event_cnt, (float)fd_tempo_tick_per_ns( NULL ) );\n+ ticks_per_ns = fd_tempo_tick_per_ns( NULL );\n+ async_min = fd_tempo_async_min( lazy, event_cnt, (float)ticks_per_ns );\n if( FD_UNLIKELY( !async_min ) ) FD_LOG_ERR(( \"bad lazy %lu %lu\", (ulong)lazy, event_cnt ));\n \n FD_LOG_INFO(( \"Running stem, cr_max = %lu\", cr_max ));\n@@ -445,6 +470,10 @@ STEM_(run1)( ulong in_cnt,\n }\n }\n \n+#if STEM_IDLE_SLEEP_ENABLED\n+ if ( FD_UNLIKELY( idle_sleep ) ) is_leader = fd_fseq_query(leader_state);\n+#endif\n+\n #ifdef STEM_CALLBACK_DURING_HOUSEKEEPING\n STEM_CALLBACK_DURING_HOUSEKEEPING( ctx );\n #else\n@@ -489,6 +518,24 @@ STEM_(run1)( ulong in_cnt,\n now = next;\n }\n \n+ idle_iter_cnt++;\n+\n+#if STEM_IDLE_SLEEP_ENABLED\n+ if ( FD_UNLIKELY( idle_sleep && idle_iter_cnt>STEM_IDLE_THRESHOLD ) ) {\n+ if ( FD_UNLIKELY( !is_leader ) ) {\n+ long ticks_until_deadline = then - now;\n+ long ns_until_deadline = (long)((double)ticks_until_deadline / ticks_per_ns);\n+ fd_log_sleep( ns_until_deadline );\n+\n+ metric_regime_ticks[0] += housekeeping_ticks;\n+ housekeeping_ticks = 0;\n+ long next = fd_tickcount();\n+ metric_regime_ticks[8] += (ulong)(next - now);\n+ now = next;\n+ } else idle_iter_cnt = 0;\n+ }\n+#endif\n+\n #if defined(STEM_CALLBACK_BEFORE_CREDIT) || defined(STEM_CALLBACK_AFTER_CREDIT) || defined(STEM_CALLBACK_AFTER_FRAG) || defined(STEM_CALLBACK_RETURNABLE_FRAG)\n fd_stem_context_t stem = {\n .mcaches = out_mcache,\n@@ -548,6 +595,7 @@ STEM_(run1)( ulong in_cnt,\n if( FD_UNLIKELY( was_busy ) ) metric_regime_ticks[3] += (ulong)(next - now);\n else metric_regime_ticks[6] += (ulong)(next - now);\n now = next;\n+ if( FD_UNLIKELY( was_busy ) ) idle_iter_cnt = 0;\n continue;\n }\n \n@@ -564,6 +612,7 @@ STEM_(run1)( ulong in_cnt,\n long prefrag_next = fd_tickcount();\n prefrag_ticks = (ulong)(prefrag_next - now);\n now = prefrag_next;\n+ idle_iter_cnt = 0;\n }\n #endif\n \n@@ -694,6 +743,7 @@ STEM_(run1)( ulong in_cnt,\n #endif\n \n /* Windup for the next in poll and accumulate diagnostics */\n+ idle_iter_cnt = 0;\n \n this_in_seq = fd_seq_inc( this_in_seq, 1UL );\n this_in->seq = this_in_seq;\n@@ -757,6 +807,16 @@ STEM_(run)( fd_topo_t * topo,\n fd_rng_t rng[1];\n FD_TEST( fd_rng_join( fd_rng_new( rng, 0, 0UL ) ) );\n \n+ ulong * leader_state = NULL;\n+#if STEM_IDLE_SLEEP_ENABLED\n+ if( FD_UNLIKELY( tile->idle_sleep ) ) {\n+ ulong leader_state_obj_id = fd_pod_query_ulong( topo->props, \"leader_state\", ULONG_MAX );\n+ FD_TEST( leader_state_obj_id!=ULONG_MAX );\n+ leader_state = fd_fseq_join( fd_topo_obj_laddr(topo, leader_state_obj_id) );\n+ FD_TEST( leader_state );\n+ }\n+#endif\n+\n STEM_CALLBACK_CONTEXT_TYPE * ctx = (STEM_CALLBACK_CONTEXT_TYPE*)fd_ulong_align_up( (ulong)fd_topo_obj_laddr( topo, tile->tile_obj_id ), STEM_CALLBACK_CONTEXT_ALIGN );\n \n STEM_(run1)( polled_in_cnt,\n@@ -767,9 +827,11 @@ STEM_(run)( fd_topo_t * topo,\n reliable_cons_cnt,\n cons_out,\n cons_fseq,\n+ tile->idle_sleep,\n STEM_BURST,\n STEM_LAZY,\n rng,\n+ leader_state,\n fd_alloca( FD_STEM_SCRATCH_ALIGN, STEM_(scratch_footprint)( polled_in_cnt, tile->out_cnt, reliable_cons_cnt ) ),\n ctx );\n \ndiff --git a/src/disco/stem/fd_stem.h b/src/disco/stem/fd_stem.h\nindex d8e9777fab..2d57e883a7 100644\n--- a/src/disco/stem/fd_stem.h\n+++ b/src/disco/stem/fd_stem.h\n@@ -2,6 +2,7 @@\n #define HEADER_fd_src_disco_stem_fd_stem_h\n \n #include \"../fd_disco_base.h\"\n+#include \"../../util/pod/fd_pod.h\"\n \n #define FD_STEM_SCRATCH_ALIGN (128UL)\n \ndiff --git a/src/disco/topo/fd_topo.h b/src/disco/topo/fd_topo.h\nindex 900f5529c5..2b0a720efc 100644\n--- a/src/disco/topo/fd_topo.h\n+++ b/src/disco/topo/fd_topo.h\n@@ -121,6 +121,7 @@ struct fd_topo_tile {\n ulong kind_id; /* The ID of this tile within its name. If there are n tile of a particular name, they have IDs [0, N). The pair (name, kind_id) uniquely identifies a tile, as does \"id\" on its own. */\n int is_agave; /* If the tile needs to run in the Agave (Anza) address space or not. */\n int allow_shutdown; /* If the tile is allowed to shutdown gracefully. If false, when the tile exits it will tear down the entire application. */\n+ int idle_sleep; /* If the tile should sleep when idle. */\n \n ulong cpu_idx; /* The CPU index to pin the tile on. A value of ULONG_MAX or more indicates the tile should be floating and not pinned to a core. */\n \n@@ -522,6 +523,8 @@ struct fd_topo {\n \n ulong max_page_size; /* 2^21 or 2^30 */\n ulong gigantic_page_threshold; /* see [hugetlbfs.gigantic_page_threshold_mib]*/\n+\n+ int low_power_mode;\n };\n typedef struct fd_topo fd_topo_t;\n \ndiff --git a/src/disco/topo/fd_topob.c b/src/disco/topo/fd_topob.c\nindex 11a122a5b3..4c33028b08 100644\n--- a/src/disco/topo/fd_topob.c\n+++ b/src/disco/topo/fd_topob.c\n@@ -142,6 +142,7 @@ fd_topob_tile( fd_topo_t * topo,\n tile->id = topo->tile_cnt;\n tile->kind_id = kind_id;\n tile->is_agave = is_agave;\n+ tile->idle_sleep = topo->low_power_mode;\n tile->cpu_idx = cpu_idx;\n tile->in_cnt = 0UL;\n tile->out_cnt = 0UL;\n@@ -340,11 +341,17 @@ fd_topob_auto_layout( fd_topo_t * topo,\n tiles to CPU cores in NUMA sequential order, except for a few tiles\n which should be floating. */\n \n+ fd_topo_cpus_t cpus[1];\n+ fd_topo_cpus_init( cpus );\n+\n char const * FLOATING[] = {\n \"netlnk\",\n \"metric\",\n \"cswtch\",\n \"bencho\",\n+ \"plugin\",\n+ \"gui\",\n+ \"store\"\n };\n \n char const * ORDERED[] = {\n@@ -391,29 +398,26 @@ fd_topob_auto_layout( fd_topo_t * topo,\n tile->cpu_idx = ULONG_MAX;\n }\n \n- fd_topo_cpus_t cpus[1];\n- fd_topo_cpus_init( cpus );\n-\n ulong cpu_ordering[ FD_TILE_MAX ] = { 0UL };\n- int pairs_assigned[ FD_TILE_MAX ] = { 0 };\n+ // int pairs_assigned[ FD_TILE_MAX ] = { 0 };\n \n ulong next_cpu_idx = 0UL;\n for( ulong i=0UL; i<cpus->numa_node_cnt; i++ ) {\n for( ulong j=0UL; j<cpus->cpu_cnt; j++ ) {\n- fd_topo_cpu_t * cpu = &cpus->cpu[ j ];\n+ // fd_topo_cpu_t * cpu = &cpus->cpu[ j ];\n \n- if( FD_UNLIKELY( pairs_assigned[ j ] || cpu->numa_node!=i ) ) continue;\n+ // if( FD_UNLIKELY( pairs_assigned[ j ] || cpu->numa_node!=i ) ) continue;\n \n FD_TEST( next_cpu_idx<FD_TILE_MAX );\n cpu_ordering[ next_cpu_idx++ ] = j;\n \n- if( FD_UNLIKELY( cpu->sibling!=ULONG_MAX ) ) {\n- /* If the CPU has a HT pair, place it immediately after so they\n- are sequentially assigned. */\n- FD_TEST( next_cpu_idx<FD_TILE_MAX );\n- cpu_ordering[ next_cpu_idx++ ] = cpu->sibling;\n- pairs_assigned[ cpu->sibling ] = 1;\n- }\n+ // if( FD_UNLIKELY( cpu->sibling!=ULONG_MAX ) ) {\n+ // /* If the CPU has a HT pair, place it immediately after so they\n+ // are sequentially assigned. */\n+ // FD_TEST( next_cpu_idx<FD_TILE_MAX );\n+ // cpu_ordering[ next_cpu_idx++ ] = cpu->sibling;\n+ // pairs_assigned[ cpu->sibling ] = 1;\n+ // }\n }\n }\n \n@@ -484,8 +488,9 @@ fd_topob_auto_layout( fd_topo_t * topo,\n }\n \n if( FD_UNLIKELY( reserve_agave_cores ) ) {\n- for( ulong i=cpu_idx; i<cpus->cpu_cnt; i++ ) {\n+ for( ulong i=1UL; i<cpus->cpu_cnt; i++ ) {\n if( FD_UNLIKELY( !cpus->cpu[ cpu_ordering[ i ] ].online ) ) continue;\n+ if( FD_UNLIKELY( cpu_assigned[ cpu_ordering[ i ] ] ) ) continue;\n \n if( FD_LIKELY( topo->agave_affinity_cnt<sizeof(topo->agave_affinity_cpu_idx)/sizeof(topo->agave_affinity_cpu_idx[0]) ) ) {\n topo->agave_affinity_cpu_idx[ topo->agave_affinity_cnt++ ] = cpu_ordering[ i ];\ndiff --git a/src/disco/verify/fd_verify_tile.seccomppolicy b/src/disco/verify/fd_verify_tile.seccomppolicy\nindex efb7dec4f4..e7062f5651 100644\n--- a/src/disco/verify/fd_verify_tile.seccomppolicy\n+++ b/src/disco/verify/fd_verify_tile.seccomppolicy\n@@ -16,3 +16,19 @@ write: (or (eq (arg 0) 2)\n #\n # arg 0 is the file descriptor to fsync.\n fsync: (eq (arg 0) logfile_fd)\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls clock_nanosleep; glibc's nanosleep uses the\n+# clock_nanosleep syscall. arg 0 is the clock (CLOCK_REALTIME),\n+# arg 1 is flags (0), arg2 is requested time, arg3 is remainder pointer.\n+clock_nanosleep: (and (eq (arg 0) CLOCK_REALTIME)\n+ (eq (arg 1) 0))\n+\n+# low_power_mode: stem calls fd_log_sleep to reduce CPU usage when\n+# the tile is idle. Can be enabled by configuration.\n+#\n+# fd_log_sleep calls sched_yield depending on the amount of time.\n+# This syscall takes no arguments.\n+sched_yield\ndiff --git a/src/disco/verify/generated/fd_verify_tile_seccomp.h b/src/disco/verify/generated/fd_verify_tile_seccomp.h\nindex 8c0813d671..b4cd0792a4 100644\n--- a/src/disco/verify/generated/fd_verify_tile_seccomp.h\n+++ b/src/disco/verify/generated/fd_verify_tile_seccomp.h\n@@ -21,34 +21,46 @@\n #else\n # error \"Target architecture is unsupported by seccomp.\"\n #endif\n-static const unsigned int sock_filter_policy_fd_verify_tile_instr_cnt = 14;\n+static const unsigned int sock_filter_policy_fd_verify_tile_instr_cnt = 20;\n \n static void populate_sock_filter_policy_fd_verify_tile( ulong out_cnt, struct sock_filter * out, unsigned int logfile_fd) {\n- FD_TEST( out_cnt >= 14 );\n- struct sock_filter filter[14] = {\n+ FD_TEST( out_cnt >= 20 );\n+ struct sock_filter filter[20] = {\n /* Check: Jump to RET_KILL_PROCESS if the script's arch != the runtime arch */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, arch ) ) ),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 10 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, ARCH_NR, 0, /* RET_KILL_PROCESS */ 16 ),\n /* loading syscall number in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, ( offsetof( struct seccomp_data, nr ) ) ),\n /* allow write based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 2, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_write, /* check_write */ 4, 0 ),\n /* allow fsync based on expression */\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 5, 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_fsync, /* check_fsync */ 7, 0 ),\n+ /* allow clock_nanosleep based on expression */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_clock_nanosleep, /* check_clock_nanosleep */ 8, 0 ),\n+ /* simply allow sched_yield */\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, SYS_sched_yield, /* RET_ALLOW */ 12, 0 ),\n /* none of the syscalls matched */\n- { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 6 },\n+ { BPF_JMP | BPF_JA, 0, 0, /* RET_KILL_PROCESS */ 10 },\n // check_write:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 5, /* lbl_1 */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 2, /* RET_ALLOW */ 9, /* lbl_1 */ 0 ),\n // lbl_1:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 3, /* RET_KILL_PROCESS */ 2 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 7, /* RET_KILL_PROCESS */ 6 ),\n // check_fsync:\n /* load syscall argument 0 in accumulator */\n BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n- BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, logfile_fd, /* RET_ALLOW */ 5, /* RET_KILL_PROCESS */ 4 ),\n+// check_clock_nanosleep:\n+ /* load syscall argument 0 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, CLOCK_REALTIME, /* lbl_2 */ 0, /* RET_KILL_PROCESS */ 2 ),\n+// lbl_2:\n+ /* load syscall argument 1 in accumulator */\n+ BPF_STMT( BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[1])),\n+ BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 0, /* RET_ALLOW */ 1, /* RET_KILL_PROCESS */ 0 ),\n // RET_KILL_PROCESS:\n /* KILL_PROCESS is placed before ALLOW since it's the fallthrough case. */\n BPF_STMT( BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS ),\ndiff --git a/src/discoh/poh/fd_poh_tile.c b/src/discoh/poh/fd_poh_tile.c\nindex 304965ac8a..7eb08a64ff 100644\n--- a/src/discoh/poh/fd_poh_tile.c\n+++ b/src/discoh/poh/fd_poh_tile.c\n@@ -528,6 +528,12 @@ typedef struct {\n so that they can resume the replay stage if it was suspended waiting. */\n void * signal_leader_change;\n \n+ /* Leader fseq for low power mode. When non-NULL, the PoH tile updates\n+ this fseq to 1 when it becomes leader and to 0 when it stops being\n+ leader. When leader, all tiles busy spin regardless of low-power settings\n+ to ensure peak performance when leader. */\n+ ulong * leader_state;\n+\n /* These are temporarily set in during_frag so they can be used in\n after_frag once the frag has been validated as not overrun. */\n uchar _txns[ USHORT_MAX ];\n@@ -1764,6 +1770,15 @@ during_housekeeping( fd_poh_ctx_t * ctx ) {\n FD_COMPILER_MFENCE();\n fd_ext_poh_signal_leader_change( ctx->signal_leader_change );\n }\n+\n+ if ( FD_UNLIKELY( ctx->leader_state ) ) {\n+ ulong is_leader = ctx->slot+1UL>=ctx->next_leader_slot;\n+ ulong current = fd_fseq_query( ctx->leader_state );\n+ if ( FD_UNLIKELY( current!=is_leader) ) {\n+ fd_fseq_update( ctx->leader_state, is_leader );\n+ FD_LOG_WARNING(( \"fd_poh_leader_state_changed, is_leader=%lu, current=%lu, slot=%lu, next_leader_slot=%lu\", is_leader, current, ctx->slot, ctx->next_leader_slot ));\n+ }\n+ }\n }\n \n static inline void\n@@ -2230,6 +2245,7 @@ unprivileged_init( fd_topo_t * topo,\n ctx->sha256 = NONNULL( fd_sha256_join( fd_sha256_new( sha256 ) ) );\n ctx->current_leader_bank = NULL;\n ctx->signal_leader_change = NULL;\n+ ctx->leader_state = NULL;\n \n ctx->shred_seq = ULONG_MAX;\n ctx->halted_switching_key = 0;\n@@ -2268,6 +2284,14 @@ unprivileged_init( fd_topo_t * topo,\n fd_shred_version = fd_fseq_join( fd_topo_obj_laddr( topo, poh_shred_obj_id ) );\n FD_TEST( fd_shred_version );\n \n+ if( FD_UNLIKELY( tile->idle_sleep ) ) {\n+ ulong leader_state_obj_id = fd_pod_query_ulong( topo->props, \"leader_state\", ULONG_MAX );\n+ FD_TEST( leader_state_obj_id!=ULONG_MAX );\n+ ctx->leader_state = fd_fseq_join( fd_topo_obj_laddr(topo, leader_state_obj_id) );\n+ FD_TEST( ctx->leader_state );\n+ fd_fseq_update( ctx->leader_state, 0UL );\n+ }\n+\n poh_link_init( &gossip_dedup, topo, tile, out1( topo, tile, \"gossip_dedup\" ).idx );\n poh_link_init( &stake_out, topo, tile, out1( topo, tile, \"stake_out\" ).idx );\n poh_link_init( &crds_shred, topo, tile, out1( topo, tile, \"crds_shred\" ).idx );\ndiff --git a/src/util/log/fd_log.c b/src/util/log/fd_log.c\nindex d13bbe900c..be02c24371 100644\n--- a/src/util/log/fd_log.c\n+++ b/src/util/log/fd_log.c\n@@ -31,7 +31,6 @@\n #include <unistd.h>\n #include <signal.h>\n #include <sched.h>\n-#include <time.h>\n #if defined(__linux__)\n #include <syscall.h>\n #endif\ndiff --git a/src/util/log/fd_log.h b/src/util/log/fd_log.h\nindex 479e0f1829..a97f5778d4 100644\n--- a/src/util/log/fd_log.h\n+++ b/src/util/log/fd_log.h\n@@ -142,6 +142,7 @@\n \n #include \"../env/fd_env.h\"\n #include \"../io/fd_io.h\"\n+#include <time.h>\n \n /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message\n at the NOTICE level to the logger. E.g. for a typical fd_log\n`\n\n\n return { filePath, body }\n}\n\nexport default modDiff\n","import { spawnSync } from 'child_process'\n\nexport const bamUpdate = (tag: string, mod = false, isMajorThree = false) => {\n // Update DZ\n spawnSync(\n `sudo apt install --only-upgrade doublezero doublezero-solana -y`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `sudo systemctl restart doublezerod`,\n { shell: true, stdio: 'inherit' },\n )\n\n if (isMajorThree) {\n if (mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(`mkdir /tmp/${tag}-bam`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`cd /tmp/${tag}-bam`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(\n `git clone https://github.com/jito-labs/bam-client.git --recurse-submodules /tmp/${tag}`,\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${tag} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo rm -rf /tmp/${tag}`, {\n shell: true,\n stdio: 'inherit',\n })\n }\n } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${tag}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${tag}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n","import {\n ACCOUNTS_PATH,\n IDENTITY_KEY_PATH,\n LEDGER_PATH,\n LOG_PATH,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\n\nexport const startTestnetValidatorScript = () => {\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 ${ACCOUNTS_PATH} \\\\\n--ledger ${LEDGER_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--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--dynamic-port-range 8000-8025 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--wait-for-supermajority 361144649 \\\\\n--expected-shred-version 41708 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--use-snapshot-archives-at-startup when-newest \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--experimental-retransmit-xdp-cpu-cores 2 \\\\\n--experimental-retransmit-xdp-zero-copy \\\\\n--experimental-poh-pinned-cpu-core 6 \\\\\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\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 { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_KNOWN_VALIDATORS,\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 {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = MAINNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\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${validatorArgs}\n--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\\\\n--expected-shred-version 50093 \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--private-rpc \\\\\n--experimental-retransmit-xdp-cpu-cores 2 \\\\\n--experimental-retransmit-xdp-zero-copy \\\\\n--experimental-poh-pinned-cpu-core 6 \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_KNOWN_VALIDATORS,\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 {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = TESTNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\n--only-known-rpc \\\\\n--rpc-bind-address 0.0.0.0 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n--dynamic-port-range 8000-8025 \\\\\n--rpc-port 8899 \\\\\n--wal-recovery-mode skip_any_corrupted_record \\\\\n--expected-shred-version 41708 \\\\\n--limit-ledger-size 50000000 \\\\\n--block-production-method central-scheduler-greedy \\\\\n--block-verification-method unified-scheduler \\\\\n--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_KNOWN_VALIDATORS,\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 = 10000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = TESTNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\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${validatorArgs}\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 0.0.0.0 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--expected-shred-version 41708 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n TESTNET_KNOWN_VALIDATORS,\n TESTNET_VALIDATOR_KEY_PATH,\n TESTNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startBamTestnetScript = (\n commissionBps = 10000,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n bamUrl: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = TESTNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\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 0.0.0.0 \\\\\n--block-engine-url ${blockEngineUrl} \\\\\n--shred-receiver-address ${shredReceiverAddr} \\\\\n--bam-url ${bamUrl} \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--expected-shred-version 41708 \\\\\n--expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\\\\n--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","export interface JitoConfig {\n version: string\n tag: string\n commissionBps: number\n relayerUrl: string\n blockEngineUrl: string\n shredReceiverAddr: string\n bamUrl: string\n hasRelayer?: boolean\n}\n\nexport const JITO_CONFIG: JitoConfig = {\n version: '2.3.10',\n tag: 'v2.3.10',\n commissionBps: 0,\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 bamUrl: 'http://frankfurt.mainnet.bam.jito.wtf'\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 BAM_URL: 'http://dallas.testnet.bam.jito.wtf',\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 BAM_URL: 'http://ny.testnet.bam.jito.wtf',\n },\n SaltLakeCity: {\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 BAM_URL: 'http://ny.testnet.bam.jito.wtf',\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 BAM_URL: 'http://amsterdam.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://london.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://frankfurt.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://ny.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://tokyo.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://slc.mainnet.bam.jito.wtf',\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 BAM_URL: 'http://singapore.mainnet.bam.jito.wtf',\n },\n Dublin: {\n BLOCK_ENGINE_URL: 'https://dublin.mainnet.block-engine.jito.wtf',\n RELAYER_URL: 'http://dublin.mainnet.relayer.jito.wtf:8100',\n SHRED_RECEIVER_ADDR: '64.130.61.8:1002',\n BAM_URL: '',\n },\n },\n}\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 { getKeypairsInfo } from '@/cli/balance'\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_KNOWN_VALIDATORS,\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 = 0,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n\n const knownValidators = MAINNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\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-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--private-rpc \\\\\n--full-rpc-api \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\n","import { getKeypairsInfo } from '@/cli/balance';\nimport {\n IDENTITY_KEY_PATH,\n LOG_PATH,\n MAINNET_KNOWN_VALIDATORS,\n MAINNET_VALIDATOR_KEY_PATH,\n MAINNET_VALIDATOR_VOTE_KEY_PATH,\n} from '@/config/constants'\nimport { DefaultConfigType } from '@/config/types'\n\nexport const startBamMainnetScript = (\n commissionBps = 0,\n relayerUrl: string,\n blockEngineUrl: string,\n shredReceiverAddr: string,\n bamUrl: string,\n config: DefaultConfigType,\n solanaCLI = 'agave-validator',\n) => {\n const {validatorKeyAddress} = getKeypairsInfo(config)\n\n const xdpEnabled = config.XDP\n const zeroCopyEnabled = config.ZERO_COPY\n const xdpFlags = xdpEnabled ? [`--experimental-retransmit-xdp-cpu-cores 2 \\\\`,`--experimental-poh-pinned-cpu-core 6 \\\\`].join('\\n') : ''\n const zeroCopyFlag = zeroCopyEnabled ? [`--experimental-retransmit-xdp-zero-copy \\\\`].join('\\n') : ''\n const knownValidators = MAINNET_KNOWN_VALIDATORS;\n\n const filteredValidators = knownValidators.filter(\n (address) => address !== validatorKeyAddress\n );\n\n const validatorArgs = filteredValidators\n .map((address) => `--known-validator ${address} \\\\`)\n .join('\\n');\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${validatorArgs}\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--bam-url ${bamUrl} \\\\\n--dynamic-port-range 8000-8025 \\\\\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--maximum-full-snapshots-to-retain 1 \\\\\n--maximum-incremental-snapshots-to-retain 2 \\\\\n--private-rpc \\\\\n--full-rpc-api \\\\\n${xdpFlags}\n${zeroCopyFlag}\n`\n// To be added later for XDP\n// --experimental-retransmit-xdp-cpu-cores 2 \\\\\n// --experimental-retransmit-xdp-zero-copy \\\\\n// --experimental-poh-pinned-cpu-core 6 \\\\\n return script\n}\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 { SERVICE_PATHS } from '@/config/config'\nimport { spawnSync } from 'child_process'\nimport { setupLogrotate } from '@/cli/setup/setupLogrotate'\nimport { rmLogs } from '@/cli/setup/rmLogs'\nimport { restartLogrotate } from '@/cli/setup/restartLogrotate'\n\nexport const updateLogrotate = (isFiredancer: boolean) => {\n rmLogs()\n const cmd = `sudo rm -rf ${SERVICE_PATHS.SOL_LOGROTATE} && sudo rm -rf ${SERVICE_PATHS.FRANKENDANCER_LOGROTATE}`\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n setupLogrotate(isFiredancer)\n restartLogrotate()\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 notifempty\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 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 if (frankendancer && existsSync(SERVICE_PATHS.FRANKENDANCER_LOGROTATE)) {\n console.log(\n 'FRANKENDANCER_LOGROTATE already exists. Skipping logrotate configuration.',\n )\n }\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 { spawnSync } from 'child_process'\n\nexport const restartLogrotate = () => {\n const cmd = 'sudo systemctl restart logrotate'\n spawnSync(cmd, { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'child_process'\n\nexport const restartFiredancer = () => {\n spawnSync('sudo systemctl restart frankendancer', {\n shell: true,\n stdio: 'inherit',\n })\n}\n","import { execAsync } from '@skeet-framework/utils'\nimport chalk from 'chalk'\n\n\nexport const syncFirewall = async () => {\n await execAsync(`echo \"yes\" | sudo ufw restart`)\n await execAsync(`echo \"yes\" | sudo ufw enable`)\n await execAsync(`sudo ufw allow ssh`)\n await execAsync(`sudo ufw allow 53`)\n await execAsync(`sudo ufw allow 8899/udp`)\n await execAsync(`sudo ufw allow 8899/tcp`)\n await execAsync(`sudo ufw allow 8000:8898/udp`)\n await execAsync(`sudo ufw allow 8000:8898/tcp`)\n await execAsync(`sudo ufw allow 8900:10000/tcp`)\n await execAsync(`sudo ufw allow 8900:10000/udp`)\n await execAsync(`sudo ufw allow 179/tcp`)\n await execAsync(`sudo ufw allow 9600/tcp`)\n await execAsync(`sudo ufw reload`)\n console.log(chalk.white('✔️ Firewall updated!'))\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 { 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]\nCapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN CAP_BPF CAP_PERFMON\nAmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN CAP_BPF CAP_PERFMON\nNoNewPrivileges=false\nType=simple\nRestart=always\nRestartSec=1\nLimitNOFILE=1000000\nLimitMEMLOCK=infinity\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 execSync(`sudo systemctl daemon-reload`)\n console.log('solv.service configuration created.')\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const startSolv = () => {\n spawnSync('sudo systemctl start solv', { shell: true, stdio: 'inherit' })\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 // console.log(chalk.white('⏳ Options: ...'))\n // console.log(chalk.white('1️⃣ --skip-mount: ', options.skipMount))\n // console.log(chalk.white('2️⃣ --skip-init-config: ', options.skipInitConfig))\n // console.log(chalk.white('3️⃣ --pivot: ', options.pivot))\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 { 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 ValidatorType.BAM,\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 || validatorType === ValidatorType.BAM) {\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 bamUrl: regionArgs.BAM_URL,\n } as JitoConfig\n\n return result\n}\n","import { VERSION_JITO_MAINNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\n\nexport const installJito = (version = VERSION_JITO_MAINNET, mod = false, isMajorThree = false) => {\n if(isMajorThree) {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\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 -C /tmp/${version} 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/${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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\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 } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\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-8025 \\\\\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 { JITO_PATCH, 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 const jitoPatch = JITO_PATCH\n const jitoTagBase = `v${VERSION_JITO_TESTNET}-jito`\n const jitoTag = `${jitoTagBase}${jitoPatch}`\n installJito(jitoTag)\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 {\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-8025 \\\\\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/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n\nexport default installSolana\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 { writeFile } from 'fs/promises'\nimport updateStartupScriptPermissions from '@/cli/setup/updateStartupScriptPermission'\nimport { startBamMainnetScript } from '@/template/startupScripts/startBamMainnetScript'\nimport { installBam } from '@/cli/install/installBam'\nimport { startBamTestnetScript } from '@/template/startupScripts/startBamTestnetScript'\nimport setupFiredancer from '../firedancer/setupFiredancer'\nimport { AGAVE_PATCH, BAM_PATCH, JITO_PATCH } from '@/config/versionConfig'\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 let isMajorThree = version.startsWith(\"3\") ? true : false;\n switch (validatorType) {\n case ValidatorType.SOLANA:\n const agavePatch = AGAVE_PATCH;\n const agaveTagBase = `v${version}`\n const agaveTag = `${agaveTagBase}${agavePatch}`\n installSolana(agaveTag)\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 const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${version}-jito`\n const jitoModBase = `v${version}-mod`\n const jitoTag = mod ? `${jitoModBase}${jitoPatch}` :`${jitoTagBase}${jitoPatch}`\n installJito(jitoTag, mod, isMajorThree)\n startupScript = startJitoMainnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n case ValidatorType.BAM:\n console.log('JITO Validator Setup for Mainnet')\n const bamConfig = await readOrCreateJitoConfig()\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${version}-bam`\n const bamModBase = `v${version}-mod`\n const bamTag = mod ? `${bamModBase}${bamPatch}` :`${bamTagBase}${bamPatch}`\n installBam(bamTag, mod, isMajorThree)\n startupScript = startBamMainnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n break\n case ValidatorType.FRANKENDANCER:\n await setupFiredancer(mod, config)\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, TESTNET_SOLANA_VERSION: version } = config\n mod = modConfig\n let startupScript = ''\n let isMajorThree = version.startsWith(\"3\") ? true : false;\n const agavePatch = AGAVE_PATCH;\n const agaveTagBase = `v${version}`\n const agaveTag = `${agaveTagBase}${agavePatch}`\n const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${version}-jito`\n const jitoModBase = `v${version}-mod`\n const jitoTag = mod ? `${jitoModBase}${jitoPatch}` :`${jitoTagBase}${jitoPatch}`\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${version}-bam`\n const bamModBase = `v${version}-mod`\n const bamTag = mod ? `${bamModBase}${bamPatch}` :`${bamTagBase}${bamPatch}`\n switch (validatorType) {\n case ValidatorType.SOLANA:\n installSolana(agaveTag)\n startupScript = startTestnetAgaveValidatorScript(config)\n case ValidatorType.AGAVE:\n console.log('Agave Validator Setup for Testnet')\n installAgave(agaveTag, mod, isMajorThree)\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(jitoTag, mod, isMajorThree)\n startupScript = startJitoTestnetScript(\n jitoConfig.commissionBps,\n jitoConfig.relayerUrl,\n jitoConfig.blockEngineUrl,\n jitoConfig.shredReceiverAddr,\n config\n )\n break\n case ValidatorType.BAM:\n console.log('BAM Validator Setup for Mainnet')\n const bamConfig = await readOrCreateJitoConfig()\n installBam(bamTag, mod, isMajorThree)\n startupScript = startBamTestnetScript(\n bamConfig.commissionBps,\n bamConfig.relayerUrl,\n bamConfig.blockEngineUrl,\n bamConfig.shredReceiverAddr,\n bamConfig.bamUrl,\n config\n )\n break\n case ValidatorType.FRANKENDANCER:\n console.log('FRANKENDANCER Validator Setup for Mainnet')\n await setupFiredancer(mod, config)\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 { spawnSync } from 'child_process'\n\nexport const installBam = (version: string, mod = false, isMajorThree = false) => {\n if(isMajorThree) {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\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 -C /tmp/${version} clone https://github.com/jito-labs/bam-client.git --recurse-submodules .`,\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 /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`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n spawnSync(\n `sudo ln -sfn /home/solv/.local/share/solana/install/releases/${version} /home/solv/.local/share/solana/install/active_release`,\n {\n shell: true,\n stdio: 'inherit',\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 } else {\n if(mod) {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${version}/installer)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n } else {\n spawnSync(\n `sh -c \"$(curl --netrc-optional -sSfL https://release.jito.wtf/${version}/install)\"`,\n {\n shell: true,\n stdio: 'inherit',\n },\n )\n }\n }\n spawnSync(`sudo systemctl disable frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n spawnSync(`sudo systemctl stop frankendancer.service`, {\n stdio: 'inherit',\n shell: true,\n })\n}\n","import { VERSION_FIREDANCER, VERSION_FIREDANCER_TESTNET } from '@/config/versionConfig'\nimport { spawnSync } from 'child_process'\nimport { promises as fs } from 'fs'\nimport path from 'path';\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'\nimport modDiff from '../template/firedancer/mod'\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 {filePath: modFilePath, body: modDiffContent} = modDiff();\n if (mod) {\n spawnSync(\n `git -C /home/solv/firedancer config --global user.email \"you@example.com\"`,\n { shell: true, stdio: 'inherit' },\n )\n spawnSync(\n `git -C /home/solv/firedancer config --global user.name \"Your Name\"`,\n { shell: true, stdio: 'inherit' },\n )\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 await fs.mkdir(path.dirname(modFilePath), { recursive: true });\n await fs.writeFile(modFilePath, modDiffContent, \"utf8\");\n spawnSync(`sudo chown solv:solv \"${modFilePath}\"`, {\n shell: true,\n stdio: 'inherit',\n })\n spawnSync(`git apply ${modFilePath}`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git add ./src/*`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\n })\n spawnSync(`git add ./book/*`, {\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 spawnSync(`export EXTRAS=\"openssl\"`, {\n shell: true,\n stdio: 'inherit',\n cwd: '/home/solv/firedancer',\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 = 0\n\n[tiles.pack]\n schedule_strategy = \\\"balanced\\\"\n\n[net]\n provider = \\\"socket\\\"`\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 = \\\"4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT\\\"\n expected_shred_version = 41708\n wait_for_supermajority_at_slot = 361144649\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","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 { enableFiredancer } from '@/lib/enableFiredancer'\nimport { disableFiredancer } from '@/lib/disableFiredancer'\nimport { disableSolv } from '@/lib/disableSolv'\n\nexport const setupV2 = async (skipInitConfig: boolean, skipMount: boolean, pivot: boolean, mod: boolean) => {\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 const isFiredancer = latestConfig.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n // Generate /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n if (!skipMount) {\n console.log(chalk.white(`🟢 Entering Mount Phase`))\n // Mount /mnt/ledger, /mnt/accounts and /mnt/snapshots if third disk is available\n setupDirs()\n await mountDirs()\n }\n // Generate Systemd Service\n makeServices(isTest, isFiredancer)\n // Restart Logrotate\n restartLogrotate()\n // Set CPU governor to performance\n setupCpuGovernor()\n // Update Sysctl Config if needed\n await updateSysctlConfig()\n if (!skipMount) {\n // Generate Solana Keys\n setupKeys(latestConfig)\n }\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 break\n default:\n throw new Error('Unknown Node Type')\n }\n if(!skipMount) {\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 disableFiredancer()\n enableSolv()\n // Download Snapshot\n getSnapshot(isTest, `100`, latestConfig.SNAPSHOTS_PATH, isTest ? latestConfig.TESTNET_SOLANA_VERSION : latestConfig.MAINNET_SOLANA_VERSION)\n }\n } else {\n disableSolv()\n enableFiredancer()\n getSnapshot(isTest, `100`, latestConfig.SNAPSHOTS_PATH, isTest ? latestConfig.TESTNET_SOLANA_VERSION : latestConfig.MAINNET_SOLANA_VERSION)\n }\n if(!skipMount) {\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 { execSync } from 'child_process'\nimport firedancerService from './template/firedancer/firedancerService'\n\n// This will overwrite the solv.service file with the new configuration to easily switch between testnet and mainnet\nexport function setupFiredancerService(): void {\n console.log('Creating solvService configuration for solana')\n const fdService = firedancerService()\n // Use sudo tee to write the file with superuser privileges\n execSync(`echo \"${fdService.body}\" | sudo tee ${fdService.filePath} > /dev/null`)\n console.log('frankendancer.service configuration created.')\n}\n","import { setupSystemd } from '@/cli/setup/setupSystemd'\nimport { setupLogrotate } from './setupLogrotate'\nimport { setupSolvService } from './setupSolvService'\nimport { setupFiredancerService } from './setupFiredancerService'\n\nexport const makeServices = (isTest: boolean, isFiredancer: boolean) => {\n setupLogrotate(isFiredancer)\n setupSolvService(isTest)\n setupFiredancerService()\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 { 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 { 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 '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 { spawnSync } from 'node:child_process'\n\nexport const enableFiredancer = () => {\n spawnSync('sudo systemctl enable frankendancer', { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const disableFiredancer = () => {\n spawnSync('sudo systemctl disable frankendancer', { shell: true, stdio: 'inherit' })\n}\n","import { spawnSync } from 'node:child_process'\n\nexport const disableSolv = () => {\n spawnSync('sudo systemctl disable solv', { shell: true, stdio: 'inherit' })\n}\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 BAM_PATCH,\n JITO_PATCH,\n VERSION_BAM_MAINNET,\n VERSION_FIREDANCER,\n VERSION_JITO_MAINNET,\n VERSION_MAINNET,\n VERSION_SOLANA_RPC,\n VERSION_TESTNET,\n} from '@/config/versionConfig'\nimport { bamUpdate } from '../update/bamUpdate'\nimport { frankendancerUpdate } from '../update/frankendancerUpdate'\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 isJitoBam = config.VALIDATOR_TYPE === ValidatorType.BAM\n const isFrankendancer = config.VALIDATOR_TYPE === ValidatorType.FRANKENDANCER\n const isModified = options.mod || config.MOD;\n if (isJito) {\n const jitoVersion = options.version || VERSION_JITO_MAINNET\n const jitoPatch = JITO_PATCH;\n const jitoTagBase = `v${jitoVersion}-jito`\n const jitoModBase = `v${jitoVersion}-mod`\n const jitoTag = isModified ? `${jitoModBase}${jitoPatch}` :`${jitoTagBase}${jitoPatch}`\n const isMajorThree = jitoVersion.startsWith(\"3\") ? true : false;\n jitoUpdate(jitoTag, isModified, isMajorThree)\n return\n }\n if (isJitoBam) {\n const bamVersion = options.version || VERSION_BAM_MAINNET\n const bamPatch = BAM_PATCH;\n const bamTagBase = `v${bamVersion}-bam`\n const bamModBase = `v${bamVersion}-mod`\n const bamTag = isModified ? `${bamModBase}${bamPatch}` :`${bamTagBase}${bamPatch}`\n const isMajorThree = bamVersion.startsWith(\"3\") ? true : false;\n bamUpdate(bamTag, isModified, isMajorThree)\n return\n }\n if (isFrankendancer) {\n const frankendancerVersion = options.version || VERSION_FIREDANCER\n frankendancerUpdate(config, frankendancerVersion, 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 * * * *')\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 { program } from '@/index'\nimport { DefaultConfigType } from '@/config/types'\nimport { updateLogrotate } from '../setup/updateLogrotate'\n\nexport const logrotateCommand = (config: DefaultConfigType) => {\n program\n .command('logrotate')\n .description('Refresh Logrotate')\n .action(() => {\n const isFiredancer = config.VALIDATOR_TYPE === 'frankendancer';\n updateLogrotate(isFiredancer)\n process.exit(0)\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 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'\n// import 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","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":"iFAAA,MAAO,gBACP,OAASA,WAAAA,OAAe,YCCtB,IAAAC,GAAW,SAFb,IAAAC,GAAA,CACE,KAAQ,qBACR,QAAAC,GACA,YAAe,4BACf,KAAQ,gBACR,KAAQ,SACR,WAAc,uCACd,SAAY,CACV,SACA,YACA,MACA,iBACA,UACA,MACF,EACA,MAAS,CACP,MACF,EACA,OAAU,mBACV,QAAW,GACX,QAAW,aACX,IAAO,CACL,KAAQ,iBACV,EACA,QAAW,CACT,KAAQ,SACR,MAAS,2CACT,IAAO,UACP,MAAS,oBACX,EACA,aAAgB,CACd,cAAe,SACf,0CAA2C,QAC3C,2BAA4B,QAC5B,2CAA4C,QAC5C,yBAA0B,SAC1B,yBAA0B,QAC1B,oBAAqB,QACrB,kBAAmB,SACnB,gBAAiB,QACjB,QAAS,QACT,KAAQ,QACR,MAAS,QACT,aAAc,QACd,eAAgB,SAChB,cAAe,SACf,aAAc,QACd,UAAa,SACb,OAAU,SACV,SAAY,SACZ,aAAc,QACd,OAAU,OACZ,EACA,gBAAmB,CACjB,+BAAgC,QAChC,kBAAmB,SACnB,6BAA8B,SAC9B,YAAa,SACb,eAAgB,QAChB,sBAAuB,SACvB,qBAAsB,QACtB,kBAAmB,QACnB,cAAe,SACf,oBAAqB,SACrB,gBAAiB,QACjB,mCAAoC,QACpC,4BAA6B,QAC7B,OAAU,QACV,yBAA0B,QAC1B,QAAW,QACX,SAAY,QACZ,KAAQ,QACR,WAAc,QACd,KAAQ,QACR,sBAAuB,QACvB,OAAU,OACZ,EACA,UAAa,CACX,MAAS,QACT,aAAc,QACd,gBAAiB,QACjB,aAAc,QACd,iBAAkB,SAClB,WAAY,QACZ,WAAY,OACd,CACF,ECpFO,IAAMC,GAAUC,GAAYC,QCA5B,IAAMC,GAA2B,+BAKjC,IAAMC,GAAoB,oBAW1B,IAAMC,GAAe,gBACfC,GAAe,yBACfC,GAAc,uBACdC,GAAwB,iCACxBC,GAA6B,oCAC7BC,GAAkC,iCAClCC,GAAwB,iCACxBC,GAA6B,oCAC7BC,GAAkC,iCAGlCC,EAAY,aACZC,EAAoB,GAAGD,CAAAA,IAAaT,EAAAA,GACpCW,GAAoB,GAAGF,CAAAA,IAAaR,EAAAA,GACpCW,EAA6B,GAAGH,CAAAA,IAAaN,EAAAA,GAC7CU,GAAkC,GAAGJ,CAAAA,IAAaL,EAAAA,GAClDU,GAAuC,GAAGL,CAAAA,IAAaJ,EAAAA,GACvDU,EAA6B,GAAGN,CAAAA,IAAaH,EAAAA,GAC7CU,GAAkC,GAAGP,CAAAA,IAAaF,EAAAA,GAClDU,GAAuC,GAAGR,CAAAA,IAAaD,EAAAA,GAGvDU,EAAW,GAAGT,CAAAA,wBAGdU,GAAiBV,EAAY,sBAG7BW,EAAc,cACdC,GAAgB,gBAChBC,GAAiB,iBAGjBC,GAAmB,mBACnBC,GAAkB,kBAElBC,GACX,+CAIK,IAAMC,GAAc,EAIpB,IAAMC,GAAyB,sCACzBC,GACX,mDACWC,GAAmB,uDAEpBC,EAAAA,iJAAAA,KAAAA,GAAAA,CAAAA,EAAAA,EAaL,IAAMC,GAAcC,OAAOC,OAAOH,EAAAA,EAG5BI,GAAiB,8CACjBC,GAAkB,+CAClBC,GAAmB,+CAEzB,IAAMC,GAAY,UAEZC,GAAqB,CAChCC,4CACE,+CACFC,6CACE,+CACFC,6CACE,+CACFC,4CACE,+CACFC,4CACE,+CACFC,6CACE,8CACFC,4CACE,+CACFC,6CACE,+CACFC,4CACE,8CACJ,EAEaC,GAA2B,CACpC,8CACA,8CACA,8CACA,+CACA,8CACA,+CACA,+CACA,8CACA,+CACA,8CACA,8CACA,8CACA,+CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,gDAGSC,GAA2B,CACpC,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,+CACA,8CACA,8CACA,+CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,+CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8CACA,8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CACE,wEACA,8EACA,4HACA,4FACA,sFACA,qGACA,kEAEF,CACE,+FACA,8EACA,kEAEF,CACE,2DACA,uEACA,kEAEF,CAAA,EACA,CAAA,GC3CF,IAAMC,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,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,CACpC,2BACA,gCACA,gCACA,8BACA,kCACA,cACA,UCPK,IAAMC,GAAyB,CACpC,wEACA,+FACA,uEACA,+FACA,8EACA,qDACA,kBCIF,IAAMC,GAAaC,EAACC,GAAAA,CAClB,IAAIC,EAAwB,CAC1BC,KAAMC,GACNC,QAASC,GACTC,KAAMC,GACNC,UAAWC,GACXC,aAAcC,GACdC,WAAYC,EACd,EACA,OAAQb,EAAAA,CACN,KAAKc,GAAMC,GACTd,EAAU,CACRC,KAAMC,GACNC,QAASC,GACTC,KAAMC,GACNC,UAAWC,GACXC,aAAcC,GACdC,WAAYC,EACd,EACA,MACF,KAAKC,GAAME,GACTf,EAAU,CACRC,KAAMe,GACNb,QAASc,GACTZ,KAAMa,GACNX,UAAWY,GACXV,aAAcW,GACdT,WAAYU,EACd,EACA,MACF,QACErB,EAAU,CACRC,KAAMC,GACNC,QAASC,GACTC,KAAMC,GACNC,UAAWC,GACXC,aAAcC,GACdC,WAAYC,EACd,CACJ,CACA,OAAOZ,CACT,EAzCmB,cA2CnBsB,GAAezB,GCrDf,OAAS0B,cAAAA,GAAYC,gBAAAA,GAAcC,iBAAAA,OAAqB,KCFxD,OAASC,gBAAAA,GAAcC,iBAAAA,OAAqB,KAC5C,OAASC,WAAAA,OAAe,KAEjB,IAAMC,GAAmBC,EAACC,GAAAA,CAG/B,IAAMC,EAAiB,GADPC,GAAAA,CACUC,IAAWC,GAAMC,MAAM,GAK3CC,EAA6B,CACjC,GALiBC,KAAKC,MACtBC,GAAaR,EAAgB,MAAA,CAAA,EAK7B,GAAGD,CACL,EACMU,EAAsBH,KAAKI,UAAUL,EAAe,KAAM,CAAA,EAChEM,GAAcX,EAAgBS,CAAAA,CAChC,EAdgC,oBDChC,OAASG,WAAAA,OAAe,KAOjB,IAAMC,GAA4BC,EAAA,IAAA,CAEvC,IAAMC,EAAa,GADHC,GAAAA,CACMC,IAAWC,GAAMC,MAAM,GACxCC,GAAWL,CAAAA,IACdM,GAAcN,EAAYO,KAAKC,UAAUJ,EAAQ,KAAM,CAAA,CAAA,EACvDK,QAAQC,IAAI,kCAAkCV,CAAAA,EAAY,GAE5D,IAAIW,EACJ,GAAI,CACFA,EAASJ,KAAKK,MAAMC,GAAab,EAAY,OAAA,CAAA,CAC/C,MAAgB,CACdS,QAAQC,IAAI,kDAAA,EACZJ,GAAcN,EAAYO,KAAKC,UAAUJ,EAAQ,KAAM,CAAA,CAAA,EACvDO,EAASP,CACX,CACA,IAAMU,EAASC,GAAWJ,EAAOK,IAAI,EAErC,OAAKL,EAAOM,UACVN,EAAOM,QAAUb,EAAOa,QACxBC,GAAiB,CAAED,QAASb,EAAOa,OAAQ,CAAA,GAIzCN,EAAOQ,cAAgBC,SACzBT,EAAOQ,YAAc,GACrBD,GAAiB,CAAEC,YAAa,EAAM,CAAA,GAInCR,EAAOU,sBACVV,EAAOU,oBAAsB,GAC7BH,GAAiB,CAAEG,oBAAqB,EAAG,CAAA,GAEtC,CAAEV,OAAAA,EAAQG,OAAAA,CAAO,CAC1B,EAlCyC,6BEXzC,OAASQ,aAAAA,MAAiB,gBAC1B,OAASC,YAAYC,OAAU,KAC/B,OAAOC,OAAU,OCHjB,IAAMC,GAAUC,EAAA,IAAA,CACd,IAAMC,EAAW,iCACXC,EAAOC,OAAOC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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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_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","TESTNET_KNOWN_VALIDATORS","MAINNET_KNOWN_VALIDATORS","spawnSync","spawnSync","installAgave","__name","version","mod","isMajorThree","spawnSync","shell","stdio","installAgave_default","AGAVE_CLI","getSolanaCLI","__name","error","console","getSolanaCLI_default","VERSION_TESTNET","VERSION_MAINNET","AGAVE_PATCH","VERSION_JITO_TESTNET","VERSION_JITO_MAINNET","JITO_PATCH","VERSION_BAM_TESTNET","VERSION_BAM_MAINNET","BAM_PATCH","VERSION_JITO_RPC","VERSION_SOLANA_RPC","VERSION_NODE","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","updateVersion","__name","version","mod","isMajorThree","agavePatch","AGAVE_PATCH","agaveTag","agaveTagBase","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","BAM_RESTART_REQUIRED_MAINNET","BAM_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","XDP","ZERO_COPY","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","SOLANA_TESTNET_RPC_URL","spawnSync","updateSolv","__name","spawnSync","shell","stdio","nodeVersion","CONFIG","NODE_VERSION","spawnSync","jitoUpdate","__name","tag","mod","isMajorThree","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","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","XDP","ZERO_COPY","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","isBam","BAM","mainnetValidatorKey","testnetValidatorKey","getAllKeyPaths","validatorKey","isUpdateRequired","FD_RESTART_REQUIRED_MAINNET","FD_RESTART_REQUIRED_TESTNET","BAM_RESTART_REQUIRED_MAINNET","BAM_RESTART_REQUIRED_TESTNET","NODE_RESTART_REQUIRED_MAINNET","NODE_RESTART_REQUIRED_TESTNET","AUTO_RESTART","address","getSolanaAddress","msg","getSolvVersion","sendDiscord","spawnSync","stdio","shell","error","errorMsg","message","timestampRestart","Math","floor","Date","now","restartMsg","sleep","catchup","waitCatchup","diffSeconds","minutes","seconds","durationStr","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","promises","fs","path","modDiff","__name","filePath","body","String","raw","mod_default","frankendancerUpdate","__name","config","version","mod","isTestnet","NETWORK","Network","TESTNET","firedancerVersion","VERSION_FIREDANCER_TESTNET","VERSION_FIREDANCER","isModified","MOD","filePath","modFilePath","body","modDiffContent","modDiff","spawnSync","shell","stdio","fs","mkdir","path","dirname","recursive","writeFile","cwd","spawnSync","bamUpdate","__name","tag","mod","isMajorThree","spawnSync","shell","stdio","startTestnetValidatorScript","__name","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","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","startMainnetValidatorScript","__name","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","MAINNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startTestnetAgaveValidatorScript","__name","config","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","TESTNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startJitoTestnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","TESTNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startBamTestnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","bamUrl","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","TESTNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","TESTNET_VALIDATOR_VOTE_KEY_PATH","TESTNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","writeFile","JITO_CONFIG","version","tag","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","bamUrl","JITO_REGIONS","TESTNET","Dallas","BLOCK_ENGINE_URL","RELAYER_URL","SHRED_RECEIVER_ADDR","BAM_URL","NewYork","SaltLakeCity","MAINNET","Amsterdam","London","Frankfurt","Tokyo","Singapore","Dublin","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","startJitoMainnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","MAINNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","startBamMainnetScript","__name","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","bamUrl","config","solanaCLI","validatorKeyAddress","getKeypairsInfo","xdpEnabled","XDP","zeroCopyEnabled","ZERO_COPY","xdpFlags","join","zeroCopyFlag","validatorArgs","MAINNET_KNOWN_VALIDATORS","filter","address","map","IDENTITY_KEY_PATH","MAINNET_VALIDATOR_VOTE_KEY_PATH","MAINNET_VALIDATOR_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","spawnSync","updateStartupScriptPermission","__name","cmd","STARTUP_SCRIPT","spawnSync","shell","stdio","updateStartupScriptPermission_default","spawnSync","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","spawnSync","rmLogs","__name","spawnSync","shell","stdio","spawnSync","restartLogrotate","__name","spawnSync","shell","stdio","updateLogrotate","__name","isFiredancer","rmLogs","cmd","SERVICE_PATHS","SOL_LOGROTATE","FRANKENDANCER_LOGROTATE","spawnSync","shell","stdio","setupLogrotate","restartLogrotate","spawnSync","restartFiredancer","__name","spawnSync","shell","stdio","execAsync","chalk","syncFirewall","__name","execAsync","console","log","chalk","white","spawnSync","enableSolv","__name","spawnSync","shell","stdio","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","spawnSync","startSolv","__name","spawnSync","shell","stdio","updateCommands","__name","config","isTestnet","NETWORK","Network","TESTNET","isRPC","NODE_TYPE","NodeType","RPC","isJito","VALIDATOR_TYPE","ValidatorType","JITO","isBam","BAM","isFrankendancer","FRANKENDANCER","isAutoRestart","AUTO_RESTART","isModded","MOD","minIdleTime","version","VERSION_TESTNET","VERSION_MAINNET","VERSION_JITO_MAINNET","VERSION_JITO_TESTNET","VERSION_BAM_MAINNET","VERSION_BAM_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","service","syncFirewall","updateLogrotate","setupSolvService","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","XDP","ZERO_COPY","updateDefaultConfig","jitoVersion","updateJitoSolvConfig","tag","bamVersion","green","firewall","updateFirewall","startup","validatorType","startupScript","startTestnetValidatorScript","startMainnetValidatorScript","startTestnetAgaveValidatorScript","jitoConfig","readOrCreateJitoConfig","startJitoTestnetScript","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","startJitoMainnetScript","bamConfig","startBamTestnetScript","bamUrl","startBamMainnetScript","writeFile","STARTUP_SCRIPT","updateStartupScriptPermissions","background","isMajorThree","startsWith","jitoPatch","JITO_PATCH","jitoTagBase","jitoModBase","jitoTag","mod","jitoUpdate","monitorUpdate","enableSolv","startSolv","bamPatch","BAM_PATCH","bamTagBase","bamModBase","bamTag","bamUpdate","frankendancerUpdate","restartFiredancer","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","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","bamUrl","BAM_URL","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","BAM","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_MAINNET","mod","isMajorThree","spawnSync","shell","stdio","startJitoRPCScript","__name","IDENTITY_KEY_PATH","LOG_PATH","ACCOUNTS_PATH","LEDGER_PATH","SNAPSHOTS_PATH","existsAsync","writeFile","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","jitoPatch","JITO_PATCH","jitoTag","VERSION_JITO_TESTNET","jitoTagBase","installJito","startJitoRPCScript","existsAsync","STARTUP_SCRIPT","writeFile","updateStartupScriptPermissions","rpc_default","spawnSync","installSolana","__name","version","spawnSync","shell","stdio","installSolana_default","writeFile","spawnSync","installBam","__name","version","mod","isMajorThree","spawnSync","shell","stdio","spawnSync","promises","fs","path","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","filePath","modFilePath","body","modDiffContent","modDiff","spawnSync","shell","stdio","cwd","fs","mkdir","path","dirname","recursive","writeFile","jitoConfig","readOrCreateJitoConfig","startFiredancerScript","fdService","firedancerService","prService","portRelayService","toml","configToml","console","log","setupLogrotate","setupFiredancer_default","setupValidatorNode","__name","config","mod","NETWORK","network","MOD","modConfig","Network","MAINNET","console","log","setupMainnetValidator","TESTNET","setupTestnetValidator","VALIDATOR_TYPE","validatorType","MAINNET_SOLANA_VERSION","version","startupScript","isMajorThree","startsWith","ValidatorType","SOLANA","agavePatch","AGAVE_PATCH","agaveTag","agaveTagBase","installSolana","startMainnetValidatorScript","JITO","jitoConfig","readOrCreateJitoConfig","jitoPatch","JITO_PATCH","jitoTagBase","jitoModBase","jitoTag","installJito","startJitoMainnetScript","commissionBps","relayerUrl","blockEngineUrl","shredReceiverAddr","BAM","bamConfig","bamPatch","BAM_PATCH","bamTagBase","bamModBase","bamTag","installBam","startBamMainnetScript","bamUrl","FRANKENDANCER","setupFiredancer","writeFile","STARTUP_SCRIPT","updateStartupScriptPermissions","TESTNET_SOLANA_VERSION","startTestnetAgaveValidatorScript","AGAVE","installAgave","startJitoTestnetScript","startBamTestnetScript","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","execSync","setupFiredancerService","console","log","fdService","firedancerService","execSync","body","filePath","makeServices","__name","isTest","isFiredancer","setupLogrotate","setupSolvService","setupFiredancerService","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","getSnapshot","__name","isTest","minDownloadSpeed","snapshotPath","SNAPSHOTS_PATH","version","VERSION_MAINNET","rpcUrl","useAvorio","cmd","spawnSync","shell","stdio","cwd","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","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","enableFiredancer","__name","spawnSync","shell","stdio","spawnSync","disableFiredancer","__name","spawnSync","shell","stdio","spawnSync","disableSolv","__name","spawnSync","shell","stdio","setupV2","__name","skipInitConfig","skipMount","pivot","mod","console","log","chalk","white","readConfig","initialConfigSetup","latestConfig","isTest","NETWORK","Network","TESTNET","isFiredancer","VALIDATOR_TYPE","ValidatorType","FRANKENDANCER","setupDirs","mountDirs","makeServices","restartLogrotate","setupCpuGovernor","updateSysctlConfig","setupKeys","createSymLink","IS_DUMMY","NODE_TYPE","NodeType","RPC","setupRpcNode","VALIDATOR","setupValidatorNode","Error","setupPermissions","daemonReload","disableFiredancer","enableSolv","getSnapshot","SNAPSHOTS_PATH","TESTNET_SOLANA_VERSION","MAINNET_SOLANA_VERSION","disableSolv","enableFiredancer","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","isJitoBam","BAM","isFrankendancer","FRANKENDANCER","isModified","mod","MOD","jitoVersion","VERSION_JITO_MAINNET","jitoPatch","JITO_PATCH","jitoTagBase","jitoModBase","jitoTag","isMajorThree","startsWith","jitoUpdate","bamVersion","VERSION_BAM_MAINNET","bamPatch","BAM_PATCH","bamTagBase","bamModBase","bamTag","bamUpdate","frankendancerVersion","VERSION_FIREDANCER","frankendancerUpdate","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","logrotateCommand","__name","config","program","command","description","action","isFiredancer","VALIDATOR_TYPE","updateLogrotate","process","exit","spawnSync","rmSnapshot","__name","config","spawnSync","shell","stdio","SNAPSHOTS_PATH","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","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","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","logrotateCommand","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"]}