@gabrielhicks/solv 5.0.3 → 5.1.0

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 mi=Object.defineProperty;var r=(t,e)=>mi(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as $d}from"commander";var jo="5.0.3";var Bo={name:"@gabrielhicks/solv",version:jo,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 pe=Bo.version;var jt="https://validators.solutions";var de="solv4.config.json";var St="identity.json",yt="unstaked-identity.json",Jo="relayer-keypair.json",di="mainnet-validator-keypair.json",ui="mainnet-vote-account-keypair.json",fi="mainnet-authority-keypair.json",hi="testnet-validator-keypair.json",Si="testnet-vote-account-keypair.json",yi="testnet-authority-keypair.json",C="/home/solv",k=`${C}/${St}`,Hd=`${C}/${yt}`,D=`${C}/${di}`,ue=`${C}/${ui}`,Fd=`${C}/${fi}`,I=`${C}/${hi}`,Go=`${C}/${Si}`,Yd=`${C}/${yi}`,z=`${C}/solana-validator.log`,q=C+"/start-validator.sh",w="/mnt/ledger",Rt="/mnt/accounts",Q="/mnt/snapshots",Wo="solana-validator",zo="agave-validator",qo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var fe=3,Qo="https://api.testnet.solana.com",Xo="https://api.mainnet-beta.solana.com",Zo="https://verify.validators.solutions/solv-migrate",tr="https://jup.validators.solutions/v1/jup",po;(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"})(po||(po={}));var er=Object.values(po),he="So11111111111111111111111111111111111111112",Se="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",uo="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var or="SOLV420",rr={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as Ai}from"child_process";import{spawnSync as Ti}from"node:child_process";var Ei=r(t=>{Ti(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${t}-mod/installer)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Ct=Ei;var nr="agave-validator",gi=r(()=>{try{return nr}catch(t){return console.error(t),nr}},"getSolanaCLI"),X=gi;var ye=r(async t=>{Ct(t)},"updateVersion"),fo=r(async(t,e=!1)=>{let o=X(),n=`${o} --ledger ${w} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${w} exit --max-delinquent-stake ${t}`),Ai(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Br from"chalk";var Tt;(function(t){t.EN="en",t.JA="ja"})(Tt||(Tt={}));var sr;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(sr||(sr={}));var ar;(function(t){t.SINGLE="single",t.DOUBLE="double"})(ar||(ar={}));var mt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(mt||(mt={}));var ir;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(ir||(ir={}));var cr;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(cr||(cr={}));var lr;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(lr||(lr={}));var mr;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(mr||(mr={}));var Te;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(Te||(Te={}));var Ee;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Ee||(Ee={}));var ur=!1,fr=!0,M={ID:"solv",LANG:Tt.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"2.0.8",MAINNET_SOLANA_VERSION:"1.18.23",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"},K={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},O={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},Z={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},L={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"},R={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}/${R.MAINNET_VALIDATOR_KEY}`,n=`${e}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${R.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${R.TESTNET_VALIDATOR_KEY}`,i=`${e}/${R.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${R.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),pt=r((t=!0)=>{let e=t?`${K.ROOT}/${R.TESTNET_VALIDATOR_KEY}`:`${K.ROOT}/${R.MAINNET_VALIDATOR_KEY}`,o=t?`${K.ROOT}/${R.TESTNET_VALIDATOR_VOTE_KEY}`:`${K.ROOT}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${K.ROOT}/${Z.LOG}`,s=O.ACCOUNTS,a=O.LEDGER,i=O.SNAPSHOTS,c=`${K.ROOT}/${Z.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:c,snapshots:i}},"startupScriptPaths");var J="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ho="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",hr="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Sr=9,tt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",yr="So11111111111111111111111111111111111111112",Tr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Er="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",pr;(function(t){t[t.ELSOL=tt]="ELSOL",t[t.SOL=yr]="SOL",t[t.USDC=Tr]="USDC",t[t.EPCT=Er]="EPCT"})(pr||(pr={}));var dr;(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"})(dr||(dr={}));var nu={[yr]:9,[tt]:9,[Tr]:6,[Er]:6},ge="/home/solv/currentEpoch.json",So=.5,Ae="https://api.testnet.solana.com";import{spawnSync as yo}from"child_process";var gr=r(()=>{yo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=M.NODE_VERSION;yo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),yo("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var at={version:"2.1.14",tag:"v2.1.14-mod",commissionBps:1e3,relayerUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",blockEngineUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",shredReceiverAddr:"64.130.50.14:1002"},To={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"},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 wi}from"child_process";var we=r((t=at.tag)=>{wi(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${t}/installer)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as _i,writeFile as Ni}from"fs/promises";import{homedir as Oi}from"os";var Bt=r(async t=>{let o=`${Oi()}/${Z.JITO_CONFIG}`,s={...JSON.parse(await _i(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Ni(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Ar}from"child_process";import vi from"inquirer";var wr=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";Ar(`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}`;Ar(a,{shell:!0,stdio:"inherit"})},"updateCommission"),_r=r(async()=>await vi.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Jt}from"@skeet-framework/utils";import ki from"chalk";import Ri from"inquirer";var Nr=r(async()=>{let t=await Ri.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Jt("sudo ufw delete allow 8899/udp"),await Jt("sudo ufw delete allow 8899/tcp"),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Jt("sudo ufw reload"),console.log(ki.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Ci=r(()=>jo,"getSolvVersion"),Pt=Ci;import{readFile as Li,writeFile as xi}from"fs/promises";import{existsAsync as Vi}from"@skeet-framework/utils";var Eo;(function(t){t.EN="en",t.JA="ja"})(Eo||(Eo={}));var Lu=Object.values(Eo),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var Or=Object.values(u),E;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(E||(E={}));var vr=Object.values(E),g;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(g||(g={}));var xu=Object.values(g).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var kr=Object.values($).filter(t=>t!=="none"),G;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(G||(G={}));var et="2.1.14",ot="2.1.14",Et="2.1.14",Gt="2.1.14",Rr="2.1.14",gt="2.1.14";var Cr="20.17.0";var Pr="0.406.20113";var Ii={NETWORK:u.TESTNET,NODE_TYPE:E.RPC,VALIDATOR_TYPE:g.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:G.TRIPLE,TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot,NODE_VERSION:Cr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:qo,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Xo,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:w,ACCOUNTS_PATH:Rt,SNAPSHOTS_PATH:Q},it=Ii;import{homedir as $i}from"os";var Di=r(async()=>{let e=`${$i()}/${de}`;return await Vi(e)?JSON.parse(await Li(e,"utf-8")):(console.log("Creating default config file at",e),await xi(e,JSON.stringify(it,null,2)),it)},"readConfig"),x=Di;import Ki from"node-fetch";var V=r(async t=>{try{let e=await x();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 Ki(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 ji}from"child_process";import{Connection as Ir}from"@solana/web3.js";var Wt=r(async(t,e,o=!1,n=200)=>{let s={pubkey:e,isActive:!1,reason:""};try{let a=o?new Ir("https://api.testnet.solana.com"):new Ir(t,"confirmed"),i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e);if(!c)return i.delinquent.find(f=>f.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(p=>p.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 bi}from"child_process";var _=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=bi(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Ui=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),rt=Ui;import{sendDiscord as Mi}from"@skeet-framework/utils";var Lr=60,Hi=r(async t=>{try{let e=t.NETWORK===u.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=N(),a=_(e?n:o),i=await Wt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Lr){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Lr} minutes!
2
+ var ui=Object.defineProperty;var r=(t,e)=>ui(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as $d}from"commander";var Bo="5.1.0";var Jo={name:"@gabrielhicks/solv",version:Bo,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 pe=Jo.version;var jt="https://validators.solutions";var de="solv4.config.json";var St="identity.json",yt="unstaked-identity.json",Go="relayer-keypair.json",hi="mainnet-validator-keypair.json",Si="mainnet-vote-account-keypair.json",yi="mainnet-authority-keypair.json",Ti="testnet-validator-keypair.json",Ei="testnet-vote-account-keypair.json",gi="testnet-authority-keypair.json",C="/home/solv",k=`${C}/${St}`,Hd=`${C}/${yt}`,K=`${C}/${hi}`,ue=`${C}/${Si}`,Fd=`${C}/${yi}`,I=`${C}/${Ti}`,zo=`${C}/${Ei}`,Yd=`${C}/${gi}`,W=`${C}/solana-validator.log`,q=C+"/start-validator.sh",w="/mnt/ledger",Rt="/mnt/accounts",Q="/mnt/snapshots",Wo="solana-validator",qo="agave-validator",Qo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var fe=3,Xo="https://api.testnet.solana.com",Zo="https://api.mainnet-beta.solana.com",tr="https://verify.validators.solutions/solv-migrate",er="https://jup.validators.solutions/v1/jup",po;(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"})(po||(po={}));var or=Object.values(po),he="So11111111111111111111111111111111111111112",Se="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",uo="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var rr="SOLV420",nr={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as _i}from"child_process";import{spawnSync as sr}from"node:child_process";var Ai=r((t,e=!1)=>{e?sr(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${t}-mod/installer)"`,{shell:!0,stdio:"inherit"}):sr(`sh -c "$(curl -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Ct=Ai;var ar="agave-validator",wi=r(()=>{try{return ar}catch(t){return console.error(t),ar}},"getSolanaCLI"),X=wi;var ye=r(async(t,e=!1)=>{Ct(t,e)},"updateVersion"),fo=r(async(t,e=!1)=>{let o=X(),n=`${o} --ledger ${w} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${w} exit --max-delinquent-stake ${t}`),_i(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Gr from"chalk";var Tt;(function(t){t.EN="en",t.JA="ja"})(Tt||(Tt={}));var ir;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(ir||(ir={}));var cr;(function(t){t.SINGLE="single",t.DOUBLE="double"})(cr||(cr={}));var mt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(mt||(mt={}));var lr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(lr||(lr={}));var mr;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(mr||(mr={}));var pr;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(pr||(pr={}));var dr;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(dr||(dr={}));var Te;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(Te||(Te={}));var Ee;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Ee||(Ee={}));var hr=!1,Sr=!0,H={ID:"solv",LANG:Tt.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"2.0.8",MAINNET_SOLANA_VERSION:"1.18.23",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"},b={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},O={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},Z={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},L={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"},R={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}/${R.MAINNET_VALIDATOR_KEY}`,n=`${e}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${R.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${R.TESTNET_VALIDATOR_KEY}`,i=`${e}/${R.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${R.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),pt=r((t=!0)=>{let e=t?`${b.ROOT}/${R.TESTNET_VALIDATOR_KEY}`:`${b.ROOT}/${R.MAINNET_VALIDATOR_KEY}`,o=t?`${b.ROOT}/${R.TESTNET_VALIDATOR_VOTE_KEY}`:`${b.ROOT}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${b.ROOT}/${Z.LOG}`,s=O.ACCOUNTS,a=O.LEDGER,i=O.SNAPSHOTS,c=`${b.ROOT}/${Z.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:c,snapshots:i}},"startupScriptPaths");var J="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ho="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",yr="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Tr=9,tt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Er="So11111111111111111111111111111111111111112",gr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Ar="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",ur;(function(t){t[t.ELSOL=tt]="ELSOL",t[t.SOL=Er]="SOL",t[t.USDC=gr]="USDC",t[t.EPCT=Ar]="EPCT"})(ur||(ur={}));var fr;(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"})(fr||(fr={}));var nu={[Er]:9,[tt]:9,[gr]:6,[Ar]:6},ge="/home/solv/currentEpoch.json",So=.5,Ae="https://api.testnet.solana.com";import{spawnSync as yo}from"child_process";var wr=r(()=>{yo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=H.NODE_VERSION;yo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),yo("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var at={version:"2.1.14",tag:"v2.1.14",commissionBps:1e3,relayerUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",blockEngineUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",shredReceiverAddr:"64.130.50.14:1002"},To={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"},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 _r}from"child_process";var we=r((t=at.tag,e=!1)=>{e?_r(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${t}-mod/installer)"`,{shell:!0,stdio:"inherit"}):_r(`sh -c "$(curl -sSfL https://release.jito.wtf/${t}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Ni,writeFile as Oi}from"fs/promises";import{homedir as vi}from"os";var Bt=r(async t=>{let o=`${vi()}/${Z.JITO_CONFIG}`,s={...JSON.parse(await Ni(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Oi(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Nr}from"child_process";import ki from"inquirer";var Or=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";Nr(`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}`;Nr(a,{shell:!0,stdio:"inherit"})},"updateCommission"),vr=r(async()=>await ki.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Jt}from"@skeet-framework/utils";import Ri from"chalk";import Ci from"inquirer";var kr=r(async()=>{let t=await Ci.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Jt("sudo ufw delete allow 8899/udp"),await Jt("sudo ufw delete allow 8899/tcp"),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Jt("sudo ufw reload"),console.log(Ri.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Pi=r(()=>Bo,"getSolvVersion"),Pt=Pi;import{readFile as xi,writeFile as Vi}from"fs/promises";import{existsAsync as $i}from"@skeet-framework/utils";var Eo;(function(t){t.EN="en",t.JA="ja"})(Eo||(Eo={}));var Lu=Object.values(Eo),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var Rr=Object.values(u),E;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(E||(E={}));var Cr=Object.values(E),g;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(g||(g={}));var xu=Object.values(g).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var Pr=Object.values($).filter(t=>t!=="none"),G;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(G||(G={}));var et="2.2.2",ot="2.1.14",Et="2.2.2",Gt="2.1.14",Ir="2.1.14",gt="2.1.14";var Lr="20.17.0";var go="0.407.20113";var Li={NETWORK:u.TESTNET,NODE_TYPE:E.RPC,VALIDATOR_TYPE:g.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:G.TRIPLE,TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot,NODE_VERSION:Lr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:Qo,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Zo,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:w,ACCOUNTS_PATH:Rt,SNAPSHOTS_PATH:Q},it=Li;import{homedir as Di}from"os";var Ki=r(async()=>{let e=`${Di()}/${de}`;return await $i(e)?JSON.parse(await xi(e,"utf-8")):(console.log("Creating default config file at",e),await Vi(e,JSON.stringify(it,null,2)),it)},"readConfig"),x=Ki;import bi from"node-fetch";var V=r(async t=>{try{let e=await x();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 Bi}from"child_process";import{Connection as xr}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 xr("https://api.testnet.solana.com"):new xr(t,"confirmed"),i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e);if(!c)return i.delinquent.find(f=>f.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(p=>p.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 Ui}from"child_process";var _=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=Ui(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Mi=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),rt=Mi;import{sendDiscord as Hi}from"@skeet-framework/utils";var Vr=60,Fi=r(async t=>{try{let e=t.NETWORK===u.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=N(),a=_(e?n:o),i=await zt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Vr){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Vr} 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 Mi(l),!1}console.log("Waiting for validator to catch up..."),await rt(60*1e3),i=await Wt(t.RPC_URL,a,e),c++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),xr=Hi;import{spawnSync as Fi}from"node:child_process";var Yi=r(()=>{let{stdout:t}=Fi("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),_e=Yi;var Bi=r(async t=>{let e=t.NETWORK===u.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=N(),s=e?o:n,a=_e(),i=e?ur:fr;i=i&&t.AUTO_RESTART;let c=_(s),l=`=== \u2728 solv updated to the latest version \u2728 ===
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Hi(l),!1}console.log("Waiting for validator to catch up..."),await rt(60*1e3),i=await zt(t.RPC_URL,a,e),c++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),$r=Fi;import{spawnSync as Yi}from"node:child_process";var ji=r(()=>{let{stdout:t}=Yi("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),_e=ji;var Ji=r(async t=>{let e=t.NETWORK===u.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=N(),s=e?o:n,a=_e(),i=e?hr:Sr;i=i&&t.AUTO_RESTART;let c=_(s),l=`=== \u2728 solv updated to the latest version \u2728 ===
8
8
  Validator Address: ${c}
9
9
  solv Version: ${Pt()}
10
10
  Solana Version: ${a}
@@ -14,15 +14,15 @@ isNodeRestartRequired: ${i}
14
14
  Address: ${c}
15
15
  This will take a few minutes to catch up...
16
16
  \u203B sometimes it may take longer than expected
17
- `;await V(m);try{ji("solv update -b",{stdio:"inherit",shell:!0})}catch(f){let T=`\u274C Error in restarting the node
17
+ `;await V(m);try{Bi("solv update -b",{stdio:"inherit",shell:!0})}catch(f){let T=`\u274C Error in restarting the node
18
18
  Address: ${c}
19
19
  Error: ${f}`;return await V(T),!1}let d=`== \u{1F646} Your Node has been restarted! ==
20
20
  Address: ${c}
21
21
  Now Catching up... \u{1F69B}\u{1F4A8}
22
- `;await V(d),await rt(180*1e3);let p=await xr(t);if(p){let f=`== \u{1F7E2} Your Node has caught up! ==
22
+ `;await V(d),await rt(180*1e3);let p=await $r(t);if(p){let f=`== \u{1F7E2} Your Node has caught up! ==
23
23
  Address: ${c}
24
24
  \u2728 Auto Update Completed \u2728
25
- `;await V(f)}return p}return!0},"autoUpdate"),Vr=Bi;import{homedir as Ji}from"os";import{readFile as Gi,writeFile as $r}from"fs/promises";import{existsAsync as Wi}from"@skeet-framework/utils";var v=r(async t=>{let o=`${Ji()}/${de}`;await Wi(o)||(console.log("Creating default config file at",o),await $r(o,JSON.stringify(it,null,2)));let s={...JSON.parse(await Gi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await $r(o,a)},"updateDefaultConfig");var zi={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"},Ne=zi;var qi={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:"},Dr=qi;var Qi={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}"}},Oe=Qi;var Xi={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"}},Kr=Xi;var ve=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],ke=[[],[") 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 br=[") \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"],Ur=[[],[") \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 Zi={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"}},Re=Zi;var tc={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"}},Mr=tc;var Ce=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Hr=[") \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 ec=r(t=>{let e={cmds:Ne,subCmds:Re,logs:Oe,installer:ve,installerSub:ke,clientCmds:Ce};switch(t){case Tt.EN:e={cmds:Ne,subCmds:Re,logs:Oe,installer:ve,installerSub:ke,clientCmds:Ce};break;case Tt.JA:e={cmds:Dr,subCmds:Mr,logs:Kr,installer:br,installerSub:Ur,clientCmds:Hr};break;default:e={cmds:Ne,subCmds:Re,logs:Oe,installer:ve,installerSub:ke,clientCmds:Ce}}return e},"readLocale"),Fr=ec;import{existsSync as sc,readFileSync as ac,writeFileSync as Yr}from"fs";import{readFileSync as oc,writeFileSync as rc}from"fs";import{homedir as nc}from"os";var It=r(t=>{let o=`${nc()}/${Z.CONFIG}`,s={...JSON.parse(oc(o,"utf8")),...t},a=JSON.stringify(s,null,2);rc(o,a)},"updateSolvConfig");import{homedir as ic}from"os";var jr=r(()=>{let e=`${ic()}/${Z.CONFIG}`;sc(e)||(Yr(e,JSON.stringify(M,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(ac(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Yr(e,JSON.stringify(M,null,2)),o=M}let n=Fr(o.LANG);return o.RPC_URL||(o.RPC_URL=M.RPC_URL,It({RPC_URL:M.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,It({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",It({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var Jr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===E.RPC,n=t.VALIDATOR_TYPE===g.JITO,s=e?et:ot;n&&(s=Gt,e&&(s=Et)),o&&(s=gt,n&&(s=Rr)),h.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${s}`,s).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).action(async a=>{let i=Pt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(Br.white(`Current solv version: ${i}`)),a.auto){await Vr(t);return}if(a.migrateConfig){let l=jr().config,m=l.SOLANA_NETWORK===mt.TESTNET,d=l.SOLV_TYPE===Te.RPC_NODE,p=l.MAINNET_TYPE===Ee.JITO_MEV,f={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?E.RPC:E.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?G.DOUBLE:G.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?g.JITO:m?g.AGAVE:g.SOLANA,TESTNET_SOLANA_VERSION:l.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:l.MAINNET_SOLANA_VERSION,NODE_VERSION:l.NODE_VERSION,TESTNET_DELINQUENT_STAKE:l.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:l.MAINNET_DELINQUENT_STAKE,COMMISSION:l.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:l.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:l.STAKE_ACCOUNT,HARVEST_ACCOUNT:l.HARVEST_ACCOUNT,IS_MEV_MODE:l.IS_MEV_MODE,RPC_URL:l.RPC_URL,KEYPAIR_PATH:l.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:l.DISCORD_WEBHOOK_URL,AUTO_UPDATE:l.AUTO_UPDATE,AUTO_RESTART:l.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:l.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots"};await v(f)}if(a.config){if(await v({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){let l=e?Et:Gt;await Bt({version:l,tag:`v${l}-mod`})}console.log(Br.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await Nr();return}if(a.background){let l=a.version;if(await v({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){we(),await Bt({version:l,tag:`v${l}-mod`}),await fo(c,!0);return}await ye(l),await fo(e?5:5,!0);return}else if(a.commission){let l=await _r();wr(l.commission,e)}else gr()})},"updateCommands");import{spawnSync as cc}from"node:child_process";var Gr=r(t=>{try{let{log:e}=pt(),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=cc(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 Wr=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=>{Gr(t)})},"logCommands");import ct from"chalk";import{spawnSync as lc}from"child_process";import{homedir as mc}from"os";var Pe=r(t=>{let e=mc(),o=N(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=mt.TESTNET,c=t.COMMISSION;t.NETWORK===u.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=mt.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===u.TESTNET&&(l=mt.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;lc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ie}from"child_process";import{existsSync as zr,readdirSync as pc,rmSync as dc}from"fs";import{homedir as uc}from"os";import qr from"path";var Le=r(t=>{let e=[],o=0;t.NODE_TYPE===E.RPC&&(e=[R.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[R.TESTNET_VALIDATOR_KEY,R.TESTNET_VALITATOR_AUTHORITY_KEY,R.TESTNET_VALIDATOR_VOTE_KEY,R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;Ie(n,{shell:!0,stdio:"ignore"});let s=pc("./").filter(l=>l.endsWith("SV.json")),a=uc(),i=qr.join(a,"unstaked-identity.json");zr(i)&&Ie(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=qr.join(a,e[c]);if(c++,zr(m)){console.log(`${m} is already exist!`),dc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;Ie(d,{shell:!0,stdio:"inherit"})}Ie("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 Xr}from"child_process";var fc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
25
+ `;await V(f)}return p}return!0},"autoUpdate"),Dr=Ji;import{homedir as Gi}from"os";import{readFile as zi,writeFile as Kr}from"fs/promises";import{existsAsync as Wi}from"@skeet-framework/utils";var v=r(async t=>{let o=`${Gi()}/${de}`;await Wi(o)||(console.log("Creating default config file at",o),await Kr(o,JSON.stringify(it,null,2)));let s={...JSON.parse(await zi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Kr(o,a)},"updateDefaultConfig");var qi={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"},Ne=qi;var Qi={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:"},br=Qi;var Xi={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}"}},Oe=Xi;var Zi={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"}},Ur=Zi;var ve=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],ke=[[],[") 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 Mr=[") \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"],Hr=[[],[") \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 tc={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"}},Re=tc;var ec={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"}},Fr=ec;var Ce=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Yr=[") \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 oc=r(t=>{let e={cmds:Ne,subCmds:Re,logs:Oe,installer:ve,installerSub:ke,clientCmds:Ce};switch(t){case Tt.EN:e={cmds:Ne,subCmds:Re,logs:Oe,installer:ve,installerSub:ke,clientCmds:Ce};break;case Tt.JA:e={cmds:br,subCmds:Fr,logs:Ur,installer:Mr,installerSub:Hr,clientCmds:Yr};break;default:e={cmds:Ne,subCmds:Re,logs:Oe,installer:ve,installerSub:ke,clientCmds:Ce}}return e},"readLocale"),jr=oc;import{existsSync as ac,readFileSync as ic,writeFileSync as Br}from"fs";import{readFileSync as rc,writeFileSync as nc}from"fs";import{homedir as sc}from"os";var It=r(t=>{let o=`${sc()}/${Z.CONFIG}`,s={...JSON.parse(rc(o,"utf8")),...t},a=JSON.stringify(s,null,2);nc(o,a)},"updateSolvConfig");import{homedir as cc}from"os";var Jr=r(()=>{let e=`${cc()}/${Z.CONFIG}`;ac(e)||(Br(e,JSON.stringify(H,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(ic(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Br(e,JSON.stringify(H,null,2)),o=H}let n=jr(o.LANG);return o.RPC_URL||(o.RPC_URL=H.RPC_URL,It({RPC_URL:H.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,It({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",It({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var zr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===E.RPC,n=t.VALIDATOR_TYPE===g.JITO,s=e?et:ot;n&&(s=Gt,e&&(s=Et)),o&&(s=gt,n&&(s=Ir)),h.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${s}`,s).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).action(async a=>{let i=Pt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(Gr.white(`Current solv version: ${i}`)),a.auto){await Dr(t);return}if(a.migrateConfig){let l=Jr().config,m=l.SOLANA_NETWORK===mt.TESTNET,d=l.SOLV_TYPE===Te.RPC_NODE,p=l.MAINNET_TYPE===Ee.JITO_MEV,f={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?E.RPC:E.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?G.DOUBLE:G.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?g.JITO:m?g.AGAVE:g.SOLANA,TESTNET_SOLANA_VERSION:l.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:l.MAINNET_SOLANA_VERSION,NODE_VERSION:l.NODE_VERSION,TESTNET_DELINQUENT_STAKE:l.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:l.MAINNET_DELINQUENT_STAKE,COMMISSION:l.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:l.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:l.STAKE_ACCOUNT,HARVEST_ACCOUNT:l.HARVEST_ACCOUNT,IS_MEV_MODE:l.IS_MEV_MODE,RPC_URL:l.RPC_URL,KEYPAIR_PATH:l.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:l.DISCORD_WEBHOOK_URL,AUTO_UPDATE:l.AUTO_UPDATE,AUTO_RESTART:l.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:l.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots"};await v(f)}if(a.config){if(await v({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){let l=e?Et:Gt;await Bt({version:l,tag:`v${l}`})}console.log(Gr.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await kr();return}if(a.background){let l=a.version;if(await v({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){we(),await Bt({version:l,tag:`v${l}`}),await fo(c,!0);return}await ye(l),await fo(e?5:5,!0);return}else if(a.commission){let l=await vr();Or(l.commission,e)}else wr()})},"updateCommands");import{spawnSync as lc}from"node:child_process";var Wr=r(t=>{try{let{log:e}=pt(),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=lc(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 qr=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=>{Wr(t)})},"logCommands");import ct from"chalk";import{spawnSync as mc}from"child_process";import{homedir as pc}from"os";var Pe=r(t=>{let e=pc(),o=N(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=mt.TESTNET,c=t.COMMISSION;t.NETWORK===u.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=mt.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===u.TESTNET&&(l=mt.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;mc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ie}from"child_process";import{existsSync as Qr,readdirSync as dc,rmSync as uc}from"fs";import{homedir as fc}from"os";import Xr from"path";var Le=r(t=>{let e=[],o=0;t.NODE_TYPE===E.RPC&&(e=[R.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[R.TESTNET_VALIDATOR_KEY,R.TESTNET_VALITATOR_AUTHORITY_KEY,R.TESTNET_VALIDATOR_VOTE_KEY,R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;Ie(n,{shell:!0,stdio:"ignore"});let s=dc("./").filter(l=>l.endsWith("SV.json")),a=fc(),i=Xr.join(a,"unstaked-identity.json");Qr(i)&&Ie(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=Xr.join(a,e[c]);if(c++,Qr(m)){console.log(`${m} is already exist!`),uc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;Ie(d,{shell:!0,stdio:"inherit"})}Ie("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 tn}from"child_process";var hc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
26
26
  Description=Jupiter API Service Instance
27
27
  After=network.target
28
28
 
@@ -37,16 +37,16 @@ Environment=RUST_LOG=info
37
37
  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
38
38
 
39
39
  [Install]
40
- WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),Qr=fc;import hc from"inquirer";import Sc from"chalk";var yc=r(async()=>{let t=await hc.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"}]);Xr(`sudo apt-get install unzip wget -y
40
+ WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),Zr=hc;import Sc from"inquirer";import yc from"chalk";var Tc=r(async()=>{let t=await Sc.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"}]);tn(`sudo apt-get install unzip wget -y
41
41
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
42
42
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
43
43
  chmod +x jupiter-swap-api
44
- rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=Qr(t.rpcUrl,t.grpcUrl,t.grpcToken);Xr(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log(Sc.white(`\u{1F7E2} Jupiter Swap API Setup Completed
44
+ rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=Zr(t.rpcUrl,t.grpcUrl,t.grpcToken);tn(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log(yc.white(`\u{1F7E2} Jupiter Swap API Setup Completed
45
45
 
46
- $ solv jupiter --help`))},"jupiterAPISetup"),Zr=yc;import{existsAsync as Tc}from"@skeet-framework/utils";import{readFile as Ec,writeFile as tn}from"fs/promises";import{homedir as gc}from"os";import Ac from"path";var At=r(async()=>{let t=gc(),e=Ac.join(t,Z.JITO_CONFIG);await Tc(e)||(await tn(e,JSON.stringify(at,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await Ec(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await tn(e,JSON.stringify(at,null,2)),o=at}return o},"readOrCreateJitoConfig");import{spawnSync as wc}from"child_process";var zt=r(()=>{wc("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import qt from"chalk";import xe from"inquirer";import _c from"inquirer";var en=r(async()=>{let e=Object.keys(To),o=await _c.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=To[n];return{version:at.version,tag:at.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Nc=r(async()=>{try{let t=g.NONE,e=$.AGAVE,o=it.COMMISSION,n=!1,s=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:Or,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:vr,default:E.RPC}]);if(s.nodeType===E.VALIDATOR){let c=s.network===u.MAINNET?[g.JITO,g.SOLANA]:[g.AGAVE,g.JITO,g.FRANKENDANCER];t=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:g.AGAVE}).then(l=>l.validatorType),e=$.NONE}if(s.nodeType===E.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:kr,default:$.AGAVE}).then(c=>c.rpcType)),s.nodeType===E.VALIDATOR){let c=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${it.COMMISSION}%)'`,default:it.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===g.JITO){await At();let l=await en();await Bt(l)}}let{network:a,nodeType:i}=s;return console.log(qt.white("Network:",a)),console.log(qt.white("Node Type:",i)),console.log(qt.white("Validator Type:",t)),console.log(qt.white("RPC Type:",e)),i===E.VALIDATOR&&console.log(qt.white("Commission:",o)),await v({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),on=Nc;import{spawnSync as Oc}from"child_process";var Qt=r((t=Et)=>{let e=`v${t}-mod`;Oc(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${e}/installer)"`,{shell:!0,stdio:"inherit"})},"installJito");var rn=r(()=>`#!/bin/bash
46
+ $ solv jupiter --help`))},"jupiterAPISetup"),en=Tc;import{existsAsync as Ec}from"@skeet-framework/utils";import{readFile as gc,writeFile as on}from"fs/promises";import{homedir as Ac}from"os";import wc from"path";var At=r(async()=>{let t=Ac(),e=wc.join(t,Z.JITO_CONFIG);await Ec(e)||(await on(e,JSON.stringify(at,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await gc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await on(e,JSON.stringify(at,null,2)),o=at}return o},"readOrCreateJitoConfig");import{spawnSync as _c}from"child_process";var Wt=r(()=>{_c("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import qt from"chalk";import xe from"inquirer";import Nc from"inquirer";var rn=r(async()=>{let e=Object.keys(To),o=await Nc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=To[n];return{version:at.version,tag:at.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Oc=r(async()=>{try{let t=g.NONE,e=$.AGAVE,o=it.COMMISSION,n=!1,s=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:Rr,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Cr,default:E.RPC}]);if(s.nodeType===E.VALIDATOR){let c=s.network===u.MAINNET?[g.JITO,g.SOLANA]:[g.AGAVE,g.JITO,g.FRANKENDANCER];t=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:g.AGAVE}).then(l=>l.validatorType),e=$.NONE}if(s.nodeType===E.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Pr,default:$.AGAVE}).then(c=>c.rpcType)),s.nodeType===E.VALIDATOR){let c=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${it.COMMISSION}%)'`,default:it.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===g.JITO){await At();let l=await rn();await Bt(l)}}let{network:a,nodeType:i}=s;return console.log(qt.white("Network:",a)),console.log(qt.white("Node Type:",i)),console.log(qt.white("Validator Type:",t)),console.log(qt.white("RPC Type:",e)),i===E.VALIDATOR&&console.log(qt.white("Commission:",o)),await v({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),nn=Oc;import{spawnSync as sn}from"child_process";var Qt=r((t=Et,e=!1)=>{if(e){let o=`v${t}-mod`;sn(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${t}`;sn(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/jito-foundation/jito-solana/${o}/installer)"`,{shell:!0,stdio:"inherit"})}},"installJito");var an=r(()=>`#!/bin/bash
47
47
  exec agave-validator \\
48
48
  --identity ${k} \\
49
- --log ${z} \\
49
+ --log ${W} \\
50
50
  --accounts ${Rt} \\
51
51
  --ledger ${w} \\
52
52
  --snapshots ${Q} \\
@@ -82,10 +82,10 @@ exec agave-validator \\
82
82
  --wal-recovery-mode skip_any_corrupted_record \\
83
83
  --use-snapshot-archives-at-startup when-newest \\
84
84
  --limit-ledger-size 400000000 \\
85
- `,"startJitoRPCScript");import{existsAsync as Rc}from"@skeet-framework/utils";import{writeFile as Cc}from"fs/promises";import{spawnSync as vc}from"node:child_process";var kc=r(()=>{let t=`sudo chmod +x ${q}`;vc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Xt=kc;var nn=r(()=>`#!/bin/bash
85
+ `,"startJitoRPCScript");import{existsAsync as Rc}from"@skeet-framework/utils";import{writeFile as Cc}from"fs/promises";import{spawnSync as vc}from"node:child_process";var kc=r(()=>{let t=`sudo chmod +x ${q}`;vc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Xt=kc;var cn=r(()=>`#!/bin/bash
86
86
  exec agave-validator \\
87
87
  --identity ${k} \\
88
- --log ${z} \\
88
+ --log ${W} \\
89
89
  --accounts ${Rt} \\
90
90
  --ledger ${w} \\
91
91
  --snapshots ${Q} \\
@@ -118,12 +118,12 @@ exec agave-validator \\
118
118
  --wal-recovery-mode skip_any_corrupted_record \\
119
119
  --use-snapshot-archives-at-startup when-newest \\
120
120
  --limit-ledger-size 400000000 \\
121
- `,"startRPCNodeScript");var Pc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case $.AGAVE:console.log("Agave RPC Node Setup"),Ct(t.TESTNET_SOLANA_VERSION),o=nn();break;case $.JITO:console.log("JITO RPC Node Setup"),Qt(Et),o=rn();break;default:console.log("Unknown RPC Node Setup");break}if(await Rc(q)){console.log("Startup script already exists. Skipping...");return}await Cc(q,o,"utf-8"),Xt()},"setupRpcNode"),sn=Pc;import{spawnSync as Ic}from"node:child_process";var Lc=r(t=>{Ic(`sh -c "$(curl -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),wo=Lc;var _o=r((t=1e3,e,o,n,s,a="agave-validator")=>`#!/bin/bash
121
+ `,"startRPCNodeScript");var Pc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case $.AGAVE:console.log("Agave RPC Node Setup"),Ct(t.TESTNET_SOLANA_VERSION),o=cn();break;case $.JITO:console.log("JITO RPC Node Setup"),Qt(Et),o=an();break;default:console.log("Unknown RPC Node Setup");break}if(await Rc(q)){console.log("Startup script already exists. Skipping...");return}await Cc(q,o,"utf-8"),Xt()},"setupRpcNode"),ln=Pc;import{spawnSync as Ic}from"node:child_process";var Lc=r(t=>{Ic(`sh -c "$(curl -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),_o=Lc;var No=r((t=1e3,e,o,n,s,a="agave-validator")=>`#!/bin/bash
122
122
  exec ${a} \\
123
123
  --identity ${k} \\
124
124
  --vote-account ${ue} \\
125
- --authorized-voter ${D} \\
126
- --log ${z} \\
125
+ --authorized-voter ${K} \\
126
+ --log ${W} \\
127
127
  --accounts ${s.ACCOUNTS_PATH} \\
128
128
  --ledger ${s.LEDGER_PATH} \\
129
129
  --snapshots ${s.SNAPSHOTS_PATH} \\
@@ -153,12 +153,12 @@ exec ${a} \\
153
153
  --snapshot-interval-slots 0 \\
154
154
  --private-rpc \\
155
155
  --full-rpc-api \\
156
- `,"startJitoValidatorScript");var an=r((t,e="agave-validator")=>`#!/bin/bash
156
+ `,"startJitoValidatorScript");var mn=r((t,e="agave-validator")=>`#!/bin/bash
157
157
  exec ${e} \\
158
158
  --identity ${k} \\
159
159
  --vote-account ${ue} \\
160
- --authorized-voter ${D} \\
161
- --log ${z} \\
160
+ --authorized-voter ${K} \\
161
+ --log ${W} \\
162
162
  --accounts ${t.ACCOUNTS_PATH} \\
163
163
  --ledger ${t.LEDGER_PATH} \\
164
164
  --snapshots ${t.SNAPSHOTS_PATH} \\
@@ -183,12 +183,12 @@ exec ${e} \\
183
183
  --block-verification-method unified-scheduler \\
184
184
  --snapshot-interval-slots 0 \\
185
185
  --private-rpc \\
186
- `,"startMainnetValidatorScript");var No=r(t=>`#!/bin/bash
186
+ `,"startMainnetValidatorScript");var Oo=r(t=>`#!/bin/bash
187
187
  exec agave-validator \\
188
188
  --identity ${k} \\
189
- --vote-account ${Go} \\
189
+ --vote-account ${zo} \\
190
190
  --authorized-voter ${I} \\
191
- --log ${z} \\
191
+ --log ${W} \\
192
192
  --accounts ${t.ACCOUNTS_PATH} \\
193
193
  --ledger ${t.LEDGER_PATH} \\
194
194
  --snapshots ${t.SNAPSHOTS_PATH} \\
@@ -210,14 +210,14 @@ exec agave-validator \\
210
210
  --block-production-method central-scheduler \\
211
211
  --block-verification-method unified-scheduler \\
212
212
  --full-rpc-api \\
213
- `,"startTestnetAgaveValidatorScript");import{existsAsync as cn}from"@skeet-framework/utils";import{writeFile as ln}from"fs/promises";var xc=r(async t=>{let{NETWORK:e}=t;e===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await Vc(t)):e===u.TESTNET?(console.log("Testnet Validator Node Setup"),await $c(t)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Vc=r(async t=>{let{VALIDATOR_TYPE:e,MAINNET_SOLANA_VERSION:o}=t,n="";switch(e){case g.SOLANA:wo(o),n=an(t);break;case g.JITO:console.log("JITO Validator Setup for Mainnet");let s=await At();Qt(o),n=_o(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await cn(q)){console.log("Startup script already exists. Skipping...");return}await ln(q,n,"utf-8"),Xt()},"setupMainnetValidator"),$c=r(async t=>{let{VALIDATOR_TYPE:e}=t,o="";switch(e){case g.SOLANA:wo(t.TESTNET_SOLANA_VERSION),o=No(t);case g.AGAVE:console.log("Agave Validator Setup for Testnet"),Ct(t.TESTNET_SOLANA_VERSION),o=No(t);break;case g.JITO:console.log("JITO Validator Setup for Testnet");let n=await At();Qt(t.TESTNET_SOLANA_VERSION),o=_o(n.commissionBps,n.relayerUrl,n.blockEngineUrl,n.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Testnet");break}if(await cn(q)){console.log("Startup script already exists. Skipping...");return}await ln(q,o,"utf-8"),Xt()},"setupTestnetValidator"),mn=xc;import bn from"chalk";import{execSync as pn}from"node:child_process";function dn(t){try{pn(`test -d ${t}`),console.log(`${t} already exists.`)}catch{pn(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(dn,"createDirectoryIfNotExists");var un=r(()=>{try{let t=[O.ACCOUNTS,O.LEDGER,O.SNAPSHOTS];for(let e of t)dn(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as Dc}from"child_process";function Kc(){let e=Dc("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
214
- `).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[y,U,P]=S.trim().split(/\s+/);if(!y||!U)continue;let W=parseInt(U,10);if(isNaN(W))continue;let vt=P!==void 0&&P!=="";P==="/"&&(l=y.replace(/p?\d*$/,""));let Yt=n.some(mo=>mo!==y&&mo.startsWith(y)),lo=y.startsWith("nvme")?"NVMe":"SATA";W>=400*1024*1024*1024&&o.push({name:y,size:W,mountpoint:P||"",isMounted:vt,hasPartition:Yt,type:lo})}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 p=o.filter(S=>!m.includes(S.name)).sort((S,y)=>y.size-S.size),f=p.filter(S=>S.type==="NVMe").sort((S,y)=>y.size-S.size),T=p.filter(S=>S.type==="SATA").sort((S,y)=>y.size-S.size),A=[...f,...T];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 y=A[1];y.size>=400*1024*1024*1024&&!y.isMounted&&(a=!0)}if(A.length>2){let y=A[2];y.size>=400*1024*1024*1024&&!y.isMounted&&(c=!0)}}return A.forEach((S,y)=>console.log(`Prioritized Disk ${y+1}: ${S.name} ${S.size}`)),{disks:A,has850GB:s,has400GB:a,hasUsed1250GB:i,hasThirdDisk400GB:c}}r(Kc,"getPreferredDisks");var Zt=Kc;import{spawnSync as fn}from"child_process";var dt=r(t=>{if(fn(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return fn(o,{shell:!0,stdio:"inherit"}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as Oo}from"child_process";var te=r((t,e="",o="",n=!1,s=!1)=>{let a=`${t} ${O.ROOT} ext4 auto 0 0`;n&&(a=`${t} ${O.LEDGER} ext4 auto 0 0
213
+ `,"startTestnetAgaveValidatorScript");import{existsAsync as pn}from"@skeet-framework/utils";import{writeFile as dn}from"fs/promises";var xc=r(async(t,e=!1)=>{let{NETWORK:o}=t;o===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await Vc(t,e)):o===u.TESTNET?(console.log("Testnet Validator Node Setup"),await $c(t,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Vc=r(async(t,e=!1)=>{let{VALIDATOR_TYPE:o,MAINNET_SOLANA_VERSION:n}=t,s="";switch(o){case g.SOLANA:_o(n),s=mn(t);break;case g.JITO:console.log("JITO Validator Setup for Mainnet");let a=await At();Qt(n,e),s=No(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await pn(q)){console.log("Startup script already exists. Skipping...");return}await dn(q,s,"utf-8"),Xt()},"setupMainnetValidator"),$c=r(async(t,e=!1)=>{let{VALIDATOR_TYPE:o}=t,n="";switch(o){case g.SOLANA:_o(t.TESTNET_SOLANA_VERSION),n=Oo(t);case g.AGAVE:console.log("Agave Validator Setup for Testnet"),Ct(t.TESTNET_SOLANA_VERSION,e),n=Oo(t);break;case g.JITO:console.log("JITO Validator Setup for Testnet");let s=await At();Qt(t.TESTNET_SOLANA_VERSION,e),n=No(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Testnet");break}if(await pn(q)){console.log("Startup script already exists. Skipping...");return}await dn(q,n,"utf-8"),Xt()},"setupTestnetValidator"),un=xc;import Hn from"chalk";import{execSync as fn}from"node:child_process";function hn(t){try{fn(`test -d ${t}`),console.log(`${t} already exists.`)}catch{fn(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(hn,"createDirectoryIfNotExists");var Sn=r(()=>{try{let t=[O.ACCOUNTS,O.LEDGER,O.SNAPSHOTS];for(let e of t)hn(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as Dc}from"child_process";function Kc(){let e=Dc("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
214
+ `).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[y,M,P]=S.trim().split(/\s+/);if(!y||!M)continue;let z=parseInt(M,10);if(isNaN(z))continue;let vt=P!==void 0&&P!=="";P==="/"&&(l=y.replace(/p?\d*$/,""));let Yt=n.some(mo=>mo!==y&&mo.startsWith(y)),lo=y.startsWith("nvme")?"NVMe":"SATA";z>=400*1024*1024*1024&&o.push({name:y,size:z,mountpoint:P||"",isMounted:vt,hasPartition:Yt,type:lo})}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 p=o.filter(S=>!m.includes(S.name)).sort((S,y)=>y.size-S.size),f=p.filter(S=>S.type==="NVMe").sort((S,y)=>y.size-S.size),T=p.filter(S=>S.type==="SATA").sort((S,y)=>y.size-S.size),A=[...f,...T];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 y=A[1];y.size>=400*1024*1024*1024&&!y.isMounted&&(a=!0)}if(A.length>2){let y=A[2];y.size>=400*1024*1024*1024&&!y.isMounted&&(c=!0)}}return A.forEach((S,y)=>console.log(`Prioritized Disk ${y+1}: ${S.name} ${S.size}`)),{disks:A,has850GB:s,has400GB:a,hasUsed1250GB:i,hasThirdDisk400GB:c}}r(Kc,"getPreferredDisks");var Zt=Kc;import{spawnSync as yn}from"child_process";var dt=r(t=>{if(yn(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return yn(o,{shell:!0,stdio:"inherit"}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as vo}from"child_process";var te=r((t,e="",o="",n=!1,s=!1)=>{let a=`${t} ${O.ROOT} ext4 auto 0 0`;n&&(a=`${t} ${O.LEDGER} ext4 auto 0 0
215
215
  ${e} ${O.ACCOUNTS} ext4 auto 0 0`),s&&(a=`${t} ${O.LEDGER} ext4 auto 0 0
216
216
  ${e} ${O.ACCOUNTS} ext4 auto 0 0
217
- ${o} ${O.SNAPSHOTS} ext4 auto 0 0`);let i=[a],l=Oo("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,m=[];for(let d of i)l.includes(d)||m.push(d);if(m.length){let d=`echo "${m.join(`
218
- `)}" | sudo tee -a /etc/fstab`;Oo(d,{shell:!0,encoding:"utf8"}),Oo("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
217
+ ${o} ${O.SNAPSHOTS} ext4 auto 0 0`);let i=[a],l=vo("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,m=[];for(let d of i)l.includes(d)||m.push(d);if(m.length){let d=`echo "${m.join(`
218
+ `)}" | sudo tee -a /etc/fstab`;vo(d,{shell:!0,encoding:"utf8"}),vo("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
219
219
  ${m.join(`
220
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as bc}from"child_process";var hn=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 Uc=r(async()=>{let t=Zt(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB&&t.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await v({MNT_DISK_TYPE:G.TRIPLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s="/dev/"+t.disks[2].name,a=dt(o),i=dt(n),c=dt(s);te(a?a?o:"":"",i?i?n:"":"",c?c?s:"":"",!1,!0)}else if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await v({MNT_DISK_TYPE:G.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=dt(o),a=dt(n);te(s?s?o:"":"",a?a?n:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await v({MNT_DISK_TYPE:G.SINGLE}),e.includes("/mnt")){hn(e);let o="/dev/"+t.disks[0].name;dt(o),te(o)}else{let o="/dev/"+t.disks[0].name;dt(o),te(o)}},"mountDirs"),Sn=Uc;import{spawnSync as Mc}from"child_process";var yn=r(()=>{let t=[`sudo mkdir -p ${O.ROOT}`,`sudo chown -R solv:solv ${O.ROOT}`,`sudo chmod -R 755 ${O.ROOT}`,`sudo mkdir -p ${O.ACCOUNTS}`,`sudo chown -R solv:solv ${O.ACCOUNTS}`,`sudo chmod -R 755 ${O.ACCOUNTS}`,`sudo mkdir -p ${O.LEDGER}`,`sudo chown -R solv:solv ${O.LEDGER}`,`sudo chmod -R 755 ${O.LEDGER}`,`sudo mkdir -p ${O.SNAPSHOTS}`,`sudo chown -R solv:solv ${O.SNAPSHOTS}`,`sudo chmod -R 755 ${O.SNAPSHOTS}`];for(let e of t)Mc(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as Ve}from"child_process";import{existsSync as Hc}from"fs";function Tn(){if(!Hc(L.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
220
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as bc}from"child_process";var Tn=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 Uc=r(async()=>{let t=Zt(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB&&t.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await v({MNT_DISK_TYPE:G.TRIPLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s="/dev/"+t.disks[2].name,a=dt(o),i=dt(n),c=dt(s);te(a?a?o:"":"",i?i?n:"":"",c?c?s:"":"",!1,!0)}else if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await v({MNT_DISK_TYPE:G.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=dt(o),a=dt(n);te(s?s?o:"":"",a?a?n:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await v({MNT_DISK_TYPE:G.SINGLE}),e.includes("/mnt")){Tn(e);let o="/dev/"+t.disks[0].name;dt(o),te(o)}else{let o="/dev/"+t.disks[0].name;dt(o),te(o)}},"mountDirs"),En=Uc;import{spawnSync as Mc}from"child_process";var gn=r(()=>{let t=[`sudo mkdir -p ${O.ROOT}`,`sudo chown -R solv:solv ${O.ROOT}`,`sudo chmod -R 755 ${O.ROOT}`,`sudo mkdir -p ${O.ACCOUNTS}`,`sudo chown -R solv:solv ${O.ACCOUNTS}`,`sudo chmod -R 755 ${O.ACCOUNTS}`,`sudo mkdir -p ${O.LEDGER}`,`sudo chown -R solv:solv ${O.LEDGER}`,`sudo chmod -R 755 ${O.LEDGER}`,`sudo mkdir -p ${O.SNAPSHOTS}`,`sudo chown -R solv:solv ${O.SNAPSHOTS}`,`sudo chmod -R 755 ${O.SNAPSHOTS}`];for(let e of t)Mc(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as Ve}from"child_process";import{existsSync as Hc}from"fs";function An(){if(!Hc(L.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
221
221
  # Increase UDP buffer sizes
222
222
  net.core.rmem_default = 134217728
223
223
  net.core.rmem_max = 134217728
@@ -232,7 +232,7 @@ fs.nr_open = 1000000
232
232
  `,e=`
233
233
  # Increase process file descriptor count limit
234
234
  * - nofile 1000000
235
- `;Ve(`echo "${t}" | sudo tee ${L.SOL_SYSTEM_CONFIG21} > /dev/null`),Ve(`sudo sysctl -p ${L.SOL_SYSTEM_CONFIG21}`),Ve(`echo "DefaultLimitNOFILE=1000000" | sudo tee -a ${L.SOL_SYSTEM_CONF}`),Ve(`echo "${e}" | sudo tee ${L.SOL_NOFILES_CONF} > /dev/null`)}}r(Tn,"setupSystemd");var En=r((t=M.USERNAME)=>{let{log:e}=pt();return`${e} {
235
+ `;Ve(`echo "${t}" | sudo tee ${L.SOL_SYSTEM_CONFIG21} > /dev/null`),Ve(`sudo sysctl -p ${L.SOL_SYSTEM_CONFIG21}`),Ve(`echo "DefaultFILE=1000000" | sudo tee -a ${L.SOL_SYSTEM_CONF}`),Ve(`echo "${e}" | sudo tee ${L.SOL_NOFILES_CONF} > /dev/null`)}}r(An,"setupSystemd");var wn=r((t=H.USERNAME)=>{let{log:e}=pt();return`${e} {
236
236
  su ${t} ${t}
237
237
  daily
238
238
  rotate 1
@@ -243,7 +243,7 @@ fs.nr_open = 1000000
243
243
  systemctl kill -s USR1 solv.service
244
244
  endscript
245
245
  }
246
- `},"logRotates");import{existsSync as Fc}from"fs";import{execSync as Yc}from"child_process";function gn(){if(console.log("Creating logrotate configuration for solana"),Fc(L.SOL_LOGROTATE))console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.");else{let t=En();Yc(`echo "${t}" | sudo tee ${L.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(gn,"setupLogrotate");var jc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",Bc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",Jc=`/home/${M.USERNAME}/.local/share/solana/install/active_release/bin`,An=r((t=!0)=>{let{scriptPath:e}=pt(t),o=t?Bc:jc,n=Jc;return`[Unit]
246
+ `},"logRotates");import{existsSync as Fc}from"fs";import{execSync as Yc}from"child_process";function _n(){if(console.log("Creating logrotate configuration for solana"),Fc(L.SOL_LOGROTATE))console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.");else{let t=wn();Yc(`echo "${t}" | sudo tee ${L.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(_n,"setupLogrotate");var jc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",Bc="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",Jc=`/home/${H.USERNAME}/.local/share/solana/install/active_release/bin`,Nn=r((t=!0)=>{let{scriptPath:e}=pt(t),o=t?Bc:jc,n=Jc;return`[Unit]
247
247
  Description=Solana Validator
248
248
  After=network.target
249
249
  StartLimitIntervalSec=0
@@ -254,14 +254,14 @@ Restart=always
254
254
  RestartSec=1
255
255
  LimitNOFILE=1000000
256
256
  LogRateLimitIntervalSec=0
257
- User=${M.USERNAME}
257
+ User=${H.USERNAME}
258
258
  Environment=PATH=${n}
259
- WorkingDirectory=${K.ROOT}
259
+ WorkingDirectory=${b.ROOT}
260
260
  Environment="${o}"
261
261
  ExecStart=${e}
262
262
 
263
263
  [Install]
264
- WantedBy=multi-user.target`},"solvService");import{execSync as Gc}from"child_process";function wn(t=!0){console.log("Creating solvService configuration for solana");let e=An(t);Gc(`echo "${e}" | sudo tee ${L.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(wn,"setupSolvService");var _n=r((t=!0)=>{gn(),wn(t),Tn()},"makeServices");import{spawnSync as vo}from"node:child_process";var Nn=r(t=>{try{Le(t);let e=t.NETWORK;return e===u.TESTNET?(vo(`solana config set --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"}),vo(`solana airdrop 1 --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"})):vo(`solana config set --url ${e} -k ${D}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==E.RPC&&Pe(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as On}from"node:child_process";var $e=r((t=!1,e="45",o=Q,n,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){On(`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}On(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");import{spawnSync as Wc}from"node:child_process";var De=r(t=>{let o=[`sudo systemctl start ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`];Wc(o[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as zc}from"node:child_process";var qc=r(()=>{try{zc('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),vn=qc;import ko from"fs";import{promisify as Rn}from"util";import{execSync as kn}from"child_process";var Qc=Rn(ko.readFile),Xc=Rn(ko.access),Ke="/etc/sysctl.conf",Zc=`# set default and maximum socket buffer sizes to 128MB
264
+ WantedBy=multi-user.target`},"solvService");import{execSync as Gc}from"child_process";function On(t=!0){console.log("Creating solvService configuration for solana");let e=Nn(t);Gc(`echo "${e}" | sudo tee ${L.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(On,"setupSolvService");var vn=r((t=!0)=>{_n(),On(t),An()},"makeServices");import{spawnSync as ko}from"node:child_process";var kn=r(t=>{try{Le(t);let e=t.NETWORK;return e===u.TESTNET?(ko(`solana config set --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"}),ko(`solana airdrop 1 --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"})):ko(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==E.RPC&&Pe(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as Rn}from"node:child_process";var $e=r((t=!1,e="45",o=Q,n,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){Rn(`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}Rn(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");import{spawnSync as zc}from"node:child_process";var De=r(t=>{let o=[`sudo systemctl start ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`];zc(o[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as Wc}from"node:child_process";var qc=r(()=>{try{Wc('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Cn=qc;import Ro from"fs";import{promisify as In}from"util";import{execSync as Pn}from"child_process";var Qc=In(Ro.readFile),Xc=In(Ro.access),Ke="/etc/sysctl.conf",Zc=`# set default and maximum socket buffer sizes to 128MB
265
265
  net.core.rmem_default=134217728
266
266
  net.core.wmem_default=134217728
267
267
  net.core.rmem_max=134217728
@@ -272,9 +272,9 @@ net.ipv4.tcp_rmem=10240 87380 134217728
272
272
  net.ipv4.tcp_wmem=10240 87380 134217728
273
273
 
274
274
  # Enable TCP westwood for kernels greater than or equal to 2.6.13
275
- net.ipv4.tcp_congestion_control=westwood`;async function tl(){try{await Xc(Ke,ko.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${Ke} does not exist`)}try{let t=await Qc(Ke,"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+=`
275
+ net.ipv4.tcp_congestion_control=westwood`;async function tl(){try{await Xc(Ke,Ro.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${Ke} does not exist`)}try{let t=await Qc(Ke,"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+=`
276
276
  ${Zc}
277
- `,kn(`echo "${e}" | sudo tee ${Ke} > /dev/null`),kn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(tl,"updateSysctlConfig");var Cn=tl;import{spawnSync as el}from"child_process";var Pn=r(()=>{el("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as ol}from"node:child_process";var In=r(()=>{ol("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Ln}from"child_process";var xn=r((t=!1,e=!1)=>{t?nl():rl(e)},"createSymLink"),rl=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),Ln(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),nl=r(()=>{Ln("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import be from"chalk";var sl=r(()=>{let t=`${be.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${be.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
277
+ `,Pn(`echo "${e}" | sudo tee ${Ke} > /dev/null`),Pn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(tl,"updateSysctlConfig");var Ln=tl;import{spawnSync as el}from"child_process";var xn=r(()=>{el("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as ol}from"node:child_process";var Vn=r(()=>{ol("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as $n}from"child_process";var Dn=r((t=!1,e=!1)=>{t?nl():rl(e)},"createSymLink"),rl=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),$n(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),nl=r(()=>{$n("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import be from"chalk";var sl=r(()=>{let t=`${be.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${be.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
278
278
 
279
279
  We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
280
280
  It's our way of supporting the community and empowering you with fast, reliable connections.
@@ -284,11 +284,11 @@ To get your free API key, simply join us through the link below:
284
284
  Validators DAO: ${be.white("`https://discord.gg/X4BgkBHavp`")}
285
285
 
286
286
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
287
- `;console.log(be.cyan(e))},"rpcLog"),wt=sl;import{spawnSync as H}from"child_process";var al=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
287
+ `;console.log(be.cyan(e))},"rpcLog"),wt=sl;import{spawnSync as D}from"child_process";var al=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
288
288
  sudo chmod -R 755 /mnt
289
289
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
290
290
  sudo chown -R solv:solv /mnt
291
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Vn=al;var il=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
291
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Kn=al;var il=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
292
292
  Description=Firedancer Solana
293
293
  After=network.target
294
294
  StartLimitIntervalSec=0
@@ -304,7 +304,7 @@ ExecStart=/home/solv/start-firedancer.sh
304
304
 
305
305
  [Install]
306
306
  WantedBy=multi-user.target
307
- `}),"firedancerService"),$n=il;var cl=r(()=>({filePath:"/home/solv/firedancer/config.toml",body:`name = "fd1"
307
+ `}),"firedancerService"),bn=il;var cl=r(()=>({filePath:"/home/solv/firedancer/config.toml",body:`name = "fd1"
308
308
  user = "solv"
309
309
 
310
310
  [log]
@@ -367,7 +367,7 @@ user = "solv"
367
367
  shred_tile_count = 1
368
368
  verify_tile_count = 1
369
369
  bank_tile_count = 1
370
- quic_tile_count = 1`}),"configToml"),Dn=cl;var ll=r(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
370
+ quic_tile_count = 1`}),"configToml"),Un=cl;var ll=r(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
371
371
  Description=Relay port 9600 to localhost:80
372
372
  After=network.target
373
373
 
@@ -377,7 +377,7 @@ Restart=always
377
377
 
378
378
  [Install]
379
379
  WantedBy=multi-user.target
380
- `}),"portRelayService"),Kn=ll;var ml=r(async()=>{H("git clone --recurse-submodules https://github.com/gabrielhicks/firedancer.git",{shell:!0,stdio:"inherit"}),H(`git checkout v${Pr}-mod`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),H("./deps.sh",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),H("make -j fdctl",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),H("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let{filePath:t,body:e}=Vn();H(`echo "${e}" | sudo tee ${t} > /dev/null`,{shell:!0,stdio:"inherit"}),H(`sudo chmod +x ${t}`,{shell:!0,stdio:"inherit"});let o=$n();H(`echo "${o.body}" | sudo tee ${o.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let n=Kn();H("sudo apt install socat",{shell:!0,stdio:"inherit"}),H("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),H(`echo "${n.body}" | sudo tee ${n.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),H("sudo systemctl daemon-reload",{shell:!0});let s=Dn();H(`echo "${s.body}" | sudo tee ${s.filePath} > /dev/null`,{shell:!0,stdio:"inherit"})},"setupFiredancer"),Ue=ml;var Un=r(async(t=!1,e=!1,o=!1)=>{try{t||(console.log(bn.white("\u{1F7E2} Initializing Setup")),await x(),await on());let n=await x(),s=n.NETWORK===u.TESTNET;switch(un(),(!e||!o)&&Sn(),_n(s),Pn(),vn(),await Cn(),Nn(n),xn(n.IS_DUMMY,s),n=await x(),n.NODE_TYPE){case E.RPC:await sn(n);break;case E.VALIDATOR:await mn(n),n.VALIDATOR_TYPE===g.FRANKENDANCER&&await Ue();break;default:throw new Error("Unknown Node Type")}o||yn(),zt(),n.VALIDATOR_TYPE!==g.FRANKENDANCER&&(o||(n=await x(),In(),$e(s,"100",n.SNAPSHOTS_PATH,s?n.TESTNET_SOLANA_VERSION:n.MAINNET_SOLANA_VERSION))),o||De(n),console.log(bn.white("\u{1F7E2} Setup Completed")),wt()}catch(n){throw new Error(`Setup Error: ${n.message}`)}},"setupV2");var Mn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
380
+ `}),"portRelayService"),Mn=ll;var ml=r(async(t=!1)=>{t?(D("git clone --recurse-submodules https://github.com/gabrielhicks/firedancer.git",{shell:!0,stdio:"inherit"}),D(`git checkout v${go}-mod`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(D("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),D(`git checkout v${go}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),D("./deps.sh",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),D("make -j fdctl",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),D("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let{filePath:e,body:o}=Kn();D(`echo "${o}" | sudo tee ${e} > /dev/null`,{shell:!0,stdio:"inherit"}),D(`sudo chmod +x ${e}`,{shell:!0,stdio:"inherit"});let n=bn();D(`echo "${n.body}" | sudo tee ${n.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let s=Mn();D("sudo apt install socat",{shell:!0,stdio:"inherit"}),D("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),D(`echo "${s.body}" | sudo tee ${s.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),D("sudo systemctl daemon-reload",{shell:!0});let a=Un();D(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"})},"setupFiredancer"),Ue=ml;var Fn=r(async(t=!1,e=!1,o=!1,n=!1)=>{try{t||(console.log(Hn.white("\u{1F7E2} Initializing Setup")),await x(),await nn());let s=await x(),a=s.NETWORK===u.TESTNET;switch(Sn(),(!e||!o)&&En(),vn(a),xn(),Cn(),await Ln(),kn(s),Dn(s.IS_DUMMY,a),s=await x(),s.NODE_TYPE){case E.RPC:await ln(s);break;case E.VALIDATOR:await un(s,n),s.VALIDATOR_TYPE===g.FRANKENDANCER&&await Ue(n);break;default:throw new Error("Unknown Node Type")}o||gn(),Wt(),s.VALIDATOR_TYPE!==g.FRANKENDANCER&&(o||(s=await x(),Vn(),$e(a,"100",s.SNAPSHOTS_PATH,a?s.TESTNET_SOLANA_VERSION:s.MAINNET_SOLANA_VERSION))),o||De(s),console.log(Hn.white("\u{1F7E2} Setup Completed")),wt()}catch(s){throw new Error(`Setup Error: ${s.message}`)}},"setupV2");var Yn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
381
381
  [Unit]
382
382
  Description=Solana transaction relayer
383
383
  Requires=network-online.target
@@ -403,7 +403,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
403
403
  --verifying-key-pem-path=/home/solv/public.pem
404
404
 
405
405
  [Install]
406
- WantedBy=multi-user.target`;return{filePath:e,body:o}},"relayerService"),Hn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`[Unit]
406
+ WantedBy=multi-user.target`;return{filePath:e,body:o}},"relayerService"),jn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`[Unit]
407
407
  Description=Solana transaction relayer
408
408
  Requires=network-online.target
409
409
  After=network-online.target
@@ -426,42 +426,42 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
426
426
  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
427
427
 
428
428
  [Install]
429
- WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as Me,spawnSync as ut}from"child_process";var Fn=r(async(t,e=!0)=>{ut("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),ut("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),ut("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),ut("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),ut("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),ut("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:o,body:n}=e?Mn(t):Hn(t);Me(`echo "${n}" | sudo tee ${o} > /dev/null`),ut("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),ut("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Me("sudo ufw allow 11228",{stdio:"inherit"}),Me("sudo ufw allow 11229",{stdio:"inherit"}),Me("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as Ro}from"node:child_process";var pl=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"),Yn=pl;import{spawnSync as dl}from"node:child_process";import{readFile as ul,writeFile as fl}from"fs/promises";var hl=r(async()=>{let t="/home/solv/start-validator.sh",o=(await ul(t,"utf-8")).split(`
429
+ WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as Me,spawnSync as ut}from"child_process";var Bn=r(async(t,e=!0)=>{ut("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),ut("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),ut("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),ut("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),ut("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),ut("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:o,body:n}=e?Yn(t):jn(t);Me(`echo "${n}" | sudo tee ${o} > /dev/null`),ut("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),ut("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Me("sudo ufw allow 11228",{stdio:"inherit"}),Me("sudo ufw allow 11229",{stdio:"inherit"}),Me("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as Co}from"node:child_process";var pl=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"),Jn=pl;import{spawnSync as dl}from"node:child_process";import{readFile as ul,writeFile as fl}from"fs/promises";var hl=r(async()=>{let t="/home/solv/start-validator.sh",o=(await ul(t,"utf-8")).split(`
430
430
  `);o.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let n=o.join(`
431
- `);await fl(t,n),dl(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),jn=hl;import Sl from"inquirer";import{writeFile as yl}from"node:fs/promises";var Bn=r(async()=>{let e=(await Sl.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";Ro(o,{shell:!0,stdio:"inherit"}),Ro(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),Ro(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Yn(e),c=JSON.stringify(i,null,2);await yl(a,c,{encoding:"utf8"}),await jn()},"yellowstoneGeyser");var Jn=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).action(async e=>{try{if(e.vote)console.log(ct.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Pe(t),process.exit(0);else if(e.key)console.log(ct.white("\u{1F511} Setting up Validator Keypairs ...")),Le(t),process.exit(0);else if(e.relayer){console.log(ct.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let n=(await At()).blockEngineUrl;await Fn(n,!1),console.log(ct.green(`Jito Relayer Setup Completed
431
+ `);await fl(t,n),dl(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Gn=hl;import Sl from"inquirer";import{writeFile as yl}from"node:fs/promises";var zn=r(async()=>{let e=(await Sl.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";Co(o,{shell:!0,stdio:"inherit"}),Co(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),Co(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Jn(e),c=JSON.stringify(i,null,2);await yl(a,c,{encoding:"utf8"}),await Gn()},"yellowstoneGeyser");var Wn=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=>{try{if(e.vote)console.log(ct.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Pe(t),process.exit(0);else if(e.key)console.log(ct.white("\u{1F511} Setting up Validator Keypairs ...")),Le(t),process.exit(0);else if(e.relayer){console.log(ct.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let n=(await At()).blockEngineUrl;await Bn(n,!1),console.log(ct.green(`Jito Relayer Setup Completed
432
432
 
433
- $ solv relayer --help`)),zt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Zr(),zt(),wt(),process.exit(0);else if(e.geyser){console.log(ct.white("\u26A1\uFE0F Setting up Geyser ...")),await Bn();return}else if(e.firedancer){console.log(ct.white("\u{1F525} Setting up Firedancer ...")),await Ue();return}await Un(e.skipInitConfig,e.skipMount,e.pivot)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(ct.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ct.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Tl}from"child_process";var Co=r(()=>{let o=Tl("df -h").toString().split(`
434
- `).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)=>_t(a.Avail)-_t(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&_t(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/")&&_t(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import Gn from"chalk";import El from"cli-table3";var Po=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>Gn.blue(n)),o=new El({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=>Gn.white(s)))}),console.log(o.toString())},"displayTable");var Wn=r(async()=>{h.command("df").description("Disk Free Command").action(()=>{let t=Co();Po(t)})},"dfCommands"),_t=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 zn=r(t=>{h.command("start").description("Start Solana Validator").action(()=>{De(t),process.exit(0)})},"startCommand");import{spawnSync as gl}from"node:child_process";var qn=r(t=>{let o=[`sudo systemctl stop ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`];gl(o[0],{shell:!0,stdio:"inherit"})},"stopSolana");var Qn=r(t=>{h.command("stop").description("Stop Solana Validator").action(()=>{qn(t),process.exit(0)})},"stopCommand");import{spawnSync as ee}from"node:child_process";import Xn from"chalk";var Zn=r(t=>{let e=X();h.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async o=>{o.rm&&(console.log(Xn.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),ee("solv stop",{stdio:"inherit",shell:!0}),ee("solv rm:snapshot",{stdio:"inherit",shell:!0}),ee("solv get snapshot",{stdio:"inherit",shell:!0}),ee("solv start",{stdio:"inherit",shell:!0}),console.log(Xn.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let n=`${e} --ledger ${t.LEDGER_PATH} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE}`;ee(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var ts=r(t=>{let o=t.NETWORK===u.TESTNET?et:ot;t.NODE_TYPE===E.RPC&&(o=gt),h.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${o}`,o).action(async n=>{if(t.VALIDATOR_TYPE===g.JITO){let l=`v${n.version||Gt}-mod`;we(l);return}t.NODE_TYPE===E.RPC&&(o=gt);let i=n.version||o;await ye(i)})},"installCommands");import{spawnSync as Al}from"child_process";var es=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{Al("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=Zt();console.log(t)})},"mountCommands");import{spawnSync as Nl}from"node:child_process";import os from"chalk";import{spawnSync as wl}from"child_process";var _l=r(async()=>{try{let t=wl("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"),He=_l;var rs=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 * * * *").action(async e=>{await He()&&(console.log(os.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 -`;Nl(n,{shell:!0,stdio:"inherit"}),console.log(os.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var oe={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 vl,mkdirSync as kl}from"fs";import Rl from"inquirer";import{homedir as Cl}from"os";import{spawnSync as Ol}from"node:child_process";function ns(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return Ol(s,{shell:!0,stdio:"inherit"}).status===0}r(ns,"executeSCP");var Io=r(async(t="")=>{let e=t;t===""&&(e=(await Rl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(N()),n=Cl(),s=n.includes("/home/solv")?"/home/solv":n+oe.SOLV_KEYPAIR_DOWNLOAD_PATH;vl(s)||kl(s,{recursive:!0});let a=!0,i=n+"/"+Jo;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}`;ns(e,c,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as Pl}from"child_process";import{existsSync as Il}from"fs";import Ll from"inquirer";import xl from"os";var ss=r(async(t="")=>{let e=xl.userInfo().homedir,o=t;t===""&&(o=(await Ll.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${oe.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=oe.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(!Il(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;Pl(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as Vl}from"child_process";import $l from"inquirer";var as=r(async()=>{let t=await $l.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}`;Vl(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import Fe from"chalk";import{readFileSync as Dl}from"fs";import Kl from"os";var is=r(()=>{try{let e=`${Kl.userInfo().homedir}/.ssh/id_rsa.pub`,o=Dl(e,"utf8");console.log(Fe.white(`Your SSH Public Key is:
433
+ $ solv relayer --help`)),Wt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await en(),Wt(),wt(),process.exit(0);else if(e.geyser){console.log(ct.white("\u26A1\uFE0F Setting up Geyser ...")),await zn();return}else if(e.firedancer){console.log(ct.white("\u{1F525} Setting up Firedancer ...")),await Ue(e.mod);return}await Fn(e.skipInitConfig,e.skipMount,e.pivot,e.mod)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(ct.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ct.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Tl}from"child_process";var Po=r(()=>{let o=Tl("df -h").toString().split(`
434
+ `).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)=>_t(a.Avail)-_t(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&_t(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/")&&_t(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import qn from"chalk";import El from"cli-table3";var Io=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>qn.blue(n)),o=new El({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=>qn.white(s)))}),console.log(o.toString())},"displayTable");var Qn=r(async()=>{h.command("df").description("Disk Free Command").action(()=>{let t=Po();Io(t)})},"dfCommands"),_t=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 Xn=r(t=>{h.command("start").description("Start Solana Validator").action(()=>{De(t),process.exit(0)})},"startCommand");import{spawnSync as gl}from"node:child_process";var Zn=r(t=>{let o=[`sudo systemctl stop ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`];gl(o[0],{shell:!0,stdio:"inherit"})},"stopSolana");var ts=r(t=>{h.command("stop").description("Stop Solana Validator").action(()=>{Zn(t),process.exit(0)})},"stopCommand");import{spawnSync as ee}from"node:child_process";import es from"chalk";var os=r(t=>{let e=X();h.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async o=>{o.rm&&(console.log(es.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),ee("solv stop",{stdio:"inherit",shell:!0}),ee("solv rm:snapshot",{stdio:"inherit",shell:!0}),ee("solv get snapshot",{stdio:"inherit",shell:!0}),ee("solv start",{stdio:"inherit",shell:!0}),console.log(es.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let n=`${e} --ledger ${t.LEDGER_PATH} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE}`;ee(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var rs=r(t=>{let o=t.NETWORK===u.TESTNET?et:ot;t.NODE_TYPE===E.RPC&&(o=gt),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===g.JITO,a=n.mod;if(s){let m=`v${n.version||Gt}`;we(m,a);return}t.NODE_TYPE===E.RPC&&(o=gt);let c=n.version||o;await ye(c,a)})},"installCommands");import{spawnSync as Al}from"child_process";var ns=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{Al("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=Zt();console.log(t)})},"mountCommands");import{spawnSync as Nl}from"node:child_process";import ss from"chalk";import{spawnSync as wl}from"child_process";var _l=r(async()=>{try{let t=wl("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"),He=_l;var as=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 * * * *").action(async e=>{await He()&&(console.log(ss.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 -`;Nl(n,{shell:!0,stdio:"inherit"}),console.log(ss.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var oe={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 vl,mkdirSync as kl}from"fs";import Rl from"inquirer";import{homedir as Cl}from"os";import{spawnSync as Ol}from"node:child_process";function is(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return Ol(s,{shell:!0,stdio:"inherit"}).status===0}r(is,"executeSCP");var Lo=r(async(t="")=>{let e=t;t===""&&(e=(await Rl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(N()),n=Cl(),s=n.includes("/home/solv")?"/home/solv":n+oe.SOLV_KEYPAIR_DOWNLOAD_PATH;vl(s)||kl(s,{recursive:!0});let a=!0,i=n+"/"+Go;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}`;is(e,c,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as Pl}from"child_process";import{existsSync as Il}from"fs";import Ll from"inquirer";import xl from"os";var cs=r(async(t="")=>{let e=xl.userInfo().homedir,o=t;t===""&&(o=(await Ll.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${oe.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=oe.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(!Il(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;Pl(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as Vl}from"child_process";import $l from"inquirer";var ls=r(async()=>{let t=await $l.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}`;Vl(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import Fe from"chalk";import{readFileSync as Dl}from"fs";import Kl from"os";var ms=r(()=>{try{let e=`${Kl.userInfo().homedir}/.ssh/id_rsa.pub`,o=Dl(e,"utf8");console.log(Fe.white(`Your SSH Public Key is:
435
435
  `)),console.log(Fe.white(o))}catch(t){console.error(Fe.white(`Error reading SSH Public Key
436
- `)),console.error(Fe.white(t))}},"cat");import{spawnSync as bl}from"child_process";var cs=r(()=>{bl("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Ul}from"child_process";import{readFileSync as Ml}from"fs";import{Readable as Hl}from"stream";var ls=r(async t=>new Promise((e,o)=>{try{let n=Ul("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
437
- `).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"),Fl=r(t=>{try{return JSON.parse(Ml(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),ms=r(async(t,e)=>{let o=[],n=Hl.from(t);return n.on("data",async s=>{Fl(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import Ye from"chalk";import{Presets as Jl,SingleBar as Gl}from"cli-progress";import ps from"chalk";import{spawnSync as Yl}from"node:child_process";import jl from"node-fetch";var Bl=r(async()=>{let t=await jl(Zo,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(ps.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
438
- Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)Yl(o,{shell:!0,stdio:"ignore"});return console.log(ps.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),ds=Bl;var us=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 Io(e.ip);return}await Io()}),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 ds();return}await ss(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(()=>{is()}),t.command("init").description("Init SSH Key Pair").action(()=>{cs()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Gl({},Jl.shades_classic);e.start(1e4,0);let o=await ls(e),n=await ms(o,e);e.stop(),console.log(Ye.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(Ye.green(`
436
+ `)),console.error(Fe.white(t))}},"cat");import{spawnSync as bl}from"child_process";var ps=r(()=>{bl("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Ul}from"child_process";import{readFileSync as Ml}from"fs";import{Readable as Hl}from"stream";var ds=r(async t=>new Promise((e,o)=>{try{let n=Ul("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
437
+ `).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"),Fl=r(t=>{try{return JSON.parse(Ml(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),us=r(async(t,e)=>{let o=[],n=Hl.from(t);return n.on("data",async s=>{Fl(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import Ye from"chalk";import{Presets as Jl,SingleBar as Gl}from"cli-progress";import fs from"chalk";import{spawnSync as Yl}from"node:child_process";import jl from"node-fetch";var Bl=r(async()=>{let t=await jl(tr,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(fs.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
438
+ Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)Yl(o,{shell:!0,stdio:"ignore"});return console.log(fs.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),hs=Bl;var Ss=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 Lo(e.ip);return}await Lo()}),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 hs();return}await cs(e.ip)}),t.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await ls()}),t.command("cat").description("Show SSH Public Key").action(()=>{ms()}),t.command("init").description("Init SSH Key Pair").action(()=>{ps()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Gl({},Jl.shades_classic);e.start(1e4,0);let o=await ds(e),n=await us(o,e);e.stop(),console.log(Ye.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(Ye.green(`
439
439
  ${n.join(`
440
440
  `)}`)),console.log(Ye.white(`
441
441
  Only showing the first 10 results
442
442
 
443
- `)),console.log(Ye.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as Wl}from"child_process";var fs=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{zl(t)})},"statusCommands"),zl=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`;Wl(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as ql}from"node:child_process";var hs=r(async(t,e)=>{try{let o=await x(),n=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===E.RPC?o.RPC_URL:n?u.TESTNET:o.RPC_URL,c=[`solana delegate-stake ${t} ${e} --stake-authority ${n?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${a}`];return ql(c.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import ys from"inquirer";import{spawnSync as Ql}from"node:child_process";var Ss=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=Ql(`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 Xl,existsAsync as Zl}from"@skeet-framework/utils";import{execSync as tm,spawnSync as Be}from"node:child_process";import em from"node:os";var Ts=r(async t=>{let e=t.NETWORK===u.TESTNET;if(!(await ys.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;Be(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await ys.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await rm(),c=t.STAKE_ACCOUNTS,l=Array.from(new Set([...c,a]));return It({STAKE_ACCOUNT:l}),Ss(i,Number(s.solAmount))},"stakeAccountQuestion"),om=em.userInfo().homedir,je=om+"/stake-account",rm=r(async()=>{await Zl(je)||Be(`mkdir -p ${je}`,{shell:!0});let t=Be(`ls ${je}`,{shell:!0}).stdout.toString().split(`
444
- `).filter(a=>a.includes(".json")),e=Xl(t.length+1),o=`${je}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return Be(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:tm(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as nm}from"node:child_process";var Es=r(async t=>{try{let o=(await x()).NETWORK===u.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return nm(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as sm}from"node:child_process";var gs=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return sm(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import $t from"chalk";import{Connection as am,PublicKey as im}from"@solana/web3.js";import{stakePoolInfo as cm}from"@solana/spl-stake-pool";var Je=r(async(t,e=J)=>{try{let o=new am(t),n=new im(e);return await cm(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as lm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as mm}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as pm}from"@metaplex-foundation/umi";var As=r(async(t,e)=>{try{let o=pm(e);console.log(`mintPubkey: ${o}`);let n=mm(t),s=await lm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import re from"chalk";import ws from"inquirer";var _s=r(async t=>{let e=await ws.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:J}]);try{let o=await Je(t,e.stakePoolAddress);if(!o)return console.log(re.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
443
+ `)),console.log(Ye.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as zl}from"child_process";var ys=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{Wl(t)})},"statusCommands"),Wl=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`;zl(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as ql}from"node:child_process";var Ts=r(async(t,e)=>{try{let o=await x(),n=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===E.RPC?o.RPC_URL:n?u.TESTNET:o.RPC_URL,c=[`solana delegate-stake ${t} ${e} --stake-authority ${n?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${a}`];return ql(c.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import gs from"inquirer";import{spawnSync as Ql}from"node:child_process";var Es=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=Ql(`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 Xl,existsAsync as Zl}from"@skeet-framework/utils";import{execSync as tm,spawnSync as Be}from"node:child_process";import em from"node:os";var As=r(async t=>{let e=t.NETWORK===u.TESTNET;if(!(await gs.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;Be(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await gs.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await rm(),c=t.STAKE_ACCOUNTS,l=Array.from(new Set([...c,a]));return It({STAKE_ACCOUNT:l}),Es(i,Number(s.solAmount))},"stakeAccountQuestion"),om=em.userInfo().homedir,je=om+"/stake-account",rm=r(async()=>{await Zl(je)||Be(`mkdir -p ${je}`,{shell:!0});let t=Be(`ls ${je}`,{shell:!0}).stdout.toString().split(`
444
+ `).filter(a=>a.includes(".json")),e=Xl(t.length+1),o=`${je}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return Be(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:tm(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as nm}from"node:child_process";var ws=r(async t=>{try{let o=(await x()).NETWORK===u.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return nm(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as sm}from"node:child_process";var _s=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return sm(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import $t from"chalk";import{Connection as am,PublicKey as im}from"@solana/web3.js";import{stakePoolInfo as cm}from"@solana/spl-stake-pool";var Je=r(async(t,e=J)=>{try{let o=new am(t),n=new im(e);return await cm(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as lm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as mm}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as pm}from"@metaplex-foundation/umi";var Ns=r(async(t,e)=>{try{let o=pm(e);console.log(`mintPubkey: ${o}`);let n=mm(t),s=await lm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import re from"chalk";import Os from"inquirer";var vs=r(async t=>{let e=await Os.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:J}]);try{let o=await Je(t,e.stakePoolAddress);if(!o)return console.log(re.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
445
445
  Please check the correct address and try again.
446
446
  `)),console.log(re.white(`For stake pool information
447
- \u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await As(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
447
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await Ns(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
448
448
  Name: ${a.name}
449
- Token Mint: ${a.mint}`;return(await ws.prompt([{type:"confirm",name:"confirm",message:i+`
449
+ Token Mint: ${a.mint}`;return(await Os.prompt([{type:"confirm",name:"confirm",message:i+`
450
450
  Is this the correct Stake Pool?`}])).confirm?a:(console.log(re.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(re.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
451
451
  Please check the correct address and try again.
452
452
  `)),console.log(re.white(`For stake pool information
453
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Nm}from"fs/promises";import ae from"inquirer";import{existsAsync as Om}from"@skeet-framework/utils";import{Connection as Rs,Keypair as Em,PublicKey as se}from"@solana/web3.js";import{Connection as dm,PublicKey as um,Keypair as fm}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as hm}from"@solana/spl-token";var ne=r(async(t,e,o,n,s=!1)=>{try{let a=fm.fromSecretKey(new Uint8Array(e)),i=new um(o),c=new dm(t);return(await hm(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 gm}from"cli-spinner";import Nt from"chalk";import{PublicKey as Os,Keypair as vs,Transaction as Ns,ComputeBudgetProgram as Sm,LAMPORTS_PER_SOL as ym}from"@solana/web3.js";import*as ks from"@solana/spl-stake-pool";var Lt=r(async(t,e,o,n=new Os(J),s,a,i)=>{try{let c=vs.fromSecretKey(new Uint8Array(e)),l=o*ym,{instructions:m,signers:d}=await Tm(t,e,l,n,s,a,i),p=new Ns().add(...m);p.feePayer=c.publicKey;let f=await t.getLatestBlockhashAndContext({commitment:"finalized"});p.recentBlockhash=f.value.blockhash,p.sign(...d,c);let T=new Ns().add(...m).add(Sm.setComputeUnitPrice({microLamports:1e3}));T.feePayer=c.publicKey,T.recentBlockhash=f.value.blockhash,T.sign(...d,c);let A=await t.sendRawTransaction(T.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...f.value,signature:A},"finalized"),{status:"success",signature:A}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),Tm=r(async(t,e,o,n=new Os(J),s,a,i)=>{let l=vs.fromSecretKey(new Uint8Array(e)).publicKey;return await ks.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as Cs}from"@skeet-framework/utils";var Ge=r(async(t,e,o,n)=>{console.log(Nt.white("Solana RPC URL:",t));let s=new Rs(t);o===0&&(o=await We());let a=new gm("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(Nt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new se(e),c=Em.fromSecretKey(new Uint8Array(n)),l=tt;a.setSpinnerTitle(Nt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await ne(t,n,l,c.publicKey);await Cs(1e3),a.setSpinnerTitle(Nt.green("\u{1F504} Converting SOL to elSOL"));let d=await Lt(s,n,o,i,new se(m),new se(ho),c.publicKey),p=0;for(;d.status!=="success";){if(p++,p>10)return a.stop(!0),console.log(Nt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(Nt.yellow(`\u23F3 ${p} Times Retrying...`)),await Cs(3e3),s=new Rs(t),d=await Lt(s,n,o,i,new se(m),new se(ho),c.publicKey)}return a.stop(!0),console.log(Nt.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
453
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Nm}from"fs/promises";import ae from"inquirer";import{existsAsync as Om}from"@skeet-framework/utils";import{Connection as Is,Keypair as Em,PublicKey as se}from"@solana/web3.js";import{Connection as dm,PublicKey as um,Keypair as fm}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as hm}from"@solana/spl-token";var ne=r(async(t,e,o,n,s=!1)=>{try{let a=fm.fromSecretKey(new Uint8Array(e)),i=new um(o),c=new dm(t);return(await hm(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 gm}from"cli-spinner";import Nt from"chalk";import{PublicKey as Rs,Keypair as Cs,Transaction as ks,ComputeBudgetProgram as Sm,LAMPORTS_PER_SOL as ym}from"@solana/web3.js";import*as Ps from"@solana/spl-stake-pool";var Lt=r(async(t,e,o,n=new Rs(J),s,a,i)=>{try{let c=Cs.fromSecretKey(new Uint8Array(e)),l=o*ym,{instructions:m,signers:d}=await Tm(t,e,l,n,s,a,i),p=new ks().add(...m);p.feePayer=c.publicKey;let f=await t.getLatestBlockhashAndContext({commitment:"finalized"});p.recentBlockhash=f.value.blockhash,p.sign(...d,c);let T=new ks().add(...m).add(Sm.setComputeUnitPrice({microLamports:1e3}));T.feePayer=c.publicKey,T.recentBlockhash=f.value.blockhash,T.sign(...d,c);let A=await t.sendRawTransaction(T.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...f.value,signature:A},"finalized"),{status:"success",signature:A}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),Tm=r(async(t,e,o,n=new Rs(J),s,a,i)=>{let l=Cs.fromSecretKey(new Uint8Array(e)).publicKey;return await Ps.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as Ls}from"@skeet-framework/utils";var Ge=r(async(t,e,o,n)=>{console.log(Nt.white("Solana RPC URL:",t));let s=new Is(t);o===0&&(o=await ze());let a=new gm("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(Nt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new se(e),c=Em.fromSecretKey(new Uint8Array(n)),l=tt;a.setSpinnerTitle(Nt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await ne(t,n,l,c.publicKey);await Ls(1e3),a.setSpinnerTitle(Nt.green("\u{1F504} Converting SOL to elSOL"));let d=await Lt(s,n,o,i,new se(m),new se(ho),c.publicKey),p=0;for(;d.status!=="success";){if(p++,p>10)return a.stop(!0),console.log(Nt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(Nt.yellow(`\u23F3 ${p} Times Retrying...`)),await Ls(3e3),s=new Is(t),d=await Lt(s,n,o,i,new se(m),new se(ho),c.publicKey)}return a.stop(!0),console.log(Nt.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
454
454
 
455
- Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as Am,Keypair as wm,PublicKey as xt}from"@solana/web3.js";import{Spinner as _m}from"cli-spinner";import Vt from"chalk";import{sleep as Ps}from"@skeet-framework/utils";var Is=r(async(t,e,o,n,s)=>{let a=new Am(t);o===0&&(o=await We());let i=new _m("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(Vt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new xt(e),l=await Je(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Vt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=wm.fromSecretKey(new Uint8Array(n)),p=await ne(t,n,m,d.publicKey),f=await ne(t,n,m,new xt(hr),!0);await Ps(1e3),i.setSpinnerTitle(Vt.green(`\u{1F504} Converting SOL to ${s}`));let T=await Lt(a,n,o,c,new xt(p),new xt(f),d.publicKey),A=0;for(;T.status!=="success";){if(A++,A>10)return i.stop(!0),console.log(Vt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Vt.yellow(`\u23F3 ${A} Times Retrying...
456
- `)),await Ps(1e3),T=await Lt(a,n,o,c,new xt(p),new xt(f),d.publicKey)}return i.stop(!0),console.log(Vt.white(`\u{1F4B0} You've got ${s} \u2728
455
+ Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as Am,Keypair as wm,PublicKey as xt}from"@solana/web3.js";import{Spinner as _m}from"cli-spinner";import Vt from"chalk";import{sleep as xs}from"@skeet-framework/utils";var Vs=r(async(t,e,o,n,s)=>{let a=new Am(t);o===0&&(o=await ze());let i=new _m("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(Vt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new xt(e),l=await Je(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Vt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=wm.fromSecretKey(new Uint8Array(n)),p=await ne(t,n,m,d.publicKey),f=await ne(t,n,m,new xt(yr),!0);await xs(1e3),i.setSpinnerTitle(Vt.green(`\u{1F504} Converting SOL to ${s}`));let T=await Lt(a,n,o,c,new xt(p),new xt(f),d.publicKey),A=0;for(;T.status!=="success";){if(A++,A>10)return i.stop(!0),console.log(Vt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Vt.yellow(`\u23F3 ${A} Times Retrying...
456
+ `)),await xs(1e3),T=await Lt(a,n,o,c,new xt(p),new xt(f),d.publicKey)}return i.stop(!0),console.log(Vt.white(`\u{1F4B0} You've got ${s} \u2728
457
457
 
458
- Signature:`,T.signature)),!0},"depositeLST");import{execSync as ze}from"node:child_process";import{homedir as vm}from"os";var Ls=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=J,s=t.NETWORK===u.TESTNET,a=vm(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(ze(`solana config set --keypair ${i}`),!await Om(i)){console.log($t.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
459
- `)),console.log($t.white(i));return}let c=JSON.parse(await Nm(i,"utf-8"));if(e.elsol){await Ge(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await _s(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Is(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await Ts(t))return;let m=await x(),{validatorVoteAccount:d,stakeAccounts:p}=await Rm(m);for await(let f of p)try{await hs(f,d)}catch{console.log($t.yellow(`Network might be busy, please try again later
458
+ Signature:`,T.signature)),!0},"depositeLST");import{execSync as We}from"node:child_process";import{homedir as vm}from"os";var $s=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=J,s=t.NETWORK===u.TESTNET,a=vm(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(We(`solana config set --keypair ${i}`),!await Om(i)){console.log($t.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
459
+ `)),console.log($t.white(i));return}let c=JSON.parse(await Nm(i,"utf-8"));if(e.elsol){await Ge(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await vs(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Vs(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await As(t))return;let m=await x(),{validatorVoteAccount:d,stakeAccounts:p}=await Rm(m);for await(let f of p)try{await Ts(f,d)}catch{console.log($t.yellow(`Network might be busy, please try again later
460
460
  You can use a custom RPC endpoint to avoid this issue
461
- `))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Pm();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await km();for await(let n of o)try{await Es(n)}catch{console.log($t.yellow(`Network might be busy, please try again later
461
+ `))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Pm();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await km();for await(let n of o)try{await ws(n)}catch{console.log($t.yellow(`Network might be busy, please try again later
462
462
  You can use a custom RPC endpoint to avoid this issue
463
- `))}}else{let o=await Im();await gs(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),We=r(async()=>{let t=ze("solana address").toString().trim(),e=ze("solana balance").toString().replace("SOL","").trim();console.log($t.white(`\u{1F4D7} Selected Wallet: ${t}
464
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log($t.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ae.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),km=r(async()=>{let t=await x();return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Rm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===u.TESTNET?Cm(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return o}}])},"delegateStakeAsk"),Cm=r(t=>{let n=`/home/solv/${t.NETWORK===u.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return ze(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),Pm=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await ae.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),Im=r(async()=>{let t=(await x()).STAKE_ACCOUNTS;return await ae.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 Lm}from"child_process";var xs=r(()=>{try{return Lm("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as xm}from"child_process";var Vs=r(()=>{try{return xm("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import lt from"chalk";import{Spinner as Vm}from"cli-spinner";var Dt;(function(t){t.successHex=lt.hex("#39A845"),t.warningHex=lt.hex("#FFD02E"),t.errorHex=lt.hex("#B5332E"),t.syncHex=lt.hex("#3073B7"),t.greyHex=lt.hex("#BEBDBD"),t.indigoHex=lt.hex("#3950A0"),t.pinkHex=lt.hex("#D8A1C4"),t.normal=e=>{console.log(lt.white(e))},t.syncSpinner=e=>{let o=new Vm(lt.white(e)+` %s
463
+ `))}}else{let o=await Im();await _s(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),ze=r(async()=>{let t=We("solana address").toString().trim(),e=We("solana balance").toString().replace("SOL","").trim();console.log($t.white(`\u{1F4D7} Selected Wallet: ${t}
464
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log($t.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ae.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),km=r(async()=>{let t=await x();return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Rm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===u.TESTNET?Cm(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return o}}])},"delegateStakeAsk"),Cm=r(t=>{let n=`/home/solv/${t.NETWORK===u.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return We(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),Pm=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await ae.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),Im=r(async()=>{let t=(await x()).STAKE_ACCOUNTS;return await ae.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 Lm}from"child_process";var Ds=r(()=>{try{return Lm("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as xm}from"child_process";var Ks=r(()=>{try{return xm("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import lt from"chalk";import{Spinner as Vm}from"cli-spinner";var Dt;(function(t){t.successHex=lt.hex("#39A845"),t.warningHex=lt.hex("#FFD02E"),t.errorHex=lt.hex("#B5332E"),t.syncHex=lt.hex("#3073B7"),t.greyHex=lt.hex("#BEBDBD"),t.indigoHex=lt.hex("#3950A0"),t.pinkHex=lt.hex("#D8A1C4"),t.normal=e=>{console.log(lt.white(e))},t.syncSpinner=e=>{let o=new Vm(lt.white(e)+` %s
465
465
  `);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(`
466
466
  ${e}`),console.log(`${o}`),console.log(`${n}`),console.log(`${s}`),console.log(`${a}`),console.log(`${i}
467
467
  `),console.log(`Solv Version: v${pe}
@@ -485,8 +485,8 @@ $ solv mt -p <fileSystem>
485
485
  $ solv umt -p <fileSystem>
486
486
  `,s=`mount reload
487
487
  $ solv mtr
488
- `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(Dt||(Dt={}));import nt from"chalk";import{spawnSync as $m}from"node:child_process";var qe=r(t=>{$m("solana config get",{shell:!0,stdio:"inherit"});let o=pt();console.log(nt.white("start-validator.sh: ")+o.scriptPath),console.log(nt.white("solv.service: ")+L.SOL_SERVICE),console.log(nt.white("logrotate: ")+L.SOL_LOGROTATE),console.log(nt.white("sysctl.d: ")+L.SOL_SYSTEM_CONFIG21),console.log(nt.white("limits.d: ")+L.SOL_NOFILES_CONF),console.log(nt.white("system.conf: ")+L.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 $s}from"node:child_process";import Dm from"chalk";var Ds=r(t=>{let e=t.NETWORK===u.TESTNET,o=e?et:ot;t.NODE_TYPE===E.RPC&&(o=gt);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=xs();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=$s(s,{shell:!0,stdio:"pipe"});console.log(Dm.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=Vs();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;$e(e,a,i,c,l,m)}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${X()} --ledger /mnt/ledger/ contact-info`;$s(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solv Config").alias("c").action(async()=>{qe(t)}),n.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(s=>{Dt.solvAA(),s.client?Dt.installClientMessage():Dt.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Km}from"node:child_process";var Ks=r(()=>{Km("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as bm}from"node:child_process";var bs=r(()=>{bm("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Um}from"node:child_process";var Us=r(()=>{Um("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Mm}from"node:child_process";var Ms=r(()=>{Mm("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as Hm}from"node:child_process";var Hs=r((t=!1)=>{Hm(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import Lo from"chalk";import{spawnSync as Ym}from"child_process";import{spawnSync as Fm}from"node:child_process";var Fs=r(()=>{Fm("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Ys=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Ks()}),t.command("start").description("Start Relayer").action(()=>{bs()}),t.command("stop").description("Stop Relayer").action(()=>{Us()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{Hs(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{Ms()}),t.command("enable").description("Enable Relayer").action(()=>{Fs()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(Lo.red("Please provide a URL"));return}let o=`${X()} --ledger ${w} set-relayer-config --relayer-url ${e.url}`;console.log(Lo.white("Setting Relayer URL ...")),Ym(o,{shell:!0,stdio:"inherit"}),console.log(Lo.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import js from"chalk";import{spawnSync as jm}from"child_process";var Bs=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;jm(e,{shell:!0,stdio:"inherit"})}catch{console.log(js.yellow(`You might need to install the Solana SPL CLI:
489
- `)),console.log(js.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as Jm}from"os";import{spawnSync as Bm}from"child_process";var ft=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=Bm(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import Gm from"chalk";import{spawnSync as Wm}from"node:child_process";var Js=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=`${Jm()}/mainnet-authority-keypair.json`;await Bs(n),process.exit(0)}await zm(t),process.exit(0)})},"balanceCommands"),zm=r(async t=>{let e=qm(t),o=`Validator Key: ${e.validatorKey}
488
+ `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(Dt||(Dt={}));import nt from"chalk";import{spawnSync as $m}from"node:child_process";var qe=r(t=>{$m("solana config get",{shell:!0,stdio:"inherit"});let o=pt();console.log(nt.white("start-validator.sh: ")+o.scriptPath),console.log(nt.white("solv.service: ")+L.SOL_SERVICE),console.log(nt.white("logrotate: ")+L.SOL_LOGROTATE),console.log(nt.white("sysctl.d: ")+L.SOL_SYSTEM_CONFIG21),console.log(nt.white("limits.d: ")+L.SOL_NOFILES_CONF),console.log(nt.white("system.conf: ")+L.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 bs}from"node:child_process";import Dm from"chalk";var Us=r(t=>{let e=t.NETWORK===u.TESTNET,o=e?et:ot;t.NODE_TYPE===E.RPC&&(o=gt);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=Ds();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=bs(s,{shell:!0,stdio:"pipe"});console.log(Dm.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=Ks();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;$e(e,a,i,c,l,m)}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${X()} --ledger /mnt/ledger/ contact-info`;bs(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solv Config").alias("c").action(async()=>{qe(t)}),n.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(s=>{Dt.solvAA(),s.client?Dt.installClientMessage():Dt.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Km}from"node:child_process";var Ms=r(()=>{Km("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as bm}from"node:child_process";var Hs=r(()=>{bm("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Um}from"node:child_process";var Fs=r(()=>{Um("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Mm}from"node:child_process";var Ys=r(()=>{Mm("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as Hm}from"node:child_process";var js=r((t=!1)=>{Hm(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import xo from"chalk";import{spawnSync as Ym}from"child_process";import{spawnSync as Fm}from"node:child_process";var Bs=r(()=>{Fm("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Js=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Ms()}),t.command("start").description("Start Relayer").action(()=>{Hs()}),t.command("stop").description("Stop Relayer").action(()=>{Fs()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{js(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{Ys()}),t.command("enable").description("Enable Relayer").action(()=>{Bs()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(xo.red("Please provide a URL"));return}let o=`${X()} --ledger ${w} set-relayer-config --relayer-url ${e.url}`;console.log(xo.white("Setting Relayer URL ...")),Ym(o,{shell:!0,stdio:"inherit"}),console.log(xo.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import Gs from"chalk";import{spawnSync as jm}from"child_process";var zs=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;jm(e,{shell:!0,stdio:"inherit"})}catch{console.log(Gs.yellow(`You might need to install the Solana SPL CLI:
489
+ `)),console.log(Gs.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as Jm}from"os";import{spawnSync as Bm}from"child_process";var ft=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=Bm(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import Gm from"chalk";import{spawnSync as zm}from"node:child_process";var Ws=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=`${Jm()}/mainnet-authority-keypair.json`;await zs(n),process.exit(0)}await Wm(t),process.exit(0)})},"balanceCommands"),Wm=r(async t=>{let e=qm(t),o=`Validator Key: ${e.validatorKey}
490
490
  Address: ${e.validatorKeyAddress}
491
491
  Balance: ${e.validatorKeyBalance}
492
492
  Vote Key: ${e.voteKey}
@@ -498,18 +498,18 @@ Balance: ${e.authorityKeyBalance}
498
498
  Active Identity:`;t.NODE_TYPE===E.RPC&&(o=`Validator Key: ${e.validatorKey}
499
499
  Address: ${e.validatorKeyAddress}
500
500
  Balance: ${e.validatorKeyBalance}
501
- Active Identity:`),console.log(Gm.white(o)),Wm(`solana-keygen pubkey ${k}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),qm=r(t=>{let e=N(),o=t.NETWORK===u.TESTNET;return t.NODE_TYPE===E.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:_(e.mainnetValidatorKey),validatorKeyBalance:ft(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:_(e.testnetValidatorKey),validatorKeyBalance:ft(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:_(e.testnetValidatorVoteKey),voteKeyBalance:ft(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:_(e.testnetValidatorAuthorityKey),authorityKeyBalance:ft(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:_(e.mainnetValidatorKey),validatorKeyBalance:ft(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:_(e.mainnetValidatorVoteKey),voteKeyBalance:ft(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:_(e.mainnetValidatorAuthorityKey),authorityKeyBalance:ft(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as Qm}from"child_process";var Gs=r(()=>{Qm("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as xo}from"node:child_process";var Ws=r(t=>{xo("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),t.SNAPSHOTS_PATH!=="/mnt/ledger"&&xo(`sudo rm -rf ${t.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),xo("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as Xm}from"node:child_process";var zs=r(t=>{let o=`${X()} --ledger ${t.LEDGER_PATH} monitor`;Xm(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as Zm}from"node:child_process";var qs=r(()=>{Zm("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import Qe from"inquirer";import{execSync as Xe,spawnSync as Vo}from"child_process";import ie from"chalk";import{homedir as tp}from"os";var Qs=1e3,$o;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})($o||($o={}));var Ze;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(Ze||(Ze={}));var ep=Object.values($o),Xs=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(ie.blue(`\u2728 Coming Soon
501
+ Active Identity:`),console.log(Gm.white(o)),zm(`solana-keygen pubkey ${k}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),qm=r(t=>{let e=N(),o=t.NETWORK===u.TESTNET;return t.NODE_TYPE===E.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:_(e.mainnetValidatorKey),validatorKeyBalance:ft(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:_(e.testnetValidatorKey),validatorKeyBalance:ft(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:_(e.testnetValidatorVoteKey),voteKeyBalance:ft(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:_(e.testnetValidatorAuthorityKey),authorityKeyBalance:ft(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:_(e.mainnetValidatorKey),validatorKeyBalance:ft(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:_(e.mainnetValidatorVoteKey),voteKeyBalance:ft(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:_(e.mainnetValidatorAuthorityKey),authorityKeyBalance:ft(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as Qm}from"child_process";var qs=r(()=>{Qm("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as Vo}from"node:child_process";var Qs=r(t=>{Vo("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),t.SNAPSHOTS_PATH!=="/mnt/ledger"&&Vo(`sudo rm -rf ${t.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),Vo("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as Xm}from"node:child_process";var Xs=r(t=>{let o=`${X()} --ledger ${t.LEDGER_PATH} monitor`;Xm(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as Zm}from"node:child_process";var Zs=r(()=>{Zm("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import Qe from"inquirer";import{execSync as Xe,spawnSync as $o}from"child_process";import ie from"chalk";import{homedir as tp}from"os";var ta=1e3,Do;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})(Do||(Do={}));var Ze;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(Ze||(Ze={}));var ep=Object.values(Do),ea=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(ie.blue(`\u2728 Coming Soon
502
502
  This Feature is Currently Under Development
503
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await op(),a="0";try{let p=Vo(`solana balance ${s} --url ${t.RPC_URL}`,{shell:!0});if(p.status!==0)throw new Error("Invalid Wallet Address");a=p.stdout.toString(),console.log("toBalance:",a)}catch{console.log(ie.red(`\u274C To Wallet is Invalid
503
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await op(),a="0";try{let p=$o(`solana balance ${s} --url ${t.RPC_URL}`,{shell:!0});if(p.status!==0)throw new Error("Invalid Wallet Address");a=p.stdout.toString(),console.log("toBalance:",a)}catch{console.log(ie.red(`\u274C To Wallet is Invalid
504
504
  Please Check the Wallet Address`)),process.exit(0)}let i=Xe(`solana balance ${n} --url ${t.RPC_URL}`).toString();console.log(ie.white(`\u{1F3E6} From Wallet: ${n}
505
505
  \u{1F4B0} Balance: ${i}`)),console.log(ie.white(`\u{1F3E6} To Wallet: ${s}
506
- \u{1F4B0} Balance: ${a}`));let{amount:c}=await Qe.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=Vo(l,{shell:!0,stdio:"inherit"}),d=fe;for(;m.status!==0&&d>0;)console.log(ie.red(`\u274C Transaction Failed
507
- Retrying Transaction in ${Qs}ms
508
- Retries Left: ${d}`)),await rt(Qs),m=Vo(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),ce=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),op=r(async()=>{let t=tp(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=Xe(`solana address -k ${n}`).toString().trim(),a=await Qe.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:ep}]),i=a.from==="Validator Account"?Object.values(Ze).filter(p=>p!=="Validator Account"):Object.values(Ze).filter(p=>p!=="Authority Account");if((await Qe.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:p}=await Qe.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:ce}]);s=p}else{let p=a.from==="Validator Account"?e:o;n=`${t}/${p}`,s=Xe(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=Xe(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import Zs from"chalk";import rp from"inquirer";import{execSync as Do,spawnSync as np}from"node:child_process";var ta=r(async(t,e=!1)=>{let o=t.NETWORK===u.TESTNET,n=o?Ae: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=Do(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(Zs.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(Zs.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let T=await rp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(T.sol)}let d=Do(`solana address --keypair ${i}`).toString().trim(),p=Do(`solana address --keypair ${a}`).toString().trim(),f=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${p} ${l} --authorized-withdrawer ${a} --url ${n}`;np(f,{shell:!0,stdio:"inherit"})},"withdraw");var ea=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 ta(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as yp,spawnSync as Tp}from"node:child_process";import{BN as ra}from"bn.js";import{LAMPORTS_PER_SOL as Ko}from"@solana/web3.js";import{Connection as cp,LAMPORTS_PER_SOL as lp}from"@solana/web3.js";import{Keypair as sp}from"@solana/web3.js";import{readFile as ap}from"fs/promises";var ip=r(async t=>{let e=JSON.parse(await ap(t,"utf8"));return sp.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),oa=ip;import{homedir as mp}from"os";var Y;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(Y||(Y={}));var pp={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},dp=r(async(t,e="auth",o=!1)=>{let n=new cp(t),s=mp(),a=N(s),c=`${o?"testnet":"mainnet"}${pp[e]}`,l=a[c],m=await oa(l),d=await n.getBalance(m.publicKey),f=Number(d)/lp;if(isNaN(f))throw new Error("Failed to get balance");return f},"getBalance"),st=dp;var up=new ra(3*Ko),na=r(async t=>{let e=await st(t,Y.VALIDATOR),n=new ra(Number(Number(e)*Ko)).sub(up),s=Number(n)/Ko;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import le from"chalk";import{Keypair as fp,Connection as hp,PublicKey as Sp,SystemProgram as sa,ComputeBudgetProgram as to,VersionedTransaction as aa,TransactionMessage as ia}from"@solana/web3.js";var ca=r(async(t,e,o,n)=>{let s=0;try{let a=new hp(t,"finalized"),i=fp.fromSecretKey(new Uint8Array(Array.from(e))),c=new Sp(o),l=n;for(;;)try{let m=[sa.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),to.setComputeUnitLimit({units:2e5}),to.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),p=new aa(new ia({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),f=await a.simulateTransaction(p,{replaceRecentBlockhash:!0,sigVerify:!1});p.sign([i]);let T=[sa.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),to.setComputeUnitLimit({units:f.value.unitsConsumed?Math.trunc(f.value.unitsConsumed*1.2):2e5}),to.setComputeUnitPrice({microLamports:1e3})],A=new aa(new ia({instructions:T,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>fe)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await rt(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as Ep}from"fs/promises";import{LAMPORTS_PER_SOL as gp}from"@solana/web3.js";var bo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=N();await st(t,Y.VOTE)<1?(console.log(le.white("Vote Account Balance is less than 1 SOL")),console.log(le.white("Skip withdrawing SOL from Vote Account to Authority Account"))):Tp("solv withdraw --all",{shell:!0,stdio:"inherit"});let s=await na(t);console.log(le.white(`Transferable Balance: ${s} SOL`));let a=s*gp;if(s<1)console.log(le.white("Validator Account Balance is less than 1 SOL")),console.log(le.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=yp(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await Ep(o,"utf-8"));await ca(t,c,i,a)}return!0},"collectSOL");import{readFile as Ip}from"fs/promises";import Lp from"inquirer";import Uo from"chalk";import{execSync as Ap}from"child_process";import{homedir as wp}from"os";var _p=r(async t=>{try{let e=wp(),{mainnetValidatorAuthorityKey:o}=N(e),n=`spl-token balance ${tt} --owner ${o} --url ${t}`,s=Ap(n).toString().trim();return Number(s)}catch(e){return console.log(Uo.red(`Error: ${e}`)),console.log(Uo.yellow(`You might need to install the Solana SPL CLI:
509
- `)),console.log(Uo.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),la=_p;import ro from"chalk";import{Connection as Np,PublicKey as ma,Keypair as Op,ComputeBudgetProgram as eo,VersionedTransaction as pa,TransactionMessage as da}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as ua,createTransferInstruction as fa,TOKEN_PROGRAM_ID as ha}from"@solana/spl-token";var Sa=r(async(t,e,o,n,s,a)=>{try{let i=new Np(t,"finalized"),c=Op.fromSecretKey(new Uint8Array(e)),l=new ma(o),m=new ma(s),d=Math.trunc(n*Math.pow(10,a)),p=await ua(i,c,m,c.publicKey),f=await ua(i,c,m,l,!0);for(;;)try{let T=[fa(p.address,f.address,c.publicKey,d,[],ha),eo.setComputeUnitLimit({units:2e5}),eo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],A=await i.getLatestBlockhashAndContext({commitment:"finalized"}),S=new pa(new da({instructions:T,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message()),y=await i.simulateTransaction(S,{replaceRecentBlockhash:!0,sigVerify:!1});S.sign([c]);let U=[fa(p.address,f.address,c.publicKey,d,[],ha),eo.setComputeUnitLimit({units:y.value.unitsConsumed?Math.trunc(y.value.unitsConsumed*1.2):2e5}),eo.setComputeUnitPrice({microLamports:1e3})],P=new pa(new da({instructions:U,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message());P.sign([c]);let W=await i.sendRawTransaction(P.serialize());return await i.confirmTransaction({...A.value,signature:W},"finalized"),console.log("finalized signature:",W),W}catch(T){console.error("Transfer failed, retrying...",T)}}catch(i){throw console.error(i),i}},"transferSPLToken");import oo from"inquirer";import{spawnSync as ya}from"child_process";import Mo from"chalk";import{promises as Ta}from"fs";var vp=r(async(t="epochTimer")=>{try{let e=ya("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Mo.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
506
+ \u{1F4B0} Balance: ${a}`));let{amount:c}=await Qe.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=$o(l,{shell:!0,stdio:"inherit"}),d=fe;for(;m.status!==0&&d>0;)console.log(ie.red(`\u274C Transaction Failed
507
+ Retrying Transaction in ${ta}ms
508
+ Retries Left: ${d}`)),await rt(ta),m=$o(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),ce=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),op=r(async()=>{let t=tp(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=Xe(`solana address -k ${n}`).toString().trim(),a=await Qe.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:ep}]),i=a.from==="Validator Account"?Object.values(Ze).filter(p=>p!=="Validator Account"):Object.values(Ze).filter(p=>p!=="Authority Account");if((await Qe.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:p}=await Qe.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:ce}]);s=p}else{let p=a.from==="Validator Account"?e:o;n=`${t}/${p}`,s=Xe(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=Xe(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import oa from"chalk";import rp from"inquirer";import{execSync as Ko,spawnSync as np}from"node:child_process";var ra=r(async(t,e=!1)=>{let o=t.NETWORK===u.TESTNET,n=o?Ae: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=Ko(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(oa.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(oa.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let T=await rp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(T.sol)}let d=Ko(`solana address --keypair ${i}`).toString().trim(),p=Ko(`solana address --keypair ${a}`).toString().trim(),f=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${p} ${l} --authorized-withdrawer ${a} --url ${n}`;np(f,{shell:!0,stdio:"inherit"})},"withdraw");var na=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 ra(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as yp,spawnSync as Tp}from"node:child_process";import{BN as aa}from"bn.js";import{LAMPORTS_PER_SOL as bo}from"@solana/web3.js";import{Connection as cp,LAMPORTS_PER_SOL as lp}from"@solana/web3.js";import{Keypair as sp}from"@solana/web3.js";import{readFile as ap}from"fs/promises";var ip=r(async t=>{let e=JSON.parse(await ap(t,"utf8"));return sp.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),sa=ip;import{homedir as mp}from"os";var Y;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(Y||(Y={}));var pp={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},dp=r(async(t,e="auth",o=!1)=>{let n=new cp(t),s=mp(),a=N(s),c=`${o?"testnet":"mainnet"}${pp[e]}`,l=a[c],m=await sa(l),d=await n.getBalance(m.publicKey),f=Number(d)/lp;if(isNaN(f))throw new Error("Failed to get balance");return f},"getBalance"),st=dp;var up=new aa(3*bo),ia=r(async t=>{let e=await st(t,Y.VALIDATOR),n=new aa(Number(Number(e)*bo)).sub(up),s=Number(n)/bo;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import le from"chalk";import{Keypair as fp,Connection as hp,PublicKey as Sp,SystemProgram as ca,ComputeBudgetProgram as to,VersionedTransaction as la,TransactionMessage as ma}from"@solana/web3.js";var pa=r(async(t,e,o,n)=>{let s=0;try{let a=new hp(t,"finalized"),i=fp.fromSecretKey(new Uint8Array(Array.from(e))),c=new Sp(o),l=n;for(;;)try{let m=[ca.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),to.setComputeUnitLimit({units:2e5}),to.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),p=new la(new ma({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),f=await a.simulateTransaction(p,{replaceRecentBlockhash:!0,sigVerify:!1});p.sign([i]);let T=[ca.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),to.setComputeUnitLimit({units:f.value.unitsConsumed?Math.trunc(f.value.unitsConsumed*1.2):2e5}),to.setComputeUnitPrice({microLamports:1e3})],A=new la(new ma({instructions:T,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>fe)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await rt(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as Ep}from"fs/promises";import{LAMPORTS_PER_SOL as gp}from"@solana/web3.js";var Uo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=N();await st(t,Y.VOTE)<1?(console.log(le.white("Vote Account Balance is less than 1 SOL")),console.log(le.white("Skip withdrawing SOL from Vote Account to Authority Account"))):Tp("solv withdraw --all",{shell:!0,stdio:"inherit"});let s=await ia(t);console.log(le.white(`Transferable Balance: ${s} SOL`));let a=s*gp;if(s<1)console.log(le.white("Validator Account Balance is less than 1 SOL")),console.log(le.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=yp(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await Ep(o,"utf-8"));await pa(t,c,i,a)}return!0},"collectSOL");import{readFile as Ip}from"fs/promises";import Lp from"inquirer";import Mo from"chalk";import{execSync as Ap}from"child_process";import{homedir as wp}from"os";var _p=r(async t=>{try{let e=wp(),{mainnetValidatorAuthorityKey:o}=N(e),n=`spl-token balance ${tt} --owner ${o} --url ${t}`,s=Ap(n).toString().trim();return Number(s)}catch(e){return console.log(Mo.red(`Error: ${e}`)),console.log(Mo.yellow(`You might need to install the Solana SPL CLI:
509
+ `)),console.log(Mo.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),da=_p;import ro from"chalk";import{Connection as Np,PublicKey as ua,Keypair as Op,ComputeBudgetProgram as eo,VersionedTransaction as fa,TransactionMessage as ha}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Sa,createTransferInstruction as ya,TOKEN_PROGRAM_ID as Ta}from"@solana/spl-token";var Ea=r(async(t,e,o,n,s,a)=>{try{let i=new Np(t,"finalized"),c=Op.fromSecretKey(new Uint8Array(e)),l=new ua(o),m=new ua(s),d=Math.trunc(n*Math.pow(10,a)),p=await Sa(i,c,m,c.publicKey),f=await Sa(i,c,m,l,!0);for(;;)try{let T=[ya(p.address,f.address,c.publicKey,d,[],Ta),eo.setComputeUnitLimit({units:2e5}),eo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],A=await i.getLatestBlockhashAndContext({commitment:"finalized"}),S=new fa(new ha({instructions:T,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message()),y=await i.simulateTransaction(S,{replaceRecentBlockhash:!0,sigVerify:!1});S.sign([c]);let M=[ya(p.address,f.address,c.publicKey,d,[],Ta),eo.setComputeUnitLimit({units:y.value.unitsConsumed?Math.trunc(y.value.unitsConsumed*1.2):2e5}),eo.setComputeUnitPrice({microLamports:1e3})],P=new fa(new ha({instructions:M,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message());P.sign([c]);let z=await i.sendRawTransaction(P.serialize());return await i.confirmTransaction({...A.value,signature:z},"finalized"),console.log("finalized signature:",z),z}catch(T){console.error("Transfer failed, retrying...",T)}}catch(i){throw console.error(i),i}},"transferSPLToken");import oo from"inquirer";import{spawnSync as ga}from"child_process";import Ho from"chalk";import{promises as Aa}from"fs";var vp=r(async(t="epochTimer")=>{try{let e=ga("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Ho.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
510
510
  `).filter(a=>!a.includes(t)).join(`
511
- `),s="/tmp/temp_crontab";await Ta.writeFile(s,n,"utf-8"),ya("crontab",[s]),await Ta.unlink(s),console.log(Mo.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Mo.red("Error removing cron job:",e))}},"removeCronJob"),Ea=vp;import ga from"chalk";var kp=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await oo.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 He()&&await Ea(),await v({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
512
- ${ga.green("No more Login to the server to update \u{1F331}")}
511
+ `),s="/tmp/temp_crontab";await Aa.writeFile(s,n,"utf-8"),ga("crontab",[s]),await Aa.unlink(s),console.log(Ho.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Ho.red("Error removing cron job:",e))}},"removeCronJob"),wa=vp;import _a from"chalk";var kp=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await oo.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 He()&&await wa(),await v({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
512
+ ${_a.green("No more Login to the server to update \u{1F331}")}
513
513
 
514
514
  If you enable this, solv will update automatically when the solv/solana version is updated.
515
515
 
@@ -517,45 +517,45 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
517
517
 
518
518
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
519
519
  \u203B Please turn off if you are using no-downtime migration.
520
- `;console.log(ga.white(n));let s=await oo.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=t.HARVEST_ACCOUNT===""?"Enter your Harvest Address":t.HARVEST_ACCOUNT,c=await oo.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await oo.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL},{type:"input",name:"harvestAddress",message:"Enter your Harvest Address",default:i,validate:ce}]);i=l.harvestAddress,a=l.rpcUrl}return await v({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"),Aa=kp;import{spawnSync as xp}from"node:child_process";import{Connection as Pp}from"@solana/web3.js";import{Connection as Rp}from"@solana/web3.js";var Cp=r(async(t,e=10,o=.4)=>{try{let s=await new Rp(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"),wa=Cp;var Ho=r(async t=>{try{let o=await new Pp(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await wa(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),p=`${c}d ${l}h ${m}m ${d}s`;return c===0&&(p=`${l}h ${m}m ${d}s`),{...o,estimatedTimeUntilNextEpoch:p,displayRatio:i}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var Vp=.03,_a=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await $p(t),{mainnetValidatorAuthorityKey:o}=N();console.log("Harvesting SOL..."),await bo(t.RPC_URL);let n=await st(t.RPC_URL,Y.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await rt(1e3),await bo(t.RPC_URL),n=await st(t.RPC_URL,Y.VOTE),s++;let a=JSON.parse(await Ip(o,"utf-8")),i=await st(t.RPC_URL,Y.AUTH);if(i<1)console.log(ro.white("Authority Account Balance is less than 1 SOL")),console.log(ro.white("Skip converting SOL to elSOL"));else{let l=i-Vp;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await Ge(t.RPC_URL,J,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await la(t.RPC_URL);if(c<1){let l=await Ho(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 V(m),process.exit(0)}if(console.log(`Transferring ${c} elSOL to Harvest Address`),await Sa(t.RPC_URL,a,e,c,tt,Sr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Ho(t.RPC_URL)).epoch} \u{1F4B0}
520
+ `;console.log(_a.white(n));let s=await oo.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=t.HARVEST_ACCOUNT===""?"Enter your Harvest Address":t.HARVEST_ACCOUNT,c=await oo.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await oo.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL},{type:"input",name:"harvestAddress",message:"Enter your Harvest Address",default:i,validate:ce}]);i=l.harvestAddress,a=l.rpcUrl}return await v({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"),Na=kp;import{spawnSync as xp}from"node:child_process";import{Connection as Pp}from"@solana/web3.js";import{Connection as Rp}from"@solana/web3.js";var Cp=r(async(t,e=10,o=.4)=>{try{let s=await new Rp(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"),Oa=Cp;var Fo=r(async t=>{try{let o=await new Pp(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await Oa(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),p=`${c}d ${l}h ${m}m ${d}s`;return c===0&&(p=`${l}h ${m}m ${d}s`),{...o,estimatedTimeUntilNextEpoch:p,displayRatio:i}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var Vp=.03,va=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await $p(t),{mainnetValidatorAuthorityKey:o}=N();console.log("Harvesting SOL..."),await Uo(t.RPC_URL);let n=await st(t.RPC_URL,Y.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await rt(1e3),await Uo(t.RPC_URL),n=await st(t.RPC_URL,Y.VOTE),s++;let a=JSON.parse(await Ip(o,"utf-8")),i=await st(t.RPC_URL,Y.AUTH);if(i<1)console.log(ro.white("Authority Account Balance is less than 1 SOL")),console.log(ro.white("Skip converting SOL to elSOL"));else{let l=i-Vp;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await Ge(t.RPC_URL,J,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await da(t.RPC_URL);if(c<1){let l=await Fo(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 V(m),process.exit(0)}if(console.log(`Transferring ${c} elSOL to Harvest Address`),await Ea(t.RPC_URL,a,e,c,tt,Tr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Fo(t.RPC_URL)).epoch} \u{1F4B0}
521
521
  Validator Address: ${_(o)}
522
522
  Total Reward: ${c} elSOL
523
- Harvest Address: ${e}`;await V(m)}console.log(ro.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Aa(t)&&(xp("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(ro.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),$p=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await Lp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:ce}]);return await v({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as rd}from"@skeet-framework/utils";import{writeFile as Dp}from"fs/promises";var Kp=r(async t=>{await Dp(ge,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),ht=Kp;var bp=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=n?_(a):_(s),c=`===\u23F3 ${t.epoch} \u23F3===
523
+ Harvest Address: ${e}`;await V(m)}console.log(ro.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Na(t)&&(xp("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(ro.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),$p=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await Lp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:ce}]);return await v({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as rd}from"@skeet-framework/utils";import{writeFile as Dp}from"fs/promises";var Kp=r(async t=>{await Dp(ge,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),ht=Kp;var bp=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=n?_(a):_(s),c=`===\u23F3 ${t.epoch} \u23F3===
524
524
  Validator: ${i}
525
525
  Network: ${o.NETWORK}
526
526
  CurrentEpoch: ${t.epoch}
527
527
  Next epoch is coming in less than ${e}!
528
528
  Epoch Completed: ${t.epochCompletedPercent}%
529
- Until Next Epoch: ${t.epochRemainingTime}`;await V(c)},"alertMessage"),Kt=bp;var Up=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await ht({...e,isLessThan1Day:!0}),await Kt(o,"1 Day",n))},"isLessThan1Day"),Na=Up;var Mp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await ht({...e,isLessThan8Hours:!0}),await Kt(o,"8 Hours",n))},"lessThan8Hour"),Oa=Mp;import{spawnSync as Fp}from"child_process";import Yp from"chalk";var Hp=r(async(t,e)=>{let o=Math.floor(Math.random()*(e-t+1)+t);return await new Promise(n=>setTimeout(n,o*1e3)),o},"randomSleep"),va=Hp;var jp=r(async(t,e,o,n)=>{let s=n.IS_MEV_MODE,a=n.NETWORK===u.MAINNET;if(t<60&&!e.isLessThan1Hour){if(await ht({...e,isLessThan1Hour:!0}),await Kt(o,"1 Hour",n),s&&a){let i=await va(1,100);console.log(Yp.white(`\u23F3 Waiting for ${i} seconds before running solv harvest...`)),Fp("solv",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),ka=jp;var Bp=r(async(t,e)=>{let o=e.NETWORK===u.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?_(a):_(s);await ht(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
529
+ Until Next Epoch: ${t.epochRemainingTime}`;await V(c)},"alertMessage"),Kt=bp;var Up=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await ht({...e,isLessThan1Day:!0}),await Kt(o,"1 Day",n))},"isLessThan1Day"),ka=Up;var Mp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await ht({...e,isLessThan8Hours:!0}),await Kt(o,"8 Hours",n))},"lessThan8Hour"),Ra=Mp;import{spawnSync as Fp}from"child_process";import Yp from"chalk";var Hp=r(async(t,e)=>{let o=Math.floor(Math.random()*(e-t+1)+t);return await new Promise(n=>setTimeout(n,o*1e3)),o},"randomSleep"),Ca=Hp;var jp=r(async(t,e,o,n)=>{let s=n.IS_MEV_MODE,a=n.NETWORK===u.MAINNET;if(t<60&&!e.isLessThan1Hour){if(await ht({...e,isLessThan1Hour:!0}),await Kt(o,"1 Hour",n),s&&a){let i=await Ca(1,100);console.log(Yp.white(`\u23F3 Waiting for ${i} seconds before running solv harvest...`)),Fp("solv",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),Pa=jp;var Bp=r(async(t,e)=>{let o=e.NETWORK===u.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?_(a):_(s);await ht(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
530
530
  Validator: ${i}
531
531
  Network: ${e.NETWORK}
532
532
  CurrentEpoch: ${t.epoch}
533
533
  Epoch has been updated!
534
- Until Next Epoch: Approximately 2 days`;return await V(c),"Epoch has been updated!"},"newEpoch"),Ra=Bp;import{existsAsync as Jp}from"@skeet-framework/utils";import{readFile as Gp,writeFile as Wp}from"fs/promises";import zp from"chalk";import{homedir as qp}from"os";var Qp=r(async()=>{let e=qp().includes("/home/solv")?ge:"./currentEpoch.json";if(await Jp(e))return JSON.parse(await Gp(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await Wp(e,JSON.stringify(o,null,2),"utf-8"),console.log(zp.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),Ca=Qp;import Xp from"chalk";var Zp=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===u.TESTNET;if(o&&(e=Qo),await st(e,Y.VALIDATOR,o)<So){let{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?_(a):_(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${So} SOL
534
+ Until Next Epoch: Approximately 2 days`;return await V(c),"Epoch has been updated!"},"newEpoch"),Ia=Bp;import{existsAsync as Jp}from"@skeet-framework/utils";import{readFile as Gp,writeFile as zp}from"fs/promises";import Wp from"chalk";import{homedir as qp}from"os";var Qp=r(async()=>{let e=qp().includes("/home/solv")?ge:"./currentEpoch.json";if(await Jp(e))return JSON.parse(await Gp(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(Wp.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),La=Qp;import Xp from"chalk";var Zp=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===u.TESTNET;if(o&&(e=Xo),await st(e,Y.VALIDATOR,o)<So){let{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?_(a):_(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${So} SOL
535
535
  Please top up your Validator Account
536
- Address: ${i}`;return await V(c),!1}return console.log(Xp.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Pa=Zp;async function td(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(td,"getNpmLatestVersion");var Ia=td;async function ed(){let t=Pt(),e=await Ia();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(ed,"isVersionSame");var La=ed;import{spawnSync as nd}from"child_process";import{spawnSync as od}from"node:child_process";var xa=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=od(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
537
- `),a=s.find(f=>f.includes("Epoch Completed Time:")),i=s.find(f=>f.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(f=>f.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*)?/,p=m.match(d);if(p){let f=p[1]?parseInt(p[1]):0,T=p[2]?parseInt(p[2]):0,A=p[3]?parseInt(p[3]):0,S=p[4]?parseInt(p[4]):0,y=f*24*60+T*60+A+Math.floor(S/60);return{epoch:c,day:f,hour:T,min:A,sec:S,totalMinutes:y,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var sd=r(async t=>{let e=t.NETWORK===u.TESTNET,o=e?Ae:t.RPC_URL,n=rd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await Ca(),a=xa(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=N(),m=await Wt(o,_(e?c:i));if(m.isActive||await V(`\u26A0\uFE0F Validator is not active!
536
+ Address: ${i}`;return await V(c),!1}return console.log(Xp.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),xa=Zp;async function td(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(td,"getNpmLatestVersion");var Va=td;async function ed(){let t=Pt(),e=await Va();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(ed,"isVersionSame");var $a=ed;import{spawnSync as nd}from"child_process";import{spawnSync as od}from"node:child_process";var Da=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=od(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
537
+ `),a=s.find(f=>f.includes("Epoch Completed Time:")),i=s.find(f=>f.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(f=>f.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*)?/,p=m.match(d);if(p){let f=p[1]?parseInt(p[1]):0,T=p[2]?parseInt(p[2]):0,A=p[3]?parseInt(p[3]):0,S=p[4]?parseInt(p[4]):0,y=f*24*60+T*60+A+Math.floor(S/60);return{epoch:c,day:f,hour:T,min:A,sec:S,totalMinutes:y,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var sd=r(async t=>{let e=t.NETWORK===u.TESTNET,o=e?Ae:t.RPC_URL,n=rd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await La(),a=Da(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=N(),m=await zt(o,_(e?c:i));if(m.isActive||await V(`\u26A0\uFE0F Validator is not active!
538
538
  VoteAccount: ${m.pubkey}
539
539
  Reason: ${m.reason}
540
540
  Network: ${t.NETWORK}
541
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await Pa(t),!await La()&&t.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),nd("solv update && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Ra(a,t),"Epoch has been updated!";let p=a.totalMinutes,f=[ka,Oa,Na];for(let T of f)if(await T(p,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),Va=sd;var $a=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await Va(t),process.exit(0)})},"epochTimerCommands");import qa from"inquirer";import{join as Ma}from"path";import{spawnSync as Ut}from"node:child_process";import j from"chalk";import{spawnSync as ad}from"node:child_process";var id=r((t,e,o,n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=ad(`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.
541
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await xa(t),!await $a()&&t.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),nd("solv update && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Ia(a,t),"Epoch has been updated!";let p=a.totalMinutes,f=[Pa,Ra,ka];for(let T of f)if(await T(p,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),Ka=sd;var ba=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await Ka(t),process.exit(0)})},"epochTimerCommands");import Za from"inquirer";import{join as Ya}from"path";import{spawnSync as Ut}from"node:child_process";import j from"chalk";import{spawnSync as ad}from"node:child_process";var id=r((t,e,o,n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=ad(`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.
542
542
  $ ssh solv@${t}
543
543
 
544
- 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"),Da=id;import Ka from"chalk";var cd=r((t,e,o)=>{console.log(Ka.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let n=_(t).trim(),s=Da(e,`solana-keygen pubkey ${t}`,o).stdout.toString().trim();return n!==s?(console.log(Ka.yellow(`\u26A0\uFE0F Destination Identity Key is different.
544
+ 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"),Ua=id;import Ma from"chalk";var cd=r((t,e,o)=>{console.log(Ma.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let n=_(t).trim(),s=Ua(e,`solana-keygen pubkey ${t}`,o).stdout.toString().trim();return n!==s?(console.log(Ma.yellow(`\u26A0\uFE0F Destination Identity Key is different.
545
545
  Please check your Validator
546
546
  $ ssh ${o}@${e}
547
547
 
548
548
  Local Identity Key: ${n}
549
- Destination Identity Key: ${s}`)),!1):!0},"checkValidatorKey"),bt=cd;var ld="agave-validator -l /mnt/ledger",md="sudo fdctl --config /home/solv/firedancer/config.toml",pd=r(t=>t==="agave"?ld:md,"getSolanaCLIActive"),no=pd;var ba="agave-validator -l /mnt/ledger",dd=r(()=>{try{return ba}catch(t){return console.error(t),ba}},"getSolanaCLIAgave"),so=dd;var ao=Ma(C,yt),Ua=Ma(C,St),Ha=r(async(t,e,o,n,s)=>{let a=o.NETWORK===u.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?I:D;i&&(c=I);let l=no(s),m=so();if(!bt(c,t,n))return;console.log(j.white("\u{1F7E2} Waiting for restart window..."));let p=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${m} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ut(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
549
+ Destination Identity Key: ${s}`)),!1):!0},"checkValidatorKey"),bt=cd;var ld="agave-validator -l /mnt/ledger",md="sudo fdctl --config /home/solv/firedancer/config.toml",pd=r(t=>t==="agave"?ld:md,"getSolanaCLIActive"),no=pd;var Ha="agave-validator -l /mnt/ledger",dd=r(()=>{try{return Ha}catch(t){return console.error(t),Ha}},"getSolanaCLIAgave"),so=dd;var ao=Ya(C,yt),Fa=Ya(C,St),ja=r(async(t,e,o,n,s)=>{let a=o.NETWORK===u.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?I:K;i&&(c=I);let l=no(s),m=so();if(!bt(c,t,n))return;console.log(j.white("\u{1F7E2} Waiting for restart window..."));let p=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${m} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ut(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
550
550
  $ ssh ${n}@${t}
551
551
 
552
552
  Failed Cmd: ${m} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(j.white("\u{1F7E2} Setting identity on the new validator..."));let T=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${l} set-identity ${ao}'`;if(Ut(T,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
553
553
  $ ssh ${n}@${t}
554
554
 
555
- Failed Cmd: ${l} set-identity ${ao}`));return}if(console.log(j.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ut(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${ao} ${Ua}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
555
+ Failed Cmd: ${l} set-identity ${ao}`));return}if(console.log(j.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ut(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${ao} ${Fa}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
556
556
  $ ssh ${n}@${t}
557
557
 
558
- Failed Cmd: ln -sf ${ao} ${Ua}`));return}if(console.log(j.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ut(`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
558
+ Failed Cmd: ln -sf ${ao} ${Fa}`));return}if(console.log(j.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ut(`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
559
559
  $ ssh ${n}@${t}
560
560
 
561
561
  Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(j.white("\u{1F7E2} Setting identity on the new validator...")),Ut(`${l} set-identity --require-tower ${c}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
@@ -563,7 +563,7 @@ Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(
563
563
  Failed Cmd: ${l} set-identity ${c}
564
564
  ln -sf ${c} ${k}`));return}if(Ut(`ln -sf ${c} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
565
565
 
566
- Failed Cmd: ln -sf ${c} ${k}`));return}console.log(j.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as ja}from"path";import F from"chalk";import{spawnSync as Mt}from"node:child_process";var Fa=ja(C,yt),ud=ja(C,St),Ya="~/.ssh/id_rsa",Ba=r(async(t,e,o,n,s)=>{let a=o.NETWORK===u.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?I:D;i&&(c=I);let l=no(s),m=so();if(!bt(c,t,n))return;let p=`${m} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,f=`${l} set-identity ${Fa}`,T=`ln -sf ${Fa} ${ud}`,A=`scp ${w}/tower-1_9-${e}.bin ${n}@${t}:${w}`,S=`${l} set-identity --require-tower ${c}`,y=`ln -sf ${c} ${k}`;if(console.log(F.white("\u{1F7E2} Waiting for restart window...")),Mt(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
566
+ Failed Cmd: ln -sf ${c} ${k}`));return}console.log(j.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as Ga}from"path";import F from"chalk";import{spawnSync as Mt}from"node:child_process";var Ba=Ga(C,yt),ud=Ga(C,St),Ja="~/.ssh/id_rsa",za=r(async(t,e,o,n,s)=>{let a=o.NETWORK===u.TESTNET,i=o.NODE_TYPE===E.RPC,c=a?I:K;i&&(c=I);let l=no(s),m=so();if(!bt(c,t,n))return;let p=`${m} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,f=`${l} set-identity ${Ba}`,T=`ln -sf ${Ba} ${ud}`,A=`scp ${w}/tower-1_9-${e}.bin ${n}@${t}:${w}`,S=`${l} set-identity --require-tower ${c}`,y=`ln -sf ${c} ${k}`;if(console.log(F.white("\u{1F7E2} Waiting for restart window...")),Mt(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
567
567
 
568
568
  Failed Cmd: ${p}`));return}if(console.log(F.white("\u{1F7E2} Setting identity on the new validator...")),Mt(f,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
569
569
 
@@ -571,21 +571,21 @@ Failed Cmd: ${f}`));return}if(console.log(F.white("\u{1F7E2} Changing the Symlin
571
571
 
572
572
  Failed Cmd: ${T}`));return}if(console.log(F.white("\u{1F7E2} Uploading the tower file to the new validator...")),Mt(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
573
573
 
574
- Failed Cmd: ${A}`));return}console.log(F.white("\u{1F7E2} Setting identity on the new validator..."));let Yt=`ssh -i ${Ya} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${S}'`;Mt(Yt,{shell:!0,stdio:"inherit"}).status!==0&&console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
574
+ Failed Cmd: ${A}`));return}console.log(F.white("\u{1F7E2} Setting identity on the new validator..."));let Yt=`ssh -i ${Ja} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${S}'`;Mt(Yt,{shell:!0,stdio:"inherit"}).status!==0&&console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
575
575
  $ ssh ${n}@${t}
576
576
 
577
- Failed Cmd: ${S}`)),console.log(F.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let lo=`ssh -i ${Ya} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${y}'`;if(Mt(lo,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
577
+ Failed Cmd: ${S}`)),console.log(F.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let lo=`ssh -i ${Ja} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${y}'`;if(Mt(lo,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
578
578
 
579
- Failed Cmd: ${y}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as fd}from"node:child_process";function Ja(t,e){let o=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return fd(o,{shell:!0,stdio:"inherit"}).status===0}r(Ja,"checkSSHConnection");import me from"chalk";import{join as Wa}from"path";import{spawnSync as Ht}from"node:child_process";import B from"chalk";var io=Wa(C,yt),Ga=Wa(C,St),za=r(async(t,e,o,n)=>{let s=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===E.RPC,i=s?I:D;if(a&&(i=I),!bt(i,t,n))return;let l=Wo,m=zo;console.log(B.white("\u{1F7E2} Waiting for restart window..."));let d=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${l} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ht(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
579
+ Failed Cmd: ${y}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as fd}from"node:child_process";function Wa(t,e){let o=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return fd(o,{shell:!0,stdio:"inherit"}).status===0}r(Wa,"checkSSHConnection");import me from"chalk";import{join as Qa}from"path";import{spawnSync as Ht}from"node:child_process";import B from"chalk";var io=Qa(C,yt),qa=Qa(C,St),Xa=r(async(t,e,o,n)=>{let s=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===E.RPC,i=s?I:K;if(a&&(i=I),!bt(i,t,n))return;let l=Wo,m=qo;console.log(B.white("\u{1F7E2} Waiting for restart window..."));let d=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${l} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ht(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
580
580
  $ ssh ${n}@${t}
581
581
 
582
582
  Failed Cmd: ${l} -l ${w} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(B.white("\u{1F7E2} Setting identity on the new validator..."));let f=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${l} -l ${w} set-identity ${io}'`;if(Ht(f,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
583
583
  $ ssh ${n}@${t}
584
584
 
585
- Failed Cmd: ${l} -l ${w} set-identity ${io}`));return}if(console.log(B.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ht(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${io} ${Ga}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
585
+ Failed Cmd: ${l} -l ${w} set-identity ${io}`));return}if(console.log(B.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ht(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${io} ${qa}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
586
586
  $ ssh ${n}@${t}
587
587
 
588
- Failed Cmd: ln -sf ${io} ${Ga}`));return}if(console.log(B.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ht(`scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
588
+ Failed Cmd: ln -sf ${io} ${qa}`));return}if(console.log(B.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ht(`scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
589
589
  $ ssh ${n}@${t}
590
590
 
591
591
  Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(B.white("\u{1F7E2} Setting identity on the new validator...")),Ht(`${m} -l ${w} set-identity --require-tower ${i}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
@@ -593,15 +593,15 @@ Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(
593
593
  Failed Cmd: ${m} -l ${w} set-identity ${i}
594
594
  ln -sf ${i} ${k}`));return}if(Ht(`ln -sf ${i} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
595
595
 
596
- Failed Cmd: ln -sf ${i} ${k}`));return}console.log(B.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var hd=["Incoming","Outgoing"],Qa=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("--client <client>","Client Type","agave").description("Switch Validator Identity with No Downtime").action(async o=>{try{let n=e.NETWORK===u.TESTNET,s=e.NODE_TYPE===E.RPC,a=n?I:D;s&&(a=I);let i=o.user,c=_(a),l=o.switchType,m=o.ip,d=o.client;if(l===""||m===""||i===""){let f=await qa.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"]},{name:"client",type:"list",message:"Which client are you using on both machines?",choices:["agave","frankendancer"]}]);l=f.switchType,m=f.ip,i=f.user,d=f.client}if(!hd.includes(l)){console.log(me.yellow(`\u26A0\uFE0F Invalid Switch Type
597
- You can choose only Incoming or Outgoing`));return}if(!Ja(m,i)){console.log("SSH Connection Failed");return}if(l==="Incoming"){if(o.v2MigrateIncoming){(await qa.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(me.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(me.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await za(m,c,e,i);return}await Ha(m,c,e,i,d)}else await Ba(m,c,e,i,d);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(me.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(me.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as Sd}from"node:child_process";var yd=r((t="306450862",e=w,o=Q)=>{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=Sd(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"),Xa=yd;import Ft from"inquirer";import vd from"dotenv";import Ot from"chalk";var co={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:uo,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}},Fo={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:he,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Se,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:uo,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 gd}from"fs/promises";import{Connection as Ad,Keypair as wd,VersionedTransaction as _d}from"@solana/web3.js";import b from"chalk";import Nd from"inquirer";import Od from"dotenv";var Td=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"),Za=Td;var Ed=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=rr[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"),ti=Ed;Od.config();var ei=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new Ad(t,"confirmed"),m=await Za(e,o,s,a,i);if(typeof m=="string"){m.includes("Unauthorized")&&(console.error(b.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
598
- `)),console.log(b.white("Get Your API key \u{1F447}")),console.log(b.white(jt+`
599
- `)),process.exit(0));let kt=`${b.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
596
+ Failed Cmd: ln -sf ${i} ${k}`));return}console.log(B.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var hd=["Incoming","Outgoing"],ti=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("--client <client>","Client Type","agave").description("Switch Validator Identity with No Downtime").action(async o=>{try{let n=e.NETWORK===u.TESTNET,s=e.NODE_TYPE===E.RPC,a=n?I:K;s&&(a=I);let i=o.user,c=_(a),l=o.switchType,m=o.ip,d=o.client;if(l===""||m===""||i===""){let f=await Za.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"]},{name:"client",type:"list",message:"Which client are you using on both machines?",choices:["agave","frankendancer"]}]);l=f.switchType,m=f.ip,i=f.user,d=f.client}if(!hd.includes(l)){console.log(me.yellow(`\u26A0\uFE0F Invalid Switch Type
597
+ You can choose only Incoming or Outgoing`));return}if(!Wa(m,i)){console.log("SSH Connection Failed");return}if(l==="Incoming"){if(o.v2MigrateIncoming){(await Za.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(me.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(me.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await Xa(m,c,e,i);return}await ja(m,c,e,i,d)}else await za(m,c,e,i,d);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(me.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(me.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as Sd}from"node:child_process";var yd=r((t="306450862",e=w,o=Q)=>{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=Sd(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"),ei=yd;import Ft from"inquirer";import vd from"dotenv";import Ot from"chalk";var co={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:uo,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}},Yo={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:he,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Se,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:uo,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 gd}from"fs/promises";import{Connection as Ad,Keypair as wd,VersionedTransaction as _d}from"@solana/web3.js";import U from"chalk";import Nd from"inquirer";import Od from"dotenv";var Td=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"),oi=Td;var Ed=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=nr[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"),ri=Ed;Od.config();var ni=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new Ad(t,"confirmed"),m=await oi(e,o,s,a,i);if(typeof m=="string"){m.includes("Unauthorized")&&(console.error(U.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
598
+ `)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(jt+`
599
+ `)),process.exit(0));let kt=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
600
600
 
601
601
  You can upgrade your API key to increase your rate limits.
602
602
  Get Your API key \u{1F447}
603
603
  Validators Solutions: ${jt}
604
- `;console.error(b.white(kt)),process.exit(0)}let d=Fo[s],p=Fo[a],f=`\u{1F504} Swap Quote \u{1F504}
604
+ `;console.error(U.white(kt)),process.exit(0)}let d=Yo[s],p=Yo[a],f=`\u{1F504} Swap Quote \u{1F504}
605
605
 
606
606
  - \u{1F3E6} Input Token: ${d.symbol} (${s})
607
607
  - \u{1F4B0} Input Amount: ${i/Math.pow(10,d.decimal)} ${d.symbol}
@@ -610,16 +610,16 @@ Validators Solutions: ${jt}
610
610
  - \u{1F4B0} Output Amount: ${Number(m?.outAmount)/Math.pow(10,p.decimal)} ${p.symbol}
611
611
 
612
612
  \u203B This quote is based on the current market rate and may change before the swap is completed.
613
- `;console.log(b.white(f)),console.log(b.gray(`You can also swap using the following command:
613
+ `;console.log(U.white(f)),console.log(U.gray(`You can also swap using the following command:
614
614
  $ solv swap --input ${s} --output ${a} --amount ${i} --skip-confirm
615
- `));let T=!1;c?T=(await Nd.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(b.cyan("Skipping confirmation...")),T=!0),T||(console.log(b.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let A=JSON.parse(await gd(n,"utf8")),S=wd.fromSecretKey(new Uint8Array(Array.from(A))),y=await ti(e,o,m,S.publicKey.toString());if(typeof y=="string"){y.includes("Unauthorized")&&(console.error(b.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
616
- `)),console.log(b.white("Get Your API key \u{1F447}")),console.log(b.white(jt+`
617
- `)),process.exit(0));let kt=`${b.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
615
+ `));let T=!1;c?T=(await Nd.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(U.cyan("Skipping confirmation...")),T=!0),T||(console.log(U.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let A=JSON.parse(await gd(n,"utf8")),S=wd.fromSecretKey(new Uint8Array(Array.from(A))),y=await ri(e,o,m,S.publicKey.toString());if(typeof y=="string"){y.includes("Unauthorized")&&(console.error(U.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
616
+ `)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(jt+`
617
+ `)),process.exit(0));let kt=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
618
618
 
619
619
  You can upgrade your API key to increase your rate limits.
620
620
  Get Your API key \u{1F447}
621
621
  Validators Solutions: ${jt}
622
- `;console.error(b.white(kt)),process.exit(0)}let U=Buffer.from(y.swapTransaction,"base64"),P=_d.deserialize(U);P.sign([S]);let W=P.serialize(),vt=await l.sendRawTransaction(W,{skipPreflight:!0,maxRetries:2}),Yt=P.message.recentBlockhash;return console.log(`Swapping...
623
- Transaction ID: ${vt}`),await l.confirmTransaction({blockhash:Yt,lastValidBlockHeight:y.lastValidBlockHeight,signature:vt},"confirmed"),vt},"swap");vd.config();var oi=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 kd(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(Ot.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ot.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),kd=r(async(t,e,o,n="",s="",a=0,i=!0,c=!1)=>{console.log(Ot.white("Solana RPC URL:",t)),console.log(Ot.white("KeyfilePath:",e)),(!e||e===""||c)&&await Rd();let l=tr,m=[...er,"Other"],d=n,p="",f=s,T=a;if(d===""){let y=await Ft.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:he}]);y.name==="Other"?d=(await Ft.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Se}])).address:(p=y.name,d=co[p].tokenMint)}if(f===""){m=m.filter(P=>P!==p);let y=await Ft.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(y.name==="Other")f=(await Ft.prompt([{type:"input",name:"address",message:"Enter output mint address",default:tt}])).address;else{let P=y.name;f=co[P].tokenMint}let U=y.name;f=co[U].tokenMint}if(T===0){let y=await Ft.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);T=Number(y.amount)}let S=await ei(t,l,!o||o===""?or:o,e,d,f,T,i);S||process.exit(0),console.log(Ot.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(Ot.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${S}`))},"swapCmd");var Rd=r(async()=>{let t=await Ft.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 v(t),console.log(Ot.green(`\u2714\uFE0E Config Updated Successfully!
624
- `)),wt()},"askForConfig");import{spawnSync as Cd}from"node:child_process";var ri=r(()=>{Cd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as Pd}from"node:child_process";var ni=r(()=>{Pd("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Id}from"node:child_process";var si=r(()=>{Id("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as Ld}from"node:child_process";var ai=r(()=>{Ld("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as xd}from"node:child_process";var ii=r((t=!1)=>{xd(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Vd}from"node:child_process";var ci=r(()=>{Vd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var li=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{ri()}),t.command("start").description("Start Jupiter").action(()=>{ni()}),t.command("stop").description("Stop Jupiter").action(()=>{si()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{ii(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{ai()}),t.command("enable").description("Enable Jupiter").action(()=>{ci()})},"jupiterCommands");import Dd from"chalk";var h=new $d;h.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(pe,"-V","Display version");async function Kd(){try{let t=await x();zn(t),Zn(t),Qn(t),fs(t),Jr(t),Wr(),ts(t),Ls(t),Ds(t),us(),rs(),Jn(t),Js(t),es(),Ys(),Xs(t),ea(t),_a(t),Wn(),oi(h,t),$a(t),Qa(h,t),li(),h.command("rm:log").description("Remove Logs").action(()=>{Gs()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{Ws(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(Dd.white("\u{1F4DD} Creating Snapshot...")),Xa(e.slot,e.ledger,e.snapshots)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{zs(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{qs()}),h.command("config").description("Show Solv Config").action(()=>{qe(t)}),h.command("vv").description("Show Solv Version").action(()=>{let e=_e();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(Kd,"main");Kd();export{h as program};
622
+ `;console.error(U.white(kt)),process.exit(0)}let M=Buffer.from(y.swapTransaction,"base64"),P=_d.deserialize(M);P.sign([S]);let z=P.serialize(),vt=await l.sendRawTransaction(z,{skipPreflight:!0,maxRetries:2}),Yt=P.message.recentBlockhash;return console.log(`Swapping...
623
+ Transaction ID: ${vt}`),await l.confirmTransaction({blockhash:Yt,lastValidBlockHeight:y.lastValidBlockHeight,signature:vt},"confirmed"),vt},"swap");vd.config();var si=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 kd(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(Ot.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ot.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),kd=r(async(t,e,o,n="",s="",a=0,i=!0,c=!1)=>{console.log(Ot.white("Solana RPC URL:",t)),console.log(Ot.white("KeyfilePath:",e)),(!e||e===""||c)&&await Rd();let l=er,m=[...or,"Other"],d=n,p="",f=s,T=a;if(d===""){let y=await Ft.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:he}]);y.name==="Other"?d=(await Ft.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Se}])).address:(p=y.name,d=co[p].tokenMint)}if(f===""){m=m.filter(P=>P!==p);let y=await Ft.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(y.name==="Other")f=(await Ft.prompt([{type:"input",name:"address",message:"Enter output mint address",default:tt}])).address;else{let P=y.name;f=co[P].tokenMint}let M=y.name;f=co[M].tokenMint}if(T===0){let y=await Ft.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);T=Number(y.amount)}let S=await ni(t,l,!o||o===""?rr:o,e,d,f,T,i);S||process.exit(0),console.log(Ot.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(Ot.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${S}`))},"swapCmd");var Rd=r(async()=>{let t=await Ft.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 v(t),console.log(Ot.green(`\u2714\uFE0E Config Updated Successfully!
624
+ `)),wt()},"askForConfig");import{spawnSync as Cd}from"node:child_process";var ai=r(()=>{Cd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as Pd}from"node:child_process";var ii=r(()=>{Pd("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Id}from"node:child_process";var ci=r(()=>{Id("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as Ld}from"node:child_process";var li=r(()=>{Ld("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as xd}from"node:child_process";var mi=r((t=!1)=>{xd(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as Vd}from"node:child_process";var pi=r(()=>{Vd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var di=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{ai()}),t.command("start").description("Start Jupiter").action(()=>{ii()}),t.command("stop").description("Stop Jupiter").action(()=>{ci()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{mi(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{li()}),t.command("enable").description("Enable Jupiter").action(()=>{pi()})},"jupiterCommands");import Dd from"chalk";var h=new $d;h.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(pe,"-V","Display version");async function Kd(){try{let t=await x();Xn(t),os(t),ts(t),ys(t),zr(t),qr(),rs(t),$s(t),Us(t),Ss(),as(),Wn(t),Ws(t),ns(),Js(),ea(t),na(t),va(t),Qn(),si(h,t),ba(t),ti(h,t),di(),h.command("rm:log").description("Remove Logs").action(()=>{qs()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{Qs(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(Dd.white("\u{1F4DD} Creating Snapshot...")),ei(e.slot,e.ledger,e.snapshots)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Xs(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{Zs()}),h.command("config").description("Show Solv Config").action(()=>{qe(t)}),h.command("vv").description("Show Solv Version").action(()=>{let e=_e();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(Kd,"main");Kd();export{h as program};
625
625
  //# sourceMappingURL=index.js.map