@gabrielhicks/solv 5.2.11 → 5.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var Ei=Object.defineProperty;var r=(t,e)=>Ei(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as Yd}from"commander";var Zo="5.2.11";var tr={name:"@gabrielhicks/solv",version:Zo,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"}};var he=tr.version;var zt="https://validators.solutions";var ye="solv4.config.json";var Et="identity.json",At="unstaked-identity.json",er="relayer-keypair.json",wi="mainnet-validator-keypair.json",_i="mainnet-vote-account-keypair.json",Ni="mainnet-authority-keypair.json",vi="testnet-validator-keypair.json",Oi="testnet-vote-account-keypair.json",Ri="testnet-authority-keypair.json",I="/home/solv",k=`${I}/${Et}`,Zd=`${I}/${At}`,b=`${I}/${wi}`,Se=`${I}/${_i}`,tu=`${I}/${Ni}`,L=`${I}/${vi}`,or=`${I}/${Oi}`,eu=`${I}/${Ri}`,X=`${I}/solana-validator.log`,Z=I+"/start-validator.sh",w="/mnt/ledger",Ct="/mnt/accounts",tt="/mnt/snapshots",rr="solana-validator",nr="agave-validator",sr="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Te=3,ar="https://api.testnet.solana.com",ir="https://api.mainnet-beta.solana.com",cr="https://verify.validators.solutions/solv-migrate",lr="https://jup.validators.solutions/v1/jup",go;(function(t){t.SOL="SOL",t.USDC="USDC",t.elSOL="elSOL",t.JitoSOL="JitoSOL",t.mSOL="mSOL",t.bSOL="bSOL",t.EPCT="EPCT",t.JUP="JUP",t.BONK="BONK",t.JTO="JTO"})(go||(go={}));var mr=Object.values(go),ge="So11111111111111111111111111111111111111112",Ee="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Eo="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var pr="SOLV420",dr={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as Ii}from"child_process";import{spawnSync as ur}from"node:child_process";var ki=r((t,e=!1)=>{e?ur(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${t}-mod/installer)"`,{shell:!0,stdio:"inherit"}):ur(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),It=ki;var fr="agave-validator",Ci=r(()=>{try{return fr}catch(t){return console.error(t),fr}},"getSolanaCLI"),et=Ci;var Ae=r(async(t,e=!1)=>{It(t,e)},"updateVersion"),we=r(async(t,e=!1,o=10)=>{let n=et(),s=`${n} --ledger ${w} exit --max-delinquent-stake ${t} --monitor --min-idle-time ${o}`;e&&(s=`${n} --ledger ${w} exit --max-delinquent-stake ${t} --min-idle-time ${o}`),Ii(s,{shell:!0,stdio:"inherit"})},"monitorUpdate");import on from"chalk";var wt;(function(t){t.EN="en",t.JA="ja"})(wt||(wt={}));var hr;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE",t[t.TRIPLE=2]="TRIPLE"})(hr||(hr={}));var yr;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(yr||(yr={}));var ut;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(ut||(ut={}));var Sr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(Sr||(Sr={}));var Tr;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(Tr||(Tr={}));var gr;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(gr||(gr={}));var Er;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(Er||(Er={}));var _e;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(_e||(_e={}));var Ne;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Ne||(Ne={}));var _r=!1,Nr=!1,j={ID:"solv",LANG:wt.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"2.2.16",MAINNET_SOLANA_VERSION:"2.2.16",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},K={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},_={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},ot={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},x={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",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"},C={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"},N=r((t=K.ROOT)=>{let e=t===K.ROOT?K.ROOT:t,o=`${e}/${C.MAINNET_VALIDATOR_KEY}`,n=`${e}/${C.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${C.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${C.TESTNET_VALIDATOR_KEY}`,i=`${e}/${C.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${C.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),ft=r((t=!0)=>{let e=t?`${K.ROOT}/${C.TESTNET_VALIDATOR_KEY}`:`${K.ROOT}/${C.MAINNET_VALIDATOR_KEY}`,o=t?`${K.ROOT}/${C.TESTNET_VALIDATOR_VOTE_KEY}`:`${K.ROOT}/${C.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${K.ROOT}/${ot.LOG}`,s=_.ACCOUNTS,a=_.LEDGER,i=_.SNAPSHOTS,c=`${K.ROOT}/${ot.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:c,snapshots:i}},"startupScriptPaths");var q="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",Ao="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",vr="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Or=9,rt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Rr="So11111111111111111111111111111111111111112",kr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Cr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Ar;(function(t){t[t.ELSOL=rt]="ELSOL",t[t.SOL=Rr]="SOL",t[t.USDC=kr]="USDC",t[t.EPCT=Cr]="EPCT"})(Ar||(Ar={}));var wr;(function(t){t.V6_BASE_URL="https://quote-api.jup.ag/v6",t.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",t.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(wr||(wr={}));var yu={[Rr]:9,[rt]:9,[kr]:6,[Cr]:6},ve="/home/solv/currentEpoch.json",wo=.5,Oe="https://api.testnet.solana.com";import{spawnSync as _o}from"child_process";var Ir=r(()=>{_o("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=j.NODE_VERSION;_o(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),_o("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var ct={version:"2.1.21",tag:"v2.1.21",commissionBps:1e3,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf/",shredReceiverAddr:"64.130.50.14:1002"},No={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"}};import{spawnSync as Pr}from"child_process";var Wt=r((t=ct.tag,e=!1)=>{e?Pr(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${t}-mod/installer)"`,{shell:!0,stdio:"inherit"}):Pr(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${t}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Pi,writeFile as Li}from"fs/promises";import{homedir as xi}from"os";var qt=r(async t=>{let o=`${xi()}/${ot.JITO_CONFIG}`,s={...JSON.parse(await Pi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Li(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Lr}from"child_process";import Vi from"inquirer";var xr=r((t,e=!0)=>{let o=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",n=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";Lr(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${o}`,{shell:!0,stdio:"inherit"});let a=`solana vote-update-commission ${n} ${t} ${o} --keypair ${o}`;Lr(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Vr=r(async()=>await Vi.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Qt}from"@skeet-framework/utils";import $i from"chalk";import Di from"inquirer";var $r=r(async()=>{let t=await Di.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Qt("sudo ufw delete allow 8899/udp"),await Qt("sudo ufw delete allow 8899/tcp"),await Qt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Qt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Qt("sudo ufw reload"),console.log($i.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var bi=r(()=>Zo,"getSolvVersion"),Pt=bi;import{readFile as Mi,writeFile as Hi}from"fs/promises";import{existsAsync as Fi}from"@skeet-framework/utils";var vo;(function(t){t.EN="en",t.JA="ja"})(vo||(vo={}));var ju=Object.values(vo),f;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(f||(f={}));var Dr=Object.values(f),E;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(E||(E={}));var br=Object.values(E),T;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(T||(T={}));var Bu=Object.values(T).filter(t=>t!=="none"),D;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})(D||(D={}));var Kr=Object.values(D).filter(t=>t!=="none"),B;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(B||(B={}));var J="2.2.16",U="2.2.16",_t="2.2.16",Xt="2.2.16",Ur="2.2.16",Nt="2.2.16";var Mr="20.17.0",Re="0.505.20216",ke="0.505.20216";var Ui={NETWORK:f.TESTNET,NODE_TYPE:E.RPC,VALIDATOR_TYPE:T.NONE,RPC_TYPE:D.AGAVE,MNT_DISK_TYPE:B.TRIPLE,TESTNET_SOLANA_VERSION:J,MAINNET_SOLANA_VERSION:U,NODE_VERSION:Mr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:sr,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:ir,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:w,ACCOUNTS_PATH:Ct,SNAPSHOTS_PATH:tt,MOD:!1},lt=Ui;import{homedir as Yi}from"os";var ji=r(async()=>{let e=`${Yi()}/${ye}`;return await Fi(e)?JSON.parse(await Mi(e,"utf-8")):(console.log("Creating default config file at",e),await Hi(e,JSON.stringify(lt,null,2)),lt)},"readConfig"),V=ji;import Bi from"node-fetch";var Q=r(async t=>{try{let e=await V();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
- Please set DISCORD_WEBHOOK_URL in .env`);let o={content:t,username:"\u{1FA84} Solv Notifier"};return(await Bi(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(o),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${t}`}),!1}},"sendDiscord");import{spawnSync as Xi}from"child_process";import{Connection as Hr}from"@solana/web3.js";var Zt=r(async(t,e,o=!1,n=200)=>{let s={pubkey:e,isActive:!1,reason:""};try{let a=o?new Hr("https://api.testnet.solana.com"):new Hr(t,"confirmed"),i=await a.getVoteAccounts(),c=i.current.find(u=>u.votePubkey===e);if(!c)return i.delinquent.find(p=>p.votePubkey===e)?(s.isActive=!1,s.reason="Validator is delinquent.",s):(s.isActive=!1,s.reason="Validator is not found in both current and delinquent lists.",s);if(i=await a.getVoteAccounts(),c=i.current.find(u=>u.votePubkey===e),!c)return s.isActive=!1,s.reason="Validator is not found in the current list.",s;let l=c.lastVote,d=await a.getSlot()-l;return d>n?(s.isActive=!1,s.reason=`Validator has not voted for ${d} slots.`,s):(s.isActive=!0,s.reason="Validator is active and voting.",s)}catch(a){return console.error(a),s.isActive=!1,s.reason="Failed to check validator status.",s}},"isValidatorActive");import{spawnSync as Ji}from"child_process";var v=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=Ji(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Gi=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),M=Gi;import{sendDiscord as zi}from"@skeet-framework/utils";var Fr=60,Wi=r(async t=>{try{let e=t.NETWORK===f.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=N(),a=v(e?n:o),i=await Zt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Fr){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Fr} minutes!
2
+ var Oi=Object.defineProperty;var r=(t,e)=>Oi(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as Jd}from"commander";var or="5.2.12";var rr={name:"@gabrielhicks/solv",version:or,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"}};var ye=rr.version;var Qt="https://validators.solutions";var Te="solv4.config.json";var At="identity.json",wt="unstaked-identity.json",nr="relayer-keypair.json",ki="mainnet-validator-keypair.json",Ci="mainnet-vote-account-keypair.json",Ii="mainnet-authority-keypair.json",Pi="testnet-validator-keypair.json",Li="testnet-vote-account-keypair.json",xi="testnet-authority-keypair.json",P="/home/solv",k=`${P}/${At}`,ru=`${P}/${wt}`,K=`${P}/${ki}`,Ee=`${P}/${Ci}`,nu=`${P}/${Ii}`,x=`${P}/${Pi}`,sr=`${P}/${Li}`,su=`${P}/${xi}`,Z=`${P}/solana-validator.log`,tt=P+"/start-validator.sh",w="/mnt/ledger",It="/mnt/accounts",et="/mnt/snapshots",ar="solana-validator",ir="agave-validator",lr="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var ge=3,cr="https://api.testnet.solana.com",mr="https://api.mainnet-beta.solana.com",pr="https://verify.validators.solutions/solv-migrate",dr="https://jup.validators.solutions/v1/jup",Ao;(function(t){t.SOL="SOL",t.USDC="USDC",t.elSOL="elSOL",t.JitoSOL="JitoSOL",t.mSOL="mSOL",t.bSOL="bSOL",t.EPCT="EPCT",t.JUP="JUP",t.BONK="BONK",t.JTO="JTO"})(Ao||(Ao={}));var ur=Object.values(Ao),Ae="So11111111111111111111111111111111111111112",we="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",wo="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var fr="SOLV420",hr={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as Di}from"child_process";import{spawnSync as Sr}from"node:child_process";var Vi=r((t,e=!1)=>{e?Sr(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${t}-mod/installer)"`,{shell:!0,stdio:"inherit"}):Sr(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Pt=Vi;var yr="agave-validator",$i=r(()=>{try{return yr}catch(t){return console.error(t),yr}},"getSolanaCLI"),ot=$i;var _e=r(async(t,e=!1)=>{Pt(t,e)},"updateVersion"),Ne=r(async(t,e=!1,o=10)=>{let n=ot(),s=`${n} --ledger ${w} exit --max-delinquent-stake ${t} --monitor --min-idle-time ${o}`;e&&(s=`${n} --ledger ${w} exit --max-delinquent-stake ${t} --min-idle-time ${o}`),Di(s,{shell:!0,stdio:"inherit"})},"monitorUpdate");import cn from"chalk";var _t;(function(t){t.EN="en",t.JA="ja"})(_t||(_t={}));var Tr;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE",t[t.TRIPLE=2]="TRIPLE"})(Tr||(Tr={}));var Er;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(Er||(Er={}));var ft;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(ft||(ft={}));var gr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(gr||(gr={}));var Ar;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(Ar||(Ar={}));var wr;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(wr||(wr={}));var _r;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(_r||(_r={}));var ve;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(ve||(ve={}));var Oe;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Oe||(Oe={}));var Or=!1,Rr=!1,kr=!1,Cr=!1,j={ID:"solv",LANG:_t.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"2.2.16",MAINNET_SOLANA_VERSION:"2.2.16",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},b={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},_={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},rt={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},C={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"},I={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"},N=r((t=b.ROOT)=>{let e=t===b.ROOT?b.ROOT:t,o=`${e}/${I.MAINNET_VALIDATOR_KEY}`,n=`${e}/${I.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${I.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${I.TESTNET_VALIDATOR_KEY}`,i=`${e}/${I.TESTNET_VALIDATOR_VOTE_KEY}`,l=`${e}/${I.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:l}},"getAllKeyPaths"),ht=r((t=!0)=>{let e=t?`${b.ROOT}/${I.TESTNET_VALIDATOR_KEY}`:`${b.ROOT}/${I.MAINNET_VALIDATOR_KEY}`,o=t?`${b.ROOT}/${I.TESTNET_VALIDATOR_VOTE_KEY}`:`${b.ROOT}/${I.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${b.ROOT}/${rt.LOG}`,s=_.ACCOUNTS,a=_.LEDGER,i=_.SNAPSHOTS,l=`${b.ROOT}/${rt.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:l,snapshots:i}},"startupScriptPaths");var Q="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",_o="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",Ir="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Pr=9,nt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Lr="So11111111111111111111111111111111111111112",xr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Vr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Nr;(function(t){t[t.ELSOL=nt]="ELSOL",t[t.SOL=Lr]="SOL",t[t.USDC=xr]="USDC",t[t.EPCT=Vr]="EPCT"})(Nr||(Nr={}));var vr;(function(t){t.V6_BASE_URL="https://quote-api.jup.ag/v6",t.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",t.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(vr||(vr={}));var gu={[Lr]:9,[nt]:9,[xr]:6,[Vr]:6},Re="/home/solv/currentEpoch.json",No=.5,ke="https://api.testnet.solana.com";import{spawnSync as vo}from"child_process";var $r=r(()=>{vo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=j.NODE_VERSION;vo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),vo("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var ct={version:"2.1.21",tag:"v2.1.21",commissionBps:1e3,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf/",shredReceiverAddr:"64.130.50.14:1002"},Oo={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"}};import{spawnSync as Dr}from"child_process";var Ce=r((t=ct.tag,e=!1)=>{e?Dr(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${t}-mod/installer)"`,{shell:!0,stdio:"inherit"}):Dr(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${t}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Ki,writeFile as bi}from"fs/promises";import{homedir as Ui}from"os";var Xt=r(async t=>{let o=`${Ui()}/${rt.JITO_CONFIG}`,s={...JSON.parse(await Ki(o,"utf8")),...t},a=JSON.stringify(s,null,2);await bi(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Kr}from"child_process";import Mi from"inquirer";var br=r((t,e=!0)=>{let o=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",n=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";Kr(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${o}`,{shell:!0,stdio:"inherit"});let a=`solana vote-update-commission ${n} ${t} ${o} --keypair ${o}`;Kr(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Ur=r(async()=>await Mi.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Zt}from"@skeet-framework/utils";import Hi from"chalk";import Fi from"inquirer";var Mr=r(async()=>{let t=await Fi.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Zt("sudo ufw delete allow 8899/udp"),await Zt("sudo ufw delete allow 8899/tcp"),await Zt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Zt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Zt("sudo ufw reload"),console.log(Hi.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Yi=r(()=>or,"getSolvVersion"),Lt=Yi;import{readFile as Gi,writeFile as Ji}from"fs/promises";import{existsAsync as zi}from"@skeet-framework/utils";var Ro;(function(t){t.EN="en",t.JA="ja"})(Ro||(Ro={}));var zu=Object.values(Ro),f;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(f||(f={}));var Hr=Object.values(f),A;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(A||(A={}));var Fr=Object.values(A),T;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(T||(T={}));var Wu=Object.values(T).filter(t=>t!=="none"),D;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})(D||(D={}));var Yr=Object.values(D).filter(t=>t!=="none"),B;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(B||(B={}));var G="2.2.16",U="2.2.16",Nt="2.2.16",te="2.2.16",jr="2.2.16",vt="2.2.16";var Br="20.17.0",xt="0.505.20216",Vt="0.505.20216";var Bi={NETWORK:f.TESTNET,NODE_TYPE:A.RPC,VALIDATOR_TYPE:T.NONE,RPC_TYPE:D.AGAVE,MNT_DISK_TYPE:B.TRIPLE,TESTNET_SOLANA_VERSION:G,MAINNET_SOLANA_VERSION:U,NODE_VERSION:Br,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:lr,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:mr,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:w,ACCOUNTS_PATH:It,SNAPSHOTS_PATH:et,MOD:!1},mt=Bi;import{homedir as Wi}from"os";var qi=r(async()=>{let e=`${Wi()}/${Te}`;return await zi(e)?JSON.parse(await Gi(e,"utf-8")):(console.log("Creating default config file at",e),await Ji(e,JSON.stringify(mt,null,2)),mt)},"readConfig"),V=qi;import Qi from"node-fetch";var z=r(async t=>{try{let e=await V();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
+ Please set DISCORD_WEBHOOK_URL in .env`);let o={content:t,username:"\u{1FA84} Solv Notifier"};return(await Qi(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(o),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${t}`}),!1}},"sendDiscord");import{spawnSync as nl}from"child_process";import{Connection as Gr}from"@solana/web3.js";var ee=r(async(t,e,o=!1,n=200)=>{let s={pubkey:e,isActive:!1,reason:""};try{let a=o?new Gr("https://api.testnet.solana.com"):new Gr(t,"confirmed"),i=await a.getVoteAccounts(),l=i.current.find(u=>u.votePubkey===e);if(!l)return i.delinquent.find(p=>p.votePubkey===e)?(s.isActive=!1,s.reason="Validator is delinquent.",s):(s.isActive=!1,s.reason="Validator is not found in both current and delinquent lists.",s);if(i=await a.getVoteAccounts(),l=i.current.find(u=>u.votePubkey===e),!l)return s.isActive=!1,s.reason="Validator is not found in the current list.",s;let c=l.lastVote,d=await a.getSlot()-c;return d>n?(s.isActive=!1,s.reason=`Validator has not voted for ${d} slots.`,s):(s.isActive=!0,s.reason="Validator is active and voting.",s)}catch(a){return console.error(a),s.isActive=!1,s.reason="Failed to check validator status.",s}},"isValidatorActive");import{spawnSync as Xi}from"child_process";var v=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=Xi(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Zi=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),M=Zi;import{sendDiscord as tl}from"@skeet-framework/utils";var Jr=60,el=r(async t=>{try{let e=t.NETWORK===f.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=N(),a=v(e?n:o),i=await ee(t.RPC_URL,a,e),l=0;for(;!i.isActive;){if(l>=Jr){console.log("Max retries reached, exiting...");let c=`\u26A0\uFE0F Validator is not active for ${Jr} minutes!
4
4
  Account: ${i.pubkey}
5
5
  Reason: ${i.reason}
6
6
  Message: Max retries reached, exiting catchup check...
7
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await zi(l),!1}console.log("Waiting for validator to catch up..."),await M(60*1e3),i=await Zt(t.RPC_URL,a,e),c++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Yr=Wi;import{spawnSync as qi}from"node:child_process";var Qi=r(()=>{let{stdout:t}=qi("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),Ce=Qi;var Zi=r(async t=>{let e=t.NETWORK===f.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=N(),s=e?o:n,a=Ce(),i=e?_r:Nr;i=i&&t.AUTO_RESTART;let c=v(s),l=`**${c}** updated solv to **${Pt()}** with Solana version **${a}**`;if(await Q(l),i){let m=`Restarting **${c}**`;await Q(m);try{Xi("solv update -b",{stdio:"inherit",shell:!0})}catch{let y=`Error restarting **${c}**`;return await Q(y),!1}let d=`**${c}** has restarted, catching up...`;await Q(d),await M(180*1e3);let u=await Yr(t);if(u){let p=`**${c}** has caught up!`;await Q(p)}return u}return!0},"autoUpdate"),jr=Zi;import{homedir as tc}from"os";import{readFile as ec,writeFile as Br}from"fs/promises";import{existsAsync as oc}from"@skeet-framework/utils";var O=r(async t=>{let o=`${tc()}/${ye}`;await oc(o)||(console.log("Creating default config file at",o),await Br(o,JSON.stringify(lt,null,2)));let s={...JSON.parse(await ec(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Br(o,a)},"updateDefaultConfig");var rc={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"},Ie=rc;var nc={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:"},Jr=nc;var sc={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}"}},Pe=sc;var ac={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"}},Gr=ac;var Le=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],xe=[[],[") 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 zr=[") \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"],Wr=[[],[") \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 ic={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"}},Ve=ic;var cc={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"}},qr=cc;var $e=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Qr=[") \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 lc=r(t=>{let e={cmds:Ie,subCmds:Ve,logs:Pe,installer:Le,installerSub:xe,clientCmds:$e};switch(t){case wt.EN:e={cmds:Ie,subCmds:Ve,logs:Pe,installer:Le,installerSub:xe,clientCmds:$e};break;case wt.JA:e={cmds:Jr,subCmds:qr,logs:Gr,installer:zr,installerSub:Wr,clientCmds:Qr};break;default:e={cmds:Ie,subCmds:Ve,logs:Pe,installer:Le,installerSub:xe,clientCmds:$e}}return e},"readLocale"),Xr=lc;import{existsSync as uc,readFileSync as fc,writeFileSync as Zr}from"fs";import{readFileSync as mc,writeFileSync as pc}from"fs";import{homedir as dc}from"os";var Lt=r(t=>{let o=`${dc()}/${ot.CONFIG}`,s={...JSON.parse(mc(o,"utf8")),...t},a=JSON.stringify(s,null,2);pc(o,a)},"updateSolvConfig");import{homedir as hc}from"os";var tn=r(()=>{let e=`${hc()}/${ot.CONFIG}`;uc(e)||(Zr(e,JSON.stringify(j,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(fc(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Zr(e,JSON.stringify(j,null,2)),o=j}let n=Xr(o.LANG);return o.RPC_URL||(o.RPC_URL=j.RPC_URL,Lt({RPC_URL:j.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,Lt({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",Lt({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");import{spawnSync as en}from"node:child_process";var xt=r((t=!1,e="45",o=tt,n=U,s=t?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",a=!1)=>{try{let i=`docker run -it --rm -v ${o}:${o} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${o} --min_download_speed ${e} --version ${n} --rpc ${s}`;if(t&&a){en(`wget --trust-server-names https://snapshots.avorio.network/testnet/snapshot.tar.bz2 https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2 && for file in snapshot-* incremental-snapshot-*; do mv "$file" "$(echo "$file" | sed 's/\\?.*$//')"; done`,{shell:!0,stdio:"inherit",cwd:o});return}en(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");var rn=r(t=>{let e=t.NETWORK===f.TESTNET,o=t.NODE_TYPE===E.RPC,n=t.VALIDATOR_TYPE===T.JITO,s=t.VALIDATOR_TYPE===T.FRANKENDANCER,a=t.AUTO_RESTART,i=t.MOD,c=10;a&&!e&&(c=30);let l=e?J:U;n&&(l=Xt,e&&(l=_t)),s&&(l=ke,e&&(l=Re)),o&&(l=Nt,n&&(l=Ur)),h.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${l}`,l).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 m=>{let d=Pt(),u=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(on.white(`Current solv version: ${d}`)),m.auto){await jr(t);return}if(m.migrateConfig){let p=tn().config,y=B.TRIPLE;p.DISK_TYPES===0?y=B.DOUBLE:p.DISK_TYPES===1?y=B.SINGLE:y=B.TRIPLE;let A=p.SOLANA_NETWORK===ut.TESTNET,S=p.SOLV_TYPE===_e.RPC_NODE,g=p.MAINNET_TYPE===Ne.JITO_MEV,$={NETWORK:A?f.TESTNET:f.MAINNET,NODE_TYPE:S?E.RPC:E.VALIDATOR,MNT_DISK_TYPE:y,RPC_TYPE:S?D.JITO:D.NONE,VALIDATOR_TYPE:g?T.JITO:A?T.AGAVE:T.SOLANA,TESTNET_SOLANA_VERSION:p.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:p.MAINNET_SOLANA_VERSION,NODE_VERSION:p.NODE_VERSION,TESTNET_DELINQUENT_STAKE:p.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:p.MAINNET_DELINQUENT_STAKE,COMMISSION:p.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:p.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:p.STAKE_ACCOUNT,HARVEST_ACCOUNT:p.HARVEST_ACCOUNT,IS_MEV_MODE:p.IS_MEV_MODE,RPC_URL:p.RPC_URL,KEYPAIR_PATH:p.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:p.DISCORD_WEBHOOK_URL,AUTO_UPDATE:p.AUTO_UPDATE,AUTO_RESTART:p.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:p.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await O($)}if(m.config){if(await O({TESTNET_SOLANA_VERSION:J,MAINNET_SOLANA_VERSION:U}),n){let p=e?_t:Xt;await qt({version:p,tag:`v${p}`})}console.log(on.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(m.firewall){await $r();return}if(m.background){let p=m.version;if(await O({TESTNET_SOLANA_VERSION:J,MAINNET_SOLANA_VERSION:U}),n){Wt(`v${p}`,m.mod||i),await qt({version:p,tag:`v${p}`}),await we(u,!0,c);return}if(e&&xt(e,"10",t.SNAPSHOTS_PATH,J),s){Wt(`v${p}`,m.mod||i),await we(u,!0,c);return}await Ae(p,m.mod||i),await we(e?5:5,!0,c);return}else if(m.commission){let p=await Vr();xr(p.commission,e)}else Ir()})},"updateCommands");import{spawnSync as yc}from"node:child_process";var nn=r(t=>{try{let{log:e}=ft(),o=`tail -f ${e}`;t.error?o+=" | grep '\\(WARN\\|ERR\\)'":t.info?o+=" | grep INFO":t.warning&&(o+=" | grep WARN"),console.log(o);let n=yc(o,{shell:!0,stdio:"inherit"});if(n.error)throw n.error;n.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):n.status!==0&&(console.error(`Child process exited with code ${n.status}`),process.exit(n.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var sn=r(()=>{h.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(t=>{nn(t)})},"logCommands");import pt from"chalk";import{spawnSync as Sc}from"child_process";import{homedir as Tc}from"os";var De=r(t=>{let e=Tc(),o=N(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=ut.TESTNET,c=t.COMMISSION;t.NETWORK===f.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=ut.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===f.TESTNET&&(l=ut.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;Sc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as be}from"child_process";import{existsSync as an,readdirSync as gc,rmSync as Ec}from"fs";import{homedir as Ac}from"os";import cn from"path";var Ke=r(t=>{let e=[],o=0;t.NODE_TYPE===E.RPC&&(e=[C.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===f.TESTNET?(e=[C.TESTNET_VALIDATOR_KEY,C.TESTNET_VALITATOR_AUTHORITY_KEY,C.TESTNET_VALIDATOR_VOTE_KEY,C.MAINNET_VALIDATOR_KEY,C.MAINNET_VALITATOR_AUTHORITY_KEY,C.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[C.MAINNET_VALIDATOR_KEY,C.MAINNET_VALITATOR_AUTHORITY_KEY,C.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;be(n,{shell:!0,stdio:"ignore"});let s=gc("./").filter(l=>l.endsWith("SV.json")),a=Ac(),i=cn.join(a,"unstaked-identity.json");an(i)&&be(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=cn.join(a,e[c]);if(c++,an(m)){console.log(`${m} is already exist!`),Ec(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;be(d,{shell:!0,stdio:"inherit"})}be("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${a}`)},"createSolvKeyPairs");import{spawnSync as mn}from"child_process";var wc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await tl(c),!1}console.log("Waiting for validator to catch up..."),await M(60*1e3),i=await ee(t.RPC_URL,a,e),l++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),zr=el;import{spawnSync as ol}from"node:child_process";var rl=r(()=>{let{stdout:t}=ol("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),Ie=rl;var sl=r(async t=>{let e=t.NETWORK===f.MAINNET,o=t.VALIDATOR_TYPE===T.FRANKENDANCER,{mainnetValidatorKey:n,testnetValidatorKey:s}=N(),a=e?n:s,i=Ie(),l=!1;o?l=e?kr:Cr:l=e?Or:Rr,l=l&&t.AUTO_RESTART;let c=v(a),m=`**${c}** updated solv to **${Lt()}** with Solana version **${i}**`;if(await z(m),l){let d=`Restarting **${c}**`;await z(d);try{nl("solv update -b",{stdio:"inherit",shell:!0})}catch(S){let g=`Error restarting **${c}**: ${S?.message||"Unknown error"}`;return await z(g),!1}let u=`**${c}** has restarted, catching up...`;await z(u),await M(180*1e3);let p=await zr(t);if(p){let S=`**${c}** has caught up!`;await z(S)}else{let S=`**${c}** failed to catch up after update`;await z(S)}return p}return!0},"autoUpdate"),Wr=sl;import{homedir as al}from"os";import{readFile as il,writeFile as qr}from"fs/promises";import{existsAsync as ll}from"@skeet-framework/utils";var O=r(async t=>{let o=`${al()}/${Te}`;await ll(o)||(console.log("Creating default config file at",o),await qr(o,JSON.stringify(mt,null,2)));let s={...JSON.parse(await il(o,"utf8")),...t},a=JSON.stringify(s,null,2);await qr(o,a)},"updateDefaultConfig");var cl={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"},Pe=cl;var ml={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:"},Qr=ml;var pl={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}"}},Le=pl;var dl={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"}},Xr=dl;var xe=[") 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 Zr=[") \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"],tn=[[],[") \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 ul={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"}},$e=ul;var fl={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"}},en=fl;var De=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var on=[") \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 hl=r(t=>{let e={cmds:Pe,subCmds:$e,logs:Le,installer:xe,installerSub:Ve,clientCmds:De};switch(t){case _t.EN:e={cmds:Pe,subCmds:$e,logs:Le,installer:xe,installerSub:Ve,clientCmds:De};break;case _t.JA:e={cmds:Qr,subCmds:en,logs:Xr,installer:Zr,installerSub:tn,clientCmds:on};break;default:e={cmds:Pe,subCmds:$e,logs:Le,installer:xe,installerSub:Ve,clientCmds:De}}return e},"readLocale"),rn=hl;import{existsSync as El,readFileSync as gl,writeFileSync as nn}from"fs";import{readFileSync as Sl,writeFileSync as yl}from"fs";import{homedir as Tl}from"os";var $t=r(t=>{let o=`${Tl()}/${rt.CONFIG}`,s={...JSON.parse(Sl(o,"utf8")),...t},a=JSON.stringify(s,null,2);yl(o,a)},"updateSolvConfig");import{homedir as Al}from"os";var sn=r(()=>{let e=`${Al()}/${rt.CONFIG}`;El(e)||(nn(e,JSON.stringify(j,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(gl(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),nn(e,JSON.stringify(j,null,2)),o=j}let n=rn(o.LANG);return o.RPC_URL||(o.RPC_URL=j.RPC_URL,$t({RPC_URL:j.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,$t({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",$t({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");import{spawnSync as an}from"node:child_process";var Dt=r((t=!1,e="45",o=et,n=U,s=t?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",a=!1)=>{try{let i=`docker run -it --rm -v ${o}:${o} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${o} --min_download_speed ${e} --version ${n} --rpc ${s}`;if(t&&a){an(`wget --trust-server-names https://snapshots.avorio.network/testnet/snapshot.tar.bz2 https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2 && for file in snapshot-* incremental-snapshot-*; do mv "$file" "$(echo "$file" | sed 's/\\?.*$//')"; done`,{shell:!0,stdio:"inherit",cwd:o});return}an(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");import{spawnSync as st}from"child_process";var ln=r(async(t,e,o=!1)=>{let n=t.NETWORK===f.TESTNET,s=e||(n?xt:Vt);o||t.MOD?(st("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),st(`git -C /home/solv/firedancer checkout v${s}-mod`,{shell:!0,stdio:"inherit"}),st("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})):(st("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),st(`git -C /home/solv/firedancer checkout v${s}`,{shell:!0,stdio:"inherit"}),st("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),st("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("sudo systemctl restart firedancer",{shell:!0,stdio:"inherit"}),st("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");var mn=r(t=>{let e=t.NETWORK===f.TESTNET,o=t.NODE_TYPE===A.RPC,n=t.VALIDATOR_TYPE===T.JITO,s=t.VALIDATOR_TYPE===T.FRANKENDANCER,a=t.AUTO_RESTART,i=t.MOD,l=10;a&&!e&&(l=30);let c=e?G:U;n&&(c=te,e&&(c=Nt)),s&&(c=Vt,e&&(c=xt)),o&&(c=vt,n&&(c=jr)),h.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${c}`,c).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 m=>{let d=Lt(),u=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(cn.white(`Current solv version: ${d}`)),m.auto){await Wr(t);return}if(m.migrateConfig){let p=sn().config,S=B.TRIPLE;p.DISK_TYPES===0?S=B.DOUBLE:p.DISK_TYPES===1?S=B.SINGLE:S=B.TRIPLE;let g=p.SOLANA_NETWORK===ft.TESTNET,y=p.SOLV_TYPE===ve.RPC_NODE,E=p.MAINNET_TYPE===Oe.JITO_MEV,$={NETWORK:g?f.TESTNET:f.MAINNET,NODE_TYPE:y?A.RPC:A.VALIDATOR,MNT_DISK_TYPE:S,RPC_TYPE:y?D.JITO:D.NONE,VALIDATOR_TYPE:E?T.JITO:g?T.AGAVE:T.SOLANA,TESTNET_SOLANA_VERSION:p.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:p.MAINNET_SOLANA_VERSION,NODE_VERSION:p.NODE_VERSION,TESTNET_DELINQUENT_STAKE:p.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:p.MAINNET_DELINQUENT_STAKE,COMMISSION:p.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:p.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:p.STAKE_ACCOUNT,HARVEST_ACCOUNT:p.HARVEST_ACCOUNT,IS_MEV_MODE:p.IS_MEV_MODE,RPC_URL:p.RPC_URL,KEYPAIR_PATH:p.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:p.DISCORD_WEBHOOK_URL,AUTO_UPDATE:p.AUTO_UPDATE,AUTO_RESTART:p.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:p.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await O($)}if(m.config){if(await O({TESTNET_SOLANA_VERSION:G,MAINNET_SOLANA_VERSION:U}),n){let p=e?Nt:te;await Xt({version:p,tag:`v${p}`})}console.log(cn.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(m.firewall){await Mr();return}if(m.background){let p=m.version;if(await O({TESTNET_SOLANA_VERSION:G,MAINNET_SOLANA_VERSION:U}),n){Ce(`v${p}`,m.mod||i),await Xt({version:p,tag:`v${p}`}),await Ne(u,!0,l);return}if(e&&Dt(e,"10",t.SNAPSHOTS_PATH,G),s){await ln(t,p,m.mod||i),await Ne(u,!0,l);return}await _e(p,m.mod||i),await Ne(e?5:5,!0,l);return}else if(m.commission){let p=await Ur();br(p.commission,e)}else $r()})},"updateCommands");import{spawnSync as wl}from"node:child_process";var pn=r(t=>{try{let{log:e}=ht(),o=`tail -f ${e}`;t.error?o+=" | grep '\\(WARN\\|ERR\\)'":t.info?o+=" | grep INFO":t.warning&&(o+=" | grep WARN"),console.log(o);let n=wl(o,{shell:!0,stdio:"inherit"});if(n.error)throw n.error;n.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):n.status!==0&&(console.error(`Child process exited with code ${n.status}`),process.exit(n.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var dn=r(()=>{h.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(t=>{pn(t)})},"logCommands");import dt from"chalk";import{spawnSync as _l}from"child_process";import{homedir as Nl}from"os";var Ke=r(t=>{let e=Nl(),o=N(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=ft.TESTNET,l=t.COMMISSION;t.NETWORK===f.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=ft.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${l} - ${i}`);let c=t.RPC_URL||i;t.NETWORK===f.TESTNET&&(c=ft.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${l} --url ${c} --keypair ${s}`;_l(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as be}from"child_process";import{existsSync as un,readdirSync as vl,rmSync as Ol}from"fs";import{homedir as Rl}from"os";import fn from"path";var Ue=r(t=>{let e=[],o=0;t.NODE_TYPE===A.RPC&&(e=[I.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===f.TESTNET?(e=[I.TESTNET_VALIDATOR_KEY,I.TESTNET_VALITATOR_AUTHORITY_KEY,I.TESTNET_VALIDATOR_VOTE_KEY,I.MAINNET_VALIDATOR_KEY,I.MAINNET_VALITATOR_AUTHORITY_KEY,I.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[I.MAINNET_VALIDATOR_KEY,I.MAINNET_VALITATOR_AUTHORITY_KEY,I.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;be(n,{shell:!0,stdio:"ignore"});let s=vl("./").filter(c=>c.endsWith("SV.json")),a=Rl(),i=fn.join(a,"unstaked-identity.json");un(i)&&be(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let l=0;for(let c of s){let m=fn.join(a,e[l]);if(l++,un(m)){console.log(`${m} is already exist!`),Ol(c,{recursive:!0});continue}let d=`mv ${c} ${m}`;be(d,{shell:!0,stdio:"inherit"})}be("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${a}`)},"createSolvKeyPairs");import{spawnSync as Sn}from"child_process";var kl=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
8
8
  Description=Jupiter API Service Instance
9
9
  After=network.target
10
10
 
@@ -19,19 +19,19 @@ Environment=RUST_LOG=info
19
19
  Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
20
20
 
21
21
  [Install]
22
- WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),ln=wc;import _c from"inquirer";import Nc from"chalk";var vc=r(async()=>{let t=await _c.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);mn(`sudo apt-get install unzip wget -y
22
+ WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),hn=kl;import Cl from"inquirer";import Il from"chalk";var Pl=r(async()=>{let t=await Cl.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);Sn(`sudo apt-get install unzip wget -y
23
23
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
24
24
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
25
25
  chmod +x jupiter-swap-api
26
- rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=ln(t.rpcUrl,t.grpcUrl,t.grpcToken);mn(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log(Nc.white(`\u{1F7E2} Jupiter Swap API Setup Completed
26
+ rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=hn(t.rpcUrl,t.grpcUrl,t.grpcToken);Sn(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log(Il.white(`\u{1F7E2} Jupiter Swap API Setup Completed
27
27
 
28
- $ solv jupiter --help`))},"jupiterAPISetup"),pn=vc;import{existsAsync as Oc}from"@skeet-framework/utils";import{readFile as Rc,writeFile as dn}from"fs/promises";import{homedir as kc}from"os";import Cc from"path";var mt=r(async()=>{let t=kc(),e=Cc.join(t,ot.JITO_CONFIG);await Oc(e)||(await dn(e,JSON.stringify(ct,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await Rc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await dn(e,JSON.stringify(ct,null,2)),o=ct}return o},"readOrCreateJitoConfig");import{spawnSync as Ic}from"child_process";var te=r(()=>{Ic("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import ee from"chalk";import Ue from"inquirer";import Pc from"inquirer";var un=r(async()=>{let e=Object.keys(No),o=await Pc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=No[n];return{version:ct.version,tag:ct.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Lc=r(async()=>{try{let t=T.NONE,e=D.AGAVE,o=lt.COMMISSION,n=!1,s=await Ue.prompt([{name:"network",type:"list",message:"Choose Network",choices:Dr,default:f.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:br,default:E.RPC}]);if(s.nodeType===E.VALIDATOR){let c=s.network===f.MAINNET?[T.JITO,T.SOLANA]:[T.AGAVE,T.JITO,T.FRANKENDANCER];t=await Ue.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:T.AGAVE}).then(l=>l.validatorType),e=D.NONE}if(s.nodeType===E.RPC&&(e=await Ue.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Kr,default:D.AGAVE}).then(c=>c.rpcType)),s.nodeType===E.VALIDATOR){let c=await Ue.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${lt.COMMISSION}%)'`,default:lt.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(o=c.commission,n=c.isDummy,t===T.JITO||t===T.FRANKENDANCER){await mt();let l=await un();await qt(l)}}let{network:a,nodeType:i}=s;return console.log(ee.white("Network:",a)),console.log(ee.white("Node Type:",i)),console.log(ee.white("Validator Type:",t)),console.log(ee.white("RPC Type:",e)),i===E.VALIDATOR&&console.log(ee.white("Commission:",o)),await O({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),fn=Lc;import{spawnSync as hn}from"child_process";var oe=r((t=_t,e=!1)=>{if(e){let o=`v${t}-mod`;hn(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${t}-jito`;hn(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/jito-foundation/jito-solana/${o}/installer)"`,{shell:!0,stdio:"inherit"})}},"installJito");var yn=r(()=>`#!/bin/bash
28
+ $ solv jupiter --help`))},"jupiterAPISetup"),yn=Pl;import{existsAsync as Ll}from"@skeet-framework/utils";import{readFile as xl,writeFile as Tn}from"fs/promises";import{homedir as Vl}from"os";import $l from"path";var pt=r(async()=>{let t=Vl(),e=$l.join(t,rt.JITO_CONFIG);await Ll(e)||(await Tn(e,JSON.stringify(ct,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await xl(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await Tn(e,JSON.stringify(ct,null,2)),o=ct}return o},"readOrCreateJitoConfig");import{spawnSync as Dl}from"child_process";var oe=r(()=>{Dl("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import re from"chalk";import Me from"inquirer";import Kl from"inquirer";var En=r(async()=>{let e=Object.keys(Oo),o=await Kl.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=Oo[n];return{version:ct.version,tag:ct.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");var bl=r(async()=>{try{let t=T.NONE,e=D.AGAVE,o=mt.COMMISSION,n=!1,s=await Me.prompt([{name:"network",type:"list",message:"Choose Network",choices:Hr,default:f.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Fr,default:A.RPC}]);if(s.nodeType===A.VALIDATOR){let l=s.network===f.MAINNET?[T.JITO,T.SOLANA]:[T.AGAVE,T.JITO,T.FRANKENDANCER];t=await Me.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:l,default:T.AGAVE}).then(c=>c.validatorType),e=D.NONE}if(s.nodeType===A.RPC&&(e=await Me.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Yr,default:D.AGAVE}).then(l=>l.rpcType)),s.nodeType===A.VALIDATOR){let l=await Me.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${mt.COMMISSION}%)'`,default:mt.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(o=l.commission,n=l.isDummy,t===T.JITO||t===T.FRANKENDANCER){await pt();let c=await En();await Xt(c)}}let{network:a,nodeType:i}=s;return console.log(re.white("Network:",a)),console.log(re.white("Node Type:",i)),console.log(re.white("Validator Type:",t)),console.log(re.white("RPC Type:",e)),i===A.VALIDATOR&&console.log(re.white("Commission:",o)),await O({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),gn=bl;import{spawnSync as An}from"child_process";var ne=r((t=Nt,e=!1)=>{if(e){let o=`v${t}-mod`;An(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${t}-jito`;An(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/jito-foundation/jito-solana/${o}/installer)"`,{shell:!0,stdio:"inherit"})}},"installJito");var wn=r(()=>`#!/bin/bash
29
29
  exec agave-validator \\
30
30
  --identity ${k} \\
31
- --log ${X} \\
32
- --accounts ${Ct} \\
31
+ --log ${Z} \\
32
+ --accounts ${It} \\
33
33
  --ledger ${w} \\
34
- --snapshots ${tt} \\
34
+ --snapshots ${et} \\
35
35
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
36
36
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
37
37
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -64,13 +64,13 @@ exec agave-validator \\
64
64
  --wal-recovery-mode skip_any_corrupted_record \\
65
65
  --use-snapshot-archives-at-startup when-newest \\
66
66
  --limit-ledger-size 400000000 \\
67
- `,"startJitoRPCScript");import{existsAsync as $c}from"@skeet-framework/utils";import{writeFile as Dc}from"fs/promises";import{spawnSync as xc}from"node:child_process";var Vc=r(()=>{let t=`sudo chmod +x ${Z}`;xc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),re=Vc;var Sn=r(()=>`#!/bin/bash
67
+ `,"startJitoRPCScript");import{existsAsync as Hl}from"@skeet-framework/utils";import{writeFile as Fl}from"fs/promises";import{spawnSync as Ul}from"node:child_process";var Ml=r(()=>{let t=`sudo chmod +x ${tt}`;Ul(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),se=Ml;var _n=r(()=>`#!/bin/bash
68
68
  exec agave-validator \\
69
69
  --identity ${k} \\
70
- --log ${X} \\
71
- --accounts ${Ct} \\
70
+ --log ${Z} \\
71
+ --accounts ${It} \\
72
72
  --ledger ${w} \\
73
- --snapshots ${tt} \\
73
+ --snapshots ${et} \\
74
74
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
75
75
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
76
76
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -100,12 +100,12 @@ exec agave-validator \\
100
100
  --wal-recovery-mode skip_any_corrupted_record \\
101
101
  --use-snapshot-archives-at-startup when-newest \\
102
102
  --limit-ledger-size 400000000 \\
103
- `,"startRPCNodeScript");var bc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case D.AGAVE:console.log("Agave RPC Node Setup"),It(t.TESTNET_SOLANA_VERSION),o=Sn();break;case D.JITO:console.log("JITO RPC Node Setup"),oe(_t),o=yn();break;default:console.log("Unknown RPC Node Setup");break}if(await $c(Z)){console.log("Startup script already exists. Skipping...");return}await Dc(Z,o,"utf-8"),re()},"setupRpcNode"),Tn=bc;import{spawnSync as Kc}from"node:child_process";var Uc=r(t=>{Kc(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),ko=Uc;var Co=r((t=1e3,e,o,n,s,a="agave-validator")=>`#!/bin/bash
103
+ `,"startRPCNodeScript");var Yl=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case D.AGAVE:console.log("Agave RPC Node Setup"),Pt(t.TESTNET_SOLANA_VERSION),o=_n();break;case D.JITO:console.log("JITO RPC Node Setup"),ne(Nt),o=wn();break;default:console.log("Unknown RPC Node Setup");break}if(await Hl(tt)){console.log("Startup script already exists. Skipping...");return}await Fl(tt,o,"utf-8"),se()},"setupRpcNode"),Nn=Yl;import{spawnSync as jl}from"node:child_process";var Bl=r(t=>{jl(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),Io=Bl;var Po=r((t=1e3,e,o,n,s,a="agave-validator")=>`#!/bin/bash
104
104
  exec ${a} \\
105
105
  --identity ${k} \\
106
- --vote-account ${Se} \\
107
- --authorized-voter ${b} \\
108
- --log ${X} \\
106
+ --vote-account ${Ee} \\
107
+ --authorized-voter ${K} \\
108
+ --log ${Z} \\
109
109
  --accounts ${s.ACCOUNTS_PATH} \\
110
110
  --ledger ${s.LEDGER_PATH} \\
111
111
  --snapshots ${s.SNAPSHOTS_PATH} \\
@@ -135,12 +135,12 @@ exec ${a} \\
135
135
  --snapshot-interval-slots 0 \\
136
136
  --private-rpc \\
137
137
  --full-rpc-api \\
138
- `,"startJitoValidatorScript");var gn=r((t,e="agave-validator")=>`#!/bin/bash
138
+ `,"startJitoValidatorScript");var vn=r((t,e="agave-validator")=>`#!/bin/bash
139
139
  exec ${e} \\
140
140
  --identity ${k} \\
141
- --vote-account ${Se} \\
142
- --authorized-voter ${b} \\
143
- --log ${X} \\
141
+ --vote-account ${Ee} \\
142
+ --authorized-voter ${K} \\
143
+ --log ${Z} \\
144
144
  --accounts ${t.ACCOUNTS_PATH} \\
145
145
  --ledger ${t.LEDGER_PATH} \\
146
146
  --snapshots ${t.SNAPSHOTS_PATH} \\
@@ -165,12 +165,12 @@ exec ${e} \\
165
165
  --block-verification-method unified-scheduler \\
166
166
  --snapshot-interval-slots 0 \\
167
167
  --private-rpc \\
168
- `,"startMainnetValidatorScript");var Io=r(t=>`#!/bin/bash
168
+ `,"startMainnetValidatorScript");var Lo=r(t=>`#!/bin/bash
169
169
  exec agave-validator \\
170
170
  --identity ${k} \\
171
- --vote-account ${or} \\
172
- --authorized-voter ${L} \\
173
- --log ${X} \\
171
+ --vote-account ${sr} \\
172
+ --authorized-voter ${x} \\
173
+ --log ${Z} \\
174
174
  --accounts ${t.ACCOUNTS_PATH} \\
175
175
  --ledger ${t.LEDGER_PATH} \\
176
176
  --snapshots ${t.SNAPSHOTS_PATH} \\
@@ -194,14 +194,14 @@ exec agave-validator \\
194
194
  --block-production-method central-scheduler-greedy \\
195
195
  --block-verification-method unified-scheduler \\
196
196
  --full-rpc-api \\
197
- `,"startTestnetAgaveValidatorScript");import{existsAsync as En}from"@skeet-framework/utils";import{writeFile as An}from"fs/promises";var Mc=r(async(t,e=!1)=>{let{NETWORK:o,MOD:n}=t;e=n,o===f.MAINNET?(console.log("Mainnet Validator Node Setup"),await Hc(t,e)):o===f.TESTNET?(console.log("Testnet Validator Node Setup"),await Fc(t,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Hc=r(async(t,e=!1)=>{let{VALIDATOR_TYPE:o,MAINNET_SOLANA_VERSION:n,MOD:s}=t;e=s;let a="";switch(o){case T.SOLANA:ko(n),a=gn(t);break;case T.JITO:console.log("JITO Validator Setup for Mainnet");let i=await mt();oe(n,e),a=Co(i.commissionBps,i.relayerUrl,i.blockEngineUrl,i.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await En(Z)){console.log("Startup script already exists. Skipping...");return}await An(Z,a,"utf-8"),re()},"setupMainnetValidator"),Fc=r(async(t,e=!1)=>{let{VALIDATOR_TYPE:o,MOD:n}=t;e=n;let s="";switch(o){case T.SOLANA:ko(t.TESTNET_SOLANA_VERSION),s=Io(t);case T.AGAVE:console.log("Agave Validator Setup for Testnet"),It(t.TESTNET_SOLANA_VERSION,e),s=Io(t);break;case T.JITO:console.log("JITO Validator Setup for Testnet");let a=await mt();oe(t.TESTNET_SOLANA_VERSION,e),s=Co(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Testnet");break}if(await En(Z)){console.log("Startup script already exists. Skipping...");return}await An(Z,s,"utf-8"),re()},"setupTestnetValidator"),wn=Mc;import Gn from"chalk";import{execSync as _n}from"node:child_process";function Nn(t){try{_n(`test -d ${t}`),console.log(`${t} already exists.`)}catch{_n(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(Nn,"createDirectoryIfNotExists");var vn=r(()=>{try{let t=[_.ACCOUNTS,_.LEDGER,_.SNAPSHOTS];for(let e of t)Nn(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as Yc}from"child_process";function jc(){let e=Yc("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
198
- `).slice(1),o=[],n=e.map(S=>S.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c=!1,l="";for(let S of e){let[g,$,R]=S.trim().split(/\s+/);if(!g||!$)continue;let Y=parseInt($,10);if(isNaN(Y))continue;let at=R!==void 0&&R!=="";R==="/"&&(l=g.replace(/p?\d*$/,""));let gt=n.some(Gt=>Gt!==g&&Gt.startsWith(g)),Jt=g.startsWith("nvme")?"NVMe":"SATA";Y>=400*1024*1024*1024&&o.push({name:g,size:Y,mountpoint:R||"",isMounted:at,hasPartition:gt,type:Jt})}console.log("Found root disk name: ",l);let m=n.filter(S=>S.startsWith(l));m.forEach(S=>console.log("Found root disk partition: ",S));let u=o.filter(S=>!m.includes(S.name)).sort((S,g)=>g.size-S.size),p=u.filter(S=>S.type==="NVMe").sort((S,g)=>g.size-S.size),y=u.filter(S=>S.type==="SATA").sort((S,g)=>g.size-S.size),A=[...p,...y];if(A.length>0){let S=A[0];if(S.size>=850*1024*1024*1024&&!S.isMounted&&(s=!0),S.size>=1250*1024*1024*1024&&S.isMounted&&(i=!0),A.length>1){let g=A[1];g.size>=400*1024*1024*1024&&!g.isMounted&&(a=!0)}if(A.length>2){let g=A[2];g.size>=400*1024*1024*1024&&!g.isMounted&&(c=!0)}}return A.forEach((S,g)=>console.log(`Prioritized Disk ${g+1}: ${S.name} ${S.size}`)),{disks:A,has850GB:s,has400GB:a,hasUsed1250GB:i,hasThirdDisk400GB:c}}r(jc,"getPreferredDisks");var ne=jc;import{spawnSync as Vt}from"child_process";var ht=r(t=>{if(Vt(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return Vt("sudo udevadm trigger --action=change",{shell:!0}),Vt("sudo udevadm settle",{shell:!0}),console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return Vt(o,{shell:!0,stdio:"inherit"}),Vt("sudo udevadm trigger --action=change",{shell:!0}),Vt("sudo udevadm settle",{shell:!0}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as Me}from"child_process";async function Po(t){for(let e=1;e<=5;e++){let n=Me(`sudo blkid -s UUID -o value ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(n)return console.log(`[SUCCESS] Found UUID for ${t}: ${n}`),`UUID=${n}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${t}`),await M(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${t}, using raw path`),t}r(Po,"getUUID");var se=r(async(t,e="",o="",n=!1,s=!1)=>{let a=await Po(t),i=await Po(e),c=await Po(o),l=`${a} ${_.ROOT} ext4 defaults 0 0`;n&&(l=`${a} ${_.LEDGER} ext4 defaults 0 0
199
- ${i} ${_.ACCOUNTS} ext4 defaults 0 0`),s&&(l=`${a} ${_.LEDGER} ext4 defaults 0 0
197
+ `,"startTestnetAgaveValidatorScript");import{existsAsync as On}from"@skeet-framework/utils";import{writeFile as Rn}from"fs/promises";var Gl=r(async(t,e=!1)=>{let{NETWORK:o,MOD:n}=t;e=n,o===f.MAINNET?(console.log("Mainnet Validator Node Setup"),await Jl(t,e)):o===f.TESTNET?(console.log("Testnet Validator Node Setup"),await zl(t,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Jl=r(async(t,e=!1)=>{let{VALIDATOR_TYPE:o,MAINNET_SOLANA_VERSION:n,MOD:s}=t;e=s;let a="";switch(o){case T.SOLANA:Io(n),a=vn(t);break;case T.JITO:console.log("JITO Validator Setup for Mainnet");let i=await pt();ne(n,e),a=Po(i.commissionBps,i.relayerUrl,i.blockEngineUrl,i.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await On(tt)){console.log("Startup script already exists. Skipping...");return}await Rn(tt,a,"utf-8"),se()},"setupMainnetValidator"),zl=r(async(t,e=!1)=>{let{VALIDATOR_TYPE:o,MOD:n}=t;e=n;let s="";switch(o){case T.SOLANA:Io(t.TESTNET_SOLANA_VERSION),s=Lo(t);case T.AGAVE:console.log("Agave Validator Setup for Testnet"),Pt(t.TESTNET_SOLANA_VERSION,e),s=Lo(t);break;case T.JITO:console.log("JITO Validator Setup for Testnet");let a=await pt();ne(t.TESTNET_SOLANA_VERSION,e),s=Po(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Testnet");break}if(await On(tt)){console.log("Startup script already exists. Skipping...");return}await Rn(tt,s,"utf-8"),se()},"setupTestnetValidator"),kn=Gl;import Zn from"chalk";import{execSync as Cn}from"node:child_process";function In(t){try{Cn(`test -d ${t}`),console.log(`${t} already exists.`)}catch{Cn(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(In,"createDirectoryIfNotExists");var Pn=r(()=>{try{let t=[_.ACCOUNTS,_.LEDGER,_.SNAPSHOTS];for(let e of t)In(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as Wl}from"child_process";function ql(){let e=Wl("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
198
+ `).slice(1),o=[],n=e.map(y=>y.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,l=!1,c="";for(let y of e){let[E,$,R]=y.trim().split(/\s+/);if(!E||!$)continue;let Y=parseInt($,10);if(isNaN(Y))continue;let it=R!==void 0&&R!=="";R==="/"&&(c=E.replace(/p?\d*$/,""));let gt=n.some(qt=>qt!==E&&qt.startsWith(E)),Wt=E.startsWith("nvme")?"NVMe":"SATA";Y>=400*1024*1024*1024&&o.push({name:E,size:Y,mountpoint:R||"",isMounted:it,hasPartition:gt,type:Wt})}console.log("Found root disk name: ",c);let m=n.filter(y=>y.startsWith(c));m.forEach(y=>console.log("Found root disk partition: ",y));let u=o.filter(y=>!m.includes(y.name)).sort((y,E)=>E.size-y.size),p=u.filter(y=>y.type==="NVMe").sort((y,E)=>E.size-y.size),S=u.filter(y=>y.type==="SATA").sort((y,E)=>E.size-y.size),g=[...p,...S];if(g.length>0){let y=g[0];if(y.size>=850*1024*1024*1024&&!y.isMounted&&(s=!0),y.size>=1250*1024*1024*1024&&y.isMounted&&(i=!0),g.length>1){let E=g[1];E.size>=400*1024*1024*1024&&!E.isMounted&&(a=!0)}if(g.length>2){let E=g[2];E.size>=400*1024*1024*1024&&!E.isMounted&&(l=!0)}}return g.forEach((y,E)=>console.log(`Prioritized Disk ${E+1}: ${y.name} ${y.size}`)),{disks:g,has850GB:s,has400GB:a,hasUsed1250GB:i,hasThirdDisk400GB:l}}r(ql,"getPreferredDisks");var ae=ql;import{spawnSync as Kt}from"child_process";var St=r(t=>{if(Kt(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return Kt("sudo udevadm trigger --action=change",{shell:!0}),Kt("sudo udevadm settle",{shell:!0}),console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return Kt(o,{shell:!0,stdio:"inherit"}),Kt("sudo udevadm trigger --action=change",{shell:!0}),Kt("sudo udevadm settle",{shell:!0}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as He}from"child_process";async function xo(t){for(let e=1;e<=5;e++){let n=He(`sudo blkid -s UUID -o value ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(n)return console.log(`[SUCCESS] Found UUID for ${t}: ${n}`),`UUID=${n}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${t}`),await M(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${t}, using raw path`),t}r(xo,"getUUID");var ie=r(async(t,e="",o="",n=!1,s=!1)=>{let a=await xo(t),i=await xo(e),l=await xo(o),c=`${a} ${_.ROOT} ext4 defaults 0 0`;n&&(c=`${a} ${_.LEDGER} ext4 defaults 0 0
199
+ ${i} ${_.ACCOUNTS} ext4 defaults 0 0`),s&&(c=`${a} ${_.LEDGER} ext4 defaults 0 0
200
200
  ${i} ${_.ACCOUNTS} ext4 defaults 0 0
201
- ${c} ${_.SNAPSHOTS} ext4 defaults 0 0`);let m=[l],u=Me("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,p=[];for(let y of m)u.includes(y)||(console.log(`[INFO] Line to add: ${y}`),p.push(y));if(p.length){console.log(`[INFO] Lines to add all: ${p}`);let y=`echo "${p.join(`
202
- `)}" | sudo tee -a /etc/fstab`;Me(y,{shell:!0,encoding:"utf8"}),Me("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
201
+ ${l} ${_.SNAPSHOTS} ext4 defaults 0 0`);let m=[c],u=He("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,p=[];for(let S of m)u.includes(S)||(console.log(`[INFO] Line to add: ${S}`),p.push(S));if(p.length){console.log(`[INFO] Lines to add all: ${p}`);let S=`echo "${p.join(`
202
+ `)}" | sudo tee -a /etc/fstab`;He(S,{shell:!0,encoding:"utf8"}),He("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
203
203
  ${p.join(`
204
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as Bc}from"child_process";var On=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=Bc(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Jc=r(async()=>{let t=ne(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB&&t.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await O({MNT_DISK_TYPE:B.TRIPLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s="/dev/"+t.disks[2].name,a=ht(o),i=ht(n),c=ht(s),l=a?o:"",m=i?n:"",d=c?s:"";console.log("Waiting for formatting to finish..."),await M(5e3),await se(a?l:"",i?m:"",c?d:"",!1,!0)}else if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await O({MNT_DISK_TYPE:B.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=ht(o),a=ht(n);await se(s?s?o:"":"",a?a?n:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await O({MNT_DISK_TYPE:B.SINGLE}),e.includes("/mnt")){On(e);let o="/dev/"+t.disks[0].name;ht(o),await se(o)}else{let o="/dev/"+t.disks[0].name;ht(o),await se(o)}},"mountDirs"),Rn=Jc;import{spawnSync as Gc}from"child_process";var kn=r(()=>{let t=[`sudo mkdir -p ${_.ROOT}`,`sudo chown -R solv:solv ${_.ROOT}`,`sudo chmod -R 755 ${_.ROOT}`,`sudo mkdir -p ${_.ACCOUNTS}`,`sudo chown -R solv:solv ${_.ACCOUNTS}`,`sudo chmod -R 755 ${_.ACCOUNTS}`,`sudo mkdir -p ${_.LEDGER}`,`sudo chown -R solv:solv ${_.LEDGER}`,`sudo chmod -R 755 ${_.LEDGER}`,`sudo mkdir -p ${_.SNAPSHOTS}`,`sudo chown -R solv:solv ${_.SNAPSHOTS}`,`sudo chmod -R 755 ${_.SNAPSHOTS}`];for(let e of t)Gc(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as He}from"child_process";import{existsSync as zc}from"fs";function Cn(){if(!zc(x.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
204
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as Ql}from"child_process";var Ln=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=Ql(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Xl=r(async()=>{let t=ae(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB&&t.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await O({MNT_DISK_TYPE:B.TRIPLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s="/dev/"+t.disks[2].name,a=St(o),i=St(n),l=St(s),c=a?o:"",m=i?n:"",d=l?s:"";console.log("Waiting for formatting to finish..."),await M(5e3),await ie(a?c:"",i?m:"",l?d:"",!1,!0)}else if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await O({MNT_DISK_TYPE:B.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=St(o),a=St(n);await ie(s?s?o:"":"",a?a?n:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await O({MNT_DISK_TYPE:B.SINGLE}),e.includes("/mnt")){Ln(e);let o="/dev/"+t.disks[0].name;St(o),await ie(o)}else{let o="/dev/"+t.disks[0].name;St(o),await ie(o)}},"mountDirs"),xn=Xl;import{spawnSync as Zl}from"child_process";var Vn=r(()=>{let t=[`sudo mkdir -p ${_.ROOT}`,`sudo chown -R solv:solv ${_.ROOT}`,`sudo chmod -R 755 ${_.ROOT}`,`sudo mkdir -p ${_.ACCOUNTS}`,`sudo chown -R solv:solv ${_.ACCOUNTS}`,`sudo chmod -R 755 ${_.ACCOUNTS}`,`sudo mkdir -p ${_.LEDGER}`,`sudo chown -R solv:solv ${_.LEDGER}`,`sudo chmod -R 755 ${_.LEDGER}`,`sudo mkdir -p ${_.SNAPSHOTS}`,`sudo chown -R solv:solv ${_.SNAPSHOTS}`,`sudo chmod -R 755 ${_.SNAPSHOTS}`];for(let e of t)Zl(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as Fe}from"child_process";import{existsSync as tc}from"fs";function $n(){if(!tc(C.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
205
205
  # Increase UDP buffer sizes
206
206
  net.core.rmem_default = 134217728
207
207
  net.core.rmem_max = 134217728
@@ -216,7 +216,7 @@ fs.nr_open = 1000000
216
216
  `,e=`
217
217
  # Increase process file descriptor count limit
218
218
  * - nofile 1000000
219
- `;He(`echo "${t}" | sudo tee ${x.SOL_SYSTEM_CONFIG21} > /dev/null`),He(`sudo sysctl -p ${x.SOL_SYSTEM_CONFIG21}`),He(`echo "DefaultFILE=1000000" | sudo tee -a ${x.SOL_SYSTEM_CONF}`),He(`echo "${e}" | sudo tee ${x.SOL_NOFILES_CONF} > /dev/null`)}}r(Cn,"setupSystemd");var In=r((t=j.USERNAME,e)=>{let{log:o}=ft(),n=e?"frankendancer":"agave",s=`${o} {
219
+ `;Fe(`echo "${t}" | sudo tee ${C.SOL_SYSTEM_CONFIG21} > /dev/null`),Fe(`sudo sysctl -p ${C.SOL_SYSTEM_CONFIG21}`),Fe(`echo "DefaultFILE=1000000" | sudo tee -a ${C.SOL_SYSTEM_CONF}`),Fe(`echo "${e}" | sudo tee ${C.SOL_NOFILES_CONF} > /dev/null`)}}r($n,"setupSystemd");var Vo=r((t=j.USERNAME,e)=>{let{log:o}=ht(),n=e?"frankendancer":"agave",s=`${o} {
220
220
  su ${t} ${t}
221
221
  daily
222
222
  rotate 1
@@ -247,7 +247,7 @@ fs.nr_open = 1000000
247
247
  compress
248
248
  copytruncate
249
249
  }
250
- `),s)},"logRotates");import{existsSync as Wc}from"fs";import{execSync as qc}from"child_process";function Fe(t=!1){if(console.log("Creating logrotate configuration for solana"),Wc(x.SOL_LOGROTATE))console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.");else{let e=In("solv",t);qc(`echo "${e}" | sudo tee ${x.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(Fe,"setupLogrotate");var Qc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",Xc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",Zc=`/home/${j.USERNAME}/.local/share/solana/install/active_release/bin`,Pn=r((t=!0)=>{let{scriptPath:e}=ft(t),o=t?Xc:Qc,n=Zc;return`[Unit]
250
+ `),s)},"logRotates");import{existsSync as Ye}from"fs";import{execSync as Dn}from"child_process";function je(t=!1){if(console.log("Creating logrotate configuration for solana"),!t&&Ye(C.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!t&&!Ye(C.SOL_LOGROTATE)){let e=Vo("solv",t);Dn(`echo "${e}" | sudo tee ${C.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(t&&Ye(C.FRANKENDANCER_LOGROTATE)&&console.log("FRANKENDANCER_LOGROTATE_PATH already exists. Skipping logrotate configuration."),t&&!Ye(C.SOL_LOGROTATE)){let e=Vo("solv",t);Dn(`echo "${e}" | sudo tee ${C.FRANKENDANCER_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(je,"setupLogrotate");var ec="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",oc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",rc=`/home/${j.USERNAME}/.local/share/solana/install/active_release/bin`,Kn=r((t=!0)=>{let{scriptPath:e}=ht(t),o=t?oc:ec,n=rc;return`[Unit]
251
251
  Description=Solana Validator
252
252
  After=network.target
253
253
  StartLimitIntervalSec=0
@@ -260,12 +260,12 @@ LimitNOFILE=1000000
260
260
  LogRateLimitIntervalSec=0
261
261
  User=${j.USERNAME}
262
262
  Environment=PATH=${n}
263
- WorkingDirectory=${K.ROOT}
263
+ WorkingDirectory=${b.ROOT}
264
264
  Environment="${o}"
265
265
  ExecStart=${e}
266
266
 
267
267
  [Install]
268
- WantedBy=multi-user.target`},"solvService");import{execSync as tl}from"child_process";function Ln(t=!0){console.log("Creating solvService configuration for solana");let e=Pn(t);tl(`echo "${e}" | sudo tee ${x.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(Ln,"setupSolvService");var xn=r((t=!0)=>{Fe(),Ln(t),Cn()},"makeServices");import{spawnSync as Lo}from"node:child_process";var Vn=r(t=>{try{Ke(t);let e=t.NETWORK;return e===f.TESTNET?(Lo(`solana config set --url ${e} -k ${L}`,{shell:!0,stdio:"inherit"}),Lo(`solana airdrop 1 --url ${e} -k ${L}`,{shell:!0,stdio:"inherit"})):Lo(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==E.RPC&&De(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as el}from"node:child_process";var Ye=r(t=>{let o=[`sudo systemctl start ${t.VALIDATOR_TYPE===T.FRANKENDANCER?"frankendancer":"solv"}`];el(o[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as ol}from"node:child_process";var rl=r(()=>{try{ol('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),$n=rl;import xo from"fs";import{promisify as bn}from"util";import{execSync as Dn}from"child_process";var nl=bn(xo.readFile),sl=bn(xo.access),je="/etc/sysctl.conf",al=`# set default and maximum socket buffer sizes to 128MB
268
+ WantedBy=multi-user.target`},"solvService");import{execSync as nc}from"child_process";function bn(t=!0){console.log("Creating solvService configuration for solana");let e=Kn(t);nc(`echo "${e}" | sudo tee ${C.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(bn,"setupSolvService");var Un=r((t=!0)=>{je(),bn(t),$n()},"makeServices");import{spawnSync as $o}from"node:child_process";var Mn=r(t=>{try{Ue(t);let e=t.NETWORK;return e===f.TESTNET?($o(`solana config set --url ${e} -k ${x}`,{shell:!0,stdio:"inherit"}),$o(`solana airdrop 1 --url ${e} -k ${x}`,{shell:!0,stdio:"inherit"})):$o(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==A.RPC&&Ke(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as sc}from"node:child_process";var Be=r(t=>{let o=[`sudo systemctl start ${t.VALIDATOR_TYPE===T.FRANKENDANCER?"frankendancer":"solv"}`];sc(o[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as ac}from"node:child_process";var ic=r(()=>{try{ac('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Hn=ic;import Do from"fs";import{promisify as Yn}from"util";import{execSync as Fn}from"child_process";var lc=Yn(Do.readFile),cc=Yn(Do.access),Ge="/etc/sysctl.conf",mc=`# set default and maximum socket buffer sizes to 128MB
269
269
  net.core.rmem_default=134217728
270
270
  net.core.wmem_default=134217728
271
271
  net.core.rmem_max=134217728
@@ -276,23 +276,23 @@ net.ipv4.tcp_rmem=10240 87380 134217728
276
276
  net.ipv4.tcp_wmem=10240 87380 134217728
277
277
 
278
278
  # Enable TCP westwood for kernels greater than or equal to 2.6.13
279
- net.ipv4.tcp_congestion_control=westwood`;async function il(){try{await sl(je,xo.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${je} does not exist`)}try{let t=await nl(je,"utf8");if(!t.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=t.replace(/net\.core\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\n/g,"");e=e.replace(/net\.ipv4\.tcp_(rmem|wmem|congestion_control)=.*\n/g,""),e+=`
280
- ${al}
281
- `,Dn(`echo "${e}" | sudo tee ${je} > /dev/null`),Dn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(il,"updateSysctlConfig");var Kn=il;import{spawnSync as cl}from"child_process";var Un=r(()=>{cl("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as ll}from"node:child_process";var Mn=r(()=>{ll("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Hn}from"child_process";var Fn=r((t=!1,e=!1)=>{t?pl():ml(e)},"createSymLink"),ml=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),Hn(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),pl=r(()=>{Hn("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import Be from"chalk";var dl=r(()=>{let t=`${Be.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${Be.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
279
+ net.ipv4.tcp_congestion_control=westwood`;async function pc(){try{await cc(Ge,Do.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${Ge} does not exist`)}try{let t=await lc(Ge,"utf8");if(!t.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=t.replace(/net\.core\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\n/g,"");e=e.replace(/net\.ipv4\.tcp_(rmem|wmem|congestion_control)=.*\n/g,""),e+=`
280
+ ${mc}
281
+ `,Fn(`echo "${e}" | sudo tee ${Ge} > /dev/null`),Fn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(pc,"updateSysctlConfig");var jn=pc;import{spawnSync as dc}from"child_process";var Bn=r(()=>{dc("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as uc}from"node:child_process";var Gn=r(()=>{uc("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Jn}from"child_process";var zn=r((t=!1,e=!1)=>{t?hc():fc(e)},"createSymLink"),fc=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),Jn(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),hc=r(()=>{Jn("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import Je from"chalk";var Sc=r(()=>{let t=`${Je.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${Je.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
282
282
 
283
283
  We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
284
284
  It's our way of supporting the community and empowering you with fast, reliable connections.
285
285
 
286
286
  To get your free API key, simply join us through the link below:
287
287
 
288
- Validators DAO: ${Be.white("`https://discord.gg/X4BgkBHavp`")}
288
+ Validators DAO: ${Je.white("`https://discord.gg/X4BgkBHavp`")}
289
289
 
290
290
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
291
- `;console.log(Be.cyan(e))},"rpcLog"),vt=dl;import{spawnSync as P}from"child_process";import{promises as Sl}from"fs";var ul=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
291
+ `;console.log(Je.cyan(e))},"rpcLog"),Ot=Sc;import{spawnSync as L}from"child_process";import{promises as Ac}from"fs";var yc=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
292
292
  sudo chmod -R 755 /mnt
293
293
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
294
294
  sudo chown -R solv:solv /mnt
295
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Yn=ul;var fl=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
295
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Wn=yc;var Tc=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
296
296
  Description=Firedancer Solana
297
297
  After=network.target
298
298
  StartLimitIntervalSec=0
@@ -308,7 +308,7 @@ ExecStart=/home/solv/start-firedancer.sh
308
308
 
309
309
  [Install]
310
310
  WantedBy=multi-user.target
311
- `}),"firedancerService"),jn=fl;var hl=r((t,e)=>{let o="/home/solv/firedancer/config.toml",n=`name = "fd1"
311
+ `}),"firedancerService"),qn=Tc;var Ec=r((t,e)=>{let o="/home/solv/firedancer/config.toml",n=`name = "fd1"
312
312
  user = "solv"
313
313
 
314
314
  [log]
@@ -402,14 +402,13 @@ user = "solv"
402
402
  snapshot_archive_format = "zstd"
403
403
  require_tower = false
404
404
  limit_size = 50_000_000
405
- disable_accounts_disk_index = true
406
405
 
407
406
  [snapshots]
408
407
  enabled = true
409
408
  incremental_snapshots = true
410
409
  path = "/mnt/snapshots"
411
410
  maximum_full_snapshots_to_retain = 1
412
- maximum_incremental_snapshots_to_retain = 1
411
+ maximum_incremental_snapshots_to_retain = 2
413
412
 
414
413
  [gossip]
415
414
  entrypoints = [
@@ -432,6 +431,8 @@ user = "solv"
432
431
  "dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs",
433
432
  "Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN",
434
433
  "eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ",
434
+ "phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1",
435
+ "rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg",
435
436
  "9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv"
436
437
  ]
437
438
 
@@ -455,7 +456,7 @@ user = "solv"
455
456
  tip_distribution_program_addr = "F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2"
456
457
  tip_payment_program_addr = "GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy"
457
458
  tip_distribution_authority = "GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib"
458
- commission_bps = 10000`:n}},"configToml"),Bn=hl;var yl=r(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
459
+ commission_bps = 10000`:n}},"configToml"),Qn=Ec;var gc=r(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
459
460
  Description=Relay port 9600 to localhost:80
460
461
  After=network.target
461
462
 
@@ -465,7 +466,7 @@ Restart=always
465
466
 
466
467
  [Install]
467
468
  WantedBy=multi-user.target
468
- `}),"portRelayService"),Jn=yl;var Tl=r(async(t=!1,e)=>{let o=!!(e&&e.NETWORK===f.TESTNET),n=o?Re:ke,s=o?J:U;t?(P("git clone --recurse-submodules https://github.com/gabrielhicks/firedancer.git",{shell:!0,stdio:"inherit"}),P(`git checkout v${n}-mod`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),P(`git checkout v${s}-mod`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer/agave"}),P("git add .",{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${n}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),P("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),P("./deps.sh",{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 a=await mt(),{filePath:i,body:c}=Yn();P(`echo "${c}" | sudo tee ${i} > /dev/null`,{shell:!0,stdio:"inherit"}),P(`sudo chmod +x ${i}`,{shell:!0,stdio:"inherit"});let l=jn();P(`echo "${l.body}" | sudo tee ${l.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let m=Jn();P("sudo apt install socat",{shell:!0,stdio:"inherit"}),P("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),P(`echo "${m.body}" | sudo tee ${m.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),P("sudo systemctl daemon-reload",{shell:!0});let d=Bn(o,a);await Sl.writeFile(d.filePath,d.body,"utf-8"),console.log(`config.toml written to ${d.filePath}`),P(`sudo chown solv:solv "${d.filePath}"`,{shell:!0,stdio:"inherit"}),Fe(!0)},"setupFiredancer"),Je=Tl;var zn=r(async(t=!1,e=!1,o=!1,n=!1)=>{try{t||(console.log(Gn.white("\u{1F7E2} Initializing Setup")),await V(),await fn());let s=await V(),a=s.NETWORK===f.TESTNET;switch(vn(),(!e||!o)&&await Rn(),xn(a),Un(),$n(),await Kn(),Vn(s),Fn(s.IS_DUMMY,a),s=await V(),s.NODE_TYPE){case E.RPC:await Tn(s);break;case E.VALIDATOR:await wn(s,n),s.VALIDATOR_TYPE===T.FRANKENDANCER&&await Je(n,s);break;default:throw new Error("Unknown Node Type")}o||kn(),te(),s.VALIDATOR_TYPE!==T.FRANKENDANCER&&(o||(s=await V(),Mn(),xt(a,"100",s.SNAPSHOTS_PATH,a?s.TESTNET_SOLANA_VERSION:s.MAINNET_SOLANA_VERSION))),o||Ye(s),console.log(Gn.white("\u{1F7E2} Setup Completed")),vt()}catch(s){throw new Error(`Setup Error: ${s.message}`)}},"setupV2");var Wn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
469
+ `}),"portRelayService"),Xn=gc;var wc=r(async(t=!1,e)=>{let o=!!(e&&e.NETWORK===f.TESTNET),n=o?xt:Vt,s=o?G:U;t?(L("git clone --recurse-submodules https://github.com/gabrielhicks/firedancer.git",{shell:!0,stdio:"inherit"}),L(`git checkout v${n}-mod`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),L(`git checkout v${s}-mod`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer/agave"}),L("git add .",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),L('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(L("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),L(`git checkout v${n}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),L("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),L("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),L("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),L("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let a=await pt(),{filePath:i,body:l}=Wn();L(`echo "${l}" | sudo tee ${i} > /dev/null`,{shell:!0,stdio:"inherit"}),L(`sudo chmod +x ${i}`,{shell:!0,stdio:"inherit"});let c=qn();L(`echo "${c.body}" | sudo tee ${c.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let m=Xn();L("sudo apt install socat",{shell:!0,stdio:"inherit"}),L("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),L(`echo "${m.body}" | sudo tee ${m.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),L("sudo systemctl daemon-reload",{shell:!0});let d=Qn(o,a);await Ac.writeFile(d.filePath,d.body,"utf-8"),console.log(`config.toml written to ${d.filePath}`),L(`sudo chown solv:solv "${d.filePath}"`,{shell:!0,stdio:"inherit"}),je(!0)},"setupFiredancer"),ze=wc;var ts=r(async(t=!1,e=!1,o=!1,n=!1)=>{try{t||(console.log(Zn.white("\u{1F7E2} Initializing Setup")),await V(),await gn());let s=await V(),a=s.NETWORK===f.TESTNET;switch(Pn(),(!e||!o)&&await xn(),Un(a),Bn(),Hn(),await jn(),Mn(s),zn(s.IS_DUMMY,a),s=await V(),s.NODE_TYPE){case A.RPC:await Nn(s);break;case A.VALIDATOR:await kn(s,n),s.VALIDATOR_TYPE===T.FRANKENDANCER&&await ze(n,s);break;default:throw new Error("Unknown Node Type")}o||Vn(),oe(),s.VALIDATOR_TYPE!==T.FRANKENDANCER&&(o||(s=await V(),Gn(),Dt(a,"100",s.SNAPSHOTS_PATH,a?s.TESTNET_SOLANA_VERSION:s.MAINNET_SOLANA_VERSION))),o||Be(s),console.log(Zn.white("\u{1F7E2} Setup Completed")),Ot()}catch(s){throw new Error(`Setup Error: ${s.message}`)}},"setupV2");var es=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
469
470
  [Unit]
470
471
  Description=Solana transaction relayer
471
472
  Requires=network-online.target
@@ -491,7 +492,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
491
492
  --verifying-key-pem-path=/home/solv/public.pem
492
493
 
493
494
  [Install]
494
- WantedBy=multi-user.target`;return{filePath:e,body:o}},"relayerService"),qn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`[Unit]
495
+ WantedBy=multi-user.target`;return{filePath:e,body:o}},"relayerService"),os=r(t=>{let e="/etc/systemd/system/relayer.service",o=`[Unit]
495
496
  Description=Solana transaction relayer
496
497
  Requires=network-online.target
497
498
  After=network-online.target
@@ -514,45 +515,45 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
514
515
  ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer --keypair-path=/home/solv/relayer-keypair.json --signing-key-pem-path=/home/solv/private.pem --verifying-key-pem-path=/home/solv/public.pem --forward-all
515
516
 
516
517
  [Install]
517
- WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as Ge,spawnSync as yt}from"child_process";var Qn=r(async(t,e=!0)=>{yt("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),yt("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),yt("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),yt("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),yt("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),yt("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:o,body:n}=e?Wn(t):qn(t);Ge(`echo "${n}" | sudo tee ${o} > /dev/null`),yt("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),yt("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Ge("sudo ufw allow 11228",{stdio:"inherit"}),Ge("sudo ufw allow 11229",{stdio:"inherit"}),Ge("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as Vo}from"node:child_process";var gl=r(t=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:t},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),Xn=gl;import{spawnSync as El}from"node:child_process";import{readFile as Al,writeFile as wl}from"fs/promises";var _l=r(async()=>{let t="/home/solv/start-validator.sh",o=(await Al(t,"utf-8")).split(`
518
+ WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as We,spawnSync as yt}from"child_process";var rs=r(async(t,e=!0)=>{yt("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),yt("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),yt("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),yt("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),yt("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),yt("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:o,body:n}=e?es(t):os(t);We(`echo "${n}" | sudo tee ${o} > /dev/null`),yt("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),yt("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),We("sudo ufw allow 11228",{stdio:"inherit"}),We("sudo ufw allow 11229",{stdio:"inherit"}),We("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as Ko}from"node:child_process";var _c=r(t=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:t},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),ns=_c;import{spawnSync as Nc}from"node:child_process";import{readFile as vc,writeFile as Oc}from"fs/promises";var Rc=r(async()=>{let t="/home/solv/start-validator.sh",o=(await vc(t,"utf-8")).split(`
518
519
  `);o.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let n=o.join(`
519
- `);await wl(t,n),El(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Zn=_l;import Nl from"inquirer";import{writeFile as vl}from"node:fs/promises";var ts=r(async()=>{let e=(await Nl.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,o="git clone https://github.com/rpcpool/yellowstone-grpc.git",n="cargo build -r",s="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";Vo(o,{shell:!0,stdio:"inherit"}),Vo(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),Vo(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Xn(e),c=JSON.stringify(i,null,2);await vl(a,c,{encoding:"utf8"}),await Zn()},"yellowstoneGeyser");var es=r(t=>{h.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let o=t.MOD||e.mod;try{if(e.vote)console.log(pt.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),De(t),process.exit(0);else if(e.key)console.log(pt.white("\u{1F511} Setting up Validator Keypairs ...")),Ke(t),process.exit(0);else if(e.relayer){console.log(pt.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let s=(await mt()).blockEngineUrl;await Qn(s,!1),console.log(pt.green(`Jito Relayer Setup Completed
520
-
521
- $ solv relayer --help`)),te(),vt(),process.exit(0)}else if(e.jupiter)console.log(pt.white("\u{1F30F} Setting up Jupiter Swap API ...")),await pn(),te(),vt(),process.exit(0);else if(e.geyser){console.log(pt.white("\u26A1\uFE0F Setting up Geyser ...")),await ts();return}else if(e.firedancer){console.log(pt.white("\u{1F525} Setting up Firedancer ...")),await Je(o);return}await zn(e.skipInitConfig,e.skipMount,e.pivot,o)}catch(n){(n.message.includes("User force closed the prompt")||n.message.includes("initialConfigSetup"))&&(console.error(pt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(pt.red(`Setup Error: ${n.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Ol}from"child_process";var $o=r(()=>{let o=Ol("df -h").toString().split(`
522
- `).slice(1).filter(s=>s.split(/\s+/)[0]!=="").map(s=>{let a=s.split(/\s+/);return{Filesystem:a[0],Size:a[1],Used:a[2],Avail:a[3],Use:a[4],MountedOn:a[5]}}).sort((s,a)=>Ot(a.Avail)-Ot(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&Ot(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&Ot(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&Ot(s.Size)>9e11-1&&console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: red")}),n?console.log("your mount point is correct"):o.filter(a=>a.Filesystem.startsWith("/dev/")&&Ot(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import os from"chalk";import Rl from"cli-table3";var Do=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>os.blue(n)),o=new Rl({head:e,colWidths:[20,10,10,10,10,20]});t.forEach(n=>{o.push([n.Filesystem,n.Size,n.Used,n.Avail,n.Use,n.MountedOn].map(s=>os.white(s)))}),console.log(o.toString())},"displayTable");var rs=r(async()=>{h.command("df").description("Disk Free Command").action(()=>{let t=$o();Do(t)})},"dfCommands"),Ot=r(t=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},o=t.match(/[A-Za-z]+/)?.[0]||"",n=parseFloat(t);return e[o]?n*e[o]:n},"convertToBytes");var ns=r(t=>{h.command("start").description("Start Solana Validator").action(()=>{Ye(t),process.exit(0)})},"startCommand");import{spawnSync as kl}from"node:child_process";import Cl from"chalk";var ss=r(async t=>{Cl.white(console.log("Starting solv stop process..."));let o=[`sudo systemctl stop ${t.VALIDATOR_TYPE===T.FRANKENDANCER?"frankendancer":"solv"}`];kl(o[0],{shell:!0,stdio:"inherit"})},"stopSolana");var as=r(t=>{h.command("stop").description("Stop Solana Validator").action(()=>{ss(t),process.exit(0)})},"stopCommand");import{spawnSync as ae}from"node:child_process";import is from"chalk";var cs=r(t=>{let e=et();h.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async o=>{let n=t.AUTO_RESTART,s=t.NETWORK===f.TESTNET,a=n&&s?10:30;o.rm&&(console.log(is.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),ae("solv stop",{stdio:"inherit",shell:!0}),ae("solv rm:snapshot",{stdio:"inherit",shell:!0}),ae("solv get snapshot",{stdio:"inherit",shell:!0}),ae("solv start",{stdio:"inherit",shell:!0}),console.log(is.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let i=`${e} --ledger ${t.LEDGER_PATH} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE} --min-idle-time ${a}`;ae(i,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var ls=r(t=>{let o=t.NETWORK===f.TESTNET?J:U;t.NODE_TYPE===E.RPC&&(o=Nt),h.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${o}`,o).option("-m, --mod <version>","Use modified installer",!1).action(async n=>{let s=t.VALIDATOR_TYPE===T.JITO,a=n.mod||t.MOD;if(s){let m=`v${n.version||Xt}`;Wt(m,a);return}t.NODE_TYPE===E.RPC&&(o=Nt);let c=n.version||o;await Ae(c,a)})},"installCommands");import{spawnSync as Il}from"child_process";var ms=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{Il("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=ne();console.log(t)})},"mountCommands");import{spawnSync as xl}from"node:child_process";import ps from"chalk";import{spawnSync as Pl}from"child_process";var Ll=r(async()=>{try{let t=Pl("crontab",["-l"],{encoding:"utf-8"});if(t.status!==0)return console.log("No crontab for this user."),!1;let e=t.stdout;return console.log(e),e.includes("solv epochTimer")}catch(t){return console.error("Error reading crontab:",t),!1}},"hasEpochTimer"),ze=Ll;var ds=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await ze()&&(console.log(ps.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let n=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;xl(n,{shell:!0,stdio:"inherit"}),console.log(ps.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ie={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as $l,mkdirSync as Dl}from"fs";import bl from"inquirer";import{homedir as Kl}from"os";import{spawnSync as Vl}from"node:child_process";function us(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return Vl(s,{shell:!0,stdio:"inherit"}).status===0}r(us,"executeSCP");var bo=r(async(t="")=>{let e=t;t===""&&(e=(await bl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(N()),n=Kl(),s=n.includes("/home/solv")?"/home/solv":n+ie.SOLV_KEYPAIR_DOWNLOAD_PATH;$l(s)||Dl(s,{recursive:!0});let a=!0,i=n+"/"+er;o.push(i);for(let c of o){let l=c.split("/"),m=l[l.length-1];m=n.includes("/home/solv")?m:m.replace(".json",`-${e}.json`);let d=`${s}/${m}`;us(e,c,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as Ul}from"child_process";import{existsSync as Ml}from"fs";import Hl from"inquirer";import Fl from"os";var fs=r(async(t="")=>{let e=Fl.userInfo().homedir,o=t;t===""&&(o=(await Hl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${ie.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=ie.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let s=Object.values(N(n));for(let a of s){let i=a.split("/"),c=i[i.length-1];if(!c.endsWith("keypair.json"))continue;let l=`${n}/${c}`;if(!Ml(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;Ul(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as Yl}from"child_process";import jl from"inquirer";var hs=r(async()=>{let t=await jl.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${K.ROOT}/.ssh && echo "${t.pubkey}" >> ${K.AUTHORIZED_KEYS}`;Yl(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import We from"chalk";import{readFileSync as Bl}from"fs";import Jl from"os";var ys=r(()=>{try{let e=`${Jl.userInfo().homedir}/.ssh/id_rsa.pub`,o=Bl(e,"utf8");console.log(We.white(`Your SSH Public Key is:
523
- `)),console.log(We.white(o))}catch(t){console.error(We.white(`Error reading SSH Public Key
524
- `)),console.error(We.white(t))}},"cat");import{spawnSync as Gl}from"child_process";var Ss=r(()=>{Gl("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as zl}from"child_process";import{readFileSync as Wl}from"fs";import{Readable as ql}from"stream";var Ts=r(async t=>new Promise((e,o)=>{try{let n=zl("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
525
- `).filter(i=>i)),t.increment()}),n.stderr.on("data",a=>{t.increment()}),n.on("close",a=>{e(s)})}catch(n){o(`search Error: ${n}`)}}),"search"),Ql=r(t=>{try{return JSON.parse(Wl(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),gs=r(async(t,e)=>{let o=[],n=ql.from(t);return n.on("data",async s=>{Ql(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import qe from"chalk";import{Presets as em,SingleBar as om}from"cli-progress";import Es from"chalk";import{spawnSync as Xl}from"node:child_process";import Zl from"node-fetch";var tm=r(async()=>{let t=await Zl(cr,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(Es.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
526
- Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)Xl(o,{shell:!0,stdio:"ignore"});return console.log(Es.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),As=tm;var ws=r(()=>{let t=h.command("scp").description("Scp Commands").argument("<cmd>");t.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await bo(e.ip);return}await bo()}),t.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await As();return}await fs(e.ip)}),t.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await hs()}),t.command("cat").description("Show SSH Public Key").action(()=>{ys()}),t.command("init").description("Init SSH Key Pair").action(()=>{Ss()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new om({},em.shades_classic);e.start(1e4,0);let o=await Ts(e),n=await gs(o,e);e.stop(),console.log(qe.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(qe.green(`
520
+ `);await Oc(t,n),Nc(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),ss=Rc;import kc from"inquirer";import{writeFile as Cc}from"node:fs/promises";var as=r(async()=>{let e=(await kc.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,o="git clone https://github.com/rpcpool/yellowstone-grpc.git",n="cargo build -r",s="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";Ko(o,{shell:!0,stdio:"inherit"}),Ko(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),Ko(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=ns(e),l=JSON.stringify(i,null,2);await Cc(a,l,{encoding:"utf8"}),await ss()},"yellowstoneGeyser");var is=r(t=>{h.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let o=t.MOD||e.mod;try{if(e.vote)console.log(dt.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ke(t),process.exit(0);else if(e.key)console.log(dt.white("\u{1F511} Setting up Validator Keypairs ...")),Ue(t),process.exit(0);else if(e.relayer){console.log(dt.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let s=(await pt()).blockEngineUrl;await rs(s,!1),console.log(dt.green(`Jito Relayer Setup Completed
521
+
522
+ $ solv relayer --help`)),oe(),Ot(),process.exit(0)}else if(e.jupiter)console.log(dt.white("\u{1F30F} Setting up Jupiter Swap API ...")),await yn(),oe(),Ot(),process.exit(0);else if(e.geyser){console.log(dt.white("\u26A1\uFE0F Setting up Geyser ...")),await as();return}else if(e.firedancer){console.log(dt.white("\u{1F525} Setting up Firedancer ...")),await ze(o);return}await ts(e.skipInitConfig,e.skipMount,e.pivot,o)}catch(n){(n.message.includes("User force closed the prompt")||n.message.includes("initialConfigSetup"))&&(console.error(dt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(dt.red(`Setup Error: ${n.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Ic}from"child_process";var bo=r(()=>{let o=Ic("df -h").toString().split(`
523
+ `).slice(1).filter(s=>s.split(/\s+/)[0]!=="").map(s=>{let a=s.split(/\s+/);return{Filesystem:a[0],Size:a[1],Used:a[2],Avail:a[3],Use:a[4],MountedOn:a[5]}}).sort((s,a)=>Rt(a.Avail)-Rt(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&Rt(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&Rt(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&Rt(s.Size)>9e11-1&&console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: red")}),n?console.log("your mount point is correct"):o.filter(a=>a.Filesystem.startsWith("/dev/")&&Rt(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import ls from"chalk";import Pc from"cli-table3";var Uo=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>ls.blue(n)),o=new Pc({head:e,colWidths:[20,10,10,10,10,20]});t.forEach(n=>{o.push([n.Filesystem,n.Size,n.Used,n.Avail,n.Use,n.MountedOn].map(s=>ls.white(s)))}),console.log(o.toString())},"displayTable");var cs=r(async()=>{h.command("df").description("Disk Free Command").action(()=>{let t=bo();Uo(t)})},"dfCommands"),Rt=r(t=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},o=t.match(/[A-Za-z]+/)?.[0]||"",n=parseFloat(t);return e[o]?n*e[o]:n},"convertToBytes");var ms=r(t=>{h.command("start").description("Start Solana Validator").action(()=>{Be(t),process.exit(0)})},"startCommand");import{spawnSync as Lc}from"node:child_process";import xc from"chalk";var ps=r(async t=>{xc.white(console.log("Starting solv stop process..."));let o=[`sudo systemctl stop ${t.VALIDATOR_TYPE===T.FRANKENDANCER?"frankendancer":"solv"}`];Lc(o[0],{shell:!0,stdio:"inherit"})},"stopSolana");var ds=r(t=>{h.command("stop").description("Stop Solana Validator").action(()=>{ps(t),process.exit(0)})},"stopCommand");import{spawnSync as le}from"node:child_process";import us from"chalk";var fs=r(t=>{let e=ot();h.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async o=>{let n=t.AUTO_RESTART,s=t.NETWORK===f.TESTNET,a=n&&s?10:30;o.rm&&(console.log(us.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),le("solv stop",{stdio:"inherit",shell:!0}),le("solv rm:snapshot",{stdio:"inherit",shell:!0}),le("solv get snapshot",{stdio:"inherit",shell:!0}),le("solv start",{stdio:"inherit",shell:!0}),console.log(us.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let i=`${e} --ledger ${t.LEDGER_PATH} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE} --min-idle-time ${a}`;le(i,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var hs=r(t=>{let o=t.NETWORK===f.TESTNET?G:U;t.NODE_TYPE===A.RPC&&(o=vt),h.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${o}`,o).option("-m, --mod <version>","Use modified installer",!1).action(async n=>{let s=t.VALIDATOR_TYPE===T.JITO,a=n.mod||t.MOD;if(s){let m=`v${n.version||te}`;Ce(m,a);return}t.NODE_TYPE===A.RPC&&(o=vt);let l=n.version||o;await _e(l,a)})},"installCommands");import{spawnSync as Vc}from"child_process";var Ss=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{Vc("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=ae();console.log(t)})},"mountCommands");import{spawnSync as Kc}from"node:child_process";import ys from"chalk";import{spawnSync as $c}from"child_process";var Dc=r(async()=>{try{let t=$c("crontab",["-l"],{encoding:"utf-8"});if(t.status!==0)return console.log("No crontab for this user."),!1;let e=t.stdout;return console.log(e),e.includes("solv epochTimer")}catch(t){return console.error("Error reading crontab:",t),!1}},"hasEpochTimer"),qe=Dc;var Ts=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await qe()&&(console.log(ys.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let n=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;Kc(n,{shell:!0,stdio:"inherit"}),console.log(ys.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ce={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as Uc,mkdirSync as Mc}from"fs";import Hc from"inquirer";import{homedir as Fc}from"os";import{spawnSync as bc}from"node:child_process";function Es(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return bc(s,{shell:!0,stdio:"inherit"}).status===0}r(Es,"executeSCP");var Mo=r(async(t="")=>{let e=t;t===""&&(e=(await Hc.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(N()),n=Fc(),s=n.includes("/home/solv")?"/home/solv":n+ce.SOLV_KEYPAIR_DOWNLOAD_PATH;Uc(s)||Mc(s,{recursive:!0});let a=!0,i=n+"/"+nr;o.push(i);for(let l of o){let c=l.split("/"),m=c[c.length-1];m=n.includes("/home/solv")?m:m.replace(".json",`-${e}.json`);let d=`${s}/${m}`;Es(e,l,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as Yc}from"child_process";import{existsSync as jc}from"fs";import Bc from"inquirer";import Gc from"os";var gs=r(async(t="")=>{let e=Gc.userInfo().homedir,o=t;t===""&&(o=(await Bc.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${ce.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=ce.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let s=Object.values(N(n));for(let a of s){let i=a.split("/"),l=i[i.length-1];if(!l.endsWith("keypair.json"))continue;let c=`${n}/${l}`;if(!jc(c))continue;let m=`scp -o StrictHostKeyChecking=no ${c} solv@${o}:${a}`;Yc(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${l} \u{1F389}`)}},"upload");import{spawnSync as Jc}from"child_process";import zc from"inquirer";var As=r(async()=>{let t=await zc.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${b.ROOT}/.ssh && echo "${t.pubkey}" >> ${b.AUTHORIZED_KEYS}`;Jc(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import Qe from"chalk";import{readFileSync as Wc}from"fs";import qc from"os";var ws=r(()=>{try{let e=`${qc.userInfo().homedir}/.ssh/id_rsa.pub`,o=Wc(e,"utf8");console.log(Qe.white(`Your SSH Public Key is:
524
+ `)),console.log(Qe.white(o))}catch(t){console.error(Qe.white(`Error reading SSH Public Key
525
+ `)),console.error(Qe.white(t))}},"cat");import{spawnSync as Qc}from"child_process";var _s=r(()=>{Qc("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Xc}from"child_process";import{readFileSync as Zc}from"fs";import{Readable as tm}from"stream";var Ns=r(async t=>new Promise((e,o)=>{try{let n=Xc("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
526
+ `).filter(i=>i)),t.increment()}),n.stderr.on("data",a=>{t.increment()}),n.on("close",a=>{e(s)})}catch(n){o(`search Error: ${n}`)}}),"search"),em=r(t=>{try{return JSON.parse(Zc(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),vs=r(async(t,e)=>{let o=[],n=tm.from(t);return n.on("data",async s=>{em(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import Xe from"chalk";import{Presets as sm,SingleBar as am}from"cli-progress";import Os from"chalk";import{spawnSync as om}from"node:child_process";import rm from"node-fetch";var nm=r(async()=>{let t=await rm(pr,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(Os.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
527
+ Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)om(o,{shell:!0,stdio:"ignore"});return console.log(Os.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),Rs=nm;var ks=r(()=>{let t=h.command("scp").description("Scp Commands").argument("<cmd>");t.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await Mo(e.ip);return}await Mo()}),t.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await Rs();return}await gs(e.ip)}),t.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await As()}),t.command("cat").description("Show SSH Public Key").action(()=>{ws()}),t.command("init").description("Init SSH Key Pair").action(()=>{_s()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new am({},sm.shades_classic);e.start(1e4,0);let o=await Ns(e),n=await vs(o,e);e.stop(),console.log(Xe.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(Xe.green(`
527
528
  ${n.join(`
528
- `)}`)),console.log(qe.white(`
529
+ `)}`)),console.log(Xe.white(`
529
530
  Only showing the first 10 results
530
531
 
531
- `)),console.log(qe.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as rm}from"child_process";var _s=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{nm(t)})},"statusCommands"),nm=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===T.FRANKENDANCER?"frankendancer":"solv"}`;rm(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as sm}from"node:child_process";var Ns=r(async(t,e)=>{try{let o=await V(),n=o.NETWORK===f.TESTNET,a=o.NODE_TYPE===E.RPC?o.RPC_URL:n?f.TESTNET:o.RPC_URL,c=[`solana delegate-stake ${t} ${e} --stake-authority ${n?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${a}`];return sm(c.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import Os from"inquirer";import{spawnSync as am}from"node:child_process";var vs=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=am(`solana create-stake-account ${t} ${e}`,{shell:!0,stdio:"pipe"}),a=s.stdout.toString()+s.stderr.toString();if(a.includes("Signature:"))return console.log("Stake account created successfully:",a),!0;if(a.includes("Error:"))console.log("Error encountered:",a),n++,console.log(`Retrying... (${n}/${o})`);else{console.log("Unknown output:",a);break}n===o&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as im,existsAsync as cm}from"@skeet-framework/utils";import{execSync as lm,spawnSync as Xe}from"node:child_process";import mm from"node:os";var Rs=r(async t=>{let e=t.NETWORK===f.TESTNET;if(!(await Os.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;Xe(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await Os.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await dm(),c=t.STAKE_ACCOUNTS,l=Array.from(new Set([...c,a]));return Lt({STAKE_ACCOUNT:l}),vs(i,Number(s.solAmount))},"stakeAccountQuestion"),pm=mm.userInfo().homedir,Qe=pm+"/stake-account",dm=r(async()=>{await cm(Qe)||Xe(`mkdir -p ${Qe}`,{shell:!0});let t=Xe(`ls ${Qe}`,{shell:!0}).stdout.toString().split(`
532
- `).filter(a=>a.includes(".json")),e=im(t.length+1),o=`${Qe}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return Xe(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:lm(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as um}from"node:child_process";var ks=r(async t=>{try{let o=(await V()).NETWORK===f.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return um(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as fm}from"node:child_process";var Cs=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return fm(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import Kt from"chalk";import{Connection as hm,PublicKey as ym}from"@solana/web3.js";import{stakePoolInfo as Sm}from"@solana/spl-stake-pool";var Ze=r(async(t,e=q)=>{try{let o=new hm(t),n=new ym(e);return await Sm(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as Tm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as gm}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Em}from"@metaplex-foundation/umi";var Is=r(async(t,e)=>{try{let o=Em(e);console.log(`mintPubkey: ${o}`);let n=gm(t),s=await Tm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ce from"chalk";import Ps from"inquirer";var Ls=r(async t=>{let e=await Ps.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:q}]);try{let o=await Ze(t,e.stakePoolAddress);if(!o)return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
532
+ `)),console.log(Xe.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as im}from"child_process";var Cs=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{lm(t)})},"statusCommands"),lm=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===T.FRANKENDANCER?"frankendancer":"solv"}`;im(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as cm}from"node:child_process";var Is=r(async(t,e)=>{try{let o=await V(),n=o.NETWORK===f.TESTNET,a=o.NODE_TYPE===A.RPC?o.RPC_URL:n?f.TESTNET:o.RPC_URL,l=[`solana delegate-stake ${t} ${e} --stake-authority ${n?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${a}`];return cm(l.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import Ls from"inquirer";import{spawnSync as mm}from"node:child_process";var Ps=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=mm(`solana create-stake-account ${t} ${e}`,{shell:!0,stdio:"pipe"}),a=s.stdout.toString()+s.stderr.toString();if(a.includes("Signature:"))return console.log("Stake account created successfully:",a),!0;if(a.includes("Error:"))console.log("Error encountered:",a),n++,console.log(`Retrying... (${n}/${o})`);else{console.log("Unknown output:",a);break}n===o&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as pm,existsAsync as dm}from"@skeet-framework/utils";import{execSync as um,spawnSync as to}from"node:child_process";import fm from"node:os";var xs=r(async t=>{let e=t.NETWORK===f.TESTNET;if(!(await Ls.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;to(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await Ls.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await Sm(),l=t.STAKE_ACCOUNTS,c=Array.from(new Set([...l,a]));return $t({STAKE_ACCOUNT:c}),Ps(i,Number(s.solAmount))},"stakeAccountQuestion"),hm=fm.userInfo().homedir,Ze=hm+"/stake-account",Sm=r(async()=>{await dm(Ze)||to(`mkdir -p ${Ze}`,{shell:!0});let t=to(`ls ${Ze}`,{shell:!0}).stdout.toString().split(`
533
+ `).filter(a=>a.includes(".json")),e=pm(t.length+1),o=`${Ze}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return to(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:um(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as ym}from"node:child_process";var Vs=r(async t=>{try{let o=(await V()).NETWORK===f.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return ym(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Tm}from"node:child_process";var $s=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return Tm(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import Ht from"chalk";import{Connection as Em,PublicKey as gm}from"@solana/web3.js";import{stakePoolInfo as Am}from"@solana/spl-stake-pool";var eo=r(async(t,e=Q)=>{try{let o=new Em(t),n=new gm(e);return await Am(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as wm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as _m}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Nm}from"@metaplex-foundation/umi";var Ds=r(async(t,e)=>{try{let o=Nm(e);console.log(`mintPubkey: ${o}`);let n=_m(t),s=await wm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import me from"chalk";import Ks from"inquirer";var bs=r(async t=>{let e=await Ks.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:Q}]);try{let o=await eo(t,e.stakePoolAddress);if(!o)return console.log(me.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
533
534
  Please check the correct address and try again.
534
- `)),console.log(ce.white(`For stake pool information
535
- \u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await Is(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
535
+ `)),console.log(me.white(`For stake pool information
536
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await Ds(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
536
537
  Name: ${a.name}
537
- Token Mint: ${a.mint}`;return(await Ps.prompt([{type:"confirm",name:"confirm",message:i+`
538
- Is this the correct Stake Pool?`}])).confirm?a:(console.log(ce.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
538
+ Token Mint: ${a.mint}`;return(await Ks.prompt([{type:"confirm",name:"confirm",message:i+`
539
+ Is this the correct Stake Pool?`}])).confirm?a:(console.log(me.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(me.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
539
540
  Please check the correct address and try again.
540
- `)),console.log(ce.white(`For stake pool information
541
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as xm}from"fs/promises";import pe from"inquirer";import{existsAsync as Vm}from"@skeet-framework/utils";import{Connection as bs,Keypair as km,PublicKey as me}from"@solana/web3.js";import{Connection as Am,PublicKey as wm,Keypair as _m}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Nm}from"@solana/spl-token";var le=r(async(t,e,o,n,s=!1)=>{try{let a=_m.fromSecretKey(new Uint8Array(e)),i=new wm(o),c=new Am(t);return(await Nm(c,a,i,n,s)).address.toBase58()}catch(a){throw console.log("Error in getOrCreateDestinationAddress",a),new Error(JSON.stringify(a))}},"getOrCreateDestinationAddress");import{Spinner as Cm}from"cli-spinner";import Rt from"chalk";import{PublicKey as Vs,Keypair as $s,Transaction as xs,ComputeBudgetProgram as vm,LAMPORTS_PER_SOL as Om}from"@solana/web3.js";import*as Ds from"@solana/spl-stake-pool";var $t=r(async(t,e,o,n=new Vs(q),s,a,i)=>{try{let c=$s.fromSecretKey(new Uint8Array(e)),l=o*Om,{instructions:m,signers:d}=await Rm(t,e,l,n,s,a,i),u=new xs().add(...m);u.feePayer=c.publicKey;let p=await t.getLatestBlockhashAndContext({commitment:"finalized"});u.recentBlockhash=p.value.blockhash,u.sign(...d,c);let y=new xs().add(...m).add(vm.setComputeUnitPrice({microLamports:1e3}));y.feePayer=c.publicKey,y.recentBlockhash=p.value.blockhash,y.sign(...d,c);let A=await t.sendRawTransaction(y.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...p.value,signature:A},"finalized"),{status:"success",signature:A}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),Rm=r(async(t,e,o,n=new Vs(q),s,a,i)=>{let l=$s.fromSecretKey(new Uint8Array(e)).publicKey;return await Ds.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as Ks}from"@skeet-framework/utils";var to=r(async(t,e,o,n)=>{console.log(Rt.white("Solana RPC URL:",t));let s=new bs(t);o===0&&(o=await eo());let a=new Cm("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(Rt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new me(e),c=km.fromSecretKey(new Uint8Array(n)),l=rt;a.setSpinnerTitle(Rt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await le(t,n,l,c.publicKey);await Ks(1e3),a.setSpinnerTitle(Rt.green("\u{1F504} Converting SOL to elSOL"));let d=await $t(s,n,o,i,new me(m),new me(Ao),c.publicKey),u=0;for(;d.status!=="success";){if(u++,u>10)return a.stop(!0),console.log(Rt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(Rt.yellow(`\u23F3 ${u} Times Retrying...`)),await Ks(3e3),s=new bs(t),d=await $t(s,n,o,i,new me(m),new me(Ao),c.publicKey)}return a.stop(!0),console.log(Rt.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
541
+ `)),console.log(me.white(`For stake pool information
542
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Km}from"fs/promises";import ue from"inquirer";import{existsAsync as bm}from"@skeet-framework/utils";import{Connection as Ys,Keypair as Lm,PublicKey as de}from"@solana/web3.js";import{Connection as vm,PublicKey as Om,Keypair as Rm}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as km}from"@solana/spl-token";var pe=r(async(t,e,o,n,s=!1)=>{try{let a=Rm.fromSecretKey(new Uint8Array(e)),i=new Om(o),l=new vm(t);return(await km(l,a,i,n,s)).address.toBase58()}catch(a){throw console.log("Error in getOrCreateDestinationAddress",a),new Error(JSON.stringify(a))}},"getOrCreateDestinationAddress");import{Spinner as xm}from"cli-spinner";import kt from"chalk";import{PublicKey as Ms,Keypair as Hs,Transaction as Us,ComputeBudgetProgram as Cm,LAMPORTS_PER_SOL as Im}from"@solana/web3.js";import*as Fs from"@solana/spl-stake-pool";var bt=r(async(t,e,o,n=new Ms(Q),s,a,i)=>{try{let l=Hs.fromSecretKey(new Uint8Array(e)),c=o*Im,{instructions:m,signers:d}=await Pm(t,e,c,n,s,a,i),u=new Us().add(...m);u.feePayer=l.publicKey;let p=await t.getLatestBlockhashAndContext({commitment:"finalized"});u.recentBlockhash=p.value.blockhash,u.sign(...d,l);let S=new Us().add(...m).add(Cm.setComputeUnitPrice({microLamports:1e3}));S.feePayer=l.publicKey,S.recentBlockhash=p.value.blockhash,S.sign(...d,l);let g=await t.sendRawTransaction(S.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...p.value,signature:g},"finalized"),{status:"success",signature:g}}catch(l){return console.log("depositSol error",l),{status:"error",error:l}}},"depositSol"),Pm=r(async(t,e,o,n=new Ms(Q),s,a,i)=>{let c=Hs.fromSecretKey(new Uint8Array(e)).publicKey;return await Fs.depositSol(t,n,c,o,s,a,i)},"depositSOLInstruction");import{sleep as js}from"@skeet-framework/utils";var oo=r(async(t,e,o,n)=>{console.log(kt.white("Solana RPC URL:",t));let s=new Ys(t);o===0&&(o=await ro());let a=new xm("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(kt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new de(e),l=Lm.fromSecretKey(new Uint8Array(n)),c=nt;a.setSpinnerTitle(kt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await pe(t,n,c,l.publicKey);await js(1e3),a.setSpinnerTitle(kt.green("\u{1F504} Converting SOL to elSOL"));let d=await bt(s,n,o,i,new de(m),new de(_o),l.publicKey),u=0;for(;d.status!=="success";){if(u++,u>10)return a.stop(!0),console.log(kt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(kt.yellow(`\u23F3 ${u} Times Retrying...`)),await js(3e3),s=new Ys(t),d=await bt(s,n,o,i,new de(m),new de(_o),l.publicKey)}return a.stop(!0),console.log(kt.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
542
543
 
543
- Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as Im,Keypair as Pm,PublicKey as Dt}from"@solana/web3.js";import{Spinner as Lm}from"cli-spinner";import bt from"chalk";import{sleep as Us}from"@skeet-framework/utils";var Ms=r(async(t,e,o,n,s)=>{let a=new Im(t);o===0&&(o=await eo());let i=new Lm("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(bt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new Dt(e),l=await Ze(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(bt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=Pm.fromSecretKey(new Uint8Array(n)),u=await le(t,n,m,d.publicKey),p=await le(t,n,m,new Dt(vr),!0);await Us(1e3),i.setSpinnerTitle(bt.green(`\u{1F504} Converting SOL to ${s}`));let y=await $t(a,n,o,c,new Dt(u),new Dt(p),d.publicKey),A=0;for(;y.status!=="success";){if(A++,A>10)return i.stop(!0),console.log(bt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(bt.yellow(`\u23F3 ${A} Times Retrying...
544
- `)),await Us(1e3),y=await $t(a,n,o,c,new Dt(u),new Dt(p),d.publicKey)}return i.stop(!0),console.log(bt.white(`\u{1F4B0} You've got ${s} \u2728
544
+ Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as Vm,Keypair as $m,PublicKey as Ut}from"@solana/web3.js";import{Spinner as Dm}from"cli-spinner";import Mt from"chalk";import{sleep as Bs}from"@skeet-framework/utils";var Gs=r(async(t,e,o,n,s)=>{let a=new Vm(t);o===0&&(o=await ro());let i=new Dm("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(Mt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let l=new Ut(e),c=await eo(t,e);if(!c)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Mt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=c.poolMint,d=$m.fromSecretKey(new Uint8Array(n)),u=await pe(t,n,m,d.publicKey),p=await pe(t,n,m,new Ut(Ir),!0);await Bs(1e3),i.setSpinnerTitle(Mt.green(`\u{1F504} Converting SOL to ${s}`));let S=await bt(a,n,o,l,new Ut(u),new Ut(p),d.publicKey),g=0;for(;S.status!=="success";){if(g++,g>10)return i.stop(!0),console.log(Mt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Mt.yellow(`\u23F3 ${g} Times Retrying...
545
+ `)),await Bs(1e3),S=await bt(a,n,o,l,new Ut(u),new Ut(p),d.publicKey)}return i.stop(!0),console.log(Mt.white(`\u{1F4B0} You've got ${s} \u2728
545
546
 
546
- Signature:`,y.signature)),!0},"depositeLST");import{execSync as oo}from"node:child_process";import{homedir as $m}from"os";var Hs=r(t=>{h.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 o=Number(e.amount);console.log("RPC URL:",t.RPC_URL);let n=q,s=t.NETWORK===f.TESTNET,a=$m(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(oo(`solana config set --keypair ${i}`),!await Vm(i)){console.log(Kt.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
547
- `)),console.log(Kt.white(i));return}let c=JSON.parse(await xm(i,"utf-8"));if(e.elsol){await to(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await Ls(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Ms(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await Rs(t))return;let m=await V(),{validatorVoteAccount:d,stakeAccounts:u}=await bm(m);for await(let p of u)try{await Ns(p,d)}catch{console.log(Kt.yellow(`Network might be busy, please try again later
547
+ Signature:`,S.signature)),!0},"depositeLST");import{execSync as no}from"node:child_process";import{homedir as Um}from"os";var Js=r(t=>{h.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 o=Number(e.amount);console.log("RPC URL:",t.RPC_URL);let n=Q,s=t.NETWORK===f.TESTNET,a=Um(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(no(`solana config set --keypair ${i}`),!await bm(i)){console.log(Ht.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
548
+ `)),console.log(Ht.white(i));return}let l=JSON.parse(await Km(i,"utf-8"));if(e.elsol){await oo(t.RPC_URL,n,o,l);return}else if(e.lst){let c=await bs(t.RPC_URL);if(!c)return;n=c.stakePoolAddress,await Gs(t.RPC_URL,n,o,l,c.symbol);return}else{if(!await xs(t))return;let m=await V(),{validatorVoteAccount:d,stakeAccounts:u}=await Hm(m);for await(let p of u)try{await Is(p,d)}catch{console.log(Ht.yellow(`Network might be busy, please try again later
548
549
  You can use a custom RPC endpoint to avoid this issue
549
- `))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Um();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await Dm();for await(let n of o)try{await ks(n)}catch{console.log(Kt.yellow(`Network might be busy, please try again later
550
+ `))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Ym();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await Mm();for await(let n of o)try{await Vs(n)}catch{console.log(Ht.yellow(`Network might be busy, please try again later
550
551
  You can use a custom RPC endpoint to avoid this issue
551
- `))}}else{let o=await Mm();await Cs(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),eo=r(async()=>{let t=oo("solana address").toString().trim(),e=oo("solana balance").toString().replace("SOL","").trim();console.log(Kt.white(`\u{1F4D7} Selected Wallet: ${t}
552
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Kt.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await pe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Dm=r(async()=>{let t=await V();return await pe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),bm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===f.TESTNET?Km(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await pe.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 o}}])},"delegateStakeAsk"),Km=r(t=>{let n=`/home/solv/${t.NETWORK===f.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return oo(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),Um=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await pe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),Mm=r(async()=>{let t=(await V()).STAKE_ACCOUNTS;return await pe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:t},{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 Hm}from"child_process";var Fs=r(()=>{try{return Hm("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as Fm}from"child_process";var Ys=r(()=>{try{return Fm("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import dt from"chalk";import{Spinner as Ym}from"cli-spinner";var Ut;(function(t){t.successHex=dt.hex("#39A845"),t.warningHex=dt.hex("#FFD02E"),t.errorHex=dt.hex("#B5332E"),t.syncHex=dt.hex("#3073B7"),t.greyHex=dt.hex("#BEBDBD"),t.indigoHex=dt.hex("#3950A0"),t.pinkHex=dt.hex("#D8A1C4"),t.normal=e=>{console.log(dt.white(e))},t.syncSpinner=e=>{let o=new Ym(dt.white(e)+` %s
552
+ `))}}else{let o=await jm();await $s(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),ro=r(async()=>{let t=no("solana address").toString().trim(),e=no("solana balance").toString().replace("SOL","").trim();console.log(Ht.white(`\u{1F4D7} Selected Wallet: ${t}
553
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Ht.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ue.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Mm=r(async()=>{let t=await V();return await ue.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Hm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===f.TESTNET?Fm(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await ue.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 o}}])},"delegateStakeAsk"),Fm=r(t=>{let n=`/home/solv/${t.NETWORK===f.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return no(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),Ym=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await ue.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),jm=r(async()=>{let t=(await V()).STAKE_ACCOUNTS;return await ue.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:t},{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 Bm}from"child_process";var zs=r(()=>{try{return Bm("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as Gm}from"child_process";var Ws=r(()=>{try{return Gm("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import ut from"chalk";import{Spinner as Jm}from"cli-spinner";var Ft;(function(t){t.successHex=ut.hex("#39A845"),t.warningHex=ut.hex("#FFD02E"),t.errorHex=ut.hex("#B5332E"),t.syncHex=ut.hex("#3073B7"),t.greyHex=ut.hex("#BEBDBD"),t.indigoHex=ut.hex("#3950A0"),t.pinkHex=ut.hex("#D8A1C4"),t.normal=e=>{console.log(ut.white(e))},t.syncSpinner=e=>{let o=new Jm(ut.white(e)+` %s
553
554
  `);try{return o.setSpinnerString(18),o.start(),o}catch(n){throw o.stop(!0),new Error(`syncSpinner Error: ${n}`)}},t.solvAA=()=>{let e=t.syncHex(" _ "),o=t.syncHex(" | | "),n=t.syncHex(" ___ ___ | |")+t.errorHex("_ __ "),s=t.syncHex("/ __|/ _ \\| |")+t.errorHex("\\ \\ / /"),a=t.syncHex("\\__ \\ (_) | |")+t.errorHex(" \\ V / "),i=t.syncHex("|___/\\___/|_|")+t.errorHex(" \\_/ ");console.log(`
554
555
  ${e}`),console.log(`${o}`),console.log(`${n}`),console.log(`${s}`),console.log(`${a}`),console.log(`${i}
555
- `),console.log(`Solv Version: v${he}
556
+ `),console.log(`Solv Version: v${ye}
556
557
  `)},t.installMessage=()=>{let e=t.warningHex("\u{1F525} Welcome to Solana Validator Tool Solv \u{1F525}"),o=`
557
558
  Solv is born and ready for running Solana Validator \u{1F680}
558
559
 
@@ -573,8 +574,8 @@ $ solv mt -p <fileSystem>
573
574
  $ solv umt -p <fileSystem>
574
575
  `,s=`mount reload
575
576
  $ solv mtr
576
- `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(Ut||(Ut={}));import nt from"chalk";import{spawnSync as jm}from"node:child_process";var ro=r(t=>{jm("solana config get",{shell:!0,stdio:"inherit"});let o=ft();console.log(nt.white("start-validator.sh: ")+o.scriptPath),console.log(nt.white("solv.service: ")+x.SOL_SERVICE),console.log(nt.white("logrotate: ")+x.SOL_LOGROTATE),console.log(nt.white("sysctl.d: ")+x.SOL_SYSTEM_CONFIG21),console.log(nt.white("limits.d: ")+x.SOL_NOFILES_CONF),console.log(nt.white("system.conf: ")+x.SOL_SYSTEM_CONF),console.log(nt.white("ledger: ")+o.ledger),console.log(nt.white("accounts: ")+o.accounts),console.log(nt.white("snapshots: ")+o.snapshots),console.log(nt.white("mount type: ")+t.MNT_DISK_TYPE)},"showConfig");import{spawnSync as js}from"node:child_process";import Bm from"chalk";var Bs=r(t=>{let e=t.NETWORK===f.TESTNET,o=e?J:U;t.NODE_TYPE===E.RPC&&(o=Nt);let n=h.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");n.command("epoch").description("Show Validator's Epoch").action(()=>{let s=Fs();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=js(s,{shell:!0,stdio:"pipe"});console.log(Bm.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=Ys();console.log({slot:s})}),n.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","100").option("-s, --snapshotPath <snapshotPath>","Snapshot Path",t.SNAPSHOTS_PATH).option("-v, --version <version>","Specific Version Node",o).option("-r, --rpcUrl <rpcUrl>","RPC URL",e?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com").option("-a, --avorio <version>","Use Avorio Network (Testnet only)",!1).description("Download the latest snapshot").action(s=>{let a=s.minDownloadSpeed,i=s.snapshotPath,c=s.version,l=s.rpcUrl,m=s.avorio;xt(e,a,i,c,l,m)}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${et()} --ledger /mnt/ledger/ contact-info`;js(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solv Config").alias("c").action(async()=>{ro(t)}),n.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(s=>{Ut.solvAA(),s.client?Ut.installClientMessage():Ut.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Jm}from"node:child_process";var Js=r(()=>{Jm("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as Gm}from"node:child_process";var Gs=r(()=>{Gm("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as zm}from"node:child_process";var zs=r(()=>{zm("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Wm}from"node:child_process";var Ws=r(()=>{Wm("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as qm}from"node:child_process";var qs=r((t=!1)=>{qm(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import Ko from"chalk";import{spawnSync as Xm}from"child_process";import{spawnSync as Qm}from"node:child_process";var Qs=r(()=>{Qm("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Xs=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Js()}),t.command("start").description("Start Relayer").action(()=>{Gs()}),t.command("stop").description("Stop Relayer").action(()=>{zs()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{qs(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{Ws()}),t.command("enable").description("Enable Relayer").action(()=>{Qs()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(Ko.red("Please provide a URL"));return}let o=`${et()} --ledger ${w} set-relayer-config --relayer-url ${e.url}`;console.log(Ko.white("Setting Relayer URL ...")),Xm(o,{shell:!0,stdio:"inherit"}),console.log(Ko.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import Zs from"chalk";import{spawnSync as Zm}from"child_process";var ta=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;Zm(e,{shell:!0,stdio:"inherit"})}catch{console.log(Zs.yellow(`You might need to install the Solana SPL CLI:
577
- `)),console.log(Zs.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as ep}from"os";import{spawnSync as tp}from"child_process";var St=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=tp(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import op from"chalk";import{spawnSync as rp}from"node:child_process";var ea=r(t=>{h.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let n=`${ep()}/mainnet-authority-keypair.json`;await ta(n),process.exit(0)}await np(t),process.exit(0)})},"balanceCommands"),np=r(async t=>{let e=sp(t),o=`Validator Key: ${e.validatorKey}
577
+ `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(Ft||(Ft={}));import X from"chalk";import{spawnSync as zm}from"node:child_process";var so=r(t=>{zm("solana config get",{shell:!0,stdio:"inherit"});let o=ht();console.log(X.white("start-validator.sh: ")+o.scriptPath),console.log(X.white("solv.service: ")+C.SOL_SERVICE),console.log(X.white("logrotate: ")+C.SOL_LOGROTATE),console.log(X.white("logrotate (fd): ")+C.FRANKENDANCER_LOGROTATE),console.log(X.white("sysctl.d: ")+C.SOL_SYSTEM_CONFIG21),console.log(X.white("limits.d: ")+C.SOL_NOFILES_CONF),console.log(X.white("system.conf: ")+C.SOL_SYSTEM_CONF),console.log(X.white("ledger: ")+o.ledger),console.log(X.white("accounts: ")+o.accounts),console.log(X.white("snapshots: ")+o.snapshots),console.log(X.white("mount type: ")+t.MNT_DISK_TYPE)},"showConfig");import{spawnSync as qs}from"node:child_process";import Wm from"chalk";var Qs=r(t=>{let e=t.NETWORK===f.TESTNET,o=e?G:U;t.NODE_TYPE===A.RPC&&(o=vt);let n=h.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");n.command("epoch").description("Show Validator's Epoch").action(()=>{let s=zs();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=qs(s,{shell:!0,stdio:"pipe"});console.log(Wm.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=Ws();console.log({slot:s})}),n.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","100").option("-s, --snapshotPath <snapshotPath>","Snapshot Path",t.SNAPSHOTS_PATH).option("-v, --version <version>","Specific Version Node",o).option("-r, --rpcUrl <rpcUrl>","RPC URL",e?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com").option("-a, --avorio <version>","Use Avorio Network (Testnet only)",!1).description("Download the latest snapshot").action(s=>{let a=s.minDownloadSpeed,i=s.snapshotPath,l=s.version,c=s.rpcUrl,m=s.avorio;Dt(e,a,i,l,c,m)}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${ot()} --ledger /mnt/ledger/ contact-info`;qs(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solv Config").alias("c").action(async()=>{so(t)}),n.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(s=>{Ft.solvAA(),s.client?Ft.installClientMessage():Ft.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as qm}from"node:child_process";var Xs=r(()=>{qm("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as Qm}from"node:child_process";var Zs=r(()=>{Qm("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Xm}from"node:child_process";var ta=r(()=>{Xm("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Zm}from"node:child_process";var ea=r(()=>{Zm("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as tp}from"node:child_process";var oa=r((t=!1)=>{tp(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import Ho from"chalk";import{spawnSync as op}from"child_process";import{spawnSync as ep}from"node:child_process";var ra=r(()=>{ep("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var na=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Xs()}),t.command("start").description("Start Relayer").action(()=>{Zs()}),t.command("stop").description("Stop Relayer").action(()=>{ta()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{oa(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{ea()}),t.command("enable").description("Enable Relayer").action(()=>{ra()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(Ho.red("Please provide a URL"));return}let o=`${ot()} --ledger ${w} set-relayer-config --relayer-url ${e.url}`;console.log(Ho.white("Setting Relayer URL ...")),op(o,{shell:!0,stdio:"inherit"}),console.log(Ho.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import sa from"chalk";import{spawnSync as rp}from"child_process";var aa=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;rp(e,{shell:!0,stdio:"inherit"})}catch{console.log(sa.yellow(`You might need to install the Solana SPL CLI:
578
+ `)),console.log(sa.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as sp}from"os";import{spawnSync as np}from"child_process";var Tt=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=np(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import ap from"chalk";import{spawnSync as ip}from"node:child_process";var ia=r(t=>{h.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let n=`${sp()}/mainnet-authority-keypair.json`;await aa(n),process.exit(0)}await lp(t),process.exit(0)})},"balanceCommands"),lp=r(async t=>{let e=cp(t),o=`Validator Key: ${e.validatorKey}
578
579
  Address: ${e.validatorKeyAddress}
579
580
  Balance: ${e.validatorKeyBalance}
580
581
  Vote Key: ${e.voteKey}
@@ -583,21 +584,21 @@ Balance: ${e.voteKeyBalance}
583
584
  Authority Key: ${e.authorityKey}
584
585
  Address: ${e.authorityKeyAddress}
585
586
  Balance: ${e.authorityKeyBalance}
586
- Active Identity:`;t.NODE_TYPE===E.RPC&&(o=`Validator Key: ${e.validatorKey}
587
+ Active Identity:`;t.NODE_TYPE===A.RPC&&(o=`Validator Key: ${e.validatorKey}
587
588
  Address: ${e.validatorKeyAddress}
588
589
  Balance: ${e.validatorKeyBalance}
589
- Active Identity:`),console.log(op.white(o)),rp(`solana-keygen pubkey ${k}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),sp=r(t=>{let e=N(),o=t.NETWORK===f.TESTNET;return t.NODE_TYPE===E.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:v(e.mainnetValidatorKey),validatorKeyBalance:St(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:v(e.testnetValidatorKey),validatorKeyBalance:St(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:v(e.testnetValidatorVoteKey),voteKeyBalance:St(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:v(e.testnetValidatorAuthorityKey),authorityKeyBalance:St(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:v(e.mainnetValidatorKey),validatorKeyBalance:St(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:v(e.mainnetValidatorVoteKey),voteKeyBalance:St(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:v(e.mainnetValidatorAuthorityKey),authorityKeyBalance:St(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as ap}from"child_process";var oa=r(()=>{ap("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as Uo}from"node:child_process";var ra=r(t=>{Uo("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),t.SNAPSHOTS_PATH!=="/mnt/ledger"&&Uo(`sudo rm -rf ${t.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),Uo("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as ip}from"node:child_process";var na=r(t=>{let o=`${et()} --ledger ${t.LEDGER_PATH} monitor`;ip(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as cp}from"node:child_process";var sa=r(()=>{cp("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import no from"inquirer";import{execSync as so,spawnSync as Mo}from"child_process";import de from"chalk";import{homedir as lp}from"os";var aa=1e3,Ho;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})(Ho||(Ho={}));var ao;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(ao||(ao={}));var mp=Object.values(Ho),ia=r(t=>{h.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(de.blue(`\u2728 Coming Soon
590
+ Active Identity:`),console.log(ap.white(o)),ip(`solana-keygen pubkey ${k}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),cp=r(t=>{let e=N(),o=t.NETWORK===f.TESTNET;return t.NODE_TYPE===A.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:v(e.mainnetValidatorKey),validatorKeyBalance:Tt(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:v(e.testnetValidatorKey),validatorKeyBalance:Tt(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:v(e.testnetValidatorVoteKey),voteKeyBalance:Tt(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:v(e.testnetValidatorAuthorityKey),authorityKeyBalance:Tt(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:v(e.mainnetValidatorKey),validatorKeyBalance:Tt(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:v(e.mainnetValidatorVoteKey),voteKeyBalance:Tt(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:v(e.mainnetValidatorAuthorityKey),authorityKeyBalance:Tt(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as mp}from"child_process";var la=r(()=>{mp("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as Fo}from"node:child_process";var ca=r(t=>{Fo("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),t.SNAPSHOTS_PATH!=="/mnt/ledger"&&Fo(`sudo rm -rf ${t.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),Fo("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as pp}from"node:child_process";var ma=r(t=>{let o=`${ot()} --ledger ${t.LEDGER_PATH} monitor`;pp(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as dp}from"node:child_process";var pa=r(()=>{dp("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import ao from"inquirer";import{execSync as io,spawnSync as Yo}from"child_process";import fe from"chalk";import{homedir as up}from"os";var da=1e3,jo;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})(jo||(jo={}));var lo;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(lo||(lo={}));var fp=Object.values(jo),ua=r(t=>{h.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
590
591
  This Feature is Currently Under Development
591
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await pp(),a="0";try{let u=Mo(`solana balance ${s} --url ${t.RPC_URL}`,{shell:!0});if(u.status!==0)throw new Error("Invalid Wallet Address");a=u.stdout.toString(),console.log("toBalance:",a)}catch{console.log(de.red(`\u274C To Wallet is Invalid
592
- Please Check the Wallet Address`)),process.exit(0)}let i=so(`solana balance ${n} --url ${t.RPC_URL}`).toString();console.log(de.white(`\u{1F3E6} From Wallet: ${n}
593
- \u{1F4B0} Balance: ${i}`)),console.log(de.white(`\u{1F3E6} To Wallet: ${s}
594
- \u{1F4B0} Balance: ${a}`));let{amount:c}=await no.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),l=`solana transfer ${s} ${c} --allow-unfunded-recipient --keypair ${o} --url ${t.RPC_URL}`,m=Mo(l,{shell:!0,stdio:"inherit"}),d=Te;for(;m.status!==0&&d>0;)console.log(de.red(`\u274C Transaction Failed
595
- Retrying Transaction in ${aa}ms
596
- Retries Left: ${d}`)),await M(aa),m=Mo(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),Fo=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),pp=r(async()=>{let t=lp(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=so(`solana address -k ${n}`).toString().trim(),a=await no.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:mp}]),i=a.from==="Validator Account"?Object.values(ao).filter(u=>u!=="Validator Account"):Object.values(ao).filter(u=>u!=="Authority Account");if((await no.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:u}=await no.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:Fo}]);s=u}else{let u=a.from==="Validator Account"?e:o;n=`${t}/${u}`,s=so(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=so(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import ca from"chalk";import dp from"inquirer";import{execSync as Yo,spawnSync as up}from"node:child_process";var la=r(async(t,e=!1)=>{let o=t.NETWORK===f.TESTNET,n=o?Oe:t.RPC_URL,s=o?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",a=o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",i=o?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",c=Yo(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(ca.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(ca.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let y=await dp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(y.sol)}let d=Yo(`solana address --keypair ${i}`).toString().trim(),u=Yo(`solana address --keypair ${a}`).toString().trim(),p=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${u} ${l} --authorized-withdrawer ${a} --url ${n}`;up(p,{shell:!0,stdio:"inherit"})},"withdraw");var ma=r(t=>{h.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await la(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as Op,spawnSync as Rp}from"node:child_process";import{BN as da}from"bn.js";import{LAMPORTS_PER_SOL as jo}from"@solana/web3.js";import{Connection as Sp,LAMPORTS_PER_SOL as Tp}from"@solana/web3.js";import{Keypair as fp}from"@solana/web3.js";import{readFile as hp}from"fs/promises";var yp=r(async t=>{let e=JSON.parse(await hp(t,"utf8"));return fp.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),pa=yp;import{homedir as gp}from"os";var z;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(z||(z={}));var Ep={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},Ap=r(async(t,e="auth",o=!1)=>{let n=new Sp(t),s=gp(),a=N(s),c=`${o?"testnet":"mainnet"}${Ep[e]}`,l=a[c],m=await pa(l),d=await n.getBalance(m.publicKey),p=Number(d)/Tp;if(isNaN(p))throw new Error("Failed to get balance");return p},"getBalance"),st=Ap;var wp=new da(3*jo),ua=r(async t=>{let e=await st(t,z.VALIDATOR),n=new da(Number(Number(e)*jo)).sub(wp),s=Number(n)/jo;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import ue from"chalk";import{Keypair as _p,Connection as Np,PublicKey as vp,SystemProgram as fa,ComputeBudgetProgram as io,VersionedTransaction as ha,TransactionMessage as ya}from"@solana/web3.js";var Sa=r(async(t,e,o,n)=>{let s=0;try{let a=new Np(t,"finalized"),i=_p.fromSecretKey(new Uint8Array(Array.from(e))),c=new vp(o),l=n;for(;;)try{let m=[fa.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),io.setComputeUnitLimit({units:2e5}),io.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),u=new ha(new ya({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),p=await a.simulateTransaction(u,{replaceRecentBlockhash:!0,sigVerify:!1});u.sign([i]);let y=[fa.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),io.setComputeUnitLimit({units:p.value.unitsConsumed?Math.trunc(p.value.unitsConsumed*1.2):2e5}),io.setComputeUnitPrice({microLamports:1e3})],A=new ha(new ya({instructions:y,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message());A.sign([i]);let S=await a.sendRawTransaction(A.serialize());return await a.confirmTransaction({...d.value,signature:S},"finalized"),console.log("finalized signature:",S),S}catch(m){if(s++,s>Te)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await M(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as kp}from"fs/promises";import{LAMPORTS_PER_SOL as Cp}from"@solana/web3.js";var Bo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=N();await st(t,z.VOTE)<1?(console.log(ue.white("Vote Account Balance is less than 1 SOL")),console.log(ue.white("Skip withdrawing SOL from Vote Account to Authority Account"))):Rp("solv withdraw --all",{shell:!0,stdio:"inherit"});let s=await ua(t);console.log(ue.white(`Transferable Balance: ${s} SOL`));let a=s*Cp;if(s<1)console.log(ue.white("Validator Account Balance is less than 1 SOL")),console.log(ue.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=Op(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await kp(o,"utf-8"));await Sa(t,c,i,a)}return!0},"collectSOL");import{readFile as Mp}from"fs/promises";import Hp from"inquirer";import Jo from"chalk";import{execSync as Ip}from"child_process";import{homedir as Pp}from"os";var Lp=r(async t=>{try{let e=Pp(),{mainnetValidatorAuthorityKey:o}=N(e),n=`spl-token balance ${rt} --owner ${o} --url ${t}`,s=Ip(n).toString().trim();return Number(s)}catch(e){return console.log(Jo.red(`Error: ${e}`)),console.log(Jo.yellow(`You might need to install the Solana SPL CLI:
597
- `)),console.log(Jo.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Ta=Lp;import mo from"chalk";import{Connection as xp,PublicKey as ga,Keypair as Vp,ComputeBudgetProgram as co,VersionedTransaction as Ea,TransactionMessage as Aa}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as wa,createTransferInstruction as _a,TOKEN_PROGRAM_ID as Na}from"@solana/spl-token";var va=r(async(t,e,o,n,s,a)=>{try{let i=new xp(t,"finalized"),c=Vp.fromSecretKey(new Uint8Array(e)),l=new ga(o),m=new ga(s),d=Math.trunc(n*Math.pow(10,a)),u=await wa(i,c,m,c.publicKey),p=await wa(i,c,m,l,!0);for(;;)try{let y=[_a(u.address,p.address,c.publicKey,d,[],Na),co.setComputeUnitLimit({units:2e5}),co.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],A=await i.getLatestBlockhashAndContext({commitment:"finalized"}),S=new Ea(new Aa({instructions:y,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message()),g=await i.simulateTransaction(S,{replaceRecentBlockhash:!0,sigVerify:!1});S.sign([c]);let $=[_a(u.address,p.address,c.publicKey,d,[],Na),co.setComputeUnitLimit({units:g.value.unitsConsumed?Math.trunc(g.value.unitsConsumed*1.2):2e5}),co.setComputeUnitPrice({microLamports:1e3})],R=new Ea(new Aa({instructions:$,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message());R.sign([c]);let Y=await i.sendRawTransaction(R.serialize());return await i.confirmTransaction({...A.value,signature:Y},"finalized"),console.log("finalized signature:",Y),Y}catch(y){console.error("Transfer failed, retrying...",y)}}catch(i){throw console.error(i),i}},"transferSPLToken");import lo from"inquirer";import{spawnSync as Oa}from"child_process";import Go from"chalk";import{promises as Ra}from"fs";var $p=r(async(t="epochTimer")=>{try{let e=Oa("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Go.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
592
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await hp(),a="0";try{let u=Yo(`solana balance ${s} --url ${t.RPC_URL}`,{shell:!0});if(u.status!==0)throw new Error("Invalid Wallet Address");a=u.stdout.toString(),console.log("toBalance:",a)}catch{console.log(fe.red(`\u274C To Wallet is Invalid
593
+ Please Check the Wallet Address`)),process.exit(0)}let i=io(`solana balance ${n} --url ${t.RPC_URL}`).toString();console.log(fe.white(`\u{1F3E6} From Wallet: ${n}
594
+ \u{1F4B0} Balance: ${i}`)),console.log(fe.white(`\u{1F3E6} To Wallet: ${s}
595
+ \u{1F4B0} Balance: ${a}`));let{amount:l}=await ao.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),c=`solana transfer ${s} ${l} --allow-unfunded-recipient --keypair ${o} --url ${t.RPC_URL}`,m=Yo(c,{shell:!0,stdio:"inherit"}),d=ge;for(;m.status!==0&&d>0;)console.log(fe.red(`\u274C Transaction Failed
596
+ Retrying Transaction in ${da}ms
597
+ Retries Left: ${d}`)),await M(da),m=Yo(c,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),Bo=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),hp=r(async()=>{let t=up(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=io(`solana address -k ${n}`).toString().trim(),a=await ao.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:fp}]),i=a.from==="Validator Account"?Object.values(lo).filter(u=>u!=="Validator Account"):Object.values(lo).filter(u=>u!=="Authority Account");if((await ao.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:u}=await ao.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:Bo}]);s=u}else{let u=a.from==="Validator Account"?e:o;n=`${t}/${u}`,s=io(`solana address -k ${n}`).toString().trim()}let c=a.from==="Validator Account"?o:e,m=`${t}/${c}`,d=io(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import fa from"chalk";import Sp from"inquirer";import{execSync as Go,spawnSync as yp}from"node:child_process";var ha=r(async(t,e=!1)=>{let o=t.NETWORK===f.TESTNET,n=o?ke:t.RPC_URL,s=o?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",a=o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",i=o?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",l=Go(`solana balance ${i}`).toString().replace("SOL","").trim(),c=0,m=Number(l)-.03;if(e)c=m;else{console.log(fa.white("\u{1F4B0} Current Vote Account Balance:",l+" SOL")),console.log(fa.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let S=await Sp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);c=Number(S.sol)}let d=Go(`solana address --keypair ${i}`).toString().trim(),u=Go(`solana address --keypair ${a}`).toString().trim(),p=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${u} ${c} --authorized-withdrawer ${a} --url ${n}`;yp(p,{shell:!0,stdio:"inherit"})},"withdraw");var Sa=r(t=>{h.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await ha(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as Ip,spawnSync as Pp}from"node:child_process";import{BN as Ta}from"bn.js";import{LAMPORTS_PER_SOL as Jo}from"@solana/web3.js";import{Connection as Ap,LAMPORTS_PER_SOL as wp}from"@solana/web3.js";import{Keypair as Tp}from"@solana/web3.js";import{readFile as Ep}from"fs/promises";var gp=r(async t=>{let e=JSON.parse(await Ep(t,"utf8"));return Tp.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),ya=gp;import{homedir as _p}from"os";var W;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(W||(W={}));var Np={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},vp=r(async(t,e="auth",o=!1)=>{let n=new Ap(t),s=_p(),a=N(s),l=`${o?"testnet":"mainnet"}${Np[e]}`,c=a[l],m=await ya(c),d=await n.getBalance(m.publicKey),p=Number(d)/wp;if(isNaN(p))throw new Error("Failed to get balance");return p},"getBalance"),at=vp;var Op=new Ta(3*Jo),Ea=r(async t=>{let e=await at(t,W.VALIDATOR),n=new Ta(Number(Number(e)*Jo)).sub(Op),s=Number(n)/Jo;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import he from"chalk";import{Keypair as Rp,Connection as kp,PublicKey as Cp,SystemProgram as ga,ComputeBudgetProgram as co,VersionedTransaction as Aa,TransactionMessage as wa}from"@solana/web3.js";var _a=r(async(t,e,o,n)=>{let s=0;try{let a=new kp(t,"finalized"),i=Rp.fromSecretKey(new Uint8Array(Array.from(e))),l=new Cp(o),c=n;for(;;)try{let m=[ga.transfer({fromPubkey:i.publicKey,toPubkey:l,lamports:c}),co.setComputeUnitLimit({units:2e5}),co.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),u=new Aa(new wa({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),p=await a.simulateTransaction(u,{replaceRecentBlockhash:!0,sigVerify:!1});u.sign([i]);let S=[ga.transfer({fromPubkey:i.publicKey,toPubkey:l,lamports:c}),co.setComputeUnitLimit({units:p.value.unitsConsumed?Math.trunc(p.value.unitsConsumed*1.2):2e5}),co.setComputeUnitPrice({microLamports:1e3})],g=new Aa(new wa({instructions:S,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message());g.sign([i]);let y=await a.sendRawTransaction(g.serialize());return await a.confirmTransaction({...d.value,signature:y},"finalized"),console.log("finalized signature:",y),y}catch(m){if(s++,s>ge)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await M(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as Lp}from"fs/promises";import{LAMPORTS_PER_SOL as xp}from"@solana/web3.js";var zo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=N();await at(t,W.VOTE)<1?(console.log(he.white("Vote Account Balance is less than 1 SOL")),console.log(he.white("Skip withdrawing SOL from Vote Account to Authority Account"))):Pp("solv withdraw --all",{shell:!0,stdio:"inherit"});let s=await Ea(t);console.log(he.white(`Transferable Balance: ${s} SOL`));let a=s*xp;if(s<1)console.log(he.white("Validator Account Balance is less than 1 SOL")),console.log(he.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=Ip(`solana address --keypair ${e}`).toString().trim(),l=JSON.parse(await Lp(o,"utf-8"));await _a(t,l,i,a)}return!0},"collectSOL");import{readFile as jp}from"fs/promises";import Bp from"inquirer";import Wo from"chalk";import{execSync as Vp}from"child_process";import{homedir as $p}from"os";var Dp=r(async t=>{try{let e=$p(),{mainnetValidatorAuthorityKey:o}=N(e),n=`spl-token balance ${nt} --owner ${o} --url ${t}`,s=Vp(n).toString().trim();return Number(s)}catch(e){return console.log(Wo.red(`Error: ${e}`)),console.log(Wo.yellow(`You might need to install the Solana SPL CLI:
598
+ `)),console.log(Wo.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Na=Dp;import uo from"chalk";import{Connection as Kp,PublicKey as va,Keypair as bp,ComputeBudgetProgram as mo,VersionedTransaction as Oa,TransactionMessage as Ra}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as ka,createTransferInstruction as Ca,TOKEN_PROGRAM_ID as Ia}from"@solana/spl-token";var Pa=r(async(t,e,o,n,s,a)=>{try{let i=new Kp(t,"finalized"),l=bp.fromSecretKey(new Uint8Array(e)),c=new va(o),m=new va(s),d=Math.trunc(n*Math.pow(10,a)),u=await ka(i,l,m,l.publicKey),p=await ka(i,l,m,c,!0);for(;;)try{let S=[Ca(u.address,p.address,l.publicKey,d,[],Ia),mo.setComputeUnitLimit({units:2e5}),mo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],g=await i.getLatestBlockhashAndContext({commitment:"finalized"}),y=new Oa(new Ra({instructions:S,payerKey:l.publicKey,recentBlockhash:g.value.blockhash}).compileToV0Message()),E=await i.simulateTransaction(y,{replaceRecentBlockhash:!0,sigVerify:!1});y.sign([l]);let $=[Ca(u.address,p.address,l.publicKey,d,[],Ia),mo.setComputeUnitLimit({units:E.value.unitsConsumed?Math.trunc(E.value.unitsConsumed*1.2):2e5}),mo.setComputeUnitPrice({microLamports:1e3})],R=new Oa(new Ra({instructions:$,payerKey:l.publicKey,recentBlockhash:g.value.blockhash}).compileToV0Message());R.sign([l]);let Y=await i.sendRawTransaction(R.serialize());return await i.confirmTransaction({...g.value,signature:Y},"finalized"),console.log("finalized signature:",Y),Y}catch(S){console.error("Transfer failed, retrying...",S)}}catch(i){throw console.error(i),i}},"transferSPLToken");import po from"inquirer";import{spawnSync as La}from"child_process";import qo from"chalk";import{promises as xa}from"fs";var Up=r(async(t="epochTimer")=>{try{let e=La("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(qo.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
598
599
  `).filter(a=>!a.includes(t)).join(`
599
- `),s="/tmp/temp_crontab";await Ra.writeFile(s,n,"utf-8"),Oa("crontab",[s]),await Ra.unlink(s),console.log(Go.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Go.red("Error removing cron job:",e))}},"removeCronJob"),ka=$p;import Ca from"chalk";var Dp=r(async t=>{let e=t.NETWORK===f.TESTNET,o=await lo.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await ze()&&await ka(),await O({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
600
- ${Ca.green("No more Login to the server to update \u{1F331}")}
600
+ `),s="/tmp/temp_crontab";await xa.writeFile(s,n,"utf-8"),La("crontab",[s]),await xa.unlink(s),console.log(qo.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(qo.red("Error removing cron job:",e))}},"removeCronJob"),Va=Up;import $a from"chalk";var Mp=r(async t=>{let e=t.NETWORK===f.TESTNET,o=await po.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await qe()&&await Va(),await O({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
601
+ ${$a.green("No more Login to the server to update \u{1F331}")}
601
602
 
602
603
  If you enable this, solv will update automatically when the solv/solana version is updated.
603
604
 
@@ -605,81 +606,81 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
605
606
 
606
607
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
607
608
  \u203B Please turn off if you are using no-downtime migration.
608
- `;console.log(Ca.white(n));let s=await lo.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}]),a=t.RPC_URL,i="",c=await lo.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);return e?i="":a=(await lo.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL}])).rpcUrl,await O({HARVEST_ACCOUNT:i,IS_MEV_MODE:o.mevOn,RPC_URL:a,DISCORD_WEBHOOK_URL:c.discordWebhookUrl,AUTO_UPDATE:s.autoUpdate,AUTO_RESTART:s.autoRestart}),!0},"mevOn"),Ia=Dp;import{spawnSync as Fp}from"node:child_process";import{Connection as Up}from"@solana/web3.js";import{Connection as bp}from"@solana/web3.js";var Kp=r(async(t,e=10,o=.4)=>{try{let s=await new bp(t).getRecentPerformanceSamples(e);if(s.length===0)return console.warn("No performance samples available. Using fallback slot time."),o;let a=s.filter(c=>c.numSlots!==0);return a.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),o):a.reduce((c,l)=>c+l.samplePeriodSecs/l.numSlots,0)/a.length}catch(n){return console.error(`getAverageSlotTime failed: ${n}. Using fallback slot time.`),o}},"getAverageSlotTime"),Pa=Kp;var zo=r(async t=>{try{let o=await new Up(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await Pa(t);console.log("timePerSlotSeconds",n);let a=(o.slotsInEpoch-o.slotIndex)*n,i=(o.slotIndex/o.slotsInEpoch*100).toFixed(2),c=Math.floor(a/(3600*24)),l=Math.floor(a%(3600*24)/3600),m=Math.floor(a%3600/60),d=Math.floor(a%60),u=`${c}d ${l}h ${m}m ${d}s`;return c===0&&(u=`${l}h ${m}m ${d}s`),{...o,estimatedTimeUntilNextEpoch:u,displayRatio:i}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var Yp=.03,La=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await jp(t),{mainnetValidatorAuthorityKey:o}=N();console.log("Harvesting SOL..."),await Bo(t.RPC_URL);let n=await st(t.RPC_URL,z.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await M(1e3),await Bo(t.RPC_URL),n=await st(t.RPC_URL,z.VOTE),s++;let a=JSON.parse(await Mp(o,"utf-8")),i=await st(t.RPC_URL,z.AUTH);if(i<1)console.log(mo.white("Authority Account Balance is less than 1 SOL")),console.log(mo.white("Skip converting SOL to elSOL"));else{let l=i-Yp;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await to(t.RPC_URL,q,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await Ta(t.RPC_URL);if(c<1){let l=await zo(t.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let m=`elSOL Balance is less than 1 elSOL for ${l.epoch}`;await Q(m),process.exit(0)}if(console.log(`Transferring ${c} elSOL to Harvest Address`),await va(t.RPC_URL,a,e,c,rt,Or),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await zo(t.RPC_URL)).epoch} \u{1F4B0}
609
+ `;console.log($a.white(n));let s=await po.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}]),a=t.RPC_URL,i="",l=await po.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);return e?i="":a=(await po.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL}])).rpcUrl,await O({HARVEST_ACCOUNT:i,IS_MEV_MODE:o.mevOn,RPC_URL:a,DISCORD_WEBHOOK_URL:l.discordWebhookUrl,AUTO_UPDATE:s.autoUpdate,AUTO_RESTART:s.autoRestart}),!0},"mevOn"),Da=Mp;import{spawnSync as Gp}from"node:child_process";import{Connection as Yp}from"@solana/web3.js";import{Connection as Hp}from"@solana/web3.js";var Fp=r(async(t,e=10,o=.4)=>{try{let s=await new Hp(t).getRecentPerformanceSamples(e);if(s.length===0)return console.warn("No performance samples available. Using fallback slot time."),o;let a=s.filter(l=>l.numSlots!==0);return a.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),o):a.reduce((l,c)=>l+c.samplePeriodSecs/c.numSlots,0)/a.length}catch(n){return console.error(`getAverageSlotTime failed: ${n}. Using fallback slot time.`),o}},"getAverageSlotTime"),Ka=Fp;var Qo=r(async t=>{try{let o=await new Yp(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await Ka(t);console.log("timePerSlotSeconds",n);let a=(o.slotsInEpoch-o.slotIndex)*n,i=(o.slotIndex/o.slotsInEpoch*100).toFixed(2),l=Math.floor(a/(3600*24)),c=Math.floor(a%(3600*24)/3600),m=Math.floor(a%3600/60),d=Math.floor(a%60),u=`${l}d ${c}h ${m}m ${d}s`;return l===0&&(u=`${c}h ${m}m ${d}s`),{...o,estimatedTimeUntilNextEpoch:u,displayRatio:i}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var Jp=.03,ba=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await zp(t),{mainnetValidatorAuthorityKey:o}=N();console.log("Harvesting SOL..."),await zo(t.RPC_URL);let n=await at(t.RPC_URL,W.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await M(1e3),await zo(t.RPC_URL),n=await at(t.RPC_URL,W.VOTE),s++;let a=JSON.parse(await jp(o,"utf-8")),i=await at(t.RPC_URL,W.AUTH);if(i<1)console.log(uo.white("Authority Account Balance is less than 1 SOL")),console.log(uo.white("Skip converting SOL to elSOL"));else{let c=i-Jp;if(c=Math.round(c*1e9)/1e9,console.log(`Converting ${c} SOL to elSOL`),!await oo(t.RPC_URL,Q,c,a))throw new Error("Failed to convert SOL to elSOL")}let l=await Na(t.RPC_URL);if(l<1){let c=await Qo(t.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let m=`elSOL Balance is less than 1 elSOL for ${c.epoch}`;await z(m),process.exit(0)}if(console.log(`Transferring ${l} elSOL to Harvest Address`),await Pa(t.RPC_URL,a,e,l,nt,Pr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Qo(t.RPC_URL)).epoch} \u{1F4B0}
609
610
  Validator Address: ${v(o)}
610
- Total Reward: ${c} elSOL
611
- Harvest Address: ${e}`;await Q(m)}console.log(mo.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Ia(t)&&(Fp("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(mo.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),jp=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await Hp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:Fo}]);return await O({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as cd}from"@skeet-framework/utils";import{writeFile as Bp}from"fs/promises";var Jp=r(async t=>{await Bp(ve,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),Tt=Jp;var Gp=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&await Tt({...e,isLessThan1Day:!0})},"isLessThan1Day"),xa=Gp;var zp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&await Tt({...e,isLessThan8Hours:!0})},"lessThan8Hour"),Va=zp;var Wp=r(async(t,e,o,n)=>t<60&&!e.isLessThan1Hour?(await Tt({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),$a=Wp;var qp=r(async(t,e)=>{let o=e.NETWORK===f.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?v(a):v(s);await Tt(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
611
+ Total Reward: ${l} elSOL
612
+ Harvest Address: ${e}`;await z(m)}console.log(uo.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Da(t)&&(Gp("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(uo.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),zp=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await Bp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:Bo}]);return await O({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as dd}from"@skeet-framework/utils";import{writeFile as Wp}from"fs/promises";var qp=r(async t=>{await Wp(Re,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),Et=qp;var Qp=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&await Et({...e,isLessThan1Day:!0})},"isLessThan1Day"),Ua=Qp;var Xp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&await Et({...e,isLessThan8Hours:!0})},"lessThan8Hour"),Ma=Xp;var Zp=r(async(t,e,o,n)=>t<60&&!e.isLessThan1Hour?(await Et({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),Ha=Zp;var td=r(async(t,e)=>{let o=e.NETWORK===f.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?v(a):v(s);await Et(n),console.log("Epoch has been updated!");let l=`===\u23F3 ${t.epoch} \u23F3===
612
613
  Validator: ${i}
613
614
  Network: ${e.NETWORK}
614
615
  CurrentEpoch: ${t.epoch}
615
616
  Epoch has been updated!
616
- Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),Da=qp;import{existsAsync as Qp}from"@skeet-framework/utils";import{readFile as Xp,writeFile as Zp}from"fs/promises";import td from"chalk";import{homedir as ed}from"os";var od=r(async()=>{let e=ed().includes("/home/solv")?ve:"./currentEpoch.json";if(await Qp(e))return JSON.parse(await Xp(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await Zp(e,JSON.stringify(o,null,2),"utf-8"),console.log(td.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),ba=od;import rd from"chalk";var nd=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===f.TESTNET;if(o&&(e=ar),await st(e,z.VALIDATOR,o)<wo){let{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?v(a):v(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${wo} SOL
617
+ Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),Fa=td;import{existsAsync as ed}from"@skeet-framework/utils";import{readFile as od,writeFile as rd}from"fs/promises";import nd from"chalk";import{homedir as sd}from"os";var ad=r(async()=>{let e=sd().includes("/home/solv")?Re:"./currentEpoch.json";if(await ed(e))return JSON.parse(await od(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await rd(e,JSON.stringify(o,null,2),"utf-8"),console.log(nd.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),Ya=ad;import id from"chalk";var ld=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===f.TESTNET;if(o&&(e=cr),await at(e,W.VALIDATOR,o)<No){let{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?v(a):v(s),l=`\u26A0\uFE0F Validator Account Balance is less than ${No} SOL
617
618
  Please top up your Validator Account
618
- Address: ${i}`;return await Q(c),!1}return console.log(rd.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Ka=nd;async function sd(t="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${t}`,o=await fetch(e);if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return(await o.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${t}:`,e),null}}r(sd,"getNpmLatestVersion");var Ua=sd;async function ad(){let t=Pt(),e=await Ua();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(ad,"isVersionSame");var Ma=ad;import{spawnSync as ld}from"child_process";import{spawnSync as id}from"node:child_process";var Ha=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=id(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
619
- `),a=s.find(p=>p.includes("Epoch Completed Time:")),i=s.find(p=>p.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(p=>p.includes("Epoch:"))?.replace("Epoch:",""));if(!a||!i||!c)throw new Error("Epoch Completed Time not found");let m=a.split("(")[1].replace(" remaining)","");console.log("remainingTime:",m);let d=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,u=m.match(d);if(u){let p=u[1]?parseInt(u[1]):0,y=u[2]?parseInt(u[2]):0,A=u[3]?parseInt(u[3]):0,S=u[4]?parseInt(u[4]):0,g=p*24*60+y*60+A+Math.floor(S/60);return{epoch:c,day:p,hour:y,min:A,sec:S,totalMinutes:g,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var md=r(async t=>{let e=t.NETWORK===f.TESTNET,o=e?Oe:t.RPC_URL,n=cd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await ba(),a=Ha(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=N(),m=await Zt(o,v(e?c:i));if(console.log(`Validator is active: ${m.isActive}`),await Ka(t),!await Ma()&&t.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),ld("solv update && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Da(a,t),"Epoch has been updated!";let u=a.totalMinutes,p=[$a,Va,xa];for(let y of p)if(await y(u,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),Fa=md;var Ya=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await Fa(t),process.exit(0)})},"epochTimerCommands");import ri from"inquirer";import{join as Ga}from"path";import{spawnSync as Ft}from"node:child_process";import G from"chalk";import{spawnSync as pd}from"node:child_process";var dd=r((t,e,o,n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=pd(`ssh -i ${s} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:n});return i.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
619
+ Address: ${i}`;return await z(l),!1}return console.log(id.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),ja=ld;async function cd(t="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${t}`,o=await fetch(e);if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return(await o.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${t}:`,e),null}}r(cd,"getNpmLatestVersion");var Ba=cd;async function md(){let t=Lt(),e=await Ba();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(md,"isVersionSame");var Ga=md;import{spawnSync as ud}from"child_process";import{spawnSync as pd}from"node:child_process";var Ja=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=pd(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
620
+ `),a=s.find(p=>p.includes("Epoch Completed Time:")),i=s.find(p=>p.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),l=Number(s.find(p=>p.includes("Epoch:"))?.replace("Epoch:",""));if(!a||!i||!l)throw new Error("Epoch Completed Time not found");let m=a.split("(")[1].replace(" remaining)","");console.log("remainingTime:",m);let d=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,u=m.match(d);if(u){let p=u[1]?parseInt(u[1]):0,S=u[2]?parseInt(u[2]):0,g=u[3]?parseInt(u[3]):0,y=u[4]?parseInt(u[4]):0,E=p*24*60+S*60+g+Math.floor(y/60);return{epoch:l,day:p,hour:S,min:g,sec:y,totalMinutes:E,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var fd=r(async t=>{let e=t.NETWORK===f.TESTNET,o=e?ke:t.RPC_URL,n=dd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await Ya(),a=Ja(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:l}=N(),m=await ee(o,v(e?l:i));if(console.log(`Validator is active: ${m.isActive}`),await ja(t),!await Ga()&&t.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),ud("solv update && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Fa(a,t),"Epoch has been updated!";let u=a.totalMinutes,p=[Ha,Ma,Ua];for(let S of p)if(await S(u,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),za=fd;var Wa=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await za(t),process.exit(0)})},"epochTimerCommands");import ci from"inquirer";import{join as Za}from"path";import{spawnSync as Bt}from"node:child_process";import J from"chalk";import{spawnSync as hd}from"node:child_process";var Sd=r((t,e,o,n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=hd(`ssh -i ${s} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:n});return i.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
620
621
  $ ssh solv@${t}
621
622
 
622
- Failed Cmd: ${e}`),a={status:i.status,stdout:String(i.stdout),stderr:i.stderr.toString()},a):(a={status:i.status,stdout:i.stdout.toString(),stderr:i.stderr.toString()},a)}catch(i){return console.log(`scpSSH Error: ${i}`),a={status:null,stdout:"",stderr:String(i)},a}},"scpSSH"),po=dd;import ja from"chalk";var ud=r((t,e,o)=>{console.log(ja.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let n=v(t).trim(),s=po(e,`solana-keygen pubkey ${t}`,o).stdout.toString().trim();return n!==s?(console.log(ja.yellow(`\u26A0\uFE0F Destination Identity Key is different.
623
+ Failed Cmd: ${e}`),a={status:i.status,stdout:String(i.stdout),stderr:i.stderr.toString()},a):(a={status:i.status,stdout:i.stdout.toString(),stderr:i.stderr.toString()},a)}catch(i){return console.log(`scpSSH Error: ${i}`),a={status:null,stdout:"",stderr:String(i)},a}},"scpSSH"),fo=Sd;import qa from"chalk";var yd=r((t,e,o)=>{console.log(qa.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let n=v(t).trim(),s=fo(e,`solana-keygen pubkey ${t}`,o).stdout.toString().trim();return n!==s?(console.log(qa.yellow(`\u26A0\uFE0F Destination Identity Key is different.
623
624
  Please check your Validator
624
625
  $ ssh ${o}@${e}
625
626
 
626
627
  Local Identity Key: ${n}
627
- Destination Identity Key: ${s}`)),!1):!0},"checkValidatorKey"),Mt=ud;var fd="agave-validator -l /mnt/ledger",hd="sudo fdctl",yd="--config /home/solv/firedancer/config.toml ",Sd=r(t=>t==="agave"?[fd,""]:[hd,yd],"getSolanaCLIActive"),Ht=Sd;var Ba="agave-validator -l /mnt/ledger",Td=r(()=>{try{return Ba}catch(t){return console.error(t),Ba}},"getSolanaCLIAgave"),uo=Td;import Wo from"chalk";var fo=r(async(t,e)=>{try{console.log(Wo.white("\u{1F50D} Detecting client type from remote configuration..."));let o=po(t,"cat /home/solv/solv4.config.json",e,"pipe");if(o.status!==0)return{client:"agave",validatorType:T.AGAVE,success:!1,error:"Could not read remote configuration file"};let s=JSON.parse(o.stdout).VALIDATOR_TYPE,a;switch(s){case T.AGAVE:a="agave";break;case T.FRANKENDANCER:a="frankendancer";break;case T.JITO:a="agave";break;default:a="agave"}return console.log(Wo.green(`\u2705 Detected remote client type: ${a} (${s})`)),{client:a,validatorType:s,success:!0}}catch(o){return console.log(Wo.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${o}`)),{client:"agave",validatorType:T.AGAVE,success:!1,error:String(o)}}},"getRemoteClientType");import{readFile as gd}from"fs/promises";import qo from"chalk";import{existsSync as Ed}from"fs";var ho=r(async()=>{try{console.log(qo.white("\u{1F50D} Detecting local client type from configuration..."));let t="/home/solv/solv4.config.json";if(!Ed(t))return{client:"agave",validatorType:T.AGAVE,success:!1,error:"Local configuration file not found"};let e=await gd(t,"utf-8"),n=JSON.parse(e).VALIDATOR_TYPE,s;switch(n){case T.AGAVE:s="agave";break;case T.FRANKENDANCER:s="frankendancer";break;case T.JITO:s="agave";break;default:s="agave"}return console.log(qo.green(`\u2705 Detected local client type: ${s} (${n})`)),{client:s,validatorType:n,success:!0}}catch(t){return console.log(qo.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${t}`)),{client:"agave",validatorType:T.AGAVE,success:!1,error:String(t)}}},"getLocalClientType");var yo=Ga(I,At),Ja=Ga(I,Et),za=r(async(t,e,o,n,s=!0)=>{let a=o.NETWORK===f.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?L:b;i&&(c=L);let l=await ho(),m=await fo(t,n),d=l.success?l.client:"agave",u=m.success?m.client:"agave";console.log(G.green(`\u2705 Local client: ${d}, Remote client: ${u}`));let[p,y]=Ht(d),[A,S]=Ht(u),g=uo();if(!Mt(c,t,n))return;if(s){console.log(G.white("\u{1F7E2} Waiting for restart window..."));let Gt=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${g} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ft(Gt,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
628
+ Destination Identity Key: ${s}`)),!1):!0},"checkValidatorKey"),Yt=yd;var Td="agave-validator -l /mnt/ledger",Ed="sudo fdctl",gd="--config /home/solv/firedancer/config.toml ",Ad=r(t=>t==="agave"?[Td,""]:[Ed,gd],"getSolanaCLIActive"),jt=Ad;var Qa="agave-validator -l /mnt/ledger",wd=r(()=>{try{return Qa}catch(t){return console.error(t),Qa}},"getSolanaCLIAgave"),ho=wd;import Xo from"chalk";var So=r(async(t,e)=>{try{console.log(Xo.white("\u{1F50D} Detecting client type from remote configuration..."));let o=fo(t,"cat /home/solv/solv4.config.json",e,"pipe");if(o.status!==0)return{client:"agave",validatorType:T.AGAVE,success:!1,error:"Could not read remote configuration file"};let s=JSON.parse(o.stdout).VALIDATOR_TYPE,a;switch(s){case T.AGAVE:a="agave";break;case T.FRANKENDANCER:a="frankendancer";break;case T.JITO:a="agave";break;default:a="agave"}return console.log(Xo.green(`\u2705 Detected remote client type: ${a} (${s})`)),{client:a,validatorType:s,success:!0}}catch(o){return console.log(Xo.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${o}`)),{client:"agave",validatorType:T.AGAVE,success:!1,error:String(o)}}},"getRemoteClientType");import{readFile as _d}from"fs/promises";import Zo from"chalk";import{existsSync as Nd}from"fs";var yo=r(async()=>{try{console.log(Zo.white("\u{1F50D} Detecting local client type from configuration..."));let t="/home/solv/solv4.config.json";if(!Nd(t))return{client:"agave",validatorType:T.AGAVE,success:!1,error:"Local configuration file not found"};let e=await _d(t,"utf-8"),n=JSON.parse(e).VALIDATOR_TYPE,s;switch(n){case T.AGAVE:s="agave";break;case T.FRANKENDANCER:s="frankendancer";break;case T.JITO:s="agave";break;default:s="agave"}return console.log(Zo.green(`\u2705 Detected local client type: ${s} (${n})`)),{client:s,validatorType:n,success:!0}}catch(t){return console.log(Zo.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${t}`)),{client:"agave",validatorType:T.AGAVE,success:!1,error:String(t)}}},"getLocalClientType");var To=Za(P,wt),Xa=Za(P,At),ti=r(async(t,e,o,n,s=!0)=>{let a=o.NETWORK===f.TESTNET,i=o.NODE_TYPE===A.RPC,l=a?x:K;i&&(l=x);let c=await yo(),m=await So(t,n),d=c.success?c.client:"agave",u=m.success?m.client:"agave";console.log(J.green(`\u2705 Local client: ${d}, Remote client: ${u}`));let[p,S]=jt(d),[g,y]=jt(u),E=ho();if(!Yt(l,t,n))return;if(s){console.log(J.white("\u{1F7E2} Waiting for restart window..."));let qt=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${E} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Bt(qt,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
628
629
  $ ssh ${n}@${t}
629
630
 
630
- Failed Cmd: ${g} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(G.white("\u{1F7E2} Setting identity on the remote validator..."));let R=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${A} set-identity ${S}${yo}'`;if(Ft(R,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
631
+ Failed Cmd: ${E} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(J.white("\u{1F7E2} Setting identity on the remote validator..."));let R=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${g} set-identity ${y}${To}'`;if(Bt(R,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
631
632
  $ ssh ${n}@${t}
632
633
 
633
- Failed Cmd: ${A} set-identity ${S}${yo}`));return}if(console.log(G.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ft(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${yo} ${Ja}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
634
+ Failed Cmd: ${g} set-identity ${y}${To}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Bt(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${To} ${Xa}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
634
635
  $ ssh ${n}@${t}
635
636
 
636
- Failed Cmd: ln -sf ${yo} ${Ja}`));return}if(console.log(G.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ft(`scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
637
+ Failed Cmd: ln -sf ${To} ${Xa}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),Bt(`scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
637
638
  $ ssh ${n}@${t}
638
639
 
639
- Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(G.white("\u{1F7E2} Setting identity on the local validator...")),Ft(`${p} set-identity ${y}--require-tower ${c}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
640
+ Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the local validator...")),Bt(`${p} set-identity ${S}--require-tower ${l}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
640
641
 
641
- Failed Cmd: ${p} set-identity ${y}${c}
642
- ln -sf ${c} ${k}`));return}if(Ft(`ln -sf ${c} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
642
+ Failed Cmd: ${p} set-identity ${S}${l}
643
+ ln -sf ${l} ${k}`));return}if(Bt(`ln -sf ${l} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
643
644
 
644
- Failed Cmd: ln -sf ${c} ${k}`));return}console.log(G.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as Qa}from"path";import H from"chalk";import{spawnSync as Yt}from"node:child_process";var Wa=Qa(I,At),Ad=Qa(I,Et),qa="~/.ssh/id_rsa",Xa=r(async(t,e,o,n,s=!0)=>{let a=o.NETWORK===f.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?L:b;i&&(c=L);let l=await ho(),m=await fo(t,n),d=l.success?l.client:"agave",u=m.success?m.client:"agave";console.log(H.green(`\u2705 Local client: ${d}, Remote client: ${u}`));let[p,y]=Ht(d),[A,S]=Ht(u),g=uo();if(!Mt(c,t,n))return;let R=`${g} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Y=`${p} set-identity ${y}${Wa}`,at=`ln -sf ${Wa} ${Ad}`,gt=`scp ${w}/tower-1_9-${e}.bin ${n}@${t}:${w}`,it=`${A} set-identity ${S}--require-tower ${c}`,Jt=`ln -sf ${c} ${k}`;if(s&&(console.log(H.white("\u{1F7E2} Waiting for restart window...")),Yt(R,{shell:!0,stdio:"inherit"}).status!==0)){console.log(H.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
645
+ Failed Cmd: ln -sf ${l} ${k}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as ri}from"path";import H from"chalk";import{spawnSync as Gt}from"node:child_process";var ei=ri(P,wt),vd=ri(P,At),oi="~/.ssh/id_rsa",ni=r(async(t,e,o,n,s=!0)=>{let a=o.NETWORK===f.TESTNET,i=o.NODE_TYPE===A.RPC,l=a?x:K;i&&(l=x);let c=await yo(),m=await So(t,n),d=c.success?c.client:"agave",u=m.success?m.client:"agave";console.log(H.green(`\u2705 Local client: ${d}, Remote client: ${u}`));let[p,S]=jt(d),[g,y]=jt(u),E=ho();if(!Yt(l,t,n))return;let R=`${E} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Y=`${p} set-identity ${S}${ei}`,it=`ln -sf ${ei} ${vd}`,gt=`scp ${w}/tower-1_9-${e}.bin ${n}@${t}:${w}`,lt=`${g} set-identity ${y}--require-tower ${l}`,Wt=`ln -sf ${l} ${k}`;if(s&&(console.log(H.white("\u{1F7E2} Waiting for restart window...")),Gt(R,{shell:!0,stdio:"inherit"}).status!==0)){console.log(H.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
645
646
 
646
- Failed Cmd: ${R}`));return}if(console.log(H.white("\u{1F7E2} Setting identity on the new validator...")),Yt(Y,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
647
+ Failed Cmd: ${R}`));return}if(console.log(H.white("\u{1F7E2} Setting identity on the new validator...")),Gt(Y,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
647
648
 
648
- Failed Cmd: ${Y}`));return}if(console.log(H.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Yt(at,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
649
+ Failed Cmd: ${Y}`));return}if(console.log(H.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Gt(it,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
649
650
 
650
- Failed Cmd: ${at}`));return}if(console.log(H.white("\u{1F7E2} Uploading the tower file to the new validator...")),Yt(gt,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
651
+ Failed Cmd: ${it}`));return}if(console.log(H.white("\u{1F7E2} Uploading the tower file to the new validator...")),Gt(gt,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
651
652
 
652
- Failed Cmd: ${gt}`));return}console.log(H.white("\u{1F7E2} Setting identity on the new validator..."));let Ti=`ssh -i ${qa} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${it}'`;Yt(Ti,{shell:!0,stdio:"inherit"}).status!==0&&console.log(H.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
653
+ Failed Cmd: ${gt}`));return}console.log(H.white("\u{1F7E2} Setting identity on the new validator..."));let Ni=`ssh -i ${oi} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${lt}'`;Gt(Ni,{shell:!0,stdio:"inherit"}).status!==0&&console.log(H.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
653
654
  $ ssh ${n}@${t}
654
655
 
655
- Failed Cmd: ${it}`)),console.log(H.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let gi=`ssh -i ${qa} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${Jt}'`;if(Yt(gi,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
656
+ Failed Cmd: ${lt}`)),console.log(H.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let vi=`ssh -i ${oi} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${Wt}'`;if(Gt(vi,{shell:!0,stdio:"inherit"}).status!==0){console.log(H.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
656
657
 
657
- Failed Cmd: ${Jt}`));return}console.log(H.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as wd}from"node:child_process";function Za(t,e){let o=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return wd(o,{shell:!0,stdio:"inherit"}).status===0}r(Za,"checkSSHConnection");import fe from"chalk";import{join as ei}from"path";import{spawnSync as jt}from"node:child_process";import W from"chalk";var So=ei(I,At),ti=ei(I,Et),oi=r(async(t,e,o,n,s=!0)=>{let a=o.NETWORK===f.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?L:b;if(i&&(c=L),!Mt(c,t,n))return;let m=rr,d=nr;if(s){console.log(W.white("\u{1F7E2} Waiting for restart window..."));let $=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${m} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(jt($,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
658
+ Failed Cmd: ${Wt}`));return}console.log(H.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as Od}from"node:child_process";function si(t,e){let o=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return Od(o,{shell:!0,stdio:"inherit"}).status===0}r(si,"checkSSHConnection");import Se from"chalk";import{join as ii}from"path";import{spawnSync as Jt}from"node:child_process";import q from"chalk";var Eo=ii(P,wt),ai=ii(P,At),li=r(async(t,e,o,n,s=!0)=>{let a=o.NETWORK===f.TESTNET,i=o.NODE_TYPE===A.RPC,l=a?x:K;if(i&&(l=x),!Yt(l,t,n))return;let m=ar,d=ir;if(s){console.log(q.white("\u{1F7E2} Waiting for restart window..."));let $=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${m} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Jt($,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
658
659
  $ ssh ${n}@${t}
659
660
 
660
- Failed Cmd: ${m} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(W.white("\u{1F7E2} Setting identity on the new validator..."));let u=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${m} -l ${w} set-identity ${So}'`;if(jt(u,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
661
+ Failed Cmd: ${m} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(q.white("\u{1F7E2} Setting identity on the new validator..."));let u=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${m} -l ${w} set-identity ${Eo}'`;if(Jt(u,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
661
662
  $ ssh ${n}@${t}
662
663
 
663
- Failed Cmd: ${m} -l ${w} set-identity ${So}`));return}if(console.log(W.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),jt(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${So} ${ti}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
664
+ Failed Cmd: ${m} -l ${w} set-identity ${Eo}`));return}if(console.log(q.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Jt(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${Eo} ${ai}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
664
665
  $ ssh ${n}@${t}
665
666
 
666
- Failed Cmd: ln -sf ${So} ${ti}`));return}if(console.log(W.white("\u{1F7E2} Uploading the tower file to the new validator...")),jt(`scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
667
+ Failed Cmd: ln -sf ${Eo} ${ai}`));return}if(console.log(q.white("\u{1F7E2} Uploading the tower file to the new validator...")),Jt(`scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
667
668
  $ ssh ${n}@${t}
668
669
 
669
- Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(W.white("\u{1F7E2} Setting identity on the new validator...")),jt(`${d} -l ${w} set-identity --require-tower ${c}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
670
+ Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(q.white("\u{1F7E2} Setting identity on the new validator...")),Jt(`${d} -l ${w} set-identity --require-tower ${l}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
670
671
 
671
- Failed Cmd: ${d} -l ${w} set-identity ${c}
672
- ln -sf ${c} ${k}`));return}if(jt(`ln -sf ${c} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(W.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
672
+ Failed Cmd: ${d} -l ${w} set-identity ${l}
673
+ ln -sf ${l} ${k}`));return}if(Jt(`ln -sf ${l} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
673
674
 
674
- Failed Cmd: ln -sf ${c} ${k}`));return}console.log(W.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var _d=["Incoming","Outgoing"],ni=r(async(t,e)=>{t.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 o=>{try{let n=e.NETWORK===f.TESTNET,s=e.NODE_TYPE===E.RPC,a=o.unsafe===!1,i=n?L:b;s&&(i=L);let c=o.user,l=v(i),m=o.switchType,d=o.ip;if(m===""||d===""||c===""){let p=await ri.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"]}]);m=p.switchType,d=p.ip,c=p.user}if(!_d.includes(m)){console.log(fe.yellow(`\u26A0\uFE0F Invalid Switch Type
675
- You can choose only Incoming or Outgoing`));return}if(!Za(d,c)){console.log("SSH Connection Failed");return}if(m==="Incoming"){if(o.v2MigrateIncoming){(await ri.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(fe.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(fe.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await oi(d,l,e,c,a);return}await za(d,l,e,c,a)}else await Xa(d,l,e,c,a);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(fe.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(fe.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as Nd}from"node:child_process";var vd=r((t="306450862",e=w,o=tt)=>{try{let n=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${o} --hard-fork ${t} -- ${t} ${e}`;console.log("Parameters to createSnapshot:",t,e,o),console.log("Command:",n);let s=Nd(n,{shell:!0,stdio:"pipe",cwd:e});if(s.status!==0)throw new Error(`createSnapshot: ${s.error}`)}catch(n){throw new Error(`createSnapshot: ${n}`)}},"createSnapshot"),si=vd;import Bt from"inquirer";import Vd from"dotenv";import kt from"chalk";var To={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:Eo,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}},Qo={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:ge,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Ee,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:Eo,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 kd}from"fs/promises";import{Connection as Cd,Keypair as Id,VersionedTransaction as Pd}from"@solana/web3.js";import F from"chalk";import Ld from"inquirer";import xd from"dotenv";var Od=r(async(t,e,o,n,s)=>{try{let a=`${t}/quote?inputMint=${o}&outputMint=${n}&amount=${s}`,i=await fetch(a,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return i.status===429?"Too many requests, please try again later":i.status===401?"Unauthorized, please check your API key":await i.json()}catch(a){throw new Error(`Error getJupiterQuote: ${a}`)}},"getJupiterQuote"),ai=Od;var Rd=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=dr[s];i?a={swapRequest:{quoteResponse:o,userPublicKey:n,feeAccount:i,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:a={swapRequest:{quoteResponse:o,userPublicKey:n,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let c=`${t}/swap`,l=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(a.swapRequest)});return l.status===429?"Too many requests, please try again later":await l.json()}catch(s){throw new Error(`Error postJupiterSwap: ${s}`)}},"postJupiterSwap"),ii=Rd;xd.config();var ci=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new Cd(t,"confirmed"),m=await ai(e,o,s,a,i);if(typeof m=="string"){m.includes("Unauthorized")&&(console.error(F.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
676
- `)),console.log(F.white("Get Your API key \u{1F447}")),console.log(F.white(zt+`
677
- `)),process.exit(0));let it=`${F.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
675
+ Failed Cmd: ln -sf ${l} ${k}`));return}console.log(q.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var Rd=["Incoming","Outgoing"],mi=r(async(t,e)=>{t.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 o=>{try{let n=e.NETWORK===f.TESTNET,s=e.NODE_TYPE===A.RPC,a=o.unsafe===!1,i=n?x:K;s&&(i=x);let l=o.user,c=v(i),m=o.switchType,d=o.ip;if(m===""||d===""||l===""){let p=await ci.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"]}]);m=p.switchType,d=p.ip,l=p.user}if(!Rd.includes(m)){console.log(Se.yellow(`\u26A0\uFE0F Invalid Switch Type
676
+ You can choose only Incoming or Outgoing`));return}if(!si(d,l)){console.log("SSH Connection Failed");return}if(m==="Incoming"){if(o.v2MigrateIncoming){(await ci.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(Se.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Se.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await li(d,c,e,l,a);return}await ti(d,c,e,l,a)}else await ni(d,c,e,l,a);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(Se.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Se.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as kd}from"node:child_process";var Cd=r((t="306450862",e=w,o=et)=>{try{let n=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${o} --hard-fork ${t} -- ${t} ${e}`;console.log("Parameters to createSnapshot:",t,e,o),console.log("Command:",n);let s=kd(n,{shell:!0,stdio:"pipe",cwd:e});if(s.status!==0)throw new Error(`createSnapshot: ${s.error}`)}catch(n){throw new Error(`createSnapshot: ${n}`)}},"createSnapshot"),pi=Cd;import zt from"inquirer";import bd from"dotenv";import Ct from"chalk";var go={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:wo,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}},tr={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Ae,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:we,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:wo,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 Ld}from"fs/promises";import{Connection as xd,Keypair as Vd,VersionedTransaction as $d}from"@solana/web3.js";import F from"chalk";import Dd from"inquirer";import Kd from"dotenv";var Id=r(async(t,e,o,n,s)=>{try{let a=`${t}/quote?inputMint=${o}&outputMint=${n}&amount=${s}`,i=await fetch(a,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return i.status===429?"Too many requests, please try again later":i.status===401?"Unauthorized, please check your API key":await i.json()}catch(a){throw new Error(`Error getJupiterQuote: ${a}`)}},"getJupiterQuote"),di=Id;var Pd=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=hr[s];i?a={swapRequest:{quoteResponse:o,userPublicKey:n,feeAccount:i,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:a={swapRequest:{quoteResponse:o,userPublicKey:n,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let l=`${t}/swap`,c=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(a.swapRequest)});return c.status===429?"Too many requests, please try again later":await c.json()}catch(s){throw new Error(`Error postJupiterSwap: ${s}`)}},"postJupiterSwap"),ui=Pd;Kd.config();var fi=r(async(t,e,o,n,s,a,i,l=!0)=>{let c=new xd(t,"confirmed"),m=await di(e,o,s,a,i);if(typeof m=="string"){m.includes("Unauthorized")&&(console.error(F.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
677
+ `)),console.log(F.white("Get Your API key \u{1F447}")),console.log(F.white(Qt+`
678
+ `)),process.exit(0));let lt=`${F.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
678
679
 
679
680
  You can upgrade your API key to increase your rate limits.
680
681
  Get Your API key \u{1F447}
681
- Validators Solutions: ${zt}
682
- `;console.error(F.white(it)),process.exit(0)}let d=Qo[s],u=Qo[a],p=`\u{1F504} Swap Quote \u{1F504}
682
+ Validators Solutions: ${Qt}
683
+ `;console.error(F.white(lt)),process.exit(0)}let d=tr[s],u=tr[a],p=`\u{1F504} Swap Quote \u{1F504}
683
684
 
684
685
  - \u{1F3E6} Input Token: ${d.symbol} (${s})
685
686
  - \u{1F4B0} Input Amount: ${i/Math.pow(10,d.decimal)} ${d.symbol}
@@ -690,14 +691,14 @@ Validators Solutions: ${zt}
690
691
  \u203B This quote is based on the current market rate and may change before the swap is completed.
691
692
  `;console.log(F.white(p)),console.log(F.gray(`You can also swap using the following command:
692
693
  $ solv swap --input ${s} --output ${a} --amount ${i} --skip-confirm
693
- `));let y=!1;c?y=(await Ld.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(F.cyan("Skipping confirmation...")),y=!0),y||(console.log(F.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let A=JSON.parse(await kd(n,"utf8")),S=Id.fromSecretKey(new Uint8Array(Array.from(A))),g=await ii(e,o,m,S.publicKey.toString());if(typeof g=="string"){g.includes("Unauthorized")&&(console.error(F.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
694
- `)),console.log(F.white("Get Your API key \u{1F447}")),console.log(F.white(zt+`
695
- `)),process.exit(0));let it=`${F.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
694
+ `));let S=!1;l?S=(await Dd.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(F.cyan("Skipping confirmation...")),S=!0),S||(console.log(F.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let g=JSON.parse(await Ld(n,"utf8")),y=Vd.fromSecretKey(new Uint8Array(Array.from(g))),E=await ui(e,o,m,y.publicKey.toString());if(typeof E=="string"){E.includes("Unauthorized")&&(console.error(F.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
695
+ `)),console.log(F.white("Get Your API key \u{1F447}")),console.log(F.white(Qt+`
696
+ `)),process.exit(0));let lt=`${F.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
696
697
 
697
698
  You can upgrade your API key to increase your rate limits.
698
699
  Get Your API key \u{1F447}
699
- Validators Solutions: ${zt}
700
- `;console.error(F.white(it)),process.exit(0)}let $=Buffer.from(g.swapTransaction,"base64"),R=Pd.deserialize($);R.sign([S]);let Y=R.serialize(),at=await l.sendRawTransaction(Y,{skipPreflight:!0,maxRetries:2}),gt=R.message.recentBlockhash;return console.log(`Swapping...
701
- Transaction ID: ${at}`),await l.confirmTransaction({blockhash:gt,lastValidBlockHeight:g.lastValidBlockHeight,signature:at},"confirmed"),at},"swap");Vd.config();var li=r(async(t,e)=>{t.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 o=>{try{await $d(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,o.input,o.output,Number(o.amount),!o.skipConfirm,o.initConfig)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(kt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(kt.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),$d=r(async(t,e,o,n="",s="",a=0,i=!0,c=!1)=>{console.log(kt.white("Solana RPC URL:",t)),console.log(kt.white("KeyfilePath:",e)),(!e||e===""||c)&&await Dd();let l=lr,m=[...mr,"Other"],d=n,u="",p=s,y=a;if(d===""){let g=await Bt.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:ge}]);g.name==="Other"?d=(await Bt.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Ee}])).address:(u=g.name,d=To[u].tokenMint)}if(p===""){m=m.filter(R=>R!==u);let g=await Bt.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(g.name==="Other")p=(await Bt.prompt([{type:"input",name:"address",message:"Enter output mint address",default:rt}])).address;else{let R=g.name;p=To[R].tokenMint}let $=g.name;p=To[$].tokenMint}if(y===0){let g=await Bt.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);y=Number(g.amount)}let S=await ci(t,l,!o||o===""?pr:o,e,d,p,y,i);S||process.exit(0),console.log(kt.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(kt.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${S}`))},"swapCmd");var Dd=r(async()=>{let t=await Bt.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 O(t),console.log(kt.green(`\u2714\uFE0E Config Updated Successfully!
702
- `)),vt()},"askForConfig");import{spawnSync as bd}from"node:child_process";var mi=r(()=>{bd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as Kd}from"node:child_process";var pi=r(()=>{Kd("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Ud}from"node:child_process";var di=r(()=>{Ud("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as Md}from"node:child_process";var ui=r(()=>{Md("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as Hd}from"node:child_process";var fi=r((t=!1)=>{Hd(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Fd}from"node:child_process";var hi=r(()=>{Fd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var yi=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{mi()}),t.command("start").description("Start Jupiter").action(()=>{pi()}),t.command("stop").description("Stop Jupiter").action(()=>{di()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{fi(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{ui()}),t.command("enable").description("Enable Jupiter").action(()=>{hi()})},"jupiterCommands");import jd from"chalk";var h=new Yd;h.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(he,"-V","Display version");async function Bd(){try{let t=await V();ns(t),cs(t),as(t),_s(t),rn(t),sn(),ls(t),Hs(t),Bs(t),ws(),ds(),es(t),ea(t),ms(),Xs(),ia(t),ma(t),La(t),rs(),li(h,t),Ya(t),ni(h,t),yi(),h.command("rm:log").description("Remove Logs").action(()=>{oa()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{ra(t)}),h.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",t.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",t.SNAPSHOTS_PATH).action(e=>{console.log(jd.white("\u{1F4DD} Creating Snapshot...")),si(e.slot,e.ledger,e.snapshots)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{na(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{sa()}),h.command("config").description("Show Solv Config").action(()=>{ro(t)}),h.command("vv").description("Show Solv Version").action(()=>{let e=Ce();console.log("version:",e)}),await h.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(t){console.log(t),process.exit(0)}}r(Bd,"main");Bd();export{h as program};
700
+ Validators Solutions: ${Qt}
701
+ `;console.error(F.white(lt)),process.exit(0)}let $=Buffer.from(E.swapTransaction,"base64"),R=$d.deserialize($);R.sign([y]);let Y=R.serialize(),it=await c.sendRawTransaction(Y,{skipPreflight:!0,maxRetries:2}),gt=R.message.recentBlockhash;return console.log(`Swapping...
702
+ Transaction ID: ${it}`),await c.confirmTransaction({blockhash:gt,lastValidBlockHeight:E.lastValidBlockHeight,signature:it},"confirmed"),it},"swap");bd.config();var hi=r(async(t,e)=>{t.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 o=>{try{await Ud(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,o.input,o.output,Number(o.amount),!o.skipConfirm,o.initConfig)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(Ct.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ct.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),Ud=r(async(t,e,o,n="",s="",a=0,i=!0,l=!1)=>{console.log(Ct.white("Solana RPC URL:",t)),console.log(Ct.white("KeyfilePath:",e)),(!e||e===""||l)&&await Md();let c=dr,m=[...ur,"Other"],d=n,u="",p=s,S=a;if(d===""){let E=await zt.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:Ae}]);E.name==="Other"?d=(await zt.prompt([{type:"input",name:"address",message:"Enter input mint address",default:we}])).address:(u=E.name,d=go[u].tokenMint)}if(p===""){m=m.filter(R=>R!==u);let E=await zt.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(E.name==="Other")p=(await zt.prompt([{type:"input",name:"address",message:"Enter output mint address",default:nt}])).address;else{let R=E.name;p=go[R].tokenMint}let $=E.name;p=go[$].tokenMint}if(S===0){let E=await zt.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);S=Number(E.amount)}let y=await fi(t,c,!o||o===""?fr:o,e,d,p,S,i);y||process.exit(0),console.log(Ct.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(Ct.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${y}`))},"swapCmd");var Md=r(async()=>{let t=await zt.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 O(t),console.log(Ct.green(`\u2714\uFE0E Config Updated Successfully!
703
+ `)),Ot()},"askForConfig");import{spawnSync as Hd}from"node:child_process";var Si=r(()=>{Hd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as Fd}from"node:child_process";var yi=r(()=>{Fd("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Yd}from"node:child_process";var Ti=r(()=>{Yd("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as jd}from"node:child_process";var Ei=r(()=>{jd("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as Bd}from"node:child_process";var gi=r((t=!1)=>{Bd(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Gd}from"node:child_process";var Ai=r(()=>{Gd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var wi=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{Si()}),t.command("start").description("Start Jupiter").action(()=>{yi()}),t.command("stop").description("Stop Jupiter").action(()=>{Ti()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{gi(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{Ei()}),t.command("enable").description("Enable Jupiter").action(()=>{Ai()})},"jupiterCommands");import zd from"chalk";var h=new Jd;h.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(ye,"-V","Display version");async function Wd(){try{let t=await V();ms(t),fs(t),ds(t),Cs(t),mn(t),dn(),hs(t),Js(t),Qs(t),ks(),Ts(),is(t),ia(t),Ss(),na(),ua(t),Sa(t),ba(t),cs(),hi(h,t),Wa(t),mi(h,t),wi(),h.command("rm:log").description("Remove Logs").action(()=>{la()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{ca(t)}),h.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",t.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",t.SNAPSHOTS_PATH).action(e=>{console.log(zd.white("\u{1F4DD} Creating Snapshot...")),pi(e.slot,e.ledger,e.snapshots)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{ma(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{pa()}),h.command("config").description("Show Solv Config").action(()=>{so(t)}),h.command("vv").description("Show Solv Version").action(()=>{let e=Ie();console.log("version:",e)}),await h.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(t){console.log(t),process.exit(0)}}r(Wd,"main");Wd();export{h as program};
703
704
  //# sourceMappingURL=index.js.map