@gabrielhicks/solv 5.4.3 → 5.4.4

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 CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var gT=Object.defineProperty;var t=(_,e)=>gT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as ia}from"commander";var it="5.4.3";var nt={name:"@gabrielhicks/solv",version:it,description:"Solana Validator CLI SOLV",main:"dist/index.js",type:"module",repository:"https://github.com/gabrielhicks/solv",keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",bin:{solv:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var De=nt.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",Tt="relayer-keypair.json",yT="mainnet-validator-keypair.json",GT="mainnet-vote-account-keypair.json",kT="mainnet-authority-keypair.json",VT="testnet-validator-keypair.json",bT="testnet-vote-account-keypair.json",wT="testnet-authority-keypair.json",g="/home/solv",L=`${g}/${U_}`,da=`${g}/${A_}`,b=`${g}/${yT}`,fe=`${g}/${GT}`,Na=`${g}/${kT}`,K=`${g}/${VT}`,Ue=`${g}/${bT}`,Oa=`${g}/${wT}`,X=`${g}/solana-validator.log`,t_=g+"/start-validator.sh",P="/mnt/ledger",g_="/mnt/accounts",o_="/mnt/snapshots",st="solana-validator",St="agave-validator",rt="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ae=3,Rt="https://api.testnet.solana.com",Ct="https://api.mainnet-beta.solana.com",at="https://verify.validators.solutions/solv-migrate",ct="https://jup.validators.solutions/v1/jup",AE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(AE||(AE={}));var dt=Object.values(AE),Le="So11111111111111111111111111111111111111112",Me="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",LE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Nt="SOLV420",Ot={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as YT}from"child_process";var i_="3.0.10",w="3.0.10",ee="3.0.10",L_="3.0.10",Ft="3.0.10",M_="3.0.10";var lt="20.17.0",K_="0.713.30008",y_="0.713.30008";import{spawnSync as B}from"node:child_process";var vT=t((_=w,e=!1,E=!1)=>{E?e?(B(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave-mod rev-parse HEAD) /tmp/v${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(B(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave rev-parse HEAD) /tmp/v${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?B(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):B(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),G_=vT;var It="agave-validator",HT=t(()=>{try{return It}catch(_){return console.error(_),It}},"getSolanaCLI"),n_=HT;var ue=t(async(_,e=!1,E=!1)=>{G_(_,e,E)},"updateVersion"),pe=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),YT(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import so from"chalk";var u_;(function(_){_.EN="en",_.JA="ja"})(u_||(u_={}));var Dt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Dt||(Dt={}));var Pt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(Pt||(Pt={}));var O_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(O_||(O_={}));var ft;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(ft||(ft={}));var Ut;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Ut||(Ut={}));var At;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(At||(At={}));var Lt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Lt||(Lt={}));var me;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(me||(me={}));var he;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(he||(he={}));var pt=!1,mt=!1,ht=!1,Bt=!1,Q={ID:"solv",LANG:u_.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"3.0.10",MAINNET_SOLANA_VERSION:"3.0.10",NODE_VERSION:"20.17.0",TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,SOLANA_NETWORK:"testnet",SOLV_TYPE:0,DISK_TYPES:1,IS_SETUP:!1,LANG_SETUP:!1,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:"ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG",IS_CLIENT:!1,VALIDATOR_IPS:[],MAINNET_TYPE:"SolanaClient",LEDGER_PATH:"/mnt/ledger",STAKE_ACCOUNT:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:"https://mainnet-beta.solana.com",KEYPAIR_PATH:"/home/solv/testnet-validator-keypair.json",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1},v={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},f={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},T_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},p={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",SOL_SYSTEM_CONFIG21:"/etc/sysctl.d/21-solana-validator.conf",SOL_NOFILES_CONF:"/etc/security/limits.d/90-solana-nofiles.conf",SOL_SYSTEM_CONF:"/etc/systemd/system.conf",SOLANA_PATH:"/home/solv/.local/share/solana/install"},h={MAINNET_VALIDATOR_KEY:"mainnet-validator-keypair.json",MAINNET_VALIDATOR_VOTE_KEY:"mainnet-vote-account-keypair.json",MAINNET_VALITATOR_AUTHORITY_KEY:"mainnet-authority-keypair.json",TESTNET_VALIDATOR_KEY:"testnet-validator-keypair.json",TESTNET_VALIDATOR_VOTE_KEY:"testnet-vote-account-keypair.json",TESTNET_VALITATOR_AUTHORITY_KEY:"testnet-authority-keypair.json"},U=t((_=v.ROOT)=>{let e=_===v.ROOT?v.ROOT:_,E=`${e}/${h.MAINNET_VALIDATOR_KEY}`,o=`${e}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${h.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${h.TESTNET_VALIDATOR_KEY}`,T=`${e}/${h.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${h.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),F_=t((_=!0)=>{let e=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_KEY}`,E=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_VOTE_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${v.ROOT}/${T_.LOG}`,i=f.ACCOUNTS,n=f.LEDGER,T=f.SNAPSHOTS,s=`${v.ROOT}/${T_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var e_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ME="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",gt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Kt=9,s_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",yt="So11111111111111111111111111111111111111112",Gt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",kt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Mt;(function(_){_[_.ELSOL=s_]="ELSOL",_[_.SOL=yt]="SOL",_[_.USDC=Gt]="USDC",_[_.EPCT=kt]="EPCT"})(Mt||(Mt={}));var ut;(function(_){_.V6_BASE_URL="https://quote-api.jup.ag/v6",_.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",_.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(ut||(ut={}));var Ka={[yt]:9,[s_]:9,[Gt]:6,[kt]:6},Be="/home/solv/currentEpoch.json",uE=.5,ge="https://api.testnet.solana.com";import{spawnSync as pE}from"child_process";var Vt=t(()=>{pE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=Q.NODE_VERSION;pE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),pE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var C_={version:"2.3.10",tag:"v2.3.10",commissionBps:0,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",shredReceiverAddr:"64.130.50.14:1002"},Ee={TESTNET:{Dallas:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.testnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.35.224:1002"}},MAINNET:{Amsterdam:{BLOCK_ENGINE_URL:"https://amsterdam.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://amsterdam.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"74.118.140.240:1002"},London:{BLOCK_ENGINE_URL:"https://london.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://london.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"142.91.127.175:1002"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.50.14:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.216.96:1002"},Tokyo:{BLOCK_ENGINE_URL:"https://tokyo.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://tokyo.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.9.160:1002"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://slc.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://slc.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.53.8:1002"},Singapore:{BLOCK_ENGINE_URL:"https://singapore.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://singapore.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.11.224:1002"}}};import{spawnSync as j}from"child_process";var Ke=t((_=C_.tag,e=!1,E=!1)=>{E?e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(j(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),j(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),j(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),j(`CI_COMMIT=$(git -C /tmp/${_}-jito rev-parse HEAD) /tmp/${_}-jito/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-jito`,{shell:!0,stdio:"inherit"}),j("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),j(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),j(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):j(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as JT,writeFile as xT}from"fs/promises";import{homedir as QT}from"os";var te=t(async _=>{let E=`${QT()}/${T_.JITO_CONFIG}`,i={...JSON.parse(await JT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await xT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as bt}from"child_process";import qT from"inquirer";var wt=t((_,e=!0)=>{let E=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",o=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";bt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;bt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),vt=t(async()=>await qT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as oe}from"@skeet-framework/utils";import $T from"chalk";import WT from"inquirer";var Ht=t(async()=>{let _=await WT.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await oe("sudo ufw delete allow 8899/udp"),await oe("sudo ufw delete allow 8899/tcp"),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await oe("sudo ufw reload"),console.log($T.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var XT=t(()=>it,"getSolvVersion"),k_=XT;import{readFile as ZT,writeFile as _s}from"fs/promises";import{existsAsync as es}from"@skeet-framework/utils";var mE;(function(_){_.EN="en",_.JA="ja"})(mE||(mE={}));var sc=Object.values(mE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var Yt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Jt=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.NONE="none"})(F||(F={}));var Sc=Object.values(F).filter(_=>_!=="none"),V;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(V||(V={}));var xt=Object.values(V).filter(_=>_!=="none"),q;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(q||(q={}));var zT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:q.TRIPLE,TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w,NODE_VERSION:lt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:rt,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ct,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:g_,SNAPSHOTS_PATH:o_,MOD:!1},a_=zT;import{homedir as Es}from"os";var ts=t(async()=>{let e=`${Es()}/${Pe}`;return await es(e)?JSON.parse(await ZT(e,"utf-8")):(console.log("Creating default config file at",e),await _s(e,JSON.stringify(a_,null,2)),a_)},"readConfig"),y=ts;import os from"node-fetch";var z=t(async _=>{try{let e=await y();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
2
+ var gT=Object.defineProperty;var t=(_,e)=>gT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as ia}from"commander";var it="5.4.4";var nt={name:"@gabrielhicks/solv",version:it,description:"Solana Validator CLI SOLV",main:"dist/index.js",type:"module",repository:"https://github.com/gabrielhicks/solv",keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",bin:{solv:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var De=nt.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",Tt="relayer-keypair.json",yT="mainnet-validator-keypair.json",GT="mainnet-vote-account-keypair.json",kT="mainnet-authority-keypair.json",VT="testnet-validator-keypair.json",bT="testnet-vote-account-keypair.json",wT="testnet-authority-keypair.json",g="/home/solv",L=`${g}/${U_}`,da=`${g}/${A_}`,b=`${g}/${yT}`,fe=`${g}/${GT}`,Na=`${g}/${kT}`,K=`${g}/${VT}`,Ue=`${g}/${bT}`,Oa=`${g}/${wT}`,X=`${g}/solana-validator.log`,t_=g+"/start-validator.sh",P="/mnt/ledger",g_="/mnt/accounts",o_="/mnt/snapshots",st="solana-validator",St="agave-validator",rt="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ae=3,Rt="https://api.testnet.solana.com",Ct="https://api.mainnet-beta.solana.com",at="https://verify.validators.solutions/solv-migrate",ct="https://jup.validators.solutions/v1/jup",AE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(AE||(AE={}));var dt=Object.values(AE),Le="So11111111111111111111111111111111111111112",Me="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",LE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Nt="SOLV420",Ot={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as YT}from"child_process";var i_="3.0.10",w="3.0.10",ee="3.0.10",L_="3.0.10",Ft="3.0.10",M_="3.0.10";var lt="20.17.0",K_="0.713.30008",y_="0.713.30008";import{spawnSync as B}from"node:child_process";var vT=t((_=w,e=!1,E=!1)=>{E?e?(B(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave-mod rev-parse HEAD) /tmp/v${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(B(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave rev-parse HEAD) /tmp/v${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?B(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):B(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),G_=vT;var It="agave-validator",HT=t(()=>{try{return It}catch(_){return console.error(_),It}},"getSolanaCLI"),n_=HT;var ue=t(async(_,e=!1,E=!1)=>{G_(_,e,E)},"updateVersion"),pe=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),YT(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import so from"chalk";var u_;(function(_){_.EN="en",_.JA="ja"})(u_||(u_={}));var Dt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Dt||(Dt={}));var Pt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(Pt||(Pt={}));var O_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(O_||(O_={}));var ft;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(ft||(ft={}));var Ut;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Ut||(Ut={}));var At;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(At||(At={}));var Lt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Lt||(Lt={}));var me;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(me||(me={}));var he;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(he||(he={}));var pt=!1,mt=!1,ht=!1,Bt=!1,Q={ID:"solv",LANG:u_.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"3.0.10",MAINNET_SOLANA_VERSION:"3.0.10",NODE_VERSION:"20.17.0",TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,SOLANA_NETWORK:"testnet",SOLV_TYPE:0,DISK_TYPES:1,IS_SETUP:!1,LANG_SETUP:!1,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:"ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG",IS_CLIENT:!1,VALIDATOR_IPS:[],MAINNET_TYPE:"SolanaClient",LEDGER_PATH:"/mnt/ledger",STAKE_ACCOUNT:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:"https://mainnet-beta.solana.com",KEYPAIR_PATH:"/home/solv/testnet-validator-keypair.json",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1},v={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},f={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},T_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},m={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",SOL_SYSTEM_CONFIG21:"/etc/sysctl.d/21-solana-validator.conf",SOL_NOFILES_CONF:"/etc/security/limits.d/90-solana-nofiles.conf",SOL_SYSTEM_CONF:"/etc/systemd/system.conf",SOLANA_PATH:"/home/solv/.local/share/solana/install"},h={MAINNET_VALIDATOR_KEY:"mainnet-validator-keypair.json",MAINNET_VALIDATOR_VOTE_KEY:"mainnet-vote-account-keypair.json",MAINNET_VALITATOR_AUTHORITY_KEY:"mainnet-authority-keypair.json",TESTNET_VALIDATOR_KEY:"testnet-validator-keypair.json",TESTNET_VALIDATOR_VOTE_KEY:"testnet-vote-account-keypair.json",TESTNET_VALITATOR_AUTHORITY_KEY:"testnet-authority-keypair.json"},U=t((_=v.ROOT)=>{let e=_===v.ROOT?v.ROOT:_,E=`${e}/${h.MAINNET_VALIDATOR_KEY}`,o=`${e}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${h.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${h.TESTNET_VALIDATOR_KEY}`,T=`${e}/${h.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${h.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),F_=t((_=!0)=>{let e=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_KEY}`,E=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_VOTE_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${v.ROOT}/${T_.LOG}`,i=f.ACCOUNTS,n=f.LEDGER,T=f.SNAPSHOTS,s=`${v.ROOT}/${T_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var e_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ME="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",gt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Kt=9,s_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",yt="So11111111111111111111111111111111111111112",Gt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",kt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Mt;(function(_){_[_.ELSOL=s_]="ELSOL",_[_.SOL=yt]="SOL",_[_.USDC=Gt]="USDC",_[_.EPCT=kt]="EPCT"})(Mt||(Mt={}));var ut;(function(_){_.V6_BASE_URL="https://quote-api.jup.ag/v6",_.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",_.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(ut||(ut={}));var Ka={[yt]:9,[s_]:9,[Gt]:6,[kt]:6},Be="/home/solv/currentEpoch.json",uE=.5,ge="https://api.testnet.solana.com";import{spawnSync as pE}from"child_process";var Vt=t(()=>{pE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=Q.NODE_VERSION;pE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),pE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var C_={version:"2.3.10",tag:"v2.3.10",commissionBps:0,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",shredReceiverAddr:"64.130.50.14:1002"},Ee={TESTNET:{Dallas:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.testnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.35.224:1002"}},MAINNET:{Amsterdam:{BLOCK_ENGINE_URL:"https://amsterdam.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://amsterdam.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"74.118.140.240:1002"},London:{BLOCK_ENGINE_URL:"https://london.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://london.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"142.91.127.175:1002"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.50.14:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.216.96:1002"},Tokyo:{BLOCK_ENGINE_URL:"https://tokyo.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://tokyo.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.9.160:1002"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://slc.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://slc.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.53.8:1002"},Singapore:{BLOCK_ENGINE_URL:"https://singapore.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://singapore.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.11.224:1002"}}};import{spawnSync as j}from"child_process";var Ke=t((_=C_.tag,e=!1,E=!1)=>{E?e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(j(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),j(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),j(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),j(`CI_COMMIT=$(git -C /tmp/${_}-jito rev-parse HEAD) /tmp/${_}-jito/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-jito`,{shell:!0,stdio:"inherit"}),j("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),j(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),j(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):j(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as JT,writeFile as xT}from"fs/promises";import{homedir as QT}from"os";var te=t(async _=>{let E=`${QT()}/${T_.JITO_CONFIG}`,i={...JSON.parse(await JT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await xT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as bt}from"child_process";import qT from"inquirer";var wt=t((_,e=!0)=>{let E=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",o=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";bt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;bt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),vt=t(async()=>await qT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as oe}from"@skeet-framework/utils";import $T from"chalk";import WT from"inquirer";var Ht=t(async()=>{let _=await WT.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await oe("sudo ufw delete allow 8899/udp"),await oe("sudo ufw delete allow 8899/tcp"),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await oe("sudo ufw reload"),console.log($T.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var XT=t(()=>it,"getSolvVersion"),k_=XT;import{readFile as ZT,writeFile as _s}from"fs/promises";import{existsAsync as es}from"@skeet-framework/utils";var mE;(function(_){_.EN="en",_.JA="ja"})(mE||(mE={}));var sc=Object.values(mE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var Yt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Jt=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.NONE="none"})(F||(F={}));var Sc=Object.values(F).filter(_=>_!=="none"),V;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(V||(V={}));var xt=Object.values(V).filter(_=>_!=="none"),q;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(q||(q={}));var zT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:q.TRIPLE,TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w,NODE_VERSION:lt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:rt,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ct,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:g_,SNAPSHOTS_PATH:o_,MOD:!1},a_=zT;import{homedir as Es}from"os";var ts=t(async()=>{let e=`${Es()}/${Pe}`;return await es(e)?JSON.parse(await ZT(e,"utf-8")):(console.log("Creating default config file at",e),await _s(e,JSON.stringify(a_,null,2)),a_)},"readConfig"),y=ts;import os from"node-fetch";var z=t(async _=>{try{let e=await y();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
3
  Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await os(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(E),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${_}`}),!1}},"sendDiscord");import{spawnSync as Ss}from"child_process";import{Connection as Qt}from"@solana/web3.js";var ie=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new Qt("https://api.testnet.solana.com"):new Qt(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(C=>C.votePubkey===e);if(!s)return T.delinquent.find(R=>R.votePubkey===e)?(i.isActive=!1,i.reason="Validator is delinquent.",i):(i.isActive=!1,i.reason="Validator is not found in both current and delinquent lists.",i);if(T=await n.getVoteAccounts(),s=T.current.find(C=>C.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,a=await n.getSlot()-S;return a>o?(i.isActive=!1,i.reason=`Validator has not voted for ${a} slots.`,i):(i.isActive=!0,i.reason="Validator is active and voting.",i)}catch(n){return console.error(n),i.isActive=!1,i.reason="Failed to check validator status.",i}},"isValidatorActive");import{spawnSync as is}from"child_process";var A=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=is(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ns=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),H=ns;import{sendDiscord as Ts}from"@skeet-framework/utils";var qt=10,ss=t(async _=>{try{let e=_.NETWORK===c.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=U(),n=A(e?o:E),T=await ie(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=qt){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${qt} minutes!
4
4
  Account: ${T.pubkey}
5
5
  Reason: ${T.reason}
6
6
  Message: Max retries reached, exiting catchup check...
7
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Ts(S),!1}console.log("Waiting for validator to catch up..."),await H(60*1e3),T=await ie(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),$t=ss;var rs=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=U(),n=e?o:i,T=!1;E?T=e?ht:Bt:T=e?pt:mt,T=T&&_.AUTO_RESTART;let s=A(n),S=`**${s}** updated solv to **${k_()}**`;if(await z(S),T){let r=`Restarting **${s}**`;await z(r);try{Ss("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(R){let N=`Error restarting **${s}**: ${R?.message||"Unknown error"}`;return await z(N),!1}let a=`**${s}** has restarted, catching up...`;await z(a),await H(180*1e3);let C=await $t(_);if(C){let R=`**${s}** has caught up!`;await z(R)}else{let R=`**${s}** failed to catch up after update`;await z(R)}return C}return!0},"autoUpdate"),Wt=rs;import{homedir as Rs}from"os";import{readFile as Cs,writeFile as Xt}from"fs/promises";import{existsAsync as as}from"@skeet-framework/utils";var M=t(async _=>{let E=`${Rs()}/${Pe}`;await as(E)||(console.log("Creating default config file at",E),await Xt(E,JSON.stringify(a_,null,2)));let i={...JSON.parse(await Cs(E,"utf8")),..._},n=JSON.stringify(i,null,2);await Xt(E,n)},"updateDefaultConfig");var cs={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solv commands",subcmdHelp:"Display help for subcommands",server:"Open solv Dashboard",start:"Start Solana Validator",stop:"Stop Solana Validator",status:"Show Solana Validator Status",restart:"Restart Solana Validator",update:"Update Solana Validator Version",get:"Get Solana Validator Info Commands",log:"Tail Solana Validator Log",catchup:"Catchup Solana Validator",monitor:"Monitor Solana Validator",config:"Show Solana Validator Config",install:"Install/Update Solana Version",stake:"Solana Delegate Stake",check:"Check Solana Validator",scp:"Download/Upload Solana Validator Keypairs",cron:"Run Schedule Tasks",setup:"Setup Solana Validator",epoch:"Show Current Epoch",slot:"Show Current Slot",solv:"Endroll Solv AA",installer:"Please select an option:",unstake:"UnStake"},ye=cs;var ds={description:"\u{1F48E} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30AA\u30FC\u30EB\u30A4\u30F3\u30EF\u30F3 CLI \u30C4\u30FC\u30EB \u{1F48E}",version:"\u73FE\u5728\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B",help:"solv \u30B3\u30DE\u30F3\u30C9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u8A73\u7D30\u3092\u8868\u793A",subcmdHelp:"\u30B5\u30D6\u30B3\u30DE\u30F3\u30C9\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A",server:"solv \u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u3092\u958B\u304F",start:"\u30CE\u30FC\u30C9\u3092\u8D77\u52D5",stop:"\u30CE\u30FC\u30C9\u3092\u505C\u6B62",status:"\u30CE\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u8868\u793A",restart:"\u30CE\u30FC\u30C9\u3092\u518D\u8D77\u52D5",update:"\u30CE\u30FC\u30C9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0",get:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u60C5\u5831\u3092\u53D6\u5F97 \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",log:"\u30CE\u30FC\u30C9\u306E\u30ED\u30B0\u3092\u8868\u793A",catchup:"\u30CE\u30FC\u30C9\u3092\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7",monitor:"\u30CE\u30FC\u30C9\u3092\u76E3\u8996",config:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u3092\u8868\u793A",install:"\u30BD\u30E9\u30CA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",stake:"\u30BD\u30E9\u30CA\u306E\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",unstake:"\u30BD\u30E9\u30CA\u306E\u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",check:"\u30CE\u30FC\u30C9\u306E\u72B6\u614B\u3092\u30C1\u30A7\u30C3\u30AF",scp:"scp \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",cron:"\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30BF\u30B9\u30AF \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",setup:"\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u3092\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7",epoch:"\u73FE\u5728\u306E\u30A8\u30DD\u30C3\u30AF\u3092\u8868\u793A",slot:"\u73FE\u5728\u306E\u30B9\u30ED\u30C3\u30C8\u3092\u8868\u793A",solv:"Solv\u30A8\u30F3\u30C9\u30ED\u30FC\u30EB AA \u3092\u8868\u793A",installer:"\u4EE5\u4E0B\u304B\u3089\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:"},jt=ds;var Ns={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solv installer \u{1F525}",description:"solv is born and ready for running Solana Validator Nodes \u{1F680}"}},Ge=Ns;var Os={success:{created:"\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F"},error:{failed:"\u5931\u6557\u3057\u307E\u3057\u305F"},installer:{welcomeMsg:"\u{1F525} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30C4\u30FC\u30EB solv \u3078\u3088\u3046\u3053\u305D \u{1F525}",description:"\u3042\u306A\u305F\u306F\u3082\u3046\u3001\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306B\u306A\u308B\u6E96\u5099\u304C\u3067\u304D\u3066\u3044\u307E\u3059\u3002"}},zt=Os;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Ve=[[],[") Check Validator Status",") Show Validator Logs",") Start Validator",") Stop Validator",") Restart Validator (no fetch snapshot)",") Restart Validator (fetch snapshot)",") Return to Main Menu"],[") Show Validator Config",") Register Validator Info",") Show Validator Keys Path/Address/Balance",") Get Current Epoch/Slot",") Get Solana Validator Catchup Info",") Get Solana Validator Monitor Info",") Return to Main Menu"],[") Backup Validator Keyfiles",") Set Validator Keyfile/Network",") Return to Main Menu"],[") Stake",") Unstake",") Return to Main Menu"],[],[]];var Zt=[") \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9 - Solana\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8/\u30C0\u30A6\u30F3\u30B0\u30EC\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B/\u30ED\u30B0\u3092\u78BA\u8A8D\u30FB\u307E\u305F\u306F\u958B\u59CB/\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u60C5\u5831",") \u9375\u306E\u8A2D\u5B9A",") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"],_o=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var Fs={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},be=Fs;var ls={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},eo=ls;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Eo=[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u4F5C\u6210",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"];var Is=t(_=>{let e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};switch(_){case u_.EN:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};break;case u_.JA:e={cmds:jt,subCmds:eo,logs:zt,installer:Zt,installerSub:_o,clientCmds:Eo};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),to=Is;import{existsSync as Us,readFileSync as As,writeFileSync as oo}from"fs";import{readFileSync as Ds,writeFileSync as Ps}from"fs";import{homedir as fs}from"os";var V_=t(_=>{let E=`${fs()}/${T_.CONFIG}`,i={...JSON.parse(Ds(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ps(E,n)},"updateSolvConfig");import{homedir as Ls}from"os";var io=t(()=>{let e=`${Ls()}/${T_.CONFIG}`;Us(e)||(oo(e,JSON.stringify(Q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(As(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),oo(e,JSON.stringify(Q,null,2)),E=Q}let o=to(E.LANG);return E.RPC_URL||(E.RPC_URL=Q.RPC_URL,V_({RPC_URL:Q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,V_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",V_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as k}from"child_process";import{promises as no}from"fs";import us from"path";var Ms=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Ts(S),!1}console.log("Waiting for validator to catch up..."),await H(60*1e3),T=await ie(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),$t=ss;var rs=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=U(),n=e?o:i,T=!1;E?T=e?ht:Bt:T=e?pt:mt,T=T&&_.AUTO_RESTART;let s=A(n),S=`**${s}** updated solv to **${k_()}**`;if(await z(S),T){let r=`Restarting **${s}**`;await z(r);try{Ss("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(R){let N=`Error restarting **${s}**: ${R?.message||"Unknown error"}`;return await z(N),!1}let a=`**${s}** has restarted, catching up...`;await z(a),await H(180*1e3);let C=await $t(_);if(C){let R=`**${s}** has caught up!`;await z(R)}else{let R=`**${s}** failed to catch up after update`;await z(R)}return C}return!0},"autoUpdate"),Wt=rs;import{homedir as Rs}from"os";import{readFile as Cs,writeFile as Xt}from"fs/promises";import{existsAsync as as}from"@skeet-framework/utils";var M=t(async _=>{let E=`${Rs()}/${Pe}`;await as(E)||(console.log("Creating default config file at",E),await Xt(E,JSON.stringify(a_,null,2)));let i={...JSON.parse(await Cs(E,"utf8")),..._},n=JSON.stringify(i,null,2);await Xt(E,n)},"updateDefaultConfig");var cs={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solv commands",subcmdHelp:"Display help for subcommands",server:"Open solv Dashboard",start:"Start Solana Validator",stop:"Stop Solana Validator",status:"Show Solana Validator Status",restart:"Restart Solana Validator",update:"Update Solana Validator Version",get:"Get Solana Validator Info Commands",log:"Tail Solana Validator Log",catchup:"Catchup Solana Validator",monitor:"Monitor Solana Validator",config:"Show Solana Validator Config",install:"Install/Update Solana Version",stake:"Solana Delegate Stake",check:"Check Solana Validator",scp:"Download/Upload Solana Validator Keypairs",cron:"Run Schedule Tasks",setup:"Setup Solana Validator",epoch:"Show Current Epoch",slot:"Show Current Slot",solv:"Endroll Solv AA",installer:"Please select an option:",unstake:"UnStake"},ye=cs;var ds={description:"\u{1F48E} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30AA\u30FC\u30EB\u30A4\u30F3\u30EF\u30F3 CLI \u30C4\u30FC\u30EB \u{1F48E}",version:"\u73FE\u5728\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B",help:"solv \u30B3\u30DE\u30F3\u30C9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u8A73\u7D30\u3092\u8868\u793A",subcmdHelp:"\u30B5\u30D6\u30B3\u30DE\u30F3\u30C9\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A",server:"solv \u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u3092\u958B\u304F",start:"\u30CE\u30FC\u30C9\u3092\u8D77\u52D5",stop:"\u30CE\u30FC\u30C9\u3092\u505C\u6B62",status:"\u30CE\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u8868\u793A",restart:"\u30CE\u30FC\u30C9\u3092\u518D\u8D77\u52D5",update:"\u30CE\u30FC\u30C9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0",get:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u60C5\u5831\u3092\u53D6\u5F97 \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",log:"\u30CE\u30FC\u30C9\u306E\u30ED\u30B0\u3092\u8868\u793A",catchup:"\u30CE\u30FC\u30C9\u3092\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7",monitor:"\u30CE\u30FC\u30C9\u3092\u76E3\u8996",config:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u3092\u8868\u793A",install:"\u30BD\u30E9\u30CA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",stake:"\u30BD\u30E9\u30CA\u306E\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",unstake:"\u30BD\u30E9\u30CA\u306E\u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",check:"\u30CE\u30FC\u30C9\u306E\u72B6\u614B\u3092\u30C1\u30A7\u30C3\u30AF",scp:"scp \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",cron:"\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30BF\u30B9\u30AF \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",setup:"\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u3092\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7",epoch:"\u73FE\u5728\u306E\u30A8\u30DD\u30C3\u30AF\u3092\u8868\u793A",slot:"\u73FE\u5728\u306E\u30B9\u30ED\u30C3\u30C8\u3092\u8868\u793A",solv:"Solv\u30A8\u30F3\u30C9\u30ED\u30FC\u30EB AA \u3092\u8868\u793A",installer:"\u4EE5\u4E0B\u304B\u3089\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:"},jt=ds;var Ns={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solv installer \u{1F525}",description:"solv is born and ready for running Solana Validator Nodes \u{1F680}"}},Ge=Ns;var Os={success:{created:"\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F"},error:{failed:"\u5931\u6557\u3057\u307E\u3057\u305F"},installer:{welcomeMsg:"\u{1F525} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30C4\u30FC\u30EB solv \u3078\u3088\u3046\u3053\u305D \u{1F525}",description:"\u3042\u306A\u305F\u306F\u3082\u3046\u3001\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306B\u306A\u308B\u6E96\u5099\u304C\u3067\u304D\u3066\u3044\u307E\u3059\u3002"}},zt=Os;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Ve=[[],[") Check Validator Status",") Show Validator Logs",") Start Validator",") Stop Validator",") Restart Validator (no fetch snapshot)",") Restart Validator (fetch snapshot)",") Return to Main Menu"],[") Show Validator Config",") Register Validator Info",") Show Validator Keys Path/Address/Balance",") Get Current Epoch/Slot",") Get Solana Validator Catchup Info",") Get Solana Validator Monitor Info",") Return to Main Menu"],[") Backup Validator Keyfiles",") Set Validator Keyfile/Network",") Return to Main Menu"],[") Stake",") Unstake",") Return to Main Menu"],[],[]];var Zt=[") \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9 - Solana\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8/\u30C0\u30A6\u30F3\u30B0\u30EC\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B/\u30ED\u30B0\u3092\u78BA\u8A8D\u30FB\u307E\u305F\u306F\u958B\u59CB/\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u60C5\u5831",") \u9375\u306E\u8A2D\u5B9A",") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"],_o=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var Fs={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},be=Fs;var ls={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},eo=ls;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Eo=[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u4F5C\u6210",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"];var Is=t(_=>{let e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};switch(_){case u_.EN:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};break;case u_.JA:e={cmds:jt,subCmds:eo,logs:zt,installer:Zt,installerSub:_o,clientCmds:Eo};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),to=Is;import{existsSync as Us,readFileSync as As,writeFileSync as oo}from"fs";import{readFileSync as Ds,writeFileSync as Ps}from"fs";import{homedir as fs}from"os";var V_=t(_=>{let E=`${fs()}/${T_.CONFIG}`,i={...JSON.parse(Ds(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ps(E,n)},"updateSolvConfig");import{homedir as Ls}from"os";var io=t(()=>{let e=`${Ls()}/${T_.CONFIG}`;Us(e)||(oo(e,JSON.stringify(Q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(As(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),oo(e,JSON.stringify(Q,null,2)),E=Q}let o=to(E.LANG);return E.RPC_URL||(E.RPC_URL=Q.RPC_URL,V_({RPC_URL:Q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,V_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",V_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as G}from"child_process";import{promises as no}from"fs";import us from"path";var Ms=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
8
8
  index a0c631ee9f..048b118660 100644
9
9
  --- a/book/api/metrics-generated.md
10
10
  +++ b/book/api/metrics-generated.md
@@ -5789,7 +5789,7 @@ index 479e0f1829..a97f5778d4 100644
5789
5789
 
5790
5790
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5791
5791
  at the NOTICE level to the logger. E.g. for a typical fd_log
5792
- `;return{filePath:_,body:e}},"modDiff"),ve=Ms;var To=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?K_:y_),n=E||_.MOD,{filePath:T,body:s}=ve();n?(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await no.mkdir(us.dirname(T),{recursive:!0}),await no.writeFile(T,s,"utf8"),k(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add .",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),k("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as ps}from"node:child_process";var So=t(_=>{let e=_.NETWORK===c.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===F.JITO,i=_.VALIDATOR_TYPE===F.FRANKENDANCER,n=_.AUTO_RESTART,T=_.MOD,s=10;n&&!e&&(s=30);let S=e?i_:w;o&&(S=L_,e&&(S=ee)),i&&(S=y_,e&&(S=K_)),E&&(S=M_,o&&(S=Ft)),d.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${S}`,S).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).option("--mod","Modified Versions",!1).action(async r=>{let a=k_(),C=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(so.white(`Current solv version: ${a}`)),r.auto){await Wt(_);return}if(r.migrateConfig){let R=io().config,N=q.TRIPLE;R.DISK_TYPES===0?N=q.DOUBLE:R.DISK_TYPES===1?N=q.SINGLE:N=q.TRIPLE;let I=R.SOLANA_NETWORK===O_.TESTNET,O=R.SOLV_TYPE===me.RPC_NODE,l=R.MAINNET_TYPE===he.JITO_MEV,G={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:N,RPC_TYPE:O?V.JITO:V.NONE,VALIDATOR_TYPE:l?F.JITO:I?F.AGAVE:F.SOLANA,TESTNET_SOLANA_VERSION:R.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:R.MAINNET_SOLANA_VERSION,NODE_VERSION:R.NODE_VERSION,TESTNET_DELINQUENT_STAKE:R.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:R.MAINNET_DELINQUENT_STAKE,COMMISSION:R.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:R.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:R.STAKE_ACCOUNT,HARVEST_ACCOUNT:R.HARVEST_ACCOUNT,IS_MEV_MODE:R.IS_MEV_MODE,RPC_URL:R.RPC_URL,KEYPAIR_PATH:R.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:R.DISCORD_WEBHOOK_URL,AUTO_UPDATE:R.AUTO_UPDATE,AUTO_RESTART:R.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:R.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await M(G)}if(r.config){if(await M({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){let R=e?ee:L_;await te({version:R,tag:`v${R}`})}console.log(so.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(r.firewall){await Ht();return}if(r.background){let R=r.version,N=!!R.startsWith("3");if(await M({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){Ke(`v${R}`,r.mod||T,N),await te({version:R,tag:`v${R}`}),await pe(C,!0,s);return}if(i){await To(_,R,r.mod||T),await pe(C,!0,s);return}await ue(R,r.mod||T,N);let I=e?10:5;e&&ps("solv start",{stdio:"inherit",shell:!0}),await pe(I,!0,s);return}else if(r.commission){let R=await vt();wt(R.commission,e)}else Vt()})},"updateCommands");import{spawnSync as ms}from"node:child_process";var ro=t(_=>{try{let{log:e}=F_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=ms(E,{shell:!0,stdio:"inherit"});if(o.error)throw o.error;o.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):o.status!==0&&(console.error(`Child process exited with code ${o.status}`),process.exit(o.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Ro=t(()=>{d.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(_=>{ro(_)})},"logCommands");import d_ from"chalk";import{spawnSync as hs}from"child_process";import{homedir as Bs}from"os";var He=t(_=>{let e=Bs(),E=U(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=O_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=O_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=O_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;hs(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ye}from"child_process";import{existsSync as Co,readdirSync as gs,rmSync as Ks}from"fs";import{homedir as ys}from"os";import ao from"path";var Je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[h.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[h.TESTNET_VALIDATOR_KEY,h.TESTNET_VALITATOR_AUTHORITY_KEY,h.TESTNET_VALIDATOR_VOTE_KEY,h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Ye(o,{shell:!0,stdio:"ignore"});let i=gs("./").filter(S=>S.endsWith("SV.json")),n=ys(),T=ao.join(n,"unstaked-identity.json");Co(T)&&Ye(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=ao.join(n,e[s]);if(s++,Co(r)){console.log(`${r} is already exist!`),Ks(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;Ye(a,{shell:!0,stdio:"inherit"})}Ye("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as No}from"child_process";var Gs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5792
+ `;return{filePath:_,body:e}},"modDiff"),ve=Ms;var To=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?K_:y_),n=E||_.MOD,{filePath:T,body:s}=ve();n?(G("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),G(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),G("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),G('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),G('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await no.mkdir(us.dirname(T),{recursive:!0}),await no.writeFile(T,s,"utf8"),G(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),G(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),G("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),G("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),G('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(G("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),G(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),G("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),G("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),G("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),G("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),G("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as ps}from"node:child_process";var So=t(_=>{let e=_.NETWORK===c.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===F.JITO,i=_.VALIDATOR_TYPE===F.FRANKENDANCER,n=_.AUTO_RESTART,T=_.MOD,s=10;n&&!e&&(s=30);let S=e?i_:w;o&&(S=L_,e&&(S=ee)),i&&(S=y_,e&&(S=K_)),E&&(S=M_,o&&(S=Ft)),d.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${S}`,S).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).option("--mod","Modified Versions",!1).action(async r=>{let a=k_(),C=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(so.white(`Current solv version: ${a}`)),r.auto){await Wt(_);return}if(r.migrateConfig){let R=io().config,N=q.TRIPLE;R.DISK_TYPES===0?N=q.DOUBLE:R.DISK_TYPES===1?N=q.SINGLE:N=q.TRIPLE;let I=R.SOLANA_NETWORK===O_.TESTNET,O=R.SOLV_TYPE===me.RPC_NODE,l=R.MAINNET_TYPE===he.JITO_MEV,k={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:N,RPC_TYPE:O?V.JITO:V.NONE,VALIDATOR_TYPE:l?F.JITO:I?F.AGAVE:F.SOLANA,TESTNET_SOLANA_VERSION:R.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:R.MAINNET_SOLANA_VERSION,NODE_VERSION:R.NODE_VERSION,TESTNET_DELINQUENT_STAKE:R.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:R.MAINNET_DELINQUENT_STAKE,COMMISSION:R.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:R.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:R.STAKE_ACCOUNT,HARVEST_ACCOUNT:R.HARVEST_ACCOUNT,IS_MEV_MODE:R.IS_MEV_MODE,RPC_URL:R.RPC_URL,KEYPAIR_PATH:R.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:R.DISCORD_WEBHOOK_URL,AUTO_UPDATE:R.AUTO_UPDATE,AUTO_RESTART:R.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:R.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await M(k)}if(r.config){if(await M({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){let R=e?ee:L_;await te({version:R,tag:`v${R}`})}console.log(so.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(r.firewall){await Ht();return}if(r.background){let R=r.version,N=!!R.startsWith("3");if(await M({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){Ke(`v${R}`,r.mod||T,N),await te({version:R,tag:`v${R}`}),await pe(C,!0,s);return}if(i){await To(_,R,r.mod||T),await pe(C,!0,s);return}await ue(R,r.mod||T,N);let I=e?10:5;e&&ps("solv start",{stdio:"inherit",shell:!0}),await pe(I,!0,s);return}else if(r.commission){let R=await vt();wt(R.commission,e)}else Vt()})},"updateCommands");import{spawnSync as ms}from"node:child_process";var ro=t(_=>{try{let{log:e}=F_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=ms(E,{shell:!0,stdio:"inherit"});if(o.error)throw o.error;o.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):o.status!==0&&(console.error(`Child process exited with code ${o.status}`),process.exit(o.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Ro=t(()=>{d.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(_=>{ro(_)})},"logCommands");import d_ from"chalk";import{spawnSync as hs}from"child_process";import{homedir as Bs}from"os";var He=t(_=>{let e=Bs(),E=U(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=O_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=O_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=O_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;hs(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ye}from"child_process";import{existsSync as Co,readdirSync as gs,rmSync as Ks}from"fs";import{homedir as ys}from"os";import ao from"path";var Je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[h.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[h.TESTNET_VALIDATOR_KEY,h.TESTNET_VALITATOR_AUTHORITY_KEY,h.TESTNET_VALIDATOR_VOTE_KEY,h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Ye(o,{shell:!0,stdio:"ignore"});let i=gs("./").filter(S=>S.endsWith("SV.json")),n=ys(),T=ao.join(n,"unstaked-identity.json");Co(T)&&Ye(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=ao.join(n,e[s]);if(s++,Co(r)){console.log(`${r} is already exist!`),Ks(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;Ye(a,{shell:!0,stdio:"inherit"})}Ye("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as No}from"child_process";var Gs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5793
5793
  Description=Jupiter API Service Instance
5794
5794
  After=network.target
5795
5795
 
@@ -6020,13 +6020,13 @@ exec agave-validator \\
6020
6020
  --maximum-full-snapshots-to-retain 1 \\
6021
6021
  --maximum-incremental-snapshots-to-retain 4 \\
6022
6022
  `,"startTestnetAgaveValidatorScript");import{existsAsync as Mo}from"@skeet-framework/utils";import{writeFile as uo}from"fs/promises";var _S=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===c.MAINNET?(console.log("Mainnet Validator Node Setup"),await eS(_,e)):E===c.TESTNET?(console.log("Testnet Validator Node Setup"),await ES(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),eS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MAINNET_SOLANA_VERSION:o,MOD:i}=_;e=i;let n="",T=!!o.startsWith("3");switch(E){case F.SOLANA:gE(o),n=Lo(_);break;case F.JITO:console.log("JITO Validator Setup for Mainnet");let s=await c_();se(o,e,T),n=Uo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await Mo(t_)){console.log("Startup script already exists. Skipping...");return}await uo(t_,n,"utf-8"),Se()},"setupMainnetValidator"),ES=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o}=_;e=o;let i="",n=!!_.TESTNET_SOLANA_VERSION.startsWith("3");switch(E){case F.SOLANA:gE(_.TESTNET_SOLANA_VERSION),i=KE(_);case F.AGAVE:console.log("Agave Validator Setup for Testnet"),G_(_.TESTNET_SOLANA_VERSION,e,n),i=KE(_);break;case F.JITO:console.log("JITO Validator Setup for Testnet");let T=await c_();se(_.TESTNET_SOLANA_VERSION,e,n),i=Ao(T.commissionBps,T.relayerUrl,T.blockEngineUrl,T.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Testnet");break}if(await Mo(t_)){console.log("Startup script already exists. Skipping...");return}await uo(t_,i,"utf-8"),Se()},"setupTestnetValidator"),po=_S;import Ei from"chalk";import{execSync as mo}from"node:child_process";function ho(_){try{mo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{mo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(ho,"createDirectoryIfNotExists");var Bo=t(()=>{try{let _=[f.ACCOUNTS,f.LEDGER,f.SNAPSHOTS];for(let e of _)ho(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as tS}from"child_process";function oS(){let e=tS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6023
- `).slice(1),E=[],o=e.map(O=>O.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let O of e){let[l,G,u]=O.trim().split(/\s+/);if(!l||!G)continue;let x=parseInt(G,10);if(isNaN(x))continue;let r_=u!==void 0&&u!=="";u==="/"&&(S=l.replace(/p?\d*$/,""));let f_=o.some(Z_=>Z_!==l&&Z_.startsWith(l)),z_=l.startsWith("nvme")?"NVMe":"SATA";x>=400*1024*1024*1024&&E.push({name:l,size:x,mountpoint:u||"",isMounted:r_,hasPartition:f_,type:z_})}console.log("Found root disk name: ",S);let r=o.filter(O=>O.startsWith(S));r.forEach(O=>console.log("Found root disk partition: ",O));let C=E.filter(O=>!r.includes(O.name)).sort((O,l)=>l.size-O.size),R=C.filter(O=>O.type==="NVMe").sort((O,l)=>l.size-O.size),N=C.filter(O=>O.type==="SATA").sort((O,l)=>l.size-O.size),I=[...R,...N];if(I.length>0){let O=I[0];if(O.size>=850*1024*1024*1024&&!O.isMounted&&(i=!0),O.size>=1250*1024*1024*1024&&O.isMounted&&(T=!0),I.length>1){let l=I[1];l.size>=400*1024*1024*1024&&!l.isMounted&&(n=!0)}if(I.length>2){let l=I[2];l.size>=400*1024*1024*1024&&!l.isMounted&&(s=!0)}}return I.forEach((O,l)=>console.log(`Prioritized Disk ${l+1}: ${O.name} ${O.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(oS,"getPreferredDisks");var re=oS;import{spawnSync as b_}from"child_process";var l_=t(_=>{if(b_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return b_(E,{shell:!0,stdio:"inherit"}),b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Qe}from"child_process";async function yE(_){for(let e=1;e<=5;e++){let o=Qe(`sudo blkid -s UUID -o value ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(o)return console.log(`[SUCCESS] Found UUID for ${_}: ${o}`),`UUID=${o}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${_}`),await H(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(yE,"getUUID");var Re=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await yE(_),T=await yE(e),s=await yE(E),S=`${n} ${f.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6023
+ `).slice(1),E=[],o=e.map(O=>O.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let O of e){let[l,k,p]=O.trim().split(/\s+/);if(!l||!k)continue;let x=parseInt(k,10);if(isNaN(x))continue;let r_=p!==void 0&&p!=="";p==="/"&&(S=l.replace(/p?\d*$/,""));let f_=o.some(Z_=>Z_!==l&&Z_.startsWith(l)),z_=l.startsWith("nvme")?"NVMe":"SATA";x>=400*1024*1024*1024&&E.push({name:l,size:x,mountpoint:p||"",isMounted:r_,hasPartition:f_,type:z_})}console.log("Found root disk name: ",S);let r=o.filter(O=>O.startsWith(S));r.forEach(O=>console.log("Found root disk partition: ",O));let C=E.filter(O=>!r.includes(O.name)).sort((O,l)=>l.size-O.size),R=C.filter(O=>O.type==="NVMe").sort((O,l)=>l.size-O.size),N=C.filter(O=>O.type==="SATA").sort((O,l)=>l.size-O.size),I=[...R,...N];if(I.length>0){let O=I[0];if(O.size>=850*1024*1024*1024&&!O.isMounted&&(i=!0),O.size>=1250*1024*1024*1024&&O.isMounted&&(T=!0),I.length>1){let l=I[1];l.size>=400*1024*1024*1024&&!l.isMounted&&(n=!0)}if(I.length>2){let l=I[2];l.size>=400*1024*1024*1024&&!l.isMounted&&(s=!0)}}return I.forEach((O,l)=>console.log(`Prioritized Disk ${l+1}: ${O.name} ${O.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(oS,"getPreferredDisks");var re=oS;import{spawnSync as b_}from"child_process";var l_=t(_=>{if(b_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return b_(E,{shell:!0,stdio:"inherit"}),b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Qe}from"child_process";async function yE(_){for(let e=1;e<=5;e++){let o=Qe(`sudo blkid -s UUID -o value ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(o)return console.log(`[SUCCESS] Found UUID for ${_}: ${o}`),`UUID=${o}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${_}`),await H(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(yE,"getUUID");var Re=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await yE(_),T=await yE(e),s=await yE(E),S=`${n} ${f.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6024
6024
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6025
6025
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0
6026
6026
  ${s} ${f.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],C=Qe("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let N of r)C.includes(N)||(console.log(`[INFO] Line to add: ${N}`),R.push(N));if(R.length){console.log(`[INFO] Lines to add all: ${R}`);let N=`echo "${R.join(`
6027
6027
  `)}" | sudo tee -a /etc/fstab`;Qe(N,{shell:!0,encoding:"utf8"}),Qe("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6028
6028
  ${R.join(`
6029
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as iS}from"child_process";var go=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=iS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var nS=t(async()=>{let _=re(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await M({MNT_DISK_TYPE:q.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=l_(E),T=l_(o),s=l_(i),S=n?E:"",r=T?o:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await H(5e3),await Re(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await M({MNT_DISK_TYPE:q.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=l_(E),n=l_(o);await Re(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await M({MNT_DISK_TYPE:q.SINGLE}),e.includes("/mnt")){go(e);let E="/dev/"+_.disks[0].name;l_(E),await Re(E)}else{let E="/dev/"+_.disks[0].name;l_(E),await Re(E)}},"mountDirs"),Ko=nS;import{spawnSync as TS}from"child_process";var yo=t(()=>{let _=[`sudo mkdir -p ${f.ROOT}`,`sudo chown -R solv:solv ${f.ROOT}`,`sudo chmod -R 755 ${f.ROOT}`,`sudo mkdir -p ${f.ACCOUNTS}`,`sudo chown -R solv:solv ${f.ACCOUNTS}`,`sudo chmod -R 755 ${f.ACCOUNTS}`,`sudo mkdir -p ${f.LEDGER}`,`sudo chown -R solv:solv ${f.LEDGER}`,`sudo chmod -R 755 ${f.LEDGER}`,`sudo mkdir -p ${f.SNAPSHOTS}`,`sudo chown -R solv:solv ${f.SNAPSHOTS}`,`sudo chmod -R 755 ${f.SNAPSHOTS}`];for(let e of _)TS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as qe}from"child_process";import{existsSync as sS}from"fs";function Go(){if(!sS(p.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6029
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as iS}from"child_process";var go=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=iS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var nS=t(async()=>{let _=re(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await M({MNT_DISK_TYPE:q.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=l_(E),T=l_(o),s=l_(i),S=n?E:"",r=T?o:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await H(5e3),await Re(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await M({MNT_DISK_TYPE:q.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=l_(E),n=l_(o);await Re(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await M({MNT_DISK_TYPE:q.SINGLE}),e.includes("/mnt")){go(e);let E="/dev/"+_.disks[0].name;l_(E),await Re(E)}else{let E="/dev/"+_.disks[0].name;l_(E),await Re(E)}},"mountDirs"),Ko=nS;import{spawnSync as TS}from"child_process";var yo=t(()=>{let _=[`sudo mkdir -p ${f.ROOT}`,`sudo chown -R solv:solv ${f.ROOT}`,`sudo chmod -R 755 ${f.ROOT}`,`sudo mkdir -p ${f.ACCOUNTS}`,`sudo chown -R solv:solv ${f.ACCOUNTS}`,`sudo chmod -R 755 ${f.ACCOUNTS}`,`sudo mkdir -p ${f.LEDGER}`,`sudo chown -R solv:solv ${f.LEDGER}`,`sudo chmod -R 755 ${f.LEDGER}`,`sudo mkdir -p ${f.SNAPSHOTS}`,`sudo chown -R solv:solv ${f.SNAPSHOTS}`,`sudo chmod -R 755 ${f.SNAPSHOTS}`];for(let e of _)TS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as qe}from"child_process";import{existsSync as sS}from"fs";function Go(){if(!sS(m.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6030
6030
  # Increase UDP buffer sizes
6031
6031
  net.core.rmem_default = 134217728
6032
6032
  net.core.rmem_max = 134217728
@@ -6041,7 +6041,7 @@ fs.nr_open = 1000000
6041
6041
  `,e=`
6042
6042
  # Increase process file descriptor count limit
6043
6043
  * - nofile 1000000
6044
- `;qe(`echo "${_}" | sudo tee ${p.SOL_SYSTEM_CONFIG21} > /dev/null`),qe(`sudo sysctl -p ${p.SOL_SYSTEM_CONFIG21}`),qe(`echo "DefaultFILE=1000000" | sudo tee -a ${p.SOL_SYSTEM_CONF}`),qe(`echo "${e}" | sudo tee ${p.SOL_NOFILES_CONF} > /dev/null`)}}t(Go,"setupSystemd");var GE=t((_=Q.USERNAME,e)=>{let{log:E}=F_(),o=e?"frankendancer":"agave",i=`${E} {
6044
+ `;qe(`echo "${_}" | sudo tee ${m.SOL_SYSTEM_CONFIG21} > /dev/null`),qe(`sudo sysctl -p ${m.SOL_SYSTEM_CONFIG21}`),qe(`echo "DefaultFILE=1000000" | sudo tee -a ${m.SOL_SYSTEM_CONF}`),qe(`echo "${e}" | sudo tee ${m.SOL_NOFILES_CONF} > /dev/null`)}}t(Go,"setupSystemd");var GE=t((_=Q.USERNAME,e)=>{let{log:E}=F_(),o=e?"frankendancer":"agave",i=`${E} {
6045
6045
  su ${_} ${_}
6046
6046
  daily
6047
6047
  rotate 1
@@ -6073,7 +6073,7 @@ fs.nr_open = 1000000
6073
6073
  compress
6074
6074
  copytruncate
6075
6075
  }
6076
- `),i)},"logRotates");import{existsSync as ko}from"fs";import{execSync as Vo}from"child_process";function w_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&ko(p.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!ko(p.SOL_LOGROTATE)){let e=GE("solv",_);Vo(`echo "${e}" | sudo tee ${p.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=GE("solv",_);Vo(`echo "${e}" | sudo tee ${p.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(w_,"setupLogrotate");var SS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",rS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",RS=`/home/${Q.USERNAME}/.local/share/solana/install/active_release/bin`,bo=t((_=!0)=>{let{scriptPath:e}=F_(_),E=_?rS:SS,o=RS;return`[Unit]
6076
+ `),i)},"logRotates");import{existsSync as ko}from"fs";import{execSync as Vo}from"child_process";function w_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&ko(m.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!ko(m.SOL_LOGROTATE)){let e=GE("solv",_);Vo(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=GE("solv",_);Vo(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(w_,"setupLogrotate");var SS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",rS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",RS=`/home/${Q.USERNAME}/.local/share/solana/install/active_release/bin`,bo=t((_=!0)=>{let{scriptPath:e}=F_(_),E=_?rS:SS,o=RS;return`[Unit]
6077
6077
  Description=Solana Validator
6078
6078
  After=network.target
6079
6079
  StartLimitIntervalSec=0
@@ -6092,7 +6092,7 @@ Environment="${E}"
6092
6092
  ExecStart=${e}
6093
6093
 
6094
6094
  [Install]
6095
- WantedBy=multi-user.target`},"solvService");import{execSync as CS}from"child_process";function wo(_=!0){console.log("Creating solvService configuration for solana");let e=bo(_);CS(`echo "${e}" | sudo tee ${p.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(wo,"setupSolvService");var vo=t((_=!0)=>{w_(),wo(_),Go()},"makeServices");import{spawnSync as kE}from"node:child_process";var Ho=t(_=>{try{Je(_);let e=_.NETWORK;return e===c.TESTNET?(kE(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),kE(`solana airdrop 1 --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"})):kE(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&He(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as Yo}from"node:child_process";var $e=t((_=!1,e="45",E=o_,o=w,i=_?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",n=!1)=>{try{let T=`docker run -it --rm -v ${E}:${E} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${E} --min_download_speed ${e} --version ${o} --rpc ${i}`;if(_&&n){Yo(`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`,{shell:!0,stdio:"inherit",cwd:E});return}Yo(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as aS}from"node:child_process";var We=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];aS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as cS}from"node:child_process";var dS=t(()=>{try{cS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Jo=dS;import VE from"fs";import{promisify as Qo}from"util";import{execSync as xo}from"child_process";var NS=Qo(VE.readFile),OS=Qo(VE.access),Xe="/etc/sysctl.conf",FS=`# set default and maximum socket buffer sizes to 128MB
6095
+ WantedBy=multi-user.target`},"solvService");import{execSync as CS}from"child_process";function wo(_=!0){console.log("Creating solvService configuration for solana");let e=bo(_);CS(`echo "${e}" | sudo tee ${m.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(wo,"setupSolvService");var vo=t((_=!0)=>{w_(),wo(_),Go()},"makeServices");import{spawnSync as kE}from"node:child_process";var Ho=t(_=>{try{Je(_);let e=_.NETWORK;return e===c.TESTNET?(kE(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),kE(`solana airdrop 1 --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"})):kE(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&He(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as Yo}from"node:child_process";var $e=t((_=!1,e="45",E=o_,o=w,i=_?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",n=!1)=>{try{let T=`docker run -it --rm -v ${E}:${E} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${E} --min_download_speed ${e} --version ${o} --rpc ${i}`;if(_&&n){Yo(`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`,{shell:!0,stdio:"inherit",cwd:E});return}Yo(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as aS}from"node:child_process";var We=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];aS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as cS}from"node:child_process";var dS=t(()=>{try{cS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Jo=dS;import VE from"fs";import{promisify as Qo}from"util";import{execSync as xo}from"child_process";var NS=Qo(VE.readFile),OS=Qo(VE.access),Xe="/etc/sysctl.conf",FS=`# set default and maximum socket buffer sizes to 128MB
6096
6096
  net.core.rmem_default=134217728
6097
6097
  net.core.wmem_default=134217728
6098
6098
  net.core.rmem_max=134217728
@@ -6115,7 +6115,7 @@ To get your free API key, simply join us through the link below:
6115
6115
  Validators DAO: ${je.white("`https://discord.gg/X4BgkBHavp`")}
6116
6116
 
6117
6117
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6118
- `;console.log(je.cyan(e))},"rpcLog"),p_=US;import{spawnSync as m}from"child_process";import{promises as bE}from"fs";import pS from"path";var AS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6118
+ `;console.log(je.cyan(e))},"rpcLog"),p_=US;import{spawnSync as u}from"child_process";import{promises as bE}from"fs";import pS from"path";var AS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6119
6119
  sudo chmod -R 755 /mnt
6120
6120
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
6121
6121
  sudo chown -R solv:solv /mnt
@@ -6312,7 +6312,7 @@ Restart=always
6312
6312
 
6313
6313
  [Install]
6314
6314
  WantedBy=multi-user.target
6315
- `}),"portRelayService"),ei=uS;var mS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?K_:y_,{filePath:i,body:n}=ve();_?(m('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),m('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),m("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),m(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await bE.mkdir(pS.dirname(i),{recursive:!0}),await bE.writeFile(i,n,"utf8"),m(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),m(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),m("git add .",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),m('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(m("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),m(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),m("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),m("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),m("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),m("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await c_(),{filePath:s,body:S}=zo();m(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),m(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Zo();m(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=ei();m("sudo apt install socat",{shell:!0,stdio:"inherit"}),m("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),m(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),m("sudo systemctl daemon-reload",{shell:!0});let C=_i(E,T);await bE.writeFile(C.filePath,C.body,"utf-8"),console.log(`config.toml written to ${C.filePath}`),m(`sudo chown solv:solv "${C.filePath}"`,{shell:!0,stdio:"inherit"}),w_(!0)},"setupFiredancer"),ze=mS;var ti=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(Ei.white("\u{1F7E2} Initializing Setup")),await y(),await Io());let i=await y(),n=i.NETWORK===c.TESTNET;switch(Bo(),(!e||!E)&&await Ko(),vo(n),$o(),Jo(),await qo(),Ho(i),jo(i.IS_DUMMY,n),i=await y(),i.NODE_TYPE){case D.RPC:await fo(i);break;case D.VALIDATOR:await po(i,o),i.VALIDATOR_TYPE===F.FRANKENDANCER&&await ze(o,i);break;default:throw new Error("Unknown Node Type")}E||yo(),ne(),i.VALIDATOR_TYPE!==F.FRANKENDANCER&&(E||(i=await y(),Wo(),$e(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),E||We(i),console.log(Ei.white("\u{1F7E2} Setup Completed")),p_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var oi=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6315
+ `}),"portRelayService"),ei=uS;var mS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?K_:y_,{filePath:i,body:n}=ve();_?(u('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),u('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),u("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),u(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await bE.mkdir(pS.dirname(i),{recursive:!0}),await bE.writeFile(i,n,"utf8"),u(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),u(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(u("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),u(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),u("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await c_(),{filePath:s,body:S}=zo();u(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),u(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Zo();u(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=ei();u("sudo apt install socat",{shell:!0,stdio:"inherit"}),u("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),u(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),u("sudo systemctl daemon-reload",{shell:!0});let C=_i(E,T);await bE.writeFile(C.filePath,C.body,"utf-8"),console.log(`config.toml written to ${C.filePath}`),u(`sudo chown solv:solv "${C.filePath}"`,{shell:!0,stdio:"inherit"}),w_(!0)},"setupFiredancer"),ze=mS;var ti=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(Ei.white("\u{1F7E2} Initializing Setup")),await y(),await Io());let i=await y(),n=i.NETWORK===c.TESTNET;switch(Bo(),(!e||!E)&&await Ko(),vo(n),$o(),Jo(),await qo(),Ho(i),jo(i.IS_DUMMY,n),i=await y(),i.NODE_TYPE){case D.RPC:await fo(i);break;case D.VALIDATOR:await po(i,o),i.VALIDATOR_TYPE===F.FRANKENDANCER&&await ze(o,i);break;default:throw new Error("Unknown Node Type")}E||yo(),ne(),i.VALIDATOR_TYPE!==F.FRANKENDANCER&&(E||(i=await y(),Wo(),$e(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),E||We(i),console.log(Ei.white("\u{1F7E2} Setup Completed")),p_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var oi=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6316
6316
  [Unit]
6317
6317
  Description=Solana transaction relayer
6318
6318
  Requires=network-online.target
@@ -6420,7 +6420,7 @@ $ solv mt -p <fileSystem>
6420
6420
  $ solv umt -p <fileSystem>
6421
6421
  `,i=`mount reload
6422
6422
  $ solv mtr
6423
- `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(x_||(x_={}));import E_ from"chalk";import{spawnSync as ER}from"node:child_process";var SE=t(_=>{ER("solana config get",{shell:!0,stdio:"inherit"});let E=F_();console.log(E_.white("start-validator.sh: ")+E.scriptPath),console.log(E_.white("solv.service: ")+p.SOL_SERVICE),console.log(E_.white("logrotate: ")+p.SOL_LOGROTATE),console.log(E_.white("logrotate (fd): ")+p.FRANKENDANCER_LOGROTATE),console.log(E_.white("sysctl.d: ")+p.SOL_SYSTEM_CONFIG21),console.log(E_.white("limits.d: ")+p.SOL_NOFILES_CONF),console.log(E_.white("system.conf: ")+p.SOL_SYSTEM_CONF),console.log(E_.white("ledger: ")+E.ledger),console.log(E_.white("accounts: ")+E.accounts),console.log(E_.white("snapshots: ")+E.snapshots),console.log(E_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Zi}from"node:child_process";import tR from"chalk";var _n=t(_=>{let e=_.NETWORK===c.TESTNET,E=e?i_:w;_.NODE_TYPE===D.RPC&&(E=M_);let o=d.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");o.command("epoch").description("Show Validator's Epoch").action(()=>{let i=ji();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Zi(i,{shell:!0,stdio:"pipe"});console.log(tR.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=zi();console.log({slot:i})}),o.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","100").option("-s, --snapshotPath <snapshotPath>","Snapshot Path",_.SNAPSHOTS_PATH).option("-v, --version <version>","Specific Version Node",E).option("-r, --rpcUrl <rpcUrl>","RPC URL",e?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com").option("-a, --avorio <version>","Use Avorio Network (Testnet only)",!1).description("Download the latest snapshot").action(i=>{let n=i.minDownloadSpeed,T=i.snapshotPath,s=i.version,S=i.rpcUrl,r=i.avorio;$e(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${n_()} --ledger /mnt/ledger/ contact-info`;Zi(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{SE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{x_.solvAA(),i.client?x_.installClientMessage():x_.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as oR}from"node:child_process";var en=t(()=>{oR("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as iR}from"node:child_process";var En=t(()=>{iR("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as nR}from"node:child_process";var tn=t(()=>{nR("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as TR}from"node:child_process";var on=t(()=>{TR("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as sR}from"node:child_process";var nn=t((_=!1)=>{sR(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import JE from"chalk";import{spawnSync as rR}from"child_process";import{spawnSync as SR}from"node:child_process";var Tn=t(()=>{SR("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var sn=t(()=>{let _=d.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{en()}),_.command("start").description("Start Relayer").action(()=>{En()}),_.command("stop").description("Stop Relayer").action(()=>{tn()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{nn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{on()}),_.command("enable").description("Enable Relayer").action(()=>{Tn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(JE.red("Please provide a URL"));return}let E=`${n_()} --ledger ${P} set-relayer-config --relayer-url ${e.url}`;console.log(JE.white("Setting Relayer URL ...")),rR(E,{shell:!0,stdio:"inherit"}),console.log(JE.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as aR}from"child_process";import{spawnSync as RR}from"child_process";var rE=t(()=>{RR("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as CR}from"child_process";var Sn=t(()=>{CR("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var rn=t(_=>{rE();let e=`sudo rm -rf ${p.SOL_LOGROTATE}`;aR(e,{shell:!0,stdio:"inherit"}),w_(_),Sn()},"updateLogrotate");var Rn=t(_=>{d.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";rn(e),process.exit(0)})},"logrotateCommand");import Cn from"chalk";import{spawnSync as cR}from"child_process";var an=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;cR(e,{shell:!0,stdio:"inherit"})}catch{console.log(Cn.yellow(`You might need to install the Solana SPL CLI:
6423
+ `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(x_||(x_={}));import E_ from"chalk";import{spawnSync as ER}from"node:child_process";var SE=t(_=>{ER("solana config get",{shell:!0,stdio:"inherit"});let E=F_();console.log(E_.white("start-validator.sh: ")+E.scriptPath),console.log(E_.white("solv.service: ")+m.SOL_SERVICE),console.log(E_.white("logrotate: ")+m.SOL_LOGROTATE),console.log(E_.white("logrotate (fd): ")+m.FRANKENDANCER_LOGROTATE),console.log(E_.white("sysctl.d: ")+m.SOL_SYSTEM_CONFIG21),console.log(E_.white("limits.d: ")+m.SOL_NOFILES_CONF),console.log(E_.white("system.conf: ")+m.SOL_SYSTEM_CONF),console.log(E_.white("ledger: ")+E.ledger),console.log(E_.white("accounts: ")+E.accounts),console.log(E_.white("snapshots: ")+E.snapshots),console.log(E_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Zi}from"node:child_process";import tR from"chalk";var _n=t(_=>{let e=_.NETWORK===c.TESTNET,E=e?i_:w;_.NODE_TYPE===D.RPC&&(E=M_);let o=d.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");o.command("epoch").description("Show Validator's Epoch").action(()=>{let i=ji();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Zi(i,{shell:!0,stdio:"pipe"});console.log(tR.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=zi();console.log({slot:i})}),o.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","100").option("-s, --snapshotPath <snapshotPath>","Snapshot Path",_.SNAPSHOTS_PATH).option("-v, --version <version>","Specific Version Node",E).option("-r, --rpcUrl <rpcUrl>","RPC URL",e?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com").option("-a, --avorio <version>","Use Avorio Network (Testnet only)",!1).description("Download the latest snapshot").action(i=>{let n=i.minDownloadSpeed,T=i.snapshotPath,s=i.version,S=i.rpcUrl,r=i.avorio;$e(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${n_()} --ledger /mnt/ledger/ contact-info`;Zi(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{SE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{x_.solvAA(),i.client?x_.installClientMessage():x_.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as oR}from"node:child_process";var en=t(()=>{oR("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as iR}from"node:child_process";var En=t(()=>{iR("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as nR}from"node:child_process";var tn=t(()=>{nR("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as TR}from"node:child_process";var on=t(()=>{TR("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as sR}from"node:child_process";var nn=t((_=!1)=>{sR(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import JE from"chalk";import{spawnSync as rR}from"child_process";import{spawnSync as SR}from"node:child_process";var Tn=t(()=>{SR("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var sn=t(()=>{let _=d.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{en()}),_.command("start").description("Start Relayer").action(()=>{En()}),_.command("stop").description("Stop Relayer").action(()=>{tn()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{nn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{on()}),_.command("enable").description("Enable Relayer").action(()=>{Tn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(JE.red("Please provide a URL"));return}let E=`${n_()} --ledger ${P} set-relayer-config --relayer-url ${e.url}`;console.log(JE.white("Setting Relayer URL ...")),rR(E,{shell:!0,stdio:"inherit"}),console.log(JE.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as aR}from"child_process";import{spawnSync as RR}from"child_process";var rE=t(()=>{RR("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as CR}from"child_process";var Sn=t(()=>{CR("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var rn=t(_=>{rE();let e=`sudo rm -rf ${m.SOL_LOGROTATE}`;aR(e,{shell:!0,stdio:"inherit"}),w_(_),Sn()},"updateLogrotate");var Rn=t(_=>{d.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";rn(e),process.exit(0)})},"logrotateCommand");import Cn from"chalk";import{spawnSync as cR}from"child_process";var an=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;cR(e,{shell:!0,stdio:"inherit"})}catch{console.log(Cn.yellow(`You might need to install the Solana SPL CLI:
6424
6424
  `)),console.log(Cn.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as NR}from"os";import{spawnSync as dR}from"child_process";var D_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=dR(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import OR from"chalk";import{spawnSync as FR}from"node:child_process";var cn=t(_=>{d.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let o=`${NR()}/mainnet-authority-keypair.json`;await an(o),process.exit(0)}await lR(_),process.exit(0)})},"balanceCommands"),lR=t(async _=>{let e=IR(_),E=`Validator Key: ${e.validatorKey}
6425
6425
  Address: ${e.validatorKeyAddress}
6426
6426
  Balance: ${e.validatorKeyBalance}
@@ -6441,7 +6441,7 @@ Please Check the Wallet Address`)),process.exit(0)}let T=CE(`solana balance ${o}
6441
6441
  \u{1F4B0} Balance: ${n}`));let{amount:s}=await RE.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),S=`solana transfer ${i} ${s} --allow-unfunded-recipient --keypair ${E} --url ${_.RPC_URL}`,r=QE(S,{shell:!0,stdio:"inherit"}),a=Ae;for(;r.status!==0&&a>0;)console.log(Fe.red(`\u274C Transaction Failed
6442
6442
  Retrying Transaction in ${Fn}ms
6443
6443
  Retries Left: ${a}`)),await H(Fn),r=QE(S,{shell:!0,stdio:"inherit"}),a--;process.exit(0)})},"transferCommands"),$E=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),AR=t(async()=>{let _=fR(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=CE(`solana address -k ${o}`).toString().trim(),n=await RE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:UR}]),T=n.from==="Validator Account"?Object.values(aE).filter(C=>C!=="Validator Account"):Object.values(aE).filter(C=>C!=="Authority Account");if((await RE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:C}=await RE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:$E}]);i=C}else{let C=n.from==="Validator Account"?e:E;o=`${_}/${C}`,i=CE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,a=CE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:a,toAddress:i}},"selectFromKeypairs");import In from"chalk";import LR from"inquirer";import{execSync as WE,spawnSync as MR}from"node:child_process";var Dn=t(async(_,e=!1)=>{let E=_.NETWORK===c.TESTNET,o=E?ge:_.RPC_URL,i=E?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",n=E?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",T=E?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",s=WE(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(In.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(In.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let N=await LR.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(N.sol)}let a=WE(`solana address --keypair ${T}`).toString().trim(),C=WE(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${a} ${C} ${S} --authorized-withdrawer ${n} --url ${o}`;MR(R,{shell:!0,stdio:"inherit"})},"withdraw");var Pn=t(_=>{d.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await Dn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as wR,spawnSync as vR}from"node:child_process";import{BN as Un}from"bn.js";import{LAMPORTS_PER_SOL as XE}from"@solana/web3.js";import{Connection as hR,LAMPORTS_PER_SOL as BR}from"@solana/web3.js";import{Keypair as uR}from"@solana/web3.js";import{readFile as pR}from"fs/promises";var mR=t(async _=>{let e=JSON.parse(await pR(_,"utf8"));return uR.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),fn=mR;import{homedir as gR}from"os";var Z;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(Z||(Z={}));var KR={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},yR=t(async(_,e="auth",E=!1)=>{let o=new hR(_),i=gR(),n=U(i),s=`${E?"testnet":"mainnet"}${KR[e]}`,S=n[s],r=await fn(S),a=await o.getBalance(r.publicKey),R=Number(a)/BR;if(isNaN(R))throw new Error("Failed to get balance");return R},"getBalance"),S_=yR;var GR=new Un(3*XE),An=t(async _=>{let e=await S_(_,Z.VALIDATOR),o=new Un(Number(Number(e)*XE)).sub(GR),i=Number(o)/XE;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import le from"chalk";import{Keypair as kR,Connection as VR,PublicKey as bR,SystemProgram as Ln,ComputeBudgetProgram as cE,VersionedTransaction as Mn,TransactionMessage as un}from"@solana/web3.js";var pn=t(async(_,e,E,o)=>{let i=0;try{let n=new VR(_,"finalized"),T=kR.fromSecretKey(new Uint8Array(Array.from(e))),s=new bR(E),S=o;for(;;)try{let r=[Ln.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:2e5}),cE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],a=await n.getLatestBlockhashAndContext({commitment:"finalized"}),C=new Mn(new un({instructions:r,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(C,{replaceRecentBlockhash:!0,sigVerify:!1});C.sign([T]);let N=[Ln.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:R.value.unitsConsumed?Math.trunc(R.value.unitsConsumed*1.2):2e5}),cE.setComputeUnitPrice({microLamports:1e3})],I=new Mn(new un({instructions:N,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message());I.sign([T]);let O=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...a.value,signature:O},"finalized"),console.log("finalized signature:",O),O}catch(r){if(i++,i>Ae)throw new Error(JSON.stringify(r));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${r}`),await H(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as HR}from"fs/promises";import{LAMPORTS_PER_SOL as YR}from"@solana/web3.js";var jE=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=U();await S_(_,Z.VOTE)<1?(console.log(le.white("Vote Account Balance is less than 1 SOL")),console.log(le.white("Skip withdrawing SOL from Vote Account to Authority Account"))):vR("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await An(_);console.log(le.white(`Transferable Balance: ${i} SOL`));let n=i*YR;if(i<1)console.log(le.white("Validator Account Balance is less than 1 SOL")),console.log(le.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=wR(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await HR(E,"utf-8"));await pn(_,s,T,n)}return!0},"collectSOL");import{readFile as _C}from"fs/promises";import eC from"inquirer";import zE from"chalk";import{execSync as JR}from"child_process";import{homedir as xR}from"os";var QR=t(async _=>{try{let e=xR(),{mainnetValidatorAuthorityKey:E}=U(e),o=`spl-token balance ${s_} --owner ${E} --url ${_}`,i=JR(o).toString().trim();return Number(i)}catch(e){return console.log(zE.red(`Error: ${e}`)),console.log(zE.yellow(`You might need to install the Solana SPL CLI:
6444
- `)),console.log(zE.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),mn=QR;import OE from"chalk";import{Connection as qR,PublicKey as hn,Keypair as $R,ComputeBudgetProgram as dE,VersionedTransaction as Bn,TransactionMessage as gn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Kn,createTransferInstruction as yn,TOKEN_PROGRAM_ID as Gn}from"@solana/spl-token";var kn=t(async(_,e,E,o,i,n)=>{try{let T=new qR(_,"finalized"),s=$R.fromSecretKey(new Uint8Array(e)),S=new hn(E),r=new hn(i),a=Math.trunc(o*Math.pow(10,n)),C=await Kn(T,s,r,s.publicKey),R=await Kn(T,s,r,S,!0);for(;;)try{let N=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:2e5}),dE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),O=new Bn(new gn({instructions:N,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),l=await T.simulateTransaction(O,{replaceRecentBlockhash:!0,sigVerify:!1});O.sign([s]);let G=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:l.value.unitsConsumed?Math.trunc(l.value.unitsConsumed*1.2):2e5}),dE.setComputeUnitPrice({microLamports:1e3})],u=new Bn(new gn({instructions:G,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());u.sign([s]);let x=await T.sendRawTransaction(u.serialize());return await T.confirmTransaction({...I.value,signature:x},"finalized"),console.log("finalized signature:",x),x}catch(N){console.error("Transfer failed, retrying...",N)}}catch(T){throw console.error(T),T}},"transferSPLToken");import NE from"inquirer";import{spawnSync as Vn}from"child_process";import ZE from"chalk";import{promises as bn}from"fs";var WR=t(async(_="epochTimer")=>{try{let e=Vn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(ZE.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6444
+ `)),console.log(zE.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),mn=QR;import OE from"chalk";import{Connection as qR,PublicKey as hn,Keypair as $R,ComputeBudgetProgram as dE,VersionedTransaction as Bn,TransactionMessage as gn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Kn,createTransferInstruction as yn,TOKEN_PROGRAM_ID as Gn}from"@solana/spl-token";var kn=t(async(_,e,E,o,i,n)=>{try{let T=new qR(_,"finalized"),s=$R.fromSecretKey(new Uint8Array(e)),S=new hn(E),r=new hn(i),a=Math.trunc(o*Math.pow(10,n)),C=await Kn(T,s,r,s.publicKey),R=await Kn(T,s,r,S,!0);for(;;)try{let N=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:2e5}),dE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),O=new Bn(new gn({instructions:N,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),l=await T.simulateTransaction(O,{replaceRecentBlockhash:!0,sigVerify:!1});O.sign([s]);let k=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:l.value.unitsConsumed?Math.trunc(l.value.unitsConsumed*1.2):2e5}),dE.setComputeUnitPrice({microLamports:1e3})],p=new Bn(new gn({instructions:k,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());p.sign([s]);let x=await T.sendRawTransaction(p.serialize());return await T.confirmTransaction({...I.value,signature:x},"finalized"),console.log("finalized signature:",x),x}catch(N){console.error("Transfer failed, retrying...",N)}}catch(T){throw console.error(T),T}},"transferSPLToken");import NE from"inquirer";import{spawnSync as Vn}from"child_process";import ZE from"chalk";import{promises as bn}from"fs";var WR=t(async(_="epochTimer")=>{try{let e=Vn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(ZE.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6445
6445
  `).filter(n=>!n.includes(_)).join(`
6446
6446
  `),i="/tmp/temp_crontab";await bn.writeFile(i,o,"utf-8"),Vn("crontab",[i]),await bn.unlink(i),console.log(ZE.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(ZE.red("Error removing cron job:",e))}},"removeCronJob"),wn=WR;import vn from"chalk";var XR=t(async _=>{let e=_.NETWORK===c.TESTNET,E=await NE.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!E.mevOn)return await _E()&&await wn(),await M({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6447
6447
  ${vn.green("No more Login to the server to update \u{1F331}")}
@@ -6474,7 +6474,7 @@ Local Identity Key: ${o}
6474
6474
  Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Q_=MC;var uC="agave-validator -l /mnt/ledger",pC="sudo fdctl",mC="--config /home/solv/firedancer/config.toml ",hC=t(_=>_==="agave"?[uC,""]:[pC,mC],"getSolanaCLIActive"),q_=hC;var tT="agave-validator -l /mnt/ledger",BC=t(()=>{try{return tT}catch(_){return console.error(_),tT}},"getSolanaCLIAgave"),lE=BC;import et from"chalk";var IE=t(async(_,e)=>{try{console.log(et.white("\u{1F50D} Detecting client type from remote configuration..."));let E=FE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case F.AGAVE:n="agave";break;case F.FRANKENDANCER:n="frankendancer";break;case F.JITO:n="agave";break;default:n="agave"}return console.log(et.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(et.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as gC}from"fs/promises";import Et from"chalk";import{existsSync as KC}from"fs";var DE=t(async()=>{try{console.log(Et.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!KC(_))return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Local configuration file not found"};let e=await gC(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case F.AGAVE:i="agave";break;case F.FRANKENDANCER:i="frankendancer";break;case F.JITO:i="agave";break;default:i="agave"}return console.log(Et.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(Et.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var PE=iT(g,A_),oT=iT(g,U_),nT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),a=S.success?S.client:"agave",C=r.success?r.client:"agave";console.log(W.green(`\u2705 Local client: ${a}, Remote client: ${C}`));let[R,N]=q_(a),[I,O]=q_(C),l=lE();if(!Q_(s,_,o))return;if(i){console.log(W.white("\u{1F7E2} Waiting for restart window..."));let Z_=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if($_(Z_,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6475
6475
  $ ssh ${o}@${_}
6476
6476
 
6477
- Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(W.white("\u{1F7E2} Setting identity on the remote validator..."));let u=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${O}${PE}'`;if($_(u,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6477
+ Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(W.white("\u{1F7E2} Setting identity on the remote validator..."));let p=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${O}${PE}'`;if($_(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6478
6478
  $ ssh ${o}@${_}
6479
6479
 
6480
6480
  Failed Cmd: ${I} set-identity ${O}${PE}`));return}if(console.log(W.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),$_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${PE} ${oT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
@@ -6488,9 +6488,9 @@ Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(
6488
6488
  Failed Cmd: ${R} set-identity ${N}${s}
6489
6489
  ln -sf ${s} ${L}`));return}if($_(`ln -sf ${s} ${L}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6490
6490
 
6491
- Failed Cmd: ln -sf ${s} ${L}`));return}console.log(W.white("\u{1F7E2} Identity changed successfully!")),await M({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as ST}from"path";import Y from"chalk";import{spawnSync as W_}from"node:child_process";var TT=ST(g,A_),yC=ST(g,U_),sT="~/.ssh/id_rsa",rT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),a=S.success?S.client:"agave",C=r.success?r.client:"agave";console.log(Y.green(`\u2705 Local client: ${a}, Remote client: ${C}`));let[R,N]=q_(a),[I,O]=q_(C),l=lE();if(!Q_(s,_,o))return;let u=`${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,x=`${R} set-identity ${N}${TT}`,r_=`ln -sf ${TT} ${yC}`,f_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,R_=`${I} set-identity ${O}--require-tower ${s}`,z_=`ln -sf ${s} ${L}`;if(i&&(console.log(Y.white("\u{1F7E2} Waiting for restart window...")),W_(u,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Y.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6491
+ Failed Cmd: ln -sf ${s} ${L}`));return}console.log(W.white("\u{1F7E2} Identity changed successfully!")),await M({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as ST}from"path";import Y from"chalk";import{spawnSync as W_}from"node:child_process";var TT=ST(g,A_),yC=ST(g,U_),sT="~/.ssh/id_rsa",rT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),a=S.success?S.client:"agave",C=r.success?r.client:"agave";console.log(Y.green(`\u2705 Local client: ${a}, Remote client: ${C}`));let[R,N]=q_(a),[I,O]=q_(C),l=lE();if(!Q_(s,_,o))return;let p=`${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,x=`${R} set-identity ${N}${TT}`,r_=`ln -sf ${TT} ${yC}`,f_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,R_=`${I} set-identity ${O}--require-tower ${s}`,z_=`ln -sf ${s} ${L}`;if(i&&(console.log(Y.white("\u{1F7E2} Waiting for restart window...")),W_(p,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Y.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6492
6492
 
6493
- Failed Cmd: ${u}`));return}if(console.log(Y.white("\u{1F7E2} Setting identity on the new validator...")),W_(x,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6493
+ Failed Cmd: ${p}`));return}if(console.log(Y.white("\u{1F7E2} Setting identity on the new validator...")),W_(x,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6494
6494
 
6495
6495
  Failed Cmd: ${x}`));return}if(console.log(Y.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),W_(r_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6496
6496
 
@@ -6501,7 +6501,7 @@ $ ssh ${o}@${_}
6501
6501
 
6502
6502
  Failed Cmd: ${R_}`)),console.log(Y.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let BT=`ssh -i ${sT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${z_}'`;if(W_(BT,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6503
6503
 
6504
- Failed Cmd: ${z_}`));return}console.log(Y.white("\u{1F7E2} Identity changed successfully!")),await M({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as GC}from"node:child_process";function RT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return GC(E,{shell:!0,stdio:"inherit"}).status===0}t(RT,"checkSSHConnection");import Ie from"chalk";import{join as aT}from"path";import{spawnSync as X_}from"node:child_process";import __ from"chalk";var fE=aT(g,A_),CT=aT(g,U_),cT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;if(T&&(s=K),!Q_(s,_,o))return;let r=st,a=St;if(i){console.log(__.white("\u{1F7E2} Waiting for restart window..."));let G=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(X_(G,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6504
+ Failed Cmd: ${z_}`));return}console.log(Y.white("\u{1F7E2} Identity changed successfully!")),await M({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as GC}from"node:child_process";function RT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return GC(E,{shell:!0,stdio:"inherit"}).status===0}t(RT,"checkSSHConnection");import Ie from"chalk";import{join as aT}from"path";import{spawnSync as X_}from"node:child_process";import __ from"chalk";var fE=aT(g,A_),CT=aT(g,U_),cT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;if(T&&(s=K),!Q_(s,_,o))return;let r=st,a=St;if(i){console.log(__.white("\u{1F7E2} Waiting for restart window..."));let k=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(X_(k,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6505
6505
  $ ssh ${o}@${_}
6506
6506
 
6507
6507
  Failed Cmd: ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(__.white("\u{1F7E2} Setting identity on the new validator..."));let C=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} set-identity ${fE}'`;if(X_(C,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
@@ -6544,7 +6544,7 @@ $ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
6544
6544
  You can upgrade your API key to increase your rate limits.
6545
6545
  Get Your API key \u{1F447}
6546
6546
  Validators Solutions: ${_e}
6547
- `;console.error(J.white(R_)),process.exit(0)}let G=Buffer.from(l.swapTransaction,"base64"),u=xC.deserialize(G);u.sign([O]);let x=u.serialize(),r_=await S.sendRawTransaction(x,{skipPreflight:!0,maxRetries:2}),f_=u.message.recentBlockhash;return console.log(`Swapping...
6548
- Transaction ID: ${r_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:r_},"confirmed"),r_},"swap");$C.config();var DT=t(async(_,e)=>{_.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async E=>{try{await WC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(B_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(B_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),WC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(B_.white("Solana RPC URL:",_)),console.log(B_.white("KeyfilePath:",e)),(!e||e===""||s)&&await XC();let S=ct,r=[...dt,"Other"],a=o,C="",R=i,N=n;if(a===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?a=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(C=l.name,a=UE[C].tokenMint)}if(R===""){r=r.filter(u=>u!==C);let l=await j_.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(l.name==="Other")R=(await j_.prompt([{type:"input",name:"address",message:"Enter output mint address",default:s_}])).address;else{let u=l.name;R=UE[u].tokenMint}let G=l.name;R=UE[G].tokenMint}if(N===0){let l=await j_.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);N=Number(l.amount)}let O=await IT(_,S,!E||E===""?Nt:E,e,a,R,N,T);O||process.exit(0),console.log(B_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(B_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${O}`))},"swapCmd");var XC=t(async()=>{let _=await j_.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await M(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6547
+ `;console.error(J.white(R_)),process.exit(0)}let k=Buffer.from(l.swapTransaction,"base64"),p=xC.deserialize(k);p.sign([O]);let x=p.serialize(),r_=await S.sendRawTransaction(x,{skipPreflight:!0,maxRetries:2}),f_=p.message.recentBlockhash;return console.log(`Swapping...
6548
+ Transaction ID: ${r_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:r_},"confirmed"),r_},"swap");$C.config();var DT=t(async(_,e)=>{_.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async E=>{try{await WC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(B_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(B_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),WC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(B_.white("Solana RPC URL:",_)),console.log(B_.white("KeyfilePath:",e)),(!e||e===""||s)&&await XC();let S=ct,r=[...dt,"Other"],a=o,C="",R=i,N=n;if(a===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?a=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(C=l.name,a=UE[C].tokenMint)}if(R===""){r=r.filter(p=>p!==C);let l=await j_.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(l.name==="Other")R=(await j_.prompt([{type:"input",name:"address",message:"Enter output mint address",default:s_}])).address;else{let p=l.name;R=UE[p].tokenMint}let k=l.name;R=UE[k].tokenMint}if(N===0){let l=await j_.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);N=Number(l.amount)}let O=await IT(_,S,!E||E===""?Nt:E,e,a,R,N,T);O||process.exit(0),console.log(B_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(B_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${O}`))},"swapCmd");var XC=t(async()=>{let _=await j_.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await M(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6549
6549
  `)),p_()},"askForConfig");import{spawnSync as jC}from"node:child_process";var PT=t(()=>{jC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as zC}from"node:child_process";var fT=t(()=>{zC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as ZC}from"node:child_process";var UT=t(()=>{ZC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as _a}from"node:child_process";var AT=t(()=>{_a("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as ea}from"node:child_process";var LT=t((_=!1)=>{ea(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Ea}from"node:child_process";var MT=t(()=>{Ea("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var uT=t(()=>{let _=d.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{PT()}),_.command("start").description("Start Jupiter").action(()=>{fT()}),_.command("stop").description("Stop Jupiter").action(()=>{UT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{LT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{AT()}),_.command("enable").description("Enable Jupiter").action(()=>{MT()})},"jupiterCommands");import na from"chalk";import{spawnSync as ta}from"node:child_process";var oa=t(()=>{let{stdout:_}=ta("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),pT=oa;var d=new ia;d.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(De,"-V","Display version");async function Ta(){try{let _=await y();ai(_),Oi(_),di(_),Bi(_),So(_),Ro(),Fi(_),Xi(_),_n(_),hi(),Di(),ri(_),cn(_),li(),sn(),ln(_),Pn(_),Jn(_),Ci(),DT(d,_),eT(_),NT(d,_),uT(),Rn(_),d.command("rm:log").description("Remove Logs").action(()=>{rE()}),d.command("rm:snapshot").description("Remove Snapshot").action(()=>{dn(_)}),d.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",_.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",_.SNAPSHOTS_PATH).action(e=>{console.log(na.white("\u{1F4DD} Creating Snapshot...")),OT(e.slot,e.ledger,e.snapshots)}),d.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Nn(_)}),d.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{On()}),d.command("config").description("Show Solv Config").action(()=>{SE(_)}),d.command("vv").description("Show Solv Version").action(()=>{let e=pT();console.log("version:",e)}),await d.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(Ta,"main");Ta();export{d as program};
6550
6550
  //# sourceMappingURL=index.js.map