@gabrielhicks/solv 5.4.9 → 5.4.11

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,15 +1,16 @@
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.9";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",M=`${g}/${U_}`,da=`${g}/${A_}`,b=`${g}/${yT}`,fe=`${g}/${GT}`,Na=`${g}/${kT}`,K=`${g}/${VT}`,Ue=`${g}/${bT}`,Oa=`${g}/${wT}`,j=`${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=!0,mt=!1,ht=!0,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 H}from"child_process";var Ke=t((_=C_.tag,e=!1,E=!1)=>{H("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),H("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(H(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),H(`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"}),H("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),H(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),H(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):H(`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"),$;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})($||($={}));var zT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:$.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"),k=ts;import os from"node-fetch";var z=t(async _=>{try{let e=await k();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
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"),Y=ns;import{sendDiscord as Ts}from"@skeet-framework/utils";var qt=30,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!
2
+ var mT=Object.defineProperty;var t=(_,e)=>mT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as _a}from"commander";var ot="5.4.11";var it={name:"@gabrielhicks/solv",version:ot,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=it.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",nt="relayer-keypair.json",BT="mainnet-validator-keypair.json",gT="mainnet-vote-account-keypair.json",KT="mainnet-authority-keypair.json",yT="testnet-validator-keypair.json",GT="testnet-vote-account-keypair.json",kT="testnet-authority-keypair.json",g="/home/solv",A=`${g}/${U_}`,ra=`${g}/${A_}`,b=`${g}/${BT}`,fe=`${g}/${gT}`,Ra=`${g}/${KT}`,K=`${g}/${yT}`,Ue=`${g}/${GT}`,Ca=`${g}/${kT}`,j=`${g}/solana-validator.log`,e_=g+"/start-validator.sh",P="/mnt/ledger",g_="/mnt/accounts",E_="/mnt/snapshots",Tt="solana-validator",st="agave-validator",St="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ae=3;var rt="https://api.mainnet-beta.solana.com",Rt="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 at=Object.values(AE),Le="So11111111111111111111111111111111111111112",Me="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",LE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var ct="SOLV420",dt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as wT}from"child_process";var t_="3.0.10",w="3.0.10",ee="3.0.10",L_="3.0.10",Nt="3.0.10",M_="3.0.10";var Ot="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 Ft="agave-validator",bT=t(()=>{try{return Ft}catch(_){return console.error(_),Ft}},"getSolanaCLI"),o_=bT;var ue=t(async(_,e=!1,E=!1)=>{G_(_,e,E)},"updateVersion"),pe=t(async(_,e=!1,E=10)=>{let o=o_(),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}`),wT(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import no from"chalk";var u_;(function(_){_.EN="en",_.JA="ja"})(u_||(u_={}));var lt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(lt||(lt={}));var It;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(It||(It={}));var N_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(N_||(N_={}));var Dt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(Dt||(Dt={}));var Pt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Pt||(Pt={}));var ft;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(ft||(ft={}));var Ut;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Ut||(Ut={}));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 Mt=!1,ut=!1,pt=!1,mt=!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"},i_={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"},L=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"),O_=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}/${i_.LOG}`,i=f.ACCOUNTS,n=f.LEDGER,T=f.SNAPSHOTS,s=`${v.ROOT}/${i_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var Z="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ME="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",ht="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Bt=9,n_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",gt="So11111111111111111111111111111111111111112",Kt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",yt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",At;(function(_){_[_.ELSOL=n_]="ELSOL",_[_.SOL=gt]="SOL",_[_.USDC=Kt]="USDC",_[_.EPCT=yt]="EPCT"})(At||(At={}));var Lt;(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"})(Lt||(Lt={}));var pa={[gt]:9,[n_]:9,[Kt]:6,[yt]:6},Be="/home/solv/currentEpoch.json";var ge="https://api.testnet.solana.com";import{spawnSync as uE}from"child_process";var Gt=t(()=>{uE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=q.NODE_VERSION;uE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),uE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var R_={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 H}from"child_process";var Ke=t((_=R_.tag,e=!1,E=!1)=>{H("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),H("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(H(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),H(`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"}),H("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),H(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),H(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):H(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as vT,writeFile as HT}from"fs/promises";import{homedir as YT}from"os";var te=t(async _=>{let E=`${YT()}/${i_.JITO_CONFIG}`,i={...JSON.parse(await vT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await HT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as kt}from"child_process";import JT from"inquirer";var Vt=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";kt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;kt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),bt=t(async()=>await JT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as oe}from"@skeet-framework/utils";import xT from"chalk";import QT from"inquirer";var wt=t(async()=>{let _=await QT.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(xT.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var qT=t(()=>ot,"getSolvVersion"),k_=qT;import{readFile as XT,writeFile as jT}from"fs/promises";import{existsAsync as zT}from"@skeet-framework/utils";var pE;(function(_){_.EN="en",_.JA="ja"})(pE||(pE={}));var tc=Object.values(pE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var vt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Ht=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.NONE="none"})(F||(F={}));var oc=Object.values(F).filter(_=>_!=="none"),V;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(V||(V={}));var Yt=Object.values(V).filter(_=>_!=="none"),$;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})($||($={}));var WT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:$.TRIPLE,TESTNET_SOLANA_VERSION:t_,MAINNET_SOLANA_VERSION:w,NODE_VERSION:Ot,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:St,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:rt,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:g_,SNAPSHOTS_PATH:E_,MOD:!1},C_=WT;import{homedir as ZT}from"os";var _s=t(async()=>{let e=`${ZT()}/${Pe}`;return await zT(e)?JSON.parse(await XT(e,"utf-8")):(console.log("Creating default config file at",e),await jT(e,JSON.stringify(C_,null,2)),C_)},"readConfig"),k=_s;import es from"node-fetch";var T_=t(async _=>{try{let e=await k();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
+ Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await es(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 ns}from"child_process";import{Connection as Jt}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 Jt("https://api.testnet.solana.com"):new Jt(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(a=>a.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(a=>a.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,C=await n.getSlot()-S;return C>o?(i.isActive=!1,i.reason=`Validator has not voted for ${C} 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 Es}from"child_process";var M=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=Es(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ts=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),Y=ts;import{sendDiscord as os}from"@skeet-framework/utils";var xt=30,is=t(async _=>{try{let e=_.NETWORK===c.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=L(),n=M(e?o:E),T=await ie(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=xt){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${xt} 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 Y(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=Math.floor(Date.now()/1e3),a=`Restarting **${s}**
8
- at: <t:${r}:> (${r})
9
- _ _`;await z(a);try{Ss("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(N){let I=`Error restarting **${s}**: ${N?.message||"Unknown error"}`;return await z(I),!1}let C=`**${s}** has restarted, catching up...`;await z(C),await Y(180*1e3);let R=await $t(_);if(R){let I=Math.floor(Date.now()/1e3)-r,O=Math.floor(I/60),l=I%60,G=O>0?`${O}m ${l}s`:`${l}s`,L=`**${s}** has caught up!
10
- at: <t:${r}:> (${r})
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await os(S),!1}console.log("Waiting for validator to catch up..."),await Y(60*1e3),T=await ie(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Qt=is;var Ts=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=L(),n=e?o:i,T=!1;E?T=e?pt:mt:T=e?Mt:ut,T=T&&_.AUTO_RESTART;let s=M(n),S=`**${s}** updated solv to **${k_()}**`;if(await T_(S),T){let r=`Restarting **${s}**
8
+ _ _`;await T_(r);try{ns("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(N){let I=`Error restarting **${s}**: ${N?.message||"Unknown error"}`;return await T_(I),!1}let C=Math.floor(Date.now()/1e3),a=`**${s}** has restarted, catching up...
9
+ at: <t:${C}> (${C})
10
+ _ _`;await T_(a),await Y(180*1e3);let R=await Qt(_);if(R){let I=Math.floor(Date.now()/1e3)-C,O=Math.floor(I/60),l=I%60,G=O>0?`${O}m ${l}s`:`${l}s`,U=`**${s}** has caught up!
11
+ at: <t:${C}> (${C})
11
12
  **${s}** took **${G}** to catch up after restart!
12
- _ _`;await z(L)}else{let N=`**${s}** failed to catch up after update`;await z(N)}return R}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 u=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 y}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
13
+ _ _`;await T_(U)}else{let N=`**${s}** failed to catch up after update`;await T_(N)}return R}return!0},"autoUpdate"),qt=Ts;import{homedir as ss}from"os";import{readFile as Ss,writeFile as $t}from"fs/promises";import{existsAsync as rs}from"@skeet-framework/utils";var u=t(async _=>{let E=`${ss()}/${Pe}`;await rs(E)||(console.log("Creating default config file at",E),await $t(E,JSON.stringify(C_,null,2)));let i={...JSON.parse(await Ss(E,"utf8")),..._},n=JSON.stringify(i,null,2);await $t(E,n)},"updateDefaultConfig");var Rs={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=Rs;var Cs={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:"},Wt=Cs;var as={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=as;var cs={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"}},Xt=cs;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 jt=[") \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"],zt=[[],[") \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 ds={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=ds;var Ns={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"}},Zt=Ns;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var _o=[") \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 Os=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:Wt,subCmds:Zt,logs:Xt,installer:jt,installerSub:zt,clientCmds:_o};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),eo=Os;import{existsSync as Ds,readFileSync as Ps,writeFileSync as Eo}from"fs";import{readFileSync as Fs,writeFileSync as ls}from"fs";import{homedir as Is}from"os";var V_=t(_=>{let E=`${Is()}/${i_.CONFIG}`,i={...JSON.parse(Fs(E,"utf8")),..._},n=JSON.stringify(i,null,2);ls(E,n)},"updateSolvConfig");import{homedir as fs}from"os";var to=t(()=>{let e=`${fs()}/${i_.CONFIG}`;Ds(e)||(Eo(e,JSON.stringify(q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(Ps(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Eo(e,JSON.stringify(q,null,2)),E=q}let o=eo(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 y}from"child_process";import{promises as oo}from"fs";import As from"path";var Us=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
13
14
  index a0c631ee9f..048b118660 100644
14
15
  --- a/book/api/metrics-generated.md
15
16
  +++ b/book/api/metrics-generated.md
@@ -5794,7 +5795,7 @@ index 479e0f1829..a97f5778d4 100644
5794
5795
 
5795
5796
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5796
5797
  at the NOTICE level to the logger. E.g. for a typical fd_log
5797
- `;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();y("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),y('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"),y(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),y("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),y("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=$.TRIPLE;R.DISK_TYPES===0?N=$.DOUBLE:R.DISK_TYPES===1?N=$.SINGLE:N=$.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 u(G)}if(r.config){if(await u({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 u({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]
5798
+ `;return{filePath:_,body:e}},"modDiff"),ve=Us;var io=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?K_:y_),n=E||_.MOD,{filePath:T,body:s}=ve();y("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await oo.mkdir(As.dirname(T),{recursive:!0}),await oo.writeFile(T,s,"utf8"),y(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),y("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as Ls}from"node:child_process";var To=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?t_:w;o&&(S=L_,e&&(S=ee)),i&&(S=y_,e&&(S=K_)),E&&(S=M_,o&&(S=Nt)),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 C=k_(),a=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(no.white(`Current solv version: ${C}`)),r.auto){await qt(_);return}if(r.migrateConfig){let R=to().config,N=$.TRIPLE;R.DISK_TYPES===0?N=$.DOUBLE:R.DISK_TYPES===1?N=$.SINGLE:N=$.TRIPLE;let I=R.SOLANA_NETWORK===N_.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 u(G)}if(r.config){if(await u({TESTNET_SOLANA_VERSION:t_,MAINNET_SOLANA_VERSION:w}),o){let R=e?ee:L_;await te({version:R,tag:`v${R}`})}console.log(no.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 wt();return}if(r.background){let R=r.version,N=!!R.startsWith("3");if(await u({TESTNET_SOLANA_VERSION:t_,MAINNET_SOLANA_VERSION:w}),o){Ke(`v${R}`,r.mod||T,N),await te({version:R,tag:`v${R}`}),await pe(a,!0,s);return}if(i){await io(_,R,r.mod||T),await pe(a,!0,s);return}await ue(R,r.mod||T,N);let I=e?10:5;e&&Ls("solv start",{stdio:"inherit",shell:!0}),await pe(I,!0,s);return}else if(r.commission){let R=await bt();Vt(R.commission,e)}else Gt()})},"updateCommands");import{spawnSync as Ms}from"node:child_process";var so=t(_=>{try{let{log:e}=O_(),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 So=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(_=>{so(_)})},"logCommands");import c_ from"chalk";import{spawnSync as us}from"child_process";import{homedir as ps}from"os";var He=t(_=>{let e=ps(),E=L(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=N_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=N_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=N_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;us(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ye}from"child_process";import{existsSync as ro,readdirSync as ms,rmSync as hs}from"fs";import{homedir as Bs}from"os";import Ro 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=ms("./").filter(S=>S.endsWith("SV.json")),n=Bs(),T=Ro.join(n,"unstaked-identity.json");ro(T)&&Ye(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=Ro.join(n,e[s]);if(s++,ro(r)){console.log(`${r} is already exist!`),hs(S,{recursive:!0});continue}let C=`mv ${S} ${r}`;Ye(C,{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 ao}from"child_process";var gs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5798
5799
  Description=Jupiter API Service Instance
5799
5800
  After=network.target
5800
5801
 
@@ -5809,19 +5810,19 @@ Environment=RUST_LOG=info
5809
5810
  Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
5810
5811
 
5811
5812
  [Install]
5812
- WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),co=Gs;import ks from"inquirer";import Vs from"chalk";var bs=t(async()=>{let _=await ks.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);No(`sudo apt-get install unzip wget -y
5813
+ WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),Co=gs;import Ks from"inquirer";import ys from"chalk";var Gs=t(async()=>{let _=await Ks.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);ao(`sudo apt-get install unzip wget -y
5813
5814
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5814
5815
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5815
5816
  chmod +x jupiter-swap-api
5816
- rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=co(_.rpcUrl,_.grpcUrl,_.grpcToken);No(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(Vs.white(`\u{1F7E2} Jupiter Swap API Setup Completed
5817
+ rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=Co(_.rpcUrl,_.grpcUrl,_.grpcToken);ao(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(ys.white(`\u{1F7E2} Jupiter Swap API Setup Completed
5817
5818
 
5818
- $ solv jupiter --help`))},"jupiterAPISetup"),Oo=bs;import{existsAsync as ws}from"@skeet-framework/utils";import{readFile as vs,writeFile as Fo}from"fs/promises";import{homedir as Hs}from"os";import Ys from"path";var c_=t(async()=>{let _=Hs(),e=Ys.join(_,T_.JITO_CONFIG);await ws(e)||(await Fo(e,JSON.stringify(C_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await vs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await Fo(e,JSON.stringify(C_,null,2)),E=C_}return E},"readOrCreateJitoConfig");import{spawnSync as Js}from"child_process";var ne=t(()=>{Js("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Te from"chalk";import xe from"inquirer";import xs from"inquirer";var lo=t(async _=>{let E=Object.keys(_?Ee.TESTNET:Ee.MAINNET),o=_?Ee.TESTNET:Ee.MAINNET,i=await xs.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:E}]),n=i.region,T=o[n];return{version:C_.version,tag:C_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Qs=t(async()=>{try{let _=F.NONE,e=V.AGAVE,E=a_.COMMISSION,o=!1,i=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:Yt,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Jt,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[F.JITO,F.SOLANA]:[F.AGAVE,F.JITO,F.FRANKENDANCER];_=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:F.AGAVE}).then(r=>r.validatorType),e=V.NONE}if(i.nodeType===D.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:xt,default:V.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${a_.COMMISSION}%)'`,default:a_.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(E=S.commission,o=S.isDummy,_===F.JITO||_===F.FRANKENDANCER){await c_();let r=await lo(n);await te(r)}}let{network:T,nodeType:s}=i;return console.log(Te.white("Network:",T)),console.log(Te.white("Node Type:",s)),console.log(Te.white("Validator Type:",_)),console.log(Te.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Te.white("Commission:",E)),await u({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Io=Qs;import{spawnSync as W}from"child_process";var se=t((_=L_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-jito`;W(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),W(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),W("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),W(`cp -r /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),W(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),W("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):W(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var Do=t(()=>`#!/bin/bash
5819
+ $ solv jupiter --help`))},"jupiterAPISetup"),co=Gs;import{existsAsync as ks}from"@skeet-framework/utils";import{readFile as Vs,writeFile as No}from"fs/promises";import{homedir as bs}from"os";import ws from"path";var a_=t(async()=>{let _=bs(),e=ws.join(_,i_.JITO_CONFIG);await ks(e)||(await No(e,JSON.stringify(R_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Vs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await No(e,JSON.stringify(R_,null,2)),E=R_}return E},"readOrCreateJitoConfig");import{spawnSync as vs}from"child_process";var ne=t(()=>{vs("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Te from"chalk";import xe from"inquirer";import Hs from"inquirer";var Oo=t(async _=>{let E=Object.keys(_?Ee.TESTNET:Ee.MAINNET),o=_?Ee.TESTNET:Ee.MAINNET,i=await Hs.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:E}]),n=i.region,T=o[n];return{version:R_.version,tag:R_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Ys=t(async()=>{try{let _=F.NONE,e=V.AGAVE,E=C_.COMMISSION,o=!1,i=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:vt,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Ht,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[F.JITO,F.SOLANA]:[F.AGAVE,F.JITO,F.FRANKENDANCER];_=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:F.AGAVE}).then(r=>r.validatorType),e=V.NONE}if(i.nodeType===D.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Yt,default:V.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${C_.COMMISSION}%)'`,default:C_.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(E=S.commission,o=S.isDummy,_===F.JITO||_===F.FRANKENDANCER){await a_();let r=await Oo(n);await te(r)}}let{network:T,nodeType:s}=i;return console.log(Te.white("Network:",T)),console.log(Te.white("Node Type:",s)),console.log(Te.white("Validator Type:",_)),console.log(Te.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Te.white("Commission:",E)),await u({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Fo=Ys;import{spawnSync as W}from"child_process";var se=t((_=L_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-jito`;W(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),W(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),W("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),W(`cp -r /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),W(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),W("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):W(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var lo=t(()=>`#!/bin/bash
5819
5820
  exec agave-validator \\
5820
- --identity ${M} \\
5821
+ --identity ${A} \\
5821
5822
  --log ${j} \\
5822
5823
  --accounts ${g_} \\
5823
5824
  --ledger ${P} \\
5824
- --snapshots ${o_} \\
5825
+ --snapshots ${E_} \\
5825
5826
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5826
5827
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5827
5828
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -5854,13 +5855,13 @@ exec agave-validator \\
5854
5855
  --wal-recovery-mode skip_any_corrupted_record \\
5855
5856
  --use-snapshot-archives-at-startup when-newest \\
5856
5857
  --limit-ledger-size 400000000 \\
5857
- `,"startJitoRPCScript");import{existsAsync as Ws}from"@skeet-framework/utils";import{writeFile as Xs}from"fs/promises";import{spawnSync as qs}from"node:child_process";var $s=t(()=>{let _=`sudo chmod +x ${t_}`;qs(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Se=$s;var Po=t(()=>`#!/bin/bash
5858
+ `,"startJitoRPCScript");import{existsAsync as Qs}from"@skeet-framework/utils";import{writeFile as qs}from"fs/promises";import{spawnSync as Js}from"node:child_process";var xs=t(()=>{let _=`sudo chmod +x ${e_}`;Js(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Se=xs;var Io=t(()=>`#!/bin/bash
5858
5859
  exec agave-validator \\
5859
- --identity ${M} \\
5860
+ --identity ${A} \\
5860
5861
  --log ${j} \\
5861
5862
  --accounts ${g_} \\
5862
5863
  --ledger ${P} \\
5863
- --snapshots ${o_} \\
5864
+ --snapshots ${E_} \\
5864
5865
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5865
5866
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5866
5867
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -5890,9 +5891,9 @@ exec agave-validator \\
5890
5891
  --wal-recovery-mode skip_any_corrupted_record \\
5891
5892
  --use-snapshot-archives-at-startup when-newest \\
5892
5893
  --limit-ledger-size 400000000 \\
5893
- `,"startRPCNodeScript");var js=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case V.AGAVE:console.log("Agave RPC Node Setup"),G_(_.TESTNET_SOLANA_VERSION),E=Po();break;case V.JITO:console.log("JITO RPC Node Setup"),se(ee),E=Do();break;default:console.log("Unknown RPC Node Setup");break}if(await Ws(t_)){console.log("Startup script already exists. Skipping...");return}await Xs(t_,E,"utf-8"),Se()},"setupRpcNode"),fo=js;import{spawnSync as zs}from"node:child_process";var Zs=t(_=>{zs(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),gE=Zs;var Uo=t((_=0,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5894
+ `,"startRPCNodeScript");var $s=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case V.AGAVE:console.log("Agave RPC Node Setup"),G_(_.TESTNET_SOLANA_VERSION),E=Io();break;case V.JITO:console.log("JITO RPC Node Setup"),se(ee),E=lo();break;default:console.log("Unknown RPC Node Setup");break}if(await Qs(e_)){console.log("Startup script already exists. Skipping...");return}await qs(e_,E,"utf-8"),Se()},"setupRpcNode"),Do=$s;import{spawnSync as Ws}from"node:child_process";var Xs=t(_=>{Ws(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),BE=Xs;var Po=t((_=0,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5894
5895
  exec ${n} \\
5895
- --identity ${M} \\
5896
+ --identity ${A} \\
5896
5897
  --vote-account ${fe} \\
5897
5898
  --authorized-voter ${b} \\
5898
5899
  --log ${j} \\
@@ -5927,9 +5928,9 @@ exec ${n} \\
5927
5928
  --snapshot-interval-slots 0 \\
5928
5929
  --private-rpc \\
5929
5930
  --full-rpc-api \\
5930
- `,"startJitoMainnetScript");var Ao=t((_=1e4,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5931
+ `,"startJitoMainnetScript");var fo=t((_=1e4,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5931
5932
  exec ${n} \\
5932
- --identity ${M} \\
5933
+ --identity ${A} \\
5933
5934
  --vote-account ${Ue} \\
5934
5935
  --authorized-voter ${K} \\
5935
5936
  --log ${j} \\
@@ -5961,9 +5962,9 @@ exec ${n} \\
5961
5962
  --expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\
5962
5963
  --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5963
5964
  --full-rpc-api \\
5964
- `,"startJitoTestnetScript");var Lo=t((_,e="agave-validator")=>`#!/bin/bash
5965
+ `,"startJitoTestnetScript");var Uo=t((_,e="agave-validator")=>`#!/bin/bash
5965
5966
  exec ${e} \\
5966
- --identity ${M} \\
5967
+ --identity ${A} \\
5967
5968
  --vote-account ${fe} \\
5968
5969
  --authorized-voter ${b} \\
5969
5970
  --log ${j} \\
@@ -5993,9 +5994,9 @@ exec ${e} \\
5993
5994
  --block-verification-method unified-scheduler \\
5994
5995
  --snapshot-interval-slots 0 \\
5995
5996
  --private-rpc \\
5996
- `,"startMainnetValidatorScript");var KE=t(_=>`#!/bin/bash
5997
+ `,"startMainnetValidatorScript");var gE=t(_=>`#!/bin/bash
5997
5998
  exec agave-validator \\
5998
- --identity ${M} \\
5999
+ --identity ${A} \\
5999
6000
  --vote-account ${Ue} \\
6000
6001
  --authorized-voter ${K} \\
6001
6002
  --log ${j} \\
@@ -6024,14 +6025,14 @@ exec agave-validator \\
6024
6025
  --full-rpc-api \\
6025
6026
  --maximum-full-snapshots-to-retain 1 \\
6026
6027
  --maximum-incremental-snapshots-to-retain 4 \\
6027
- `,"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(`
6028
- `).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,L]=O.trim().split(/\s+/);if(!l||!G)continue;let Q=parseInt(G,10);if(isNaN(Q))continue;let r_=L!==void 0&&L!=="";L==="/"&&(S=l.replace(/p?\d*$/,""));let f_=o.some(Z_=>Z_!==l&&Z_.startsWith(l)),z_=l.startsWith("nvme")?"NVMe":"SATA";Q>=400*1024*1024*1024&&E.push({name:l,size:Q,mountpoint:L||"",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 Y(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
6028
+ `,"startTestnetAgaveValidatorScript");import{existsAsync as Ao}from"@skeet-framework/utils";import{writeFile as Lo}from"fs/promises";var js=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===c.MAINNET?(console.log("Mainnet Validator Node Setup"),await zs(_,e)):E===c.TESTNET?(console.log("Testnet Validator Node Setup"),await Zs(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),zs=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:BE(o),n=Uo(_);break;case F.JITO:console.log("JITO Validator Setup for Mainnet");let s=await a_();se(o,e,T),n=Po(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await Ao(e_)){console.log("Startup script already exists. Skipping...");return}await Lo(e_,n,"utf-8"),Se()},"setupMainnetValidator"),Zs=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:BE(_.TESTNET_SOLANA_VERSION),i=gE(_);case F.AGAVE:console.log("Agave Validator Setup for Testnet"),G_(_.TESTNET_SOLANA_VERSION,e,n),i=gE(_);break;case F.JITO:console.log("JITO Validator Setup for Testnet");let T=await a_();se(_.TESTNET_SOLANA_VERSION,e,n),i=fo(T.commissionBps,T.relayerUrl,T.blockEngineUrl,T.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Testnet");break}if(await Ao(e_)){console.log("Startup script already exists. Skipping...");return}await Lo(e_,i,"utf-8"),Se()},"setupTestnetValidator"),Mo=js;import _i from"chalk";import{execSync as uo}from"node:child_process";function po(_){try{uo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{uo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(po,"createDirectoryIfNotExists");var mo=t(()=>{try{let _=[f.ACCOUNTS,f.LEDGER,f.SNAPSHOTS];for(let e of _)po(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as _S}from"child_process";function eS(){let e=_S("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6029
+ `).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 Q=parseInt(G,10);if(isNaN(Q))continue;let S_=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";Q>=400*1024*1024*1024&&E.push({name:l,size:Q,mountpoint:U||"",isMounted:S_,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 a=E.filter(O=>!r.includes(O.name)).sort((O,l)=>l.size-O.size),R=a.filter(O=>O.type==="NVMe").sort((O,l)=>l.size-O.size),N=a.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(eS,"getPreferredDisks");var re=eS;import{spawnSync as b_}from"child_process";var F_=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 KE(_){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 Y(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(KE,"getUUID");var Re=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await KE(_),T=await KE(e),s=await KE(E),S=`${n} ${f.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6029
6030
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6030
6031
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0
6031
- ${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(`
6032
+ ${s} ${f.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],a=Qe("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let N of r)a.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(`
6032
6033
  `)}" | 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:
6033
6034
  ${R.join(`
6034
- `)}`)}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 u({MNT_DISK_TYPE:$.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 Y(5e3),await Re(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await u({MNT_DISK_TYPE:$.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 u({MNT_DISK_TYPE:$.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 _=`
6035
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as ES}from"child_process";var ho=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=ES(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var tS=t(async()=>{let _=re(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await u({MNT_DISK_TYPE:$.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=F_(E),T=F_(o),s=F_(i),S=n?E:"",r=T?o:"",C=s?i:"";console.log("Waiting for formatting to finish..."),await Y(5e3),await Re(n?S:"",T?r:"",s?C:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await u({MNT_DISK_TYPE:$.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=F_(E),n=F_(o);await Re(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await u({MNT_DISK_TYPE:$.SINGLE}),e.includes("/mnt")){ho(e);let E="/dev/"+_.disks[0].name;F_(E),await Re(E)}else{let E="/dev/"+_.disks[0].name;F_(E),await Re(E)}},"mountDirs"),Bo=tS;import{spawnSync as oS}from"child_process";var go=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 _)oS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as qe}from"child_process";import{existsSync as iS}from"fs";function Ko(){if(!iS(m.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6035
6036
  # Increase UDP buffer sizes
6036
6037
  net.core.rmem_default = 134217728
6037
6038
  net.core.rmem_max = 134217728
@@ -6046,7 +6047,7 @@ fs.nr_open = 1000000
6046
6047
  `,e=`
6047
6048
  # Increase process file descriptor count limit
6048
6049
  * - nofile 1000000
6049
- `;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} {
6050
+ `;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(Ko,"setupSystemd");var yE=t((_=q.USERNAME,e)=>{let{log:E}=O_(),o=e?"frankendancer":"agave",i=`${E} {
6050
6051
  su ${_} ${_}
6051
6052
  daily
6052
6053
  rotate 1
@@ -6078,7 +6079,7 @@ fs.nr_open = 1000000
6078
6079
  compress
6079
6080
  copytruncate
6080
6081
  }
6081
- `),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]
6082
+ `),i)},"logRotates");import{existsSync as yo}from"fs";import{execSync as Go}from"child_process";function w_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&yo(m.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!yo(m.SOL_LOGROTATE)){let e=yE("solv",_);Go(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=yE("solv",_);Go(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(w_,"setupLogrotate");var nS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",TS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",sS=`/home/${q.USERNAME}/.local/share/solana/install/active_release/bin`,ko=t((_=!0)=>{let{scriptPath:e}=O_(_),E=_?TS:nS,o=sS;return`[Unit]
6082
6083
  Description=Solana Validator
6083
6084
  After=network.target
6084
6085
  StartLimitIntervalSec=0
@@ -6097,7 +6098,7 @@ Environment="${E}"
6097
6098
  ExecStart=${e}
6098
6099
 
6099
6100
  [Install]
6100
- 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
6101
+ WantedBy=multi-user.target`},"solvService");import{execSync as SS}from"child_process";function Vo(_=!0){console.log("Creating solvService configuration for solana");let e=ko(_);SS(`echo "${e}" | sudo tee ${m.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(Vo,"setupSolvService");var bo=t((_=!0)=>{w_(),Vo(_),Ko()},"makeServices");import{spawnSync as GE}from"node:child_process";var wo=t(_=>{try{Je(_);let e=_.NETWORK;return e===c.TESTNET?(GE(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),GE(`solana airdrop 1 --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"})):GE(`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 vo}from"node:child_process";var $e=t((_=!1,e="45",E=E_,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){vo(`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}vo(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as rS}from"node:child_process";var We=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];rS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as RS}from"node:child_process";var CS=t(()=>{try{RS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Ho=CS;import kE from"fs";import{promisify as Jo}from"util";import{execSync as Yo}from"child_process";var aS=Jo(kE.readFile),cS=Jo(kE.access),Xe="/etc/sysctl.conf",dS=`# set default and maximum socket buffer sizes to 128MB
6101
6102
  net.core.rmem_default=134217728
6102
6103
  net.core.wmem_default=134217728
6103
6104
  net.core.rmem_max=134217728
@@ -6108,9 +6109,9 @@ net.ipv4.tcp_rmem=10240 87380 134217728
6108
6109
  net.ipv4.tcp_wmem=10240 87380 134217728
6109
6110
 
6110
6111
  # Enable TCP westwood for kernels greater than or equal to 2.6.13
6111
- net.ipv4.tcp_congestion_control=westwood`;async function lS(){try{await OS(Xe,VE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${Xe} does not exist`)}try{let _=await NS(Xe,"utf8");if(!_.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=_.replace(/net\.core\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\n/g,"");e=e.replace(/net\.ipv4\.tcp_(rmem|wmem|congestion_control)=.*\n/g,""),e+=`
6112
- ${FS}
6113
- `,xo(`echo "${e}" | sudo tee ${Xe} > /dev/null`),xo("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(lS,"updateSysctlConfig");var qo=lS;import{spawnSync as IS}from"child_process";var $o=t(()=>{IS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as DS}from"node:child_process";var Wo=t(()=>{DS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Xo}from"child_process";var jo=t((_=!1,e=!1)=>{_?fS():PS(e)},"createSymLink"),PS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),Xo(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),fS=t(()=>{Xo("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import je from"chalk";var US=t(()=>{let _=`${je.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${je.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6112
+ net.ipv4.tcp_congestion_control=westwood`;async function NS(){try{await cS(Xe,kE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${Xe} does not exist`)}try{let _=await aS(Xe,"utf8");if(!_.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=_.replace(/net\.core\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\n/g,"");e=e.replace(/net\.ipv4\.tcp_(rmem|wmem|congestion_control)=.*\n/g,""),e+=`
6113
+ ${dS}
6114
+ `,Yo(`echo "${e}" | sudo tee ${Xe} > /dev/null`),Yo("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(NS,"updateSysctlConfig");var xo=NS;import{spawnSync as OS}from"child_process";var Qo=t(()=>{OS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as FS}from"node:child_process";var qo=t(()=>{FS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as $o}from"child_process";var Wo=t((_=!1,e=!1)=>{_?IS():lS(e)},"createSymLink"),lS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),$o(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),IS=t(()=>{$o("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import je from"chalk";var DS=t(()=>{let _=`${je.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${je.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6114
6115
 
6115
6116
  We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
6116
6117
  It's our way of supporting the community and empowering you with fast, reliable connections.
@@ -6120,11 +6121,11 @@ To get your free API key, simply join us through the link below:
6120
6121
  Validators DAO: ${je.white("`https://discord.gg/X4BgkBHavp`")}
6121
6122
 
6122
6123
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6123
- `;console.log(je.cyan(e))},"rpcLog"),p_=US;import{spawnSync as p}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
6124
+ `;console.log(je.cyan(e))},"rpcLog"),p_=DS;import{spawnSync as p}from"child_process";import{promises as VE}from"fs";import LS from"path";var PS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6124
6125
  sudo chmod -R 755 /mnt
6125
6126
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
6126
6127
  sudo chown -R solv:solv /mnt
6127
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),zo=AS;var LS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6128
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Xo=PS;var fS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6128
6129
  Description=Firedancer Solana
6129
6130
  After=network.target
6130
6131
  StartLimitIntervalSec=0
@@ -6140,7 +6141,7 @@ ExecStart=/home/solv/start-firedancer.sh
6140
6141
 
6141
6142
  [Install]
6142
6143
  WantedBy=multi-user.target
6143
- `}),"firedancerService"),Zo=LS;var MS=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6144
+ `}),"firedancerService"),jo=fS;var US=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6144
6145
  user = "solv"
6145
6146
 
6146
6147
  [log]
@@ -6307,7 +6308,7 @@ user = "solv"
6307
6308
  commission_bps = 10000
6308
6309
 
6309
6310
  [tiles.pack]
6310
- schedule_strategy = "balanced"`:o}},"configToml"),_i=MS;var uS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6311
+ schedule_strategy = "balanced"`:o}},"configToml"),zo=US;var AS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6311
6312
  Description=Relay port 9600 to localhost:80
6312
6313
  After=network.target
6313
6314
 
@@ -6317,7 +6318,7 @@ Restart=always
6317
6318
 
6318
6319
  [Install]
6319
6320
  WantedBy=multi-user.target
6320
- `}),"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();_?(p('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),p('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`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"),p(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),p(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),p("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("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();p(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),p(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Zo();p(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=ei();p("sudo apt install socat",{shell:!0,stdio:"inherit"}),p("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),p(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),p("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}`),p(`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 k(),await Io());let i=await k(),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 k(),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 k(),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
6321
+ `}),"portRelayService"),Zo=AS;var MS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?K_:y_,{filePath:i,body:n}=ve();_?(p('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),p('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await VE.mkdir(LS.dirname(i),{recursive:!0}),await VE.writeFile(i,n,"utf8"),p(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),p(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),p("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await a_(),{filePath:s,body:S}=Xo();p(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),p(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=jo();p(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let C=Zo();p("sudo apt install socat",{shell:!0,stdio:"inherit"}),p("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),p(`echo "${C.body}" | sudo tee ${C.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),p("sudo systemctl daemon-reload",{shell:!0});let a=zo(E,T);await VE.writeFile(a.filePath,a.body,"utf-8"),console.log(`config.toml written to ${a.filePath}`),p(`sudo chown solv:solv "${a.filePath}"`,{shell:!0,stdio:"inherit"}),w_(!0)},"setupFiredancer"),ze=MS;var ei=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(_i.white("\u{1F7E2} Initializing Setup")),await k(),await Fo());let i=await k(),n=i.NETWORK===c.TESTNET;switch(mo(),(!e||!E)&&await Bo(),bo(n),Qo(),Ho(),await xo(),wo(i),Wo(i.IS_DUMMY,n),i=await k(),i.NODE_TYPE){case D.RPC:await Do(i);break;case D.VALIDATOR:await Mo(i,o),i.VALIDATOR_TYPE===F.FRANKENDANCER&&await ze(o,i);break;default:throw new Error("Unknown Node Type")}E||go(),ne(),i.VALIDATOR_TYPE!==F.FRANKENDANCER&&(E||(i=await k(),qo(),$e(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),E||We(i),console.log(_i.white("\u{1F7E2} Setup Completed")),p_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var Ei=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6321
6322
  [Unit]
6322
6323
  Description=Solana transaction relayer
6323
6324
  Requires=network-online.target
@@ -6343,7 +6344,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
6343
6344
  --verifying-key-pem-path=/home/solv/public.pem
6344
6345
 
6345
6346
  [Install]
6346
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),ii=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6347
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),ti=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6347
6348
  Description=Solana transaction relayer
6348
6349
  Requires=network-online.target
6349
6350
  After=network-online.target
@@ -6366,42 +6367,42 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
6366
6367
  ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer --keypair-path=/home/solv/relayer-keypair.json --signing-key-pem-path=/home/solv/private.pem --verifying-key-pem-path=/home/solv/public.pem --forward-all
6367
6368
 
6368
6369
  [Install]
6369
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as Ze,spawnSync as I_}from"child_process";var ni=t(async(_,e=!0)=>{I_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),I_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),I_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),I_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),I_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),I_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?oi(_):ii(_);Ze(`echo "${o}" | sudo tee ${E} > /dev/null`),I_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),I_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Ze("sudo ufw allow 11228",{stdio:"inherit"}),Ze("sudo ufw allow 11229",{stdio:"inherit"}),Ze("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as wE}from"node:child_process";var hS=t(_=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:_},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),Ti=hS;import{spawnSync as BS}from"node:child_process";import{readFile as gS,writeFile as KS}from"fs/promises";var yS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await gS(_,"utf-8")).split(`
6370
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as Ze,spawnSync as l_}from"child_process";var oi=t(async(_,e=!0)=>{l_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),l_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),l_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),l_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),l_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),l_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?Ei(_):ti(_);Ze(`echo "${o}" | sudo tee ${E} > /dev/null`),l_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),l_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Ze("sudo ufw allow 11228",{stdio:"inherit"}),Ze("sudo ufw allow 11229",{stdio:"inherit"}),Ze("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as bE}from"node:child_process";var uS=t(_=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:_},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),ii=uS;import{spawnSync as pS}from"node:child_process";import{readFile as mS,writeFile as hS}from"fs/promises";var BS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await mS(_,"utf-8")).split(`
6370
6371
  `);E.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let o=E.join(`
6371
- `);await KS(_,o),BS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),si=yS;import GS from"inquirer";import{writeFile as kS}from"node:fs/promises";var Si=t(async()=>{let e=(await GS.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,E="git clone https://github.com/rpcpool/yellowstone-grpc.git",o="cargo build -r",i="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";wE(E,{shell:!0,stdio:"inherit"}),wE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),wE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=Ti(e),s=JSON.stringify(T,null,2);await kS(n,s,{encoding:"utf8"}),await si()},"yellowstoneGeyser");var ri=t(_=>{d.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let E=_.MOD||e.mod;try{if(e.vote)console.log(d_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),He(_),process.exit(0);else if(e.key)console.log(d_.white("\u{1F511} Setting up Validator Keypairs ...")),Je(_),process.exit(0);else if(e.relayer){console.log(d_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await c_()).blockEngineUrl;await ni(i,!1),console.log(d_.green(`Jito Relayer Setup Completed
6372
+ `);await hS(_,o),pS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),ni=BS;import gS from"inquirer";import{writeFile as KS}from"node:fs/promises";var Ti=t(async()=>{let e=(await gS.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,E="git clone https://github.com/rpcpool/yellowstone-grpc.git",o="cargo build -r",i="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";bE(E,{shell:!0,stdio:"inherit"}),bE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),bE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=ii(e),s=JSON.stringify(T,null,2);await KS(n,s,{encoding:"utf8"}),await ni()},"yellowstoneGeyser");var si=t(_=>{d.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let E=_.MOD||e.mod;try{if(e.vote)console.log(c_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),He(_),process.exit(0);else if(e.key)console.log(c_.white("\u{1F511} Setting up Validator Keypairs ...")),Je(_),process.exit(0);else if(e.relayer){console.log(c_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await a_()).blockEngineUrl;await oi(i,!1),console.log(c_.green(`Jito Relayer Setup Completed
6372
6373
 
6373
- $ solv relayer --help`)),ne(),p_(),process.exit(0)}else if(e.jupiter)console.log(d_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Oo(),ne(),p_(),process.exit(0);else if(e.geyser){console.log(d_.white("\u26A1\uFE0F Setting up Geyser ...")),await Si();return}else if(e.firedancer){console.log(d_.white("\u{1F525} Setting up Firedancer ...")),await ze(E);return}await ti(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(d_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(d_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as VS}from"child_process";var vE=t(()=>{let E=VS("df -h").toString().split(`
6374
- `).slice(1).filter(i=>i.split(/\s+/)[0]!=="").map(i=>{let n=i.split(/\s+/);return{Filesystem:n[0],Size:n[1],Used:n[2],Avail:n[3],Use:n[4],MountedOn:n[5]}}).sort((i,n)=>m_(n.Avail)-m_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&m_(i.Size)>9e11-1&&console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: red")}),o?console.log("your mount point is correct"):E.filter(n=>n.Filesystem.startsWith("/dev/")&&m_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Ri from"chalk";import bS from"cli-table3";var HE=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Ri.blue(o)),E=new bS({head:e,colWidths:[20,10,10,10,10,20]});_.forEach(o=>{E.push([o.Filesystem,o.Size,o.Used,o.Avail,o.Use,o.MountedOn].map(i=>Ri.white(i)))}),console.log(E.toString())},"displayTable");var Ci=t(async()=>{d.command("df").description("Disk Free Command").action(()=>{let _=vE();HE(_)})},"dfCommands"),m_=t(_=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},E=_.match(/[A-Za-z]+/)?.[0]||"",o=parseFloat(_);return e[E]?o*e[E]:o},"convertToBytes");var ai=t(_=>{d.command("start").description("Start Solana Validator").action(()=>{We(_),process.exit(0)})},"startCommand");import{spawnSync as wS}from"node:child_process";import vS from"chalk";var ci=t(async _=>{vS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];wS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var di=t(_=>{d.command("stop").description("Stop Solana Validator").action(()=>{ci(_),process.exit(0)})},"stopCommand");import{spawnSync as Ce}from"node:child_process";import Ni from"chalk";var Oi=t(_=>{let e=n_();d.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===c.TESTNET,n=o&&i?10:30;E.rm&&(console.log(Ni.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ce("solv stop",{stdio:"inherit",shell:!0}),Ce("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ce("solv get snapshot",{stdio:"inherit",shell:!0}),Ce("solv start",{stdio:"inherit",shell:!0}),console.log(Ni.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let T=`${e} --ledger ${_.LEDGER_PATH} exit --max-delinquent-stake ${_.MAINNET_DELINQUENT_STAKE} --min-idle-time ${n}`;Ce(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Fi=t(_=>{let E=_.NETWORK===c.TESTNET?i_:w;_.NODE_TYPE===D.RPC&&(E=M_),d.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${E}`,E).option("-m, --mod <version>","Use modified installer",!1).action(async o=>{let i=_.VALIDATOR_TYPE===F.JITO,n=o.mod||_.MOD;if(i){let S=o.version||L_,r=`v${S}`,a=!!S.startsWith("3");Ke(r,n,a);return}_.NODE_TYPE===D.RPC&&(E=M_);let s=o.version||E;await ue(s,n)})},"installCommands");import{spawnSync as HS}from"child_process";var li=t(()=>{d.command("mtr").description("Mount Reload Command").action(()=>{HS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),d.command("disks").description("Show unmounted disks").action(()=>{let _=re();console.log(_)})},"mountCommands");import{spawnSync as xS}from"node:child_process";import Ii from"chalk";import{spawnSync as YS}from"child_process";var JS=t(async()=>{try{let _=YS("crontab",["-l"],{encoding:"utf-8"});if(_.status!==0)return console.log("No crontab for this user."),!1;let e=_.stdout;return console.log(e),e.includes("solv epochTimer")}catch(_){return console.error("Error reading crontab:",_),!1}},"hasEpochTimer"),_E=JS;var Di=t(()=>{d.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await _E()&&(console.log(Ii.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let o=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;xS(o,{shell:!0,stdio:"inherit"}),console.log(Ii.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ae={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as qS,mkdirSync as $S}from"fs";import WS from"inquirer";import{homedir as XS}from"os";import{spawnSync as QS}from"node:child_process";function Pi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return QS(i,{shell:!0,stdio:"inherit"}).status===0}t(Pi,"executeSCP");var YE=t(async(_="")=>{let e=_;_===""&&(e=(await WS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(U()),o=XS(),i=o.includes("/home/solv")?"/home/solv":o+ae.SOLV_KEYPAIR_DOWNLOAD_PATH;qS(i)||$S(i,{recursive:!0});let n=!0,T=o+"/"+Tt;E.push(T);for(let s of E){let S=s.split("/"),r=S[S.length-1];r=o.includes("/home/solv")?r:r.replace(".json",`-${e}.json`);let a=`${i}/${r}`;Pi(e,s,a,n)&&console.log(`Successfully Exported - ${a} \u{1F389}`)}},"download");import{spawnSync as jS}from"child_process";import{existsSync as zS}from"fs";import ZS from"inquirer";import _r from"os";var fi=t(async(_="")=>{let e=_r.userInfo().homedir,E=_;_===""&&(E=(await ZS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${ae.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=ae.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(U(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let S=`${o}/${s}`;if(!zS(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;jS(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as er}from"child_process";import Er from"inquirer";var Ui=t(async()=>{let _=await Er.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${v.ROOT}/.ssh && echo "${_.pubkey}" >> ${v.AUTHORIZED_KEYS}`;er(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import eE from"chalk";import{readFileSync as tr}from"fs";import or from"os";var Ai=t(()=>{try{let e=`${or.userInfo().homedir}/.ssh/id_rsa.pub`,E=tr(e,"utf8");console.log(eE.white(`Your SSH Public Key is:
6374
+ $ solv relayer --help`)),ne(),p_(),process.exit(0)}else if(e.jupiter)console.log(c_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await co(),ne(),p_(),process.exit(0);else if(e.geyser){console.log(c_.white("\u26A1\uFE0F Setting up Geyser ...")),await Ti();return}else if(e.firedancer){console.log(c_.white("\u{1F525} Setting up Firedancer ...")),await ze(E);return}await ei(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(c_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(c_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as yS}from"child_process";var wE=t(()=>{let E=yS("df -h").toString().split(`
6375
+ `).slice(1).filter(i=>i.split(/\s+/)[0]!=="").map(i=>{let n=i.split(/\s+/);return{Filesystem:n[0],Size:n[1],Used:n[2],Avail:n[3],Use:n[4],MountedOn:n[5]}}).sort((i,n)=>m_(n.Avail)-m_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&m_(i.Size)>9e11-1&&console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: red")}),o?console.log("your mount point is correct"):E.filter(n=>n.Filesystem.startsWith("/dev/")&&m_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Si from"chalk";import GS from"cli-table3";var vE=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Si.blue(o)),E=new GS({head:e,colWidths:[20,10,10,10,10,20]});_.forEach(o=>{E.push([o.Filesystem,o.Size,o.Used,o.Avail,o.Use,o.MountedOn].map(i=>Si.white(i)))}),console.log(E.toString())},"displayTable");var ri=t(async()=>{d.command("df").description("Disk Free Command").action(()=>{let _=wE();vE(_)})},"dfCommands"),m_=t(_=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},E=_.match(/[A-Za-z]+/)?.[0]||"",o=parseFloat(_);return e[E]?o*e[E]:o},"convertToBytes");var Ri=t(_=>{d.command("start").description("Start Solana Validator").action(()=>{We(_),process.exit(0)})},"startCommand");import{spawnSync as kS}from"node:child_process";import VS from"chalk";var Ci=t(async _=>{VS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];kS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var ai=t(_=>{d.command("stop").description("Stop Solana Validator").action(()=>{Ci(_),process.exit(0)})},"stopCommand");import{spawnSync as Ce}from"node:child_process";import ci from"chalk";var di=t(_=>{let e=o_();d.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===c.TESTNET,n=o&&i?10:30;E.rm&&(console.log(ci.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ce("solv stop",{stdio:"inherit",shell:!0}),Ce("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ce("solv get snapshot",{stdio:"inherit",shell:!0}),Ce("solv start",{stdio:"inherit",shell:!0}),console.log(ci.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let T=`${e} --ledger ${_.LEDGER_PATH} exit --max-delinquent-stake ${_.MAINNET_DELINQUENT_STAKE} --min-idle-time ${n}`;Ce(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Ni=t(_=>{let E=_.NETWORK===c.TESTNET?t_:w;_.NODE_TYPE===D.RPC&&(E=M_),d.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${E}`,E).option("-m, --mod <version>","Use modified installer",!1).action(async o=>{let i=_.VALIDATOR_TYPE===F.JITO,n=o.mod||_.MOD;if(i){let S=o.version||L_,r=`v${S}`,C=!!S.startsWith("3");Ke(r,n,C);return}_.NODE_TYPE===D.RPC&&(E=M_);let s=o.version||E;await ue(s,n)})},"installCommands");import{spawnSync as bS}from"child_process";var Oi=t(()=>{d.command("mtr").description("Mount Reload Command").action(()=>{bS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),d.command("disks").description("Show unmounted disks").action(()=>{let _=re();console.log(_)})},"mountCommands");import{spawnSync as HS}from"node:child_process";import Fi from"chalk";import{spawnSync as wS}from"child_process";var vS=t(async()=>{try{let _=wS("crontab",["-l"],{encoding:"utf-8"});if(_.status!==0)return console.log("No crontab for this user."),!1;let e=_.stdout;return console.log(e),e.includes("solv epochTimer")}catch(_){return console.error("Error reading crontab:",_),!1}},"hasEpochTimer"),_E=vS;var li=t(()=>{d.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await _E()&&(console.log(Fi.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let o=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;HS(o,{shell:!0,stdio:"inherit"}),console.log(Fi.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ae={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as JS,mkdirSync as xS}from"fs";import QS from"inquirer";import{homedir as qS}from"os";import{spawnSync as YS}from"node:child_process";function Ii(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return YS(i,{shell:!0,stdio:"inherit"}).status===0}t(Ii,"executeSCP");var HE=t(async(_="")=>{let e=_;_===""&&(e=(await QS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(L()),o=qS(),i=o.includes("/home/solv")?"/home/solv":o+ae.SOLV_KEYPAIR_DOWNLOAD_PATH;JS(i)||xS(i,{recursive:!0});let n=!0,T=o+"/"+nt;E.push(T);for(let s of E){let S=s.split("/"),r=S[S.length-1];r=o.includes("/home/solv")?r:r.replace(".json",`-${e}.json`);let C=`${i}/${r}`;Ii(e,s,C,n)&&console.log(`Successfully Exported - ${C} \u{1F389}`)}},"download");import{spawnSync as $S}from"child_process";import{existsSync as WS}from"fs";import XS from"inquirer";import jS from"os";var Di=t(async(_="")=>{let e=jS.userInfo().homedir,E=_;_===""&&(E=(await XS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${ae.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=ae.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(L(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let S=`${o}/${s}`;if(!WS(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;$S(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as zS}from"child_process";import ZS from"inquirer";var Pi=t(async()=>{let _=await ZS.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${v.ROOT}/.ssh && echo "${_.pubkey}" >> ${v.AUTHORIZED_KEYS}`;zS(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import eE from"chalk";import{readFileSync as _r}from"fs";import er from"os";var fi=t(()=>{try{let e=`${er.userInfo().homedir}/.ssh/id_rsa.pub`,E=_r(e,"utf8");console.log(eE.white(`Your SSH Public Key is:
6375
6376
  `)),console.log(eE.white(E))}catch(_){console.error(eE.white(`Error reading SSH Public Key
6376
- `)),console.error(eE.white(_))}},"cat");import{spawnSync as ir}from"child_process";var Li=t(()=>{ir("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as nr}from"child_process";import{readFileSync as Tr}from"fs";import{Readable as sr}from"stream";var Mi=t(async _=>new Promise((e,E)=>{try{let o=nr("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6377
- `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),Sr=t(_=>{try{return JSON.parse(Tr(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),ui=t(async(_,e)=>{let E=[],o=sr.from(_);return o.on("data",async i=>{Sr(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import EE from"chalk";import{Presets as ar,SingleBar as cr}from"cli-progress";import pi from"chalk";import{spawnSync as rr}from"node:child_process";import Rr from"node-fetch";var Cr=t(async()=>{let _=await Rr(at,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(pi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6378
- Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)rr(E,{shell:!0,stdio:"ignore"});return console.log(pi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),mi=Cr;var hi=t(()=>{let _=d.command("scp").description("Scp Commands").argument("<cmd>");_.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await YE(e.ip);return}await YE()}),_.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await mi();return}await fi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await Ui()}),_.command("cat").description("Show SSH Public Key").action(()=>{Ai()}),_.command("init").description("Init SSH Key Pair").action(()=>{Li()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new cr({},ar.shades_classic);e.start(1e4,0);let E=await Mi(e),o=await ui(E,e);e.stop(),console.log(EE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(EE.green(`
6377
+ `)),console.error(eE.white(_))}},"cat");import{spawnSync as Er}from"child_process";var Ui=t(()=>{Er("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as tr}from"child_process";import{readFileSync as or}from"fs";import{Readable as ir}from"stream";var Ai=t(async _=>new Promise((e,E)=>{try{let o=tr("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6378
+ `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),nr=t(_=>{try{return JSON.parse(or(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),Li=t(async(_,e)=>{let E=[],o=ir.from(_);return o.on("data",async i=>{nr(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import EE from"chalk";import{Presets as rr,SingleBar as Rr}from"cli-progress";import Mi from"chalk";import{spawnSync as Tr}from"node:child_process";import sr from"node-fetch";var Sr=t(async()=>{let _=await sr(Rt,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(Mi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6379
+ Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)Tr(E,{shell:!0,stdio:"ignore"});return console.log(Mi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),ui=Sr;var pi=t(()=>{let _=d.command("scp").description("Scp Commands").argument("<cmd>");_.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await HE(e.ip);return}await HE()}),_.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await ui();return}await Di(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await Pi()}),_.command("cat").description("Show SSH Public Key").action(()=>{fi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Ui()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Rr({},rr.shades_classic);e.start(1e4,0);let E=await Ai(e),o=await Li(E,e);e.stop(),console.log(EE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(EE.green(`
6379
6380
  ${o.join(`
6380
6381
  `)}`)),console.log(EE.white(`
6381
6382
  Only showing the first 10 results
6382
6383
 
6383
- `)),console.log(EE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as dr}from"child_process";var Bi=t(_=>{d.command("status").description("Check Solana Validator Status").action(()=>{Nr(_)})},"statusCommands"),Nr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`;dr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Or}from"node:child_process";var gi=t(async(_,e)=>{try{let E=await k(),o=E.NETWORK===c.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?c.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return Or(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import yi from"inquirer";import{spawnSync as Fr}from"node:child_process";var Ki=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=Fr(`solana create-stake-account ${_} ${e}`,{shell:!0,stdio:"pipe"}),n=i.stdout.toString()+i.stderr.toString();if(n.includes("Signature:"))return console.log("Stake account created successfully:",n),!0;if(n.includes("Error:"))console.log("Error encountered:",n),o++,console.log(`Retrying... (${o}/${E})`);else{console.log("Unknown output:",n);break}o===E&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as lr,existsAsync as Ir}from"@skeet-framework/utils";import{execSync as Dr,spawnSync as oE}from"node:child_process";import Pr from"node:os";var Gi=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await yi.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;oE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await yi.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Ur(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return V_({STAKE_ACCOUNT:S}),Ki(T,Number(i.solAmount))},"stakeAccountQuestion"),fr=Pr.userInfo().homedir,tE=fr+"/stake-account",Ur=t(async()=>{await Ir(tE)||oE(`mkdir -p ${tE}`,{shell:!0});let _=oE(`ls ${tE}`,{shell:!0}).stdout.toString().split(`
6384
- `).filter(n=>n.includes(".json")),e=lr(_.length+1),E=`${tE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return oE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Dr(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Ar}from"node:child_process";var ki=t(async _=>{try{let E=(await k()).NETWORK===c.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Ar(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Lr}from"node:child_process";var Vi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return Lr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import J_ from"chalk";import{Connection as Mr,PublicKey as ur}from"@solana/web3.js";import{stakePoolInfo as pr}from"@solana/spl-stake-pool";var iE=t(async(_,e=e_)=>{try{let E=new Mr(_),o=new ur(e);return await pr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as mr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as hr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Br}from"@metaplex-foundation/umi";var bi=t(async(_,e)=>{try{let E=Br(e);console.log(`mintPubkey: ${E}`);let o=hr(_),i=await mr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ce from"chalk";import wi from"inquirer";var vi=t(async _=>{let e=await wi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:e_}]);try{let E=await iE(_,e.stakePoolAddress);if(!E)return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6384
+ `)),console.log(EE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as Cr}from"child_process";var mi=t(_=>{d.command("status").description("Check Solana Validator Status").action(()=>{ar(_)})},"statusCommands"),ar=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`;Cr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as cr}from"node:child_process";var hi=t(async(_,e)=>{try{let E=await k(),o=E.NETWORK===c.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?c.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return cr(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import gi from"inquirer";import{spawnSync as dr}from"node:child_process";var Bi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=dr(`solana create-stake-account ${_} ${e}`,{shell:!0,stdio:"pipe"}),n=i.stdout.toString()+i.stderr.toString();if(n.includes("Signature:"))return console.log("Stake account created successfully:",n),!0;if(n.includes("Error:"))console.log("Error encountered:",n),o++,console.log(`Retrying... (${o}/${E})`);else{console.log("Unknown output:",n);break}o===E&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as Nr,existsAsync as Or}from"@skeet-framework/utils";import{execSync as Fr,spawnSync as oE}from"node:child_process";import lr from"node:os";var Ki=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await gi.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;oE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await gi.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Dr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return V_({STAKE_ACCOUNT:S}),Bi(T,Number(i.solAmount))},"stakeAccountQuestion"),Ir=lr.userInfo().homedir,tE=Ir+"/stake-account",Dr=t(async()=>{await Or(tE)||oE(`mkdir -p ${tE}`,{shell:!0});let _=oE(`ls ${tE}`,{shell:!0}).stdout.toString().split(`
6385
+ `).filter(n=>n.includes(".json")),e=Nr(_.length+1),E=`${tE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return oE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Fr(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Pr}from"node:child_process";var yi=t(async _=>{try{let E=(await k()).NETWORK===c.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Pr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as fr}from"node:child_process";var Gi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return fr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import J_ from"chalk";import{Connection as Ur,PublicKey as Ar}from"@solana/web3.js";import{stakePoolInfo as Lr}from"@solana/spl-stake-pool";var iE=t(async(_,e=Z)=>{try{let E=new Ur(_),o=new Ar(e);return await Lr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as Mr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as ur}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as pr}from"@metaplex-foundation/umi";var ki=t(async(_,e)=>{try{let E=pr(e);console.log(`mintPubkey: ${E}`);let o=ur(_),i=await Mr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ce from"chalk";import Vi from"inquirer";var bi=t(async _=>{let e=await Vi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:Z}]);try{let E=await iE(_,e.stakePoolAddress);if(!E)return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6385
6386
  Please check the correct address and try again.
6386
6387
  `)),console.log(ce.white(`For stake pool information
6387
- \u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await bi(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
6388
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await ki(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
6388
6389
  Name: ${n.name}
6389
- Token Mint: ${n.mint}`;return(await wi.prompt([{type:"confirm",name:"confirm",message:T+`
6390
+ Token Mint: ${n.mint}`;return(await Vi.prompt([{type:"confirm",name:"confirm",message:T+`
6390
6391
  Is this the correct Stake Pool?`}])).confirm?n:(console.log(ce.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6391
6392
  Please check the correct address and try again.
6392
6393
  `)),console.log(ce.white(`For stake pool information
6393
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as xr}from"fs/promises";import Oe from"inquirer";import{existsAsync as Qr}from"@skeet-framework/utils";import{Connection as Qi,Keypair as wr,PublicKey as Ne}from"@solana/web3.js";import{Connection as gr,PublicKey as Kr,Keypair as yr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Gr}from"@solana/spl-token";var de=t(async(_,e,E,o,i=!1)=>{try{let n=yr.fromSecretKey(new Uint8Array(e)),T=new Kr(E),s=new gr(_);return(await Gr(s,n,T,o,i)).address.toBase58()}catch(n){throw console.log("Error in getOrCreateDestinationAddress",n),new Error(JSON.stringify(n))}},"getOrCreateDestinationAddress");import{Spinner as vr}from"cli-spinner";import h_ from"chalk";import{PublicKey as Yi,Keypair as Ji,Transaction as Hi,ComputeBudgetProgram as kr,LAMPORTS_PER_SOL as Vr}from"@solana/web3.js";import*as xi from"@solana/spl-stake-pool";var v_=t(async(_,e,E,o=new Yi(e_),i,n,T)=>{try{let s=Ji.fromSecretKey(new Uint8Array(e)),S=E*Vr,{instructions:r,signers:a}=await br(_,e,S,o,i,n,T),C=new Hi().add(...r);C.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});C.recentBlockhash=R.value.blockhash,C.sign(...a,s);let N=new Hi().add(...r).add(kr.setComputeUnitPrice({microLamports:1e3}));N.feePayer=s.publicKey,N.recentBlockhash=R.value.blockhash,N.sign(...a,s);let I=await _.sendRawTransaction(N.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...R.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),br=t(async(_,e,E,o=new Yi(e_),i,n,T)=>{let S=Ji.fromSecretKey(new Uint8Array(e)).publicKey;return await xi.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as qi}from"@skeet-framework/utils";var nE=t(async(_,e,E,o)=>{console.log(h_.white("Solana RPC URL:",_));let i=new Qi(_);E===0&&(E=await TE());let n=new vr("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(h_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new Ne(e),s=wr.fromSecretKey(new Uint8Array(o)),S=s_;n.setSpinnerTitle(h_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await de(_,o,S,s.publicKey);await qi(1e3),n.setSpinnerTitle(h_.green("\u{1F504} Converting SOL to elSOL"));let a=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey),C=0;for(;a.status!=="success";){if(C++,C>10)return n.stop(!0),console.log(h_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(h_.yellow(`\u23F3 ${C} Times Retrying...`)),await qi(3e3),i=new Qi(_),a=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey)}return n.stop(!0),console.log(h_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6394
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Hr}from"fs/promises";import Oe from"inquirer";import{existsAsync as Yr}from"@skeet-framework/utils";import{Connection as Ji,Keypair as kr,PublicKey as Ne}from"@solana/web3.js";import{Connection as mr,PublicKey as hr,Keypair as Br}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as gr}from"@solana/spl-token";var de=t(async(_,e,E,o,i=!1)=>{try{let n=Br.fromSecretKey(new Uint8Array(e)),T=new hr(E),s=new mr(_);return(await gr(s,n,T,o,i)).address.toBase58()}catch(n){throw console.log("Error in getOrCreateDestinationAddress",n),new Error(JSON.stringify(n))}},"getOrCreateDestinationAddress");import{Spinner as Vr}from"cli-spinner";import h_ from"chalk";import{PublicKey as vi,Keypair as Hi,Transaction as wi,ComputeBudgetProgram as Kr,LAMPORTS_PER_SOL as yr}from"@solana/web3.js";import*as Yi from"@solana/spl-stake-pool";var v_=t(async(_,e,E,o=new vi(Z),i,n,T)=>{try{let s=Hi.fromSecretKey(new Uint8Array(e)),S=E*yr,{instructions:r,signers:C}=await Gr(_,e,S,o,i,n,T),a=new wi().add(...r);a.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});a.recentBlockhash=R.value.blockhash,a.sign(...C,s);let N=new wi().add(...r).add(Kr.setComputeUnitPrice({microLamports:1e3}));N.feePayer=s.publicKey,N.recentBlockhash=R.value.blockhash,N.sign(...C,s);let I=await _.sendRawTransaction(N.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...R.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),Gr=t(async(_,e,E,o=new vi(Z),i,n,T)=>{let S=Hi.fromSecretKey(new Uint8Array(e)).publicKey;return await Yi.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as xi}from"@skeet-framework/utils";var nE=t(async(_,e,E,o)=>{console.log(h_.white("Solana RPC URL:",_));let i=new Ji(_);E===0&&(E=await TE());let n=new Vr("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(h_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new Ne(e),s=kr.fromSecretKey(new Uint8Array(o)),S=n_;n.setSpinnerTitle(h_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await de(_,o,S,s.publicKey);await xi(1e3),n.setSpinnerTitle(h_.green("\u{1F504} Converting SOL to elSOL"));let C=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey),a=0;for(;C.status!=="success";){if(a++,a>10)return n.stop(!0),console.log(h_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(h_.yellow(`\u23F3 ${a} Times Retrying...`)),await xi(3e3),i=new Ji(_),C=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey)}return n.stop(!0),console.log(h_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6394
6395
 
6395
- Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as Hr,Keypair as Yr,PublicKey as H_}from"@solana/web3.js";import{Spinner as Jr}from"cli-spinner";import Y_ from"chalk";import{sleep as $i}from"@skeet-framework/utils";var Wi=t(async(_,e,E,o,i)=>{let n=new Hr(_);E===0&&(E=await TE());let T=new Jr("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(Y_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new H_(e),S=await iE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(Y_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,a=Yr.fromSecretKey(new Uint8Array(o)),C=await de(_,o,r,a.publicKey),R=await de(_,o,r,new H_(gt),!0);await $i(1e3),T.setSpinnerTitle(Y_.green(`\u{1F504} Converting SOL to ${i}`));let N=await v_(n,o,E,s,new H_(C),new H_(R),a.publicKey),I=0;for(;N.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(Y_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Y_.yellow(`\u23F3 ${I} Times Retrying...
6396
- `)),await $i(1e3),N=await v_(n,o,E,s,new H_(C),new H_(R),a.publicKey)}return T.stop(!0),console.log(Y_.white(`\u{1F4B0} You've got ${i} \u2728
6396
+ Signature:`,C.signature)),!0},"elSOLdeposit");import{Connection as br,Keypair as wr,PublicKey as H_}from"@solana/web3.js";import{Spinner as vr}from"cli-spinner";import Y_ from"chalk";import{sleep as Qi}from"@skeet-framework/utils";var qi=t(async(_,e,E,o,i)=>{let n=new br(_);E===0&&(E=await TE());let T=new vr("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(Y_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new H_(e),S=await iE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(Y_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,C=wr.fromSecretKey(new Uint8Array(o)),a=await de(_,o,r,C.publicKey),R=await de(_,o,r,new H_(ht),!0);await Qi(1e3),T.setSpinnerTitle(Y_.green(`\u{1F504} Converting SOL to ${i}`));let N=await v_(n,o,E,s,new H_(a),new H_(R),C.publicKey),I=0;for(;N.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(Y_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Y_.yellow(`\u23F3 ${I} Times Retrying...
6397
+ `)),await Qi(1e3),N=await v_(n,o,E,s,new H_(a),new H_(R),C.publicKey)}return T.stop(!0),console.log(Y_.white(`\u{1F4B0} You've got ${i} \u2728
6397
6398
 
6398
- Signature:`,N.signature)),!0},"depositeLST");import{execSync as sE}from"node:child_process";import{homedir as qr}from"os";var Xi=t(_=>{d.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let E=Number(e.amount);console.log("RPC URL:",_.RPC_URL);let o=e_,i=_.NETWORK===c.TESTNET,n=qr(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(sE(`solana config set --keypair ${T}`),!await Qr(T)){console.log(J_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6399
- `)),console.log(J_.white(T));return}let s=JSON.parse(await xr(T,"utf-8"));if(e.elsol){await nE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await vi(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await Wi(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await Gi(_))return;let r=await k(),{validatorVoteAccount:a,stakeAccounts:C}=await Wr(r);for await(let R of C)try{await gi(R,a)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6399
+ Signature:`,N.signature)),!0},"depositeLST");import{execSync as sE}from"node:child_process";import{homedir as Jr}from"os";var $i=t(_=>{d.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let E=Number(e.amount);console.log("RPC URL:",_.RPC_URL);let o=Z,i=_.NETWORK===c.TESTNET,n=Jr(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(sE(`solana config set --keypair ${T}`),!await Yr(T)){console.log(J_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6400
+ `)),console.log(J_.white(T));return}let s=JSON.parse(await Hr(T,"utf-8"));if(e.elsol){await nE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await bi(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await qi(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await Ki(_))return;let r=await k(),{validatorVoteAccount:C,stakeAccounts:a}=await Qr(r);for await(let R of a)try{await hi(R,C)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6400
6401
  You can use a custom RPC endpoint to avoid this issue
6401
- `))}}}),d.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await jr();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await $r();for await(let o of E)try{await ki(o)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6402
+ `))}}}),d.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await $r();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await xr();for await(let o of E)try{await yi(o)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6402
6403
  You can use a custom RPC endpoint to avoid this issue
6403
- `))}}else{let E=await zr();await Vi(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),TE=t(async()=>{let _=sE("solana address").toString().trim(),e=sE("solana balance").toString().replace("SOL","").trim();console.log(J_.white(`\u{1F4D7} Selected Wallet: ${_}
6404
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(J_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Oe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),$r=t(async()=>{let _=await k();return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Wr=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?Xr(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return E}}])},"delegateStakeAsk"),Xr=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return sE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),jr=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Oe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),zr=t(async()=>{let _=(await k()).STAKE_ACCOUNTS;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:_},{type:"input",name:"destinationAddress",message:"What is the destination address for the withdrawn SOL?",default(){return"xxxxxxxx"}},{type:"input",name:"solAmount",message:"How many SOL would you like to withdraw?",default(){return"1"}}])},"withdrawStakeAsk");import{execSync as Zr}from"child_process";var ji=t(()=>{try{return Zr("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as _R}from"child_process";var zi=t(()=>{try{return _R("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import N_ from"chalk";import{Spinner as eR}from"cli-spinner";var x_;(function(_){_.successHex=N_.hex("#39A845"),_.warningHex=N_.hex("#FFD02E"),_.errorHex=N_.hex("#B5332E"),_.syncHex=N_.hex("#3073B7"),_.greyHex=N_.hex("#BEBDBD"),_.indigoHex=N_.hex("#3950A0"),_.pinkHex=N_.hex("#D8A1C4"),_.normal=e=>{console.log(N_.white(e))},_.syncSpinner=e=>{let E=new eR(N_.white(e)+` %s
6404
+ `))}}else{let E=await Wr();await Gi(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),TE=t(async()=>{let _=sE("solana address").toString().trim(),e=sE("solana balance").toString().replace("SOL","").trim();console.log(J_.white(`\u{1F4D7} Selected Wallet: ${_}
6405
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(J_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Oe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),xr=t(async()=>{let _=await k();return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Qr=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?qr(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return E}}])},"delegateStakeAsk"),qr=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return sE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),$r=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Oe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),Wr=t(async()=>{let _=(await k()).STAKE_ACCOUNTS;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:_},{type:"input",name:"destinationAddress",message:"What is the destination address for the withdrawn SOL?",default(){return"xxxxxxxx"}},{type:"input",name:"solAmount",message:"How many SOL would you like to withdraw?",default(){return"1"}}])},"withdrawStakeAsk");import{execSync as Xr}from"child_process";var Wi=t(()=>{try{return Xr("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as jr}from"child_process";var Xi=t(()=>{try{return jr("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import d_ from"chalk";import{Spinner as zr}from"cli-spinner";var x_;(function(_){_.successHex=d_.hex("#39A845"),_.warningHex=d_.hex("#FFD02E"),_.errorHex=d_.hex("#B5332E"),_.syncHex=d_.hex("#3073B7"),_.greyHex=d_.hex("#BEBDBD"),_.indigoHex=d_.hex("#3950A0"),_.pinkHex=d_.hex("#D8A1C4"),_.normal=e=>{console.log(d_.white(e))},_.syncSpinner=e=>{let E=new zr(d_.white(e)+` %s
6405
6406
  `);try{return E.setSpinnerString(18),E.start(),E}catch(o){throw E.stop(!0),new Error(`syncSpinner Error: ${o}`)}},_.solvAA=()=>{let e=_.syncHex(" _ "),E=_.syncHex(" | | "),o=_.syncHex(" ___ ___ | |")+_.errorHex("_ __ "),i=_.syncHex("/ __|/ _ \\| |")+_.errorHex("\\ \\ / /"),n=_.syncHex("\\__ \\ (_) | |")+_.errorHex(" \\ V / "),T=_.syncHex("|___/\\___/|_|")+_.errorHex(" \\_/ ");console.log(`
6406
6407
  ${e}`),console.log(`${E}`),console.log(`${o}`),console.log(`${i}`),console.log(`${n}`),console.log(`${T}
6407
6408
  `),console.log(`Solv Version: v${De}
@@ -6425,8 +6426,8 @@ $ solv mt -p <fileSystem>
6425
6426
  $ solv umt -p <fileSystem>
6426
6427
  `,i=`mount reload
6427
6428
  $ solv mtr
6428
- `;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:
6429
- `)),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}
6429
+ `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(x_||(x_={}));import __ from"chalk";import{spawnSync as Zr}from"node:child_process";var SE=t(_=>{Zr("solana config get",{shell:!0,stdio:"inherit"});let E=O_();console.log(__.white("start-validator.sh: ")+E.scriptPath),console.log(__.white("solv.service: ")+m.SOL_SERVICE),console.log(__.white("logrotate: ")+m.SOL_LOGROTATE),console.log(__.white("logrotate (fd): ")+m.FRANKENDANCER_LOGROTATE),console.log(__.white("sysctl.d: ")+m.SOL_SYSTEM_CONFIG21),console.log(__.white("limits.d: ")+m.SOL_NOFILES_CONF),console.log(__.white("system.conf: ")+m.SOL_SYSTEM_CONF),console.log(__.white("ledger: ")+E.ledger),console.log(__.white("accounts: ")+E.accounts),console.log(__.white("snapshots: ")+E.snapshots),console.log(__.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as ji}from"node:child_process";import _R from"chalk";var zi=t(_=>{let e=_.NETWORK===c.TESTNET,E=e?t_: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=Wi();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=ji(i,{shell:!0,stdio:"pipe"});console.log(_R.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=Xi();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=`${o_()} --ledger /mnt/ledger/ contact-info`;ji(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 eR}from"node:child_process";var Zi=t(()=>{eR("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as ER}from"node:child_process";var _n=t(()=>{ER("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as tR}from"node:child_process";var en=t(()=>{tR("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as oR}from"node:child_process";var En=t(()=>{oR("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as iR}from"node:child_process";var tn=t((_=!1)=>{iR(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import YE from"chalk";import{spawnSync as TR}from"child_process";import{spawnSync as nR}from"node:child_process";var on=t(()=>{nR("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var nn=t(()=>{let _=d.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{Zi()}),_.command("start").description("Start Relayer").action(()=>{_n()}),_.command("stop").description("Stop Relayer").action(()=>{en()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{tn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{En()}),_.command("enable").description("Enable Relayer").action(()=>{on()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(YE.red("Please provide a URL"));return}let E=`${o_()} --ledger ${P} set-relayer-config --relayer-url ${e.url}`;console.log(YE.white("Setting Relayer URL ...")),TR(E,{shell:!0,stdio:"inherit"}),console.log(YE.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as rR}from"child_process";import{spawnSync as sR}from"child_process";var rE=t(()=>{sR("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as SR}from"child_process";var Tn=t(()=>{SR("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var sn=t(_=>{rE();let e=`sudo rm -rf ${m.SOL_LOGROTATE}`;rR(e,{shell:!0,stdio:"inherit"}),w_(_),Tn()},"updateLogrotate");var Sn=t(_=>{d.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";sn(e),process.exit(0)})},"logrotateCommand");import rn from"chalk";import{spawnSync as RR}from"child_process";var Rn=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;RR(e,{shell:!0,stdio:"inherit"})}catch{console.log(rn.yellow(`You might need to install the Solana SPL CLI:
6430
+ `)),console.log(rn.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as aR}from"os";import{spawnSync as CR}from"child_process";var I_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=CR(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import cR from"chalk";import{spawnSync as dR}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=`${aR()}/mainnet-authority-keypair.json`;await Rn(o),process.exit(0)}await NR(_),process.exit(0)})},"balanceCommands"),NR=t(async _=>{let e=OR(_),E=`Validator Key: ${e.validatorKey}
6430
6431
  Address: ${e.validatorKeyAddress}
6431
6432
  Balance: ${e.validatorKeyBalance}
6432
6433
  Vote Key: ${e.voteKey}
@@ -6438,18 +6439,18 @@ Balance: ${e.authorityKeyBalance}
6438
6439
  Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
6439
6440
  Address: ${e.validatorKeyAddress}
6440
6441
  Balance: ${e.validatorKeyBalance}
6441
- Active Identity:`),console.log(OR.white(E)),FR(`solana-keygen pubkey ${M}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),IR=t(_=>{let e=U(),E=_.NETWORK===c.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:A(e.mainnetValidatorKey),validatorKeyBalance:D_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:A(e.testnetValidatorKey),validatorKeyBalance:D_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:A(e.testnetValidatorVoteKey),voteKeyBalance:D_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:A(e.testnetValidatorAuthorityKey),authorityKeyBalance:D_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:A(e.mainnetValidatorKey),validatorKeyBalance:D_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:A(e.mainnetValidatorVoteKey),voteKeyBalance:D_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:A(e.mainnetValidatorAuthorityKey),authorityKeyBalance:D_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as xE}from"node:child_process";var dn=t(_=>{xE("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&xE(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),xE("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as DR}from"node:child_process";var Nn=t(_=>{let E=`${n_()} --ledger ${_.LEDGER_PATH} monitor`;DR(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as PR}from"node:child_process";var On=t(()=>{PR("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import RE from"inquirer";import{execSync as CE,spawnSync as QE}from"child_process";import Fe from"chalk";import{homedir as fR}from"os";var Fn=1e3,qE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(qE||(qE={}));var aE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(aE||(aE={}));var UR=Object.values(qE),ln=t(_=>{d.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(Fe.blue(`\u2728 Coming Soon
6442
+ Active Identity:`),console.log(cR.white(E)),dR(`solana-keygen pubkey ${A}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),OR=t(_=>{let e=L(),E=_.NETWORK===c.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:I_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:M(e.testnetValidatorKey),validatorKeyBalance:I_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:M(e.testnetValidatorVoteKey),voteKeyBalance:I_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:M(e.testnetValidatorAuthorityKey),authorityKeyBalance:I_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:I_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:M(e.mainnetValidatorVoteKey),voteKeyBalance:I_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:M(e.mainnetValidatorAuthorityKey),authorityKeyBalance:I_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as JE}from"node:child_process";var an=t(_=>{JE("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&JE(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),JE("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as FR}from"node:child_process";var cn=t(_=>{let E=`${o_()} --ledger ${_.LEDGER_PATH} monitor`;FR(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as lR}from"node:child_process";var dn=t(()=>{lR("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import RE from"inquirer";import{execSync as CE,spawnSync as xE}from"child_process";import Fe from"chalk";import{homedir as IR}from"os";var Nn=1e3,QE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(QE||(QE={}));var aE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(aE||(aE={}));var DR=Object.values(QE),On=t(_=>{d.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(Fe.blue(`\u2728 Coming Soon
6442
6443
  This Feature is Currently Under Development
6443
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await AR(),n="0";try{let C=QE(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(C.status!==0)throw new Error("Invalid Wallet Address");n=C.stdout.toString(),console.log("toBalance:",n)}catch{console.log(Fe.red(`\u274C To Wallet is Invalid
6444
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await PR(),n="0";try{let a=xE(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(a.status!==0)throw new Error("Invalid Wallet Address");n=a.stdout.toString(),console.log("toBalance:",n)}catch{console.log(Fe.red(`\u274C To Wallet is Invalid
6444
6445
  Please Check the Wallet Address`)),process.exit(0)}let T=CE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(Fe.white(`\u{1F3E6} From Wallet: ${o}
6445
6446
  \u{1F4B0} Balance: ${T}`)),console.log(Fe.white(`\u{1F3E6} To Wallet: ${i}
6446
- \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
6447
- Retrying Transaction in ${Fn}ms
6448
- Retries Left: ${a}`)),await Y(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 Y(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:
6449
- `)),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})],L=new Bn(new gn({instructions:G,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());L.sign([s]);let Q=await T.sendRawTransaction(L.serialize());return await T.confirmTransaction({...I.value,signature:Q},"finalized"),console.log("finalized signature:",Q),Q}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(`
6447
+ \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=xE(S,{shell:!0,stdio:"inherit"}),C=Ae;for(;r.status!==0&&C>0;)console.log(Fe.red(`\u274C Transaction Failed
6448
+ Retrying Transaction in ${Nn}ms
6449
+ Retries Left: ${C}`)),await Y(Nn),r=xE(S,{shell:!0,stdio:"inherit"}),C--;process.exit(0)})},"transferCommands"),qE=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),PR=t(async()=>{let _=IR(),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:DR}]),T=n.from==="Validator Account"?Object.values(aE).filter(a=>a!=="Validator Account"):Object.values(aE).filter(a=>a!=="Authority Account");if((await RE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:a}=await RE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:qE}]);i=a}else{let a=n.from==="Validator Account"?e:E;o=`${_}/${a}`,i=CE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,C=CE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:C,toAddress:i}},"selectFromKeypairs");import Fn from"chalk";import fR from"inquirer";import{execSync as $E,spawnSync as UR}from"node:child_process";var ln=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=$E(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(Fn.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(Fn.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let N=await fR.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(N.sol)}let C=$E(`solana address --keypair ${T}`).toString().trim(),a=$E(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${C} ${a} ${S} --authorized-withdrawer ${n} --url ${o}`;UR(R,{shell:!0,stdio:"inherit"})},"withdraw");var In=t(_=>{d.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await ln(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as kR,spawnSync as VR}from"node:child_process";import{BN as Pn}from"bn.js";import{LAMPORTS_PER_SOL as WE}from"@solana/web3.js";import{Connection as uR,LAMPORTS_PER_SOL as pR}from"@solana/web3.js";import{Keypair as AR}from"@solana/web3.js";import{readFile as LR}from"fs/promises";var MR=t(async _=>{let e=JSON.parse(await LR(_,"utf8"));return AR.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),Dn=MR;import{homedir as mR}from"os";var s_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(s_||(s_={}));var hR={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},BR=t(async(_,e="auth",E=!1)=>{let o=new uR(_),i=mR(),n=L(i),s=`${E?"testnet":"mainnet"}${hR[e]}`,S=n[s],r=await Dn(S),C=await o.getBalance(r.publicKey),R=Number(C)/pR;if(isNaN(R))throw new Error("Failed to get balance");return R},"getBalance"),D_=BR;var gR=new Pn(3*WE),fn=t(async _=>{let e=await D_(_,s_.VALIDATOR),o=new Pn(Number(Number(e)*WE)).sub(gR),i=Number(o)/WE;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import le from"chalk";import{Keypair as KR,Connection as yR,PublicKey as GR,SystemProgram as Un,ComputeBudgetProgram as cE,VersionedTransaction as An,TransactionMessage as Ln}from"@solana/web3.js";var Mn=t(async(_,e,E,o)=>{let i=0;try{let n=new yR(_,"finalized"),T=KR.fromSecretKey(new Uint8Array(Array.from(e))),s=new GR(E),S=o;for(;;)try{let r=[Un.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:2e5}),cE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],C=await n.getLatestBlockhashAndContext({commitment:"finalized"}),a=new An(new Ln({instructions:r,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(a,{replaceRecentBlockhash:!0,sigVerify:!1});a.sign([T]);let N=[Un.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 An(new Ln({instructions:N,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message());I.sign([T]);let O=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...C.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 Y(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as bR}from"fs/promises";import{LAMPORTS_PER_SOL as wR}from"@solana/web3.js";var XE=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=L();await D_(_,s_.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 fn(_);console.log(le.white(`Transferable Balance: ${i} SOL`));let n=i*wR;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=kR(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await bR(E,"utf-8"));await Mn(_,s,T,n)}return!0},"collectSOL");import{readFile as jR}from"fs/promises";import zR from"inquirer";import jE from"chalk";import{execSync as vR}from"child_process";import{homedir as HR}from"os";var YR=t(async _=>{try{let e=HR(),{mainnetValidatorAuthorityKey:E}=L(e),o=`spl-token balance ${n_} --owner ${E} --url ${_}`,i=vR(o).toString().trim();return Number(i)}catch(e){return console.log(jE.red(`Error: ${e}`)),console.log(jE.yellow(`You might need to install the Solana SPL CLI:
6450
+ `)),console.log(jE.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),un=YR;import OE from"chalk";import{Connection as JR,PublicKey as pn,Keypair as xR,ComputeBudgetProgram as dE,VersionedTransaction as mn,TransactionMessage as hn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Bn,createTransferInstruction as gn,TOKEN_PROGRAM_ID as Kn}from"@solana/spl-token";var yn=t(async(_,e,E,o,i,n)=>{try{let T=new JR(_,"finalized"),s=xR.fromSecretKey(new Uint8Array(e)),S=new pn(E),r=new pn(i),C=Math.trunc(o*Math.pow(10,n)),a=await Bn(T,s,r,s.publicKey),R=await Bn(T,s,r,S,!0);for(;;)try{let N=[gn(a.address,R.address,s.publicKey,C,[],Kn),dE.setComputeUnitLimit({units:2e5}),dE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),O=new mn(new hn({instructions:N,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),l=await T.simulateTransaction(O,{replaceRecentBlockhash:!0,sigVerify:!1});O.sign([s]);let G=[gn(a.address,R.address,s.publicKey,C,[],Kn),dE.setComputeUnitLimit({units:l.value.unitsConsumed?Math.trunc(l.value.unitsConsumed*1.2):2e5}),dE.setComputeUnitPrice({microLamports:1e3})],U=new mn(new hn({instructions:G,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());U.sign([s]);let Q=await T.sendRawTransaction(U.serialize());return await T.confirmTransaction({...I.value,signature:Q},"finalized"),console.log("finalized signature:",Q),Q}catch(N){console.error("Transfer failed, retrying...",N)}}catch(T){throw console.error(T),T}},"transferSPLToken");import NE from"inquirer";import{spawnSync as Gn}from"child_process";import zE from"chalk";import{promises as kn}from"fs";var QR=t(async(_="epochTimer")=>{try{let e=Gn("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(`
6450
6451
  `).filter(n=>!n.includes(_)).join(`
6451
- `),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 u({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6452
- ${vn.green("No more Login to the server to update \u{1F331}")}
6452
+ `),i="/tmp/temp_crontab";await kn.writeFile(i,o,"utf-8"),Gn("crontab",[i]),await kn.unlink(i),console.log(zE.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(zE.red("Error removing cron job:",e))}},"removeCronJob"),Vn=QR;import bn from"chalk";var qR=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 Vn(),await u({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6453
+ ${bn.green("No more Login to the server to update \u{1F331}")}
6453
6454
 
6454
6455
  If you enable this, solv will update automatically when the solv/solana version is updated.
6455
6456
 
@@ -6457,99 +6458,97 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
6457
6458
 
6458
6459
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
6459
6460
  \u203B Please turn off if you are using no-downtime migration.
6460
- `;console.log(vn.white(o));let i=await NE.prompt([{type:"confirm",name:"autoUpdate",message:"Do you want to enable AUTO UPDATE? (Recommended)",default:!1},{type:"confirm",name:"autoRestart",message:"Do you want to enable AUTO RESTART?",default:!1}]),n=_.RPC_URL,T="",s=await NE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await NE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await u({HARVEST_ACCOUNT:T,IS_MEV_MODE:E.mevOn,RPC_URL:n,DISCORD_WEBHOOK_URL:s.discordWebhookUrl,AUTO_UPDATE:i.autoUpdate,AUTO_RESTART:i.autoRestart}),!0},"mevOn"),Hn=XR;import{spawnSync as EC}from"node:child_process";import{Connection as ZR}from"@solana/web3.js";import{Connection as jR}from"@solana/web3.js";var zR=t(async(_,e=10,E=.4)=>{try{let i=await new jR(_).getRecentPerformanceSamples(e);if(i.length===0)return console.warn("No performance samples available. Using fallback slot time."),E;let n=i.filter(s=>s.numSlots!==0);return n.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),E):n.reduce((s,S)=>s+S.samplePeriodSecs/S.numSlots,0)/n.length}catch(o){return console.error(`getAverageSlotTime failed: ${o}. Using fallback slot time.`),E}},"getAverageSlotTime"),Yn=zR;var _t=t(async _=>{try{let E=await new ZR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await Yn(_);console.log("timePerSlotSeconds",o);let n=(E.slotsInEpoch-E.slotIndex)*o,T=(E.slotIndex/E.slotsInEpoch*100).toFixed(2),s=Math.floor(n/(3600*24)),S=Math.floor(n%(3600*24)/3600),r=Math.floor(n%3600/60),a=Math.floor(n%60),C=`${s}d ${S}h ${r}m ${a}s`;return s===0&&(C=`${S}h ${r}m ${a}s`),{...E,estimatedTimeUntilNextEpoch:C,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var tC=.03,Jn=t(_=>{d.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await oC(_),{mainnetValidatorAuthorityKey:E}=U();console.log("Harvesting SOL..."),await jE(_.RPC_URL);let o=await S_(_.RPC_URL,Z.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await Y(1e3),await jE(_.RPC_URL),o=await S_(_.RPC_URL,Z.VOTE),i++;let n=JSON.parse(await _C(E,"utf-8")),T=await S_(_.RPC_URL,Z.AUTH);if(T<1)console.log(OE.white("Authority Account Balance is less than 1 SOL")),console.log(OE.white("Skip converting SOL to elSOL"));else{let S=T-tC;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await nE(_.RPC_URL,e_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await mn(_.RPC_URL);if(s<1){let S=await _t(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await z(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await kn(_.RPC_URL,n,e,s,s_,Kt),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await _t(_.RPC_URL)).epoch} \u{1F4B0}
6461
- Validator Address: ${A(E)}
6461
+ `;console.log(bn.white(o));let i=await NE.prompt([{type:"confirm",name:"autoUpdate",message:"Do you want to enable AUTO UPDATE? (Recommended)",default:!1},{type:"confirm",name:"autoRestart",message:"Do you want to enable AUTO RESTART?",default:!1}]),n=_.RPC_URL,T="",s=await NE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await NE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await u({HARVEST_ACCOUNT:T,IS_MEV_MODE:E.mevOn,RPC_URL:n,DISCORD_WEBHOOK_URL:s.discordWebhookUrl,AUTO_UPDATE:i.autoUpdate,AUTO_RESTART:i.autoRestart}),!0},"mevOn"),wn=qR;import{spawnSync as ZR}from"node:child_process";import{Connection as XR}from"@solana/web3.js";import{Connection as $R}from"@solana/web3.js";var WR=t(async(_,e=10,E=.4)=>{try{let i=await new $R(_).getRecentPerformanceSamples(e);if(i.length===0)return console.warn("No performance samples available. Using fallback slot time."),E;let n=i.filter(s=>s.numSlots!==0);return n.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),E):n.reduce((s,S)=>s+S.samplePeriodSecs/S.numSlots,0)/n.length}catch(o){return console.error(`getAverageSlotTime failed: ${o}. Using fallback slot time.`),E}},"getAverageSlotTime"),vn=WR;var ZE=t(async _=>{try{let E=await new XR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await vn(_);console.log("timePerSlotSeconds",o);let n=(E.slotsInEpoch-E.slotIndex)*o,T=(E.slotIndex/E.slotsInEpoch*100).toFixed(2),s=Math.floor(n/(3600*24)),S=Math.floor(n%(3600*24)/3600),r=Math.floor(n%3600/60),C=Math.floor(n%60),a=`${s}d ${S}h ${r}m ${C}s`;return s===0&&(a=`${S}h ${r}m ${C}s`),{...E,estimatedTimeUntilNextEpoch:a,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var _C=.03,Hn=t(_=>{d.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await eC(_),{mainnetValidatorAuthorityKey:E}=L();console.log("Harvesting SOL..."),await XE(_.RPC_URL);let o=await D_(_.RPC_URL,s_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await Y(1e3),await XE(_.RPC_URL),o=await D_(_.RPC_URL,s_.VOTE),i++;let n=JSON.parse(await jR(E,"utf-8")),T=await D_(_.RPC_URL,s_.AUTH);if(T<1)console.log(OE.white("Authority Account Balance is less than 1 SOL")),console.log(OE.white("Skip converting SOL to elSOL"));else{let S=T-_C;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await nE(_.RPC_URL,Z,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await un(_.RPC_URL);if(s<1){let S=await ZE(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await T_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await yn(_.RPC_URL,n,e,s,n_,Bt),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await ZE(_.RPC_URL)).epoch} \u{1F4B0}
6462
+ Validator Address: ${M(E)}
6462
6463
  Total Reward: ${s} elSOL
6463
- Harvest Address: ${e}`;await z(r)}console.log(OE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),d.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Hn(_)&&(EC("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(OE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),oC=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await eC.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:$E}]);return await u({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as PC}from"@skeet-framework/utils";import{writeFile as iC}from"fs/promises";var nC=t(async _=>{await iC(Be,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),P_=nC;var TC=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await P_({...e,isLessThan1Day:!0})},"isLessThan1Day"),xn=TC;var sC=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await P_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),Qn=sC;var SC=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await P_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),qn=SC;var rC=t(async(_,e)=>{let E=e.NETWORK===c.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=U(),T=E?A(n):A(i);await P_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6464
+ Harvest Address: ${e}`;await T_(r)}console.log(OE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),d.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await wn(_)&&(ZR("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(OE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),eC=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await zR.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:qE}]);return await u({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as OC}from"@skeet-framework/utils";import{writeFile as EC}from"fs/promises";var tC=t(async _=>{await EC(Be,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),P_=tC;var oC=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await P_({...e,isLessThan1Day:!0})},"isLessThan1Day"),Yn=oC;var iC=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await P_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),Jn=iC;var nC=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await P_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),xn=nC;var TC=t(async(_,e)=>{let E=e.NETWORK===c.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=L(),T=E?M(n):M(i);await P_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6464
6465
  Validator: ${T}
6465
6466
  Network: ${e.NETWORK}
6466
6467
  CurrentEpoch: ${_.epoch}
6467
6468
  Epoch has been updated!
6468
- Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),$n=rC;import{existsAsync as RC}from"@skeet-framework/utils";import{readFile as CC,writeFile as aC}from"fs/promises";import cC from"chalk";import{homedir as dC}from"os";var NC=t(async()=>{let e=dC().includes("/home/solv")?Be:"./currentEpoch.json";if(await RC(e))return JSON.parse(await CC(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await aC(e,JSON.stringify(E,null,2),"utf-8"),console.log(cC.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),Wn=NC;import OC from"chalk";var FC=t(async _=>{let e=_.RPC_URL,E=_.NETWORK===c.TESTNET;if(E&&(e=Rt),await S_(e,Z.VALIDATOR,E)<uE){let{mainnetValidatorKey:i,testnetValidatorKey:n}=U(),T=E?A(n):A(i),s=`\u26A0\uFE0F Validator Account Balance is less than ${uE} SOL
6469
- Please top up your Validator Account
6470
- Address: ${T}`;return await z(s),!1}return console.log(OC.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Xn=FC;async function lC(_="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${_}`,E=await fetch(e);if(!E.ok)throw new Error(`HTTP error! status: ${E.status}`);return(await E.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${_}:`,e),null}}t(lC,"getNpmLatestVersion");var jn=lC;async function IC(){let _=k_(),e=await jn();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(IC,"isVersionSame");var zn=IC;import{spawnSync as fC}from"child_process";import{spawnSync as DC}from"node:child_process";var Zn=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=DC(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6471
- `),n=i.find(R=>R.includes("Epoch Completed Time:")),T=i.find(R=>R.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(R=>R.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let a=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,C=r.match(a);if(C){let R=C[1]?parseInt(C[1]):0,N=C[2]?parseInt(C[2]):0,I=C[3]?parseInt(C[3]):0,O=C[4]?parseInt(C[4]):0,l=R*24*60+N*60+I+Math.floor(O/60);return{epoch:s,day:R,hour:N,min:I,sec:O,totalMinutes:l,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var UC=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?ge:_.RPC_URL,o=PC(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await Wn(),n=Zn(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=U(),r=await ie(E,A(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),await Xn(_),!await zn()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),fC("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await $n(n,_),"Epoch has been updated!";let C=n.totalMinutes,R=[qn,Qn,xn];for(let N of R)if(await N(C,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),_T=UC;var eT=t(_=>{d.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await _T(_),process.exit(0)})},"epochTimerCommands");import dT from"inquirer";import{join as iT}from"path";import{spawnSync as $_}from"node:child_process";import X from"chalk";import{spawnSync as AC}from"node:child_process";var LC=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=AC(`ssh -i ${i} -o StrictHostKeyChecking=no solv@${_} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:o});return T.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
6469
+ Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),Qn=TC;import{existsAsync as sC}from"@skeet-framework/utils";import{readFile as SC,writeFile as rC}from"fs/promises";import RC from"chalk";import{homedir as CC}from"os";var aC=t(async()=>{let e=CC().includes("/home/solv")?Be:"./currentEpoch.json";if(await sC(e))return JSON.parse(await SC(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await rC(e,JSON.stringify(E,null,2),"utf-8"),console.log(RC.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),qn=aC;async function cC(_="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${_}`,E=await fetch(e);if(!E.ok)throw new Error(`HTTP error! status: ${E.status}`);return(await E.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${_}:`,e),null}}t(cC,"getNpmLatestVersion");var $n=cC;async function dC(){let _=k_(),e=await $n();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(dC,"isVersionSame");var Wn=dC;import{spawnSync as FC}from"child_process";import{spawnSync as NC}from"node:child_process";var Xn=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=NC(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6470
+ `),n=i.find(R=>R.includes("Epoch Completed Time:")),T=i.find(R=>R.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(R=>R.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let C=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,a=r.match(C);if(a){let R=a[1]?parseInt(a[1]):0,N=a[2]?parseInt(a[2]):0,I=a[3]?parseInt(a[3]):0,O=a[4]?parseInt(a[4]):0,l=R*24*60+N*60+I+Math.floor(O/60);return{epoch:s,day:R,hour:N,min:I,sec:O,totalMinutes:l,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var lC=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?ge:_.RPC_URL,o=OC(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await qn(),n=Xn(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=L(),r=await ie(E,M(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await Wn()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),FC("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await Qn(n,_),"Epoch has been updated!";let a=n.totalMinutes,R=[xn,Jn,Yn];for(let N of R)if(await N(a,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),jn=lC;var zn=t(_=>{d.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await jn(_),process.exit(0)})},"epochTimerCommands");import CT from"inquirer";import{join as ET}from"path";import{spawnSync as $_}from"node:child_process";import X from"chalk";import{spawnSync as IC}from"node:child_process";var DC=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=IC(`ssh -i ${i} -o StrictHostKeyChecking=no solv@${_} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:o});return T.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
6472
6471
  $ ssh solv@${_}
6473
6472
 
6474
- Failed Cmd: ${e}`),n={status:T.status,stdout:String(T.stdout),stderr:T.stderr.toString()},n):(n={status:T.status,stdout:T.stdout.toString(),stderr:T.stderr.toString()},n)}catch(T){return console.log(`scpSSH Error: ${T}`),n={status:null,stdout:"",stderr:String(T)},n}},"scpSSH"),FE=LC;import ET from"chalk";var MC=t((_,e,E)=>{console.log(ET.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=A(_).trim(),i=FE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(ET.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6473
+ Failed Cmd: ${e}`),n={status:T.status,stdout:String(T.stdout),stderr:T.stderr.toString()},n):(n={status:T.status,stdout:T.stdout.toString(),stderr:T.stderr.toString()},n)}catch(T){return console.log(`scpSSH Error: ${T}`),n={status:null,stdout:"",stderr:String(T)},n}},"scpSSH"),FE=DC;import Zn from"chalk";var PC=t((_,e,E)=>{console.log(Zn.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=M(_).trim(),i=FE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(Zn.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6475
6474
  Please check your Validator
6476
6475
  $ ssh ${E}@${e}
6477
6476
 
6478
6477
  Local Identity Key: ${o}
6479
- 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(X.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(X.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(X.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6478
+ Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Q_=PC;var fC="agave-validator -l /mnt/ledger",UC="sudo fdctl",AC="--config /home/solv/firedancer/config.toml ",LC=t(_=>_==="agave"?[fC,""]:[UC,AC],"getSolanaCLIActive"),q_=LC;var _T="agave-validator -l /mnt/ledger",MC=t(()=>{try{return _T}catch(_){return console.error(_),_T}},"getSolanaCLIAgave"),lE=MC;import _t from"chalk";var IE=t(async(_,e)=>{try{console.log(_t.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(_t.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(_t.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as uC}from"fs/promises";import et from"chalk";import{existsSync as pC}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(!pC(_))return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Local configuration file not found"};let e=await uC(_,"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=ET(g,A_),eT=ET(g,U_),tT=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),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(X.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,N]=q_(C),[I,O]=q_(a),l=lE();if(!Q_(s,_,o))return;if(i){console.log(X.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(X.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6480
6479
  $ ssh ${o}@${_}
6481
6480
 
6482
- Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(X.white("\u{1F7E2} Setting identity on the remote validator..."));let L=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${O}${PE}'`;if($_(L,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6481
+ Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(X.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(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6483
6482
  $ ssh ${o}@${_}
6484
6483
 
6485
- Failed Cmd: ${I} set-identity ${O}${PE}`));return}if(console.log(X.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(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6484
+ Failed Cmd: ${I} set-identity ${O}${PE}`));return}if(console.log(X.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} ${eT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6486
6485
  $ ssh ${o}@${_}
6487
6486
 
6488
- Failed Cmd: ln -sf ${PE} ${oT}`));return}if(console.log(X.white("\u{1F7E2} Uploading the tower file to the new validator...")),$_(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6487
+ Failed Cmd: ln -sf ${PE} ${eT}`));return}if(console.log(X.white("\u{1F7E2} Uploading the tower file to the new validator...")),$_(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6489
6488
  $ ssh ${o}@${_}
6490
6489
 
6491
6490
  Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(X.white("\u{1F7E2} Setting identity on the local validator...")),$_(`${R} set-identity ${N}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6492
6491
 
6493
6492
  Failed Cmd: ${R} set-identity ${N}${s}
6494
- ln -sf ${s} ${M}`));return}if($_(`ln -sf ${s} ${M}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6493
+ ln -sf ${s} ${A}`));return}if($_(`ln -sf ${s} ${A}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6495
6494
 
6496
- Failed Cmd: ln -sf ${s} ${M}`));return}console.log(X.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as ST}from"path";import J 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(J.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 L=`${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Q=`${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} ${M}`;if(i&&(console.log(J.white("\u{1F7E2} Waiting for restart window...")),W_(L,{shell:!0,stdio:"inherit"}).status!==0)){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6495
+ Failed Cmd: ln -sf ${s} ${A}`));return}console.log(X.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as nT}from"path";import J from"chalk";import{spawnSync as W_}from"node:child_process";var oT=nT(g,A_),mC=nT(g,U_),iT="~/.ssh/id_rsa",TT=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),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(J.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,N]=q_(C),[I,O]=q_(a),l=lE();if(!Q_(s,_,o))return;let U=`${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Q=`${R} set-identity ${N}${oT}`,S_=`ln -sf ${oT} ${mC}`,f_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,r_=`${I} set-identity ${O}--require-tower ${s}`,z_=`ln -sf ${s} ${A}`;if(i&&(console.log(J.white("\u{1F7E2} Waiting for restart window...")),W_(U,{shell:!0,stdio:"inherit"}).status!==0)){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6497
6496
 
6498
- Failed Cmd: ${L}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),W_(Q,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6497
+ Failed Cmd: ${U}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),W_(Q,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6499
6498
 
6500
- Failed Cmd: ${Q}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),W_(r_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6499
+ Failed Cmd: ${Q}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),W_(S_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6501
6500
 
6502
- Failed Cmd: ${r_}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),W_(f_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6501
+ Failed Cmd: ${S_}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),W_(f_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6503
6502
 
6504
- Failed Cmd: ${f_}`));return}console.log(J.white("\u{1F7E2} Setting identity on the new validator..."));let hT=`ssh -i ${sT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${R_}'`;W_(hT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6503
+ Failed Cmd: ${f_}`));return}console.log(J.white("\u{1F7E2} Setting identity on the new validator..."));let uT=`ssh -i ${iT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r_}'`;W_(uT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6505
6504
  $ ssh ${o}@${_}
6506
6505
 
6507
- Failed Cmd: ${R_}`)),console.log(J.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(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6506
+ Failed Cmd: ${r_}`)),console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let pT=`ssh -i ${iT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${z_}'`;if(W_(pT,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6508
6507
 
6509
- Failed Cmd: ${z_}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await u({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
6508
+ Failed Cmd: ${z_}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as hC}from"node:child_process";function sT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return hC(E,{shell:!0,stdio:"inherit"}).status===0}t(sT,"checkSSHConnection");import Ie from"chalk";import{join as rT}from"path";import{spawnSync as X_}from"node:child_process";import z from"chalk";var fE=rT(g,A_),ST=rT(g,U_),RT=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=Tt,C=st;if(i){console.log(z.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(z.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6510
6509
  $ ssh ${o}@${_}
6511
6510
 
6512
- 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
6511
+ Failed Cmd: ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(z.white("\u{1F7E2} Setting identity on the new validator..."));let a=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} set-identity ${fE}'`;if(X_(a,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6513
6512
  $ ssh ${o}@${_}
6514
6513
 
6515
- Failed Cmd: ${r} -l ${P} set-identity ${fE}`));return}if(console.log(__.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),X_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${fE} ${CT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6514
+ Failed Cmd: ${r} -l ${P} set-identity ${fE}`));return}if(console.log(z.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),X_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${fE} ${ST}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6516
6515
  $ ssh ${o}@${_}
6517
6516
 
6518
- Failed Cmd: ln -sf ${fE} ${CT}`));return}if(console.log(__.white("\u{1F7E2} Uploading the tower file to the new validator...")),X_(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6517
+ Failed Cmd: ln -sf ${fE} ${ST}`));return}if(console.log(z.white("\u{1F7E2} Uploading the tower file to the new validator...")),X_(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6519
6518
  $ ssh ${o}@${_}
6520
6519
 
6521
- Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(__.white("\u{1F7E2} Setting identity on the new validator...")),X_(`${a} -l ${P} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6520
+ Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(z.white("\u{1F7E2} Setting identity on the new validator...")),X_(`${C} -l ${P} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6522
6521
 
6523
- Failed Cmd: ${a} -l ${P} set-identity ${s}
6524
- ln -sf ${s} ${M}`));return}if(X_(`ln -sf ${s} ${M}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6522
+ Failed Cmd: ${C} -l ${P} set-identity ${s}
6523
+ ln -sf ${s} ${A}`));return}if(X_(`ln -sf ${s} ${A}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6525
6524
 
6526
- Failed Cmd: ln -sf ${s} ${M}`));return}console.log(__.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var kC=["Incoming","Outgoing"],NT=t(async(_,e)=>{_.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).option("--user <user>","SSH User","solv").option("--unsafe","Switch without waiting for a restart window",!1).description("Switch Validator Identity with No Downtime").action(async E=>{try{let o=e.NETWORK===c.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?K:b;i&&(T=K);let s=E.user,S=A(T),r=E.switchType,a=E.ip;if(r===""||a===""||s===""){let R=await dT.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}},{name:"user",type:"list",message:"Which user would you want to SSH as?",choices:["solv"]}]);r=R.switchType,a=R.ip,s=R.user}if(!kC.includes(r)){console.log(Ie.yellow(`\u26A0\uFE0F Invalid Switch Type
6527
- You can choose only Incoming or Outgoing`));return}if(!RT(a,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await dT.prompt([{name:"confirm",type:"confirm",message:"Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1."}])).confirm||(console.log(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Ie.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await cT(a,S,e,s,n);return}await nT(a,S,e,s,n)}else await rT(a,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ie.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as VC}from"node:child_process";var bC=t((_="306450862",e=P,E=o_)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${E} --hard-fork ${_} -- ${_} ${e}`;console.log("Parameters to createSnapshot:",_,e,E),console.log("Command:",o);let i=VC(o,{shell:!0,stdio:"pipe",cwd:e});if(i.status!==0)throw new Error(`createSnapshot: ${i.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),OT=bC;import j_ from"inquirer";import $C from"dotenv";import B_ from"chalk";var UE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:LE,associationAccount:"",decimal:9},JitoSOL:{tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSOL:{tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSOL:{tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},EPCT:{tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUP:{tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},BONK:{tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},JTO:{tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}},tt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Le,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Me,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:LE,associationAccount:"",decimal:9},J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:{symbol:"jitoSOL",tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:{symbol:"mSOL",tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:{symbol:"bSOL",tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:{symbol:"EPCT",tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:{symbol:"JUP",tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:{symbol:"BONK",tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:{symbol:"JTO",tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}};import{readFile as HC}from"fs/promises";import{Connection as YC,Keypair as JC,VersionedTransaction as xC}from"@solana/web3.js";import x from"chalk";import QC from"inquirer";import qC from"dotenv";var wC=t(async(_,e,E,o,i)=>{try{let n=`${_}/quote?inputMint=${E}&outputMint=${o}&amount=${i}`,T=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return T.status===429?"Too many requests, please try again later":T.status===401?"Unauthorized, please check your API key":await T.json()}catch(n){throw new Error(`Error getJupiterQuote: ${n}`)}},"getJupiterQuote"),FT=wC;var vC=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=Ot[i];T?n={swapRequest:{quoteResponse:E,userPublicKey:o,feeAccount:T,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:n={swapRequest:{quoteResponse:E,userPublicKey:o,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let s=`${_}/swap`,S=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(n.swapRequest)});return S.status===429?"Too many requests, please try again later":await S.json()}catch(i){throw new Error(`Error postJupiterSwap: ${i}`)}},"postJupiterSwap"),lT=vC;qC.config();var IT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new YC(_,"confirmed"),r=await FT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6525
+ Failed Cmd: ln -sf ${s} ${A}`));return}console.log(z.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var BC=["Incoming","Outgoing"],aT=t(async(_,e)=>{_.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).option("--user <user>","SSH User","solv").option("--unsafe","Switch without waiting for a restart window",!1).description("Switch Validator Identity with No Downtime").action(async E=>{try{let o=e.NETWORK===c.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?K:b;i&&(T=K);let s=E.user,S=M(T),r=E.switchType,C=E.ip;if(r===""||C===""||s===""){let R=await CT.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}},{name:"user",type:"list",message:"Which user would you want to SSH as?",choices:["solv"]}]);r=R.switchType,C=R.ip,s=R.user}if(!BC.includes(r)){console.log(Ie.yellow(`\u26A0\uFE0F Invalid Switch Type
6526
+ You can choose only Incoming or Outgoing`));return}if(!sT(C,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await CT.prompt([{name:"confirm",type:"confirm",message:"Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1."}])).confirm||(console.log(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Ie.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await RT(C,S,e,s,n);return}await tT(C,S,e,s,n)}else await TT(C,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ie.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as gC}from"node:child_process";var KC=t((_="306450862",e=P,E=E_)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${E} --hard-fork ${_} -- ${_} ${e}`;console.log("Parameters to createSnapshot:",_,e,E),console.log("Command:",o);let i=gC(o,{shell:!0,stdio:"pipe",cwd:e});if(i.status!==0)throw new Error(`createSnapshot: ${i.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),cT=KC;import j_ from"inquirer";import YC from"dotenv";import B_ from"chalk";var UE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:LE,associationAccount:"",decimal:9},JitoSOL:{tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSOL:{tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSOL:{tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},EPCT:{tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUP:{tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},BONK:{tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},JTO:{tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}},Et={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Le,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Me,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:LE,associationAccount:"",decimal:9},J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:{symbol:"jitoSOL",tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:{symbol:"mSOL",tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:{symbol:"bSOL",tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:{symbol:"EPCT",tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:{symbol:"JUP",tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:{symbol:"BONK",tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:{symbol:"JTO",tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}};import{readFile as kC}from"fs/promises";import{Connection as VC,Keypair as bC,VersionedTransaction as wC}from"@solana/web3.js";import x from"chalk";import vC from"inquirer";import HC from"dotenv";var yC=t(async(_,e,E,o,i)=>{try{let n=`${_}/quote?inputMint=${E}&outputMint=${o}&amount=${i}`,T=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return T.status===429?"Too many requests, please try again later":T.status===401?"Unauthorized, please check your API key":await T.json()}catch(n){throw new Error(`Error getJupiterQuote: ${n}`)}},"getJupiterQuote"),dT=yC;var GC=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=dt[i];T?n={swapRequest:{quoteResponse:E,userPublicKey:o,feeAccount:T,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:n={swapRequest:{quoteResponse:E,userPublicKey:o,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let s=`${_}/swap`,S=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(n.swapRequest)});return S.status===429?"Too many requests, please try again later":await S.json()}catch(i){throw new Error(`Error postJupiterSwap: ${i}`)}},"postJupiterSwap"),NT=GC;HC.config();var OT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new VC(_,"confirmed"),r=await dT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6528
6527
  `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
6529
- `)),process.exit(0));let R_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6528
+ `)),process.exit(0));let r_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6530
6529
 
6531
6530
  You can upgrade your API key to increase your rate limits.
6532
6531
  Get Your API key \u{1F447}
6533
6532
  Validators Solutions: ${_e}
6534
- `;console.error(x.white(R_)),process.exit(0)}let a=tt[i],C=tt[n],R=`\u{1F504} Swap Quote \u{1F504}
6533
+ `;console.error(x.white(r_)),process.exit(0)}let C=Et[i],a=Et[n],R=`\u{1F504} Swap Quote \u{1F504}
6535
6534
 
6536
- - \u{1F3E6} Input Token: ${a.symbol} (${i})
6537
- - \u{1F4B0} Input Amount: ${T/Math.pow(10,a.decimal)} ${a.symbol}
6535
+ - \u{1F3E6} Input Token: ${C.symbol} (${i})
6536
+ - \u{1F4B0} Input Amount: ${T/Math.pow(10,C.decimal)} ${C.symbol}
6538
6537
 
6539
- - \u{1F3E6} Output Token: ${C.symbol} (${n})
6540
- - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,C.decimal)} ${C.symbol}
6538
+ - \u{1F3E6} Output Token: ${a.symbol} (${n})
6539
+ - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,a.decimal)} ${a.symbol}
6541
6540
 
6542
6541
  \u203B This quote is based on the current market rate and may change before the swap is completed.
6543
6542
  `;console.log(x.white(R)),console.log(x.gray(`You can also swap using the following command:
6544
6543
  $ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
6545
- `));let N=!1;s?N=(await QC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(x.cyan("Skipping confirmation...")),N=!0),N||(console.log(x.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await HC(o,"utf8")),O=JC.fromSecretKey(new Uint8Array(Array.from(I))),l=await lT(e,E,r,O.publicKey.toString());if(typeof l=="string"){l.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6544
+ `));let N=!1;s?N=(await vC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(x.cyan("Skipping confirmation...")),N=!0),N||(console.log(x.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await kC(o,"utf8")),O=bC.fromSecretKey(new Uint8Array(Array.from(I))),l=await NT(e,E,r,O.publicKey.toString());if(typeof l=="string"){l.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6546
6545
  `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
6547
- `)),process.exit(0));let R_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6546
+ `)),process.exit(0));let r_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6548
6547
 
6549
6548
  You can upgrade your API key to increase your rate limits.
6550
6549
  Get Your API key \u{1F447}
6551
6550
  Validators Solutions: ${_e}
6552
- `;console.error(x.white(R_)),process.exit(0)}let G=Buffer.from(l.swapTransaction,"base64"),L=xC.deserialize(G);L.sign([O]);let Q=L.serialize(),r_=await S.sendRawTransaction(Q,{skipPreflight:!0,maxRetries:2}),f_=L.message.recentBlockhash;return console.log(`Swapping...
6553
- 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(L=>L!==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 L=l.name;R=UE[L].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 u(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6554
- `)),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 k();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};
6551
+ `;console.error(x.white(r_)),process.exit(0)}let G=Buffer.from(l.swapTransaction,"base64"),U=wC.deserialize(G);U.sign([O]);let Q=U.serialize(),S_=await S.sendRawTransaction(Q,{skipPreflight:!0,maxRetries:2}),f_=U.message.recentBlockhash;return console.log(`Swapping...
6552
+ Transaction ID: ${S_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:S_},"confirmed"),S_},"swap");YC.config();var FT=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 JC(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"),JC=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=[...at,"Other"],C=o,a="",R=i,N=n;if(C===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?C=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(a=l.name,C=UE[a].tokenMint)}if(R===""){r=r.filter(U=>U!==a);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:n_}])).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 OT(_,S,!E||E===""?ct:E,e,C,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 u(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6553
+ `)),p_()},"askForConfig");import{spawnSync as QC}from"node:child_process";var lT=t(()=>{QC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as qC}from"node:child_process";var IT=t(()=>{qC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as $C}from"node:child_process";var DT=t(()=>{$C("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as WC}from"node:child_process";var PT=t(()=>{WC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as XC}from"node:child_process";var fT=t((_=!1)=>{XC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as jC}from"node:child_process";var UT=t(()=>{jC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var AT=t(()=>{let _=d.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{lT()}),_.command("start").description("Start Jupiter").action(()=>{IT()}),_.command("stop").description("Stop Jupiter").action(()=>{DT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{fT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{PT()}),_.command("enable").description("Enable Jupiter").action(()=>{UT()})},"jupiterCommands");import ea from"chalk";import{spawnSync as zC}from"node:child_process";var ZC=t(()=>{let{stdout:_}=zC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),LT=ZC;var d=new _a;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 Ea(){try{let _=await k();Ri(_),di(_),ai(_),mi(_),To(_),So(),Ni(_),$i(_),zi(_),pi(),li(),si(_),Cn(_),Oi(),nn(),On(_),In(_),Hn(_),ri(),FT(d,_),zn(_),aT(d,_),AT(),Sn(_),d.command("rm:log").description("Remove Logs").action(()=>{rE()}),d.command("rm:snapshot").description("Remove Snapshot").action(()=>{an(_)}),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(ea.white("\u{1F4DD} Creating Snapshot...")),cT(e.slot,e.ledger,e.snapshots)}),d.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{cn(_)}),d.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{dn()}),d.command("config").description("Show Solv Config").action(()=>{SE(_)}),d.command("vv").description("Show Solv Version").action(()=>{let e=LT();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(Ea,"main");Ea();export{d as program};
6555
6554
  //# sourceMappingURL=index.js.map