@gabrielhicks/solv 4.8.16 → 4.8.17

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