@gabrielhicks/solv 5.1.14 → 5.1.15

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