@gabrielhicks/solv 5.4.6 → 5.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,15 @@
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.6";var nt={name:"@gabrielhicks/solv",version:it,description:"Solana Validator CLI SOLV",main:"dist/index.js",type:"module",repository:"https://github.com/gabrielhicks/solv",keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",bin:{solv:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var De=nt.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",Tt="relayer-keypair.json",yT="mainnet-validator-keypair.json",GT="mainnet-vote-account-keypair.json",kT="mainnet-authority-keypair.json",VT="testnet-validator-keypair.json",bT="testnet-vote-account-keypair.json",wT="testnet-authority-keypair.json",g="/home/solv",L=`${g}/${U_}`,da=`${g}/${A_}`,b=`${g}/${yT}`,fe=`${g}/${GT}`,Na=`${g}/${kT}`,K=`${g}/${VT}`,Ue=`${g}/${bT}`,Oa=`${g}/${wT}`,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=!1,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"),G=ts;import os from"node-fetch";var z=t(async _=>{try{let e=await G();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
2
+ var gT=Object.defineProperty;var t=(_,e)=>gT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as ia}from"commander";var it="5.4.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
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!
4
4
  Account: ${T.pubkey}
5
5
  Reason: ${T.reason}
6
6
  Message: Max retries reached, exiting catchup check...
