@gabrielhicks/solv 5.4.10 → 5.4.12

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,16 +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.10";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(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 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 VT=Object.defineProperty;var t=(_,e)=>VT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as TC}from"commander";var Rt="5.4.12";var at={name:"@gabrielhicks/solv",version:Rt,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 pe=at.version;var Te="https://validators.solutions";var me="solv4.config.json";var p_="identity.json",m_="unstaked-identity.json",Ct="relayer-keypair.json",wT="mainnet-validator-keypair.json",vT="mainnet-vote-account-keypair.json",HT="mainnet-authority-keypair.json",YT="testnet-validator-keypair.json",JT="testnet-vote-account-keypair.json",xT="testnet-authority-keypair.json",g="/home/solv",f=`${g}/${p_}`,OC=`${g}/${m_}`,V=`${g}/${wT}`,k_=`${g}/${vT}`,lC=`${g}/${HT}`,h=`${g}/${YT}`,V_=`${g}/${JT}`,FC=`${g}/${xT}`,b=`${g}/solana-validator.log`,F_=g+"/start-validator.sh",P="/mnt/ledger",b_="/mnt/accounts",n_="/mnt/snapshots",ct="solana-validator",dt="agave-validator",Nt="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var he=3;var Ot="https://api.mainnet-beta.solana.com",lt="https://verify.validators.solutions/solv-migrate",Ft="https://jup.validators.solutions/v1/jup",hE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(hE||(hE={}));var It=Object.values(hE),Be="So11111111111111111111111111111111111111112",ge="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",BE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Dt="SOLV420",Pt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"},w_=["adreoi6W1MGA7eegERNcQTwQH3UuJaAnWjVZEq2cxcF","naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi","th734sEwvZZ5XfemLcvo6TXepPfawWBjz3HMYeQdhPi","BAPExw4zFmwSUjyPfQorenucofeafHLUetcoWTB4Gwnt","bay3c7G89NTxSULyM45gqJx3JoWtBBeXHvifCywwiwZ","BeRTyZTveVQsekrF63WhFvfGiABThym95x8uZaicDPgo","EF8o3aQnu853EEPJKUfqAgoa8szkVs28sv64xtBrRPSV","chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL","GsVJ62qt2nbRLT4f67LAo6Ve8eGhChJquYaK3wT1iG2v","ctz4yB16kvGiMrA4vdtKXEMYgkkfJLo6hMwDk9DZ3Vf","PARaNF4kcQW3BmaeMD3ELLAqUV7MDS8bMudaCEZ72NM","dedxpgLN1VXLHpekKra1JKkMGrw7tW1uuYz7Ec28iLK","DegEnNCbn6PrsvHvsErneRNv7KFTwnjW3uFVjf43e28v","Dcky7CK3aEHzdV9EF5YR1NaTJ9QfSyzW5cACbqEFKZNv","dksYs1gzQ7FzqyadN5XtcaeVbqKSN7X2SpfN3fcUW7G","dstCt4sDCQx1QFFJekmM5RjyFLsDRkaEjTgXd5gbpDB","eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK","ExCHpAsqeaDJGfUj41bhU2BuZK4fhRnJKvhG486rfKg","farmoWMKdJBxLxhMZpgU1uVjvjVJnQqrGhwAyDmcn8R","G1EaM8gLQU7DifPnCTQKP2PLvFf63tHvaXBAR8QFLg5Z","goJirTtcRjP6Wqkw7cHNvzjEva5rpvPDtj2ZnEmPAr6","wetfCN7bhjhBT8GTSAnah8ftoRoHB8H8Q87KkxDdRgK","8H6qQ2FKUjY8wmggSKHUENY38Nr9sQxDUbEZB6fiCHSX","hy1oTqvrknqoNmPWq2JtQMdDDnWkEGH2ab7N4r4rnJJ","jntrbAHjcxhP2eRUgCSACb6cMVhYm3jEQ3eQDZKicmz","akicJSdNFWszP2Le38t1NtVeywXtvoxdiGciaELwZHz","1i1yarXXz55VdvVL4v2HXcjMJPAv4fWJhY8x43bmwfL","LoV31z7KC5CZ8sdGovmRSDGB6csP1fJip1hiM7xDozw","magiCagux3C7nMKo2jKSbX6yWzYWMGKJ6ABRnw1zQ8U","JAfBCSxx2fZwdM5wTiLRAfJm3MpqXz3KnxjPhCQixGVh","mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe","phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1","pineBbb5K6SdV6KG1xibsR5DM1XsWuajtXSy3YYGY4N","prt1stdbFCFXpEcx9rxwJK63zhYo43V5JCXzGWXkPGn","rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg","rapTWQhZD2dPjJ91BXW4UnVKBt6NvX2aZxWSSYg66Y4","royLQKzrsSs9VbMZMDjZkMM8j3buBnwx7oH3wdifAk4","CitYBuKSE5W6CXEBAgY1B9fEMUdHXYSmZbXbAWd31Cr","axyaGn2eZM1dnDCagpd9aYa92gKWTrtEYb8vwc21ddr","sTeV1NswjBBo15qosoyQj1aYrgvoxomAduN1zFV6gCf","txtXxyX13G7h899vnZwNJsVRAMfWcwYZNT3jucRqqiW","hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M","te1emnh77qnpsdjcCi9FsyX8t4gf4HYWC4kTVHuH4MQ","tstidz7tN8armqvZ7ia2ck62mY9RD2BrwMtW2w8hcwk","vnd1sXYmA8YY9xHQBkKKurZeq7iCe6EQ9bGYNZJwh1c","YE11vEiXKKx95onU1EpjgwrHovgXamRTQvY52Mvde8i","5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on"],v_=["adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ","nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC","BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP","b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF","chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1","chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe","CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP","parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz","dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S","DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup","dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH","eyeY8HangkSYirSBtopAfThXzhHL855wPnddz8WnemV","ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD","G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN","wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo","hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o","hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu","jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA","NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk","1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i","Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s","MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV","D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e","mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk","phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2","pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw","prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW","radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9","rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC","RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4","ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj","axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4","sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu","TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ","hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj","te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY","UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL","vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd","YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV","Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24","7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2","GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ","CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S"];import{spawnSync as $T}from"child_process";var T_="3.0.10",v="3.0.10",se="3.0.10",s_="3.0.10",ft="3.0.10",h_="3.0.10";var Ut="20.17.0",H_="0.800.30008",I_="0.800.30008";import{spawnSync as G}from"node:child_process";var QT=t((_=v,e=!1,E=!1)=>{E?e?(G(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),G(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),G(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),G(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),G(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),G(`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"}),G(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/v${_}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),G(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(G(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),G(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),G(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),G(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),G(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),G(`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"}),G(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/v${_}-agave/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),G(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?G(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):G(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Y_=QT;var At="agave-validator",qT=t(()=>{try{return At}catch(_){return console.error(_),At}},"getSolanaCLI"),S_=qT;var ye=t(async(_,e=!1,E=!1)=>{Y_(_,e,E)},"updateVersion"),Ke=t(async(_,e=!1,E=10)=>{let o=S_(),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}`),$T(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import ao from"chalk";var B_;(function(_){_.EN="en",_.JA="ja"})(B_||(B_={}));var Lt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Lt||(Lt={}));var Mt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(Mt||(Mt={}));var D_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(D_||(D_={}));var ut;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(ut||(ut={}));var pt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(pt||(pt={}));var mt;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(mt||(mt={}));var ht;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(ht||(ht={}));var Ge;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(Ge||(Ge={}));var ke;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(ke||(ke={}));var yt=!1,Kt=!1,Gt=!1,kt=!1,q={ID:"solv",LANG:B_.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},H={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},U={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},r_={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"},B={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((_=H.ROOT)=>{let e=_===H.ROOT?H.ROOT:_,E=`${e}/${B.MAINNET_VALIDATOR_KEY}`,o=`${e}/${B.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${B.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${B.TESTNET_VALIDATOR_KEY}`,T=`${e}/${B.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${B.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),P_=t((_=!0)=>{let e=_?`${H.ROOT}/${B.TESTNET_VALIDATOR_KEY}`:`${H.ROOT}/${B.MAINNET_VALIDATOR_KEY}`,E=_?`${H.ROOT}/${B.TESTNET_VALIDATOR_VOTE_KEY}`:`${H.ROOT}/${B.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${H.ROOT}/${r_.LOG}`,i=U.ACCOUNTS,n=U.LEDGER,T=U.SNAPSHOTS,s=`${H.ROOT}/${r_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var E_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",gE="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",Vt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",bt=9,R_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",wt="So11111111111111111111111111111111111111112",vt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Ht="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Bt;(function(_){_[_.ELSOL=R_]="ELSOL",_[_.SOL=wt]="SOL",_[_.USDC=vt]="USDC",_[_.EPCT=Ht]="EPCT"})(Bt||(Bt={}));var gt;(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"})(gt||(gt={}));var GC={[wt]:9,[R_]:9,[vt]:6,[Ht]:6},Ve="/home/solv/currentEpoch.json";var be="https://api.testnet.solana.com";import{spawnSync as yE}from"child_process";var Yt=t(()=>{yE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=q.NODE_VERSION;yE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),yE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var t_={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",bamUrl:"http://frankfurt.mainnet.bam.jito.wtf"},Se={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",BAM_URL:"http://dallas.testnet.bam.jito.wtf"},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",BAM_URL:"http://ny.testnet.bam.jito.wtf"},SaltLakeCity:{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",BAM_URL:"http://ny.testnet.bam.jito.wtf"}},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",BAM_URL:"http://amsterdam.mainnet.bam.jito.wtf"},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",BAM_URL:"http://london.mainnet.bam.jito.wtf"},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",BAM_URL:"http://frankfurt.mainnet.bam.jito.wtf"},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",BAM_URL:"http://ny.mainnet.bam.jito.wtf"},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",BAM_URL:"http://tokyo.mainnet.bam.jito.wtf"},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",BAM_URL:"http://slc.mainnet.bam.jito.wtf"},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",BAM_URL:"http://singapore.mainnet.bam.jito.wtf"},Dublin:{BLOCK_ENGINE_URL:"https://dublin.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://dublin.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.61.8:1002",BAM_URL:""}}};import{spawnSync as $}from"child_process";var we=t((_=t_.tag,e=!1,E=!1)=>{$("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),$("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?$(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):($(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),$(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),$(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),$(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),$(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),$(`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"}),$(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),$(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?$(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):$(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as WT,writeFile as XT}from"fs/promises";import{homedir as jT}from"os";var re=t(async _=>{let E=`${jT()}/${r_.JITO_CONFIG}`,i={...JSON.parse(await WT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await XT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Jt}from"child_process";import zT from"inquirer";var xt=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";Jt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;Jt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),Qt=t(async()=>await zT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Re}from"@skeet-framework/utils";import ZT from"chalk";import _s from"inquirer";var qt=t(async()=>{let _=await _s.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Re("sudo ufw delete allow 8899/udp"),await Re("sudo ufw delete allow 8899/tcp"),await Re(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await Re(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await Re("sudo ufw reload"),console.log(ZT.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var es=t(()=>Rt,"getSolvVersion"),J_=es;import{readFile as os,writeFile as is}from"fs/promises";import{existsAsync as ns}from"@skeet-framework/utils";var KE;(function(_){_.EN="en",_.JA="ja"})(KE||(KE={}));var rc=Object.values(KE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var $t=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Wt=Object.values(D),N;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.BAM="bam",_.NONE="none"})(N||(N={}));var Rc=Object.values(N).filter(_=>_!=="none"),w;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(w||(w={}));var Xt=Object.values(w).filter(_=>_!=="none"),W;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(W||(W={}));var ts={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:N.NONE,RPC_TYPE:w.AGAVE,MNT_DISK_TYPE:W.TRIPLE,TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:v,NODE_VERSION:Ut,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:Nt,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ot,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:b_,SNAPSHOTS_PATH:n_,MOD:!1},N_=ts;import{homedir as Ts}from"os";var ss=t(async()=>{let e=`${Ts()}/${me}`;return await ns(e)?JSON.parse(await os(e,"utf-8")):(console.log("Creating default config file at",e),await is(e,JSON.stringify(N_,null,2)),N_)},"readConfig"),k=ss;import Ss from"node-fetch";var a_=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 Ss(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 cs}from"child_process";import{Connection as jt}from"@solana/web3.js";var ae=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 rs}from"child_process";var M=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=rs(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var Rs=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),Y=Rs;import{sendDiscord as as}from"@skeet-framework/utils";var zt=30,Cs=t(async _=>{try{let e=_.NETWORK===c.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=L(),n=M(e?o:E),T=await ae(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=zt){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${zt} 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=`Restarting **${s}**
8
- _ _`;await z(r);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=Math.floor(Date.now()/1e3),a=`**${s}** has restarted, catching up...
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await as(S),!1}console.log("Waiting for validator to catch up..."),await Y(60*1e3),T=await ae(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Zt=Cs;var ds=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===N.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=L(),n=e?o:i,T=!1;E?T=e?Gt:kt:T=e?yt:Kt,T=T&&_.AUTO_RESTART;let s=M(n),S=`**${s}** updated solv to **${J_()}**`;if(await a_(S),T){let r=`Restarting **${s}**
8
+ _ _`;await a_(r);try{cs("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(O){let I=`Error restarting **${s}**: ${O?.message||"Unknown error"}`;return await a_(I),!1}let C=Math.floor(Date.now()/1e3),a=`**${s}** has restarted, catching up...
9
9
  at: <t:${C}> (${C})
10
- _ _`;await z(a),await Y(180*1e3);let R=await $t(_);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`,L=`**${s}** has caught up!
10
+ _ _`;await a_(a),await Y(180*1e3);let R=await Zt(_);if(R){let I=Math.floor(Date.now()/1e3)-C,l=Math.floor(I/60),F=I%60,K=l>0?`${l}m ${F}s`:`${F}s`,A=`**${s}** has caught up!
11
11
  at: <t:${C}> (${C})
12
- **${s}** took **${G}** to catch up after restart!
13
- _ _`;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
12
+ **${s}** took **${K}** to catch up after restart!
13
+ _ _`;await a_(A)}else{let O=`**${s}** failed to catch up after update`;await a_(O)}return R}return!0},"autoUpdate"),_o=ds;import{homedir as Ns}from"os";import{readFile as Os,writeFile as eo}from"fs/promises";import{existsAsync as ls}from"@skeet-framework/utils";var u=t(async _=>{let E=`${Ns()}/${me}`;await ls(E)||(console.log("Creating default config file at",E),await eo(E,JSON.stringify(N_,null,2)));let i={...JSON.parse(await Os(E,"utf8")),..._},n=JSON.stringify(i,null,2);await eo(E,n)},"updateDefaultConfig");var Fs={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"},ve=Fs;var Is={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:"},Eo=Is;var Ds={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}"}},He=Ds;var Ps={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"}},to=Ps;var Ye=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Je=[[],[") 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 oo=[") \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"],io=[[],[") \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"}},xe=fs;var Us={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"}},no=Us;var Qe=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var To=[") \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 As=t(_=>{let e={cmds:ve,subCmds:xe,logs:He,installer:Ye,installerSub:Je,clientCmds:Qe};switch(_){case B_.EN:e={cmds:ve,subCmds:xe,logs:He,installer:Ye,installerSub:Je,clientCmds:Qe};break;case B_.JA:e={cmds:Eo,subCmds:no,logs:to,installer:oo,installerSub:io,clientCmds:To};break;default:e={cmds:ve,subCmds:xe,logs:He,installer:Ye,installerSub:Je,clientCmds:Qe}}return e},"readLocale"),so=As;import{existsSync as ps,readFileSync as ms,writeFileSync as So}from"fs";import{readFileSync as Ls,writeFileSync as Ms}from"fs";import{homedir as us}from"os";var x_=t(_=>{let E=`${us()}/${r_.CONFIG}`,i={...JSON.parse(Ls(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ms(E,n)},"updateSolvConfig");import{homedir as hs}from"os";var ro=t(()=>{let e=`${hs()}/${r_.CONFIG}`;ps(e)||(So(e,JSON.stringify(q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(ms(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),So(e,JSON.stringify(q,null,2)),E=q}let o=so(E.LANG);return E.RPC_URL||(E.RPC_URL=q.RPC_URL,x_({RPC_URL:q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,x_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",x_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as y}from"child_process";import{promises as Ro}from"fs";import gs from"path";var Bs=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
14
14
  index a0c631ee9f..048b118660 100644
15
15
  --- a/book/api/metrics-generated.md
16
16
  +++ b/book/api/metrics-generated.md
@@ -5795,7 +5795,7 @@ index 479e0f1829..a97f5778d4 100644
5795
5795
 
5796
5796
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5797
5797
  at the NOTICE level to the logger. E.g. for a typical fd_log
5798
- `;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 C=k_(),a=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(so.white(`Current solv version: ${C}`)),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(a,!0,s);return}if(i){await To(_,R,r.mod||T),await pe(a,!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 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 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"),qe=Bs;var $e=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?H_:I_),n=E||_.MOD,{filePath:T,body:s}=qe();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 Ro.mkdir(gs.dirname(T),{recursive:!0}),await Ro.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 ys}from"node:child_process";var Co=t(_=>{let e=_.NETWORK===c.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===N.JITO,i=_.VALIDATOR_TYPE===N.FRANKENDANCER,n=_.AUTO_RESTART,T=_.MOD,s=10;n&&!e&&(s=30);let S=e?T_:v;o&&(S=s_,e&&(S=se)),i&&(S=I_,e&&(S=H_)),E&&(S=h_,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 C=J_(),a=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(ao.white(`Current solv version: ${C}`)),r.auto){await _o(_);return}if(r.migrateConfig){let R=ro().config,O=W.TRIPLE;R.DISK_TYPES===0?O=W.DOUBLE:R.DISK_TYPES===1?O=W.SINGLE:O=W.TRIPLE;let I=R.SOLANA_NETWORK===D_.TESTNET,l=R.SOLV_TYPE===Ge.RPC_NODE,F=R.MAINNET_TYPE===ke.JITO_MEV,K={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:l?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:O,RPC_TYPE:l?w.JITO:w.NONE,VALIDATOR_TYPE:F?N.JITO:I?N.AGAVE:N.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(K)}if(r.config){if(await u({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:v}),o){let R=e?se:s_;await re({version:R,tag:`v${R}`})}console.log(ao.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 qt();return}if(r.background){let R=r.version,O=!!R.startsWith("3");if(await u({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:v}),o){we(`v${R}`,r.mod||T,O),await re({version:R,tag:`v${R}`}),await Ke(a,!0,s);return}if(i){await $e(_,R,r.mod||T),await Ke(a,!0,s);return}await ye(R,r.mod||T,O);let I=e?10:5;e&&ys("solv start",{stdio:"inherit",shell:!0}),await Ke(I,!0,s);return}else if(r.commission){let R=await Qt();xt(R.commission,e)}else Yt()})},"updateCommands");import{spawnSync as Ks}from"node:child_process";var co=t(_=>{try{let{log:e}=P_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Ks(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 No=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(_=>{co(_)})},"logCommands");import O_ from"chalk";import{spawnSync as Gs}from"child_process";import{homedir as ks}from"os";var We=t(_=>{let e=ks(),E=L(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=D_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=D_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=D_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;Gs(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Xe}from"child_process";import{existsSync as Oo,readdirSync as Vs,rmSync as bs}from"fs";import{homedir as ws}from"os";import lo from"path";var je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[B.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[B.TESTNET_VALIDATOR_KEY,B.TESTNET_VALITATOR_AUTHORITY_KEY,B.TESTNET_VALIDATOR_VOTE_KEY,B.MAINNET_VALIDATOR_KEY,B.MAINNET_VALITATOR_AUTHORITY_KEY,B.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[B.MAINNET_VALIDATOR_KEY,B.MAINNET_VALITATOR_AUTHORITY_KEY,B.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Xe(o,{shell:!0,stdio:"ignore"});let i=Vs("./").filter(S=>S.endsWith("SV.json")),n=ws(),T=lo.join(n,"unstaked-identity.json");Oo(T)&&Xe(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=lo.join(n,e[s]);if(s++,Oo(r)){console.log(`${r} is already exist!`),bs(S,{recursive:!0});continue}let C=`mv ${S} ${r}`;Xe(C,{shell:!0,stdio:"inherit"})}Xe("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 Io}from"child_process";var vs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5799
5799
  Description=Jupiter API Service Instance
5800
5800
  After=network.target
5801
5801
 
@@ -5810,19 +5810,19 @@ Environment=RUST_LOG=info
5810
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
5811
5811
 
5812
5812
  [Install]
5813
- 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"),Fo=vs;import Hs from"inquirer";import Ys from"chalk";var Js=t(async()=>{let _=await Hs.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"}]);Io(`sudo apt-get install unzip wget -y
5814
5814
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5815
5815
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5816
5816
  chmod +x jupiter-swap-api
5817
- 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}=Fo(_.rpcUrl,_.grpcUrl,_.grpcToken);Io(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(Ys.white(`\u{1F7E2} Jupiter Swap API Setup Completed
5818
5818
 
5819
- $ 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"),Do=Js;import{existsAsync as xs}from"@skeet-framework/utils";import{readFile as Qs,writeFile as Po}from"fs/promises";import{homedir as qs}from"os";import $s from"path";var o_=t(async()=>{let _=qs(),e=$s.join(_,r_.JITO_CONFIG);await xs(e)||(await Po(e,JSON.stringify(t_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Qs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await Po(e,JSON.stringify(t_,null,2)),E=t_}return E},"readOrCreateJitoConfig");import{spawnSync as Ws}from"child_process";var Ce=t(()=>{Ws("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import ce from"chalk";import ze from"inquirer";import Xs from"inquirer";var fo=t(async _=>{let E=Object.keys(_?Se.TESTNET:Se.MAINNET),o=_?Se.TESTNET:Se.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:t_.version,tag:t_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR,bamUrl:T.BAM_URL}},"askJitoSetting");var js=t(async()=>{try{let _=N.NONE,e=w.AGAVE,E=N_.COMMISSION,o=!1,i=await ze.prompt([{name:"network",type:"list",message:"Choose Network",choices:$t,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Wt,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[N.JITO,N.SOLANA]:[N.AGAVE,N.JITO,N.FRANKENDANCER];_=await ze.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:N.AGAVE}).then(r=>r.validatorType),e=w.NONE}if(i.nodeType===D.RPC&&(e=await ze.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Xt,default:w.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await ze.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${N_.COMMISSION}%)'`,default:N_.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,_===N.JITO||_===N.FRANKENDANCER||_===N.BAM){await o_();let r=await fo(n);await re(r)}}let{network:T,nodeType:s}=i;return console.log(ce.white("Network:",T)),console.log(ce.white("Node Type:",s)),console.log(ce.white("Validator Type:",_)),console.log(ce.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(ce.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"),Uo=js;import{spawnSync as Z}from"child_process";var de=t((_=s_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;Z(`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`;Z(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),Z(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),Z(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),Z(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),Z(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),Z(`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"}),Z(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),Z(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),Z("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?Z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):Z(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var Ao=t(()=>`#!/bin/bash
5820
5820
  exec agave-validator \\
5821
- --identity ${M} \\
5822
- --log ${j} \\
5823
- --accounts ${g_} \\
5821
+ --identity ${f} \\
5822
+ --log ${b} \\
5823
+ --accounts ${b_} \\
5824
5824
  --ledger ${P} \\
5825
- --snapshots ${o_} \\
5825
+ --snapshots ${n_} \\
5826
5826
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5827
5827
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5828
5828
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -5855,13 +5855,13 @@ exec agave-validator \\
5855
5855
  --wal-recovery-mode skip_any_corrupted_record \\
5856
5856
  --use-snapshot-archives-at-startup when-newest \\
5857
5857
  --limit-ledger-size 400000000 \\
5858
- `,"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 _S}from"@skeet-framework/utils";import{writeFile as eS}from"fs/promises";import{spawnSync as zs}from"node:child_process";var Zs=t(()=>{let _=`sudo chmod +x ${F_}`;zs(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Ne=Zs;var Lo=t(()=>`#!/bin/bash
5859
5859
  exec agave-validator \\
5860
- --identity ${M} \\
5861
- --log ${j} \\
5862
- --accounts ${g_} \\
5860
+ --identity ${f} \\
5861
+ --log ${b} \\
5862
+ --accounts ${b_} \\
5863
5863
  --ledger ${P} \\
5864
- --snapshots ${o_} \\
5864
+ --snapshots ${n_} \\
5865
5865
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5866
5866
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5867
5867
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -5891,12 +5891,26 @@ exec agave-validator \\
5891
5891
  --wal-recovery-mode skip_any_corrupted_record \\
5892
5892
  --use-snapshot-archives-at-startup when-newest \\
5893
5893
  --limit-ledger-size 400000000 \\
5894
- `,"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 ES=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case w.AGAVE:console.log("Agave RPC Node Setup"),Y_(_.TESTNET_SOLANA_VERSION),E=Lo();break;case w.JITO:console.log("JITO RPC Node Setup"),de(se),E=Ao();break;default:console.log("Unknown RPC Node Setup");break}if(await _S(F_)){console.log("Startup script already exists. Skipping...");return}await eS(F_,E,"utf-8"),Ne()},"setupRpcNode"),Mo=ES;import{spawnSync as tS}from"node:child_process";var oS=t(_=>{tS(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),VE=oS;import uo from"chalk";import{spawnSync as iS}from"child_process";var po=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;iS(e,{shell:!0,stdio:"inherit"})}catch{console.log(uo.yellow(`You might need to install the Solana SPL CLI:
5895
+ `)),console.log(uo.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as TS}from"os";import{spawnSync as nS}from"child_process";var f_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=nS(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import sS from"chalk";import{spawnSync as SS}from"node:child_process";var mo=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=`${TS()}/mainnet-authority-keypair.json`;await po(o),process.exit(0)}await rS(_),process.exit(0)})},"balanceCommands"),rS=t(async _=>{let e=X(_),E=`Validator Key: ${e.validatorKey}
5896
+ Address: ${e.validatorKeyAddress}
5897
+ Balance: ${e.validatorKeyBalance}
5898
+ Vote Key: ${e.voteKey}
5899
+ Address: ${e.voteKeyAddress}
5900
+ Balance: ${e.voteKeyBalance}
5901
+ Authority Key: ${e.authorityKey}
5902
+ Address: ${e.authorityKeyAddress}
5903
+ Balance: ${e.authorityKeyBalance}
5904
+ Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
5905
+ Address: ${e.validatorKeyAddress}
5906
+ Balance: ${e.validatorKeyBalance}
5907
+ Active Identity:`),console.log(sS.white(E)),SS(`solana-keygen pubkey ${f}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),X=t(_=>{let e=L(),E=_.NETWORK===c.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:f_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:M(e.testnetValidatorKey),validatorKeyBalance:f_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:M(e.testnetValidatorVoteKey),voteKeyBalance:f_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:M(e.testnetValidatorAuthorityKey),authorityKeyBalance:f_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:f_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:M(e.mainnetValidatorVoteKey),voteKeyBalance:f_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:M(e.mainnetValidatorAuthorityKey),authorityKeyBalance:f_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");var ho=t((_=0,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=X(i),r=v_.filter(a=>a!==T).map(a=>`--known-validator ${a} \\`).join(`
5908
+ `);return`#!/bin/bash
5895
5909
  exec ${n} \\
5896
- --identity ${M} \\
5897
- --vote-account ${fe} \\
5898
- --authorized-voter ${b} \\
5899
- --log ${j} \\
5910
+ --identity ${f} \\
5911
+ --vote-account ${k_} \\
5912
+ --authorized-voter ${V} \\
5913
+ --log ${b} \\
5900
5914
  --accounts ${i.ACCOUNTS_PATH} \\
5901
5915
  --ledger ${i.LEDGER_PATH} \\
5902
5916
  --snapshots ${i.SNAPSHOTS_PATH} \\
@@ -5905,12 +5919,7 @@ exec ${n} \\
5905
5919
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
5906
5920
  --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
5907
5921
  --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
5908
- --known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\
5909
- --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
5910
- --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
5911
- --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
5912
- --known-validator phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2 \\
5913
- --known-validator wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo \\
5922
+ ${r}
5914
5923
  --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
5915
5924
  --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
5916
5925
  --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
@@ -5928,21 +5937,20 @@ exec ${n} \\
5928
5937
  --snapshot-interval-slots 0 \\
5929
5938
  --private-rpc \\
5930
5939
  --full-rpc-api \\
5931
- `,"startJitoMainnetScript");var Ao=t((_=1e4,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5940
+ `},"startJitoMainnetScript");var Bo=t((_=1e4,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=X(i),r=w_.filter(a=>a!==T).map(a=>`--known-validator ${a} \\`).join(`
5941
+ `);return`#!/bin/bash
5932
5942
  exec ${n} \\
5933
- --identity ${M} \\
5934
- --vote-account ${Ue} \\
5935
- --authorized-voter ${K} \\
5936
- --log ${j} \\
5943
+ --identity ${f} \\
5944
+ --vote-account ${V_} \\
5945
+ --authorized-voter ${h} \\
5946
+ --log ${b} \\
5937
5947
  --accounts ${i.ACCOUNTS_PATH} \\
5938
5948
  --ledger ${i.LEDGER_PATH} \\
5939
5949
  --snapshots ${i.SNAPSHOTS_PATH} \\
5940
5950
  --entrypoint entrypoint.testnet.solana.com:8001 \\
5941
5951
  --entrypoint entrypoint2.testnet.solana.com:8001 \\
5942
5952
  --entrypoint entrypoint3.testnet.solana.com:8001 \\
5943
- --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\
5944
- --known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\
5945
- --known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\
5953
+ ${r}
5946
5954
  --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\
5947
5955
  --tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\
5948
5956
  --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
@@ -5962,12 +5970,13 @@ exec ${n} \\
5962
5970
  --expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\
5963
5971
  --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5964
5972
  --full-rpc-api \\
5965
- `,"startJitoTestnetScript");var Lo=t((_,e="agave-validator")=>`#!/bin/bash
5973
+ `},"startJitoTestnetScript");var go=t((_,e="agave-validator")=>{let{validatorKeyAddress:E}=X(_),n=v_.filter(s=>s!==E).map(s=>`--known-validator ${s} \\`).join(`
5974
+ `);return`#!/bin/bash
5966
5975
  exec ${e} \\
5967
- --identity ${M} \\
5968
- --vote-account ${fe} \\
5969
- --authorized-voter ${b} \\
5970
- --log ${j} \\
5976
+ --identity ${f} \\
5977
+ --vote-account ${k_} \\
5978
+ --authorized-voter ${V} \\
5979
+ --log ${b} \\
5971
5980
  --accounts ${_.ACCOUNTS_PATH} \\
5972
5981
  --ledger ${_.LEDGER_PATH} \\
5973
5982
  --snapshots ${_.SNAPSHOTS_PATH} \\
@@ -5976,12 +5985,7 @@ exec ${e} \\
5976
5985
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
5977
5986
  --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
5978
5987
  --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
5979
- --known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\
5980
- --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
5981
- --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
5982
- --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
5983
- --known-validator phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2 \\
5984
- --known-validator wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo \\
5988
+ ${n}
5985
5989
  --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
5986
5990
  --expected-shred-version 50093 \\
5987
5991
  --dynamic-port-range 8000-8025 \\
@@ -5994,21 +5998,20 @@ exec ${e} \\
5994
5998
  --block-verification-method unified-scheduler \\
5995
5999
  --snapshot-interval-slots 0 \\
5996
6000
  --private-rpc \\
5997
- `,"startMainnetValidatorScript");var KE=t(_=>`#!/bin/bash
6001
+ `},"startMainnetValidatorScript");var bE=t(_=>{let{validatorKeyAddress:e}=X(_),i=w_.filter(T=>T!==e).map(T=>`--known-validator ${T} \\`).join(`
6002
+ `);return`#!/bin/bash
5998
6003
  exec agave-validator \\
5999
- --identity ${M} \\
6000
- --vote-account ${Ue} \\
6001
- --authorized-voter ${K} \\
6002
- --log ${j} \\
6004
+ --identity ${f} \\
6005
+ --vote-account ${V_} \\
6006
+ --authorized-voter ${h} \\
6007
+ --log ${b} \\
6003
6008
  --accounts ${_.ACCOUNTS_PATH} \\
6004
6009
  --ledger ${_.LEDGER_PATH} \\
6005
6010
  --snapshots ${_.SNAPSHOTS_PATH} \\
6006
6011
  --entrypoint entrypoint.testnet.solana.com:8001 \\
6007
6012
  --entrypoint entrypoint2.testnet.solana.com:8001 \\
6008
6013
  --entrypoint entrypoint3.testnet.solana.com:8001 \\
6009
- --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\
6010
- --known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\
6011
- --known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\
6014
+ ${i}
6012
6015
  --only-known-rpc \\
6013
6016
  --rpc-bind-address 127.0.0.1 \\
6014
6017
  --private-rpc \\
@@ -6025,107 +6028,79 @@ exec agave-validator \\
6025
6028
  --full-rpc-api \\
6026
6029
  --maximum-full-snapshots-to-retain 1 \\
6027
6030
  --maximum-incremental-snapshots-to-retain 4 \\
6028
- `,"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(`
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,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 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(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
6030
- ${T} ${f.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6031
- ${T} ${f.ACCOUNTS} ext4 defaults 0 0
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(`
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:
6034
- ${R.join(`
6035
- `)}`)}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:"",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=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 _=`
6036
- # Increase UDP buffer sizes
6037
- net.core.rmem_default = 134217728
6038
- net.core.rmem_max = 134217728
6039
- net.core.wmem_default = 134217728
6040
- net.core.wmem_max = 134217728
6041
-
6042
- # Increase memory mapped files limit
6043
- vm.max_map_count = 1000000
6044
-
6045
- # Increase number of allowed open file descriptors
6046
- fs.nr_open = 1000000
6047
- `,e=`
6048
- # Increase process file descriptor count limit
6049
- * - nofile 1000000
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(Go,"setupSystemd");var GE=t((_=q.USERNAME,e)=>{let{log:E}=F_(),o=e?"frankendancer":"agave",i=`${E} {
6051
- su ${_} ${_}
6052
- daily
6053
- rotate 1
6054
- size 4G
6055
- missingok
6056
- compress
6057
- postrotate
6058
- systemctl kill -s USR1 solv.service
6059
- endscript
6060
- }
6061
- `;return o==="agave"?(i=`${E} {
6062
- su ${_} ${_}
6063
- daily
6064
- rotate 1
6065
- size 4G
6066
- missingok
6067
- compress
6068
- postrotate
6069
- systemctl kill -s USR1 solv.service
6070
- endscript
6071
- }
6072
- `,i):(o==="frankendancer"&&(i=`${E} {
6073
- su ${_} ${_}
6074
- daily
6075
- size 4G
6076
- rotate 1
6077
- missingok
6078
- notifempty
6079
- compress
6080
- copytruncate
6081
- }
6082
- `),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]
6083
- Description=Solana Validator
6084
- After=network.target
6085
- StartLimitIntervalSec=0
6086
-
6087
- [Service]
6088
- Type=simple
6089
- Restart=always
6090
- RestartSec=1
6091
- LimitNOFILE=1000000
6092
- LimitMEMLOCK=infinity
6093
- LogRateLimitIntervalSec=0
6094
- User=${q.USERNAME}
6095
- Environment=PATH=${o}
6096
- WorkingDirectory=${v.ROOT}
6097
- Environment="${E}"
6098
- ExecStart=${e}
6099
-
6100
- [Install]
6101
- 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
6102
- net.core.rmem_default=134217728
6103
- net.core.wmem_default=134217728
6104
- net.core.rmem_max=134217728
6105
- net.core.wmem_max=134217728
6106
-
6107
- # set minimum, default, and maximum tcp buffer sizes (10k, 87.38k (linux default), 128MB resp)
6108
- net.ipv4.tcp_rmem=10240 87380 134217728
6109
- net.ipv4.tcp_wmem=10240 87380 134217728
6110
-
6111
- # Enable TCP westwood for kernels greater than or equal to 2.6.13
6112
- 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+=`
6113
- ${FS}
6114
- `,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 ${_}`)}
6115
-
6116
- We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
6117
- It's our way of supporting the community and empowering you with fast, reliable connections.
6118
-
6119
- To get your free API key, simply join us through the link below:
6120
-
6121
- Validators DAO: ${je.white("`https://discord.gg/X4BgkBHavp`")}
6122
-
6123
- Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6124
- `;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
6031
+ `},"startTestnetAgaveValidatorScript");import{writeFile as Ho}from"fs/promises";var yo=t((_=0,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=X(n),C=v_.filter(R=>R!==s).map(R=>`--known-validator ${R} \\`).join(`
6032
+ `);return`#!/bin/bash
6033
+ exec ${T} \\
6034
+ --identity ${f} \\
6035
+ --vote-account ${k_} \\
6036
+ --authorized-voter ${V} \\
6037
+ --log ${b} \\
6038
+ --accounts ${n.ACCOUNTS_PATH} \\
6039
+ --ledger ${n.LEDGER_PATH} \\
6040
+ --snapshots ${n.SNAPSHOTS_PATH} \\
6041
+ --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
6042
+ --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
6043
+ --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
6044
+ --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
6045
+ --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
6046
+ ${C}
6047
+ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
6048
+ --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
6049
+ --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
6050
+ --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
6051
+ --commission-bps ${_} \\
6052
+ --rpc-bind-address 127.0.0.1 \\
6053
+ --block-engine-url ${E} \\
6054
+ --shred-receiver-address ${o} \\
6055
+ --bam-url ${i} \\
6056
+ --dynamic-port-range 8000-8025 \\
6057
+ --rpc-port 8899 \\
6058
+ --wal-recovery-mode skip_any_corrupted_record \\
6059
+ --limit-ledger-size 50000000 \\
6060
+ --block-production-method central-scheduler-greedy \\
6061
+ --block-verification-method unified-scheduler \\
6062
+ --snapshot-interval-slots 0 \\
6063
+ --private-rpc \\
6064
+ --full-rpc-api \\
6065
+ `},"startBamMainnetScript");import{spawnSync as __}from"child_process";var wE=t((_=s_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;__(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-bam`;__(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),__(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),__(`git -C /tmp/${o} clone https://github.com/jito-labs/jito-bam.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),__(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),__(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),__(`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"}),__(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),__(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),__("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?__(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):__(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-bam/install)"`,{shell:!0,stdio:"inherit"})},"installBam");var Ko=t((_=1e4,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=X(n),C=w_.filter(R=>R!==s).map(R=>`--known-validator ${R} \\`).join(`
6066
+ `);return`#!/bin/bash
6067
+ exec ${T} \\
6068
+ --identity ${f} \\
6069
+ --vote-account ${V_} \\
6070
+ --authorized-voter ${h} \\
6071
+ --log ${b} \\
6072
+ --accounts ${n.ACCOUNTS_PATH} \\
6073
+ --ledger ${n.LEDGER_PATH} \\
6074
+ --snapshots ${n.SNAPSHOTS_PATH} \\
6075
+ --entrypoint entrypoint.testnet.solana.com:8001 \\
6076
+ --entrypoint entrypoint2.testnet.solana.com:8001 \\
6077
+ --entrypoint entrypoint3.testnet.solana.com:8001 \\
6078
+ ${C}
6079
+ --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\
6080
+ --tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\
6081
+ --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
6082
+ --commission-bps ${_} \\
6083
+ --rpc-bind-address 127.0.0.1 \\
6084
+ --block-engine-url ${E} \\
6085
+ --shred-receiver-address ${o} \\
6086
+ --bam-url ${i} \\
6087
+ --dynamic-port-range 8000-8025 \\
6088
+ --rpc-port 8899 \\
6089
+ --wal-recovery-mode skip_any_corrupted_record \\
6090
+ --limit-ledger-size 50000000 \\
6091
+ --block-production-method central-scheduler-greedy \\
6092
+ --block-verification-method unified-scheduler \\
6093
+ --private-rpc \\
6094
+ --wait-for-supermajority 343175553 \\
6095
+ --expected-shred-version 9065 \\
6096
+ --expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\
6097
+ --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
6098
+ --full-rpc-api \\
6099
+ `},"startBamTestnetScript");import{spawnSync as p}from"child_process";import{promises as HE}from"fs";import dS from"path";var RS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6125
6100
  sudo chmod -R 755 /mnt
6126
6101
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
6127
6102
  sudo chown -R solv:solv /mnt
6128
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),zo=AS;var LS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6103
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Go=RS;var aS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6129
6104
  Description=Firedancer Solana
6130
6105
  After=network.target
6131
6106
  StartLimitIntervalSec=0
@@ -6141,7 +6116,7 @@ ExecStart=/home/solv/start-firedancer.sh
6141
6116
 
6142
6117
  [Install]
6143
6118
  WantedBy=multi-user.target
6144
- `}),"firedancerService"),Zo=LS;var MS=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6119
+ `}),"firedancerService"),ko=aS;var CS=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6145
6120
  user = "solv"
6146
6121
 
6147
6122
  [log]
@@ -6308,7 +6283,7 @@ user = "solv"
6308
6283
  commission_bps = 10000
6309
6284
 
6310
6285
  [tiles.pack]
6311
- schedule_strategy = "balanced"`:o}},"configToml"),_i=MS;var uS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6286
+ schedule_strategy = "balanced"`:o}},"configToml"),Vo=CS;var cS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6312
6287
  Description=Relay port 9600 to localhost:80
6313
6288
  After=network.target
6314
6289
 
@@ -6318,7 +6293,103 @@ Restart=always
6318
6293
 
6319
6294
  [Install]
6320
6295
  WantedBy=multi-user.target
6321
- `}),"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 C=ei();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=_i(E,T);await bE.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 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
6296
+ `}),"portRelayService"),bo=cS;var vE=t((_=q.USERNAME,e)=>{let{log:E}=P_(),o=e?"frankendancer":"agave",i=`${E} {
6297
+ su ${_} ${_}
6298
+ daily
6299
+ rotate 1
6300
+ size 4G
6301
+ missingok
6302
+ compress
6303
+ postrotate
6304
+ systemctl kill -s USR1 solv.service
6305
+ endscript
6306
+ }
6307
+ `;return o==="agave"?(i=`${E} {
6308
+ su ${_} ${_}
6309
+ daily
6310
+ rotate 1
6311
+ size 4G
6312
+ missingok
6313
+ compress
6314
+ postrotate
6315
+ systemctl kill -s USR1 solv.service
6316
+ endscript
6317
+ }
6318
+ `,i):(o==="frankendancer"&&(i=`${E} {
6319
+ su ${_} ${_}
6320
+ daily
6321
+ size 4G
6322
+ rotate 1
6323
+ missingok
6324
+ notifempty
6325
+ compress
6326
+ copytruncate
6327
+ }
6328
+ `),i)},"logRotates");import{existsSync as wo}from"fs";import{execSync as vo}from"child_process";function Q_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&wo(m.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!wo(m.SOL_LOGROTATE)){let e=vE("solv",_);vo(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=vE("solv",_);vo(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(Q_,"setupLogrotate");var NS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?H_:I_,{filePath:i,body:n}=qe();_?(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 HE.mkdir(dS.dirname(i),{recursive:!0}),await HE.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 o_(),{filePath:s,body:S}=Go();p(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),p(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=ko();p(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let C=bo();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=Vo(E,T);await HE.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"}),Q_(!0)},"setupFiredancer"),Oe=NS;var OS=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===c.MAINNET?(console.log("Mainnet Validator Node Setup"),await lS(_,e)):E===c.TESTNET?(console.log("Testnet Validator Node Setup"),await FS(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),lS=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 N.SOLANA:VE(o),n=go(_);break;case N.JITO:console.log("JITO Validator Setup for Mainnet");let s=await o_();de(o,e,T),n=ho(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,_);break;case N.BAM:console.log("JITO Validator Setup for Mainnet");let S=await o_();wE(o,e,T),n=yo(S.commissionBps,S.relayerUrl,S.blockEngineUrl,S.shredReceiverAddr,S.bamUrl,_);break;case N.FRANKENDANCER:await Oe(e,_);break;default:console.log("Unknown Validator Type for Mainnet");break}await Ho(F_,n,"utf-8"),Ne()},"setupMainnetValidator"),FS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o}=_;e=o;let i="",n=!!_.TESTNET_SOLANA_VERSION.startsWith("3");switch(E){case N.SOLANA:VE(_.TESTNET_SOLANA_VERSION),i=bE(_);case N.AGAVE:console.log("Agave Validator Setup for Testnet"),Y_(_.TESTNET_SOLANA_VERSION,e,n),i=bE(_);break;case N.JITO:console.log("JITO Validator Setup for Testnet");let T=await o_();de(_.TESTNET_SOLANA_VERSION,e,n),i=Bo(T.commissionBps,T.relayerUrl,T.blockEngineUrl,T.shredReceiverAddr,_);break;case N.BAM:console.log("BAM Validator Setup for Mainnet");let s=await o_();wE(_.TESTNET_SOLANA_VERSION,e,n),i=Ko(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,s.bamUrl,_);break;case N.FRANKENDANCER:console.log("FRANKENDANCER Validator Setup for Mainnet"),await Oe(e,_);break;default:console.log("Unknown Validator Type for Testnet");break}await Ho(F_,i,"utf-8"),Ne()},"setupTestnetValidator"),Yo=OS;import ri from"chalk";import{execSync as Jo}from"node:child_process";function xo(_){try{Jo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{Jo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(xo,"createDirectoryIfNotExists");var Qo=t(()=>{try{let _=[U.ACCOUNTS,U.LEDGER,U.SNAPSHOTS];for(let e of _)xo(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as IS}from"child_process";function DS(){let e=IS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6329
+ `).slice(1),E=[],o=e.map(l=>l.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let l of e){let[F,K,A]=l.trim().split(/\s+/);if(!F||!K)continue;let Q=parseInt(K,10);if(isNaN(Q))continue;let c_=A!==void 0&&A!=="";A==="/"&&(S=F.replace(/p?\d*$/,""));let u_=o.some(ne=>ne!==F&&ne.startsWith(F)),ie=F.startsWith("nvme")?"NVMe":"SATA";Q>=400*1024*1024*1024&&E.push({name:F,size:Q,mountpoint:A||"",isMounted:c_,hasPartition:u_,type:ie})}console.log("Found root disk name: ",S);let r=o.filter(l=>l.startsWith(S));r.forEach(l=>console.log("Found root disk partition: ",l));let a=E.filter(l=>!r.includes(l.name)).sort((l,F)=>F.size-l.size),R=a.filter(l=>l.type==="NVMe").sort((l,F)=>F.size-l.size),O=a.filter(l=>l.type==="SATA").sort((l,F)=>F.size-l.size),I=[...R,...O];if(I.length>0){let l=I[0];if(l.size>=850*1024*1024*1024&&!l.isMounted&&(i=!0),l.size>=1250*1024*1024*1024&&l.isMounted&&(T=!0),I.length>1){let F=I[1];F.size>=400*1024*1024*1024&&!F.isMounted&&(n=!0)}if(I.length>2){let F=I[2];F.size>=400*1024*1024*1024&&!F.isMounted&&(s=!0)}}return I.forEach((l,F)=>console.log(`Prioritized Disk ${F+1}: ${l.name} ${l.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(DS,"getPreferredDisks");var le=DS;import{spawnSync as q_}from"child_process";var U_=t(_=>{if(q_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return q_("sudo udevadm trigger --action=change",{shell:!0}),q_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return q_(E,{shell:!0,stdio:"inherit"}),q_("sudo udevadm trigger --action=change",{shell:!0}),q_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Ze}from"child_process";async function YE(_){for(let e=1;e<=5;e++){let o=Ze(`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 Fe=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await YE(_),T=await YE(e),s=await YE(E),S=`${n} ${U.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${U.LEDGER} ext4 defaults 0 0
6330
+ ${T} ${U.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${U.LEDGER} ext4 defaults 0 0
6331
+ ${T} ${U.ACCOUNTS} ext4 defaults 0 0
6332
+ ${s} ${U.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],a=Ze("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let O of r)a.includes(O)||(console.log(`[INFO] Line to add: ${O}`),R.push(O));if(R.length){console.log(`[INFO] Lines to add all: ${R}`);let O=`echo "${R.join(`
6333
+ `)}" | sudo tee -a /etc/fstab`;Ze(O,{shell:!0,encoding:"utf8"}),Ze("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6334
+ ${R.join(`
6335
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as PS}from"child_process";var qo=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=PS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var fS=t(async()=>{let _=le(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await u({MNT_DISK_TYPE:W.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=U_(E),T=U_(o),s=U_(i),S=n?E:"",r=T?o:"",C=s?i:"";console.log("Waiting for formatting to finish..."),await Y(5e3),await Fe(n?S:"",T?r:"",s?C:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await u({MNT_DISK_TYPE:W.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=U_(E),n=U_(o);await Fe(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await u({MNT_DISK_TYPE:W.SINGLE}),e.includes("/mnt")){qo(e);let E="/dev/"+_.disks[0].name;U_(E),await Fe(E)}else{let E="/dev/"+_.disks[0].name;U_(E),await Fe(E)}},"mountDirs"),$o=fS;import{spawnSync as US}from"child_process";var Wo=t(()=>{let _=[`sudo mkdir -p ${U.ROOT}`,`sudo chown -R solv:solv ${U.ROOT}`,`sudo chmod -R 755 ${U.ROOT}`,`sudo mkdir -p ${U.ACCOUNTS}`,`sudo chown -R solv:solv ${U.ACCOUNTS}`,`sudo chmod -R 755 ${U.ACCOUNTS}`,`sudo mkdir -p ${U.LEDGER}`,`sudo chown -R solv:solv ${U.LEDGER}`,`sudo chmod -R 755 ${U.LEDGER}`,`sudo mkdir -p ${U.SNAPSHOTS}`,`sudo chown -R solv:solv ${U.SNAPSHOTS}`,`sudo chmod -R 755 ${U.SNAPSHOTS}`];for(let e of _)US(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as _E}from"child_process";import{existsSync as AS}from"fs";function Xo(){if(!AS(m.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6336
+ # Increase UDP buffer sizes
6337
+ net.core.rmem_default = 134217728
6338
+ net.core.rmem_max = 134217728
6339
+ net.core.wmem_default = 134217728
6340
+ net.core.wmem_max = 134217728
6341
+
6342
+ # Increase memory mapped files limit
6343
+ vm.max_map_count = 1000000
6344
+
6345
+ # Increase number of allowed open file descriptors
6346
+ fs.nr_open = 1000000
6347
+ `,e=`
6348
+ # Increase process file descriptor count limit
6349
+ * - nofile 1000000
6350
+ `;_E(`echo "${_}" | sudo tee ${m.SOL_SYSTEM_CONFIG21} > /dev/null`),_E(`sudo sysctl -p ${m.SOL_SYSTEM_CONFIG21}`),_E(`echo "DefaultFILE=1000000" | sudo tee -a ${m.SOL_SYSTEM_CONF}`),_E(`echo "${e}" | sudo tee ${m.SOL_NOFILES_CONF} > /dev/null`)}}t(Xo,"setupSystemd");var LS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",MS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",uS=`/home/${q.USERNAME}/.local/share/solana/install/active_release/bin`,jo=t((_=!0)=>{let{scriptPath:e}=P_(_),E=_?MS:LS,o=uS;return`[Unit]
6351
+ Description=Solana Validator
6352
+ After=network.target
6353
+ StartLimitIntervalSec=0
6354
+
6355
+ [Service]
6356
+ Type=simple
6357
+ Restart=always
6358
+ RestartSec=1
6359
+ LimitNOFILE=1000000
6360
+ LimitMEMLOCK=infinity
6361
+ LogRateLimitIntervalSec=0
6362
+ User=${q.USERNAME}
6363
+ Environment=PATH=${o}
6364
+ WorkingDirectory=${H.ROOT}
6365
+ Environment="${E}"
6366
+ ExecStart=${e}
6367
+
6368
+ [Install]
6369
+ WantedBy=multi-user.target`},"solvService");import{execSync as pS}from"child_process";function zo(_=!0){console.log("Creating solvService configuration for solana");let e=jo(_);pS(`echo "${e}" | sudo tee ${m.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(zo,"setupSolvService");var Zo=t((_=!0)=>{Q_(),zo(_),Xo()},"makeServices");import{spawnSync as JE}from"node:child_process";var _i=t(_=>{try{je(_);let e=_.NETWORK;return e===c.TESTNET?(JE(`solana config set --url ${e} -k ${h}`,{shell:!0,stdio:"inherit"}),JE(`solana airdrop 1 --url ${e} -k ${h}`,{shell:!0,stdio:"inherit"})):JE(`solana config set --url ${e} -k ${V}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&We(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as ei}from"node:child_process";var eE=t((_=!1,e="45",E=n_,o=v,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){ei(`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}ei(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as mS}from"node:child_process";var EE=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===N.FRANKENDANCER?"frankendancer":"solv"}`];mS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as hS}from"node:child_process";var BS=t(()=>{try{hS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Ei=BS;import xE from"fs";import{promisify as oi}from"util";import{execSync as ti}from"child_process";var gS=oi(xE.readFile),yS=oi(xE.access),tE="/etc/sysctl.conf",KS=`# set default and maximum socket buffer sizes to 128MB
6370
+ net.core.rmem_default=134217728
6371
+ net.core.wmem_default=134217728
6372
+ net.core.rmem_max=134217728
6373
+ net.core.wmem_max=134217728
6374
+
6375
+ # set minimum, default, and maximum tcp buffer sizes (10k, 87.38k (linux default), 128MB resp)
6376
+ net.ipv4.tcp_rmem=10240 87380 134217728
6377
+ net.ipv4.tcp_wmem=10240 87380 134217728
6378
+
6379
+ # Enable TCP westwood for kernels greater than or equal to 2.6.13
6380
+ net.ipv4.tcp_congestion_control=westwood`;async function GS(){try{await yS(tE,xE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${tE} does not exist`)}try{let _=await gS(tE,"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+=`
6381
+ ${KS}
6382
+ `,ti(`echo "${e}" | sudo tee ${tE} > /dev/null`),ti("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(GS,"updateSysctlConfig");var ii=GS;import{spawnSync as kS}from"child_process";var ni=t(()=>{kS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as VS}from"node:child_process";var Ti=t(()=>{VS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as si}from"child_process";var Si=t((_=!1,e=!1)=>{_?wS():bS(e)},"createSymLink"),bS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),si(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),wS=t(()=>{si("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import oE from"chalk";var vS=t(()=>{let _=`${oE.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${oE.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6383
+
6384
+ We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
6385
+ It's our way of supporting the community and empowering you with fast, reliable connections.
6386
+
6387
+ To get your free API key, simply join us through the link below:
6388
+
6389
+ Validators DAO: ${oE.white("`https://discord.gg/X4BgkBHavp`")}
6390
+
6391
+ Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6392
+ `;console.log(oE.cyan(e))},"rpcLog"),g_=vS;var Ri=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(ri.white("\u{1F7E2} Initializing Setup")),await k(),await Uo());let i=await k(),n=i.NETWORK===c.TESTNET;switch(Qo(),(!e||!E)&&await $o(),Zo(n),ni(),Ei(),await ii(),_i(i),Si(i.IS_DUMMY,n),i=await k(),i.NODE_TYPE){case D.RPC:await Mo(i);break;case D.VALIDATOR:await Yo(i,o);break;default:throw new Error("Unknown Node Type")}E||Wo(),Ce(),i.VALIDATOR_TYPE!==N.FRANKENDANCER&&(E||(i=await k(),Ti(),eE(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),E||EE(i),console.log(ri.white("\u{1F7E2} Setup Completed")),g_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var ai=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6322
6393
  [Unit]
6323
6394
  Description=Solana transaction relayer
6324
6395
  Requires=network-online.target
@@ -6344,7 +6415,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
6344
6415
  --verifying-key-pem-path=/home/solv/public.pem
6345
6416
 
6346
6417
  [Install]
6347
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),ii=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6418
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),Ci=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6348
6419
  Description=Solana transaction relayer
6349
6420
  Requires=network-online.target
6350
6421
  After=network-online.target
@@ -6367,45 +6438,45 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
6367
6438
  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
6368
6439
 
6369
6440
  [Install]
6370
- 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(`
6441
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as iE,spawnSync as A_}from"child_process";var ci=t(async(_,e=!0)=>{A_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),A_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),A_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),A_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),A_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),A_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?ai(_):Ci(_);iE(`echo "${o}" | sudo tee ${E} > /dev/null`),A_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),A_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),iE("sudo ufw allow 11228",{stdio:"inherit"}),iE("sudo ufw allow 11229",{stdio:"inherit"}),iE("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as QE}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"),di=HS;import{spawnSync as YS}from"node:child_process";import{readFile as JS,writeFile as xS}from"fs/promises";var QS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await JS(_,"utf-8")).split(`
6371
6442
  `);E.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let o=E.join(`
6372
- `);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
6443
+ `);await xS(_,o),YS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Ni=QS;import qS from"inquirer";import{writeFile as $S}from"node:fs/promises";var Oi=t(async()=>{let e=(await qS.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";QE(E,{shell:!0,stdio:"inherit"}),QE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),QE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=di(e),s=JSON.stringify(T,null,2);await $S(n,s,{encoding:"utf8"}),await Ni()},"yellowstoneGeyser");var li=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(O_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),We(_),process.exit(0);else if(e.key)console.log(O_.white("\u{1F511} Setting up Validator Keypairs ...")),je(_),process.exit(0);else if(e.relayer){console.log(O_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await o_()).blockEngineUrl;await ci(i,!1),console.log(O_.green(`Jito Relayer Setup Completed
6373
6444
 
6374
- $ 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(`
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 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}`,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 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 C=`${i}/${r}`;Pi(e,s,C,n)&&console.log(`Successfully Exported - ${C} \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:
6376
- `)),console.log(eE.white(E))}catch(_){console.error(eE.white(`Error reading SSH Public Key
6377
- `)),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(`
6378
- `).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.
6379
- 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(`
6445
+ $ solv relayer --help`)),Ce(),g_(),process.exit(0)}else if(e.jupiter)console.log(O_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Do(),Ce(),g_(),process.exit(0);else if(e.geyser){console.log(O_.white("\u26A1\uFE0F Setting up Geyser ...")),await Oi();return}else if(e.firedancer){console.log(O_.white("\u{1F525} Setting up Firedancer ...")),await Oe(E);return}await Ri(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(O_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(O_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as WS}from"child_process";var qE=t(()=>{let E=WS("df -h").toString().split(`
6446
+ `).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)=>y_(n.Avail)-y_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&y_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&y_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&y_(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/")&&y_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Fi from"chalk";import XS from"cli-table3";var $E=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Fi.blue(o)),E=new XS({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=>Fi.white(i)))}),console.log(E.toString())},"displayTable");var Ii=t(async()=>{d.command("df").description("Disk Free Command").action(()=>{let _=qE();$E(_)})},"dfCommands"),y_=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 Di=t(_=>{d.command("start").description("Start Solana Validator").action(()=>{EE(_),process.exit(0)})},"startCommand");import{spawnSync as jS}from"node:child_process";import zS from"chalk";var Pi=t(async _=>{zS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===N.FRANKENDANCER?"frankendancer":"solv"}`];jS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var fi=t(_=>{d.command("stop").description("Stop Solana Validator").action(()=>{Pi(_),process.exit(0)})},"stopCommand");import{spawnSync as Ie}from"node:child_process";import Ui from"chalk";var Ai=t(_=>{let e=S_();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(Ui.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ie("solv stop",{stdio:"inherit",shell:!0}),Ie("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ie("solv get snapshot",{stdio:"inherit",shell:!0}),Ie("solv start",{stdio:"inherit",shell:!0}),console.log(Ui.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}`;Ie(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");import{spawnSync as j}from"child_process";var Li=t((_=t_.tag,e=!1,E=!1)=>{j("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),j("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(j(`mkdir /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),j(`cd /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),j(`git clone https://github.com/jito-labs/bam-client.git --recurse-submodules /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${_}-bam checkout ${_}-bam`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${_}-bam submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),j(`CI_COMMIT=$(git -C /tmp/${_}-bam rev-parse HEAD) /tmp/${_}-bam/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-bam`,{shell:!0,stdio:"inherit"}),j(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-bam/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),j(`sudo rm -rf /tmp/${_}-bam`,{shell:!0,stdio:"inherit"})):e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):j(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-bam/install)"`,{shell:!0,stdio:"inherit"})},"bamUpdate");var Mi=t(_=>{let E=_.NETWORK===c.TESTNET?T_:v;_.NODE_TYPE===D.RPC&&(E=h_),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===N.JITO,n=_.VALIDATOR_TYPE===N.BAM,T=_.VALIDATOR_TYPE===N.FRANKENDANCER,s=o.mod||_.MOD;if(i){let C=o.version||s_,a=`v${C}`,R=!!C.startsWith("3");we(a,s,R);return}if(n){let C=o.version||s_,a=`v${C}`,R=!!C.startsWith("3");Li(a,s,R);return}if(T){let C=o.version||I_;$e(_,C,s);return}_.NODE_TYPE===D.RPC&&(E=h_);let r=o.version||E;await ye(r,s)})},"installCommands");import{spawnSync as ZS}from"child_process";var ui=t(()=>{d.command("mtr").description("Mount Reload Command").action(()=>{ZS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),d.command("disks").description("Show unmounted disks").action(()=>{let _=le();console.log(_)})},"mountCommands");import{spawnSync as Er}from"node:child_process";import pi from"chalk";import{spawnSync as _r}from"child_process";var er=t(async()=>{try{let _=_r("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"),nE=er;var mi=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 nE()&&(console.log(pi.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 -`;Er(o,{shell:!0,stdio:"inherit"}),console.log(pi.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var De={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 or,mkdirSync as ir}from"fs";import nr from"inquirer";import{homedir as Tr}from"os";import{spawnSync as tr}from"node:child_process";function hi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return tr(i,{shell:!0,stdio:"inherit"}).status===0}t(hi,"executeSCP");var WE=t(async(_="")=>{let e=_;_===""&&(e=(await nr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(L()),o=Tr(),i=o.includes("/home/solv")?"/home/solv":o+De.SOLV_KEYPAIR_DOWNLOAD_PATH;or(i)||ir(i,{recursive:!0});let n=!0,T=o+"/"+Ct;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}`;hi(e,s,C,n)&&console.log(`Successfully Exported - ${C} \u{1F389}`)}},"download");import{spawnSync as sr}from"child_process";import{existsSync as Sr}from"fs";import rr from"inquirer";import Rr from"os";var Bi=t(async(_="")=>{let e=Rr.userInfo().homedir,E=_;_===""&&(E=(await rr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${De.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=De.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(!Sr(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;sr(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as ar}from"child_process";import Cr from"inquirer";var gi=t(async()=>{let _=await Cr.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${H.ROOT}/.ssh && echo "${_.pubkey}" >> ${H.AUTHORIZED_KEYS}`;ar(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import TE from"chalk";import{readFileSync as cr}from"fs";import dr from"os";var yi=t(()=>{try{let e=`${dr.userInfo().homedir}/.ssh/id_rsa.pub`,E=cr(e,"utf8");console.log(TE.white(`Your SSH Public Key is:
6447
+ `)),console.log(TE.white(E))}catch(_){console.error(TE.white(`Error reading SSH Public Key
6448
+ `)),console.error(TE.white(_))}},"cat");import{spawnSync as Nr}from"child_process";var Ki=t(()=>{Nr("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Or}from"child_process";import{readFileSync as lr}from"fs";import{Readable as Fr}from"stream";var Gi=t(async _=>new Promise((e,E)=>{try{let o=Or("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6449
+ `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),Ir=t(_=>{try{return JSON.parse(lr(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),ki=t(async(_,e)=>{let E=[],o=Fr.from(_);return o.on("data",async i=>{Ir(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import sE from"chalk";import{Presets as Ur,SingleBar as Ar}from"cli-progress";import Vi from"chalk";import{spawnSync as Dr}from"node:child_process";import Pr from"node-fetch";var fr=t(async()=>{let _=await Pr(lt,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(Vi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6450
+ Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)Dr(E,{shell:!0,stdio:"ignore"});return console.log(Vi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),bi=fr;var wi=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 WE(e.ip);return}await WE()}),_.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 bi();return}await Bi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await gi()}),_.command("cat").description("Show SSH Public Key").action(()=>{yi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Ki()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Ar({},Ur.shades_classic);e.start(1e4,0);let E=await Gi(e),o=await ki(E,e);e.stop(),console.log(sE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(sE.green(`
6380
6451
  ${o.join(`
6381
- `)}`)),console.log(EE.white(`
6452
+ `)}`)),console.log(sE.white(`
6382
6453
  Only showing the first 10 results
6383
6454
 
6384
- `)),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(`
6385
- `).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
6455
+ `)),console.log(sE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as Lr}from"child_process";var vi=t(_=>{d.command("status").description("Check Solana Validator Status").action(()=>{Mr(_)})},"statusCommands"),Mr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===N.FRANKENDANCER?"frankendancer":"solv"}`;Lr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as ur}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 ur(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import Ji from"inquirer";import{spawnSync as pr}from"node:child_process";var Yi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=pr(`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 mr,existsAsync as hr}from"@skeet-framework/utils";import{execSync as Br,spawnSync as rE}from"node:child_process";import gr from"node:os";var xi=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await Ji.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;rE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await Ji.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Kr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return x_({STAKE_ACCOUNT:S}),Yi(T,Number(i.solAmount))},"stakeAccountQuestion"),yr=gr.userInfo().homedir,SE=yr+"/stake-account",Kr=t(async()=>{await hr(SE)||rE(`mkdir -p ${SE}`,{shell:!0});let _=rE(`ls ${SE}`,{shell:!0}).stdout.toString().split(`
6456
+ `).filter(n=>n.includes(".json")),e=mr(_.length+1),E=`${SE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return rE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Br(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Gr}from"node:child_process";var Qi=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 Gr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as kr}from"node:child_process";var qi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return kr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import j_ from"chalk";import{Connection as Vr,PublicKey as br}from"@solana/web3.js";import{stakePoolInfo as wr}from"@solana/spl-stake-pool";var RE=t(async(_,e=E_)=>{try{let E=new Vr(_),o=new br(e);return await wr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as vr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Hr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Yr}from"@metaplex-foundation/umi";var $i=t(async(_,e)=>{try{let E=Yr(e);console.log(`mintPubkey: ${E}`);let o=Hr(_),i=await vr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import Pe from"chalk";import Wi from"inquirer";var Xi=t(async _=>{let e=await Wi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:E_}]);try{let E=await RE(_,e.stakePoolAddress);if(!E)return console.log(Pe.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6386
6457
  Please check the correct address and try again.
6387
- `)),console.log(ce.white(`For stake pool information
6388
- \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}
6458
+ `)),console.log(Pe.white(`For stake pool information
6459
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await $i(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
6389
6460
  Name: ${n.name}
6390
- Token Mint: ${n.mint}`;return(await wi.prompt([{type:"confirm",name:"confirm",message:T+`
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
6461
+ Token Mint: ${n.mint}`;return(await Wi.prompt([{type:"confirm",name:"confirm",message:T+`
6462
+ Is this the correct Stake Pool?`}])).confirm?n:(console.log(Pe.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(Pe.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6392
6463
  Please check the correct address and try again.
6393
- `)),console.log(ce.white(`For stake pool information
6394
- \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:C}=await br(_,e,S,o,i,n,T),a=new Hi().add(...r);a.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});a.recentBlockhash=R.value.blockhash,a.sign(...C,s);let N=new Hi().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"),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 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 qi(3e3),i=new Qi(_),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
6464
+ `)),console.log(Pe.white(`For stake pool information
6465
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as ER}from"fs/promises";import Ae from"inquirer";import{existsAsync as tR}from"@skeet-framework/utils";import{Connection as en,Keypair as jr,PublicKey as Ue}from"@solana/web3.js";import{Connection as Jr,PublicKey as xr,Keypair as Qr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as qr}from"@solana/spl-token";var fe=t(async(_,e,E,o,i=!1)=>{try{let n=Qr.fromSecretKey(new Uint8Array(e)),T=new xr(E),s=new Jr(_);return(await qr(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 zr}from"cli-spinner";import K_ from"chalk";import{PublicKey as zi,Keypair as Zi,Transaction as ji,ComputeBudgetProgram as $r,LAMPORTS_PER_SOL as Wr}from"@solana/web3.js";import*as _n from"@solana/spl-stake-pool";var $_=t(async(_,e,E,o=new zi(E_),i,n,T)=>{try{let s=Zi.fromSecretKey(new Uint8Array(e)),S=E*Wr,{instructions:r,signers:C}=await Xr(_,e,S,o,i,n,T),a=new ji().add(...r);a.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});a.recentBlockhash=R.value.blockhash,a.sign(...C,s);let O=new ji().add(...r).add($r.setComputeUnitPrice({microLamports:1e3}));O.feePayer=s.publicKey,O.recentBlockhash=R.value.blockhash,O.sign(...C,s);let I=await _.sendRawTransaction(O.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"),Xr=t(async(_,e,E,o=new zi(E_),i,n,T)=>{let S=Zi.fromSecretKey(new Uint8Array(e)).publicKey;return await _n.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as En}from"@skeet-framework/utils";var aE=t(async(_,e,E,o)=>{console.log(K_.white("Solana RPC URL:",_));let i=new en(_);E===0&&(E=await CE());let n=new zr("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(K_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new Ue(e),s=jr.fromSecretKey(new Uint8Array(o)),S=R_;n.setSpinnerTitle(K_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await fe(_,o,S,s.publicKey);await En(1e3),n.setSpinnerTitle(K_.green("\u{1F504} Converting SOL to elSOL"));let C=await $_(i,o,E,T,new Ue(r),new Ue(gE),s.publicKey),a=0;for(;C.status!=="success";){if(a++,a>10)return n.stop(!0),console.log(K_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(K_.yellow(`\u23F3 ${a} Times Retrying...`)),await En(3e3),i=new en(_),C=await $_(i,o,E,T,new Ue(r),new Ue(gE),s.publicKey)}return n.stop(!0),console.log(K_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6395
6466
 
6396
- Signature:`,C.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,C=Yr.fromSecretKey(new Uint8Array(o)),a=await de(_,o,r,C.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_(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 $i(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
6467
+ Signature:`,C.signature)),!0},"elSOLdeposit");import{Connection as Zr,Keypair as _R,PublicKey as W_}from"@solana/web3.js";import{Spinner as eR}from"cli-spinner";import X_ from"chalk";import{sleep as tn}from"@skeet-framework/utils";var on=t(async(_,e,E,o,i)=>{let n=new Zr(_);E===0&&(E=await CE());let T=new eR("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(X_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new W_(e),S=await RE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(X_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,C=_R.fromSecretKey(new Uint8Array(o)),a=await fe(_,o,r,C.publicKey),R=await fe(_,o,r,new W_(Vt),!0);await tn(1e3),T.setSpinnerTitle(X_.green(`\u{1F504} Converting SOL to ${i}`));let O=await $_(n,o,E,s,new W_(a),new W_(R),C.publicKey),I=0;for(;O.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(X_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(X_.yellow(`\u23F3 ${I} Times Retrying...
6468
+ `)),await tn(1e3),O=await $_(n,o,E,s,new W_(a),new W_(R),C.publicKey)}return T.stop(!0),console.log(X_.white(`\u{1F4B0} You've got ${i} \u2728
6398
6469
 
6399
- 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:
6400
- `)),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:C,stakeAccounts:a}=await Wr(r);for await(let R of a)try{await gi(R,C)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6470
+ Signature:`,O.signature)),!0},"depositeLST");import{execSync as cE}from"node:child_process";import{homedir as oR}from"os";var nn=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=oR(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(cE(`solana config set --keypair ${T}`),!await tR(T)){console.log(j_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6471
+ `)),console.log(j_.white(T));return}let s=JSON.parse(await ER(T,"utf-8"));if(e.elsol){await aE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await Xi(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await on(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await xi(_))return;let r=await k(),{validatorVoteAccount:C,stakeAccounts:a}=await nR(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
6401
6472
  You can use a custom RPC endpoint to avoid this issue
6402
- `))}}}),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
6473
+ `))}}}),d.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await sR();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await iR();for await(let o of E)try{await Qi(o)}catch{console.log(j_.yellow(`Network might be busy, please try again later
6403
6474
  You can use a custom RPC endpoint to avoid this issue
6404
- `))}}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: ${_}
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"),$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
6475
+ `))}}else{let E=await SR();await qi(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),CE=t(async()=>{let _=cE("solana address").toString().trim(),e=cE("solana balance").toString().replace("SOL","").trim();console.log(j_.white(`\u{1F4D7} Selected Wallet: ${_}
6476
+ \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 Ae.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),iR=t(async()=>{let _=await k();return await Ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),nR=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?TR(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Ae.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"),TR=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return cE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),sR=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Ae.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),SR=t(async()=>{let _=(await k()).STAKE_ACCOUNTS;return await Ae.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 rR}from"child_process";var Tn=t(()=>{try{return rR("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as RR}from"child_process";var sn=t(()=>{try{return RR("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import l_ from"chalk";import{Spinner as aR}from"cli-spinner";var z_;(function(_){_.successHex=l_.hex("#39A845"),_.warningHex=l_.hex("#FFD02E"),_.errorHex=l_.hex("#B5332E"),_.syncHex=l_.hex("#3073B7"),_.greyHex=l_.hex("#BEBDBD"),_.indigoHex=l_.hex("#3950A0"),_.pinkHex=l_.hex("#D8A1C4"),_.normal=e=>{console.log(l_.white(e))},_.syncSpinner=e=>{let E=new aR(l_.white(e)+` %s
6406
6477
  `);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(`
6407
6478
  ${e}`),console.log(`${E}`),console.log(`${o}`),console.log(`${i}`),console.log(`${n}`),console.log(`${T}
6408
- `),console.log(`Solv Version: v${De}
6479
+ `),console.log(`Solv Version: v${pe}
6409
6480
  `)},_.installMessage=()=>{let e=_.warningHex("\u{1F525} Welcome to Solana Validator Tool Solv \u{1F525}"),E=`
6410
6481
  Solv is born and ready for running Solana Validator \u{1F680}
6411
6482
 
@@ -6426,31 +6497,18 @@ $ solv mt -p <fileSystem>
6426
6497
  $ solv umt -p <fileSystem>
6427
6498
  `,i=`mount reload
6428
6499
  $ solv mtr
6429
- `;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:
6430
- `)),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}
6431
- Address: ${e.validatorKeyAddress}
6432
- Balance: ${e.validatorKeyBalance}
6433
- Vote Key: ${e.voteKey}
6434
- Address: ${e.voteKeyAddress}
6435
- Balance: ${e.voteKeyBalance}
6436
- Authority Key: ${e.authorityKey}
6437
- Address: ${e.authorityKeyAddress}
6438
- Balance: ${e.authorityKeyBalance}
6439
- Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
6440
- Address: ${e.validatorKeyAddress}
6441
- Balance: ${e.validatorKeyBalance}
6442
- 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
6500
+ `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(z_||(z_={}));import i_ from"chalk";import{spawnSync as CR}from"node:child_process";var dE=t(_=>{CR("solana config get",{shell:!0,stdio:"inherit"});let E=P_();console.log(i_.white("start-validator.sh: ")+E.scriptPath),console.log(i_.white("solv.service: ")+m.SOL_SERVICE),console.log(i_.white("logrotate: ")+m.SOL_LOGROTATE),console.log(i_.white("logrotate (fd): ")+m.FRANKENDANCER_LOGROTATE),console.log(i_.white("sysctl.d: ")+m.SOL_SYSTEM_CONFIG21),console.log(i_.white("limits.d: ")+m.SOL_NOFILES_CONF),console.log(i_.white("system.conf: ")+m.SOL_SYSTEM_CONF),console.log(i_.white("ledger: ")+E.ledger),console.log(i_.white("accounts: ")+E.accounts),console.log(i_.white("snapshots: ")+E.snapshots),console.log(i_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Sn}from"node:child_process";import cR from"chalk";var rn=t(_=>{let e=_.NETWORK===c.TESTNET,E=e?T_:v;_.NODE_TYPE===D.RPC&&(E=h_);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=Tn();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Sn(i,{shell:!0,stdio:"pipe"});console.log(cR.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=sn();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;eE(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${S_()} --ledger /mnt/ledger/ contact-info`;Sn(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{dE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{z_.solvAA(),i.client?z_.installClientMessage():z_.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as dR}from"node:child_process";var Rn=t(()=>{dR("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as NR}from"node:child_process";var an=t(()=>{NR("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as OR}from"node:child_process";var Cn=t(()=>{OR("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as lR}from"node:child_process";var cn=t(()=>{lR("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as FR}from"node:child_process";var dn=t((_=!1)=>{FR(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import XE from"chalk";import{spawnSync as DR}from"child_process";import{spawnSync as IR}from"node:child_process";var Nn=t(()=>{IR("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var On=t(()=>{let _=d.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{Rn()}),_.command("start").description("Start Relayer").action(()=>{an()}),_.command("stop").description("Stop Relayer").action(()=>{Cn()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{dn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{cn()}),_.command("enable").description("Enable Relayer").action(()=>{Nn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(XE.red("Please provide a URL"));return}let E=`${S_()} --ledger ${P} set-relayer-config --relayer-url ${e.url}`;console.log(XE.white("Setting Relayer URL ...")),DR(E,{shell:!0,stdio:"inherit"}),console.log(XE.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as UR}from"child_process";import{spawnSync as PR}from"child_process";var NE=t(()=>{PR("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as fR}from"child_process";var ln=t(()=>{fR("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var Fn=t(_=>{NE();let e=`sudo rm -rf ${m.SOL_LOGROTATE}`;UR(e,{shell:!0,stdio:"inherit"}),Q_(_),ln()},"updateLogrotate");var In=t(_=>{d.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";Fn(e),process.exit(0)})},"logrotateCommand");import{spawnSync as jE}from"node:child_process";var Dn=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 AR}from"node:child_process";var Pn=t(_=>{let E=`${S_()} --ledger ${_.LEDGER_PATH} monitor`;AR(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as LR}from"node:child_process";var fn=t(()=>{LR("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import OE from"inquirer";import{execSync as lE,spawnSync as zE}from"child_process";import Le from"chalk";import{homedir as MR}from"os";var Un=1e3,ZE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(ZE||(ZE={}));var FE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(FE||(FE={}));var uR=Object.values(ZE),An=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(Le.blue(`\u2728 Coming Soon
6443
6501
  This Feature is Currently Under Development
6444
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await AR(),n="0";try{let a=QE(`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
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}
6446
- \u{1F4B0} Balance: ${T}`)),console.log(Fe.white(`\u{1F3E6} To Wallet: ${i}
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=QE(S,{shell:!0,stdio:"inherit"}),C=Ae;for(;r.status!==0&&C>0;)console.log(Fe.red(`\u274C Transaction Failed
6448
- Retrying Transaction in ${Fn}ms
6449
- Retries Left: ${C}`)),await Y(Fn),r=QE(S,{shell:!0,stdio:"inherit"}),C--;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(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:$E}]);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 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 C=WE(`solana address --keypair ${T}`).toString().trim(),a=WE(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${C} ${a} ${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),C=await o.getBalance(r.publicKey),R=Number(C)/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)})],C=await n.getLatestBlockhashAndContext({commitment:"finalized"}),a=new Mn(new un({instructions:r,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(a,{replaceRecentBlockhash:!0,sigVerify:!1});a.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: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 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:
6450
- `)),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),C=Math.trunc(o*Math.pow(10,n)),a=await Kn(T,s,r,s.publicKey),R=await Kn(T,s,r,S,!0);for(;;)try{let N=[yn(a.address,R.address,s.publicKey,C,[],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(a.address,R.address,s.publicKey,C,[],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(`
6502
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await pR(),n="0";try{let a=zE(`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(Le.red(`\u274C To Wallet is Invalid
6503
+ Please Check the Wallet Address`)),process.exit(0)}let T=lE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(Le.white(`\u{1F3E6} From Wallet: ${o}
6504
+ \u{1F4B0} Balance: ${T}`)),console.log(Le.white(`\u{1F3E6} To Wallet: ${i}
6505
+ \u{1F4B0} Balance: ${n}`));let{amount:s}=await OE.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=zE(S,{shell:!0,stdio:"inherit"}),C=he;for(;r.status!==0&&C>0;)console.log(Le.red(`\u274C Transaction Failed
6506
+ Retrying Transaction in ${Un}ms
6507
+ Retries Left: ${C}`)),await Y(Un),r=zE(S,{shell:!0,stdio:"inherit"}),C--;process.exit(0)})},"transferCommands"),_t=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 _=MR(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=lE(`solana address -k ${o}`).toString().trim(),n=await OE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:uR}]),T=n.from==="Validator Account"?Object.values(FE).filter(a=>a!=="Validator Account"):Object.values(FE).filter(a=>a!=="Authority Account");if((await OE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:a}=await OE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:_t}]);i=a}else{let a=n.from==="Validator Account"?e:E;o=`${_}/${a}`,i=lE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,C=lE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:C,toAddress:i}},"selectFromKeypairs");import Ln from"chalk";import mR from"inquirer";import{execSync as et,spawnSync as hR}from"node:child_process";var Mn=t(async(_,e=!1)=>{let E=_.NETWORK===c.TESTNET,o=E?be:_.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=et(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(Ln.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(Ln.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let O=await mR.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(O.sol)}let C=et(`solana address --keypair ${T}`).toString().trim(),a=et(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${C} ${a} ${S} --authorized-withdrawer ${n} --url ${o}`;hR(R,{shell:!0,stdio:"inherit"})},"withdraw");var un=t(_=>{d.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await Mn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as JR,spawnSync as xR}from"node:child_process";import{BN as mn}from"bn.js";import{LAMPORTS_PER_SOL as Et}from"@solana/web3.js";import{Connection as KR,LAMPORTS_PER_SOL as GR}from"@solana/web3.js";import{Keypair as BR}from"@solana/web3.js";import{readFile as gR}from"fs/promises";var yR=t(async _=>{let e=JSON.parse(await gR(_,"utf8"));return BR.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),pn=yR;import{homedir as kR}from"os";var C_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(C_||(C_={}));var VR={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},bR=t(async(_,e="auth",E=!1)=>{let o=new KR(_),i=kR(),n=L(i),s=`${E?"testnet":"mainnet"}${VR[e]}`,S=n[s],r=await pn(S),C=await o.getBalance(r.publicKey),R=Number(C)/GR;if(isNaN(R))throw new Error("Failed to get balance");return R},"getBalance"),L_=bR;var wR=new mn(3*Et),hn=t(async _=>{let e=await L_(_,C_.VALIDATOR),o=new mn(Number(Number(e)*Et)).sub(wR),i=Number(o)/Et;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import Me from"chalk";import{Keypair as vR,Connection as HR,PublicKey as YR,SystemProgram as Bn,ComputeBudgetProgram as IE,VersionedTransaction as gn,TransactionMessage as yn}from"@solana/web3.js";var Kn=t(async(_,e,E,o)=>{let i=0;try{let n=new HR(_,"finalized"),T=vR.fromSecretKey(new Uint8Array(Array.from(e))),s=new YR(E),S=o;for(;;)try{let r=[Bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),IE.setComputeUnitLimit({units:2e5}),IE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],C=await n.getLatestBlockhashAndContext({commitment:"finalized"}),a=new gn(new yn({instructions:r,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(a,{replaceRecentBlockhash:!0,sigVerify:!1});a.sign([T]);let O=[Bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),IE.setComputeUnitLimit({units:R.value.unitsConsumed?Math.trunc(R.value.unitsConsumed*1.2):2e5}),IE.setComputeUnitPrice({microLamports:1e3})],I=new gn(new yn({instructions:O,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message());I.sign([T]);let l=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...C.value,signature:l},"finalized"),console.log("finalized signature:",l),l}catch(r){if(i++,i>he)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 QR}from"fs/promises";import{LAMPORTS_PER_SOL as qR}from"@solana/web3.js";var tt=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=L();await L_(_,C_.VOTE)<1?(console.log(Me.white("Vote Account Balance is less than 1 SOL")),console.log(Me.white("Skip withdrawing SOL from Vote Account to Authority Account"))):xR("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await hn(_);console.log(Me.white(`Transferable Balance: ${i} SOL`));let n=i*qR;if(i<1)console.log(Me.white("Validator Account Balance is less than 1 SOL")),console.log(Me.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=JR(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await QR(E,"utf-8"));await Kn(_,s,T,n)}return!0},"collectSOL");import{readFile as oa}from"fs/promises";import ia from"inquirer";import ot from"chalk";import{execSync as $R}from"child_process";import{homedir as WR}from"os";var XR=t(async _=>{try{let e=WR(),{mainnetValidatorAuthorityKey:E}=L(e),o=`spl-token balance ${R_} --owner ${E} --url ${_}`,i=$R(o).toString().trim();return Number(i)}catch(e){return console.log(ot.red(`Error: ${e}`)),console.log(ot.yellow(`You might need to install the Solana SPL CLI:
6508
+ `)),console.log(ot.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Gn=XR;import fE from"chalk";import{Connection as jR,PublicKey as kn,Keypair as zR,ComputeBudgetProgram as DE,VersionedTransaction as Vn,TransactionMessage as bn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as wn,createTransferInstruction as vn,TOKEN_PROGRAM_ID as Hn}from"@solana/spl-token";var Yn=t(async(_,e,E,o,i,n)=>{try{let T=new jR(_,"finalized"),s=zR.fromSecretKey(new Uint8Array(e)),S=new kn(E),r=new kn(i),C=Math.trunc(o*Math.pow(10,n)),a=await wn(T,s,r,s.publicKey),R=await wn(T,s,r,S,!0);for(;;)try{let O=[vn(a.address,R.address,s.publicKey,C,[],Hn),DE.setComputeUnitLimit({units:2e5}),DE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),l=new Vn(new bn({instructions:O,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),F=await T.simulateTransaction(l,{replaceRecentBlockhash:!0,sigVerify:!1});l.sign([s]);let K=[vn(a.address,R.address,s.publicKey,C,[],Hn),DE.setComputeUnitLimit({units:F.value.unitsConsumed?Math.trunc(F.value.unitsConsumed*1.2):2e5}),DE.setComputeUnitPrice({microLamports:1e3})],A=new Vn(new bn({instructions:K,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());A.sign([s]);let Q=await T.sendRawTransaction(A.serialize());return await T.confirmTransaction({...I.value,signature:Q},"finalized"),console.log("finalized signature:",Q),Q}catch(O){console.error("Transfer failed, retrying...",O)}}catch(T){throw console.error(T),T}},"transferSPLToken");import PE from"inquirer";import{spawnSync as Jn}from"child_process";import it from"chalk";import{promises as xn}from"fs";var ZR=t(async(_="epochTimer")=>{try{let e=Jn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(it.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6451
6509
  `).filter(n=>!n.includes(_)).join(`
6452
- `),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
6453
- ${vn.green("No more Login to the server to update \u{1F331}")}
6510
+ `),i="/tmp/temp_crontab";await xn.writeFile(i,o,"utf-8"),Jn("crontab",[i]),await xn.unlink(i),console.log(it.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(it.red("Error removing cron job:",e))}},"removeCronJob"),Qn=ZR;import qn from"chalk";var _a=t(async _=>{let e=_.NETWORK===c.TESTNET,E=await PE.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 nE()&&await Qn(),await u({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6511
+ ${qn.green("No more Login to the server to update \u{1F331}")}
6454
6512
 
6455
6513
  If you enable this, solv will update automatically when the solv/solana version is updated.
6456
6514
 
@@ -6458,81 +6516,79 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
6458
6516
 
6459
6517
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
6460
6518
  \u203B Please turn off if you are using no-downtime migration.
6461
- `;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),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 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}
6462
- Validator Address: ${A(E)}
6519
+ `;console.log(qn.white(o));let i=await PE.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 PE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await PE.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"),$n=_a;import{spawnSync as na}from"node:child_process";import{Connection as ta}from"@solana/web3.js";import{Connection as ea}from"@solana/web3.js";var Ea=t(async(_,e=10,E=.4)=>{try{let i=await new ea(_).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"),Wn=Ea;var nt=t(async _=>{try{let E=await new ta(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await Wn(_);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 Ta=.03,Xn=t(_=>{d.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await sa(_),{mainnetValidatorAuthorityKey:E}=L();console.log("Harvesting SOL..."),await tt(_.RPC_URL);let o=await L_(_.RPC_URL,C_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await Y(1e3),await tt(_.RPC_URL),o=await L_(_.RPC_URL,C_.VOTE),i++;let n=JSON.parse(await oa(E,"utf-8")),T=await L_(_.RPC_URL,C_.AUTH);if(T<1)console.log(fE.white("Authority Account Balance is less than 1 SOL")),console.log(fE.white("Skip converting SOL to elSOL"));else{let S=T-Ta;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await aE(_.RPC_URL,E_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await Gn(_.RPC_URL);if(s<1){let S=await nt(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await a_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await Yn(_.RPC_URL,n,e,s,R_,bt),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await nt(_.RPC_URL)).epoch} \u{1F4B0}
6520
+ Validator Address: ${M(E)}
6463
6521
  Total Reward: ${s} elSOL
6464
- 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===
6522
+ Harvest Address: ${e}`;await a_(r)}console.log(fE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),d.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await $n(_)&&(na("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(fE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),sa=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await ia.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:_t}]);return await u({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as Ua}from"@skeet-framework/utils";import{writeFile as Sa}from"fs/promises";var ra=t(async _=>{await Sa(Ve,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),M_=ra;var Ra=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await M_({...e,isLessThan1Day:!0})},"isLessThan1Day"),jn=Ra;var aa=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await M_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),zn=aa;var Ca=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await M_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),Zn=Ca;var ca=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 M_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6465
6523
  Validator: ${T}
6466
6524
  Network: ${e.NETWORK}
6467
6525
  CurrentEpoch: ${_.epoch}
6468
6526
  Epoch has been updated!
6469
- 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
6470
- Please top up your Validator Account
6471
- 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(`
6472
- `),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 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 a=n.totalMinutes,R=[qn,Qn,xn];for(let N of R)if(await N(a,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.
6527
+ Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),_T=ca;import{existsAsync as da}from"@skeet-framework/utils";import{readFile as Na,writeFile as Oa}from"fs/promises";import la from"chalk";import{homedir as Fa}from"os";var Ia=t(async()=>{let e=Fa().includes("/home/solv")?Ve:"./currentEpoch.json";if(await da(e))return JSON.parse(await Na(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await Oa(e,JSON.stringify(E,null,2),"utf-8"),console.log(la.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),eT=Ia;async function Da(_="@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(Da,"getNpmLatestVersion");var ET=Da;async function Pa(){let _=J_(),e=await ET();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(Pa,"isVersionSame");var tT=Pa;import{spawnSync as Aa}from"child_process";import{spawnSync as fa}from"node:child_process";var oT=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=fa(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6528
+ `),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,O=a[2]?parseInt(a[2]):0,I=a[3]?parseInt(a[3]):0,l=a[4]?parseInt(a[4]):0,F=R*24*60+O*60+I+Math.floor(l/60);return{epoch:s,day:R,hour:O,min:I,sec:l,totalMinutes:F,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var La=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?be:_.RPC_URL,o=Ua(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await eT(),n=oT(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=L(),r=await ae(E,M(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await tT()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),Aa("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await _T(n,_),"Epoch has been updated!";let a=n.totalMinutes,R=[Zn,zn,jn];for(let O of R)if(await O(a,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),iT=La;var nT=t(_=>{d.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await iT(_),process.exit(0)})},"epochTimerCommands");import IT from"inquirer";import{join as rT}from"path";import{spawnSync as ee}from"node:child_process";import z from"chalk";import{spawnSync as Ma}from"node:child_process";var ua=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=Ma(`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.
6473
6529
  $ ssh solv@${_}
6474
6530
 
6475
- 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.
6531
+ 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"),UE=ua;import TT from"chalk";var pa=t((_,e,E)=>{console.log(TT.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=M(_).trim(),i=UE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(TT.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6476
6532
  Please check your Validator
6477
6533
  $ ssh ${E}@${e}
6478
6534
 
6479
6535
  Local Identity Key: ${o}
6480
- 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),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
6536
+ Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Z_=pa;var ma="agave-validator -l /mnt/ledger",ha="sudo fdctl",Ba="--config /home/solv/firedancer/config.toml ",ga=t(_=>_==="agave"?[ma,""]:[ha,Ba],"getSolanaCLIActive"),_e=ga;var sT="agave-validator -l /mnt/ledger",ya=t(()=>{try{return sT}catch(_){return console.error(_),sT}},"getSolanaCLIAgave"),AE=ya;import Tt from"chalk";var LE=t(async(_,e)=>{try{console.log(Tt.white("\u{1F50D} Detecting client type from remote configuration..."));let E=UE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:N.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case N.AGAVE:n="agave";break;case N.FRANKENDANCER:n="frankendancer";break;case N.JITO:n="agave";break;default:n="agave"}return console.log(Tt.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(Tt.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:N.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as Ka}from"fs/promises";import st from"chalk";import{existsSync as Ga}from"fs";var ME=t(async()=>{try{console.log(st.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!Ga(_))return{client:"agave",validatorType:N.AGAVE,success:!1,error:"Local configuration file not found"};let e=await Ka(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case N.AGAVE:i="agave";break;case N.FRANKENDANCER:i="frankendancer";break;case N.JITO:i="agave";break;default:i="agave"}return console.log(st.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(st.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:N.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var uE=rT(g,m_),ST=rT(g,p_),RT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?h:V;T&&(s=h);let S=await ME(),r=await LE(_,o),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(z.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,O]=_e(C),[I,l]=_e(a),F=AE();if(!Z_(s,_,o))return;if(i){console.log(z.white("\u{1F7E2} Waiting for restart window..."));let ne=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${F} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(ee(ne,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6481
6537
  $ ssh ${o}@${_}
6482
6538
 
6483
- 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
6539
+ Failed Cmd: ${F} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(z.white("\u{1F7E2} Setting identity on the remote validator..."));let A=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${l}${uE}'`;if(ee(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6484
6540
  $ ssh ${o}@${_}
6485
6541
 
6486
- 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
6542
+ Failed Cmd: ${I} set-identity ${l}${uE}`));return}if(console.log(z.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ee(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${uE} ${ST}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6487
6543
  $ ssh ${o}@${_}
6488
6544
 
6489
- 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
6545
+ Failed Cmd: ln -sf ${uE} ${ST}`));return}if(console.log(z.white("\u{1F7E2} Uploading the tower file to the new validator...")),ee(`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
6490
6546
  $ ssh ${o}@${_}
6491
6547
 
6492
- 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
6548
+ Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(z.white("\u{1F7E2} Setting identity on the local validator...")),ee(`${R} set-identity ${O}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6493
6549
 
6494
- Failed Cmd: ${R} set-identity ${N}${s}
6495
- 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
6550
+ Failed Cmd: ${R} set-identity ${O}${s}
6551
+ ln -sf ${s} ${f}`));return}if(ee(`ln -sf ${s} ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6496
6552
 
6497
- 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),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 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
6553
+ Failed Cmd: ln -sf ${s} ${f}`));return}console.log(z.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as cT}from"path";import J from"chalk";import{spawnSync as Ee}from"node:child_process";var aT=cT(g,m_),ka=cT(g,p_),CT="~/.ssh/id_rsa",dT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?h:V;T&&(s=h);let S=await ME(),r=await LE(_,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,O]=_e(C),[I,l]=_e(a),F=AE();if(!Z_(s,_,o))return;let A=`${F} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Q=`${R} set-identity ${O}${aT}`,c_=`ln -sf ${aT} ${ka}`,u_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,d_=`${I} set-identity ${l}--require-tower ${s}`,ie=`ln -sf ${s} ${f}`;if(i&&(console.log(J.white("\u{1F7E2} Waiting for restart window...")),Ee(A,{shell:!0,stdio:"inherit"}).status!==0)){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6498
6554
 
6499
- 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
6555
+ Failed Cmd: ${A}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),Ee(Q,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6500
6556
 
6501
- 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
6557
+ Failed Cmd: ${Q}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ee(c_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6502
6558
 
6503
- 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
6559
+ Failed Cmd: ${c_}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ee(u_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6504
6560
 
6505
- 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
6561
+ Failed Cmd: ${u_}`));return}console.log(J.white("\u{1F7E2} Setting identity on the new validator..."));let GT=`ssh -i ${CT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${d_}'`;Ee(GT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6506
6562
  $ ssh ${o}@${_}
6507
6563
 
6508
- 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
6564
+ Failed Cmd: ${d_}`)),console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let kT=`ssh -i ${CT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${ie}'`;if(Ee(kT,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6509
6565
 
6510
- 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,C=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
6566
+ Failed Cmd: ${ie}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as Va}from"node:child_process";function NT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return Va(E,{shell:!0,stdio:"inherit"}).status===0}t(NT,"checkSSHConnection");import ue from"chalk";import{join as lT}from"path";import{spawnSync as te}from"node:child_process";import e_ from"chalk";var pE=lT(g,m_),OT=lT(g,p_),FT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?h:V;if(T&&(s=h),!Z_(s,_,o))return;let r=ct,C=dt;if(i){console.log(e_.white("\u{1F7E2} Waiting for restart window..."));let K=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(te(K,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6511
6567
  $ ssh ${o}@${_}
6512
6568
 
6513
- 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 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(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6569
+ Failed Cmd: ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(e_.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 ${pE}'`;if(te(a,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6514
6570
  $ ssh ${o}@${_}
6515
6571
 
6516
- 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
6572
+ Failed Cmd: ${r} -l ${P} set-identity ${pE}`));return}if(console.log(e_.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),te(`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(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6517
6573
  $ ssh ${o}@${_}
6518
6574
 
6519
- 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
6575
+ Failed Cmd: ln -sf ${pE} ${OT}`));return}if(console.log(e_.white("\u{1F7E2} Uploading the tower file to the new validator...")),te(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6520
6576
  $ ssh ${o}@${_}
6521
6577
 
6522
- 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_(`${C} -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
6578
+ Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(e_.white("\u{1F7E2} Setting identity on the new validator...")),te(`${C} -l ${P} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6523
6579
 
6524
6580
  Failed Cmd: ${C} -l ${P} set-identity ${s}
6525
- 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
6581
+ ln -sf ${s} ${f}`));return}if(te(`ln -sf ${s} ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6526
6582
 
6527
- 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,C=E.ip;if(r===""||C===""||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,C=R.ip,s=R.user}if(!kC.includes(r)){console.log(Ie.yellow(`\u26A0\uFE0F Invalid Switch Type
6528
- You can choose only Incoming or Outgoing`));return}if(!RT(C,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(C,S,e,s,n);return}await nT(C,S,e,s,n)}else await rT(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 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
6529
- `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
6530
- `)),process.exit(0));let R_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6583
+ Failed Cmd: ln -sf ${s} ${f}`));return}console.log(e_.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var ba=["Incoming","Outgoing"],DT=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?h:V;i&&(T=h);let s=E.user,S=M(T),r=E.switchType,C=E.ip;if(r===""||C===""||s===""){let R=await IT.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(!ba.includes(r)){console.log(ue.yellow(`\u26A0\uFE0F Invalid Switch Type
6584
+ You can choose only Incoming or Outgoing`));return}if(!NT(C,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await IT.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(ue.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ue.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await FT(C,S,e,s,n);return}await RT(C,S,e,s,n)}else await dT(C,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(ue.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ue.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as wa}from"node:child_process";var va=t((_="306450862",e=P,E=n_)=>{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=wa(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"),PT=va;import oe from"inquirer";import Xa from"dotenv";import G_ from"chalk";var mE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:BE,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}},St={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Be,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:ge,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:BE,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 Ja}from"fs/promises";import{Connection as xa,Keypair as Qa,VersionedTransaction as qa}from"@solana/web3.js";import x from"chalk";import $a from"inquirer";import Wa from"dotenv";var Ha=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=Ha;var Ya=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=Pt[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"),UT=Ya;Wa.config();var AT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new xa(_,"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
6585
+ `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(Te+`
6586
+ `)),process.exit(0));let d_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6531
6587
 
6532
6588
  You can upgrade your API key to increase your rate limits.
6533
6589
  Get Your API key \u{1F447}
6534
- Validators Solutions: ${_e}
6535
- `;console.error(x.white(R_)),process.exit(0)}let C=tt[i],a=tt[n],R=`\u{1F504} Swap Quote \u{1F504}
6590
+ Validators Solutions: ${Te}
6591
+ `;console.error(x.white(d_)),process.exit(0)}let C=St[i],a=St[n],R=`\u{1F504} Swap Quote \u{1F504}
6536
6592
 
6537
6593
  - \u{1F3E6} Input Token: ${C.symbol} (${i})
6538
6594
  - \u{1F4B0} Input Amount: ${T/Math.pow(10,C.decimal)} ${C.symbol}
@@ -6543,14 +6599,14 @@ Validators Solutions: ${_e}
6543
6599
  \u203B This quote is based on the current market rate and may change before the swap is completed.
6544
6600
  `;console.log(x.white(R)),console.log(x.gray(`You can also swap using the following command:
6545
6601
  $ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
6546
- `));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
6547
- `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
6548
- `)),process.exit(0));let R_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6602
+ `));let O=!1;s?O=(await $a.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(x.cyan("Skipping confirmation...")),O=!0),O||(console.log(x.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await Ja(o,"utf8")),l=Qa.fromSecretKey(new Uint8Array(Array.from(I))),F=await UT(e,E,r,l.publicKey.toString());if(typeof F=="string"){F.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6603
+ `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(Te+`
6604
+ `)),process.exit(0));let d_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6549
6605
 
6550
6606
  You can upgrade your API key to increase your rate limits.
6551
6607
  Get Your API key \u{1F447}
6552
- Validators Solutions: ${_e}
6553
- `;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...
6554
- 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"],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(L=>L!==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: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,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!
6555
- `)),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};
6608
+ Validators Solutions: ${Te}
6609
+ `;console.error(x.white(d_)),process.exit(0)}let K=Buffer.from(F.swapTransaction,"base64"),A=qa.deserialize(K);A.sign([l]);let Q=A.serialize(),c_=await S.sendRawTransaction(Q,{skipPreflight:!0,maxRetries:2}),u_=A.message.recentBlockhash;return console.log(`Swapping...
6610
+ Transaction ID: ${c_}`),await S.confirmTransaction({blockhash:u_,lastValidBlockHeight:F.lastValidBlockHeight,signature:c_},"confirmed"),c_},"swap");Xa.config();var LT=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 ja(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(G_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(G_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),ja=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(G_.white("Solana RPC URL:",_)),console.log(G_.white("KeyfilePath:",e)),(!e||e===""||s)&&await za();let S=Ft,r=[...It,"Other"],C=o,a="",R=i,O=n;if(C===""){let F=await oe.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Be}]);F.name==="Other"?C=(await oe.prompt([{type:"input",name:"address",message:"Enter input mint address",default:ge}])).address:(a=F.name,C=mE[a].tokenMint)}if(R===""){r=r.filter(A=>A!==a);let F=await oe.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(F.name==="Other")R=(await oe.prompt([{type:"input",name:"address",message:"Enter output mint address",default:R_}])).address;else{let A=F.name;R=mE[A].tokenMint}let K=F.name;R=mE[K].tokenMint}if(O===0){let F=await oe.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);O=Number(F.amount)}let l=await AT(_,S,!E||E===""?Dt:E,e,C,R,O,T);l||process.exit(0),console.log(G_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(G_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${l}`))},"swapCmd");var za=t(async()=>{let _=await oe.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(G_.green(`\u2714\uFE0E Config Updated Successfully!
6611
+ `)),g_()},"askForConfig");import{spawnSync as Za}from"node:child_process";var MT=t(()=>{Za("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as _C}from"node:child_process";var uT=t(()=>{_C("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as eC}from"node:child_process";var pT=t(()=>{eC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as EC}from"node:child_process";var mT=t(()=>{EC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as tC}from"node:child_process";var hT=t((_=!1)=>{tC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as oC}from"node:child_process";var BT=t(()=>{oC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var gT=t(()=>{let _=d.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{MT()}),_.command("start").description("Start Jupiter").action(()=>{uT()}),_.command("stop").description("Stop Jupiter").action(()=>{pT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{hT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{mT()}),_.command("enable").description("Enable Jupiter").action(()=>{BT()})},"jupiterCommands");import sC from"chalk";import{spawnSync as iC}from"node:child_process";var nC=t(()=>{let{stdout:_}=iC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),yT=nC;var d=new TC;d.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(pe,"-V","Display version");async function SC(){try{let _=await k();Di(_),Ai(_),fi(_),vi(_),Co(_),No(),Mi(_),nn(_),rn(_),wi(),mi(),li(_),mo(_),ui(),On(),An(_),un(_),Xn(_),Ii(),LT(d,_),nT(_),DT(d,_),gT(),In(_),d.command("rm:log").description("Remove Logs").action(()=>{NE()}),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(sC.white("\u{1F4DD} Creating Snapshot...")),PT(e.slot,e.ledger,e.snapshots)}),d.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Pn(_)}),d.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{fn()}),d.command("config").description("Show Solv Config").action(()=>{dE(_)}),d.command("vv").description("Show Solv Version").action(()=>{let e=yT();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(SC,"main");SC();export{d as program};
6556
6612
  //# sourceMappingURL=index.js.map