@gabrielhicks/solv 5.1.17 → 5.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var 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.17";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-public/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 z="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.17",tag:"v2.1.17",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-public/${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.1.17",rt="2.1.17",Et="2.1.17",Gt="2.1.17",Lr="2.1.17",gt="2.1.17";var xr="20.17.0",Vr="0.409.20113",zt="0.409.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 W=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!
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.18";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 ue=Go.version;var Bt="https://validators.solutions";var fe="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}`,he=`${I}/${yi}`,Yd=`${I}/${Ti}`,P=`${I}/${Ei}`,Wo=`${I}/${gi}`,jd=`${I}/${Ai}`,X=`${I}/solana-validator.log`,Z=I+"/start-validator.sh",w="/mnt/ledger",kt="/mnt/accounts",tt="/mnt/snapshots",qo="solana-validator",Qo="agave-validator",Xo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Se=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),ye="So11111111111111111111111111111111111111112",Te="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-public/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"),et=_i;var Ee=r(async(t,e=!1)=>{Ct(t,e)},"updateVersion"),So=r(async(t,e=!1)=>{let o=et(),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 qr 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 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 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"},ot={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}/${ot.LOG}`,s=_.ACCOUNTS,a=_.LEDGER,i=_.SNAPSHOTS,c=`${b.ROOT}/${ot.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,rt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",gr="So11111111111111111111111111111111111111112",Ar="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",wr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",fr;(function(t){t[t.ELSOL=rt]="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,[rt]:9,[Ar]:6,[wr]:6},we="/home/solv/currentEpoch.json",To=.5,_e="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.17",tag:"v2.1.17",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 Ne=r((t=at.tag,e=!1)=>{e?Nr(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana-public/${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 Jt=r(async t=>{let o=`${Ri()}/${ot.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 Gt}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 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(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 q="2.1.17",j="2.1.17",Et="2.1.17",zt="2.1.17",Lr="2.1.17",gt="2.1.17";var xr="20.17.0",Vr="0.409.20113",Wt="0.409.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:q,MAINNET_SOLANA_VERSION:j,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:tt},it=xi;import{homedir as Ki}from"os";var bi=r(async()=>{let e=`${Ki()}/${fe}`;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 Q=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 qt=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 qt(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 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 W(m),i){let l=`Restarting **${c}**`;await W(l);try{Ji("solv update -b",{stdio:"inherit",shell:!0})}catch{let S=`Error restarting **${c}**`;return await W(S),!1}let d=`**${c}** has restarted, catching up...`;await W(d),await U(180*1e3);let p=await Kr(t);if(p){let f=`**${c}** has caught up!`;await W(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]
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 qt(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"),Oe=Bi;var Gi=r(async t=>{let e=t.NETWORK===u.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=N(),s=e?o:n,a=Oe(),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 Q(m),i){let l=`Restarting **${c}**`;await Q(l);try{Ji("solv update -b",{stdio:"inherit",shell:!0})}catch{let S=`Error restarting **${c}**`;return await Q(S),!1}let d=`**${c}** has restarted, catching up...`;await Q(d),await U(180*1e3);let p=await Kr(t);if(p){let f=`**${c}** has caught up!`;await Q(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()}/${fe}`;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"},ve=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}"}},Re=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 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 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"}},Ie=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 Pe=[") 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: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:Mr,subCmds:jr,logs:Hr,installer:Fr,installerSub:Yr,clientCmds:Br};break;default:e={cmds:ve,subCmds:Ie,logs:Re,installer:ke,installerSub:Ce,clientCmds:Pe}}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()}/${ot.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()}/${ot.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");import{spawnSync as Wr}from"node:child_process";var Lt=r((t=!1,e="45",o=tt,n=j,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){Wr(`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}Wr(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");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?q:j;n&&(a=zt,e&&(a=Et)),s&&(a=Wt,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(qr.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===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?$.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:q,MAINNET_SOLANA_VERSION:j}),n){let l=e?Et:zt;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 kr();return}if(i.background){let l=i.version;if(await v({TESTNET_SOLANA_VERSION:q,MAINNET_SOLANA_VERSION:j}),n){Ne(`v${l}`,i.mod),await Jt({version:l,tag:`v${l}`}),await So(m,!0);return}e&&Lt(e,"15",t.SNAPSHOTS_PATH,q),await Ee(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 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=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 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 pc}from"child_process";import{homedir as dc}from"os";var Le=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 xe}from"child_process";import{existsSync as tn,readdirSync as uc,rmSync as fc}from"fs";import{homedir as hc}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=uc("./").filter(m=>m.endsWith("SV.json")),a=hc(),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!`),fc(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 Sc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
8
8
  Description=Jupiter API Service Instance
9
9
  After=network.target
10
10
 
@@ -19,19 +19,19 @@ Environment=RUST_LOG=info
19
19
  Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
20
20
 
21
21
  [Install]
22
- WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),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
22
+ WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),on=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"}]);rn(`sudo apt-get install unzip wget -y
23
23
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
24
24
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
25
25
  chmod +x jupiter-swap-api
26
- rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=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
26
+ 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(Tc.white(`\u{1F7E2} Jupiter Swap API Setup Completed
27
27
 
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-public/${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
28
+ $ solv jupiter --help`))},"jupiterAPISetup"),nn=Ec;import{existsAsync as gc}from"@skeet-framework/utils";import{readFile as Ac,writeFile as sn}from"fs/promises";import{homedir as wc}from"os";import _c from"path";var At=r(async()=>{let t=wc(),e=_c.join(t,ot.JITO_CONFIG);await gc(e)||(await sn(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 sn(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 Xt from"chalk";import $e from"inquirer";import Oc from"inquirer";var an=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 $e.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 $e.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 $e.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Pr,default:$.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=vc;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-public/${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
29
29
  exec agave-validator \\
30
30
  --identity ${R} \\
31
- --log ${q} \\
31
+ --log ${X} \\
32
32
  --accounts ${kt} \\
33
33
  --ledger ${w} \\
34
- --snapshots ${X} \\
34
+ --snapshots ${tt} \\
35
35
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
36
36
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
37
37
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -64,13 +64,13 @@ exec agave-validator \\
64
64
  --wal-recovery-mode skip_any_corrupted_record \\
65
65
  --use-snapshot-archives-at-startup when-newest \\
66
66
  --limit-ledger-size 400000000 \\
67
- `,"startJitoRPCScript");import{existsAsync as 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
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 ${Z}`;Rc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),te=kc;var pn=r(()=>`#!/bin/bash
68
68
  exec agave-validator \\
69
69
  --identity ${R} \\
70
- --log ${q} \\
70
+ --log ${X} \\
71
71
  --accounts ${kt} \\
72
72
  --ledger ${w} \\
73
- --snapshots ${X} \\
73
+ --snapshots ${tt} \\
74
74
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
75
75
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
76
76
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -100,12 +100,12 @@ exec agave-validator \\
100
100
  --wal-recovery-mode skip_any_corrupted_record \\
101
101
  --use-snapshot-archives-at-startup when-newest \\
102
102
  --limit-ledger-size 400000000 \\
103
- `,"startRPCNodeScript");var 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
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=pn();break;case $.JITO:console.log("JITO RPC Node Setup"),Zt(Et),o=mn();break;default:console.log("Unknown RPC Node Setup");break}if(await Cc(Z)){console.log("Startup script already exists. Skipping...");return}await Ic(Z,o,"utf-8"),te()},"setupRpcNode"),dn=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
104
104
  exec ${a} \\
105
105
  --identity ${R} \\
106
- --vote-account ${fe} \\
106
+ --vote-account ${he} \\
107
107
  --authorized-voter ${K} \\
108
- --log ${q} \\
108
+ --log ${X} \\
109
109
  --accounts ${s.ACCOUNTS_PATH} \\
110
110
  --ledger ${s.LEDGER_PATH} \\
111
111
  --snapshots ${s.SNAPSHOTS_PATH} \\
@@ -135,12 +135,12 @@ exec ${a} \\
135
135
  --snapshot-interval-slots 0 \\
136
136
  --private-rpc \\
137
137
  --full-rpc-api \\
138
- `,"startJitoValidatorScript");var dn=r((t,e="agave-validator")=>`#!/bin/bash
138
+ `,"startJitoValidatorScript");var un=r((t,e="agave-validator")=>`#!/bin/bash
139
139
  exec ${e} \\
140
140
  --identity ${R} \\
141
- --vote-account ${fe} \\
141
+ --vote-account ${he} \\
142
142
  --authorized-voter ${K} \\
143
- --log ${q} \\
143
+ --log ${X} \\
144
144
  --accounts ${t.ACCOUNTS_PATH} \\
145
145
  --ledger ${t.LEDGER_PATH} \\
146
146
  --snapshots ${t.SNAPSHOTS_PATH} \\
@@ -170,7 +170,7 @@ exec agave-validator \\
170
170
  --identity ${R} \\
171
171
  --vote-account ${Wo} \\
172
172
  --authorized-voter ${P} \\
173
- --log ${q} \\
173
+ --log ${X} \\
174
174
  --accounts ${t.ACCOUNTS_PATH} \\
175
175
  --ledger ${t.LEDGER_PATH} \\
176
176
  --snapshots ${t.SNAPSHOTS_PATH} \\
@@ -192,14 +192,14 @@ exec agave-validator \\
192
192
  --block-production-method central-scheduler \\
193
193
  --block-verification-method unified-scheduler \\
194
194
  --full-rpc-api \\
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 G=parseInt(V,10);if(isNaN(G))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";G>=400*1024*1024*1024&&o.push({name:T,size:G,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
195
+ `,"startTestnetAgaveValidatorScript");import{existsAsync as fn}from"@skeet-framework/utils";import{writeFile as hn}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=un(t);break;case A.JITO:console.log("JITO Validator Setup for Mainnet");let a=await At();Zt(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 fn(Z)){console.log("Startup script already exists. Skipping...");return}await hn(Z,s,"utf-8"),te()},"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();Zt(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 fn(Z)){console.log("Startup script already exists. Skipping...");return}await hn(Z,n,"utf-8"),te()},"setupTestnetValidator"),Sn=Vc;import Fn 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=[_.ACCOUNTS,_.LEDGER,_.SNAPSHOTS];for(let e of t)Tn(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 jt=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:jt,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 ee=bc;import{spawnSync as xt}from"child_process";var dt=r(t=>{if(xt(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return xt("sudo udevadm trigger --action=change",{shell:!0}),xt("sudo udevadm settle",{shell:!0}),console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return xt(o,{shell:!0,stdio:"inherit"}),xt("sudo udevadm trigger --action=change",{shell:!0}),xt("sudo udevadm settle",{shell:!0}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as De}from"child_process";async function Ro(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 U(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${t}, using raw path`),t}r(Ro,"getUUID");var oe=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
197
  ${i} ${_.ACCOUNTS} ext4 defaults 0 0`),s&&(m=`${a} ${_.LEDGER} ext4 defaults 0 0