7
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Ts(S),!1}console.log("Waiting for validator to catch up..."),await Y(60*1e3),T=await ie(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),$t=ss;var rs=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=U(),n=e?o:i,T=!1;E?T=e?ht:Bt:T=e?pt:mt,T=T&&_.AUTO_RESTART;let s=A(n),S=`**${s}** updated solv to **${k_()}**`;if(await z(S),T){let r=`Restarting **${s}**`;await z(r);try{Ss("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(R){let N=`Error restarting **${s}**: ${R?.message||"Unknown error"}`;return await z(N),!1}let a=`**${s}** has restarted, catching up...`;await z(a),await Y(180*1e3);let C=await $t(_);if(C){let R=`**${s}** has caught up!`;await z(R)}else{let R=`**${s}** failed to catch up after update`;await z(R)}return C}return!0},"autoUpdate"),Wt=rs;import{homedir as Rs}from"os";import{readFile as Cs,writeFile as Xt}from"fs/promises";import{existsAsync as as}from"@skeet-framework/utils";var M=t(async _=>{let E=`${Rs()}/${Pe}`;await as(E)||(console.log("Creating default config file at",E),await Xt(E,JSON.stringify(a_,null,2)));let i={...JSON.parse(await Cs(E,"utf8")),..._},n=JSON.stringify(i,null,2);await Xt(E,n)},"updateDefaultConfig");var cs={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solv commands",subcmdHelp:"Display help for subcommands",server:"Open solv Dashboard",start:"Start Solana Validator",stop:"Stop Solana Validator",status:"Show Solana Validator Status",restart:"Restart Solana Validator",update:"Update Solana Validator Version",get:"Get Solana Validator Info Commands",log:"Tail Solana Validator Log",catchup:"Catchup Solana Validator",monitor:"Monitor Solana Validator",config:"Show Solana Validator Config",install:"Install/Update Solana Version",stake:"Solana Delegate Stake",check:"Check Solana Validator",scp:"Download/Upload Solana Validator Keypairs",cron:"Run Schedule Tasks",setup:"Setup Solana Validator",epoch:"Show Current Epoch",slot:"Show Current Slot",solv:"Endroll Solv AA",installer:"Please select an option:",unstake:"UnStake"},ye=cs;var ds={description:"\u{1F48E} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30AA\u30FC\u30EB\u30A4\u30F3\u30EF\u30F3 CLI \u30C4\u30FC\u30EB \u{1F48E}",version:"\u73FE\u5728\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B",help:"solv \u30B3\u30DE\u30F3\u30C9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u8A73\u7D30\u3092\u8868\u793A",subcmdHelp:"\u30B5\u30D6\u30B3\u30DE\u30F3\u30C9\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A",server:"solv \u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u3092\u958B\u304F",start:"\u30CE\u30FC\u30C9\u3092\u8D77\u52D5",stop:"\u30CE\u30FC\u30C9\u3092\u505C\u6B62",status:"\u30CE\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u8868\u793A",restart:"\u30CE\u30FC\u30C9\u3092\u518D\u8D77\u52D5",update:"\u30CE\u30FC\u30C9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0",get:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u60C5\u5831\u3092\u53D6\u5F97 \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",log:"\u30CE\u30FC\u30C9\u306E\u30ED\u30B0\u3092\u8868\u793A",catchup:"\u30CE\u30FC\u30C9\u3092\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7",monitor:"\u30CE\u30FC\u30C9\u3092\u76E3\u8996",config:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u3092\u8868\u793A",install:"\u30BD\u30E9\u30CA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",stake:"\u30BD\u30E9\u30CA\u306E\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",unstake:"\u30BD\u30E9\u30CA\u306E\u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",check:"\u30CE\u30FC\u30C9\u306E\u72B6\u614B\u3092\u30C1\u30A7\u30C3\u30AF",scp:"scp \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",cron:"\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30BF\u30B9\u30AF \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",setup:"\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u3092\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7",epoch:"\u73FE\u5728\u306E\u30A8\u30DD\u30C3\u30AF\u3092\u8868\u793A",slot:"\u73FE\u5728\u306E\u30B9\u30ED\u30C3\u30C8\u3092\u8868\u793A",solv:"Solv\u30A8\u30F3\u30C9\u30ED\u30FC\u30EB AA \u3092\u8868\u793A",installer:"\u4EE5\u4E0B\u304B\u3089\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:"},jt=ds;var Ns={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solv installer \u{1F525}",description:"solv is born and ready for running Solana Validator Nodes \u{1F680}"}},Ge=Ns;var Os={success:{created:"\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F"},error:{failed:"\u5931\u6557\u3057\u307E\u3057\u305F"},installer:{welcomeMsg:"\u{1F525} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30C4\u30FC\u30EB solv \u3078\u3088\u3046\u3053\u305D \u{1F525}",description:"\u3042\u306A\u305F\u306F\u3082\u3046\u3001\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306B\u306A\u308B\u6E96\u5099\u304C\u3067\u304D\u3066\u3044\u307E\u3059\u3002"}},zt=Os;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Ve=[[],[") Check Validator Status",") Show Validator Logs",") Start Validator",") Stop Validator",") Restart Validator (no fetch snapshot)",") Restart Validator (fetch snapshot)",") Return to Main Menu"],[") Show Validator Config",") Register Validator Info",") Show Validator Keys Path/Address/Balance",") Get Current Epoch/Slot",") Get Solana Validator Catchup Info",") Get Solana Validator Monitor Info",") Return to Main Menu"],[") Backup Validator Keyfiles",") Set Validator Keyfile/Network",") Return to Main Menu"],[") Stake",") Unstake",") Return to Main Menu"],[],[]];var Zt=[") \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9 - Solana\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8/\u30C0\u30A6\u30F3\u30B0\u30EC\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B/\u30ED\u30B0\u3092\u78BA\u8A8D\u30FB\u307E\u305F\u306F\u958B\u59CB/\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u60C5\u5831",") \u9375\u306E\u8A2D\u5B9A",") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"],_o=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var Fs={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},be=Fs;var ls={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},eo=ls;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Eo=[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u4F5C\u6210",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"];var Is=t(_=>{let e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};switch(_){case u_.EN:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};break;case u_.JA:e={cmds:jt,subCmds:eo,logs:zt,installer:Zt,installerSub:_o,clientCmds:Eo};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),to=Is;import{existsSync as Us,readFileSync as As,writeFileSync as oo}from"fs";import{readFileSync as Ds,writeFileSync as Ps}from"fs";import{homedir as fs}from"os";var V_=t(_=>{let E=`${fs()}/${T_.CONFIG}`,i={...JSON.parse(Ds(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ps(E,n)},"updateSolvConfig");import{homedir as Ls}from"os";var io=t(()=>{let e=`${Ls()}/${T_.CONFIG}`;Us(e)||(oo(e,JSON.stringify(q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(As(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),oo(e,JSON.stringify(q,null,2)),E=q}let o=to(E.LANG);return E.RPC_URL||(E.RPC_URL=q.RPC_URL,V_({RPC_URL:q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,V_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",V_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as 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
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})
11
+ **${s}** took **${G}** to catch up after restart!
12
+ _ _`;await z(L)}else{let N=`**${s}** failed to catch up after update`;await z(N)}return R}return!0},"autoUpdate"),Wt=rs;import{homedir as Rs}from"os";import{readFile as Cs,writeFile as Xt}from"fs/promises";import{existsAsync as as}from"@skeet-framework/utils";var u=t(async _=>{let E=`${Rs()}/${Pe}`;await as(E)||(console.log("Creating default config file at",E),await Xt(E,JSON.stringify(a_,null,2)));let i={...JSON.parse(await Cs(E,"utf8")),..._},n=JSON.stringify(i,null,2);await Xt(E,n)},"updateDefaultConfig");var cs={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solv commands",subcmdHelp:"Display help for subcommands",server:"Open solv Dashboard",start:"Start Solana Validator",stop:"Stop Solana Validator",status:"Show Solana Validator Status",restart:"Restart Solana Validator",update:"Update Solana Validator Version",get:"Get Solana Validator Info Commands",log:"Tail Solana Validator Log",catchup:"Catchup Solana Validator",monitor:"Monitor Solana Validator",config:"Show Solana Validator Config",install:"Install/Update Solana Version",stake:"Solana Delegate Stake",check:"Check Solana Validator",scp:"Download/Upload Solana Validator Keypairs",cron:"Run Schedule Tasks",setup:"Setup Solana Validator",epoch:"Show Current Epoch",slot:"Show Current Slot",solv:"Endroll Solv AA",installer:"Please select an option:",unstake:"UnStake"},ye=cs;var ds={description:"\u{1F48E} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30AA\u30FC\u30EB\u30A4\u30F3\u30EF\u30F3 CLI \u30C4\u30FC\u30EB \u{1F48E}",version:"\u73FE\u5728\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B",help:"solv \u30B3\u30DE\u30F3\u30C9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u8A73\u7D30\u3092\u8868\u793A",subcmdHelp:"\u30B5\u30D6\u30B3\u30DE\u30F3\u30C9\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A",server:"solv \u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u3092\u958B\u304F",start:"\u30CE\u30FC\u30C9\u3092\u8D77\u52D5",stop:"\u30CE\u30FC\u30C9\u3092\u505C\u6B62",status:"\u30CE\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u8868\u793A",restart:"\u30CE\u30FC\u30C9\u3092\u518D\u8D77\u52D5",update:"\u30CE\u30FC\u30C9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0",get:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u60C5\u5831\u3092\u53D6\u5F97 \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",log:"\u30CE\u30FC\u30C9\u306E\u30ED\u30B0\u3092\u8868\u793A",catchup:"\u30CE\u30FC\u30C9\u3092\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7",monitor:"\u30CE\u30FC\u30C9\u3092\u76E3\u8996",config:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u3092\u8868\u793A",install:"\u30BD\u30E9\u30CA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",stake:"\u30BD\u30E9\u30CA\u306E\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",unstake:"\u30BD\u30E9\u30CA\u306E\u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",check:"\u30CE\u30FC\u30C9\u306E\u72B6\u614B\u3092\u30C1\u30A7\u30C3\u30AF",scp:"scp \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",cron:"\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30BF\u30B9\u30AF \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",setup:"\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u3092\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7",epoch:"\u73FE\u5728\u306E\u30A8\u30DD\u30C3\u30AF\u3092\u8868\u793A",slot:"\u73FE\u5728\u306E\u30B9\u30ED\u30C3\u30C8\u3092\u8868\u793A",solv:"Solv\u30A8\u30F3\u30C9\u30ED\u30FC\u30EB AA \u3092\u8868\u793A",installer:"\u4EE5\u4E0B\u304B\u3089\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:"},jt=ds;var Ns={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solv installer \u{1F525}",description:"solv is born and ready for running Solana Validator Nodes \u{1F680}"}},Ge=Ns;var Os={success:{created:"\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F"},error:{failed:"\u5931\u6557\u3057\u307E\u3057\u305F"},installer:{welcomeMsg:"\u{1F525} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30C4\u30FC\u30EB solv \u3078\u3088\u3046\u3053\u305D \u{1F525}",description:"\u3042\u306A\u305F\u306F\u3082\u3046\u3001\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306B\u306A\u308B\u6E96\u5099\u304C\u3067\u304D\u3066\u3044\u307E\u3059\u3002"}},zt=Os;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Ve=[[],[") Check Validator Status",") Show Validator Logs",") Start Validator",") Stop Validator",") Restart Validator (no fetch snapshot)",") Restart Validator (fetch snapshot)",") Return to Main Menu"],[") Show Validator Config",") Register Validator Info",") Show Validator Keys Path/Address/Balance",") Get Current Epoch/Slot",") Get Solana Validator Catchup Info",") Get Solana Validator Monitor Info",") Return to Main Menu"],[") Backup Validator Keyfiles",") Set Validator Keyfile/Network",") Return to Main Menu"],[") Stake",") Unstake",") Return to Main Menu"],[],[]];var Zt=[") \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9 - Solana\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8/\u30C0\u30A6\u30F3\u30B0\u30EC\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B/\u30ED\u30B0\u3092\u78BA\u8A8D\u30FB\u307E\u305F\u306F\u958B\u59CB/\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u60C5\u5831",") \u9375\u306E\u8A2D\u5B9A",") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"],_o=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var Fs={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},be=Fs;var ls={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},eo=ls;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Eo=[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u4F5C\u6210",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"];var Is=t(_=>{let e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};switch(_){case u_.EN:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};break;case u_.JA:e={cmds:jt,subCmds:eo,logs:zt,installer:Zt,installerSub:_o,clientCmds:Eo};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),to=Is;import{existsSync as Us,readFileSync as As,writeFileSync as oo}from"fs";import{readFileSync as Ds,writeFileSync as Ps}from"fs";import{homedir as fs}from"os";var V_=t(_=>{let E=`${fs()}/${T_.CONFIG}`,i={...JSON.parse(Ds(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ps(E,n)},"updateSolvConfig");import{homedir as Ls}from"os";var io=t(()=>{let e=`${Ls()}/${T_.CONFIG}`;Us(e)||(oo(e,JSON.stringify(q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(As(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),oo(e,JSON.stringify(q,null,2)),E=q}let o=to(E.LANG);return E.RPC_URL||(E.RPC_URL=q.RPC_URL,V_({RPC_URL:q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,V_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",V_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as y}from"child_process";import{promises as no}from"fs";import us from"path";var Ms=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
8
13
  index a0c631ee9f..048b118660 100644
9
14
  --- a/book/api/metrics-generated.md
10
15
  +++ b/book/api/metrics-generated.md
@@ -5789,7 +5794,7 @@ index 479e0f1829..a97f5778d4 100644
5789
5794
 
5790
5795
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5791
5796
  at the NOTICE level to the logger. E.g. for a typical fd_log
5792
- `;return{filePath:_,body:e}},"modDiff"),ve=Ms;var To=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?K_:y_),n=E||_.MOD,{filePath:T,body:s}=ve();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,k={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:N,RPC_TYPE:O?V.JITO:V.NONE,VALIDATOR_TYPE:l?F.JITO:I?F.AGAVE:F.SOLANA,TESTNET_SOLANA_VERSION:R.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:R.MAINNET_SOLANA_VERSION,NODE_VERSION:R.NODE_VERSION,TESTNET_DELINQUENT_STAKE:R.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:R.MAINNET_DELINQUENT_STAKE,COMMISSION:R.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:R.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:R.STAKE_ACCOUNT,HARVEST_ACCOUNT:R.HARVEST_ACCOUNT,IS_MEV_MODE:R.IS_MEV_MODE,RPC_URL:R.RPC_URL,KEYPAIR_PATH:R.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:R.DISCORD_WEBHOOK_URL,AUTO_UPDATE:R.AUTO_UPDATE,AUTO_RESTART:R.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:R.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await M(k)}if(r.config){if(await M({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){let R=e?ee:L_;await te({version:R,tag:`v${R}`})}console.log(so.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(r.firewall){await Ht();return}if(r.background){let R=r.version,N=!!R.startsWith("3");if(await M({TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w}),o){Ke(`v${R}`,r.mod||T,N),await te({version:R,tag:`v${R}`}),await pe(C,!0,s);return}if(i){await To(_,R,r.mod||T),await pe(C,!0,s);return}await ue(R,r.mod||T,N);let I=e?10:5;e&&ps("solv start",{stdio:"inherit",shell:!0}),await pe(I,!0,s);return}else if(r.commission){let R=await vt();wt(R.commission,e)}else Vt()})},"updateCommands");import{spawnSync as ms}from"node:child_process";var ro=t(_=>{try{let{log:e}=F_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=ms(E,{shell:!0,stdio:"inherit"});if(o.error)throw o.error;o.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):o.status!==0&&(console.error(`Child process exited with code ${o.status}`),process.exit(o.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Ro=t(()=>{d.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(_=>{ro(_)})},"logCommands");import d_ from"chalk";import{spawnSync as hs}from"child_process";import{homedir as Bs}from"os";var He=t(_=>{let e=Bs(),E=U(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=O_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=O_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=O_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;hs(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ye}from"child_process";import{existsSync as Co,readdirSync as gs,rmSync as Ks}from"fs";import{homedir as ys}from"os";import ao from"path";var Je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[h.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[h.TESTNET_VALIDATOR_KEY,h.TESTNET_VALITATOR_AUTHORITY_KEY,h.TESTNET_VALIDATOR_VOTE_KEY,h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Ye(o,{shell:!0,stdio:"ignore"});let i=gs("./").filter(S=>S.endsWith("SV.json")),n=ys(),T=ao.join(n,"unstaked-identity.json");Co(T)&&Ye(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=ao.join(n,e[s]);if(s++,Co(r)){console.log(`${r} is already exist!`),Ks(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;Ye(a,{shell:!0,stdio:"inherit"})}Ye("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as No}from"child_process";var Gs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
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]
5793
5798
  Description=Jupiter API Service Instance
5794
5799
  After=network.target
5795
5800
 
@@ -5810,9 +5815,9 @@ unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5810
5815
  chmod +x jupiter-swap-api
5811
5816
  rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=co(_.rpcUrl,_.grpcUrl,_.grpcToken);No(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(Vs.white(`\u{1F7E2} Jupiter Swap API Setup Completed
5812
5817
 
5813
- $ solv jupiter --help`))},"jupiterAPISetup"),Oo=bs;import{existsAsync as ws}from"@skeet-framework/utils";import{readFile as vs,writeFile as Fo}from"fs/promises";import{homedir as Hs}from"os";import Ys from"path";var c_=t(async()=>{let _=Hs(),e=Ys.join(_,T_.JITO_CONFIG);await ws(e)||(await Fo(e,JSON.stringify(C_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await vs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await Fo(e,JSON.stringify(C_,null,2)),E=C_}return E},"readOrCreateJitoConfig");import{spawnSync as Js}from"child_process";var ne=t(()=>{Js("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Te from"chalk";import xe from"inquirer";import xs from"inquirer";var lo=t(async _=>{let E=Object.keys(_?Ee.TESTNET:Ee.MAINNET),o=_?Ee.TESTNET:Ee.MAINNET,i=await xs.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:E}]),n=i.region,T=o[n];return{version:C_.version,tag:C_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Qs=t(async()=>{try{let _=F.NONE,e=V.AGAVE,E=a_.COMMISSION,o=!1,i=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:Yt,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Jt,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[F.JITO,F.SOLANA]:[F.AGAVE,F.JITO,F.FRANKENDANCER];_=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:F.AGAVE}).then(r=>r.validatorType),e=V.NONE}if(i.nodeType===D.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:xt,default:V.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${a_.COMMISSION}%)'`,default:a_.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(E=S.commission,o=S.isDummy,_===F.JITO||_===F.FRANKENDANCER){await c_();let r=await lo(n);await te(r)}}let{network:T,nodeType:s}=i;return console.log(Te.white("Network:",T)),console.log(Te.white("Node Type:",s)),console.log(Te.white("Validator Type:",_)),console.log(Te.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Te.white("Commission:",E)),await M({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Io=Qs;import{spawnSync as W}from"child_process";var se=t((_=L_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-jito`;W(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),W(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),W("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),W(`cp -r /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),W(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),W("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):W(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var Do=t(()=>`#!/bin/bash
5818
+ $ solv jupiter --help`))},"jupiterAPISetup"),Oo=bs;import{existsAsync as ws}from"@skeet-framework/utils";import{readFile as vs,writeFile as Fo}from"fs/promises";import{homedir as Hs}from"os";import Ys from"path";var c_=t(async()=>{let _=Hs(),e=Ys.join(_,T_.JITO_CONFIG);await ws(e)||(await Fo(e,JSON.stringify(C_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await vs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await Fo(e,JSON.stringify(C_,null,2)),E=C_}return E},"readOrCreateJitoConfig");import{spawnSync as Js}from"child_process";var ne=t(()=>{Js("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Te from"chalk";import xe from"inquirer";import xs from"inquirer";var lo=t(async _=>{let E=Object.keys(_?Ee.TESTNET:Ee.MAINNET),o=_?Ee.TESTNET:Ee.MAINNET,i=await xs.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:E}]),n=i.region,T=o[n];return{version:C_.version,tag:C_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Qs=t(async()=>{try{let _=F.NONE,e=V.AGAVE,E=a_.COMMISSION,o=!1,i=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:Yt,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Jt,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[F.JITO,F.SOLANA]:[F.AGAVE,F.JITO,F.FRANKENDANCER];_=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:F.AGAVE}).then(r=>r.validatorType),e=V.NONE}if(i.nodeType===D.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:xt,default:V.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${a_.COMMISSION}%)'`,default:a_.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(E=S.commission,o=S.isDummy,_===F.JITO||_===F.FRANKENDANCER){await c_();let r=await lo(n);await te(r)}}let{network:T,nodeType:s}=i;return console.log(Te.white("Network:",T)),console.log(Te.white("Node Type:",s)),console.log(Te.white("Validator Type:",_)),console.log(Te.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Te.white("Commission:",E)),await u({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Io=Qs;import{spawnSync as W}from"child_process";var se=t((_=L_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-jito`;W(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),W(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),W("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),W(`cp -r /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),W(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),W("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):W(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var Do=t(()=>`#!/bin/bash
5814
5819
  exec agave-validator \\
5815
- --identity ${L} \\
5820
+ --identity ${M} \\
5816
5821
  --log ${j} \\
5817
5822
  --accounts ${g_} \\
5818
5823
  --ledger ${P} \\
@@ -5851,7 +5856,7 @@ exec agave-validator \\
5851
5856
  --limit-ledger-size 400000000 \\
5852
5857
  `,"startJitoRPCScript");import{existsAsync as Ws}from"@skeet-framework/utils";import{writeFile as Xs}from"fs/promises";import{spawnSync as qs}from"node:child_process";var $s=t(()=>{let _=`sudo chmod +x ${t_}`;qs(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Se=$s;var Po=t(()=>`#!/bin/bash
5853
5858
  exec agave-validator \\
5854
- --identity ${L} \\
5859
+ --identity ${M} \\
5855
5860
  --log ${j} \\
5856
5861
  --accounts ${g_} \\
5857
5862
  --ledger ${P} \\
@@ -5887,7 +5892,7 @@ exec agave-validator \\
5887
5892
  --limit-ledger-size 400000000 \\
5888
5893
  `,"startRPCNodeScript");var js=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case V.AGAVE:console.log("Agave RPC Node Setup"),G_(_.TESTNET_SOLANA_VERSION),E=Po();break;case V.JITO:console.log("JITO RPC Node Setup"),se(ee),E=Do();break;default:console.log("Unknown RPC Node Setup");break}if(await Ws(t_)){console.log("Startup script already exists. Skipping...");return}await Xs(t_,E,"utf-8"),Se()},"setupRpcNode"),fo=js;import{spawnSync as zs}from"node:child_process";var Zs=t(_=>{zs(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),gE=Zs;var Uo=t((_=0,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5889
5894
  exec ${n} \\
5890
- --identity ${L} \\
5895
+ --identity ${M} \\
5891
5896
  --vote-account ${fe} \\
5892
5897
  --authorized-voter ${b} \\
5893
5898
  --log ${j} \\
@@ -5924,7 +5929,7 @@ exec ${n} \\
5924
5929
  --full-rpc-api \\
5925
5930
  `,"startJitoMainnetScript");var Ao=t((_=1e4,e,E,o,i,n="agave-validator")=>`#!/bin/bash
5926
5931
  exec ${n} \\
5927
- --identity ${L} \\
5932
+ --identity ${M} \\
5928
5933
  --vote-account ${Ue} \\
5929
5934
  --authorized-voter ${K} \\
5930
5935
  --log ${j} \\
@@ -5958,7 +5963,7 @@ exec ${n} \\
5958
5963
  --full-rpc-api \\
5959
5964
  `,"startJitoTestnetScript");var Lo=t((_,e="agave-validator")=>`#!/bin/bash
5960
5965
  exec ${e} \\
5961
- --identity ${L} \\
5966
+ --identity ${M} \\
5962
5967
  --vote-account ${fe} \\
5963
5968
  --authorized-voter ${b} \\
5964
5969
  --log ${j} \\
@@ -5990,7 +5995,7 @@ exec ${e} \\
5990
5995
  --private-rpc \\
5991
5996
  `,"startMainnetValidatorScript");var KE=t(_=>`#!/bin/bash
5992
5997
  exec agave-validator \\
5993
- --identity ${L} \\
5998
+ --identity ${M} \\
5994
5999
  --vote-account ${Ue} \\
5995
6000
  --authorized-voter ${K} \\
5996
6001
  --log ${j} \\
@@ -6020,13 +6025,13 @@ exec agave-validator \\
6020
6025
  --maximum-full-snapshots-to-retain 1 \\
6021
6026
  --maximum-incremental-snapshots-to-retain 4 \\
6022
6027
  `,"startTestnetAgaveValidatorScript");import{existsAsync as Mo}from"@skeet-framework/utils";import{writeFile as uo}from"fs/promises";var _S=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===c.MAINNET?(console.log("Mainnet Validator Node Setup"),await eS(_,e)):E===c.TESTNET?(console.log("Testnet Validator Node Setup"),await ES(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),eS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MAINNET_SOLANA_VERSION:o,MOD:i}=_;e=i;let n="",T=!!o.startsWith("3");switch(E){case F.SOLANA:gE(o),n=Lo(_);break;case F.JITO:console.log("JITO Validator Setup for Mainnet");let s=await c_();se(o,e,T),n=Uo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await Mo(t_)){console.log("Startup script already exists. Skipping...");return}await uo(t_,n,"utf-8"),Se()},"setupMainnetValidator"),ES=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o}=_;e=o;let i="",n=!!_.TESTNET_SOLANA_VERSION.startsWith("3");switch(E){case F.SOLANA:gE(_.TESTNET_SOLANA_VERSION),i=KE(_);case F.AGAVE:console.log("Agave Validator Setup for Testnet"),G_(_.TESTNET_SOLANA_VERSION,e,n),i=KE(_);break;case F.JITO:console.log("JITO Validator Setup for Testnet");let T=await c_();se(_.TESTNET_SOLANA_VERSION,e,n),i=Ao(T.commissionBps,T.relayerUrl,T.blockEngineUrl,T.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Testnet");break}if(await Mo(t_)){console.log("Startup script already exists. Skipping...");return}await uo(t_,i,"utf-8"),Se()},"setupTestnetValidator"),po=_S;import Ei from"chalk";import{execSync as mo}from"node:child_process";function ho(_){try{mo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{mo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(ho,"createDirectoryIfNotExists");var Bo=t(()=>{try{let _=[f.ACCOUNTS,f.LEDGER,f.SNAPSHOTS];for(let e of _)ho(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as tS}from"child_process";function oS(){let e=tS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6023
- `).slice(1),E=[],o=e.map(O=>O.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let O of e){let[l,k,p]=O.trim().split(/\s+/);if(!l||!k)continue;let Q=parseInt(k,10);if(isNaN(Q))continue;let r_=p!==void 0&&p!=="";p==="/"&&(S=l.replace(/p?\d*$/,""));let f_=o.some(Z_=>Z_!==l&&Z_.startsWith(l)),z_=l.startsWith("nvme")?"NVMe":"SATA";Q>=400*1024*1024*1024&&E.push({name:l,size:Q,mountpoint:p||"",isMounted:r_,hasPartition:f_,type:z_})}console.log("Found root disk name: ",S);let r=o.filter(O=>O.startsWith(S));r.forEach(O=>console.log("Found root disk partition: ",O));let C=E.filter(O=>!r.includes(O.name)).sort((O,l)=>l.size-O.size),R=C.filter(O=>O.type==="NVMe").sort((O,l)=>l.size-O.size),N=C.filter(O=>O.type==="SATA").sort((O,l)=>l.size-O.size),I=[...R,...N];if(I.length>0){let O=I[0];if(O.size>=850*1024*1024*1024&&!O.isMounted&&(i=!0),O.size>=1250*1024*1024*1024&&O.isMounted&&(T=!0),I.length>1){let l=I[1];l.size>=400*1024*1024*1024&&!l.isMounted&&(n=!0)}if(I.length>2){let l=I[2];l.size>=400*1024*1024*1024&&!l.isMounted&&(s=!0)}}return I.forEach((O,l)=>console.log(`Prioritized Disk ${l+1}: ${O.name} ${O.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(oS,"getPreferredDisks");var re=oS;import{spawnSync as b_}from"child_process";var l_=t(_=>{if(b_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return b_(E,{shell:!0,stdio:"inherit"}),b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Qe}from"child_process";async function yE(_){for(let e=1;e<=5;e++){let o=Qe(`sudo blkid -s UUID -o value ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(o)return console.log(`[SUCCESS] Found UUID for ${_}: ${o}`),`UUID=${o}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${_}`),await Y(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(yE,"getUUID");var Re=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await yE(_),T=await yE(e),s=await yE(E),S=`${n} ${f.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6028
+ `).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
6024
6029
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
6025
6030
  ${T} ${f.ACCOUNTS} ext4 defaults 0 0
6026
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(`
6027
6032
  `)}" | sudo tee -a /etc/fstab`;Qe(N,{shell:!0,encoding:"utf8"}),Qe("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6028
6033
  ${R.join(`
6029
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as iS}from"child_process";var go=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=iS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var nS=t(async()=>{let _=re(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await M({MNT_DISK_TYPE:$.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 M({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 M({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 _=`
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 _=`
6030
6035
  # Increase UDP buffer sizes
6031
6036
  net.core.rmem_default = 134217728
6032
6037
  net.core.rmem_max = 134217728
@@ -6115,7 +6120,7 @@ To get your free API key, simply join us through the link below:
6115
6120
  Validators DAO: ${je.white("`https://discord.gg/X4BgkBHavp`")}
6116
6121
 
6117
6122
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6118
- `;console.log(je.cyan(e))},"rpcLog"),p_=US;import{spawnSync as u}from"child_process";import{promises as bE}from"fs";import pS from"path";var AS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6123
+ `;console.log(je.cyan(e))},"rpcLog"),p_=US;import{spawnSync as p}from"child_process";import{promises as bE}from"fs";import pS from"path";var AS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6119
6124
  sudo chmod -R 755 /mnt
6120
6125
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
6121
6126
  sudo chown -R solv:solv /mnt
@@ -6312,7 +6317,7 @@ Restart=always
6312
6317
 
6313
6318
  [Install]
6314
6319
  WantedBy=multi-user.target
6315
- `}),"portRelayService"),ei=uS;var mS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?K_:y_,{filePath:i,body:n}=ve();_?(u('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),u('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),u("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),u(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await bE.mkdir(pS.dirname(i),{recursive:!0}),await bE.writeFile(i,n,"utf8"),u(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),u(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(u("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),u(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),u("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),u("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await c_(),{filePath:s,body:S}=zo();u(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),u(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Zo();u(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=ei();u("sudo apt install socat",{shell:!0,stdio:"inherit"}),u("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),u(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),u("sudo systemctl daemon-reload",{shell:!0});let C=_i(E,T);await bE.writeFile(C.filePath,C.body,"utf-8"),console.log(`config.toml written to ${C.filePath}`),u(`sudo chown solv:solv "${C.filePath}"`,{shell:!0,stdio:"inherit"}),w_(!0)},"setupFiredancer"),ze=mS;var ti=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(Ei.white("\u{1F7E2} Initializing Setup")),await G(),await Io());let i=await G(),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 G(),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 G(),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
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
6316
6321
  [Unit]
6317
6322
  Description=Solana transaction relayer
6318
6323
  Requires=network-online.target
@@ -6375,8 +6380,8 @@ ${o.join(`
6375
6380
  `)}`)),console.log(EE.white(`
6376
6381
  Only showing the first 10 results
6377
6382
 
6378
- `)),console.log(EE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as dr}from"child_process";var Bi=t(_=>{d.command("status").description("Check Solana Validator Status").action(()=>{Nr(_)})},"statusCommands"),Nr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`;dr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Or}from"node:child_process";var gi=t(async(_,e)=>{try{let E=await G(),o=E.NETWORK===c.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?c.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return Or(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import yi from"inquirer";import{spawnSync as Fr}from"node:child_process";var Ki=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=Fr(`solana create-stake-account ${_} ${e}`,{shell:!0,stdio:"pipe"}),n=i.stdout.toString()+i.stderr.toString();if(n.includes("Signature:"))return console.log("Stake account created successfully:",n),!0;if(n.includes("Error:"))console.log("Error encountered:",n),o++,console.log(`Retrying... (${o}/${E})`);else{console.log("Unknown output:",n);break}o===E&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as lr,existsAsync as Ir}from"@skeet-framework/utils";import{execSync as Dr,spawnSync as oE}from"node:child_process";import Pr from"node:os";var Gi=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await yi.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;oE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await yi.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Ur(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return V_({STAKE_ACCOUNT:S}),Ki(T,Number(i.solAmount))},"stakeAccountQuestion"),fr=Pr.userInfo().homedir,tE=fr+"/stake-account",Ur=t(async()=>{await Ir(tE)||oE(`mkdir -p ${tE}`,{shell:!0});let _=oE(`ls ${tE}`,{shell:!0}).stdout.toString().split(`
6379
- `).filter(n=>n.includes(".json")),e=lr(_.length+1),E=`${tE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return oE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Dr(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Ar}from"node:child_process";var ki=t(async _=>{try{let E=(await G()).NETWORK===c.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Ar(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Lr}from"node:child_process";var Vi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return Lr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import J_ from"chalk";import{Connection as Mr,PublicKey as ur}from"@solana/web3.js";import{stakePoolInfo as pr}from"@solana/spl-stake-pool";var iE=t(async(_,e=e_)=>{try{let E=new Mr(_),o=new ur(e);return await pr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as mr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as hr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Br}from"@metaplex-foundation/umi";var bi=t(async(_,e)=>{try{let E=Br(e);console.log(`mintPubkey: ${E}`);let o=hr(_),i=await mr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ce from"chalk";import wi from"inquirer";var vi=t(async _=>{let e=await wi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:e_}]);try{let E=await iE(_,e.stakePoolAddress);if(!E)return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6383
+ `)),console.log(EE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as dr}from"child_process";var Bi=t(_=>{d.command("status").description("Check Solana Validator Status").action(()=>{Nr(_)})},"statusCommands"),Nr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`;dr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Or}from"node:child_process";var gi=t(async(_,e)=>{try{let E=await k(),o=E.NETWORK===c.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?c.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return Or(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import yi from"inquirer";import{spawnSync as Fr}from"node:child_process";var Ki=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=Fr(`solana create-stake-account ${_} ${e}`,{shell:!0,stdio:"pipe"}),n=i.stdout.toString()+i.stderr.toString();if(n.includes("Signature:"))return console.log("Stake account created successfully:",n),!0;if(n.includes("Error:"))console.log("Error encountered:",n),o++,console.log(`Retrying... (${o}/${E})`);else{console.log("Unknown output:",n);break}o===E&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as lr,existsAsync as Ir}from"@skeet-framework/utils";import{execSync as Dr,spawnSync as oE}from"node:child_process";import Pr from"node:os";var Gi=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await yi.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;oE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await yi.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Ur(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return V_({STAKE_ACCOUNT:S}),Ki(T,Number(i.solAmount))},"stakeAccountQuestion"),fr=Pr.userInfo().homedir,tE=fr+"/stake-account",Ur=t(async()=>{await Ir(tE)||oE(`mkdir -p ${tE}`,{shell:!0});let _=oE(`ls ${tE}`,{shell:!0}).stdout.toString().split(`
6384
+ `).filter(n=>n.includes(".json")),e=lr(_.length+1),E=`${tE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return oE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Dr(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Ar}from"node:child_process";var ki=t(async _=>{try{let E=(await k()).NETWORK===c.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Ar(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Lr}from"node:child_process";var Vi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return Lr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import J_ from"chalk";import{Connection as Mr,PublicKey as ur}from"@solana/web3.js";import{stakePoolInfo as pr}from"@solana/spl-stake-pool";var iE=t(async(_,e=e_)=>{try{let E=new Mr(_),o=new ur(e);return await pr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as mr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as hr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Br}from"@metaplex-foundation/umi";var bi=t(async(_,e)=>{try{let E=Br(e);console.log(`mintPubkey: ${E}`);let o=hr(_),i=await mr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ce from"chalk";import wi from"inquirer";var vi=t(async _=>{let e=await wi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:e_}]);try{let E=await iE(_,e.stakePoolAddress);if(!E)return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6380
6385
  Please check the correct address and try again.
6381
6386
  `)),console.log(ce.white(`For stake pool information
6382
6387
  \u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await bi(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
@@ -6391,12 +6396,12 @@ Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as Hr,Keypair as
6391
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
6392
6397
 
6393
6398
  Signature:`,N.signature)),!0},"depositeLST");import{execSync as sE}from"node:child_process";import{homedir as qr}from"os";var Xi=t(_=>{d.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let E=Number(e.amount);console.log("RPC URL:",_.RPC_URL);let o=e_,i=_.NETWORK===c.TESTNET,n=qr(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(sE(`solana config set --keypair ${T}`),!await Qr(T)){console.log(J_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6394
- `)),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 G(),{validatorVoteAccount:a,stakeAccounts:C}=await Wr(r);for await(let R of C)try{await gi(R,a)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6399
+ `)),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
6395
6400
  You can use a custom RPC endpoint to avoid this issue
6396
6401
  `))}}}),d.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await jr();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await $r();for await(let o of E)try{await ki(o)}catch{console.log(J_.yellow(`Network might be busy, please try again later
6397
6402
  You can use a custom RPC endpoint to avoid this issue
6398
6403
  `))}}else{let E=await zr();await Vi(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),TE=t(async()=>{let _=sE("solana address").toString().trim(),e=sE("solana balance").toString().replace("SOL","").trim();console.log(J_.white(`\u{1F4D7} Selected Wallet: ${_}
6399
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(J_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Oe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),$r=t(async()=>{let _=await G();return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Wr=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?Xr(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return E}}])},"delegateStakeAsk"),Xr=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return sE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),jr=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Oe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),zr=t(async()=>{let _=(await G()).STAKE_ACCOUNTS;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:_},{type:"input",name:"destinationAddress",message:"What is the destination address for the withdrawn SOL?",default(){return"xxxxxxxx"}},{type:"input",name:"solAmount",message:"How many SOL would you like to withdraw?",default(){return"1"}}])},"withdrawStakeAsk");import{execSync as Zr}from"child_process";var ji=t(()=>{try{return Zr("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as _R}from"child_process";var zi=t(()=>{try{return _R("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import N_ from"chalk";import{Spinner as eR}from"cli-spinner";var x_;(function(_){_.successHex=N_.hex("#39A845"),_.warningHex=N_.hex("#FFD02E"),_.errorHex=N_.hex("#B5332E"),_.syncHex=N_.hex("#3073B7"),_.greyHex=N_.hex("#BEBDBD"),_.indigoHex=N_.hex("#3950A0"),_.pinkHex=N_.hex("#D8A1C4"),_.normal=e=>{console.log(N_.white(e))},_.syncSpinner=e=>{let E=new eR(N_.white(e)+` %s
6404
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(J_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Oe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),$r=t(async()=>{let _=await k();return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Wr=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?Xr(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return E}}])},"delegateStakeAsk"),Xr=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return sE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),jr=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Oe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),zr=t(async()=>{let _=(await k()).STAKE_ACCOUNTS;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:_},{type:"input",name:"destinationAddress",message:"What is the destination address for the withdrawn SOL?",default(){return"xxxxxxxx"}},{type:"input",name:"solAmount",message:"How many SOL would you like to withdraw?",default(){return"1"}}])},"withdrawStakeAsk");import{execSync as Zr}from"child_process";var ji=t(()=>{try{return Zr("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as _R}from"child_process";var zi=t(()=>{try{return _R("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import N_ from"chalk";import{Spinner as eR}from"cli-spinner";var x_;(function(_){_.successHex=N_.hex("#39A845"),_.warningHex=N_.hex("#FFD02E"),_.errorHex=N_.hex("#B5332E"),_.syncHex=N_.hex("#3073B7"),_.greyHex=N_.hex("#BEBDBD"),_.indigoHex=N_.hex("#3950A0"),_.pinkHex=N_.hex("#D8A1C4"),_.normal=e=>{console.log(N_.white(e))},_.syncSpinner=e=>{let E=new eR(N_.white(e)+` %s
6400
6405
  `);try{return E.setSpinnerString(18),E.start(),E}catch(o){throw E.stop(!0),new Error(`syncSpinner Error: ${o}`)}},_.solvAA=()=>{let e=_.syncHex(" _ "),E=_.syncHex(" | | "),o=_.syncHex(" ___ ___ | |")+_.errorHex("_ __ "),i=_.syncHex("/ __|/ _ \\| |")+_.errorHex("\\ \\ / /"),n=_.syncHex("\\__ \\ (_) | |")+_.errorHex(" \\ V / "),T=_.syncHex("|___/\\___/|_|")+_.errorHex(" \\_/ ");console.log(`
6401
6406
  ${e}`),console.log(`${E}`),console.log(`${o}`),console.log(`${i}`),console.log(`${n}`),console.log(`${T}
6402
6407
  `),console.log(`Solv Version: v${De}
@@ -6433,7 +6438,7 @@ Balance: ${e.authorityKeyBalance}
6433
6438
  Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
6434
6439
  Address: ${e.validatorKeyAddress}
6435
6440
  Balance: ${e.validatorKeyBalance}
6436
- Active Identity:`),console.log(OR.white(E)),FR(`solana-keygen pubkey ${L}`,{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
6441
+ Active Identity:`),console.log(OR.white(E)),FR(`solana-keygen pubkey ${M}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),IR=t(_=>{let e=U(),E=_.NETWORK===c.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:A(e.mainnetValidatorKey),validatorKeyBalance:D_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:A(e.testnetValidatorKey),validatorKeyBalance:D_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:A(e.testnetValidatorVoteKey),voteKeyBalance:D_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:A(e.testnetValidatorAuthorityKey),authorityKeyBalance:D_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:A(e.mainnetValidatorKey),validatorKeyBalance:D_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:A(e.mainnetValidatorVoteKey),voteKeyBalance:D_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:A(e.mainnetValidatorAuthorityKey),authorityKeyBalance:D_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as xE}from"node:child_process";var dn=t(_=>{xE("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&xE(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),xE("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as DR}from"node:child_process";var Nn=t(_=>{let E=`${n_()} --ledger ${_.LEDGER_PATH} monitor`;DR(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as PR}from"node:child_process";var On=t(()=>{PR("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import RE from"inquirer";import{execSync as CE,spawnSync as QE}from"child_process";import Fe from"chalk";import{homedir as fR}from"os";var Fn=1e3,qE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(qE||(qE={}));var aE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(aE||(aE={}));var UR=Object.values(qE),ln=t(_=>{d.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(Fe.blue(`\u2728 Coming Soon
6437
6442
  This Feature is Currently Under Development
6438
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
6439
6444
  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}
@@ -6441,9 +6446,9 @@ Please Check the Wallet Address`)),process.exit(0)}let T=CE(`solana balance ${o}
6441
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
6442
6447
  Retrying Transaction in ${Fn}ms
6443
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:
6444
- `)),console.log(zE.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),mn=QR;import OE from"chalk";import{Connection as qR,PublicKey as hn,Keypair as $R,ComputeBudgetProgram as dE,VersionedTransaction as Bn,TransactionMessage as gn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Kn,createTransferInstruction as yn,TOKEN_PROGRAM_ID as Gn}from"@solana/spl-token";var kn=t(async(_,e,E,o,i,n)=>{try{let T=new qR(_,"finalized"),s=$R.fromSecretKey(new Uint8Array(e)),S=new hn(E),r=new hn(i),a=Math.trunc(o*Math.pow(10,n)),C=await Kn(T,s,r,s.publicKey),R=await Kn(T,s,r,S,!0);for(;;)try{let N=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:2e5}),dE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),O=new Bn(new gn({instructions:N,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),l=await T.simulateTransaction(O,{replaceRecentBlockhash:!0,sigVerify:!1});O.sign([s]);let k=[yn(C.address,R.address,s.publicKey,a,[],Gn),dE.setComputeUnitLimit({units:l.value.unitsConsumed?Math.trunc(l.value.unitsConsumed*1.2):2e5}),dE.setComputeUnitPrice({microLamports:1e3})],p=new Bn(new gn({instructions:k,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());p.sign([s]);let Q=await T.sendRawTransaction(p.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
+ `)),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(`
6445
6450
  `).filter(n=>!n.includes(_)).join(`
6446
- `),i="/tmp/temp_crontab";await bn.writeFile(i,o,"utf-8"),Vn("crontab",[i]),await bn.unlink(i),console.log(ZE.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(ZE.red("Error removing cron job:",e))}},"removeCronJob"),wn=WR;import vn from"chalk";var XR=t(async _=>{let e=_.NETWORK===c.TESTNET,E=await NE.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!E.mevOn)return await _E()&&await wn(),await M({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6451
+ `),i="/tmp/temp_crontab";await bn.writeFile(i,o,"utf-8"),Vn("crontab",[i]),await bn.unlink(i),console.log(ZE.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(ZE.red("Error removing cron job:",e))}},"removeCronJob"),wn=WR;import vn from"chalk";var XR=t(async _=>{let e=_.NETWORK===c.TESTNET,E=await NE.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!E.mevOn)return await _E()&&await wn(),await u({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6447
6452
  ${vn.green("No more Login to the server to update \u{1F331}")}
6448
6453
 
6449
6454
  If you enable this, solv will update automatically when the solv/solana version is updated.
@@ -6452,10 +6457,10 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
6452
6457
 
6453
6458
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
6454
6459
  \u203B Please turn off if you are using no-downtime migration.
6455
- `;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 M({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}
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}
6456
6461
  Validator Address: ${A(E)}
6457
6462
  Total Reward: ${s} elSOL
6458
- 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 M({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===
6463
+ Harvest Address: ${e}`;await z(r)}console.log(OE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),d.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Hn(_)&&(EC("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(OE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),oC=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await eC.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:$E}]);return await u({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as PC}from"@skeet-framework/utils";import{writeFile as iC}from"fs/promises";var nC=t(async _=>{await iC(Be,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),P_=nC;var TC=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await P_({...e,isLessThan1Day:!0})},"isLessThan1Day"),xn=TC;var sC=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await P_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),Qn=sC;var SC=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await P_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),qn=SC;var rC=t(async(_,e)=>{let E=e.NETWORK===c.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=U(),T=E?A(n):A(i);await P_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6459
6464
  Validator: ${T}
6460
6465
  Network: ${e.NETWORK}
6461
6466
  CurrentEpoch: ${_.epoch}
@@ -6474,7 +6479,7 @@ Local Identity Key: ${o}
6474
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
6475
6480
  $ ssh ${o}@${_}
6476
6481
 
6477
- 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 p=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${O}${PE}'`;if($_(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6482
+ Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(X.white("\u{1F7E2} Setting identity on the remote validator..."));let L=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${O}${PE}'`;if($_(L,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6478
6483
  $ ssh ${o}@${_}
6479
6484
 
6480
6485
  Failed Cmd: ${I} set-identity ${O}${PE}`));return}if(console.log(X.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),$_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${PE} ${oT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
@@ -6486,11 +6491,11 @@ $ ssh ${o}@${_}
6486
6491
  Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(X.white("\u{1F7E2} Setting identity on the local validator...")),$_(`${R} set-identity ${N}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6487
6492
 
6488
6493
  Failed Cmd: ${R} set-identity ${N}${s}
6489
- ln -sf ${s} ${L}`));return}if($_(`ln -sf ${s} ${L}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6494
+ ln -sf ${s} ${M}`));return}if($_(`ln -sf ${s} ${M}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6490
6495
 
6491
- Failed Cmd: ln -sf ${s} ${L}`));return}console.log(X.white("\u{1F7E2} Identity changed successfully!")),await M({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 p=`${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} ${L}`;if(i&&(console.log(J.white("\u{1F7E2} Waiting for restart window...")),W_(p,{shell:!0,stdio:"inherit"}).status!==0)){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
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
6492
6497
 
6493
- Failed Cmd: ${p}`));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
6498
+ Failed Cmd: ${L}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),W_(Q,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6494
6499
 
6495
6500
  Failed Cmd: ${Q}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),W_(r_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6496
6501
 
@@ -6501,7 +6506,7 @@ $ ssh ${o}@${_}
6501
6506
 
6502
6507
  Failed Cmd: ${R_}`)),console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let BT=`ssh -i ${sT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${z_}'`;if(W_(BT,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6503
6508
 
6504
- Failed Cmd: ${z_}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await M({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as GC}from"node:child_process";function RT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return GC(E,{shell:!0,stdio:"inherit"}).status===0}t(RT,"checkSSHConnection");import Ie from"chalk";import{join as aT}from"path";import{spawnSync as X_}from"node:child_process";import __ from"chalk";var fE=aT(g,A_),CT=aT(g,U_),cT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;if(T&&(s=K),!Q_(s,_,o))return;let r=st,a=St;if(i){console.log(__.white("\u{1F7E2} Waiting for restart window..."));let k=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(X_(k,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
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
6505
6510
  $ ssh ${o}@${_}
6506
6511
 
6507
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
@@ -6516,9 +6521,9 @@ $ ssh ${o}@${_}
6516
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
6517
6522
 
6518
6523
  Failed Cmd: ${a} -l ${P} set-identity ${s}
6519
- ln -sf ${s} ${L}`));return}if(X_(`ln -sf ${s} ${L}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6524
+ ln -sf ${s} ${M}`));return}if(X_(`ln -sf ${s} ${M}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6520
6525
 
6521
- Failed Cmd: ln -sf ${s} ${L}`));return}console.log(__.white("\u{1F7E2} Identity changed successfully!")),await M({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
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
6522
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
6523
6528
  `)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
6524
6529
  `)),process.exit(0));let R_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
@@ -6544,7 +6549,7 @@ $ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
6544
6549
  You can upgrade your API key to increase your rate limits.
6545
6550
  Get Your API key \u{1F447}
6546
6551
  Validators Solutions: ${_e}
6547
- `;console.error(x.white(R_)),process.exit(0)}let k=Buffer.from(l.swapTransaction,"base64"),p=xC.deserialize(k);p.sign([O]);let Q=p.serialize(),r_=await S.sendRawTransaction(Q,{skipPreflight:!0,maxRetries:2}),f_=p.message.recentBlockhash;return console.log(`Swapping...
6548
- Transaction ID: ${r_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:r_},"confirmed"),r_},"swap");$C.config();var DT=t(async(_,e)=>{_.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async E=>{try{await WC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(B_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(B_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),WC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(B_.white("Solana RPC URL:",_)),console.log(B_.white("KeyfilePath:",e)),(!e||e===""||s)&&await XC();let S=ct,r=[...dt,"Other"],a=o,C="",R=i,N=n;if(a===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?a=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(C=l.name,a=UE[C].tokenMint)}if(R===""){r=r.filter(p=>p!==C);let l=await j_.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(l.name==="Other")R=(await j_.prompt([{type:"input",name:"address",message:"Enter output mint address",default:s_}])).address;else{let p=l.name;R=UE[p].tokenMint}let k=l.name;R=UE[k].tokenMint}if(N===0){let l=await j_.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);N=Number(l.amount)}let O=await IT(_,S,!E||E===""?Nt:E,e,a,R,N,T);O||process.exit(0),console.log(B_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(B_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${O}`))},"swapCmd");var XC=t(async()=>{let _=await j_.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await M(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6549
- `)),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 G();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};
6552
+ `;console.error(x.white(R_)),process.exit(0)}let G=Buffer.from(l.swapTransaction,"base64"),L=xC.deserialize(G);L.sign([O]);let Q=L.serialize(),r_=await S.sendRawTransaction(Q,{skipPreflight:!0,maxRetries:2}),f_=L.message.recentBlockhash;return console.log(`Swapping...
6553
+ Transaction ID: ${r_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:r_},"confirmed"),r_},"swap");$C.config();var DT=t(async(_,e)=>{_.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async E=>{try{await WC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(B_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(B_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),WC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(B_.white("Solana RPC URL:",_)),console.log(B_.white("KeyfilePath:",e)),(!e||e===""||s)&&await XC();let S=ct,r=[...dt,"Other"],a=o,C="",R=i,N=n;if(a===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?a=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(C=l.name,a=UE[C].tokenMint)}if(R===""){r=r.filter(L=>L!==C);let l=await j_.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(l.name==="Other")R=(await j_.prompt([{type:"input",name:"address",message:"Enter output mint address",default:s_}])).address;else{let L=l.name;R=UE[L].tokenMint}let G=l.name;R=UE[G].tokenMint}if(N===0){let l=await j_.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);N=Number(l.amount)}let O=await IT(_,S,!E||E===""?Nt:E,e,a,R,N,T);O||process.exit(0),console.log(B_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(B_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${O}`))},"swapCmd");var XC=t(async()=>{let _=await j_.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await u(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
6554
+ `)),p_()},"askForConfig");import{spawnSync as jC}from"node:child_process";var PT=t(()=>{jC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as zC}from"node:child_process";var fT=t(()=>{zC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as ZC}from"node:child_process";var UT=t(()=>{ZC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as _a}from"node:child_process";var AT=t(()=>{_a("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as ea}from"node:child_process";var LT=t((_=!1)=>{ea(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Ea}from"node:child_process";var MT=t(()=>{Ea("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var uT=t(()=>{let _=d.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{PT()}),_.command("start").description("Start Jupiter").action(()=>{fT()}),_.command("stop").description("Stop Jupiter").action(()=>{UT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{LT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{AT()}),_.command("enable").description("Enable Jupiter").action(()=>{MT()})},"jupiterCommands");import na from"chalk";import{spawnSync as ta}from"node:child_process";var oa=t(()=>{let{stdout:_}=ta("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),pT=oa;var d=new ia;d.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(De,"-V","Display version");async function Ta(){try{let _=await k();ai(_),Oi(_),di(_),Bi(_),So(_),Ro(),Fi(_),Xi(_),_n(_),hi(),Di(),ri(_),cn(_),li(),sn(),ln(_),Pn(_),Jn(_),Ci(),DT(d,_),eT(_),NT(d,_),uT(),Rn(_),d.command("rm:log").description("Remove Logs").action(()=>{rE()}),d.command("rm:snapshot").description("Remove Snapshot").action(()=>{dn(_)}),d.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",_.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",_.SNAPSHOTS_PATH).action(e=>{console.log(na.white("\u{1F4DD} Creating Snapshot...")),OT(e.slot,e.ledger,e.snapshots)}),d.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Nn(_)}),d.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{On()}),d.command("config").description("Show Solv Config").action(()=>{SE(_)}),d.command("vv").description("Show Solv Version").action(()=>{let e=pT();console.log("version:",e)}),await d.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(Ta,"main");Ta();export{d as program};
6550
6555
  //# sourceMappingURL=index.js.map