@gabrielhicks/solv 5.4.8 → 5.4.10

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,13 +1,14 @@
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.8";var nt={name:"@gabrielhicks/solv",version:it,description:"Solana Validator CLI SOLV",main:"dist/index.js",type:"module",repository:"https://github.com/gabrielhicks/solv",keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",bin:{solv:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var De=nt.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",Tt="relayer-keypair.json",yT="mainnet-validator-keypair.json",GT="mainnet-vote-account-keypair.json",kT="mainnet-authority-keypair.json",VT="testnet-validator-keypair.json",bT="testnet-vote-account-keypair.json",wT="testnet-authority-keypair.json",g="/home/solv",M=`${g}/${U_}`,da=`${g}/${A_}`,b=`${g}/${yT}`,fe=`${g}/${GT}`,Na=`${g}/${kT}`,K=`${g}/${VT}`,Ue=`${g}/${bT}`,Oa=`${g}/${wT}`,j=`${g}/solana-validator.log`,t_=g+"/start-validator.sh",P="/mnt/ledger",g_="/mnt/accounts",o_="/mnt/snapshots",st="solana-validator",St="agave-validator",rt="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ae=3,Rt="https://api.testnet.solana.com",Ct="https://api.mainnet-beta.solana.com",at="https://verify.validators.solutions/solv-migrate",ct="https://jup.validators.solutions/v1/jup",AE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(AE||(AE={}));var dt=Object.values(AE),Le="So11111111111111111111111111111111111111112",Me="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",LE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Nt="SOLV420",Ot={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as YT}from"child_process";var i_="3.0.10",w="3.0.10",ee="3.0.10",L_="3.0.10",Ft="3.0.10",M_="3.0.10";var lt="20.17.0",K_="0.713.30008",y_="0.713.30008";import{spawnSync as B}from"node:child_process";var vT=t((_=w,e=!1,E=!1)=>{E?e?(B(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave-mod rev-parse HEAD) /tmp/v${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(B(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave rev-parse HEAD) /tmp/v${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?B(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):B(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),G_=vT;var It="agave-validator",HT=t(()=>{try{return It}catch(_){return console.error(_),It}},"getSolanaCLI"),n_=HT;var ue=t(async(_,e=!1,E=!1)=>{G_(_,e,E)},"updateVersion"),pe=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),YT(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import so from"chalk";var u_;(function(_){_.EN="en",_.JA="ja"})(u_||(u_={}));var Dt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Dt||(Dt={}));var Pt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(Pt||(Pt={}));var O_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(O_||(O_={}));var ft;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(ft||(ft={}));var Ut;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Ut||(Ut={}));var At;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(At||(At={}));var Lt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Lt||(Lt={}));var me;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(me||(me={}));var he;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(he||(he={}));var pt=!0,mt=!1,ht=!0,Bt=!1,q={ID:"solv",LANG:u_.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"3.0.10",MAINNET_SOLANA_VERSION:"3.0.10",NODE_VERSION:"20.17.0",TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,SOLANA_NETWORK:"testnet",SOLV_TYPE:0,DISK_TYPES:1,IS_SETUP:!1,LANG_SETUP:!1,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:"ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG",IS_CLIENT:!1,VALIDATOR_IPS:[],MAINNET_TYPE:"SolanaClient",LEDGER_PATH:"/mnt/ledger",STAKE_ACCOUNT:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:"https://mainnet-beta.solana.com",KEYPAIR_PATH:"/home/solv/testnet-validator-keypair.json",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1},v={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},f={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},T_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},m={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",SOL_SYSTEM_CONFIG21:"/etc/sysctl.d/21-solana-validator.conf",SOL_NOFILES_CONF:"/etc/security/limits.d/90-solana-nofiles.conf",SOL_SYSTEM_CONF:"/etc/systemd/system.conf",SOLANA_PATH:"/home/solv/.local/share/solana/install"},h={MAINNET_VALIDATOR_KEY:"mainnet-validator-keypair.json",MAINNET_VALIDATOR_VOTE_KEY:"mainnet-vote-account-keypair.json",MAINNET_VALITATOR_AUTHORITY_KEY:"mainnet-authority-keypair.json",TESTNET_VALIDATOR_KEY:"testnet-validator-keypair.json",TESTNET_VALIDATOR_VOTE_KEY:"testnet-vote-account-keypair.json",TESTNET_VALITATOR_AUTHORITY_KEY:"testnet-authority-keypair.json"},U=t((_=v.ROOT)=>{let e=_===v.ROOT?v.ROOT:_,E=`${e}/${h.MAINNET_VALIDATOR_KEY}`,o=`${e}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${h.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${h.TESTNET_VALIDATOR_KEY}`,T=`${e}/${h.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${h.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),F_=t((_=!0)=>{let e=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_KEY}`,E=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_VOTE_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${v.ROOT}/${T_.LOG}`,i=f.ACCOUNTS,n=f.LEDGER,T=f.SNAPSHOTS,s=`${v.ROOT}/${T_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var e_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ME="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",gt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Kt=9,s_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",yt="So11111111111111111111111111111111111111112",Gt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",kt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Mt;(function(_){_[_.ELSOL=s_]="ELSOL",_[_.SOL=yt]="SOL",_[_.USDC=Gt]="USDC",_[_.EPCT=kt]="EPCT"})(Mt||(Mt={}));var ut;(function(_){_.V6_BASE_URL="https://quote-api.jup.ag/v6",_.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",_.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(ut||(ut={}));var Ka={[yt]:9,[s_]:9,[Gt]:6,[kt]:6},Be="/home/solv/currentEpoch.json",uE=.5,ge="https://api.testnet.solana.com";import{spawnSync as pE}from"child_process";var Vt=t(()=>{pE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=q.NODE_VERSION;pE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),pE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var C_={version:"2.3.10",tag:"v2.3.10",commissionBps:0,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",shredReceiverAddr:"64.130.50.14:1002"},Ee={TESTNET:{Dallas:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.testnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.35.224:1002"}},MAINNET:{Amsterdam:{BLOCK_ENGINE_URL:"https://amsterdam.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://amsterdam.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"74.118.140.240:1002"},London:{BLOCK_ENGINE_URL:"https://london.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://london.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"142.91.127.175:1002"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.50.14:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.216.96:1002"},Tokyo:{BLOCK_ENGINE_URL:"https://tokyo.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://tokyo.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.9.160:1002"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://slc.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://slc.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.53.8:1002"},Singapore:{BLOCK_ENGINE_URL:"https://singapore.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://singapore.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.11.224:1002"}}};import{spawnSync as H}from"child_process";var Ke=t((_=C_.tag,e=!1,E=!1)=>{H("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),H("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(H(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),H(`CI_COMMIT=$(git -C /tmp/${_}-jito rev-parse HEAD) /tmp/${_}-jito/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-jito`,{shell:!0,stdio:"inherit"}),H("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),H(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),H(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):H(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as JT,writeFile as xT}from"fs/promises";import{homedir as QT}from"os";var te=t(async _=>{let E=`${QT()}/${T_.JITO_CONFIG}`,i={...JSON.parse(await JT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await xT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as bt}from"child_process";import qT from"inquirer";var wt=t((_,e=!0)=>{let E=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",o=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";bt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;bt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),vt=t(async()=>await qT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as oe}from"@skeet-framework/utils";import $T from"chalk";import WT from"inquirer";var Ht=t(async()=>{let _=await WT.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await oe("sudo ufw delete allow 8899/udp"),await oe("sudo ufw delete allow 8899/tcp"),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await oe("sudo ufw reload"),console.log($T.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var XT=t(()=>it,"getSolvVersion"),k_=XT;import{readFile as ZT,writeFile as _s}from"fs/promises";import{existsAsync as es}from"@skeet-framework/utils";var mE;(function(_){_.EN="en",_.JA="ja"})(mE||(mE={}));var sc=Object.values(mE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var Yt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Jt=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.NONE="none"})(F||(F={}));var Sc=Object.values(F).filter(_=>_!=="none"),V;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(V||(V={}));var xt=Object.values(V).filter(_=>_!=="none"),$;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})($||($={}));var zT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:$.TRIPLE,TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w,NODE_VERSION:lt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:rt,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ct,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:g_,SNAPSHOTS_PATH:o_,MOD:!1},a_=zT;import{homedir as Es}from"os";var ts=t(async()=>{let e=`${Es()}/${Pe}`;return await es(e)?JSON.parse(await ZT(e,"utf-8")):(console.log("Creating default config file at",e),await _s(e,JSON.stringify(a_,null,2)),a_)},"readConfig"),k=ts;import os from"node-fetch";var z=t(async _=>{try{let e=await k();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
- Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await os(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(E),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${_}`}),!1}},"sendDiscord");import{spawnSync as Ss}from"child_process";import{Connection as Qt}from"@solana/web3.js";var ie=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new Qt("https://api.testnet.solana.com"):new Qt(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(C=>C.votePubkey===e);if(!s)return T.delinquent.find(R=>R.votePubkey===e)?(i.isActive=!1,i.reason="Validator is delinquent.",i):(i.isActive=!1,i.reason="Validator is not found in both current and delinquent lists.",i);if(T=await n.getVoteAccounts(),s=T.current.find(C=>C.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,a=await n.getSlot()-S;return a>o?(i.isActive=!1,i.reason=`Validator has not voted for ${a} slots.`,i):(i.isActive=!0,i.reason="Validator is active and voting.",i)}catch(n){return console.error(n),i.isActive=!1,i.reason="Failed to check validator status.",i}},"isValidatorActive");import{spawnSync as is}from"child_process";var A=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=is(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ns=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),Y=ns;import{sendDiscord as Ts}from"@skeet-framework/utils";var qt=30,ss=t(async _=>{try{let e=_.NETWORK===c.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=U(),n=A(e?o:E),T=await ie(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=qt){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${qt} minutes!
2
+ var 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!
4
4
  Account: ${T.pubkey}
5
5
  Reason: ${T.reason}
6
6
  Message: Max retries reached, exiting catchup check...
7
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Ts(S),!1}console.log("Waiting for validator to catch up..."),await Y(60*1e3),T=await ie(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),$t=ss;var rs=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=U(),n=e?o:i,T=!1;E?T=e?ht:Bt:T=e?pt:mt,T=T&&_.AUTO_RESTART;let s=A(n),S=`**${s}** updated solv to **${k_()}**`;if(await z(S),T){let r=Math.floor(Date.now()/1e3),a=`Restarting **${s}**
8
- at: <t:${r}:> (${r})
9
- _ _`;await z(a);try{Ss("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(N){let I=`Error restarting **${s}**: ${N?.message||"Unknown error"}`;return await z(I),!1}let C=`**${s}** has restarted, catching up...`;await z(C),await Y(180*1e3);let R=await $t(_);if(R){let I=Math.floor(Date.now()/1e3)-r,O=Math.floor(I/60),l=I%60,G=O>0?`${O}m ${l}s`:`${l}s`,L=`**${s}** has caught up!
10
- at: <t:${r}:> (${r})
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await 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...
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!
11
+ at: <t:${C}> (${C})
11
12
  **${s}** took **${G}** to catch up after restart!
12
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
13
14
  index a0c631ee9f..048b118660 100644
@@ -5794,7 +5795,7 @@ index 479e0f1829..a97f5778d4 100644
5794
5795
 
5795
5796
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5796
5797
  at the NOTICE level to the logger. E.g. for a typical fd_log
5797
- `;return{filePath:_,body:e}},"modDiff"),ve=Ms;var To=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?K_:y_),n=E||_.MOD,{filePath:T,body:s}=ve();y("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await no.mkdir(us.dirname(T),{recursive:!0}),await no.writeFile(T,s,"utf8"),y(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),y("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as ps}from"node:child_process";var So=t(_=>{let e=_.NETWORK===c.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===F.JITO,i=_.VALIDATOR_TYPE===F.FRANKENDANCER,n=_.AUTO_RESTART,T=_.MOD,s=10;n&&!e&&(s=30);let S=e?i_:w;o&&(S=L_,e&&(S=ee)),i&&(S=y_,e&&(S=K_)),E&&(S=M_,o&&(S=Ft)),d.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${S}`,S).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).option("--mod","Modified Versions",!1).action(async r=>{let a=k_(),C=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(so.white(`Current solv version: ${a}`)),r.auto){await Wt(_);return}if(r.migrateConfig){let R=io().config,N=$.TRIPLE;R.DISK_TYPES===0?N=$.DOUBLE:R.DISK_TYPES===1?N=$.SINGLE:N=$.TRIPLE;let I=R.SOLANA_NETWORK===O_.TESTNET,O=R.SOLV_TYPE===me.RPC_NODE,l=R.MAINNET_TYPE===he.JITO_MEV,G={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:N,RPC_TYPE:O?V.JITO:V.NONE,VALIDATOR_TYPE:l?F.JITO:I?F.AGAVE:F.SOLANA,TESTNET_SOLANA_VERSION:R.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:R.MAINNET_SOLANA_VERSION,NODE_VERSION:R.NODE_VERSION,TESTNET_DELINQUENT_STAKE:R.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:R.MAINNET_DELINQUENT_STAKE,COMMISSION:R.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:R.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:R.STAKE_ACCOUNT,HARVEST_ACCOUNT:R.HARVEST_ACCOUNT,IS_MEV_MODE:R.IS_MEV_MODE,RPC_URL:R.RPC_URL,KEYPAIR_PATH:R.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:R.DISCORD_WEBHOOK_URL,AUTO_UPDATE:R.AUTO_UPDATE,AUTO_RESTART:R.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:R.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await u(G)}if(r.config){if(await u({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){let R=e?ee:L_;await te({version:R,tag:`v${R}`})}console.log(so.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(r.firewall){await Ht();return}if(r.background){let R=r.version,N=!!R.startsWith("3");if(await u({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){Ke(`v${R}`,r.mod||T,N),await te({version:R,tag:`v${R}`}),await pe(C,!0,s);return}if(i){await To(_,R,r.mod||T),await pe(C,!0,s);return}await ue(R,r.mod||T,N);let I=e?10:5;e&&ps("solv start",{stdio:"inherit",shell:!0}),await pe(I,!0,s);return}else if(r.commission){let R=await vt();wt(R.commission,e)}else Vt()})},"updateCommands");import{spawnSync as ms}from"node:child_process";var ro=t(_=>{try{let{log:e}=F_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=ms(E,{shell:!0,stdio:"inherit"});if(o.error)throw o.error;o.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):o.status!==0&&(console.error(`Child process exited with code ${o.status}`),process.exit(o.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Ro=t(()=>{d.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(_=>{ro(_)})},"logCommands");import d_ from"chalk";import{spawnSync as hs}from"child_process";import{homedir as Bs}from"os";var He=t(_=>{let e=Bs(),E=U(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=O_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=O_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=O_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;hs(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ye}from"child_process";import{existsSync as Co,readdirSync as gs,rmSync as Ks}from"fs";import{homedir as ys}from"os";import ao from"path";var Je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[h.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[h.TESTNET_VALIDATOR_KEY,h.TESTNET_VALITATOR_AUTHORITY_KEY,h.TESTNET_VALIDATOR_VOTE_KEY,h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Ye(o,{shell:!0,stdio:"ignore"});let i=gs("./").filter(S=>S.endsWith("SV.json")),n=ys(),T=ao.join(n,"unstaked-identity.json");Co(T)&&Ye(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=ao.join(n,e[s]);if(s++,Co(r)){console.log(`${r} is already exist!`),Ks(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;Ye(a,{shell:!0,stdio:"inherit"})}Ye("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as No}from"child_process";var Gs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5798
+ `;return{filePath:_,body:e}},"modDiff"),ve=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
5799
  Description=Jupiter API Service Instance
5799
5800
  After=network.target
5800
5801
 
@@ -6025,13 +6026,13 @@ exec agave-validator \\
6025
6026
  --maximum-full-snapshots-to-retain 1 \\
6026
6027
  --maximum-incremental-snapshots-to-retain 4 \\
6027
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(`
6028
- `).slice(1),E=[],o=e.map(O=>O.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let O of e){let[l,G,L]=O.trim().split(/\s+/);if(!l||!G)continue;let Q=parseInt(G,10);if(isNaN(Q))continue;let r_=L!==void 0&&L!=="";L==="/"&&(S=l.replace(/p?\d*$/,""));let f_=o.some(Z_=>Z_!==l&&Z_.startsWith(l)),z_=l.startsWith("nvme")?"NVMe":"SATA";Q>=400*1024*1024*1024&&E.push({name:l,size:Q,mountpoint:L||"",isMounted:r_,hasPartition:f_,type:z_})}console.log("Found root disk name: ",S);let r=o.filter(O=>O.startsWith(S));r.forEach(O=>console.log("Found root disk partition: ",O));let C=E.filter(O=>!r.includes(O.name)).sort((O,l)=>l.size-O.size),R=C.filter(O=>O.type==="NVMe").sort((O,l)=>l.size-O.size),N=C.filter(O=>O.type==="SATA").sort((O,l)=>l.size-O.size),I=[...R,...N];if(I.length>0){let O=I[0];if(O.size>=850*1024*1024*1024&&!O.isMounted&&(i=!0),O.size>=1250*1024*1024*1024&&O.isMounted&&(T=!0),I.length>1){let l=I[1];l.size>=400*1024*1024*1024&&!l.isMounted&&(n=!0)}if(I.length>2){let l=I[2];l.size>=400*1024*1024*1024&&!l.isMounted&&(s=!0)}}return I.forEach((O,l)=>console.log(`Prioritized Disk ${l+1}: ${O.name} ${O.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(oS,"getPreferredDisks");var re=oS;import{spawnSync as b_}from"child_process";var l_=t(_=>{if(b_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return b_(E,{shell:!0,stdio:"inherit"}),b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Qe}from"child_process";async function yE(_){for(let e=1;e<=5;e++){let o=Qe(`sudo blkid -s UUID -o value ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(o)return console.log(`[SUCCESS] Found UUID for ${_}: ${o}`),`UUID=${o}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${_}`),await Y(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(yE,"getUUID");var Re=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await yE(_),T=await yE(e),s=await yE(E),S=`${n} ${f.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
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
6029
6030
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6030
6031
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0
6031
- ${s} ${f.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],C=Qe("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let N of r)C.includes(N)||(console.log(`[INFO] Line to add: ${N}`),R.push(N));if(R.length){console.log(`[INFO] Lines to add all: ${R}`);let N=`echo "${R.join(`
6032
+ ${s} ${f.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],a=Qe("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let N of r)a.includes(N)||(console.log(`[INFO] Line to add: ${N}`),R.push(N));if(R.length){console.log(`[INFO] Lines to add all: ${R}`);let N=`echo "${R.join(`
6032
6033
  `)}" | sudo tee -a /etc/fstab`;Qe(N,{shell:!0,encoding:"utf8"}),Qe("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6033
6034
  ${R.join(`
6034
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as iS}from"child_process";var go=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=iS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var nS=t(async()=>{let _=re(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await u({MNT_DISK_TYPE:$.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=l_(E),T=l_(o),s=l_(i),S=n?E:"",r=T?o:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await Y(5e3),await Re(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await u({MNT_DISK_TYPE:$.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=l_(E),n=l_(o);await Re(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await u({MNT_DISK_TYPE:$.SINGLE}),e.includes("/mnt")){go(e);let E="/dev/"+_.disks[0].name;l_(E),await Re(E)}else{let E="/dev/"+_.disks[0].name;l_(E),await Re(E)}},"mountDirs"),Ko=nS;import{spawnSync as TS}from"child_process";var yo=t(()=>{let _=[`sudo mkdir -p ${f.ROOT}`,`sudo chown -R solv:solv ${f.ROOT}`,`sudo chmod -R 755 ${f.ROOT}`,`sudo mkdir -p ${f.ACCOUNTS}`,`sudo chown -R solv:solv ${f.ACCOUNTS}`,`sudo chmod -R 755 ${f.ACCOUNTS}`,`sudo mkdir -p ${f.LEDGER}`,`sudo chown -R solv:solv ${f.LEDGER}`,`sudo chmod -R 755 ${f.LEDGER}`,`sudo mkdir -p ${f.SNAPSHOTS}`,`sudo chown -R solv:solv ${f.SNAPSHOTS}`,`sudo chmod -R 755 ${f.SNAPSHOTS}`];for(let e of _)TS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as qe}from"child_process";import{existsSync as sS}from"fs";function Go(){if(!sS(m.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6035
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as 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 _=`
6035
6036
  # Increase UDP buffer sizes
6036
6037
  net.core.rmem_default = 134217728
6037
6038
  net.core.rmem_max = 134217728
@@ -6317,7 +6318,7 @@ Restart=always
6317
6318
 
6318
6319
  [Install]
6319
6320
  WantedBy=multi-user.target
6320
- `}),"portRelayService"),ei=uS;var mS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?K_:y_,{filePath:i,body:n}=ve();_?(p('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),p('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await bE.mkdir(pS.dirname(i),{recursive:!0}),await bE.writeFile(i,n,"utf8"),p(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),p(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),p("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await c_(),{filePath:s,body:S}=zo();p(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),p(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Zo();p(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=ei();p("sudo apt install socat",{shell:!0,stdio:"inherit"}),p("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),p(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),p("sudo systemctl daemon-reload",{shell:!0});let C=_i(E,T);await bE.writeFile(C.filePath,C.body,"utf-8"),console.log(`config.toml written to ${C.filePath}`),p(`sudo chown solv:solv "${C.filePath}"`,{shell:!0,stdio:"inherit"}),w_(!0)},"setupFiredancer"),ze=mS;var ti=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(Ei.white("\u{1F7E2} Initializing Setup")),await k(),await Io());let i=await k(),n=i.NETWORK===c.TESTNET;switch(Bo(),(!e||!E)&&await Ko(),vo(n),$o(),Jo(),await qo(),Ho(i),jo(i.IS_DUMMY,n),i=await k(),i.NODE_TYPE){case D.RPC:await fo(i);break;case D.VALIDATOR:await po(i,o),i.VALIDATOR_TYPE===F.FRANKENDANCER&&await ze(o,i);break;default:throw new Error("Unknown Node Type")}E||yo(),ne(),i.VALIDATOR_TYPE!==F.FRANKENDANCER&&(E||(i=await k(),Wo(),$e(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),E||We(i),console.log(Ei.white("\u{1F7E2} Setup Completed")),p_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var oi=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6321
+ `}),"portRelayService"),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
6321
6322
  [Unit]
6322
6323
  Description=Solana transaction relayer
6323
6324
  Requires=network-online.target
@@ -6371,7 +6372,7 @@ WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateServi
6371
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
6372
6373
 
6373
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(`
6374
- `).slice(1).filter(i=>i.split(/\s+/)[0]!=="").map(i=>{let n=i.split(/\s+/);return{Filesystem:n[0],Size:n[1],Used:n[2],Avail:n[3],Use:n[4],MountedOn:n[5]}}).sort((i,n)=>m_(n.Avail)-m_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&m_(i.Size)>9e11-1&&console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: red")}),o?console.log("your mount point is correct"):E.filter(n=>n.Filesystem.startsWith("/dev/")&&m_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Ri from"chalk";import bS from"cli-table3";var HE=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Ri.blue(o)),E=new bS({head:e,colWidths:[20,10,10,10,10,20]});_.forEach(o=>{E.push([o.Filesystem,o.Size,o.Used,o.Avail,o.Use,o.MountedOn].map(i=>Ri.white(i)))}),console.log(E.toString())},"displayTable");var Ci=t(async()=>{d.command("df").description("Disk Free Command").action(()=>{let _=vE();HE(_)})},"dfCommands"),m_=t(_=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},E=_.match(/[A-Za-z]+/)?.[0]||"",o=parseFloat(_);return e[E]?o*e[E]:o},"convertToBytes");var ai=t(_=>{d.command("start").description("Start Solana Validator").action(()=>{We(_),process.exit(0)})},"startCommand");import{spawnSync as wS}from"node:child_process";import vS from"chalk";var ci=t(async _=>{vS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];wS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var di=t(_=>{d.command("stop").description("Stop Solana Validator").action(()=>{ci(_),process.exit(0)})},"stopCommand");import{spawnSync as Ce}from"node:child_process";import Ni from"chalk";var Oi=t(_=>{let e=n_();d.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===c.TESTNET,n=o&&i?10:30;E.rm&&(console.log(Ni.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ce("solv stop",{stdio:"inherit",shell:!0}),Ce("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ce("solv get snapshot",{stdio:"inherit",shell:!0}),Ce("solv start",{stdio:"inherit",shell:!0}),console.log(Ni.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let T=`${e} --ledger ${_.LEDGER_PATH} exit --max-delinquent-stake ${_.MAINNET_DELINQUENT_STAKE} --min-idle-time ${n}`;Ce(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Fi=t(_=>{let E=_.NETWORK===c.TESTNET?i_:w;_.NODE_TYPE===D.RPC&&(E=M_),d.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${E}`,E).option("-m, --mod <version>","Use modified installer",!1).action(async o=>{let i=_.VALIDATOR_TYPE===F.JITO,n=o.mod||_.MOD;if(i){let S=o.version||L_,r=`v${S}`,a=!!S.startsWith("3");Ke(r,n,a);return}_.NODE_TYPE===D.RPC&&(E=M_);let s=o.version||E;await ue(s,n)})},"installCommands");import{spawnSync as HS}from"child_process";var li=t(()=>{d.command("mtr").description("Mount Reload Command").action(()=>{HS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),d.command("disks").description("Show unmounted disks").action(()=>{let _=re();console.log(_)})},"mountCommands");import{spawnSync as xS}from"node:child_process";import Ii from"chalk";import{spawnSync as YS}from"child_process";var JS=t(async()=>{try{let _=YS("crontab",["-l"],{encoding:"utf-8"});if(_.status!==0)return console.log("No crontab for this user."),!1;let e=_.stdout;return console.log(e),e.includes("solv epochTimer")}catch(_){return console.error("Error reading crontab:",_),!1}},"hasEpochTimer"),_E=JS;var Di=t(()=>{d.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await _E()&&(console.log(Ii.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let o=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;xS(o,{shell:!0,stdio:"inherit"}),console.log(Ii.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ae={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as qS,mkdirSync as $S}from"fs";import WS from"inquirer";import{homedir as XS}from"os";import{spawnSync as QS}from"node:child_process";function Pi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return QS(i,{shell:!0,stdio:"inherit"}).status===0}t(Pi,"executeSCP");var YE=t(async(_="")=>{let e=_;_===""&&(e=(await WS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(U()),o=XS(),i=o.includes("/home/solv")?"/home/solv":o+ae.SOLV_KEYPAIR_DOWNLOAD_PATH;qS(i)||$S(i,{recursive:!0});let n=!0,T=o+"/"+Tt;E.push(T);for(let s of E){let S=s.split("/"),r=S[S.length-1];r=o.includes("/home/solv")?r:r.replace(".json",`-${e}.json`);let a=`${i}/${r}`;Pi(e,s,a,n)&&console.log(`Successfully Exported - ${a} \u{1F389}`)}},"download");import{spawnSync as jS}from"child_process";import{existsSync as zS}from"fs";import ZS from"inquirer";import _r from"os";var fi=t(async(_="")=>{let e=_r.userInfo().homedir,E=_;_===""&&(E=(await ZS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${ae.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=ae.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(U(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let S=`${o}/${s}`;if(!zS(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;jS(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as er}from"child_process";import Er from"inquirer";var Ui=t(async()=>{let _=await Er.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${v.ROOT}/.ssh && echo "${_.pubkey}" >> ${v.AUTHORIZED_KEYS}`;er(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import eE from"chalk";import{readFileSync as tr}from"fs";import or from"os";var Ai=t(()=>{try{let e=`${or.userInfo().homedir}/.ssh/id_rsa.pub`,E=tr(e,"utf8");console.log(eE.white(`Your SSH Public Key is:
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:
6375
6376
  `)),console.log(eE.white(E))}catch(_){console.error(eE.white(`Error reading SSH Public Key
6376
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(`
6377
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.
@@ -6390,13 +6391,13 @@ Token Mint: ${n.mint}`;return(await wi.prompt([{type:"confirm",name:"confirm",me
6390
6391
  Is this the correct Stake Pool?`}])).confirm?n:(console.log(ce.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6391
6392
  Please check the correct address and try again.
6392
6393
  `)),console.log(ce.white(`For stake pool information
6393
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as xr}from"fs/promises";import Oe from"inquirer";import{existsAsync as Qr}from"@skeet-framework/utils";import{Connection as Qi,Keypair as wr,PublicKey as Ne}from"@solana/web3.js";import{Connection as gr,PublicKey as Kr,Keypair as yr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Gr}from"@solana/spl-token";var de=t(async(_,e,E,o,i=!1)=>{try{let n=yr.fromSecretKey(new Uint8Array(e)),T=new Kr(E),s=new gr(_);return(await Gr(s,n,T,o,i)).address.toBase58()}catch(n){throw console.log("Error in getOrCreateDestinationAddress",n),new Error(JSON.stringify(n))}},"getOrCreateDestinationAddress");import{Spinner as vr}from"cli-spinner";import h_ from"chalk";import{PublicKey as Yi,Keypair as Ji,Transaction as Hi,ComputeBudgetProgram as kr,LAMPORTS_PER_SOL as Vr}from"@solana/web3.js";import*as xi from"@solana/spl-stake-pool";var v_=t(async(_,e,E,o=new Yi(e_),i,n,T)=>{try{let s=Ji.fromSecretKey(new Uint8Array(e)),S=E*Vr,{instructions:r,signers:a}=await br(_,e,S,o,i,n,T),C=new Hi().add(...r);C.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});C.recentBlockhash=R.value.blockhash,C.sign(...a,s);let N=new Hi().add(...r).add(kr.setComputeUnitPrice({microLamports:1e3}));N.feePayer=s.publicKey,N.recentBlockhash=R.value.blockhash,N.sign(...a,s);let I=await _.sendRawTransaction(N.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...R.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),br=t(async(_,e,E,o=new Yi(e_),i,n,T)=>{let S=Ji.fromSecretKey(new Uint8Array(e)).publicKey;return await xi.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as qi}from"@skeet-framework/utils";var nE=t(async(_,e,E,o)=>{console.log(h_.white("Solana RPC URL:",_));let i=new Qi(_);E===0&&(E=await TE());let n=new vr("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(h_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new Ne(e),s=wr.fromSecretKey(new Uint8Array(o)),S=s_;n.setSpinnerTitle(h_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await de(_,o,S,s.publicKey);await qi(1e3),n.setSpinnerTitle(h_.green("\u{1F504} Converting SOL to elSOL"));let a=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey),C=0;for(;a.status!=="success";){if(C++,C>10)return n.stop(!0),console.log(h_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(h_.yellow(`\u23F3 ${C} Times Retrying...`)),await qi(3e3),i=new Qi(_),a=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey)}return n.stop(!0),console.log(h_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6394
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as 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
6394
6395
 
6395
- Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as Hr,Keypair as Yr,PublicKey as H_}from"@solana/web3.js";import{Spinner as Jr}from"cli-spinner";import Y_ from"chalk";import{sleep as $i}from"@skeet-framework/utils";var Wi=t(async(_,e,E,o,i)=>{let n=new Hr(_);E===0&&(E=await TE());let T=new Jr("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(Y_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new H_(e),S=await iE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(Y_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,a=Yr.fromSecretKey(new Uint8Array(o)),C=await de(_,o,r,a.publicKey),R=await de(_,o,r,new H_(gt),!0);await $i(1e3),T.setSpinnerTitle(Y_.green(`\u{1F504} Converting SOL to ${i}`));let N=await v_(n,o,E,s,new H_(C),new H_(R),a.publicKey),I=0;for(;N.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(Y_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Y_.yellow(`\u23F3 ${I} Times Retrying...
6396
- `)),await $i(1e3),N=await v_(n,o,E,s,new H_(C),new H_(R),a.publicKey)}return T.stop(!0),console.log(Y_.white(`\u{1F4B0} You've got ${i} \u2728
6396
+ Signature:`,C.signature)),!0},"elSOLdeposit");import{Connection as 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
6397
6398
 
6398
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:
6399
- `)),console.log(J_.white(T));return}let s=JSON.parse(await xr(T,"utf-8"));if(e.elsol){await nE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await vi(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await Wi(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await Gi(_))return;let r=await k(),{validatorVoteAccount:a,stakeAccounts:C}=await Wr(r);for await(let R of C)try{await gi(R,a)}catch{console.log(J_.yellow(`Network might be busy, please try again later
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
6400
6401
  You can use a custom RPC endpoint to avoid this issue
6401
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
6402
6403
  You can use a custom RPC endpoint to avoid this issue
@@ -6440,13 +6441,13 @@ Address: ${e.validatorKeyAddress}
6440
6441
  Balance: ${e.validatorKeyBalance}
6441
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
6442
6443
  This Feature is Currently Under Development
6443
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await AR(),n="0";try{let C=QE(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(C.status!==0)throw new Error("Invalid Wallet Address");n=C.stdout.toString(),console.log("toBalance:",n)}catch{console.log(Fe.red(`\u274C To Wallet is Invalid
6444
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await 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
6444
6445
  Please Check the Wallet Address`)),process.exit(0)}let T=CE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(Fe.white(`\u{1F3E6} From Wallet: ${o}
6445
6446
  \u{1F4B0} Balance: ${T}`)),console.log(Fe.white(`\u{1F3E6} To Wallet: ${i}
6446
- \u{1F4B0} Balance: ${n}`));let{amount:s}=await RE.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),S=`solana transfer ${i} ${s} --allow-unfunded-recipient --keypair ${E} --url ${_.RPC_URL}`,r=QE(S,{shell:!0,stdio:"inherit"}),a=Ae;for(;r.status!==0&&a>0;)console.log(Fe.red(`\u274C Transaction Failed
6447
+ \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
6447
6448
  Retrying Transaction in ${Fn}ms
6448
- Retries Left: ${a}`)),await Y(Fn),r=QE(S,{shell:!0,stdio:"inherit"}),a--;process.exit(0)})},"transferCommands"),$E=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),AR=t(async()=>{let _=fR(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=CE(`solana address -k ${o}`).toString().trim(),n=await RE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:UR}]),T=n.from==="Validator Account"?Object.values(aE).filter(C=>C!=="Validator Account"):Object.values(aE).filter(C=>C!=="Authority Account");if((await RE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:C}=await RE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:$E}]);i=C}else{let C=n.from==="Validator Account"?e:E;o=`${_}/${C}`,i=CE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,a=CE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:a,toAddress:i}},"selectFromKeypairs");import In from"chalk";import LR from"inquirer";import{execSync as WE,spawnSync as MR}from"node:child_process";var Dn=t(async(_,e=!1)=>{let E=_.NETWORK===c.TESTNET,o=E?ge:_.RPC_URL,i=E?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",n=E?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",T=E?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",s=WE(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(In.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(In.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let N=await LR.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(N.sol)}let a=WE(`solana address --keypair ${T}`).toString().trim(),C=WE(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${a} ${C} ${S} --authorized-withdrawer ${n} --url ${o}`;MR(R,{shell:!0,stdio:"inherit"})},"withdraw");var Pn=t(_=>{d.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await Dn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as wR,spawnSync as vR}from"node:child_process";import{BN as Un}from"bn.js";import{LAMPORTS_PER_SOL as XE}from"@solana/web3.js";import{Connection as hR,LAMPORTS_PER_SOL as BR}from"@solana/web3.js";import{Keypair as uR}from"@solana/web3.js";import{readFile as pR}from"fs/promises";var mR=t(async _=>{let e=JSON.parse(await pR(_,"utf8"));return uR.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),fn=mR;import{homedir as gR}from"os";var Z;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(Z||(Z={}));var KR={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},yR=t(async(_,e="auth",E=!1)=>{let o=new hR(_),i=gR(),n=U(i),s=`${E?"testnet":"mainnet"}${KR[e]}`,S=n[s],r=await fn(S),a=await o.getBalance(r.publicKey),R=Number(a)/BR;if(isNaN(R))throw new Error("Failed to get balance");return R},"getBalance"),S_=yR;var GR=new Un(3*XE),An=t(async _=>{let e=await S_(_,Z.VALIDATOR),o=new Un(Number(Number(e)*XE)).sub(GR),i=Number(o)/XE;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import le from"chalk";import{Keypair as kR,Connection as VR,PublicKey as bR,SystemProgram as Ln,ComputeBudgetProgram as cE,VersionedTransaction as Mn,TransactionMessage as un}from"@solana/web3.js";var pn=t(async(_,e,E,o)=>{let i=0;try{let n=new VR(_,"finalized"),T=kR.fromSecretKey(new Uint8Array(Array.from(e))),s=new bR(E),S=o;for(;;)try{let r=[Ln.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:2e5}),cE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],a=await n.getLatestBlockhashAndContext({commitment:"finalized"}),C=new Mn(new un({instructions:r,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(C,{replaceRecentBlockhash:!0,sigVerify:!1});C.sign([T]);let N=[Ln.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:R.value.unitsConsumed?Math.trunc(R.value.unitsConsumed*1.2):2e5}),cE.setComputeUnitPrice({microLamports:1e3})],I=new Mn(new un({instructions:N,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message());I.sign([T]);let O=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...a.value,signature:O},"finalized"),console.log("finalized signature:",O),O}catch(r){if(i++,i>Ae)throw new Error(JSON.stringify(r));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${r}`),await Y(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as HR}from"fs/promises";import{LAMPORTS_PER_SOL as YR}from"@solana/web3.js";var jE=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=U();await S_(_,Z.VOTE)<1?(console.log(le.white("Vote Account Balance is less than 1 SOL")),console.log(le.white("Skip withdrawing SOL from Vote Account to Authority Account"))):vR("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await An(_);console.log(le.white(`Transferable Balance: ${i} SOL`));let n=i*YR;if(i<1)console.log(le.white("Validator Account Balance is less than 1 SOL")),console.log(le.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=wR(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await HR(E,"utf-8"));await pn(_,s,T,n)}return!0},"collectSOL");import{readFile as _C}from"fs/promises";import eC from"inquirer";import zE from"chalk";import{execSync as JR}from"child_process";import{homedir as xR}from"os";var QR=t(async _=>{try{let e=xR(),{mainnetValidatorAuthorityKey:E}=U(e),o=`spl-token balance ${s_} --owner ${E} --url ${_}`,i=JR(o).toString().trim();return Number(i)}catch(e){return console.log(zE.red(`Error: ${e}`)),console.log(zE.yellow(`You might need to install the Solana SPL CLI:
6449
- `)),console.log(zE.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),mn=QR;import OE from"chalk";import{Connection as qR,PublicKey as hn,Keypair as $R,ComputeBudgetProgram as dE,VersionedTransaction as Bn,TransactionMessage as gn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Kn,createTransferInstruction as yn,TOKEN_PROGRAM_ID as Gn}from"@solana/spl-token";var kn=t(async(_,e,E,o,i,n)=>{try{let T=new qR(_,"finalized"),s=$R.fromSecretKey(new Uint8Array(e)),S=new hn(E),r=new hn(i),a=Math.trunc(o*Math.pow(10,n)),C=await Kn(T,s,r,s.publicKey),R=await Kn(T,s,r,S,!0);for(;;)try{let N=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:2e5}),dE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),O=new Bn(new gn({instructions:N,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),l=await T.simulateTransaction(O,{replaceRecentBlockhash:!0,sigVerify:!1});O.sign([s]);let G=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:l.value.unitsConsumed?Math.trunc(l.value.unitsConsumed*1.2):2e5}),dE.setComputeUnitPrice({microLamports:1e3})],L=new Bn(new gn({instructions:G,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());L.sign([s]);let Q=await T.sendRawTransaction(L.serialize());return await T.confirmTransaction({...I.value,signature:Q},"finalized"),console.log("finalized signature:",Q),Q}catch(N){console.error("Transfer failed, retrying...",N)}}catch(T){throw console.error(T),T}},"transferSPLToken");import NE from"inquirer";import{spawnSync as Vn}from"child_process";import ZE from"chalk";import{promises as bn}from"fs";var WR=t(async(_="epochTimer")=>{try{let e=Vn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(ZE.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
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(`
6450
6451
  `).filter(n=>!n.includes(_)).join(`
6451
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
6452
6453
  ${vn.green("No more Login to the server to update \u{1F331}")}
@@ -6457,7 +6458,7 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
6457
6458
 
6458
6459
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
6459
6460
  \u203B Please turn off if you are using no-downtime migration.
6460
- `;console.log(vn.white(o));let i=await NE.prompt([{type:"confirm",name:"autoUpdate",message:"Do you want to enable AUTO UPDATE? (Recommended)",default:!1},{type:"confirm",name:"autoRestart",message:"Do you want to enable AUTO RESTART?",default:!1}]),n=_.RPC_URL,T="",s=await NE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await NE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await u({HARVEST_ACCOUNT:T,IS_MEV_MODE:E.mevOn,RPC_URL:n,DISCORD_WEBHOOK_URL:s.discordWebhookUrl,AUTO_UPDATE:i.autoUpdate,AUTO_RESTART:i.autoRestart}),!0},"mevOn"),Hn=XR;import{spawnSync as EC}from"node:child_process";import{Connection as ZR}from"@solana/web3.js";import{Connection as jR}from"@solana/web3.js";var zR=t(async(_,e=10,E=.4)=>{try{let i=await new jR(_).getRecentPerformanceSamples(e);if(i.length===0)return console.warn("No performance samples available. Using fallback slot time."),E;let n=i.filter(s=>s.numSlots!==0);return n.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),E):n.reduce((s,S)=>s+S.samplePeriodSecs/S.numSlots,0)/n.length}catch(o){return console.error(`getAverageSlotTime failed: ${o}. Using fallback slot time.`),E}},"getAverageSlotTime"),Yn=zR;var _t=t(async _=>{try{let E=await new ZR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await Yn(_);console.log("timePerSlotSeconds",o);let n=(E.slotsInEpoch-E.slotIndex)*o,T=(E.slotIndex/E.slotsInEpoch*100).toFixed(2),s=Math.floor(n/(3600*24)),S=Math.floor(n%(3600*24)/3600),r=Math.floor(n%3600/60),a=Math.floor(n%60),C=`${s}d ${S}h ${r}m ${a}s`;return s===0&&(C=`${S}h ${r}m ${a}s`),{...E,estimatedTimeUntilNextEpoch:C,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var tC=.03,Jn=t(_=>{d.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await oC(_),{mainnetValidatorAuthorityKey:E}=U();console.log("Harvesting SOL..."),await jE(_.RPC_URL);let o=await S_(_.RPC_URL,Z.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await Y(1e3),await jE(_.RPC_URL),o=await S_(_.RPC_URL,Z.VOTE),i++;let n=JSON.parse(await _C(E,"utf-8")),T=await S_(_.RPC_URL,Z.AUTH);if(T<1)console.log(OE.white("Authority Account Balance is less than 1 SOL")),console.log(OE.white("Skip converting SOL to elSOL"));else{let S=T-tC;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await nE(_.RPC_URL,e_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await mn(_.RPC_URL);if(s<1){let S=await _t(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await z(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await kn(_.RPC_URL,n,e,s,s_,Kt),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await _t(_.RPC_URL)).epoch} \u{1F4B0}
6461
+ `;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}
6461
6462
  Validator Address: ${A(E)}
6462
6463
  Total Reward: ${s} elSOL
6463
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===
@@ -6468,7 +6469,7 @@ Epoch has been updated!
6468
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
6469
6470
  Please top up your Validator Account
6470
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(`
6471
- `),n=i.find(R=>R.includes("Epoch Completed Time:")),T=i.find(R=>R.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(R=>R.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let a=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,C=r.match(a);if(C){let R=C[1]?parseInt(C[1]):0,N=C[2]?parseInt(C[2]):0,I=C[3]?parseInt(C[3]):0,O=C[4]?parseInt(C[4]):0,l=R*24*60+N*60+I+Math.floor(O/60);return{epoch:s,day:R,hour:N,min:I,sec:O,totalMinutes:l,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var UC=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?ge:_.RPC_URL,o=PC(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await Wn(),n=Zn(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=U(),r=await ie(E,A(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),await Xn(_),!await zn()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),fC("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await $n(n,_),"Epoch has been updated!";let C=n.totalMinutes,R=[qn,Qn,xn];for(let N of R)if(await N(C,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),_T=UC;var eT=t(_=>{d.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await _T(_),process.exit(0)})},"epochTimerCommands");import dT from"inquirer";import{join as iT}from"path";import{spawnSync as $_}from"node:child_process";import X from"chalk";import{spawnSync as AC}from"node:child_process";var LC=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=AC(`ssh -i ${i} -o StrictHostKeyChecking=no solv@${_} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:o});return T.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
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.
6472
6473
  $ ssh solv@${_}
6473
6474
 
6474
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.
@@ -6476,7 +6477,7 @@ Please check your Validator
6476
6477
  $ ssh ${E}@${e}
6477
6478
 
6478
6479
  Local Identity Key: ${o}
6479
- Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Q_=MC;var uC="agave-validator -l /mnt/ledger",pC="sudo fdctl",mC="--config /home/solv/firedancer/config.toml ",hC=t(_=>_==="agave"?[uC,""]:[pC,mC],"getSolanaCLIActive"),q_=hC;var tT="agave-validator -l /mnt/ledger",BC=t(()=>{try{return tT}catch(_){return console.error(_),tT}},"getSolanaCLIAgave"),lE=BC;import et from"chalk";var IE=t(async(_,e)=>{try{console.log(et.white("\u{1F50D} Detecting client type from remote configuration..."));let E=FE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case F.AGAVE:n="agave";break;case F.FRANKENDANCER:n="frankendancer";break;case F.JITO:n="agave";break;default:n="agave"}return console.log(et.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(et.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as gC}from"fs/promises";import Et from"chalk";import{existsSync as KC}from"fs";var DE=t(async()=>{try{console.log(Et.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!KC(_))return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Local configuration file not found"};let e=await gC(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case F.AGAVE:i="agave";break;case F.FRANKENDANCER:i="frankendancer";break;case F.JITO:i="agave";break;default:i="agave"}return console.log(Et.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(Et.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var PE=iT(g,A_),oT=iT(g,U_),nT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),a=S.success?S.client:"agave",C=r.success?r.client:"agave";console.log(X.green(`\u2705 Local client: ${a}, Remote client: ${C}`));let[R,N]=q_(a),[I,O]=q_(C),l=lE();if(!Q_(s,_,o))return;if(i){console.log(X.white("\u{1F7E2} Waiting for restart window..."));let Z_=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if($_(Z_,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
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
6480
6481
  $ ssh ${o}@${_}
6481
6482
 
6482
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
@@ -6493,7 +6494,7 @@ Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(
6493
6494
  Failed Cmd: ${R} set-identity ${N}${s}
6494
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
6495
6496
 
6496
- Failed Cmd: ln -sf ${s} ${M}`));return}console.log(X.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as ST}from"path";import J from"chalk";import{spawnSync as W_}from"node:child_process";var TT=ST(g,A_),yC=ST(g,U_),sT="~/.ssh/id_rsa",rT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),a=S.success?S.client:"agave",C=r.success?r.client:"agave";console.log(J.green(`\u2705 Local client: ${a}, Remote client: ${C}`));let[R,N]=q_(a),[I,O]=q_(C),l=lE();if(!Q_(s,_,o))return;let L=`${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Q=`${R} set-identity ${N}${TT}`,r_=`ln -sf ${TT} ${yC}`,f_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,R_=`${I} set-identity ${O}--require-tower ${s}`,z_=`ln -sf ${s} ${M}`;if(i&&(console.log(J.white("\u{1F7E2} Waiting for restart window...")),W_(L,{shell:!0,stdio:"inherit"}).status!==0)){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
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
6497
6498
 
6498
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
6499
6500
 
@@ -6506,10 +6507,10 @@ $ ssh ${o}@${_}
6506
6507
 
6507
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
6508
6509
 
6509
- Failed Cmd: ${z_}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as GC}from"node:child_process";function RT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return GC(E,{shell:!0,stdio:"inherit"}).status===0}t(RT,"checkSSHConnection");import Ie from"chalk";import{join as aT}from"path";import{spawnSync as X_}from"node:child_process";import __ from"chalk";var fE=aT(g,A_),CT=aT(g,U_),cT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;if(T&&(s=K),!Q_(s,_,o))return;let r=st,a=St;if(i){console.log(__.white("\u{1F7E2} Waiting for restart window..."));let G=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(X_(G,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
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
6510
6511
  $ ssh ${o}@${_}
6511
6512
 
6512
- Failed Cmd: ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(__.white("\u{1F7E2} Setting identity on the new validator..."));let C=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} set-identity ${fE}'`;if(X_(C,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
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
6513
6514
  $ ssh ${o}@${_}
6514
6515
 
6515
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
@@ -6518,26 +6519,26 @@ $ ssh ${o}@${_}
6518
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
6519
6520
  $ ssh ${o}@${_}
6520
6521
 
6521
- Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(__.white("\u{1F7E2} Setting identity on the new validator...")),X_(`${a} -l ${P} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
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
6522
6523
 
6523
- Failed Cmd: ${a} -l ${P} set-identity ${s}
6524
+ Failed Cmd: ${C} -l ${P} set-identity ${s}
6524
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
6525
6526
 
6526
- Failed Cmd: ln -sf ${s} ${M}`));return}console.log(__.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var kC=["Incoming","Outgoing"],NT=t(async(_,e)=>{_.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).option("--user <user>","SSH User","solv").option("--unsafe","Switch without waiting for a restart window",!1).description("Switch Validator Identity with No Downtime").action(async E=>{try{let o=e.NETWORK===c.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?K:b;i&&(T=K);let s=E.user,S=A(T),r=E.switchType,a=E.ip;if(r===""||a===""||s===""){let R=await dT.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}},{name:"user",type:"list",message:"Which user would you want to SSH as?",choices:["solv"]}]);r=R.switchType,a=R.ip,s=R.user}if(!kC.includes(r)){console.log(Ie.yellow(`\u26A0\uFE0F Invalid Switch Type
6527
- You can choose only Incoming or Outgoing`));return}if(!RT(a,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await dT.prompt([{name:"confirm",type:"confirm",message:"Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1."}])).confirm||(console.log(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Ie.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await cT(a,S,e,s,n);return}await nT(a,S,e,s,n)}else await rT(a,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ie.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as VC}from"node:child_process";var bC=t((_="306450862",e=P,E=o_)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${E} --hard-fork ${_} -- ${_} ${e}`;console.log("Parameters to createSnapshot:",_,e,E),console.log("Command:",o);let i=VC(o,{shell:!0,stdio:"pipe",cwd:e});if(i.status!==0)throw new Error(`createSnapshot: ${i.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),OT=bC;import j_ from"inquirer";import $C from"dotenv";import B_ from"chalk";var UE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:LE,associationAccount:"",decimal:9},JitoSOL:{tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSOL:{tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSOL:{tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},EPCT:{tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUP:{tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},BONK:{tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},JTO:{tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}},tt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Le,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Me,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:LE,associationAccount:"",decimal:9},J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:{symbol:"jitoSOL",tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:{symbol:"mSOL",tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:{symbol:"bSOL",tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:{symbol:"EPCT",tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:{symbol:"JUP",tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:{symbol:"BONK",tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:{symbol:"JTO",tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}};import{readFile as HC}from"fs/promises";import{Connection as YC,Keypair as JC,VersionedTransaction as xC}from"@solana/web3.js";import x from"chalk";import QC from"inquirer";import qC from"dotenv";var wC=t(async(_,e,E,o,i)=>{try{let n=`${_}/quote?inputMint=${E}&outputMint=${o}&amount=${i}`,T=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return T.status===429?"Too many requests, please try again later":T.status===401?"Unauthorized, please check your API key":await T.json()}catch(n){throw new Error(`Error getJupiterQuote: ${n}`)}},"getJupiterQuote"),FT=wC;var vC=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=Ot[i];T?n={swapRequest:{quoteResponse:E,userPublicKey:o,feeAccount:T,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:n={swapRequest:{quoteResponse:E,userPublicKey:o,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let s=`${_}/swap`,S=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(n.swapRequest)});return S.status===429?"Too many requests, please try again later":await S.json()}catch(i){throw new Error(`Error postJupiterSwap: ${i}`)}},"postJupiterSwap"),lT=vC;qC.config();var IT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new YC(_,"confirmed"),r=await FT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
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
6528
6529
  `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
6529
6530
  `)),process.exit(0));let R_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6530
6531
 
6531
6532
  You can upgrade your API key to increase your rate limits.
6532
6533
  Get Your API key \u{1F447}
6533
6534
  Validators Solutions: ${_e}
6534
- `;console.error(x.white(R_)),process.exit(0)}let a=tt[i],C=tt[n],R=`\u{1F504} Swap Quote \u{1F504}
6535
+ `;console.error(x.white(R_)),process.exit(0)}let C=tt[i],a=tt[n],R=`\u{1F504} Swap Quote \u{1F504}
6535
6536
 
6536
- - \u{1F3E6} Input Token: ${a.symbol} (${i})
6537
- - \u{1F4B0} Input Amount: ${T/Math.pow(10,a.decimal)} ${a.symbol}
6537
+ - \u{1F3E6} Input Token: ${C.symbol} (${i})
6538
+ - \u{1F4B0} Input Amount: ${T/Math.pow(10,C.decimal)} ${C.symbol}
6538
6539
 
6539
- - \u{1F3E6} Output Token: ${C.symbol} (${n})
6540
- - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,C.decimal)} ${C.symbol}
6540
+ - \u{1F3E6} Output Token: ${a.symbol} (${n})
6541
+ - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,a.decimal)} ${a.symbol}
6541
6542
 
6542
6543
  \u203B This quote is based on the current market rate and may change before the swap is completed.
6543
6544
  `;console.log(x.white(R)),console.log(x.gray(`You can also swap using the following command:
@@ -6550,6 +6551,6 @@ You can upgrade your API key to increase your rate limits.
6550
6551
  Get Your API key \u{1F447}
6551
6552
  Validators Solutions: ${_e}
6552
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...
6553
- Transaction ID: ${r_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:r_},"confirmed"),r_},"swap");$C.config();var DT=t(async(_,e)=>{_.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async E=>{try{await WC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(B_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(B_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),WC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(B_.white("Solana RPC URL:",_)),console.log(B_.white("KeyfilePath:",e)),(!e||e===""||s)&&await XC();let S=ct,r=[...dt,"Other"],a=o,C="",R=i,N=n;if(a===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?a=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(C=l.name,a=UE[C].tokenMint)}if(R===""){r=r.filter(L=>L!==C);let l=await j_.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(l.name==="Other")R=(await j_.prompt([{type:"input",name:"address",message:"Enter output mint address",default:s_}])).address;else{let L=l.name;R=UE[L].tokenMint}let G=l.name;R=UE[G].tokenMint}if(N===0){let l=await j_.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);N=Number(l.amount)}let O=await IT(_,S,!E||E===""?Nt:E,e,a,R,N,T);O||process.exit(0),console.log(B_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(B_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${O}`))},"swapCmd");var XC=t(async()=>{let _=await j_.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await u(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6554
+ 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!
6554
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};
6555
6556
  //# sourceMappingURL=index.js.map