198
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:
199
+ ${c} ${_.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(`
200
+ `)}" | 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:
201
201
  ${f.join(`
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=`
202
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as Uc}from"child_process";var gn=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=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: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 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:F.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:F.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=Mc;import{spawnSync as Hc}from"child_process";var wn=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 Ke}from"child_process";import{existsSync as Fc}from"fs";function _n(){if(!Fc(L.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
203
203
  # Increase UDP buffer sizes
204
204
  net.core.rmem_default = 134217728
205
205
  net.core.rmem_max = 134217728
@@ -214,7 +214,7 @@ fs.nr_open = 1000000
214
214
  `,e=`
215
215
  # Increase process file descriptor count limit
216
216
  * - nofile 1000000
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} {
217
+ `;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=H.USERNAME)=>{let{log:e}=pt();return`${e} {
218
218
  su ${t} ${t}
219
219
  daily
220
220
  rotate 1
@@ -225,7 +225,7 @@ fs.nr_open = 1000000
225
225
  systemctl kill -s USR1 solv.service
226
226
  endscript
227
227
  }
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]
228
+ `},"logRotates");import{existsSync as Yc}from"fs";import{execSync as jc}from"child_process";function On(){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=Nn();jc(`echo "${t}" | sudo tee ${L.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(On,"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`,vn=r((t=!0)=>{let{scriptPath:e}=pt(t),o=t?Jc:Bc,n=Gc;return`[Unit]
229
229
  Description=Solana Validator
230
230
  After=network.target
231
231
  StartLimitIntervalSec=0
@@ -243,7 +243,7 @@ Environment="${o}"
243
243
  ExecStart=${e}
244
244
 
245
245
  [Install]
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
246
+ 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 ko}from"node:child_process";var Cn=r(t=>{try{Ve(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&&Le(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");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
247
247
  net.core.rmem_default=134217728
248
248
  net.core.wmem_default=134217728
249
249
  net.core.rmem_max=134217728
@@ -359,7 +359,7 @@ Restart=always
359
359
 
360
360
  [Install]
361
361
  WantedBy=multi-user.target
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
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${Wt}-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${Wt}`,{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 cn());let s=await x(),a=s.NETWORK===u.TESTNET;switch(En(),(!e||!o)&&await An(),kn(a),Vn(),In(),await xn(),Cn(s),Kn(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 He(n);break;default:throw new Error("Unknown Node Type")}o||wn(),Qt(),s.VALIDATOR_TYPE!==A.FRANKENDANCER&&(o||(s=await x(),$n(),Lt(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
363
363
  [Unit]
364
364
  Description=Solana transaction relayer
365
365
  Requires=network-online.target
@@ -410,10 +410,10 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer
410
410
  [Install]
411
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(`
412
412
  `);o.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let n=o.join(`
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
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 ...")),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 Jn(n,!1),console.log(ct.green(`Jito Relayer Setup Completed
414
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:
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 nn(),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 re}from"node:child_process";import os from"chalk";var rs=r(t=>{let e=et();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...")),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(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}`;re(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var ns=r(t=>{let o=t.NETWORK===u.TESTNET?q:j;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||zt}`;Ne(l,a);return}t.NODE_TYPE===E.RPC&&(o=gt);let c=n.version||o;await Ee(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=ee();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 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 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+ne.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}${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(!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
417
  `)),console.log(je.white(o))}catch(t){console.error(je.white(`Error reading SSH Public Key
418
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
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.
@@ -423,30 +423,30 @@ ${n.join(`
423
423
  Only showing the first 10 results
424
424
 
425
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=z)=>{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:z}]);try{let o=await ze(t,e.stakePoolAddress);if(!o)return console.log(ne.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
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 Kt 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 se 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(se.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
427
427
  Please check the correct address and try again.
428
- `)),console.log(ne.white(`For stake pool information
428
+ `)),console.log(se.white(`For stake pool information
429
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}
430
430
  Name: ${a.name}
431
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
432
+ 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
433
433
  Please check the correct address and try again.
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(z),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(z),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
434
+ `)),console.log(se.white(`For stake pool information
435
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Om}from"fs/promises";import ce from"inquirer";import{existsAsync as vm}from"@skeet-framework/utils";import{Connection as Ls,Keypair as gm,PublicKey as ie}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 ae=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 Vt=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 ie(e),c=gm.fromSecretKey(new Uint8Array(n)),m=rt;a.setSpinnerTitle(Nt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let l=await ae(t,n,m,c.publicKey);await xs(1e3),a.setSpinnerTitle(Nt.green("\u{1F504} Converting SOL to elSOL"));let d=await Vt(s,n,o,i,new ie(l),new ie(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 Vt(s,n,o,i,new ie(l),new ie(yo),c.publicKey)}return a.stop(!0),console.log(Nt.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
436
436
 
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
437
+ Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as wm,Keypair as _m,PublicKey as $t}from"@solana/web3.js";import{Spinner as Nm}from"cli-spinner";import Dt 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(Dt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new $t(e),m=await ze(t,e);if(!m)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Dt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let l=m.poolMint,d=_m.fromSecretKey(new Uint8Array(n)),p=await ae(t,n,l,d.publicKey),f=await ae(t,n,l,new $t(Tr),!0);await Vs(1e3),i.setSpinnerTitle(Dt.green(`\u{1F504} Converting SOL to ${s}`));let S=await Vt(a,n,o,c,new $t(p),new $t(f),d.publicKey),g=0;for(;S.status!=="success";){if(g++,g>10)return i.stop(!0),console.log(Dt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Dt.yellow(`\u23F3 ${g} Times Retrying...
438
+ `)),await Vs(1e3),S=await Vt(a,n,o,c,new $t(p),new $t(f),d.publicKey)}return i.stop(!0),console.log(Dt.white(`\u{1F4B0} You've got ${s} \u2728
439
439
 
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=z,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
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(Kt.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
441
+ `)),console.log(Kt.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(Kt.yellow(`Network might be busy, please try again later
442
442
  You can use a custom RPC endpoint to avoid this issue
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
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(Kt.yellow(`Network might be busy, please try again later
444
444
  You can use a custom RPC endpoint to avoid this issue
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
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(Kt.white(`\u{1F4D7} Selected Wallet: ${t}
446
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Kt.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ce.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 ce.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 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"),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 ce.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 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 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 bt;(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
447
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(`
448
448
  ${e}`),console.log(`${o}`),console.log(`${n}`),console.log(`${s}`),console.log(`${a}`),console.log(`${i}
449
- `),console.log(`Solv Version: v${de}
449
+ `),console.log(`Solv Version: v${ue}
450
450
  `)},t.installMessage=()=>{let e=t.warningHex("\u{1F525} Welcome to Solana Validator Tool Solv \u{1F525}"),o=`
451
451
  Solv is born and ready for running Solana Validator \u{1F680}
452
452
 
@@ -467,7 +467,7 @@ $ solv mt -p <fileSystem>
467
467
  $ solv umt -p <fileSystem>
468
468
  `,s=`mount reload
469
469
  $ solv mtr
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:
470
+ `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(bt||(bt={}));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?q:j;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;Lt(e,a,i,c,m,l)}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${et()} --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=>{bt.solvAA(),s.client?bt.installClientMessage():bt.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=`${et()} --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
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}
472
472
  Address: ${e.validatorKeyAddress}
473
473
  Balance: ${e.validatorKeyBalance}
@@ -480,15 +480,15 @@ Balance: ${e.authorityKeyBalance}
480
480
  Active Identity:`;t.NODE_TYPE===E.RPC&&(o=`Validator Key: ${e.validatorKey}
481
481
  Address: ${e.validatorKeyAddress}
482
482
  Balance: ${e.validatorKeyBalance}
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
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=`${et()} --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 le 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(le.blue(`\u2728 Coming Soon
484
484
  This Feature is Currently Under Development
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
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(le.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(le.white(`\u{1F3E6} From Wallet: ${n}
487
+ \u{1F4B0} Balance: ${i}`)),console.log(le.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=Se;for(;l.status!==0&&d>0;)console.log(le.red(`\u274C Transaction Failed
489
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 j;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(j||(j={}));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,j.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,j.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 G=await i.sendRawTransaction(C.serialize());return await i.confirmTransaction({...g.value,signature:G},"finalized"),console.log("finalized signature:",G),G}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(`
490
+ Retries Left: ${d}`)),await U(ea),l=Do(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"),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:me}]);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?_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=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 pe 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>Se)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(pe.white("Vote Account Balance is less than 1 SOL")),console.log(pe.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(pe.white(`Transferable Balance: ${s} SOL`));let a=s*Ap;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=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 ${rt} --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(`
492
492
  `).filter(a=>!a.includes(t)).join(`
493
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
494
  ${Na.green("No more Login to the server to update \u{1F331}")}
@@ -499,18 +499,18 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
499
499
 
500
500
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
501
501
  \u203B Please turn off if you are using no-downtime migration.
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,j.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,j.VOTE),s++;let a=JSON.parse(await Lp(o,"utf-8")),i=await st(t.RPC_URL,j.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,z,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 W(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}
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: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"),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 Q(l),process.exit(0)}if(console.log(`Transferring ${c} elSOL to Harvest Address`),await ga(t.RPC_URL,a,e,c,rt,Er),t.IS_MEV_MODE){let l=`\u{1F4B0} Harvested Rewards for ${(await Yo(t.RPC_URL)).epoch} \u{1F4B0}
503
503
  Validator Address: ${O(o)}
504
504
  Total Reward: ${c} elSOL
505
- Harvest Address: ${e}`;await W(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===
505
+ Harvest Address: ${e}`;await Q(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:me}]);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(we,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===
506
506
  Validator: ${i}
507
507
  Network: ${e.NETWORK}
508
508
  CurrentEpoch: ${t.epoch}
509
509
  Epoch has been updated!
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,j.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
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")?we:"./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
511
511
  Please top up your Validator Account
512
- Address: ${i}`;return await W(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(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 B 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.
512
+ Address: ${i}`;return await Q(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?_e: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 qt(o,O(e?c:i));if(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 Mt}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.
514
514
  $ ssh solv@${t}
515
515
 
516
516
  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.
@@ -518,61 +518,61 @@ Please check your Validator
518
518
  $ ssh ${o}@${e}
519
519
 
520
520
  Local Identity Key: ${n}
521
- 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(B.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(B.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
521
+ Destination Identity Key: ${s}`)),!1):!0},"checkValidatorKey"),Ut=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(!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
522
522
  $ ssh ${n}@${t}
523
523
 
524
- Failed Cmd: ${d} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(B.white("\u{1F7E2} Setting identity on the new validator..."));let f=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${l} set-identity ${co}'`;if(Ut(f,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
524
+ 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(Mt(f,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
525
525
  $ ssh ${n}@${t}
526
526
 
527
- Failed Cmd: ${l} set-identity ${co}`));return}if(console.log(B.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(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
527
+ Failed Cmd: ${l} set-identity ${co}`));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 ${co} ${Ya}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
528
528
  $ ssh ${n}@${t}
529
529
 
530
- Failed Cmd: ln -sf ${co} ${Ya}`));return}if(console.log(B.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(B.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
530
+ Failed Cmd: ln -sf ${co} ${Ya}`));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
531
531
  $ ssh ${n}@${t}
532
532
 
533
- Failed Cmd: scp ${n}@${t}:${w}/tower-1_9-${e}.bin ${w}`));return}if(console.log(B.white("\u{1F7E2} Setting identity on the new validator...")),Ut(`${l} set-identity --require-tower ${m}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
533
+ 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
534
534
 
535
535
  Failed Cmd: ${l} set-identity ${m}
536
- ln -sf ${m} ${R}`));return}if(Ut(`ln -sf ${m} ${R}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
536
+ 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
537
537
 
538
- Failed Cmd: ln -sf ${m} ${R}`));return}console.log(B.white("\u{1F7E2} Identity changed successfully!")),await v({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as za}from"path";import Y 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(Y.white("\u{1F7E2} Waiting for restart window...")),Mt(f,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Y.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
538
+ 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 Y from"chalk";import{spawnSync as Ht}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(!Ut(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(Y.white("\u{1F7E2} Waiting for restart window...")),Ht(f,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Y.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
539
539
 
540
- Failed Cmd: ${f}`));return}if(console.log(Y.white("\u{1F7E2} Setting identity on the new validator...")),Mt(S,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
540
+ Failed Cmd: ${f}`));return}if(console.log(Y.white("\u{1F7E2} Setting identity on the new validator...")),Ht(S,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
541
541
 
542
- Failed Cmd: ${S}`));return}if(console.log(Y.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Mt(g,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
542
+ Failed Cmd: ${S}`));return}if(console.log(Y.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ht(g,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
543
543
 
544
- Failed Cmd: ${g}`));return}if(console.log(Y.white("\u{1F7E2} Uploading the tower file to the new validator...")),Mt(y,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
544
+ Failed Cmd: ${g}`));return}if(console.log(Y.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ht(y,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
545
545
 
546
- Failed Cmd: ${y}`));return}console.log(Y.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(Y.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
546
+ Failed Cmd: ${y}`));return}console.log(Y.white("\u{1F7E2} Setting identity on the new validator..."));let jt=`ssh -i ${Ga} -o StrictHostKeyChecking=no ${n}@${t} -p 22 'cd ~ && source ~/.profile && ${T}'`;Ht(jt,{shell:!0,stdio:"inherit"}).status!==0&&console.log(Y.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
547
547
  $ ssh ${n}@${t}
548
548
 
549
- Failed Cmd: ${T}`)),console.log(Y.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(Y.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
549
+ Failed Cmd: ${T}`)),console.log(Y.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(Ht(po,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
550
550
 
551
- Failed Cmd: ${V}`));return}console.log(Y.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 J 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(J.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(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
551
+ Failed Cmd: ${V}`));return}console.log(Y.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 de from"chalk";import{join as Xa}from"path";import{spawnSync as Ft}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),!Ut(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(Ft(V,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
552
552
  $ ssh ${n}@${t}
553
553
 
554
- Failed Cmd: ${l} -l ${w} 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 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(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
554
+ 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(Ft(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
555
555
  $ ssh ${n}@${t}
556
556
 
557
- Failed Cmd: ${l} -l ${w} set-identity ${lo}`));return}if(console.log(J.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(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
557
+ Failed Cmd: ${l} -l ${w} set-identity ${lo}`));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 ${lo} ${Qa}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
558
558
  $ ssh ${n}@${t}
559
559
 
560
- Failed Cmd: ln -sf ${lo} ${Qa}`));return}if(console.log(J.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(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
560
+ Failed Cmd: ln -sf ${lo} ${Qa}`));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
561
561
  $ ssh ${n}@${t}
562
562
 
563
- 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...")),Ht(`${d} -l ${w} set-identity --require-tower ${c}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
563
+ 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
564
564
 
565
565
  Failed Cmd: ${d} -l ${w} set-identity ${c}
566
- ln -sf ${c} ${R}`));return}if(Ht(`ln -sf ${c} ${R}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
566
+ 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
567
567
 
568
- Failed Cmd: ln -sf ${c} ${R}`));return}console.log(J.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
569
- 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
570
- `)),console.log(M.white("Get Your API key \u{1F447}")),console.log(M.white(jt+`
568
+ 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(de.yellow(`\u26A0\uFE0F Invalid Switch Type
569
+ 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(de.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(de.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(de.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(de.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=tt)=>{try{let n=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${o} --hard-fork ${t} -- ${t} ${e}`;console.log("Parameters to createSnapshot:",t,e,o),console.log("Command:",n);let s=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 Yt 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:ye,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Te,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
570
+ `)),console.log(M.white("Get Your API key \u{1F447}")),console.log(M.white(Bt+`
571
571
  `)),process.exit(0));let Rt=`${M.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
572
572
 
573
573
  You can upgrade your API key to increase your rate limits.
574
574
  Get Your API key \u{1F447}
575
- Validators Solutions: ${jt}
575
+ Validators Solutions: ${Bt}
576
576
  `;console.error(M.white(Rt)),process.exit(0)}let d=jo[s],p=jo[a],f=`\u{1F504} Swap Quote \u{1F504}
577
577
 
578
578
  - \u{1F3E6} Input Token: ${d.symbol} (${s})
@@ -585,13 +585,13 @@ Validators Solutions: ${jt}
585
585
  `;console.log(M.white(f)),console.log(M.gray(`You can also swap using the following command:
586
586
  $ solv swap --input ${s} --output ${a} --amount ${i} --skip-confirm
587
587
  `));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
588
- `)),console.log(M.white("Get Your API key \u{1F447}")),console.log(M.white(jt+`
588
+ `)),console.log(M.white("Get Your API key \u{1F447}")),console.log(M.white(Bt+`
589
589
  `)),process.exit(0));let Rt=`${M.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
590
590
 
591
591
  You can upgrade your API key to increase your rate limits.
592
592
  Get Your API key \u{1F447}
593
- Validators Solutions: ${jt}
594
- `;console.error(M.white(Rt)),process.exit(0)}let V=Buffer.from(T.swapTransaction,"base64"),C=_d.deserialize(V);C.sign([y]);let G=C.serialize(),vt=await m.sendRawTransaction(G,{skipPreflight:!0,maxRetries:2}),Yt=C.message.recentBlockhash;return console.log(`Swapping...
595
- 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!
596
- `)),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};
593
+ Validators Solutions: ${Bt}
594
+ `;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}),jt=C.message.recentBlockhash;return console.log(`Swapping...
595
+ Transaction ID: ${vt}`),await m.confirmTransaction({blockhash:jt,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 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=mo[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:rt}])).address;else{let C=T.name;f=mo[C].tokenMint}let V=T.name;f=mo[V].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 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 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!
596
+ `)),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(ue,"-V","Display version");async function Kd(){try{let t=await x();Zn(t),rs(t),es(t),Ts(t),Qr(t),Zr(),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=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(Kd,"main");Kd();export{h as program};
597
597
  //# sourceMappingURL=index.js.map