@ily-validator/solc 5.2.4 → 5.2.6

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 hi=Object.defineProperty;var r=(t,e)=>hi(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as qd}from"commander";var jo="5.2.4";var Yo={name:"@ily-validator/solc",version:jo,description:"Solana Validator CLI-Customized (Customized SOLV Client)",main:"dist/index.js",type:"module",repository:{type:"git",url:"git+https://github.com/ikaika1/solc.git"},keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],types:"dist/index.d.ts",engines:{node:">=20"},author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",publishConfig:{access:"public",registry:"https://registry.npmjs.org"},bin:{solc:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",prepublishOnly:"pnpm -s build",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 me=Yo.version;var Ht="https://validators.solutions";var pe="solc4.config.json";var ht="identity.json",yt="unstaked-identity.json",Jo="relayer-keypair.json",Si="mainnet-validator-keypair.json",Ti="mainnet-vote-account-keypair.json",gi="mainnet-authority-keypair.json",Ei="testnet-validator-keypair.json",wi="testnet-vote-account-keypair.json",Ai="testnet-authority-keypair.json",C="/home/solv",O=`${C}/${ht}`,ou=`${C}/${yt}`,b=`${C}/${Si}`,de=`${C}/${Ti}`,ru=`${C}/${gi}`,L=`${C}/${Ei}`,Bo=`${C}/${wi}`,nu=`${C}/${Ai}`,W=`${C}/solana-validator.log`,q=C+"/start-validator.sh",y="/mnt/ledger",Q="/mnt/accounts",Go="solana-validator",zo="agave-validator",Wo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var ue=3,qo="https://api.testnet.solana.com",Qo="https://api.mainnet-beta.solana.com",Xo="https://verify.validators.solutions/solc-migrate",Zo="https://jup.validators.solutions/v1/jup",mo;(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"})(mo||(mo={}));var tr=Object.values(mo),fe="So11111111111111111111111111111111111111112",he="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",po="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var er="SOLV420",or={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as ki}from"child_process";import{spawnSync as _i}from"node:child_process";var Ni=r(t=>{_i(`sh -c "$(curl -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),kt=Ni;var rr="agave-validator",Oi=r(()=>{try{return rr}catch(t){return console.error(t),rr}},"getSolanaCLI"),K=Oi;var ye=r(async t=>{kt(t)},"updateVersion"),uo=r(async(t,e=!1)=>{let o=K(),n=`${o} --ledger ${y} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${y} exit --max-delinquent-stake ${t}`),ki(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Yr from"chalk";var St;(function(t){t.EN="en",t.JA="ja"})(St||(St={}));var nr;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(nr||(nr={}));var sr;(function(t){t.SINGLE="single",t.DOUBLE="double"})(sr||(sr={}));var mt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(mt||(mt={}));var ar;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(ar||(ar={}));var ir;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(ir||(ir={}));var cr;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(cr||(cr={}));var lr;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(lr||(lr={}));var Se;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(Se||(Se={}));var Te;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(Te||(Te={}));var dr=!1,ur=!0,M={ID:"solc",LANG:St.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},D={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},R={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger"},X={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solc.config.json",JITO_CONFIG:"jito.config.json"},P={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"},v={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"},A=r((t=D.ROOT)=>{let e=t===D.ROOT?D.ROOT:t,o=`${e}/${v.MAINNET_VALIDATOR_KEY}`,n=`${e}/${v.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${v.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${v.TESTNET_VALIDATOR_KEY}`,i=`${e}/${v.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${v.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),pt=r((t=!0)=>{let e=t?`${D.ROOT}/${v.TESTNET_VALIDATOR_KEY}`:`${D.ROOT}/${v.MAINNET_VALIDATOR_KEY}`,o=t?`${D.ROOT}/${v.TESTNET_VALIDATOR_VOTE_KEY}`:`${D.ROOT}/${v.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${D.ROOT}/${X.LOG}`,s=R.ACCOUNTS,a=R.LEDGER,i=`${D.ROOT}/${X.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:i}},"startupScriptPaths");var B="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",fo="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",fr="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",hr=9,Z="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",yr="So11111111111111111111111111111111111111112",Sr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Tr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",mr;(function(t){t[t.ELSOL=Z]="ELSOL",t[t.SOL=yr]="SOL",t[t.USDC=Sr]="USDC",t[t.EPCT=Tr]="EPCT"})(mr||(mr={}));var pr;(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"})(pr||(pr={}));var gu={[yr]:9,[Z]:9,[Sr]:6,[Tr]:6},ge="/home/solv/currentEpoch.json",ho=.5,Ee="https://api.testnet.solana.com";import{spawnSync as yo}from"child_process";var gr=r(()=>{yo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=M.NODE_VERSION;yo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),yo("pnpm add -g @ily-validator/solc",{shell:!0,stdio:"inherit"})},"updateSolv");var tt="3.0.10",et="3.0.10",jt="3.0.10",H="3.0.10",Er="3.0.10",Tt="3.0.10";var wr="20.19.5";var Ar="0.713.30008";var at={version:H,tag:`v${H}-jito`,commissionBps:700,relayerUrl:"http://amsterdam.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://amsterdam.mainnet.block-engine.jito.wtf",shredReceiverAddr:"74.118.140.240:1002"},G={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 vi}from"child_process";var we=r((t=at.tag)=>{vi(`sh -c "$(curl -sSfL https://release.jito.wtf/${t}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Ri,writeFile as Ci}from"fs/promises";import{homedir as Ii}from"os";var Yt=r(async t=>{let o=`${Ii()}/${X.JITO_CONFIG}`,s={...JSON.parse(await Ri(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Ci(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as _r}from"child_process";import Li from"inquirer";var Nr=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";_r(`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}`;_r(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Or=r(async()=>await Li.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Jt}from"@skeet-framework/utils";import Pi from"chalk";import xi from"inquirer";var kr=r(async()=>{let t=await xi.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(Pi.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Vi=r(()=>jo,"getSolvVersion"),vt=Vi;import{readFile as Ki,writeFile as Di}from"fs/promises";import{existsAsync as Ui}from"@skeet-framework/utils";var So;(function(t){t.EN="en",t.JA="ja"})(So||(So={}));var Wu=Object.values(So),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var vr=Object.values(u),T;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(T||(T={}));var Rr=Object.values(T),g;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(g||(g={}));var qu=Object.values(g).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var Cr=Object.values($).filter(t=>t!=="none"),ot;(function(t){t.SINGLE="single",t.DOUBLE="double"})(ot||(ot={}));var bi={NETWORK:u.TESTNET,NODE_TYPE:T.RPC,VALIDATOR_TYPE:g.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:ot.SINGLE,TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et,NODE_VERSION:wr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:Wo,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Qo,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:""},it=bi;import{homedir as Mi}from"os";var Fi=r(async()=>{let e=`${Mi()}/${pe}`;return await Ui(e)?JSON.parse(await Ki(e,"utf-8")):(console.log("Creating default config file at",e),await Di(e,JSON.stringify(it,null,2)),it)},"readConfig"),I=Fi;import Hi from"node-fetch";var x=r(async t=>{try{let e=await I();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} Solc Notifier"};return(await Hi(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 Wi}from"child_process";import{Connection as Ir}from"@solana/web3.js";var Bt=r(async(t,e,o=!1,n=200)=>{let s={pubkey:e,isActive:!1,reason:""};try{let a=o?new Ir("https://api.testnet.solana.com"):new Ir(t,"confirmed"),i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e);if(!c)return i.delinquent.find(f=>f.votePubkey===e)?(s.isActive=!1,s.reason="Validator is delinquent.",s):(s.isActive=!1,s.reason="Validator is not found in both current and delinquent lists.",s);if(i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e),!c)return s.isActive=!1,s.reason="Validator is not found in the current list.",s;let l=c.lastVote,d=await a.getSlot()-l;return d>n?(s.isActive=!1,s.reason=`Validator has not voted for ${d} slots.`,s):(s.isActive=!0,s.reason="Validator is active and voting.",s)}catch(a){return console.error(a),s.isActive=!1,s.reason="Failed to check validator status.",s}},"isValidatorActive");import{spawnSync as ji}from"child_process";var E=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=ji(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Yi=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),rt=Yi;import{sendDiscord as Ji}from"@skeet-framework/utils";var Lr=60,Bi=r(async t=>{try{let e=t.NETWORK===u.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=A(),a=E(e?n:o),i=await Bt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Lr){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Lr} minutes!
2
+ var Ri=Object.defineProperty;var r=(t,e)=>Ri(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as iu}from"commander";var Zo="5.2.6";var tr={name:"@ily-validator/solc",version:Zo,description:"Solana Validator CLI-Customized (Customized SOLV Client)",main:"dist/index.js",type:"module",repository:{type:"git",url:"git+https://github.com/ikaika1/solc.git"},keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],types:"dist/index.d.ts",engines:{node:">=20"},author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",publishConfig:{access:"public",registry:"https://registry.npmjs.org"},bin:{solc:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",prepublishOnly:"pnpm -s build",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"}};var he=tr.version;var Gt="https://validators.solutions";var vt="solc4.config.json";var St="identity.json",Tt="unstaked-identity.json",er="relayer-keypair.json",vi="mainnet-validator-keypair.json",Ci="mainnet-vote-account-keypair.json",Ii="mainnet-authority-keypair.json",Li="testnet-validator-keypair.json",Pi="testnet-vote-account-keypair.json",xi="testnet-authority-keypair.json",I="/home/solv",R=`${I}/${St}`,uu=`${I}/${Tt}`,b=`${I}/${vi}`,ye=`${I}/${Ci}`,fu=`${I}/${Ii}`,P=`${I}/${Li}`,or=`${I}/${Pi}`,hu=`${I}/${xi}`,Q=`${I}/solana-validator.log`,X=I+"/start-validator.sh",y="/mnt/ledger",Z="/mnt/accounts",Ct="solana-validator",It="agave-validator",rr="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Se=3,nr="https://api.testnet.solana.com",sr="https://api.mainnet-beta.solana.com",ar="https://verify.validators.solutions/solc-migrate",ir="https://jup.validators.solutions/v1/jup",Te="https://amsterdam.mainnet.block-engine.jito.wtf",So;(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"})(So||(So={}));var cr=Object.values(So),ge="So11111111111111111111111111111111111111112",Ee="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",To="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var lr="SOLV420",mr={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as Hi}from"child_process";import{spawnSync as Vi}from"node:child_process";var $i=r(t=>{Vi(`sh -c "$(curl -sSfL https://release.anza.xyz/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Lt=$i;var go;(function(t){t.EN="en",t.JA="ja"})(go||(go={}));var Eu=Object.values(go),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var pr=Object.values(u),g;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(g||(g={}));var dr=Object.values(g),S;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(S||(S={}));var Au=Object.values(S).filter(t=>t!=="none"),L;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})(L||(L={}));var ur=Object.values(L).filter(t=>t!=="none"),tt;(function(t){t.SINGLE="single",t.DOUBLE="double"})(tt||(tt={}));var et="3.0.10",D="3.0.10",zt="3.0.10",Y="3.0.10",fr="3.0.10",gt="3.0.10";var hr="20.19.5";var yr="0.713.30008";var Di={NETWORK:u.TESTNET,NODE_TYPE:g.RPC,VALIDATOR_TYPE:S.NONE,RPC_TYPE:L.AGAVE,MNT_DISK_TYPE:tt.SINGLE,TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:D,NODE_VERSION:hr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:rr,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:sr,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",FRANKENDANCER_BLOCK_ENGINE_URL:Te},K=Di;import*as pt from"node:fs";import*as gr from"node:os";import wo from"node:path";var Sr="SOLC_SOLANA_CLI",Tr=r(t=>{try{return pt.accessSync(t,pt.constants.X_OK),!0}catch{return!1}},"isExecutable"),Ki=r(t=>t?(process.env.PATH??"").split(wo.delimiter).some(o=>{if(!o)return!1;let n=wo.join(o,t);return Tr(n)?!0:process.platform==="win32"?Tr(`${n}.exe`):!1}):!1,"isCommandAvailable"),Ui=r(()=>{try{let t=wo.join(gr.homedir(),vt);if(!pt.existsSync(t))return K;let e=pt.readFileSync(t,"utf-8"),o=JSON.parse(e);return{...K,...o}}catch{return K}},"readConfigFromDisk"),Mi=r(()=>{let t=Ui(),e=[];return t.VALIDATOR_TYPE===S.SOLANA&&e.push(Ct),(t.VALIDATOR_TYPE===S.AGAVE||t.VALIDATOR_TYPE===S.JITO||t.RPC_TYPE===L.AGAVE||t.RPC_TYPE===L.JITO)&&e.push(It),[...e,It,Ct].filter((o,n,s)=>o&&s.indexOf(o)===n)},"getPreferredBinaries"),Fi=r(()=>{let t=process.env[Sr]?.trim(),e=[...t?[t]:[],...Mi()];for(let o of e)if(Ki(o))return o;throw new Error(`Unable to locate a Solana validator binary. Install either "${It}" or "${Ct}" (or set ${Sr}) and ensure it is on PATH.`)},"getSolanaCLI"),U=Fi;var Ae=r(async t=>{Lt(t)},"updateVersion"),_o=r(async(t,e=!1)=>{let o=U(),n=`${o} --ledger ${y} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${y} exit --max-delinquent-stake ${t}`),Hi(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import tn from"chalk";var Et;(function(t){t.EN="en",t.JA="ja"})(Et||(Et={}));var Er;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(Er||(Er={}));var Ar;(function(t){t.SINGLE="single",t.DOUBLE="double"})(Ar||(Ar={}));var dt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(dt||(dt={}));var wr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(wr||(wr={}));var _r;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(_r||(_r={}));var Nr;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(Nr||(Nr={}));var Or;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(Or||(Or={}));var we;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(we||(we={}));var _e;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(_e||(_e={}));var vr=!1,Cr=!0,H={ID:"solc",LANG:Et.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},M={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},C={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger"},ot={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solc.config.json",JITO_CONFIG:"jito.config.json"},x={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",SOL_SYSTEM_CONFIG21:"/etc/sysctl.d/21-solana-validator.conf",SOL_NOFILES_CONF:"/etc/security/limits.d/90-solana-nofiles.conf",SOL_SYSTEM_CONF:"/etc/systemd/system.conf",SOLANA_PATH:"/home/solv/.local/share/solana/install"},k={MAINNET_VALIDATOR_KEY:"mainnet-validator-keypair.json",MAINNET_VALIDATOR_VOTE_KEY:"mainnet-vote-account-keypair.json",MAINNET_VALITATOR_AUTHORITY_KEY:"mainnet-authority-keypair.json",TESTNET_VALIDATOR_KEY:"testnet-validator-keypair.json",TESTNET_VALIDATOR_VOTE_KEY:"testnet-vote-account-keypair.json",TESTNET_VALITATOR_AUTHORITY_KEY:"testnet-authority-keypair.json"},w=r((t=M.ROOT)=>{let e=t===M.ROOT?M.ROOT:t,o=`${e}/${k.MAINNET_VALIDATOR_KEY}`,n=`${e}/${k.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${k.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${k.TESTNET_VALIDATOR_KEY}`,i=`${e}/${k.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${k.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),ut=r((t=!0)=>{let e=t?`${M.ROOT}/${k.TESTNET_VALIDATOR_KEY}`:`${M.ROOT}/${k.MAINNET_VALIDATOR_KEY}`,o=t?`${M.ROOT}/${k.TESTNET_VALIDATOR_VOTE_KEY}`:`${M.ROOT}/${k.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${M.ROOT}/${ot.LOG}`,s=C.ACCOUNTS,a=C.LEDGER,i=`${M.ROOT}/${ot.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:i}},"startupScriptPaths");var z="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",No="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",Ir="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Lr=9,rt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Pr="So11111111111111111111111111111111111111112",xr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Vr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Rr;(function(t){t[t.ELSOL=rt]="ELSOL",t[t.SOL=Pr]="SOL",t[t.USDC=xr]="USDC",t[t.EPCT=Vr]="EPCT"})(Rr||(Rr={}));var kr;(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"})(kr||(kr={}));var Hu={[Pr]:9,[rt]:9,[xr]:6,[Vr]:6},Ne="/home/solv/currentEpoch.json",Oo=.5,Oe="https://api.testnet.solana.com";import{spawnSync as Ro}from"child_process";var $r=r(()=>{Ro("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=H.NODE_VERSION;Ro(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),Ro("pnpm add -g @ily-validator/solc",{shell:!0,stdio:"inherit"})},"updateSolv");var ct={version:Y,tag:`v${Y}-jito`,commissionBps:700,relayerUrl:"http://amsterdam.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://amsterdam.mainnet.block-engine.jito.wtf",shredReceiverAddr:"74.118.140.240:1002"},W={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 ji}from"child_process";var Re=r((t=ct.tag)=>{ji(`sh -c "$(curl -sSfL https://release.jito.wtf/${t}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Yi,writeFile as Bi}from"fs/promises";import{homedir as Ji}from"os";var Wt=r(async t=>{let o=`${Ji()}/${ot.JITO_CONFIG}`,s={...JSON.parse(await Yi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Bi(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as br}from"child_process";import Gi from"inquirer";var Dr=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";br(`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}`;br(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Kr=r(async()=>await Gi.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as qt}from"@skeet-framework/utils";import zi from"chalk";import Wi from"inquirer";var Ur=r(async()=>{let t=await Wi.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await qt("sudo ufw delete allow 8899/udp"),await qt("sudo ufw delete allow 8899/tcp"),await qt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await qt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await qt("sudo ufw reload"),console.log(zi.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var qi=r(()=>Zo,"getSolvVersion"),Pt=qi;import{readFile as Qi,writeFile as Xi}from"fs/promises";import{existsAsync as Zi}from"@skeet-framework/utils";import{homedir as tc}from"os";var ec=r(async()=>{let e=`${tc()}/${vt}`;if(!await Zi(e))return console.log("Creating default config file at",e),await Xi(e,JSON.stringify(K,null,2)),K;let o=JSON.parse(await Qi(e,"utf-8"));return{...K,...o}},"readConfig"),v=ec;import oc from"node-fetch";var V=r(async t=>{try{let e=await v();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
+ Please set DISCORD_WEBHOOK_URL in .env`);let o={content:t,username:"\u{1FA84} Solc Notifier"};return(await oc(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 lc}from"child_process";import{Connection as Mr}from"@solana/web3.js";var Qt=r(async(t,e,o=!1,n=200)=>{let s={pubkey:e,isActive:!1,reason:""};try{let a=o?new Mr("https://api.testnet.solana.com"):new Mr(t,"confirmed"),i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e);if(!c)return i.delinquent.find(f=>f.votePubkey===e)?(s.isActive=!1,s.reason="Validator is delinquent.",s):(s.isActive=!1,s.reason="Validator is not found in both current and delinquent lists.",s);if(i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e),!c)return s.isActive=!1,s.reason="Validator is not found in the current list.",s;let l=c.lastVote,d=await a.getSlot()-l;return d>n?(s.isActive=!1,s.reason=`Validator has not voted for ${d} slots.`,s):(s.isActive=!0,s.reason="Validator is active and voting.",s)}catch(a){return console.error(a),s.isActive=!1,s.reason="Failed to check validator status.",s}},"isValidatorActive");import{spawnSync as rc}from"child_process";var E=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=rc(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var nc=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),nt=nc;import{sendDiscord as sc}from"@skeet-framework/utils";var Fr=60,ac=r(async t=>{try{let e=t.NETWORK===u.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=w(),a=E(e?n:o),i=await Qt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Fr){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Fr} minutes!
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 Ji(l),!1}console.log("Waiting for validator to catch up..."),await rt(60*1e3),i=await Bt(t.RPC_URL,a,e),c++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Pr=Bi;import{spawnSync as Gi}from"node:child_process";var zi=r(()=>{let{stdout:t}=Gi("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),Ae=zi;var qi=r(async t=>{let e=t.NETWORK===u.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=A(),s=e?o:n,a=Ae(),i=e?dr:ur;i=i&&t.AUTO_RESTART;let c=E(s),l=`=== \u2728 solc updated to the latest version \u2728 ===
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await sc(l),!1}console.log("Waiting for validator to catch up..."),await nt(60*1e3),i=await Qt(t.RPC_URL,a,e),c++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Hr=ac;import{spawnSync as ic}from"node:child_process";var cc=r(()=>{let{stdout:t}=ic("solana --version",{shell:!0});return(t?String(t):"Unknown").trim()},"getSolanaVersion"),ke=cc;var mc=r(async t=>{let e=t.NETWORK===u.MAINNET,{mainnetValidatorKey:o,testnetValidatorKey:n}=w(),s=e?o:n,a=ke(),i=e?vr:Cr;i=i&&t.AUTO_RESTART;let c=E(s),l=`=== \u2728 solc updated to the latest version \u2728 ===
8
8
  Validator Address: ${c}
9
- solc Version: ${vt()}
9
+ solc 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{Wi("solc update -b",{stdio:"inherit",shell:!0})}catch(f){let S=`\u274C Error in restarting the node
17
+ `;await V(m);try{lc("solc update -b",{stdio:"inherit",shell:!0})}catch(f){let T=`\u274C Error in restarting the node
18
18
  Address: ${c}
19
- Error: ${f}`;return await x(S),!1}let d=`== \u{1F646} Your Node has been restarted! ==
19
+ Error: ${f}`;return await V(T),!1}let d=`== \u{1F646} Your Node has been restarted! ==
20
20
  Address: ${c}
21
21
  Now Catching up... \u{1F69B}\u{1F4A8}
22
- `;await x(d),await rt(180*1e3);let p=await Pr(t);if(p){let f=`== \u{1F7E2} Your Node has caught up! ==
22
+ `;await V(d),await nt(180*1e3);let p=await Hr(t);if(p){let f=`== \u{1F7E2} Your Node has caught up! ==
23
23
  Address: ${c}
24
24
  \u2728 Auto Update Completed \u2728
25
- `;await x(f)}return p}return!0},"autoUpdate"),xr=qi;import{homedir as Qi}from"os";import{readFile as Xi,writeFile as Vr}from"fs/promises";import{existsAsync as Zi}from"@skeet-framework/utils";var k=r(async t=>{let o=`${Qi()}/${pe}`;await Zi(o)||(console.log("Creating default config file at",o),await Vr(o,JSON.stringify(it,null,2)));let s={...JSON.parse(await Xi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Vr(o,a)},"updateDefaultConfig");var tc={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solc commands",subcmdHelp:"Display help for subcommands",server:"Open solc 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 Solc AA",installer:"Please select an option:",unstake:"UnStake"},_e=tc;var ec={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:"solc \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:"solc \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:"Solc\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:"},$r=ec;var oc={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solc installer \u{1F525}",description:"solc is born and ready for running Solana Validator Nodes \u{1F680}"}},Ne=oc;var rc={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 solc \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"}},br=rc;var Oe=[") 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 Kr=[") \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 nc={server:{description:"Open solc 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 Solc AA"}},ve=nc;var sc={server:{description:"Open solc 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 Solc AA"}},Ur=sc;var Re=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Mr=[") \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 ac=r(t=>{let e={cmds:_e,subCmds:ve,logs:Ne,installer:Oe,installerSub:ke,clientCmds:Re};switch(t){case St.EN:e={cmds:_e,subCmds:ve,logs:Ne,installer:Oe,installerSub:ke,clientCmds:Re};break;case St.JA:e={cmds:$r,subCmds:Ur,logs:br,installer:Kr,installerSub:Dr,clientCmds:Mr};break;default:e={cmds:_e,subCmds:ve,logs:Ne,installer:Oe,installerSub:ke,clientCmds:Re}}return e},"readLocale"),Fr=ac;import{existsSync as mc,readFileSync as pc,writeFileSync as Hr}from"fs";import{readFileSync as ic,writeFileSync as cc}from"fs";import{homedir as lc}from"os";var Rt=r(t=>{let o=`${lc()}/${X.CONFIG}`,s={...JSON.parse(ic(o,"utf8")),...t},a=JSON.stringify(s,null,2);cc(o,a)},"updateSolvConfig");import{homedir as dc}from"os";var jr=r(()=>{let e=`${dc()}/${X.CONFIG}`;mc(e)||(Hr(e,JSON.stringify(M,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(pc(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Hr(e,JSON.stringify(M,null,2)),o=M}let n=Fr(o.LANG);return o.RPC_URL||(o.RPC_URL=M.RPC_URL,Rt({RPC_URL:M.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,Rt({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",Rt({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var Jr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===T.RPC,n=t.VALIDATOR_TYPE===g.JITO,s=e?tt:et;n&&(s=H,e&&(s=jt)),o&&(s=Tt,n&&(s=Er)),h.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${s}`,s).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solc Config",!1).option("--config","Update Solc Config Default Solana Version",!1).option("--auto","Auto Update",!1).action(async a=>{let i=vt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(Yr.white(`Current solc version: ${i}`)),a.auto){await xr(t);return}if(a.migrateConfig){let l=jr().config,m=l.SOLANA_NETWORK===mt.TESTNET,d=l.SOLV_TYPE===Se.RPC_NODE,p=l.MAINNET_TYPE===Te.JITO_MEV,f={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?T.RPC:T.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?ot.DOUBLE:ot.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?g.JITO:m?g.AGAVE:g.SOLANA,TESTNET_SOLANA_VERSION:l.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:l.MAINNET_SOLANA_VERSION,NODE_VERSION:l.NODE_VERSION,TESTNET_DELINQUENT_STAKE:l.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:l.MAINNET_DELINQUENT_STAKE,COMMISSION:l.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:l.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:l.STAKE_ACCOUNT,HARVEST_ACCOUNT:l.HARVEST_ACCOUNT,IS_MEV_MODE:l.IS_MEV_MODE,RPC_URL:l.RPC_URL,KEYPAIR_PATH:l.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:l.DISCORD_WEBHOOK_URL,AUTO_UPDATE:l.AUTO_UPDATE,AUTO_RESTART:l.AUTO_RESTART,IS_DUMMY:!1,API_KEY:""};await k(f)}if(a.config){if(await k({TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et}),n){let l=e?jt:H;await Yt({version:l,tag:`v${l}-jito`})}console.log(Yr.green("\u2714\uFE0F Updated Solc Config Default Solana Version\n\n You can now run `solc i` to install the latest version"));return}if(a.firewall){await kr();return}if(a.background){let l=a.version;if(await k({TESTNET_SOLANA_VERSION:tt,MAINNET_SOLANA_VERSION:et}),n){we(),await Yt({version:l,tag:`v${l}-jito`}),await uo(c,!0);return}await ye(l),await uo(e?5:5,!0);return}else if(a.commission){let l=await Or();Nr(l.commission,e)}else gr()})},"updateCommands");import{spawnSync as uc}from"node:child_process";var Br=r(t=>{try{let{log:e}=pt(),o=`tail -f ${e}`;t.error?o+=" | grep '\\(WARN\\|ERR\\)'":t.info?o+=" | grep INFO":t.warning&&(o+=" | grep WARN"),console.log(o);let n=uc(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 Gr=r(()=>{h.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(t=>{Br(t)})},"logCommands");import ct from"chalk";import{spawnSync as fc}from"child_process";import{homedir as hc}from"os";var Ce=r(t=>{let e=hc(),o=A(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=mt.TESTNET,c=t.COMMISSION;t.NETWORK===u.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=mt.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===u.TESTNET&&(l=mt.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;fc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ie}from"child_process";import{existsSync as zr,readdirSync as yc,rmSync as Sc}from"fs";import{homedir as Tc}from"os";import Wr from"path";var Le=r(t=>{let e=[],o=0;t.NODE_TYPE===T.RPC&&(e=[v.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[v.TESTNET_VALIDATOR_KEY,v.TESTNET_VALITATOR_AUTHORITY_KEY,v.TESTNET_VALIDATOR_VOTE_KEY,v.MAINNET_VALIDATOR_KEY,v.MAINNET_VALITATOR_AUTHORITY_KEY,v.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[v.MAINNET_VALIDATOR_KEY,v.MAINNET_VALITATOR_AUTHORITY_KEY,v.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=yc("./").filter(l=>l.endsWith("SV.json")),a=Tc(),i=Wr.join(a,"unstaked-identity.json");zr(i)&&Ie(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=Wr.join(a,e[c]);if(c++,zr(m)){console.log(`${m} is already exist!`),Sc(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 Qr}from"child_process";var gc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
25
+ `;await V(f)}return p}return!0},"autoUpdate"),jr=mc;import{homedir as pc}from"os";import{readFile as dc,writeFile as Yr}from"fs/promises";import{existsAsync as uc}from"@skeet-framework/utils";var _=r(async t=>{let o=`${pc()}/${vt}`;await uc(o)||(console.log("Creating default config file at",o),await Yr(o,JSON.stringify(K,null,2)));let s={...JSON.parse(await dc(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Yr(o,a)},"updateDefaultConfig");var fc={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solc commands",subcmdHelp:"Display help for subcommands",server:"Open solc 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 Solc AA",installer:"Please select an option:",unstake:"UnStake"},ve=fc;var hc={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:"solc \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:"solc \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:"Solc\u30A8\u30F3\u30C9\u30ED\u30FC\u30EB AA \u3092\u8868\u793A",installer:"\u4EE5\u4E0B\u304B\u3089\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:"},Br=hc;var yc={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solc installer \u{1F525}",description:"solc is born and ready for running Solana Validator Nodes \u{1F680}"}},Ce=yc;var Sc={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 solc \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"}},Jr=Sc;var Ie=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Le=[[],[") 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 Gr=[") \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"],zr=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var Tc={server:{description:"Open solc 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 Solc AA"}},Pe=Tc;var gc={server:{description:"Open solc 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 Solc AA"}},Wr=gc;var xe=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var qr=[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u4F5C\u6210",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"];var Ec=r(t=>{let e={cmds:ve,subCmds:Pe,logs:Ce,installer:Ie,installerSub:Le,clientCmds:xe};switch(t){case Et.EN:e={cmds:ve,subCmds:Pe,logs:Ce,installer:Ie,installerSub:Le,clientCmds:xe};break;case Et.JA:e={cmds:Br,subCmds:Wr,logs:Jr,installer:Gr,installerSub:zr,clientCmds:qr};break;default:e={cmds:ve,subCmds:Pe,logs:Ce,installer:Ie,installerSub:Le,clientCmds:xe}}return e},"readLocale"),Qr=Ec;import{existsSync as Nc,readFileSync as Oc,writeFileSync as Xr}from"fs";import{readFileSync as Ac,writeFileSync as wc}from"fs";import{homedir as _c}from"os";var xt=r(t=>{let o=`${_c()}/${ot.CONFIG}`,s={...JSON.parse(Ac(o,"utf8")),...t},a=JSON.stringify(s,null,2);wc(o,a)},"updateSolvConfig");import{homedir as Rc}from"os";var Zr=r(()=>{let e=`${Rc()}/${ot.CONFIG}`;Nc(e)||(Xr(e,JSON.stringify(H,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."),Xr(e,JSON.stringify(H,null,2)),o=H}let n=Qr(o.LANG);return o.RPC_URL||(o.RPC_URL=H.RPC_URL,xt({RPC_URL:H.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,xt({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",xt({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var en=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===g.RPC,n=t.VALIDATOR_TYPE===S.JITO,s=e?et:D;n&&(s=Y,e&&(s=zt)),o&&(s=gt,n&&(s=fr)),h.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${s}`,s).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solc Config",!1).option("--config","Update Solc 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(tn.white(`Current solc version: ${i}`)),a.auto){await jr(t);return}if(a.migrateConfig){let l=Zr().config,m=l.SOLANA_NETWORK===dt.TESTNET,d=l.SOLV_TYPE===we.RPC_NODE,p=l.MAINNET_TYPE===_e.JITO_MEV,f={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?g.RPC:g.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?tt.DOUBLE:tt.SINGLE,RPC_TYPE:d?L.JITO:L.NONE,VALIDATOR_TYPE:p?S.JITO:m?S.AGAVE:S.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:""};await _(f)}if(a.config){if(await _({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:D}),n){let l=e?zt:Y;await Wt({version:l,tag:`v${l}-jito`})}console.log(tn.green("\u2714\uFE0F Updated Solc Config Default Solana Version\n\n You can now run `solc i` to install the latest version"));return}if(a.firewall){await Ur();return}if(a.background){let l=a.version;if(await _({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:D}),n){Re(),await Wt({version:l,tag:`v${l}-jito`}),await _o(c,!0);return}await Ae(l),await _o(e?5:5,!0);return}else if(a.commission){let l=await Kr();Dr(l.commission,e)}else $r()})},"updateCommands");import{spawnSync as kc}from"node:child_process";var on=r(t=>{try{let{log:e}=ut(),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=kc(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 rn=r(()=>{h.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(t=>{on(t)})},"logCommands");import lt from"chalk";import{spawnSync as vc}from"child_process";import{homedir as Cc}from"os";var Ve=r(t=>{let e=Cc(),o=w(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=dt.TESTNET,c=t.COMMISSION;t.NETWORK===u.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=dt.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===u.TESTNET&&(l=dt.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;vc(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as $e}from"child_process";import{existsSync as nn,readdirSync as Ic,rmSync as Lc}from"fs";import{homedir as Pc}from"os";import sn from"path";var be=r(t=>{let e=[],o=0;t.NODE_TYPE===g.RPC&&(e=[k.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[k.TESTNET_VALIDATOR_KEY,k.TESTNET_VALITATOR_AUTHORITY_KEY,k.TESTNET_VALIDATOR_VOTE_KEY,k.MAINNET_VALIDATOR_KEY,k.MAINNET_VALITATOR_AUTHORITY_KEY,k.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[k.MAINNET_VALIDATOR_KEY,k.MAINNET_VALITATOR_AUTHORITY_KEY,k.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;$e(n,{shell:!0,stdio:"ignore"});let s=Ic("./").filter(l=>l.endsWith("SV.json")),a=Pc(),i=sn.join(a,"unstaked-identity.json");nn(i)&&$e(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=sn.join(a,e[c]);if(c++,nn(m)){console.log(`${m} is already exist!`),Lc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;$e(d,{shell:!0,stdio:"inherit"})}$e("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 cn}from"child_process";var xc=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,19 +37,17 @@ Environment=RUST_LOG=info
37
37
  Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
38
38
 
39
39
  [Install]
40
- WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),qr=gc;import Ec from"inquirer";import wc from"chalk";var Ac=r(async()=>{let t=await Ec.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"}]);Qr(`sudo apt-get install unzip wget -y
40
+ WantedBy=multi-user.target`;return{filePath:s,body:a}},"jupiterAPIService"),an=xc;import Vc from"inquirer";import $c from"chalk";var bc=r(async()=>{let t=await Vc.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"}]);cn(`sudo apt-get install unzip wget -y
41
41
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
42
42
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
43
43
  chmod +x jupiter-swap-api
44
- rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=qr(t.rpcUrl,t.grpcUrl,t.grpcToken);Qr(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log(wc.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}=an(t.rpcUrl,t.grpcUrl,t.grpcToken);cn(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log($c.white(`\u{1F7E2} Jupiter Swap API Setup Completed
45
45
 
46
- $ solc jupiter --help`))},"jupiterAPISetup"),Xr=Ac;import{existsAsync as _c}from"@skeet-framework/utils";import{readFile as Nc,writeFile as Zr}from"fs/promises";import{homedir as Oc}from"os";import kc from"path";var gt=r(async()=>{let t=Oc(),e=kc.join(t,X.JITO_CONFIG);await _c(e)||(await Zr(e,JSON.stringify(at,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await Nc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await Zr(e,JSON.stringify(at,null,2)),o=at}return o},"readOrCreateJitoConfig");import{spawnSync as vc}from"child_process";var Gt=r(()=>{vc("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Et from"chalk";import xe from"inquirer";import Rc from"inquirer";var tn=r(async()=>{let e=Object.keys(G),o=await Rc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=G[n];return{version:at.version,tag:at.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");import Cc from"inquirer";var Ic=r(async()=>{let t=Object.keys(G);return(await Cc.prompt([{name:"region",type:"list",message:"Select Jito region for Firedancer",choices:t,default:"Amsterdam"}])).region},"askJitoRegion"),en=Ic;import{promises as on,existsSync as Lc}from"fs";import zt from"path";import{fileURLToPath as Pc}from"url";var rn=zt.dirname(Pc(import.meta.url)),Pe="cli/setup/template/firedancer/configTomlMainnet",xc=r(()=>[zt.resolve(rn,`../${Pe}.ts`),zt.resolve(rn,`../${Pe}.js`),zt.join(process.cwd(),`src/${Pe}.ts`),zt.join(process.cwd(),`dist/${Pe}.js`)],"buildSearchPaths"),Vc=r(()=>{let t=xc();for(let e of t)if(Lc(e))return e;throw new Error(`Unable to locate Firedancer template. Checked:
47
- ${t.join(`
48
- `)}`)},"resolveDefaultTemplatePath"),$c=r(async(t,e=Vc())=>{let o=await on.readFile(e,"utf-8"),n=o.replace(/url\s*=\s*\\\"[^\\\"]*\\\"/,`url = \\"${t}\\"`);return o===n?!1:(await on.writeFile(e,n,"utf-8"),!0)},"updateFiredancerBundleUrl"),nn=$c;var bc=r(async()=>{try{let t=g.NONE,e=$.AGAVE,o=it.COMMISSION,n=!1,s=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:vr,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Rr,default:T.RPC}]);if(s.nodeType===T.VALIDATOR){let c=s.network===u.MAINNET?[g.JITO,g.SOLANA,g.FRANKENDANCER]:[g.AGAVE,g.JITO,g.FRANKENDANCER];t=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:g.AGAVE}).then(l=>l.validatorType),e=$.NONE}if(s.nodeType===T.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Cr,default:$.AGAVE}).then(c=>c.rpcType)),s.nodeType===T.VALIDATOR){let c=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${it.COMMISSION}%)'`,default:it.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(o=c.commission,n=c.isDummy,t===g.JITO){await gt();let l=await tn();await Yt(l)}else if(t===g.FRANKENDANCER&&s.network===u.MAINNET){let l=await en(),{BLOCK_ENGINE_URL:m}=G[l],d=await nn(m);console.log(d?Et.green(`Updated Firedancer mainnet template URL to ${m} (region: ${l})`):Et.yellow("No change applied to Firedancer mainnet template (URL already set?)"))}}let{network:a,nodeType:i}=s;return console.log(Et.white("Network:",a)),console.log(Et.white("Node Type:",i)),console.log(Et.white("Validator Type:",t)),console.log(Et.white("RPC Type:",e)),i===T.VALIDATOR&&console.log(Et.white("Commission:",o)),await k({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),sn=bc;import{spawnSync as Kc}from"child_process";var Wt=r((t=H)=>{let e=`v${t}-jito`;Kc(`sh -c "$(curl -sSfL https://release.jito.wtf/${e}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var an=r(()=>`#!/bin/bash
46
+ $ solc jupiter --help`))},"jupiterAPISetup"),ln=bc;import{existsAsync as Dc}from"@skeet-framework/utils";import{readFile as Kc,writeFile as mn}from"fs/promises";import{homedir as Uc}from"os";import Mc from"path";var At=r(async()=>{let t=Uc(),e=Mc.join(t,ot.JITO_CONFIG);await Dc(e)||(await mn(e,JSON.stringify(ct,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await Kc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await mn(e,JSON.stringify(ct,null,2)),o=ct}return o},"readOrCreateJitoConfig");import{spawnSync as Fc}from"child_process";var Xt=r(()=>{Fc("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import wt from"chalk";import De from"inquirer";import Hc from"inquirer";var pn=r(async()=>{let e=Object.keys(W),o=await Hc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=W[n];return{version:ct.version,tag:ct.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");import jc from"inquirer";var Yc=r(async()=>{let t=Object.keys(W);return(await jc.prompt([{name:"region",type:"list",message:"Select Jito region for Firedancer",choices:t,default:"Amsterdam"}])).region},"askJitoRegion"),dn=Yc;var Bc=r(async(t,e)=>(await v()).FRANKENDANCER_BLOCK_ENGINE_URL===t?!1:(await _({FRANKENDANCER_BLOCK_ENGINE_URL:t}),!0),"updateFiredancerBundleUrl"),un=Bc;var Jc=r(async()=>{try{let t=S.NONE,e=L.AGAVE,o=K.COMMISSION,n=!1,s=await De.prompt([{name:"network",type:"list",message:"Choose Network",choices:pr,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:dr,default:g.RPC}]);if(s.nodeType===g.VALIDATOR){let c=s.network===u.MAINNET?[S.JITO,S.SOLANA,S.FRANKENDANCER]:[S.AGAVE,S.JITO,S.FRANKENDANCER];t=await De.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:S.AGAVE}).then(l=>l.validatorType),e=L.NONE}if(s.nodeType===g.RPC&&(e=await De.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:ur,default:L.AGAVE}).then(c=>c.rpcType)),s.nodeType===g.VALIDATOR){let c=await De.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${K.COMMISSION}%)'`,default:K.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===S.JITO){await At();let l=await pn();await Wt(l)}else if(t===S.FRANKENDANCER&&s.network===u.MAINNET){let l=await dn(),{BLOCK_ENGINE_URL:m}=W[l],d=await un(m);console.log(d?wt.green(`Updated Firedancer mainnet template URL to ${m} (region: ${l})`):wt.yellow("No change applied to Firedancer mainnet template (URL already set?)"))}}let{network:a,nodeType:i}=s;return console.log(wt.white("Network:",a)),console.log(wt.white("Node Type:",i)),console.log(wt.white("Validator Type:",t)),console.log(wt.white("RPC Type:",e)),i===g.VALIDATOR&&console.log(wt.white("Commission:",o)),await _({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),fn=Jc;import{spawnSync as Gc}from"child_process";var Zt=r((t=Y)=>{let e=`v${t}-jito`;Gc(`sh -c "$(curl -sSfL https://release.jito.wtf/${e}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var hn=r(()=>`#!/bin/bash
49
47
  exec agave-validator \\
50
- --identity ${O} \\
51
- --log ${W} \\
52
- --accounts ${Q} \\
48
+ --identity ${R} \\
49
+ --log ${Q} \\
50
+ --accounts ${Z} \\
53
51
  --ledger ${y} \\
54
52
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
55
53
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
@@ -83,11 +81,11 @@ exec agave-validator \\
83
81
  --wal-recovery-mode skip_any_corrupted_record \\
84
82
  --use-snapshot-archives-at-startup when-newest \\
85
83
  --limit-ledger-size 400000000 \\
86
- `,"startJitoRPCScript");import{existsAsync as Mc}from"@skeet-framework/utils";import{writeFile as Fc}from"fs/promises";import{spawnSync as Dc}from"node:child_process";var Uc=r(()=>{let t=`sudo chmod +x ${q}`;Dc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),qt=Uc;var cn=r(()=>`#!/bin/bash
84
+ `,"startJitoRPCScript");import{existsAsync as qc}from"@skeet-framework/utils";import{writeFile as Qc}from"fs/promises";import{spawnSync as zc}from"node:child_process";var Wc=r(()=>{let t=`sudo chmod +x ${X}`;zc(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),te=Wc;var yn=r(()=>`#!/bin/bash
87
85
  exec agave-validator \\
88
- --identity ${O} \\
89
- --log ${W} \\
90
- --accounts ${Q} \\
86
+ --identity ${R} \\
87
+ --log ${Q} \\
88
+ --accounts ${Z} \\
91
89
  --ledger ${y} \\
92
90
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
93
91
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
@@ -118,13 +116,13 @@ exec agave-validator \\
118
116
  --wal-recovery-mode skip_any_corrupted_record \\
119
117
  --use-snapshot-archives-at-startup when-newest \\
120
118
  --limit-ledger-size 400000000 \\
121
- `,"startRPCNodeScript");var Hc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case $.AGAVE:console.log("Agave RPC Node Setup"),kt(t.TESTNET_SOLANA_VERSION),o=cn();break;case $.JITO:console.log("JITO RPC Node Setup"),Wt(jt),o=an();break;default:console.log("Unknown RPC Node Setup");break}if(await Mc(q)){console.log("Startup script already exists. Skipping...");return}await Fc(q,o,"utf-8"),qt()},"setupRpcNode"),ln=Hc;import{spawnSync as jc}from"node:child_process";var Yc=r(t=>{jc(`sh -c "$(curl -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),Eo=Yc;var wo=r((t=1e3,e,o,n,s="agave-validator")=>`#!/bin/bash
119
+ `,"startRPCNodeScript");var Xc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case L.AGAVE:console.log("Agave RPC Node Setup"),Lt(t.TESTNET_SOLANA_VERSION),o=yn();break;case L.JITO:console.log("JITO RPC Node Setup"),Zt(zt),o=hn();break;default:console.log("Unknown RPC Node Setup");break}if(await qc(X)){console.log("Startup script already exists. Skipping...");return}await Qc(X,o,"utf-8"),te()},"setupRpcNode"),Sn=Xc;import{spawnSync as Zc}from"node:child_process";var tl=r(t=>{Zc(`sh -c "$(curl -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),ko=tl;var vo=r((t=1e3,e,o,n,s="agave-validator")=>`#!/bin/bash
122
120
  exec ${s} \\
123
- --identity ${O} \\
124
- --vote-account ${de} \\
121
+ --identity ${R} \\
122
+ --vote-account ${ye} \\
125
123
  --authorized-voter ${b} \\
126
- --log ${W} \\
127
- --accounts ${Q} \\
124
+ --log ${Q} \\
125
+ --accounts ${Z} \\
128
126
  --ledger ${y} \\
129
127
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
130
128
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
@@ -151,13 +149,13 @@ exec ${s} \\
151
149
  --use-snapshot-archives-at-startup when-newest \\
152
150
  --limit-ledger-size \\
153
151
  --block-production-method central-scheduler \\
154
- `,"startJitoValidatorScript");var mn=r((t="agave-validator")=>`#!/bin/bash
152
+ `,"startJitoValidatorScript");var Tn=r((t="agave-validator")=>`#!/bin/bash
155
153
  exec ${t} \\
156
- --identity ${O} \\
157
- --vote-account ${de} \\
154
+ --identity ${R} \\
155
+ --vote-account ${ye} \\
158
156
  --authorized-voter ${b} \\
159
- --log ${W} \\
160
- --accounts ${Q} \\
157
+ --log ${Q} \\
158
+ --accounts ${Z} \\
161
159
  --ledger ${y} \\
162
160
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
163
161
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
@@ -177,13 +175,13 @@ exec ${t} \\
177
175
  --use-snapshot-archives-at-startup when-newest \\
178
176
  --limit-ledger-size \\
179
177
  --block-production-method central-scheduler \\
180
- `,"startMainnetValidatorScript");var Ao=r(()=>`#!/bin/bash
178
+ `,"startMainnetValidatorScript");var Co=r(()=>`#!/bin/bash
181
179
  exec agave-validator \\
182
- --identity ${O} \\
183
- --vote-account ${Bo} \\
184
- --authorized-voter ${L} \\
185
- --log ${W} \\
186
- --accounts ${Q} \\
180
+ --identity ${R} \\
181
+ --vote-account ${or} \\
182
+ --authorized-voter ${P} \\
183
+ --log ${Q} \\
184
+ --accounts ${Z} \\
187
185
  --ledger ${y} \\
188
186
  --entrypoint entrypoint.testnet.solana.com:8001 \\
189
187
  --entrypoint entrypoint2.testnet.solana.com:8001 \\
@@ -200,13 +198,13 @@ exec agave-validator \\
200
198
  --use-snapshot-archives-at-startup when-newest \\
201
199
  --limit-ledger-size \\
202
200
  --block-production-method central-scheduler \\
203
- `,"startTestnetAgaveValidatorScript");import{existsAsync as pn}from"@skeet-framework/utils";import{writeFile as dn}from"fs/promises";var Jc=r(async t=>{let{NETWORK:e}=t;e===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await Bc(t)):e===u.TESTNET?(console.log("Testnet Validator Node Setup"),await Gc(t)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Bc=r(async t=>{let{VALIDATOR_TYPE:e,MAINNET_SOLANA_VERSION:o}=t,n="";switch(e){case g.SOLANA:Eo(o),n=mn();break;case g.JITO:console.log("JITO Validator Setup for Mainnet");let s=await gt();Wt(o||H),n=wo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await pn(q)){console.log("Startup script already exists. Skipping...");return}await dn(q,n,"utf-8"),qt()},"setupMainnetValidator"),Gc=r(async t=>{let{VALIDATOR_TYPE:e}=t,o="";switch(e){case g.SOLANA:Eo(t.TESTNET_SOLANA_VERSION),o=Ao();case g.AGAVE:console.log("Agave Validator Setup for Testnet"),kt(t.TESTNET_SOLANA_VERSION),o=Ao();break;case g.JITO:console.log("JITO Validator Setup for Testnet");let n=await gt();Wt(t.TESTNET_SOLANA_VERSION),o=wo(n.commissionBps,n.relayerUrl,n.blockEngineUrl,n.shredReceiverAddr);break;default:console.log("Unknown Validator Type for Testnet");break}if(await pn(q)){console.log("Startup script already exists. Skipping...");return}await dn(q,o,"utf-8"),qt()},"setupTestnetValidator"),un=Jc;import Un from"chalk";import{execSync as fn}from"node:child_process";function hn(t){try{fn(`test -d ${t}`),console.log(`${t} already exists.`)}catch{fn(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(hn,"createDirectoryIfNotExists");var yn=r(()=>{try{let t=[R.ACCOUNTS,R.LEDGER];for(let e of t)hn(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as zc}from"child_process";function Wc(){let e=zc("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
204
- `).slice(1),o=[],n=e.map(p=>p.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c="";for(let p of e){let[f,S,w]=p.trim().split(/\s+/);if(!f||!S)continue;let _=parseInt(S,10);if(isNaN(_))continue;let N=w!==void 0&&w!=="";w==="/"&&(c=f.replace(/[0-9]*$/,""));let z=n.some(V=>V!==f&&V.startsWith(f));_>=400*1024*1024*1024&&o.push({name:f,size:_,mountpoint:w||"",isMounted:N,hasPartition:z})}let l=n.filter(p=>p.startsWith(c)),d=o.filter(p=>!l.includes(p.name)).sort((p,f)=>f.size-p.size);if(d.length>0){let p=d[0];if(p.size>=850*1024*1024*1024&&!p.isMounted&&(s=!0),p.size>=1250*1024*1024*1024&&p.isMounted&&(i=!0),d.length>1){let f=d[1];f.size>=400*1024*1024*1024&&!f.isMounted&&(a=!0)}}return{disks:d,has850GB:s,has400GB:a,hasUsed1250GB:i}}r(Wc,"getPreferredDisks");var Qt=Wc;import{spawnSync as Sn}from"child_process";var Xt=r(t=>{if(Sn(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return Sn(o,{shell:!0,stdio:"inherit"}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as _o}from"child_process";var Ve=r((t,e="",o=!1)=>{let n=o?R.LEDGER:R.ROOT,s=`${t} ${n} ext4 auto 0 0`,a=`${t} ${R.LEDGER} ext4 auto 0 0
205
- ${e} ${R.ACCOUNTS} ext4 auto 0 0
206
- `,c=[e!==""?a:s],m=_o("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,d=[];for(let p of c)m.includes(p)||d.push(p);if(d.length){let p=`echo "${d.join(`
207
- `)}" | sudo tee -a /etc/fstab`;_o(p,{shell:!0,encoding:"utf8"}),_o("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
201
+ `,"startTestnetAgaveValidatorScript");import{existsAsync as gn}from"@skeet-framework/utils";import{writeFile as En}from"fs/promises";var el=r(async t=>{let{NETWORK:e}=t;e===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await ol(t)):e===u.TESTNET?(console.log("Testnet Validator Node Setup"),await rl(t)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),ol=r(async t=>{let{VALIDATOR_TYPE:e,MAINNET_SOLANA_VERSION:o}=t,n="";switch(e){case S.SOLANA:ko(o),n=Tn();break;case S.JITO:console.log("JITO Validator Setup for Mainnet");let s=await At();Zt(o||Y),n=vo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await gn(X)){console.log("Startup script already exists. Skipping...");return}await En(X,n,"utf-8"),te()},"setupMainnetValidator"),rl=r(async t=>{let{VALIDATOR_TYPE:e}=t,o="";switch(e){case S.SOLANA:ko(t.TESTNET_SOLANA_VERSION),o=Co();case S.AGAVE:console.log("Agave Validator Setup for Testnet"),Lt(t.TESTNET_SOLANA_VERSION),o=Co();break;case S.JITO:console.log("JITO Validator Setup for Testnet");let n=await At();Zt(t.TESTNET_SOLANA_VERSION),o=vo(n.commissionBps,n.relayerUrl,n.blockEngineUrl,n.shredReceiverAddr);break;default:console.log("Unknown Validator Type for Testnet");break}if(await gn(X)){console.log("Startup script already exists. Skipping...");return}await En(X,o,"utf-8"),te()},"setupTestnetValidator"),An=el;import Gn from"chalk";import{execSync as wn}from"node:child_process";function _n(t){try{wn(`test -d ${t}`),console.log(`${t} already exists.`)}catch{wn(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(_n,"createDirectoryIfNotExists");var Nn=r(()=>{try{let t=[C.ACCOUNTS,C.LEDGER];for(let e of t)_n(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as nl}from"child_process";function sl(){let e=nl("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
202
+ `).slice(1),o=[],n=e.map(p=>p.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c="";for(let p of e){let[f,T,A]=p.trim().split(/\s+/);if(!f||!T)continue;let N=parseInt(T,10);if(isNaN(N))continue;let O=A!==void 0&&A!=="";A==="/"&&(c=f.replace(/[0-9]*$/,""));let q=n.some($=>$!==f&&$.startsWith(f));N>=400*1024*1024*1024&&o.push({name:f,size:N,mountpoint:A||"",isMounted:O,hasPartition:q})}let l=n.filter(p=>p.startsWith(c)),d=o.filter(p=>!l.includes(p.name)).sort((p,f)=>f.size-p.size);if(d.length>0){let p=d[0];if(p.size>=850*1024*1024*1024&&!p.isMounted&&(s=!0),p.size>=1250*1024*1024*1024&&p.isMounted&&(i=!0),d.length>1){let f=d[1];f.size>=400*1024*1024*1024&&!f.isMounted&&(a=!0)}}return{disks:d,has850GB:s,has400GB:a,hasUsed1250GB:i}}r(sl,"getPreferredDisks");var ee=sl;import{spawnSync as On}from"child_process";var oe=r(t=>{if(On(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return On(o,{shell:!0,stdio:"inherit"}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as Io}from"child_process";var Ke=r((t,e="",o=!1)=>{let n=o?C.LEDGER:C.ROOT,s=`${t} ${n} ext4 auto 0 0`,a=`${t} ${C.LEDGER} ext4 auto 0 0
203
+ ${e} ${C.ACCOUNTS} ext4 auto 0 0
204
+ `,c=[e!==""?a:s],m=Io("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,d=[];for(let p of c)m.includes(p)||d.push(p);if(d.length){let p=`echo "${d.join(`
205
+ `)}" | sudo tee -a /etc/fstab`;Io(p,{shell:!0,encoding:"utf8"}),Io("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
208
206
  ${d.join(`
209
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as qc}from"child_process";var Tn=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=qc(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Qc=r(async()=>{let t=Qt(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await k({MNT_DISK_TYPE:ot.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=Xt(o),a=Xt(n),i=s?o:"",c=a?n:"",l=!1;i===""&&c&&(i=c,c="",l=!0),Ve(i,c,l)}else if(console.log("Setting up SINGLE DISK..."),await k({MNT_DISK_TYPE:ot.SINGLE}),e.includes("/mnt")){Tn(e);let o="/dev/"+t.disks[0].name;Xt(o),Ve(o)}else{let o="/dev/"+t.disks[0].name;Xt(o),Ve(o)}},"mountDirs"),gn=Qc;import{spawnSync as Xc}from"child_process";var En=r(()=>{let t=[`sudo mkdir -p ${R.ROOT}`,`sudo chown -R solc:solc ${R.ROOT}`,`sudo chmod -R 755 ${R.ROOT}`,`sudo mkdir -p ${R.ACCOUNTS}`,`sudo chown -R solc:solc ${R.ACCOUNTS}`,`sudo chmod -R 755 ${R.ACCOUNTS}`,`sudo mkdir -p ${R.LEDGER}`,`sudo chown -R solc:solc ${R.LEDGER}`,`sudo chmod -R 755 ${R.LEDGER}`];for(let e of t)Xc(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as $e}from"child_process";import{existsSync as Zc}from"fs";function wn(){if(!Zc(P.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
207
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as al}from"child_process";var Rn=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=al(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var il=r(async()=>{let t=ee(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await _({MNT_DISK_TYPE:tt.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=oe(o),a=oe(n),i=s?o:"",c=a?n:"",l=!1;i===""&&c&&(i=c,c="",l=!0),Ke(i,c,l)}else if(console.log("Setting up SINGLE DISK..."),await _({MNT_DISK_TYPE:tt.SINGLE}),e.includes("/mnt")){Rn(e);let o="/dev/"+t.disks[0].name;oe(o),Ke(o)}else{let o="/dev/"+t.disks[0].name;oe(o),Ke(o)}},"mountDirs"),kn=il;import{spawnSync as cl}from"child_process";var vn=r(()=>{let t=[`sudo mkdir -p ${C.ROOT}`,`sudo chown -R solc:solc ${C.ROOT}`,`sudo chmod -R 755 ${C.ROOT}`,`sudo mkdir -p ${C.ACCOUNTS}`,`sudo chown -R solc:solc ${C.ACCOUNTS}`,`sudo chmod -R 755 ${C.ACCOUNTS}`,`sudo mkdir -p ${C.LEDGER}`,`sudo chown -R solc:solc ${C.LEDGER}`,`sudo chmod -R 755 ${C.LEDGER}`];for(let e of t)cl(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as Ue}from"child_process";import{existsSync as ll}from"fs";function Cn(){if(!ll(x.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
210
208
  # Increase UDP buffer sizes
211
209
  net.core.rmem_default = 134217728
212
210
  net.core.rmem_max = 134217728
@@ -221,7 +219,7 @@ fs.nr_open = 1000000
221
219
  `,e=`
222
220
  # Increase process file descriptor count limit
223
221
  * - nofile 1000000
224
- `;$e(`echo "${t}" | sudo tee ${P.SOL_SYSTEM_CONFIG21} > /dev/null`),$e(`sudo sysctl -p ${P.SOL_SYSTEM_CONFIG21}`),$e(`echo "DefaultLimitNOFILE=1000000" | sudo tee -a ${P.SOL_SYSTEM_CONF}`),$e(`echo "${e}" | sudo tee ${P.SOL_NOFILES_CONF} > /dev/null`)}}r(wn,"setupSystemd");var An=r((t=M.USERNAME)=>{let{log:e}=pt();return`${e} {
222
+ `;Ue(`echo "${t}" | sudo tee ${x.SOL_SYSTEM_CONFIG21} > /dev/null`),Ue(`sudo sysctl -p ${x.SOL_SYSTEM_CONFIG21}`),Ue(`echo "DefaultLimitNOFILE=1000000" | sudo tee -a ${x.SOL_SYSTEM_CONF}`),Ue(`echo "${e}" | sudo tee ${x.SOL_NOFILES_CONF} > /dev/null`)}}r(Cn,"setupSystemd");var In=r((t=H.USERNAME)=>{let{log:e}=ut();return`${e} {
225
223
  su ${t} ${t}
226
224
  daily
227
225
  rotate 1
@@ -232,7 +230,7 @@ fs.nr_open = 1000000
232
230
  systemctl kill -s USR1 solv.service
233
231
  endscript
234
232
  }
235
- `},"logRotates");import{existsSync as tl}from"fs";import{execSync as el}from"child_process";function _n(){if(console.log("Creating logrotate configuration for solana"),tl(P.SOL_LOGROTATE))console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.");else{let t=An();el(`echo "${t}" | sudo tee ${P.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(_n,"setupLogrotate");var ol="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",rl="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",nl=`/home/${M.USERNAME}/.local/share/solana/install/active_release/bin`,Nn=r((t=!0)=>{let{scriptPath:e}=pt(t),o=t?rl:ol,n=nl;return`[Unit]
233
+ `},"logRotates");import{existsSync as ml}from"fs";import{execSync as pl}from"child_process";function Ln(){if(console.log("Creating logrotate configuration for solana"),ml(x.SOL_LOGROTATE))console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration.");else{let t=In();pl(`echo "${t}" | sudo tee ${x.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}r(Ln,"setupLogrotate");var dl="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",ul="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",fl=`/home/${H.USERNAME}/.local/share/solana/install/active_release/bin`,Pn=r((t=!0)=>{let{scriptPath:e}=ut(t),o=t?ul:dl,n=fl;return`[Unit]
236
234
  Description=Solana Validator
237
235
  After=network.target
238
236
  StartLimitIntervalSec=0
@@ -244,15 +242,15 @@ RestartSec=1
244
242
  LimitNOFILE=1000000
245
243
  LimitMEMLOCK=2000000000
246
244
  LogRateLimitIntervalSec=0
247
- User=${M.USERNAME}
245
+ User=${H.USERNAME}
248
246
  Environment=PATH=${n}
249
- WorkingDirectory=${D.ROOT}
247
+ WorkingDirectory=${M.ROOT}
250
248
  Environment="${o}"
251
249
  ExecStart=${e}
252
250
 
253
251
 
254
252
  [Install]
255
- WantedBy=multi-user.target`},"solvService");import{execSync as sl}from"child_process";function On(t=!0){console.log("Creating solvService configuration for solana");let e=Nn(t);sl(`echo "${e}" | sudo tee ${P.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(On,"setupSolvService");var kn=r((t=!0)=>{_n(),On(t),wn()},"makeServices");import{spawnSync as No}from"node:child_process";var vn=r(t=>{try{Le(t);let e=t.NETWORK;return e===u.TESTNET?(No(`solana config set --url ${e} -k ${L}`,{shell:!0,stdio:"inherit"}),No(`solana airdrop 1 --url ${e} -k ${L}`,{shell:!0,stdio:"inherit"})):No(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==T.RPC&&Ce(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as Rn}from"node:child_process";var be=r((t=!1)=>{try{if(t){let o=["aria2c -x16 -s16 --force-sequential=true","-d /mnt/ledger ","https://snapshots.avorio.network/testnet/snapshot.tar.bz2","https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2"].join(" ");Rn(o,{shell:!0,stdio:"inherit"});return}let e=["sudo apt-get update && sudo apt-get install -y aria2","&&","aria2c -x16 -s16 --force-sequential=true","-d /mnt/ledger","https://snapshots.avorio.network/mainnet-beta/snapshot.tar.bz2","https://snapshots.avorio.network/mainnet-beta/incremental-snapshot.tar.bz2"].join(" ");Rn(e,{shell:!0,stdio:"inherit"})}catch(e){throw new Error(`getSnapshot Error: ${e}`)}},"getSnapshot");import{spawnSync as al}from"node:child_process";var Ke=r(t=>{let o=`sudo systemctl start ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`;al(o,{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as il}from"node:child_process";var cl=r(()=>{try{il('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Cn=cl;import Oo from"fs";import{promisify as Ln}from"util";import{execSync as In}from"child_process";var ll=Ln(Oo.readFile),ml=Ln(Oo.access),De="/etc/sysctl.conf",pl=`# set default and maximum socket buffer sizes to 128MB
253
+ WantedBy=multi-user.target`},"solvService");import{execSync as hl}from"child_process";function xn(t=!0){console.log("Creating solvService configuration for solana");let e=Pn(t);hl(`echo "${e}" | sudo tee ${x.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(xn,"setupSolvService");var Vn=r((t=!0)=>{Ln(),xn(t),Cn()},"makeServices");import{spawnSync as Lo}from"node:child_process";var $n=r(t=>{try{be(t);let e=t.NETWORK;return e===u.TESTNET?(Lo(`solana config set --url ${e} -k ${P}`,{shell:!0,stdio:"inherit"}),Lo(`solana airdrop 1 --url ${e} -k ${P}`,{shell:!0,stdio:"inherit"})):Lo(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==g.RPC&&Ve(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as bn}from"node:child_process";var Me=r((t=!1)=>{try{if(t){let o=["aria2c -x16 -s16 --force-sequential=true","-d /mnt/ledger ","https://snapshots.avorio.network/testnet/snapshot.tar.bz2","https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2"].join(" ");bn(o,{shell:!0,stdio:"inherit"});return}let e=["sudo apt-get update && sudo apt-get install -y aria2","&&","aria2c -x16 -s16 --force-sequential=true","-d /mnt/ledger","https://snapshots.avorio.network/mainnet-beta/snapshot.tar.bz2","https://snapshots.avorio.network/mainnet-beta/incremental-snapshot.tar.bz2"].join(" ");bn(e,{shell:!0,stdio:"inherit"})}catch(e){throw new Error(`getSnapshot Error: ${e}`)}},"getSnapshot");import{spawnSync as yl}from"node:child_process";var Fe=r(t=>{let o=`sudo systemctl start ${t.VALIDATOR_TYPE===S.FRANKENDANCER?"frankendancer":"solv"}`;yl(o,{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as Sl}from"node:child_process";var Tl=r(()=>{try{Sl('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Dn=Tl;import Po from"fs";import{promisify as Un}from"util";import{execSync as Kn}from"child_process";var gl=Un(Po.readFile),El=Un(Po.access),He="/etc/sysctl.conf",Al=`# set default and maximum socket buffer sizes to 128MB
256
254
  net.core.rmem_default=134217728
257
255
  net.core.wmem_default=134217728
258
256
  net.core.rmem_max=134217728
@@ -263,23 +261,23 @@ net.ipv4.tcp_rmem=10240 87380 134217728
263
261
  net.ipv4.tcp_wmem=10240 87380 134217728
264
262
 
265
263
  # Enable TCP westwood for kernels greater than or equal to 2.6.13
266
- net.ipv4.tcp_congestion_control=westwood`;async function dl(){try{await ml(De,Oo.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${De} does not exist`)}try{let t=await ll(De,"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+=`
267
- ${pl}
268
- `,In(`echo "${e}" | sudo tee ${De} > /dev/null`),In("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(dl,"updateSysctlConfig");var Pn=dl;import{spawnSync as ul}from"child_process";var xn=r(()=>{ul("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as fl}from"node:child_process";var Vn=r(()=>{fl("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as $n}from"child_process";var bn=r((t=!1,e=!1)=>{t?yl():hl(e)},"createSymLink"),hl=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),$n(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),yl=r(()=>{$n("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import Ue from"chalk";var Sl=r(()=>{let t=`${Ue.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${Ue.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
264
+ net.ipv4.tcp_congestion_control=westwood`;async function wl(){try{await El(He,Po.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${He} does not exist`)}try{let t=await gl(He,"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+=`
265
+ ${Al}
266
+ `,Kn(`echo "${e}" | sudo tee ${He} > /dev/null`),Kn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(wl,"updateSysctlConfig");var Mn=wl;import{spawnSync as _l}from"child_process";var Fn=r(()=>{_l("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as Nl}from"node:child_process";var Hn=r(()=>{Nl("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as jn}from"child_process";var Yn=r((t=!1,e=!1)=>{t?Rl():Ol(e)},"createSymLink"),Ol=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),jn(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),Rl=r(()=>{jn("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import je from"chalk";var kl=r(()=>{let t=`${je.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${je.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
269
267
 
270
268
  We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
271
269
  It's our way of supporting the community and empowering you with fast, reliable connections.
272
270
 
273
271
  To get your free API key, simply join us through the link below:
274
272
 
275
- Validators DAO: ${Ue.white("`https://discord.gg/X4BgkBHavp`")}
273
+ Validators DAO: ${je.white("`https://discord.gg/X4BgkBHavp`")}
276
274
 
277
275
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
278
- `;console.log(Ue.cyan(e))},"rpcLog"),wt=Sl;import{spawnSync as nt}from"child_process";var Tl=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
276
+ `;console.log(je.cyan(e))},"rpcLog"),_t=kl;import{spawnSync as st}from"child_process";var vl=r(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
279
277
  sudo chmod -R 700 /mnt
280
278
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
281
279
  sudo chown -R solv:solv /mnt
282
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Kn=Tl;var gl=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
280
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Bn=vl;var Cl=r(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
283
281
  Description=Firedancer Solana
284
282
  After=network.target
285
283
  StartLimitIntervalSec=0
@@ -295,7 +293,7 @@ ExecStart=/home/solv/start-firedancer.sh
295
293
 
296
294
  [Install]
297
295
  WantedBy=multi-user.target
298
- `}),"firedancerService"),Dn=gl;var El=r(()=>({filePath:"/home/solv/firedancer/config.toml",body:`name = "solv"
296
+ `}),"firedancerService"),Jn=Cl;var Il=r(()=>({filePath:"/home/solv/firedancer/config.toml",body:`name = "solv"
299
297
  user = "solv"
300
298
  scratch_directory = "/home/{user}"
301
299
  dynamic_port_range = "8900-9000"
@@ -367,7 +365,7 @@ dynamic_port_range = "8900-9000"
367
365
  tip_distribution_authority = "GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib"
368
366
  commission_bps = 1000
369
367
 
370
- `}),"configToml"),Me=El;var wl=r(()=>({filePath:"/home/solv/firedancer/config.toml",body:`name = "solv"
368
+ `}),"configToml"),Ye=Il;var Ll=r((t={})=>{let e="/home/solv/firedancer/config.toml",n=`name = "solv"
371
369
  user = "solv"
372
370
  scratch_directory = "/home/solv"
373
371
  dynamic_port_range = "8100-8120"
@@ -458,20 +456,20 @@ dynamic_port_range = "8100-8120"
458
456
 
459
457
  [tiles.bundle]
460
458
  enabled = true
461
- url = "https://amsterdam.mainnet.block-engine.jito.wtf"
459
+ url = "${t.blockEngineUrl||Te}"
462
460
  tip_distribution_program_addr = "4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7"
463
461
  tip_payment_program_addr = "T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt"
464
462
  tip_distribution_authority = "GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib"
465
463
  commission_bps = 1000
466
464
 
467
465
  [net]
468
- provider = "xdp"`}),"configTomlMainnet"),Fe=wl;var Al=r(async()=>{nt("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),nt(`git checkout v${Ar}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),nt("./deps.sh",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),nt("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),nt("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let{filePath:t,body:e}=Kn();nt(`sudo tee ${t} > /dev/null << 'EOF'
466
+ provider = "xdp"`;return{filePath:e,body:n}},"configTomlMainnet"),Be=Ll;var Pl=r(async()=>{st("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),st(`git checkout v${yr}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("./deps.sh",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),st("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let{filePath:t,body:e}=Bn();st(`sudo tee ${t} > /dev/null << 'EOF'
469
467
  ${e}
470
- EOF`,{shell:!0,stdio:"inherit"}),nt(`sudo chmod +x ${t}`,{shell:!0,stdio:"inherit"});let o=Dn();nt(`sudo tee ${o.filePath} > /dev/null << 'EOF'
468
+ EOF`,{shell:!0,stdio:"inherit"}),st(`sudo chmod +x ${t}`,{shell:!0,stdio:"inherit"});let o=Jn();st(`sudo tee ${o.filePath} > /dev/null << 'EOF'
471
469
  ${o.body}
472
- EOF`,{shell:!0,stdio:"inherit"}),nt("sudo systemctl daemon-reload",{shell:!0});let s=(await I()).NETWORK===u.MAINNET?Fe():Me();nt(`sudo tee ${s.filePath} > /dev/null << 'EOF'
470
+ EOF`,{shell:!0,stdio:"inherit"}),st("sudo systemctl daemon-reload",{shell:!0});let n=await v(),s=n.NETWORK===u.MAINNET?Be({blockEngineUrl:n.FRANKENDANCER_BLOCK_ENGINE_URL}):Ye();st(`sudo tee ${s.filePath} > /dev/null << 'EOF'
473
471
  ${s.body}
474
- EOF`,{shell:!0,stdio:"inherit"})},"setupFiredancer"),He=Al;var Mn=r(async(t=!1,e=!1)=>{try{t||(console.log(Un.white("\u{1F7E2} Initializing Setup")),await I(),await sn());let o=await I(),n=o.NETWORK===u.TESTNET;switch(yn(),e||gn(),kn(n),xn(),Cn(),await Pn(),vn(o),bn(o.IS_DUMMY,n),o.NODE_TYPE){case T.RPC:await ln(o);break;case T.VALIDATOR:await un(o),o.VALIDATOR_TYPE===g.FRANKENDANCER&&await He();break;default:throw new Error("Unknown Node Type")}En(),Gt(),o.VALIDATOR_TYPE!==g.FRANKENDANCER&&(Vn(),be(n)),Ke(o),console.log(Un.white("\u{1F7E2} Setup Completed")),wt()}catch(o){throw new Error(`Setup Error: ${o.message}`)}},"setupV2");var Fn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
472
+ EOF`,{shell:!0,stdio:"inherit"})},"setupFiredancer"),Je=Pl;var zn=r(async(t=!1,e=!1)=>{try{t||(console.log(Gn.white("\u{1F7E2} Initializing Setup")),await v(),await fn());let o=await v(),n=o.NETWORK===u.TESTNET;switch(Nn(),e||kn(),Vn(n),Fn(),Dn(),await Mn(),$n(o),Yn(o.IS_DUMMY,n),o.NODE_TYPE){case g.RPC:await Sn(o);break;case g.VALIDATOR:await An(o),o.VALIDATOR_TYPE===S.FRANKENDANCER&&await Je();break;default:throw new Error("Unknown Node Type")}vn(),Xt(),o.VALIDATOR_TYPE!==S.FRANKENDANCER&&(Hn(),Me(n)),Fe(o),console.log(Gn.white("\u{1F7E2} Setup Completed")),_t()}catch(o){throw new Error(`Setup Error: ${o.message}`)}},"setupV2");var Wn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`# Example Systemd File for Co-Hosted Relayer
475
473
  [Unit]
476
474
  Description=Solana transaction relayer
477
475
  Requires=network-online.target
@@ -497,7 +495,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
497
495
  --verifying-key-pem-path=/home/solv/public.pem
498
496
 
499
497
  [Install]
500
- WantedBy=multi-user.target`;return{filePath:e,body:o}},"relayerService"),Hn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`[Unit]
498
+ WantedBy=multi-user.target`;return{filePath:e,body:o}},"relayerService"),qn=r(t=>{let e="/etc/systemd/system/relayer.service",o=`[Unit]
501
499
  Description=Solana transaction relayer
502
500
  Requires=network-online.target
503
501
  After=network-online.target
@@ -520,45 +518,45 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
520
518
  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
521
519
 
522
520
  [Install]
523
- WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as je,spawnSync as dt}from"child_process";var jn=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?Fn(t):Hn(t);je(`echo "${n}" | sudo tee ${o} > /dev/null`),dt("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),dt("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),je("sudo ufw allow 11228",{stdio:"inherit"}),je("sudo ufw allow 11229",{stdio:"inherit"}),je("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as ko}from"node:child_process";var _l=r(t=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:t},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),Yn=_l;import{spawnSync as Nl}from"node:child_process";import{readFile as Ol,writeFile as kl}from"fs/promises";var vl=r(async()=>{let t="/home/solv/start-validator.sh",o=(await Ol(t,"utf-8")).split(`
521
+ WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateService");import{execSync as Ge,spawnSync as ft}from"child_process";var Qn=r(async(t,e=!0)=>{ft("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),ft("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),ft("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),ft("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),ft("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),ft("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:o,body:n}=e?Wn(t):qn(t);Ge(`echo "${n}" | sudo tee ${o} > /dev/null`),ft("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),ft("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Ge("sudo ufw allow 11228",{stdio:"inherit"}),Ge("sudo ufw allow 11229",{stdio:"inherit"}),Ge("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as xo}from"node:child_process";var xl=r(t=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:t},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),Xn=xl;import{spawnSync as Vl}from"node:child_process";import{readFile as $l,writeFile as bl}from"fs/promises";var Dl=r(async()=>{let t="/home/solv/start-validator.sh",o=(await $l(t,"utf-8")).split(`
524
522
  `);o.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let n=o.join(`
525
- `);await kl(t,n),Nl(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Jn=vl;import Rl from"inquirer";import{writeFile as Cl}from"node:fs/promises";var Bn=r(async()=>{let e=(await Rl.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,o="git clone https://github.com/rpcpool/yellowstone-grpc.git",n="cargo build -r",s="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";ko(o,{shell:!0,stdio:"inherit"}),ko(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),ko(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Yn(e),c=JSON.stringify(i,null,2);await Cl(a,c,{encoding:"utf8"}),await Jn()},"yellowstoneGeyser");var Gn=r(t=>{h.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).action(async e=>{try{if(e.vote)console.log(ct.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ce(t),process.exit(0);else if(e.key)console.log(ct.white("\u{1F511} Setting up Validator Keypairs ...")),Le(t),process.exit(0);else if(e.relayer){console.log(ct.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let n=(await gt()).blockEngineUrl;await jn(n,!1),console.log(ct.green(`Jito Relayer Setup Completed
526
-
527
- $ solc relayer --help`)),Gt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Xr(),Gt(),wt(),process.exit(0);else if(e.geyser){console.log(ct.white("\u26A1\uFE0F Setting up Geyser ...")),await Bn();return}else if(e.firedancer){console.log(ct.white("\u{1F525} Setting up Firedancer ...")),await He();return}await Mn(e.skipInitConfig,e.skipMount)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(ct.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ct.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Il}from"child_process";var vo=r(()=>{let o=Il("df -h").toString().split(`
528
- `).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)=>At(a.Avail)-At(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&At(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&At(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&At(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/")&&At(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import zn from"chalk";import Ll from"cli-table3";var Ro=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>zn.blue(n)),o=new Ll({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=>zn.white(s)))}),console.log(o.toString())},"displayTable");var Wn=r(async()=>{h.command("df").description("Disk Free Command").action(()=>{let t=vo();Ro(t)})},"dfCommands"),At=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 qn=r(t=>{h.command("start").description("Start Solana Validator").action(()=>{Ke(t),process.exit(0)})},"startCommand");import{spawnSync as Pl}from"node:child_process";var Qn=r((t,e={})=>{let o=t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer.service":"solv.service",s=`sudo systemctl stop ${e.service??o}`;e.debug&&console.log(`[solc] stop -> ${s}`),Pl(s,{shell:!0,stdio:"inherit"})},"stopSolana");var Xn=r(t=>{h.command("stop").description("Stop Solana Validator").option("-s, --service <service>","systemd service name to stop").option("--debug","Print executed command").action(e=>{Qn(t,e),process.exit(0)})},"stopCommand");import{spawnSync as Zt}from"node:child_process";import Zn from"chalk";var ts=r(t=>{let e=K();h.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...")),Zt("solc stop",{stdio:"inherit",shell:!0}),Zt("solc rm:snapshot",{stdio:"inherit",shell:!0}),Zt("solc get snapshot",{stdio:"inherit",shell:!0}),Zt("solc start",{stdio:"inherit",shell:!0}),console.log(Zn.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let n=`${e} --ledger ${y} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE}`;Zt(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var es=r(t=>{let o=t.NETWORK===u.TESTNET?tt:et;t.NODE_TYPE===T.RPC&&(o=Tt),h.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${o}`,o).action(async n=>{if(t.VALIDATOR_TYPE===g.JITO){let l=`v${n.version||H}-jito`;we(l);return}t.NODE_TYPE===T.RPC&&(o=Tt);let i=n.version||o;await ye(i)})},"installCommands");import{spawnSync as xl}from"child_process";var os=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{xl("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=Qt();console.log(t)})},"mountCommands");import{spawnSync as bl}from"node:child_process";import rs from"chalk";import{spawnSync as Vl}from"child_process";var $l=r(async()=>{try{let t=Vl("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("solc epochTimer")}catch(t){return console.error("Error reading crontab:",t),!1}},"hasEpochTimer"),Ye=$l;var ns=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solc Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 * * * *").action(async e=>{await Ye()&&(console.log(rs.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 && solc epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;bl(n,{shell:!0,stdio:"inherit"}),console.log(rs.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var te={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 Dl,mkdirSync as Ul}from"fs";import Ml from"inquirer";import{homedir as Fl}from"os";import{spawnSync as Kl}from"node:child_process";function ss(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return Kl(s,{shell:!0,stdio:"inherit"}).status===0}r(ss,"executeSCP");var Co=r(async(t="")=>{let e=t;t===""&&(e=(await Ml.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(A()),n=Fl(),s=n.includes("/home/solv")?"/home/solv":n+te.SOLV_KEYPAIR_DOWNLOAD_PATH;Dl(s)||Ul(s,{recursive:!0});let a=!0,i=n+"/"+Jo;o.push(i);for(let c of o){let l=c.split("/"),m=l[l.length-1];m=n.includes("/home/solv")?m:m.replace(".json",`-${e}.json`);let d=`${s}/${m}`;ss(e,c,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as Hl}from"child_process";import{existsSync as jl}from"fs";import Yl from"inquirer";import Jl from"os";var as=r(async(t="")=>{let e=Jl.userInfo().homedir,o=t;t===""&&(o=(await Yl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${te.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=te.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let s=Object.values(A(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(!jl(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;Hl(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as Bl}from"child_process";import Gl from"inquirer";var is=r(async()=>{let t=await Gl.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${D.ROOT}/.ssh && echo "${t.pubkey}" >> ${D.AUTHORIZED_KEYS}`;Bl(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import Je from"chalk";import{readFileSync as zl}from"fs";import Wl from"os";var cs=r(()=>{try{let e=`${Wl.userInfo().homedir}/.ssh/id_rsa.pub`,o=zl(e,"utf8");console.log(Je.white(`Your SSH Public Key is:
529
- `)),console.log(Je.white(o))}catch(t){console.error(Je.white(`Error reading SSH Public Key
530
- `)),console.error(Je.white(t))}},"cat");import{spawnSync as ql}from"child_process";var ls=r(()=>{ql("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Ql}from"child_process";import{readFileSync as Xl}from"fs";import{Readable as Zl}from"stream";var ms=r(async t=>new Promise((e,o)=>{try{let n=Ql("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
531
- `).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"),tm=r(t=>{try{return JSON.parse(Xl(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),ps=r(async(t,e)=>{let o=[],n=Zl.from(t);return n.on("data",async s=>{tm(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import Be from"chalk";import{Presets as nm,SingleBar as sm}from"cli-progress";import ds from"chalk";import{spawnSync as em}from"node:child_process";import om from"node-fetch";var rm=r(async()=>{let t=await om(Xo,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(ds.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
532
- Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)em(o,{shell:!0,stdio:"ignore"});return console.log(ds.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),us=rm;var fs=r(()=>{let t=h.command("scp").description("Scp Commands").argument("<cmd>");t.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await Co(e.ip);return}await Co()}),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 us();return}await as(e.ip)}),t.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await is()}),t.command("cat").description("Show SSH Public Key").action(()=>{cs()}),t.command("init").description("Init SSH Key Pair").action(()=>{ls()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new sm({},nm.shades_classic);e.start(1e4,0);let o=await ms(e),n=await ps(o,e);e.stop(),console.log(Be.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(Be.green(`
523
+ `);await bl(t,n),Vl(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Zn=Dl;import Kl from"inquirer";import{writeFile as Ul}from"node:fs/promises";var ts=r(async()=>{let e=(await Kl.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";xo(o,{shell:!0,stdio:"inherit"}),xo(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),xo(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Xn(e),c=JSON.stringify(i,null,2);await Ul(a,c,{encoding:"utf8"}),await Zn()},"yellowstoneGeyser");var es=r(t=>{h.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).action(async e=>{try{if(e.vote)console.log(lt.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ve(t),process.exit(0);else if(e.key)console.log(lt.white("\u{1F511} Setting up Validator Keypairs ...")),be(t),process.exit(0);else if(e.relayer){console.log(lt.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let n=(await At()).blockEngineUrl;await Qn(n,!1),console.log(lt.green(`Jito Relayer Setup Completed
524
+
525
+ $ solc relayer --help`)),Xt(),_t(),process.exit(0)}else if(e.jupiter)console.log(lt.white("\u{1F30F} Setting up Jupiter Swap API ...")),await ln(),Xt(),_t(),process.exit(0);else if(e.geyser){console.log(lt.white("\u26A1\uFE0F Setting up Geyser ...")),await ts();return}else if(e.firedancer){console.log(lt.white("\u{1F525} Setting up Firedancer ...")),await Je();return}await zn(e.skipInitConfig,e.skipMount)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(lt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(lt.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Ml}from"child_process";var Vo=r(()=>{let o=Ml("df -h").toString().split(`
526
+ `).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)=>Nt(a.Avail)-Nt(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&Nt(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&Nt(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&Nt(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/")&&Nt(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import os from"chalk";import Fl from"cli-table3";var $o=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>os.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=>os.white(s)))}),console.log(o.toString())},"displayTable");var rs=r(async()=>{h.command("df").description("Disk Free Command").action(()=>{let t=Vo();$o(t)})},"dfCommands"),Nt=r(t=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},o=t.match(/[A-Za-z]+/)?.[0]||"",n=parseFloat(t);return e[o]?n*e[o]:n},"convertToBytes");var ns=r(t=>{h.command("start").description("Start Solana Validator").action(()=>{Fe(t),process.exit(0)})},"startCommand");import{spawnSync as Hl}from"node:child_process";var ss=r((t,e={})=>{let o=t.VALIDATOR_TYPE===S.FRANKENDANCER?"frankendancer.service":"solv.service",s=`sudo systemctl stop ${e.service??o}`;e.debug&&console.log(`[solc] stop -> ${s}`),Hl(s,{shell:!0,stdio:"inherit"})},"stopSolana");var as=r(t=>{h.command("stop").description("Stop Solana Validator").option("-s, --service <service>","systemd service name to stop").option("--debug","Print executed command").action(e=>{ss(t,e),process.exit(0)})},"stopCommand");import{spawnSync as re}from"node:child_process";import is from"chalk";var cs=r(t=>{let e=U();h.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async o=>{o.rm&&(console.log(is.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),re("solc stop",{stdio:"inherit",shell:!0}),re("solc rm:snapshot",{stdio:"inherit",shell:!0}),re("solc get snapshot",{stdio:"inherit",shell:!0}),re("solc start",{stdio:"inherit",shell:!0}),console.log(is.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let n=`${e} --ledger ${y} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE}`;re(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var ls=r(t=>{let o=t.NETWORK===u.TESTNET?et:D;t.NODE_TYPE===g.RPC&&(o=gt),h.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${o}`,o).action(async n=>{if(t.VALIDATOR_TYPE===S.JITO){let l=`v${n.version||Y}-jito`;Re(l);return}t.NODE_TYPE===g.RPC&&(o=gt);let i=n.version||o;await Ae(i)})},"installCommands");import{spawnSync as jl}from"child_process";var ms=r(()=>{h.command("mtr").description("Mount Reload Command").action(()=>{jl("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),h.command("disks").description("Show unmounted disks").action(()=>{let t=ee();console.log(t)})},"mountCommands");import{spawnSync as Jl}from"node:child_process";import ps from"chalk";import{spawnSync as Yl}from"child_process";var Bl=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("solc epochTimer")}catch(t){return console.error("Error reading crontab:",t),!1}},"hasEpochTimer"),ze=Bl;var ds=r(()=>{h.command("cron").description("Cron Job Commands").command("epoch").description("Solc Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 * * * *").action(async e=>{await ze()&&(console.log(ps.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let n=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solc epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;Jl(n,{shell:!0,stdio:"inherit"}),console.log(ps.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ne={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as zl,mkdirSync as Wl}from"fs";import ql from"inquirer";import{homedir as Ql}from"os";import{spawnSync as Gl}from"node:child_process";function us(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return Gl(s,{shell:!0,stdio:"inherit"}).status===0}r(us,"executeSCP");var bo=r(async(t="")=>{let e=t;t===""&&(e=(await ql.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(w()),n=Ql(),s=n.includes("/home/solv")?"/home/solv":n+ne.SOLV_KEYPAIR_DOWNLOAD_PATH;zl(s)||Wl(s,{recursive:!0});let a=!0,i=n+"/"+er;o.push(i);for(let c of o){let l=c.split("/"),m=l[l.length-1];m=n.includes("/home/solv")?m:m.replace(".json",`-${e}.json`);let d=`${s}/${m}`;us(e,c,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as Xl}from"child_process";import{existsSync as Zl}from"fs";import tm from"inquirer";import em from"os";var fs=r(async(t="")=>{let e=em.userInfo().homedir,o=t;t===""&&(o=(await tm.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${ne.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=ne.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let s=Object.values(w(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(!Zl(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;Xl(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as om}from"child_process";import rm from"inquirer";var hs=r(async()=>{let t=await rm.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${M.ROOT}/.ssh && echo "${t.pubkey}" >> ${M.AUTHORIZED_KEYS}`;om(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import We from"chalk";import{readFileSync as nm}from"fs";import sm from"os";var ys=r(()=>{try{let e=`${sm.userInfo().homedir}/.ssh/id_rsa.pub`,o=nm(e,"utf8");console.log(We.white(`Your SSH Public Key is:
527
+ `)),console.log(We.white(o))}catch(t){console.error(We.white(`Error reading SSH Public Key
528
+ `)),console.error(We.white(t))}},"cat");import{spawnSync as am}from"child_process";var Ss=r(()=>{am("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as im}from"child_process";import{readFileSync as cm}from"fs";import{Readable as lm}from"stream";var Ts=r(async t=>new Promise((e,o)=>{try{let n=im("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
529
+ `).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"),mm=r(t=>{try{return JSON.parse(cm(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),gs=r(async(t,e)=>{let o=[],n=lm.from(t);return n.on("data",async s=>{mm(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import qe from"chalk";import{Presets as fm,SingleBar as hm}from"cli-progress";import Es from"chalk";import{spawnSync as pm}from"node:child_process";import dm from"node-fetch";var um=r(async()=>{let t=await dm(ar,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(Es.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
530
+ Please contact Discord Channel`)),!1;let e=await t.json();for(let o of e.cmds)pm(o,{shell:!0,stdio:"ignore"});return console.log(Es.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),As=um;var ws=r(()=>{let t=h.command("scp").description("Scp Commands").argument("<cmd>");t.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await bo(e.ip);return}await bo()}),t.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await As();return}await fs(e.ip)}),t.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await hs()}),t.command("cat").description("Show SSH Public Key").action(()=>{ys()}),t.command("init").description("Init SSH Key Pair").action(()=>{Ss()}),t.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new hm({},fm.shades_classic);e.start(1e4,0);let o=await Ts(e),n=await gs(o,e);e.stop(),console.log(qe.white(`\u{1F50D} Found ${n.length} Potential Solana Key Pairs \u{1F389}`)),n=n.slice(0,10),console.log(qe.green(`
533
531
  ${n.join(`
534
- `)}`)),console.log(Be.white(`
532
+ `)}`)),console.log(qe.white(`
535
533
  Only showing the first 10 results
536
534
 
537
- `)),console.log(Be.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as am}from"child_process";var hs=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{im(t)})},"statusCommands"),im=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===g.FRANKENDANCER?"frankendancer":"solv"}`;am(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as cm}from"node:child_process";var ys=r(async(t,e)=>{try{let o=await I(),n=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===T.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 cm(c.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import Ts from"inquirer";import{spawnSync as lm}from"node:child_process";var Ss=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=lm(`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 mm,existsAsync as pm}from"@skeet-framework/utils";import{execSync as dm,spawnSync as ze}from"node:child_process";import um from"node:os";var gs=r(async t=>{let e=t.NETWORK===u.TESTNET;if(!(await Ts.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;ze(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await Ts.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await hm(),c=t.STAKE_ACCOUNTS,l=Array.from(new Set([...c,a]));return Rt({STAKE_ACCOUNT:l}),Ss(i,Number(s.solAmount))},"stakeAccountQuestion"),fm=um.userInfo().homedir,Ge=fm+"/stake-account",hm=r(async()=>{await pm(Ge)||ze(`mkdir -p ${Ge}`,{shell:!0});let t=ze(`ls ${Ge}`,{shell:!0}).stdout.toString().split(`
538
- `).filter(a=>a.includes(".json")),e=mm(t.length+1),o=`${Ge}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return ze(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:dm(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as ym}from"node:child_process";var Es=r(async t=>{try{let o=(await I()).NETWORK===u.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return ym(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Sm}from"node:child_process";var ws=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return Sm(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import Pt from"chalk";import{Connection as Tm,PublicKey as gm}from"@solana/web3.js";import{stakePoolInfo as Em}from"@solana/spl-stake-pool";var We=r(async(t,e=B)=>{try{let o=new Tm(t),n=new gm(e);return await Em(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as wm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Am}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as _m}from"@metaplex-foundation/umi";var As=r(async(t,e)=>{try{let o=_m(e);console.log(`mintPubkey: ${o}`);let n=Am(t),s=await wm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ee from"chalk";import _s from"inquirer";var Ns=r(async t=>{let e=await _s.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:B}]);try{let o=await We(t,e.stakePoolAddress);if(!o)return console.log(ee.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
535
+ `)),console.log(qe.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as ym}from"child_process";var _s=r(t=>{h.command("status").description("Check Solana Validator Status").action(()=>{Sm(t)})},"statusCommands"),Sm=r(t=>{let o=`sudo systemctl status ${t.VALIDATOR_TYPE===S.FRANKENDANCER?"frankendancer":"solv"}`;ym(o,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Tm}from"node:child_process";var Ns=r(async(t,e)=>{try{let o=await v(),n=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===g.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 Tm(c.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`delegateStake: ${o}`)}},"delegateStake");import Rs from"inquirer";import{spawnSync as gm}from"node:child_process";var Os=r((t,e,o=5)=>{let n=0;for(;n<o;){let s=gm(`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 Em,existsAsync as Am}from"@skeet-framework/utils";import{execSync as wm,spawnSync as Xe}from"node:child_process";import _m from"node:os";var ks=r(async t=>{let e=t.NETWORK===u.TESTNET;if(!(await Rs.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;Xe(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let s=await Rs.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:a,stakeKeypairPath:i}=await Om(),c=t.STAKE_ACCOUNTS,l=Array.from(new Set([...c,a]));return xt({STAKE_ACCOUNT:l}),Os(i,Number(s.solAmount))},"stakeAccountQuestion"),Nm=_m.userInfo().homedir,Qe=Nm+"/stake-account",Om=r(async()=>{await Am(Qe)||Xe(`mkdir -p ${Qe}`,{shell:!0});let t=Xe(`ls ${Qe}`,{shell:!0}).stdout.toString().split(`
536
+ `).filter(a=>a.includes(".json")),e=Em(t.length+1),o=`${Qe}/stake${e}.json`,n=`solana-keygen new --outfile ${o} --no-bip39-passphrase`;return Xe(n,{shell:!0,stdio:"inherit"}),{stakeKeypair:wm(`solana-keygen pubkey ${o}`).toString().trim(),stakeKeypairPath:o}},"createStakeKeypair");import{spawnSync as Rm}from"node:child_process";var vs=r(async t=>{try{let o=(await v()).NETWORK===u.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",n=`solana deactivate-stake ${t} --stake-authority ${o}`;return Rm(n,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as km}from"node:child_process";var Cs=r(async(t,e,o)=>{try{let n=`solana withdraw-stake ${t} ${e} ${o}`;return km(n,{shell:!0,stdio:"inherit"}),!0}catch(n){throw new Error(`withdrawStake: ${n}`)}},"withdrawStake");import Dt from"chalk";import{Connection as vm,PublicKey as Cm}from"@solana/web3.js";import{stakePoolInfo as Im}from"@solana/spl-stake-pool";var Ze=r(async(t,e=z)=>{try{let o=new vm(t),n=new Cm(e);return await Im(o,n)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as Lm}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Pm}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as xm}from"@metaplex-foundation/umi";var Is=r(async(t,e)=>{try{let o=xm(e);console.log(`mintPubkey: ${o}`);let n=Pm(t),s=await Lm(n,o);return{name:s.metadata.name,symbol:s.metadata.symbol,uri:s.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import se from"chalk";import Ls from"inquirer";var Ps=r(async t=>{let e=await Ls.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:z}]);try{let o=await Ze(t,e.stakePoolAddress);if(!o)return console.log(se.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
539
537
  Please check the correct address and try again.
540
- `)),console.log(ee.white(`For stake pool information
541
- \u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await As(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
538
+ `)),console.log(se.white(`For stake pool information
539
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null;let n=o.poolMint,s=await Is(t,n);s||(s={name:n,symbol:n,mint:n,uri:"no metadata"});let a={...s,stakePoolAddress:e.stakePoolAddress},i=`\u{1FA99} ${a.symbol}
542
540
  Name: ${a.name}
543
- Token Mint: ${a.mint}`;return(await _s.prompt([{type:"confirm",name:"confirm",message:i+`
544
- Is this the correct Stake Pool?`}])).confirm?a:(console.log(ee.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(ee.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
541
+ Token Mint: ${a.mint}`;return(await Ls.prompt([{type:"confirm",name:"confirm",message:i+`
542
+ Is this the correct Stake Pool?`}])).confirm?a:(console.log(se.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(se.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
545
543
  Please check the correct address and try again.
546
- `)),console.log(ee.white(`For stake pool information
547
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as bm}from"fs/promises";import ne from"inquirer";import{existsAsync as Km}from"@skeet-framework/utils";import{Connection as Cs,Keypair as Lm,PublicKey as re}from"@solana/web3.js";import{Connection as Nm,PublicKey as Om,Keypair as km}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as vm}from"@solana/spl-token";var oe=r(async(t,e,o,n,s=!1)=>{try{let a=km.fromSecretKey(new Uint8Array(e)),i=new Om(o),c=new Nm(t);return(await vm(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 Pm}from"cli-spinner";import _t from"chalk";import{PublicKey as ks,Keypair as vs,Transaction as Os,ComputeBudgetProgram as Rm,LAMPORTS_PER_SOL as Cm}from"@solana/web3.js";import*as Rs from"@solana/spl-stake-pool";var Ct=r(async(t,e,o,n=new ks(B),s,a,i)=>{try{let c=vs.fromSecretKey(new Uint8Array(e)),l=o*Cm,{instructions:m,signers:d}=await Im(t,e,l,n,s,a,i),p=new Os().add(...m);p.feePayer=c.publicKey;let f=await t.getLatestBlockhashAndContext({commitment:"finalized"});p.recentBlockhash=f.value.blockhash,p.sign(...d,c);let S=new Os().add(...m).add(Rm.setComputeUnitPrice({microLamports:1e3}));S.feePayer=c.publicKey,S.recentBlockhash=f.value.blockhash,S.sign(...d,c);let w=await t.sendRawTransaction(S.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...f.value,signature:w},"finalized"),{status:"success",signature:w}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),Im=r(async(t,e,o,n=new ks(B),s,a,i)=>{let l=vs.fromSecretKey(new Uint8Array(e)).publicKey;return await Rs.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as Is}from"@skeet-framework/utils";var qe=r(async(t,e,o,n)=>{console.log(_t.white("Solana RPC URL:",t));let s=new Cs(t);o===0&&(o=await Qe());let a=new Pm("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(_t.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new re(e),c=Lm.fromSecretKey(new Uint8Array(n)),l=Z;a.setSpinnerTitle(_t.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await oe(t,n,l,c.publicKey);await Is(1e3),a.setSpinnerTitle(_t.green("\u{1F504} Converting SOL to elSOL"));let d=await Ct(s,n,o,i,new re(m),new re(fo),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 Is(3e3),s=new Cs(t),d=await Ct(s,n,o,i,new re(m),new re(fo),c.publicKey)}return a.stop(!0),console.log(_t.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
544
+ `)),console.log(se.white(`For stake pool information
545
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Jm}from"fs/promises";import ce from"inquirer";import{existsAsync as Gm}from"@skeet-framework/utils";import{Connection as Ds,Keypair as Fm,PublicKey as ie}from"@solana/web3.js";import{Connection as Vm,PublicKey as $m,Keypair as bm}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Dm}from"@solana/spl-token";var ae=r(async(t,e,o,n,s=!1)=>{try{let a=bm.fromSecretKey(new Uint8Array(e)),i=new $m(o),c=new Vm(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 Hm}from"cli-spinner";import Ot from"chalk";import{PublicKey as Vs,Keypair as $s,Transaction as xs,ComputeBudgetProgram as Km,LAMPORTS_PER_SOL as Um}from"@solana/web3.js";import*as bs from"@solana/spl-stake-pool";var Vt=r(async(t,e,o,n=new Vs(z),s,a,i)=>{try{let c=$s.fromSecretKey(new Uint8Array(e)),l=o*Um,{instructions:m,signers:d}=await Mm(t,e,l,n,s,a,i),p=new xs().add(...m);p.feePayer=c.publicKey;let f=await t.getLatestBlockhashAndContext({commitment:"finalized"});p.recentBlockhash=f.value.blockhash,p.sign(...d,c);let T=new xs().add(...m).add(Km.setComputeUnitPrice({microLamports:1e3}));T.feePayer=c.publicKey,T.recentBlockhash=f.value.blockhash,T.sign(...d,c);let A=await t.sendRawTransaction(T.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...f.value,signature:A},"finalized"),{status:"success",signature:A}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),Mm=r(async(t,e,o,n=new Vs(z),s,a,i)=>{let l=$s.fromSecretKey(new Uint8Array(e)).publicKey;return await bs.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as Ks}from"@skeet-framework/utils";var to=r(async(t,e,o,n)=>{console.log(Ot.white("Solana RPC URL:",t));let s=new Ds(t);o===0&&(o=await eo());let a=new Hm("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(Ot.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new ie(e),c=Fm.fromSecretKey(new Uint8Array(n)),l=rt;a.setSpinnerTitle(Ot.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await ae(t,n,l,c.publicKey);await Ks(1e3),a.setSpinnerTitle(Ot.green("\u{1F504} Converting SOL to elSOL"));let d=await Vt(s,n,o,i,new ie(m),new ie(No),c.publicKey),p=0;for(;d.status!=="success";){if(p++,p>10)return a.stop(!0),console.log(Ot.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(Ot.yellow(`\u23F3 ${p} Times Retrying...`)),await Ks(3e3),s=new Ds(t),d=await Vt(s,n,o,i,new ie(m),new ie(No),c.publicKey)}return a.stop(!0),console.log(Ot.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
548
546
 
549
- Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as xm,Keypair as Vm,PublicKey as It}from"@solana/web3.js";import{Spinner as $m}from"cli-spinner";import Lt from"chalk";import{sleep as Ls}from"@skeet-framework/utils";var Ps=r(async(t,e,o,n,s)=>{let a=new xm(t);o===0&&(o=await Qe());let i=new $m("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(Lt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new It(e),l=await We(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Lt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=Vm.fromSecretKey(new Uint8Array(n)),p=await oe(t,n,m,d.publicKey),f=await oe(t,n,m,new It(fr),!0);await Ls(1e3),i.setSpinnerTitle(Lt.green(`\u{1F504} Converting SOL to ${s}`));let S=await Ct(a,n,o,c,new It(p),new It(f),d.publicKey),w=0;for(;S.status!=="success";){if(w++,w>10)return i.stop(!0),console.log(Lt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Lt.yellow(`\u23F3 ${w} Times Retrying...
550
- `)),await Ls(1e3),S=await Ct(a,n,o,c,new It(p),new It(f),d.publicKey)}return i.stop(!0),console.log(Lt.white(`\u{1F4B0} You've got ${s} \u2728
547
+ Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as jm,Keypair as Ym,PublicKey as $t}from"@solana/web3.js";import{Spinner as Bm}from"cli-spinner";import bt from"chalk";import{sleep as Us}from"@skeet-framework/utils";var Ms=r(async(t,e,o,n,s)=>{let a=new jm(t);o===0&&(o=await eo());let i=new Bm("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(bt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new $t(e),l=await Ze(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(bt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=Ym.fromSecretKey(new Uint8Array(n)),p=await ae(t,n,m,d.publicKey),f=await ae(t,n,m,new $t(Ir),!0);await Us(1e3),i.setSpinnerTitle(bt.green(`\u{1F504} Converting SOL to ${s}`));let T=await Vt(a,n,o,c,new $t(p),new $t(f),d.publicKey),A=0;for(;T.status!=="success";){if(A++,A>10)return i.stop(!0),console.log(bt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(bt.yellow(`\u23F3 ${A} Times Retrying...
548
+ `)),await Us(1e3),T=await Vt(a,n,o,c,new $t(p),new $t(f),d.publicKey)}return i.stop(!0),console.log(bt.white(`\u{1F4B0} You've got ${s} \u2728
551
549
 
552
- Signature:`,S.signature)),!0},"depositeLST");import{execSync as Xe}from"node:child_process";import{homedir as Dm}from"os";var xs=r(t=>{h.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let o=Number(e.amount);console.log("RPC URL:",t.RPC_URL);let n=B,s=t.NETWORK===u.TESTNET,a=Dm(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(Xe(`solana config set --keypair ${i}`),!await Km(i)){console.log(Pt.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
553
- `)),console.log(Pt.white(i));return}let c=JSON.parse(await bm(i,"utf-8"));if(e.elsol){await qe(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await Ns(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Ps(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await gs(t))return;let m=await I(),{validatorVoteAccount:d,stakeAccounts:p}=await Mm(m);for await(let f of p)try{await ys(f,d)}catch{console.log(Pt.yellow(`Network might be busy, please try again later
550
+ Signature:`,T.signature)),!0},"depositeLST");import{execSync as oo}from"node:child_process";import{homedir as zm}from"os";var Fs=r(t=>{h.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let o=Number(e.amount);console.log("RPC URL:",t.RPC_URL);let n=z,s=t.NETWORK===u.TESTNET,a=zm(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(oo(`solana config set --keypair ${i}`),!await Gm(i)){console.log(Dt.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
551
+ `)),console.log(Dt.white(i));return}let c=JSON.parse(await Jm(i,"utf-8"));if(e.elsol){await to(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await Ps(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Ms(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await ks(t))return;let m=await v(),{validatorVoteAccount:d,stakeAccounts:p}=await qm(m);for await(let f of p)try{await Ns(f,d)}catch{console.log(Dt.yellow(`Network might be busy, please try again later
554
552
  You can use a custom RPC endpoint to avoid this issue
555
- `))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Hm();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await Um();for await(let n of o)try{await Es(n)}catch{console.log(Pt.yellow(`Network might be busy, please try again later
553
+ `))}}}),h.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Xm();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await Wm();for await(let n of o)try{await vs(n)}catch{console.log(Dt.yellow(`Network might be busy, please try again later
556
554
  You can use a custom RPC endpoint to avoid this issue
557
- `))}}else{let o=await jm();await ws(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),Qe=r(async()=>{let t=Xe("solana address").toString().trim(),e=Xe("solana balance").toString().replace("SOL","").trim();console.log(Pt.white(`\u{1F4D7} Selected Wallet: ${t}
558
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Pt.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ne.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Um=r(async()=>{let t=await I();return await ne.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Mm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===u.TESTNET?Fm(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await ne.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return o}}])},"delegateStakeAsk"),Fm=r(t=>{let n=`/home/solv/${t.NETWORK===u.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return Xe(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),Hm=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await ne.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),jm=r(async()=>{let t=(await I()).STAKE_ACCOUNTS;return await ne.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 Ym}from"child_process";var Vs=r(()=>{try{return Ym("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as Jm}from"child_process";var $s=r(()=>{try{return Jm("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import lt from"chalk";import{Spinner as Bm}from"cli-spinner";var xt;(function(t){t.successHex=lt.hex("#39A845"),t.warningHex=lt.hex("#FFD02E"),t.errorHex=lt.hex("#B5332E"),t.syncHex=lt.hex("#3073B7"),t.greyHex=lt.hex("#BEBDBD"),t.indigoHex=lt.hex("#3950A0"),t.pinkHex=lt.hex("#D8A1C4"),t.normal=e=>{console.log(lt.white(e))},t.syncSpinner=e=>{let o=new Bm(lt.white(e)+` %s
555
+ `))}}else{let o=await Zm();await Cs(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),eo=r(async()=>{let t=oo("solana address").toString().trim(),e=oo("solana balance").toString().replace("SOL","").trim();console.log(Dt.white(`\u{1F4D7} Selected Wallet: ${t}
556
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Dt.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ce.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Wm=r(async()=>{let t=await v();return await ce.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),qm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===u.TESTNET?Qm(t):t.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await ce.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return o}}])},"delegateStakeAsk"),Qm=r(t=>{let n=`/home/solv/${t.NETWORK===u.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return oo(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),Xm=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await ce.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),Zm=r(async()=>{let t=(await v()).STAKE_ACCOUNTS;return await ce.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:t},{type:"input",name:"destinationAddress",message:"What is the destination address for the withdrawn SOL?",default(){return"xxxxxxxx"}},{type:"input",name:"solAmount",message:"How many SOL would you like to withdraw?",default(){return"1"}}])},"withdrawStakeAsk");import{execSync as tp}from"child_process";var Hs=r(()=>{try{return tp("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as ep}from"child_process";var js=r(()=>{try{return ep("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import mt from"chalk";import{Spinner as op}from"cli-spinner";var Kt;(function(t){t.successHex=mt.hex("#39A845"),t.warningHex=mt.hex("#FFD02E"),t.errorHex=mt.hex("#B5332E"),t.syncHex=mt.hex("#3073B7"),t.greyHex=mt.hex("#BEBDBD"),t.indigoHex=mt.hex("#3950A0"),t.pinkHex=mt.hex("#D8A1C4"),t.normal=e=>{console.log(mt.white(e))},t.syncSpinner=e=>{let o=new op(mt.white(e)+` %s
559
557
  `);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(`
560
558
  ${e}`),console.log(`${o}`),console.log(`${n}`),console.log(`${s}`),console.log(`${a}`),console.log(`${i}
561
- `),console.log(`Solc Version: v${me}
559
+ `),console.log(`Solc Version: v${he}
562
560
  `)},t.installMessage=()=>{let e=t.warningHex("\u{1F525} Welcome to Solana Validator Tool Solc \u{1F525}"),o=`
563
561
  Solc is born and ready for running Solana Validator \u{1F680}
564
562
 
@@ -579,11 +577,11 @@ $ solc mt -p <fileSystem>
579
577
  $ solc umt -p <fileSystem>
580
578
  `,s=`mount reload
581
579
  $ solc mtr
582
- `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(xt||(xt={}));import Vt from"chalk";import{spawnSync as Gm}from"node:child_process";var Ze=r(()=>{Gm("solana config get",{shell:!0,stdio:"inherit"});let e=pt();console.log(Vt.white("start-validator.sh: ")+e.scriptPath),console.log(Vt.white("service unit: ")+P.SOL_SERVICE),console.log(Vt.white("logrotate: ")+P.SOL_LOGROTATE),console.log(Vt.white("sysctl.d: ")+P.SOL_SYSTEM_CONFIG21),console.log(Vt.white("limits.d: ")+P.SOL_NOFILES_CONF),console.log(Vt.white("system.conf: ")+P.SOL_SYSTEM_CONF)},"showConfig");import{spawnSync as zm}from"node:child_process";import Wm from"chalk";var bs=r(t=>{let{minDownloadSpeed:e,maxLatency:o,snapshotPath:n}=t;try{console.log(Wm.white("\u{1F50E} Running solana-snapshot-finder..."));let s=["rm -rf solana-snapshot-finder","git clone https://github.com/ikaika1/solana-snapshot-finder.git","sudo apt-get update","sudo apt-get install -y python3-venv git","cd solana-snapshot-finder","python3 -m venv venv",'bash -lc "source ./venv/bin/activate && pip3 install -r requirements.txt"',`bash -lc "source ./venv/bin/activate && python3 snapshot-finder.py --min_download_speed ${e} --max_latency ${o} --snapshot_path ${n}"`].join(" && ");zm(s,{shell:!0,stdio:"inherit"})}catch(s){throw new Error(`runSnapshotFinder Error: ${s}`)}},"runSnapshotFinder");import{spawnSync as Ks}from"node:child_process";import qm from"chalk";var Ds=r(t=>{let e=t.NETWORK===u.TESTNET,o=e?tt:et;t.NODE_TYPE===T.RPC&&(o=Tt);let n=h.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");n.command("epoch").description("Show Validator's Epoch").action(()=>{let s=Vs();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=Ks(s,{shell:!0,stdio:"pipe"});console.log(qm.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=$s();console.log({slot:s})}),n.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","45").option("-l, --ledgerPath <ledgerPath>","Ledger Path","/mnt/ledger").option("-s, --snapshotPath <snapshotPath>","Snapshot Path","/mnt/ledger/snapshot").option("-v, --version <version>","Specific Version Node",o).description("Download the latest snapshot").action(s=>{let a=s.minDownloadSpeed,i=s.ledgerPath,c=s.snapshotPath,l=s.version;be(e,a,i,c,l)}),n.command("snapshot-finder").description("Clone and run solana-snapshot-finder to fetch a snapshot").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed (MB/s)","100").option("-x, --maxLatency <maxLatency>","Maximum latency (ms)","1000").option("-p, --snapshotPath <snapshotPath>","Snapshot download path","/mnt/ledger").action(s=>{bs({minDownloadSpeed:s.minDownloadSpeed,maxLatency:s.maxLatency,snapshotPath:s.snapshotPath})}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${K()} --ledger /mnt/ledger/ contact-info`;Ks(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solc Config").alias("c").action(async()=>{Ze()}),n.command("aa").description("Show Solc AA").option("-c, --client","Show Solc Client Mode AA",!1).action(s=>{xt.solvAA(),s.client?xt.installClientMessage():xt.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Qm}from"node:child_process";var Us=r(()=>{Qm("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as Xm}from"node:child_process";var Ms=r(()=>{Xm("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Zm}from"node:child_process";var Fs=r(()=>{Zm("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as tp}from"node:child_process";var Hs=r(()=>{tp("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as ep}from"node:child_process";var js=r((t=!1)=>{ep(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import Io from"chalk";import{spawnSync as rp}from"child_process";import{spawnSync as op}from"node:child_process";var Ys=r(()=>{op("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Js=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Us()}),t.command("start").description("Start Relayer").action(()=>{Ms()}),t.command("stop").description("Stop Relayer").action(()=>{Fs()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{js(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{Hs()}),t.command("enable").description("Enable Relayer").action(()=>{Ys()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(Io.red("Please provide a URL"));return}let o=`${K()} --ledger ${y} set-relayer-config --relayer-url ${e.url}`;console.log(Io.white("Setting Relayer URL ...")),rp(o,{shell:!0,stdio:"inherit"}),console.log(Io.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{writeFile as np,mkdir as sp}from"fs/promises";import{existsSync as Bs}from"fs";import ap from"path";import Lo from"chalk";var ip=r((t,e)=>{let o=t;if(e.identity&&(o=o.replace(/identity_path\s*=\s*\"[^\"]*\"/,`identity_path = "${e.identity}"`)),e.vote&&(o=o.replace(/vote_account_path\s*=\s*\"[^\"]*\"/,`vote_account_path = "${e.vote}"`)),e.auth&&e.auth.length>0){let n=e.auth.map(s=>`"${s}"`).join(`,
580
+ `;console.log(e),console.log(t.greyHex(o)),console.log(t.greyHex(n)),console.log(t.greyHex(s))}})(Kt||(Kt={}));import Ut from"chalk";import{spawnSync as rp}from"node:child_process";var ro=r(()=>{rp("solana config get",{shell:!0,stdio:"inherit"});let e=ut();console.log(Ut.white("start-validator.sh: ")+e.scriptPath),console.log(Ut.white("service unit: ")+x.SOL_SERVICE),console.log(Ut.white("logrotate: ")+x.SOL_LOGROTATE),console.log(Ut.white("sysctl.d: ")+x.SOL_SYSTEM_CONFIG21),console.log(Ut.white("limits.d: ")+x.SOL_NOFILES_CONF),console.log(Ut.white("system.conf: ")+x.SOL_SYSTEM_CONF)},"showConfig");import{spawnSync as np}from"node:child_process";import sp from"chalk";var Ys=r(t=>{let{minDownloadSpeed:e,maxLatency:o,snapshotPath:n}=t;try{console.log(sp.white("\u{1F50E} Running solana-snapshot-finder..."));let s=["rm -rf solana-snapshot-finder","git clone https://github.com/ikaika1/solana-snapshot-finder.git","sudo apt-get update","sudo apt-get install -y python3-venv git","cd solana-snapshot-finder","python3 -m venv venv",'bash -lc "source ./venv/bin/activate && pip3 install -r requirements.txt"',`bash -lc "source ./venv/bin/activate && python3 snapshot-finder.py --min_download_speed ${e} --max_latency ${o} --snapshot_path ${n}"`].join(" && ");np(s,{shell:!0,stdio:"inherit"})}catch(s){throw new Error(`runSnapshotFinder Error: ${s}`)}},"runSnapshotFinder");import{spawnSync as Bs}from"node:child_process";import ap from"chalk";var Js=r(t=>{let e=t.NETWORK===u.TESTNET,o=e?et:D;t.NODE_TYPE===g.RPC&&(o=gt);let n=h.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");n.command("epoch").description("Show Validator's Epoch").action(()=>{let s=Hs();console.log({epoch:s})}),n.command("ip").description("Show Validator's IP Address").action(()=>{let s="curl ipinfo.io/ip",{stdout:a}=Bs(s,{shell:!0,stdio:"pipe"});console.log(ap.white(`${a}`))}),n.command("slot").description("Show Current Slot").action(()=>{let s=js();console.log({slot:s})}),n.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","45").option("-l, --ledgerPath <ledgerPath>","Ledger Path","/mnt/ledger").option("-s, --snapshotPath <snapshotPath>","Snapshot Path","/mnt/ledger/snapshot").option("-v, --version <version>","Specific Version Node",o).description("Download the latest snapshot").action(s=>{let a=s.minDownloadSpeed,i=s.ledgerPath,c=s.snapshotPath,l=s.version;Me(e,a,i,c,l)}),n.command("snapshot-finder").description("Clone and run solana-snapshot-finder to fetch a snapshot").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed (MB/s)","100").option("-x, --maxLatency <maxLatency>","Maximum latency (ms)","1000").option("-p, --snapshotPath <snapshotPath>","Snapshot download path","/mnt/ledger").action(s=>{Ys({minDownloadSpeed:s.minDownloadSpeed,maxLatency:s.maxLatency,snapshotPath:s.snapshotPath})}),n.command("contact").description("Show Validator Contact Information").action(()=>{let a=`${U()} --ledger /mnt/ledger/ contact-info`;Bs(a,{shell:!0,stdio:"inherit"})}),n.command("config").description("Show Solc Config").alias("c").action(async()=>{ro()}),n.command("aa").description("Show Solc AA").option("-c, --client","Show Solc Client Mode AA",!1).action(s=>{Kt.solvAA(),s.client?Kt.installClientMessage():Kt.installMessage()}),n.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as ip}from"node:child_process";var Gs=r(()=>{ip("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as cp}from"node:child_process";var zs=r(()=>{cp("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as lp}from"node:child_process";var Ws=r(()=>{lp("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as mp}from"node:child_process";var qs=r(()=>{mp("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as pp}from"node:child_process";var Qs=r((t=!1)=>{pp(t?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import Do from"chalk";import{spawnSync as up}from"child_process";import{spawnSync as dp}from"node:child_process";var Xs=r(()=>{dp("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Zs=r(()=>{let t=h.command("relayer").description("Jito Relayer Commands");t.command("status").description("Show Relayer Status").action(()=>{Gs()}),t.command("start").description("Start Relayer").action(()=>{zs()}),t.command("stop").description("Stop Relayer").action(()=>{Ws()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{Qs(e.error)}),t.command("restart").description("Restart Relayer").action(()=>{qs()}),t.command("enable").description("Enable Relayer").action(()=>{Xs()}),t.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(Do.red("Please provide a URL"));return}let o=`${U()} --ledger ${y} set-relayer-config --relayer-url ${e.url}`;console.log(Do.white("Setting Relayer URL ...")),up(o,{shell:!0,stdio:"inherit"}),console.log(Do.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{writeFile as fp,mkdir as hp}from"fs/promises";import{existsSync as ta}from"fs";import yp from"path";import Ko from"chalk";var Sp=r((t,e)=>{let o=t;if(e.identity&&(o=o.replace(/identity_path\s*=\s*\"[^\"]*\"/,`identity_path = "${e.identity}"`)),e.vote&&(o=o.replace(/vote_account_path\s*=\s*\"[^\"]*\"/,`vote_account_path = "${e.vote}"`)),e.auth&&e.auth.length>0){let n=e.auth.map(s=>`"${s}"`).join(`,
583
581
  `);o=o.replace(/authorized_voter_paths\s*=\s*\[[\s\S]*?\]/,`authorized_voter_paths = [
584
582
  ${n}
585
- ]`)}return e.blockEngineUrl&&(o=o.replace(/url\s*=\s*\"[^\"]*\"/,`url = "${e.blockEngineUrl}"`)),o},"renderWithOverrides"),Gs=r(()=>{h.command("firedancer").description("Firedancer utilities").command("config").description("Generate Firedancer config.toml").option("-n, --network <network>","Network: mainnet-beta|testnet").option("-i, --identity <path>","Identity keypair path").option("-v, --vote <path>","Vote account keypair path").option("-a, --auth <paths...>","Authorized voter keypair paths").option("-o, --out <path>","Output path","/home/solv/firedancer/config.toml").option("-f, --force","Overwrite if exists",!1).option("--dry-run","Print to stdout instead of writing",!1).option("--jito-region <region>",`Jito region (${Object.keys(G).join("|")})`).action(async e=>{let o=await I(),s=(e.network||o.NETWORK)===u.MAINNET?Fe():Me(),a;if(e.jitoRegion){let m=e.jitoRegion,d=G[m];if(!d){console.log(Lo.red(`Invalid --jito-region '${e.jitoRegion}'. Choose one of: ${Object.keys(G).join(", ")}`));return}a=d.BLOCK_ENGINE_URL}let i=ip(s.body,{identity:e.identity,vote:e.vote,auth:e.auth,blockEngineUrl:a});if(e.dryRun){console.log(i);return}let c=e.out||s.filePath,l=ap.dirname(c);if(Bs(l)||await sp(l,{recursive:!0}),Bs(c)&&!e.force){console.log(Lo.red(`File exists: ${c}. Use --force to overwrite or --dry-run to preview`));return}await np(c,i),console.log(Lo.green(`Wrote Firedancer config: ${c}`))})},"firedancerCommands");import zs from"chalk";import{spawnSync as cp}from"child_process";var Ws=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;cp(e,{shell:!0,stdio:"inherit"})}catch{console.log(zs.yellow(`You might need to install the Solana SPL CLI:
586
- `)),console.log(zs.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as mp}from"os";import{spawnSync as lp}from"child_process";var ut=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=lp(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import pp from"chalk";import{spawnSync as dp}from"node:child_process";var qs=r(t=>{h.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let n=`${mp()}/mainnet-authority-keypair.json`;await Ws(n),process.exit(0)}await up(t),process.exit(0)})},"balanceCommands"),up=r(async t=>{let e=fp(t),o=`Validator Key: ${e.validatorKey}
583
+ ]`)}return e.blockEngineUrl&&(o=o.replace(/url\s*=\s*\"[^\"]*\"/,`url = "${e.blockEngineUrl}"`)),o},"renderWithOverrides"),ea=r(()=>{h.command("firedancer").description("Firedancer utilities").command("config").description("Generate Firedancer config.toml").option("-n, --network <network>","Network: mainnet-beta|testnet").option("-i, --identity <path>","Identity keypair path").option("-v, --vote <path>","Vote account keypair path").option("-a, --auth <paths...>","Authorized voter keypair paths").option("-o, --out <path>","Output path","/home/solv/firedancer/config.toml").option("-f, --force","Overwrite if exists",!1).option("--dry-run","Print to stdout instead of writing",!1).option("--jito-region <region>",`Jito region (${Object.keys(W).join("|")})`).action(async e=>{let o=await v(),n=e.network||o.NETWORK,s=o.FRANKENDANCER_BLOCK_ENGINE_URL,a=n===u.MAINNET?Be({blockEngineUrl:s}):Ye(),i;if(e.jitoRegion){let d=e.jitoRegion,p=W[d];if(!p){console.log(Ko.red(`Invalid --jito-region '${e.jitoRegion}'. Choose one of: ${Object.keys(W).join(", ")}`));return}i=p.BLOCK_ENGINE_URL}let c=Sp(a.body,{identity:e.identity,vote:e.vote,auth:e.auth,blockEngineUrl:i});if(e.dryRun){console.log(c);return}let l=e.out||a.filePath,m=yp.dirname(l);if(ta(m)||await hp(m,{recursive:!0}),ta(l)&&!e.force){console.log(Ko.red(`File exists: ${l}. Use --force to overwrite or --dry-run to preview`));return}await fp(l,c),console.log(Ko.green(`Wrote Firedancer config: ${l}`))})},"firedancerCommands");import le from"chalk";import*as at from"node:fs";import so from"node:path";import{homedir as oa}from"node:os";import{spawnSync as Tp}from"node:child_process";var Uo="https://github.com/anza-xyz/agave.git",Mo=so.join(oa(),"agave"),Fo=so.join(oa(),".local","bin","agave-validator"),no=r((t,e,o)=>{if(Tp(t,e,{stdio:"inherit",cwd:o}).status!==0)throw new Error(`Command failed: ${t} ${e.join(" ")}`.trim())},"run"),ra=r((t={})=>{let e=t.repo??Uo,o=t.tag??`v${D}`,n=t.dir??Mo,s=t.installPath??Fo;at.existsSync(n)?console.log(le.gray(`Using existing repository at ${n}`)):(console.log(le.gray(`Cloning ${e} into ${n}`)),no("git",["clone",e,n])),console.log(le.gray(`Checking out ${o}`)),no("git",["fetch","--all","--tags"],n),no("git",["checkout",o],n),console.log(le.gray("Building agave-validator (release)")),no("cargo",["build","--release","--bin","agave-validator"],n);let a=so.join(n,"target","release","agave-validator");if(!at.existsSync(a))throw new Error(`Build artifact not found: ${a}`);let i=so.dirname(s);return at.existsSync(i)||at.mkdirSync(i,{recursive:!0}),at.copyFileSync(a,s),at.chmodSync(s,493),console.log(le.green(`agave-validator installed to ${s}`)),s},"buildAgaveValidator");var na=r(()=>{h.command("build").description("Build Solana/Agave components from source").command("agave").description("Build agave-validator from source").option("-t, --tag <tag>","Git tag or branch",`v${D}`).option("-r, --repo <repo>","Git repository",Uo).option("-d, --dir <dir>","Directory for cloning/building",Mo).option("-o, --output <path>","Output path for the compiled binary",Fo).action(e=>{ra({repo:e.repo,tag:e.tag,dir:e.dir,installPath:e.output})})},"buildCommands");import sa from"chalk";import{spawnSync as gp}from"child_process";var aa=r(async t=>{try{let e=`spl-token accounts --owner ${t}`;gp(e,{shell:!0,stdio:"inherit"})}catch{console.log(sa.yellow(`You might need to install the Solana SPL CLI:
584
+ `)),console.log(sa.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as Ap}from"os";import{spawnSync as Ep}from"child_process";var ht=r(t=>{let e=`solana balance --keypair ${t}`,{stdout:o}=Ep(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolBalance");import wp from"chalk";import{spawnSync as _p}from"node:child_process";var ia=r(t=>{h.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let n=`${Ap()}/mainnet-authority-keypair.json`;await aa(n),process.exit(0)}await Np(t),process.exit(0)})},"balanceCommands"),Np=r(async t=>{let e=Op(t),o=`Validator Key: ${e.validatorKey}
587
585
  Address: ${e.validatorKeyAddress}
588
586
  Balance: ${e.validatorKeyBalance}
589
587
  Vote Key: ${e.voteKey}
@@ -592,21 +590,21 @@ Balance: ${e.voteKeyBalance}
592
590
  Authority Key: ${e.authorityKey}
593
591
  Address: ${e.authorityKeyAddress}
594
592
  Balance: ${e.authorityKeyBalance}
595
- Active Identity:`;t.NODE_TYPE===T.RPC&&(o=`Validator Key: ${e.validatorKey}
593
+ Active Identity:`;t.NODE_TYPE===g.RPC&&(o=`Validator Key: ${e.validatorKey}
596
594
  Address: ${e.validatorKeyAddress}
597
595
  Balance: ${e.validatorKeyBalance}
598
- Active Identity:`),console.log(pp.white(o)),dp(`solana-keygen pubkey ${O}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),fp=r(t=>{let e=A(),o=t.NETWORK===u.TESTNET;return t.NODE_TYPE===T.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:E(e.mainnetValidatorKey),validatorKeyBalance:ut(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:E(e.testnetValidatorKey),validatorKeyBalance:ut(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:E(e.testnetValidatorVoteKey),voteKeyBalance:ut(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:E(e.testnetValidatorAuthorityKey),authorityKeyBalance:ut(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:E(e.mainnetValidatorKey),validatorKeyBalance:ut(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:E(e.mainnetValidatorVoteKey),voteKeyBalance:ut(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:E(e.mainnetValidatorAuthorityKey),authorityKeyBalance:ut(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as hp}from"child_process";var Qs=r(()=>{hp("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as Xs}from"node:child_process";var Zs=r(()=>{Xs("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),Xs("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as yp}from"node:child_process";var ta=r(t=>{let o=`${K()} --ledger ${y} monitor`;yp(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as Sp}from"node:child_process";var ea=r(()=>{Sp("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import to from"inquirer";import{execSync as eo,spawnSync as Po}from"child_process";import se from"chalk";import{homedir as Tp}from"os";var oa=1e3,xo;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})(xo||(xo={}));var oo;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(oo||(oo={}));var gp=Object.values(xo),ra=r(t=>{h.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(se.blue(`\u2728 Coming Soon
596
+ Active Identity:`),console.log(wp.white(o)),_p(`solana-keygen pubkey ${R}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),Op=r(t=>{let e=w(),o=t.NETWORK===u.TESTNET;return t.NODE_TYPE===g.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:E(e.mainnetValidatorKey),validatorKeyBalance:ht(e.mainnetValidatorKey)}:o?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:E(e.testnetValidatorKey),validatorKeyBalance:ht(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:E(e.testnetValidatorVoteKey),voteKeyBalance:ht(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:E(e.testnetValidatorAuthorityKey),authorityKeyBalance:ht(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:E(e.mainnetValidatorKey),validatorKeyBalance:ht(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:E(e.mainnetValidatorVoteKey),voteKeyBalance:ht(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:E(e.mainnetValidatorAuthorityKey),authorityKeyBalance:ht(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as Rp}from"child_process";var ca=r(()=>{Rp("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as la}from"node:child_process";var ma=r(()=>{la("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),la("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as kp}from"node:child_process";var pa=r(t=>{let o=`${U()} --ledger ${y} monitor`;kp(o,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as vp}from"node:child_process";var da=r(()=>{vp("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import ao from"inquirer";import{execSync as io,spawnSync as Ho}from"child_process";import me from"chalk";import{homedir as Cp}from"os";var ua=1e3,jo;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account"})(jo||(jo={}));var co;(function(t){t.VALIDATOR="Validator Account",t.AUTHORITY="Authority Account",t.OTHER="Other Account"})(co||(co={}));var Ip=Object.values(jo),fa=r(t=>{h.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(me.blue(`\u2728 Coming Soon
599
597
  This Feature is Currently Under Development
600
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await Ep(),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(se.red(`\u274C To Wallet is Invalid
601
- Please Check the Wallet Address`)),process.exit(0)}let i=eo(`solana balance ${n} --url ${t.RPC_URL}`).toString();console.log(se.white(`\u{1F3E6} From Wallet: ${n}
602
- \u{1F4B0} Balance: ${i}`)),console.log(se.white(`\u{1F3E6} To Wallet: ${s}
603
- \u{1F4B0} Balance: ${a}`));let{amount:c}=await to.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=ue;for(;m.status!==0&&d>0;)console.log(se.red(`\u274C Transaction Failed
604
- Retrying Transaction in ${oa}ms
605
- Retries Left: ${d}`)),await rt(oa),m=Po(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),ae=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Ep=r(async()=>{let t=Tp(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=eo(`solana address -k ${n}`).toString().trim(),a=await to.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:gp}]),i=a.from==="Validator Account"?Object.values(oo).filter(p=>p!=="Validator Account"):Object.values(oo).filter(p=>p!=="Authority Account");if((await to.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:p}=await to.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:ae}]);s=p}else{let p=a.from==="Validator Account"?e:o;n=`${t}/${p}`,s=eo(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=eo(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import na from"chalk";import wp from"inquirer";import{execSync as Vo,spawnSync as Ap}from"node:child_process";var sa=r(async(t,e=!1)=>{let o=t.NETWORK===u.TESTNET,n=o?Ee: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=Vo(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(na.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(na.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let S=await wp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(S.sol)}let d=Vo(`solana address --keypair ${i}`).toString().trim(),p=Vo(`solana address --keypair ${a}`).toString().trim(),f=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${p} ${l} --authorized-withdrawer ${a} --url ${n}`;Ap(f,{shell:!0,stdio:"inherit"})},"withdraw");var aa=r(t=>{h.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await sa(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as $p,spawnSync as bp}from"node:child_process";import{BN as ca}from"bn.js";import{LAMPORTS_PER_SOL as $o}from"@solana/web3.js";import{Connection as kp,LAMPORTS_PER_SOL as vp}from"@solana/web3.js";import{Keypair as _p}from"@solana/web3.js";import{readFile as Np}from"fs/promises";var Op=r(async t=>{let e=JSON.parse(await Np(t,"utf8"));return _p.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),ia=Op;import{homedir as Rp}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"},Ip=r(async(t,e="auth",o=!1)=>{let n=new kp(t),s=Rp(),a=A(s),c=`${o?"testnet":"mainnet"}${Cp[e]}`,l=a[c],m=await ia(l),d=await n.getBalance(m.publicKey),f=Number(d)/vp;if(isNaN(f))throw new Error("Failed to get balance");return f},"getBalance"),st=Ip;var Lp=new ca(3*$o),la=r(async t=>{let e=await st(t,j.VALIDATOR),n=new ca(Number(Number(e)*$o)).sub(Lp),s=Number(n)/$o;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import ie from"chalk";import{Keypair as Pp,Connection as xp,PublicKey as Vp,SystemProgram as ma,ComputeBudgetProgram as ro,VersionedTransaction as pa,TransactionMessage as da}from"@solana/web3.js";var ua=r(async(t,e,o,n)=>{let s=0;try{let a=new xp(t,"finalized"),i=Pp.fromSecretKey(new Uint8Array(Array.from(e))),c=new Vp(o),l=n;for(;;)try{let m=[ma.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),ro.setComputeUnitLimit({units:2e5}),ro.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),p=new pa(new da({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),f=await a.simulateTransaction(p,{replaceRecentBlockhash:!0,sigVerify:!1});p.sign([i]);let S=[ma.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),ro.setComputeUnitLimit({units:f.value.unitsConsumed?Math.trunc(f.value.unitsConsumed*1.2):2e5}),ro.setComputeUnitPrice({microLamports:1e3})],w=new pa(new da({instructions:S,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message());w.sign([i]);let _=await a.sendRawTransaction(w.serialize());return await a.confirmTransaction({...d.value,signature:_},"finalized"),console.log("finalized signature:",_),_}catch(m){if(s++,s>ue)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await rt(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as Kp}from"fs/promises";import{LAMPORTS_PER_SOL as Dp}from"@solana/web3.js";var bo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=A();await st(t,j.VOTE)<1?(console.log(ie.white("Vote Account Balance is less than 1 SOL")),console.log(ie.white("Skip withdrawing SOL from Vote Account to Authority Account"))):bp("solc withdraw --all",{shell:!0,stdio:"inherit"});let s=await la(t);console.log(ie.white(`Transferable Balance: ${s} SOL`));let a=s*Dp;if(s<1)console.log(ie.white("Validator Account Balance is less than 1 SOL")),console.log(ie.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=$p(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await Kp(o,"utf-8"));await ua(t,c,i,a)}return!0},"collectSOL");import{readFile as Wp}from"fs/promises";import qp from"inquirer";import Ko from"chalk";import{execSync as Up}from"child_process";import{homedir as Mp}from"os";var Fp=r(async t=>{try{let e=Mp(),{mainnetValidatorAuthorityKey:o}=A(e),n=`spl-token balance ${Z} --owner ${o} --url ${t}`,s=Up(n).toString().trim();return Number(s)}catch(e){return console.log(Ko.red(`Error: ${e}`)),console.log(Ko.yellow(`You might need to install the Solana SPL CLI:
606
- `)),console.log(Ko.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),fa=Fp;import ao from"chalk";import{Connection as Hp,PublicKey as ha,Keypair as jp,ComputeBudgetProgram as no,VersionedTransaction as ya,TransactionMessage as Sa}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Ta,createTransferInstruction as ga,TOKEN_PROGRAM_ID as Ea}from"@solana/spl-token";var wa=r(async(t,e,o,n,s,a)=>{try{let i=new Hp(t,"finalized"),c=jp.fromSecretKey(new Uint8Array(e)),l=new ha(o),m=new ha(s),d=Math.trunc(n*Math.pow(10,a)),p=await Ta(i,c,m,c.publicKey),f=await Ta(i,c,m,l,!0);for(;;)try{let S=[ga(p.address,f.address,c.publicKey,d,[],Ea),no.setComputeUnitLimit({units:2e5}),no.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],w=await i.getLatestBlockhashAndContext({commitment:"finalized"}),_=new ya(new Sa({instructions:S,payerKey:c.publicKey,recentBlockhash:w.value.blockhash}).compileToV0Message()),N=await i.simulateTransaction(_,{replaceRecentBlockhash:!0,sigVerify:!1});_.sign([c]);let z=[ga(p.address,f.address,c.publicKey,d,[],Ea),no.setComputeUnitLimit({units:N.value.unitsConsumed?Math.trunc(N.value.unitsConsumed*1.2):2e5}),no.setComputeUnitPrice({microLamports:1e3})],V=new ya(new Sa({instructions:z,payerKey:c.publicKey,recentBlockhash:w.value.blockhash}).compileToV0Message());V.sign([c]);let Ot=await i.sendRawTransaction(V.serialize());return await i.confirmTransaction({...w.value,signature:Ot},"finalized"),console.log("finalized signature:",Ot),Ot}catch(S){console.error("Transfer failed, retrying...",S)}}catch(i){throw console.error(i),i}},"transferSPLToken");import so from"inquirer";import{spawnSync as Aa}from"child_process";import Do from"chalk";import{promises as _a}from"fs";var Yp=r(async(t="epochTimer")=>{try{let e=Aa("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(`
598
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:o,fromAddress:n,toAddress:s}=await Lp(),a="0";try{let p=Ho(`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(me.red(`\u274C To Wallet is Invalid
599
+ Please Check the Wallet Address`)),process.exit(0)}let i=io(`solana balance ${n} --url ${t.RPC_URL}`).toString();console.log(me.white(`\u{1F3E6} From Wallet: ${n}
600
+ \u{1F4B0} Balance: ${i}`)),console.log(me.white(`\u{1F3E6} To Wallet: ${s}
601
+ \u{1F4B0} Balance: ${a}`));let{amount:c}=await ao.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=Ho(l,{shell:!0,stdio:"inherit"}),d=Se;for(;m.status!==0&&d>0;)console.log(me.red(`\u274C Transaction Failed
602
+ Retrying Transaction in ${ua}ms
603
+ Retries Left: ${d}`)),await nt(ua),m=Ho(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),pe=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Lp=r(async()=>{let t=Cp(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=io(`solana address -k ${n}`).toString().trim(),a=await ao.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:Ip}]),i=a.from==="Validator Account"?Object.values(co).filter(p=>p!=="Validator Account"):Object.values(co).filter(p=>p!=="Authority Account");if((await ao.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:p}=await ao.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:pe}]);s=p}else{let p=a.from==="Validator Account"?e:o;n=`${t}/${p}`,s=io(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=io(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import ha from"chalk";import Pp from"inquirer";import{execSync as Yo,spawnSync as xp}from"node:child_process";var ya=r(async(t,e=!1)=>{let o=t.NETWORK===u.TESTNET,n=o?Oe:t.RPC_URL,s=o?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",a=o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",i=o?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",c=Yo(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(ha.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(ha.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let T=await Pp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(T.sol)}let d=Yo(`solana address --keypair ${i}`).toString().trim(),p=Yo(`solana address --keypair ${a}`).toString().trim(),f=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${p} ${l} --authorized-withdrawer ${a} --url ${n}`;xp(f,{shell:!0,stdio:"inherit"})},"withdraw");var Sa=r(t=>{h.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await ya(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as Jp,spawnSync as Gp}from"node:child_process";import{BN as ga}from"bn.js";import{LAMPORTS_PER_SOL as Bo}from"@solana/web3.js";import{Connection as Dp,LAMPORTS_PER_SOL as Kp}from"@solana/web3.js";import{Keypair as Vp}from"@solana/web3.js";import{readFile as $p}from"fs/promises";var bp=r(async t=>{let e=JSON.parse(await $p(t,"utf8"));return Vp.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),Ta=bp;import{homedir as Up}from"os";var B;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(B||(B={}));var Mp={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},Fp=r(async(t,e="auth",o=!1)=>{let n=new Dp(t),s=Up(),a=w(s),c=`${o?"testnet":"mainnet"}${Mp[e]}`,l=a[c],m=await Ta(l),d=await n.getBalance(m.publicKey),f=Number(d)/Kp;if(isNaN(f))throw new Error("Failed to get balance");return f},"getBalance"),it=Fp;var Hp=new ga(3*Bo),Ea=r(async t=>{let e=await it(t,B.VALIDATOR),n=new ga(Number(Number(e)*Bo)).sub(Hp),s=Number(n)/Bo;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import de from"chalk";import{Keypair as jp,Connection as Yp,PublicKey as Bp,SystemProgram as Aa,ComputeBudgetProgram as lo,VersionedTransaction as wa,TransactionMessage as _a}from"@solana/web3.js";var Na=r(async(t,e,o,n)=>{let s=0;try{let a=new Yp(t,"finalized"),i=jp.fromSecretKey(new Uint8Array(Array.from(e))),c=new Bp(o),l=n;for(;;)try{let m=[Aa.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),lo.setComputeUnitLimit({units:2e5}),lo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),p=new wa(new _a({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),f=await a.simulateTransaction(p,{replaceRecentBlockhash:!0,sigVerify:!1});p.sign([i]);let T=[Aa.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),lo.setComputeUnitLimit({units:f.value.unitsConsumed?Math.trunc(f.value.unitsConsumed*1.2):2e5}),lo.setComputeUnitPrice({microLamports:1e3})],A=new wa(new _a({instructions:T,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message());A.sign([i]);let N=await a.sendRawTransaction(A.serialize());return await a.confirmTransaction({...d.value,signature:N},"finalized"),console.log("finalized signature:",N),N}catch(m){if(s++,s>Se)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await nt(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as zp}from"fs/promises";import{LAMPORTS_PER_SOL as Wp}from"@solana/web3.js";var Jo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=w();await it(t,B.VOTE)<1?(console.log(de.white("Vote Account Balance is less than 1 SOL")),console.log(de.white("Skip withdrawing SOL from Vote Account to Authority Account"))):Gp("solc withdraw --all",{shell:!0,stdio:"inherit"});let s=await Ea(t);console.log(de.white(`Transferable Balance: ${s} SOL`));let a=s*Wp;if(s<1)console.log(de.white("Validator Account Balance is less than 1 SOL")),console.log(de.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=Jp(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await zp(o,"utf-8"));await Na(t,c,i,a)}return!0},"collectSOL");import{readFile as ad}from"fs/promises";import id from"inquirer";import Go from"chalk";import{execSync as qp}from"child_process";import{homedir as Qp}from"os";var Xp=r(async t=>{try{let e=Qp(),{mainnetValidatorAuthorityKey:o}=w(e),n=`spl-token balance ${rt} --owner ${o} --url ${t}`,s=qp(n).toString().trim();return Number(s)}catch(e){return console.log(Go.red(`Error: ${e}`)),console.log(Go.yellow(`You might need to install the Solana SPL CLI:
604
+ `)),console.log(Go.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Oa=Xp;import uo from"chalk";import{Connection as Zp,PublicKey as Ra,Keypair as td,ComputeBudgetProgram as mo,VersionedTransaction as ka,TransactionMessage as va}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Ca,createTransferInstruction as Ia,TOKEN_PROGRAM_ID as La}from"@solana/spl-token";var Pa=r(async(t,e,o,n,s,a)=>{try{let i=new Zp(t,"finalized"),c=td.fromSecretKey(new Uint8Array(e)),l=new Ra(o),m=new Ra(s),d=Math.trunc(n*Math.pow(10,a)),p=await Ca(i,c,m,c.publicKey),f=await Ca(i,c,m,l,!0);for(;;)try{let T=[Ia(p.address,f.address,c.publicKey,d,[],La),mo.setComputeUnitLimit({units:2e5}),mo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],A=await i.getLatestBlockhashAndContext({commitment:"finalized"}),N=new ka(new va({instructions:T,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message()),O=await i.simulateTransaction(N,{replaceRecentBlockhash:!0,sigVerify:!1});N.sign([c]);let q=[Ia(p.address,f.address,c.publicKey,d,[],La),mo.setComputeUnitLimit({units:O.value.unitsConsumed?Math.trunc(O.value.unitsConsumed*1.2):2e5}),mo.setComputeUnitPrice({microLamports:1e3})],$=new ka(new va({instructions:q,payerKey:c.publicKey,recentBlockhash:A.value.blockhash}).compileToV0Message());$.sign([c]);let kt=await i.sendRawTransaction($.serialize());return await i.confirmTransaction({...A.value,signature:kt},"finalized"),console.log("finalized signature:",kt),kt}catch(T){console.error("Transfer failed, retrying...",T)}}catch(i){throw console.error(i),i}},"transferSPLToken");import po from"inquirer";import{spawnSync as xa}from"child_process";import zo from"chalk";import{promises as Va}from"fs";var ed=r(async(t="epochTimer")=>{try{let e=xa("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(zo.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
607
605
  `).filter(a=>!a.includes(t)).join(`
608
- `),s="/tmp/temp_crontab";await _a.writeFile(s,n,"utf-8"),Aa("crontab",[s]),await _a.unlink(s),console.log(Do.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Do.red("Error removing cron job:",e))}},"removeCronJob"),Na=Yp;import Oa from"chalk";var Jp=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await so.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solc Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await Ye()&&await Na(),await k({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
609
- ${Oa.green("No more Login to the server to update \u{1F331}")}
606
+ `),s="/tmp/temp_crontab";await Va.writeFile(s,n,"utf-8"),xa("crontab",[s]),await Va.unlink(s),console.log(zo.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(zo.red("Error removing cron job:",e))}},"removeCronJob"),$a=ed;import ba from"chalk";var od=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await po.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solc Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await ze()&&await $a(),await _({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
607
+ ${ba.green("No more Login to the server to update \u{1F331}")}
610
608
 
611
609
  If you enable this, solc will update automatically when the solc/solana version is updated.
612
610
 
@@ -614,91 +612,91 @@ AUTO UPDATE: If you enable this, solc will update automatically when the solc ve
614
612
 
615
613
  AUTO RESTART: If you enable this, solc will restart automatically when the solana version is updated.
616
614
  \u203B Please turn off if you are using no-downtime migration.
617
- `;console.log(Oa.white(n));let s=await so.prompt([{type:"confirm",name:"autoUpdate",message:"Do you want to enable AUTO UPDATE? (Recommended)",default:!1},{type:"confirm",name:"autoRestart",message:"Do you want to enable AUTO RESTART?",default:!1}]),a=t.RPC_URL,i=t.HARVEST_ACCOUNT===""?"Enter your Harvest Address":t.HARVEST_ACCOUNT,c=await so.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await so.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL},{type:"input",name:"harvestAddress",message:"Enter your Harvest Address",default:i,validate:ae}]);i=l.harvestAddress,a=l.rpcUrl}return await k({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"),ka=Jp;import{spawnSync as Qp}from"node:child_process";import{Connection as zp}from"@solana/web3.js";import{Connection as Bp}from"@solana/web3.js";var Gp=r(async(t,e=10,o=.4)=>{try{let s=await new Bp(t).getRecentPerformanceSamples(e);if(s.length===0)return console.warn("No performance samples available. Using fallback slot time."),o;let a=s.filter(c=>c.numSlots!==0);return a.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),o):a.reduce((c,l)=>c+l.samplePeriodSecs/l.numSlots,0)/a.length}catch(n){return console.error(`getAverageSlotTime failed: ${n}. Using fallback slot time.`),o}},"getAverageSlotTime"),va=Gp;var Uo=r(async t=>{try{let o=await new zp(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await va(t);console.log("timePerSlotSeconds",n);let a=(o.slotsInEpoch-o.slotIndex)*n,i=(o.slotIndex/o.slotsInEpoch*100).toFixed(2),c=Math.floor(a/(3600*24)),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 Xp=.03,Ra=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await Zp(t),{mainnetValidatorAuthorityKey:o}=A();console.log("Harvesting SOL..."),await bo(t.RPC_URL);let n=await st(t.RPC_URL,j.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await rt(1e3),await bo(t.RPC_URL),n=await st(t.RPC_URL,j.VOTE),s++;let a=JSON.parse(await Wp(o,"utf-8")),i=await st(t.RPC_URL,j.AUTH);if(i<1)console.log(ao.white("Authority Account Balance is less than 1 SOL")),console.log(ao.white("Skip converting SOL to elSOL"));else{let l=i-Xp;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await qe(t.RPC_URL,B,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await fa(t.RPC_URL);if(c<1){let l=await Uo(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 wa(t.RPC_URL,a,e,c,Z,hr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Uo(t.RPC_URL)).epoch} \u{1F4B0}
615
+ `;console.log(ba.white(n));let s=await po.prompt([{type:"confirm",name:"autoUpdate",message:"Do you want to enable AUTO UPDATE? (Recommended)",default:!1},{type:"confirm",name:"autoRestart",message:"Do you want to enable AUTO RESTART?",default:!1}]),a=t.RPC_URL,i=t.HARVEST_ACCOUNT===""?"Enter your Harvest Address":t.HARVEST_ACCOUNT,c=await po.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await po.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:pe}]);i=l.harvestAddress,a=l.rpcUrl}return await _({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"),Da=od;import{spawnSync as cd}from"node:child_process";import{Connection as sd}from"@solana/web3.js";import{Connection as rd}from"@solana/web3.js";var nd=r(async(t,e=10,o=.4)=>{try{let s=await new rd(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"),Ka=nd;var Wo=r(async t=>{try{let o=await new sd(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await Ka(t);console.log("timePerSlotSeconds",n);let a=(o.slotsInEpoch-o.slotIndex)*n,i=(o.slotIndex/o.slotsInEpoch*100).toFixed(2),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 ld=.03,Ua=r(t=>{h.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await md(t),{mainnetValidatorAuthorityKey:o}=w();console.log("Harvesting SOL..."),await Jo(t.RPC_URL);let n=await it(t.RPC_URL,B.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await nt(1e3),await Jo(t.RPC_URL),n=await it(t.RPC_URL,B.VOTE),s++;let a=JSON.parse(await ad(o,"utf-8")),i=await it(t.RPC_URL,B.AUTH);if(i<1)console.log(uo.white("Authority Account Balance is less than 1 SOL")),console.log(uo.white("Skip converting SOL to elSOL"));else{let l=i-ld;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await to(t.RPC_URL,z,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await Oa(t.RPC_URL);if(c<1){let l=await Wo(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 Pa(t.RPC_URL,a,e,c,rt,Lr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Wo(t.RPC_URL)).epoch} \u{1F4B0}
618
616
  Validator Address: ${E(o)}
619
617
  Total Reward: ${c} elSOL
620
- Harvest Address: ${e}`;await x(m)}console.log(ao.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await ka(t)&&(Qp("solc cron epoch",{stdio:"inherit",shell:!0}),console.log(ao.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),Zp=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await qp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:ae}]);return await k({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as wd}from"@skeet-framework/utils";import{writeFile as td}from"fs/promises";var ed=r(async t=>{await td(ge,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),ft=ed;var od=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,{mainnetValidatorKey:s,testnetValidatorKey:a}=A(),i=n?E(a):E(s),c=`===\u23F3 ${t.epoch} \u23F3===
618
+ Harvest Address: ${e}`;await V(m)}console.log(uo.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),h.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Da(t)&&(cd("solc cron epoch",{stdio:"inherit",shell:!0}),console.log(uo.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),md=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await id.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:pe}]);return await _({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as Pd}from"@skeet-framework/utils";import{writeFile as pd}from"fs/promises";var dd=r(async t=>{await pd(Ne,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),yt=dd;var ud=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,{mainnetValidatorKey:s,testnetValidatorKey:a}=w(),i=n?E(a):E(s),c=`===\u23F3 ${t.epoch} \u23F3===
621
619
  Validator: ${i}
622
620
  Network: ${o.NETWORK}
623
621
  CurrentEpoch: ${t.epoch}
624
622
  Next epoch is coming in less than ${e}!
625
623
  Epoch Completed: ${t.epochCompletedPercent}%
626
- Until Next Epoch: ${t.epochRemainingTime}`;await x(c)},"alertMessage"),$t=od;var rd=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await ft({...e,isLessThan1Day:!0}),await $t(o,"1 Day",n))},"isLessThan1Day"),Ca=rd;var nd=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await ft({...e,isLessThan8Hours:!0}),await $t(o,"8 Hours",n))},"lessThan8Hour"),Ia=nd;import{spawnSync as ad}from"child_process";import id from"chalk";var sd=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"),La=sd;var cd=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 $t(o,"1 Hour",n),s&&a){let i=await La(1,100);console.log(id.white(`\u23F3 Waiting for ${i} seconds before running solc harvest...`)),ad("solc",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),Pa=cd;var ld=r(async(t,e)=>{let o=e.NETWORK===u.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=A(),i=o?E(a):E(s);await ft(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
624
+ Until Next Epoch: ${t.epochRemainingTime}`;await V(c)},"alertMessage"),Mt=ud;var fd=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await yt({...e,isLessThan1Day:!0}),await Mt(o,"1 Day",n))},"isLessThan1Day"),Ma=fd;var hd=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await yt({...e,isLessThan8Hours:!0}),await Mt(o,"8 Hours",n))},"lessThan8Hour"),Fa=hd;import{spawnSync as Sd}from"child_process";import Td from"chalk";var yd=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"),Ha=yd;var gd=r(async(t,e,o,n)=>{let s=n.IS_MEV_MODE,a=n.NETWORK===u.MAINNET;if(t<60&&!e.isLessThan1Hour){if(await yt({...e,isLessThan1Hour:!0}),await Mt(o,"1 Hour",n),s&&a){let i=await Ha(1,100);console.log(Td.white(`\u23F3 Waiting for ${i} seconds before running solc harvest...`)),Sd("solc",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),ja=gd;var Ed=r(async(t,e)=>{let o=e.NETWORK===u.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=w(),i=o?E(a):E(s);await yt(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
627
625
  Validator: ${i}
628
626
  Network: ${e.NETWORK}
629
627
  CurrentEpoch: ${t.epoch}
630
628
  Epoch has been updated!
631
- Until Next Epoch: Approximately 2 days`;return await x(c),"Epoch has been updated!"},"newEpoch"),xa=ld;import{existsAsync as md}from"@skeet-framework/utils";import{readFile as pd,writeFile as dd}from"fs/promises";import ud from"chalk";import{homedir as fd}from"os";var hd=r(async()=>{let e=fd().includes("/home/solv")?ge:"./currentEpoch.json";if(await md(e))return JSON.parse(await pd(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await dd(e,JSON.stringify(o,null,2),"utf-8"),console.log(ud.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),Va=hd;import yd from"chalk";var Sd=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===u.TESTNET;if(o&&(e=qo),await st(e,j.VALIDATOR,o)<ho){let{mainnetValidatorKey:s,testnetValidatorKey:a}=A(),i=o?E(a):E(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${ho} SOL
629
+ Until Next Epoch: Approximately 2 days`;return await V(c),"Epoch has been updated!"},"newEpoch"),Ya=Ed;import{existsAsync as Ad}from"@skeet-framework/utils";import{readFile as wd,writeFile as _d}from"fs/promises";import Nd from"chalk";import{homedir as Od}from"os";var Rd=r(async()=>{let e=Od().includes("/home/solv")?Ne:"./currentEpoch.json";if(await Ad(e))return JSON.parse(await wd(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await _d(e,JSON.stringify(o,null,2),"utf-8"),console.log(Nd.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),Ba=Rd;import kd from"chalk";var vd=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===u.TESTNET;if(o&&(e=nr),await it(e,B.VALIDATOR,o)<Oo){let{mainnetValidatorKey:s,testnetValidatorKey:a}=w(),i=o?E(a):E(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${Oo} SOL
632
630
  Please top up your Validator Account
633
- Address: ${i}`;return await x(c),!1}return console.log(yd.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),$a=Sd;async function Td(t="@ily-validator/solc"){try{let e=`https://registry.npmjs.org/${t}`,o=await fetch(e);if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return(await o.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${t}:`,e),null}}r(Td,"getNpmLatestVersion");var ba=Td;async function gd(){let t=vt(),e=await ba();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(gd,"isVersionSame");var Ka=gd;import{spawnSync as Ad}from"child_process";import{spawnSync as Ed}from"node:child_process";var Da=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=Ed(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
634
- `),a=s.find(f=>f.includes("Epoch Completed Time:")),i=s.find(f=>f.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(f=>f.includes("Epoch:"))?.replace("Epoch:",""));if(!a||!i||!c)throw new Error("Epoch Completed Time not found");let m=a.split("(")[1].replace(" remaining)","");console.log("remainingTime:",m);let d=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,p=m.match(d);if(p){let f=p[1]?parseInt(p[1]):0,S=p[2]?parseInt(p[2]):0,w=p[3]?parseInt(p[3]):0,_=p[4]?parseInt(p[4]):0,N=f*24*60+S*60+w+Math.floor(_/60);return{epoch:c,day:f,hour:S,min:w,sec:_,totalMinutes:N,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var _d=r(async t=>{let e=t.NETWORK===u.TESTNET,o=e?Ee:t.RPC_URL,n=wd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await Va(),a=Da(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=A(),m=await Bt(o,E(e?c:i));if(m.isActive||await x(`\u26A0\uFE0F Validator is not active!
631
+ Address: ${i}`;return await V(c),!1}return console.log(kd.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Ja=vd;async function Cd(t="@ily-validator/solc"){try{let e=`https://registry.npmjs.org/${t}`,o=await fetch(e);if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return(await o.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${t}:`,e),null}}r(Cd,"getNpmLatestVersion");var Ga=Cd;async function Id(){let t=Pt(),e=await Ga();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(Id,"isVersionSame");var za=Id;import{spawnSync as xd}from"child_process";import{spawnSync as Ld}from"node:child_process";var Wa=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=Ld(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
632
+ `),a=s.find(f=>f.includes("Epoch Completed Time:")),i=s.find(f=>f.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(f=>f.includes("Epoch:"))?.replace("Epoch:",""));if(!a||!i||!c)throw new Error("Epoch Completed Time not found");let m=a.split("(")[1].replace(" remaining)","");console.log("remainingTime:",m);let d=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,p=m.match(d);if(p){let f=p[1]?parseInt(p[1]):0,T=p[2]?parseInt(p[2]):0,A=p[3]?parseInt(p[3]):0,N=p[4]?parseInt(p[4]):0,O=f*24*60+T*60+A+Math.floor(N/60);return{epoch:c,day:f,hour:T,min:A,sec:N,totalMinutes:O,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var Vd=r(async t=>{let e=t.NETWORK===u.TESTNET,o=e?Oe:t.RPC_URL,n=Pd(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await Ba(),a=Wa(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=w(),m=await Qt(o,E(e?c:i));if(m.isActive||await V(`\u26A0\uFE0F Validator is not active!
635
633
  VoteAccount: ${m.pubkey}
636
634
  Reason: ${m.reason}
637
635
  Network: ${t.NETWORK}
638
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await $a(t),!await Ka()&&t.AUTO_UPDATE)return console.log("Found new version of solc! Updating..."),Ad("solc update && solc update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await xa(a,t),"Epoch has been updated!";let p=a.totalMinutes,f=[Pa,Ia,Ca];for(let S of f)if(await S(p,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),Ua=_d;var Ma=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await Ua(t),process.exit(0)})},"epochTimerCommands");import ti from"inquirer";import{join as Ya}from"path";import{spawnSync as Kt}from"node:child_process";import Y from"chalk";import{spawnSync as Nd}from"node:child_process";var Od=r((t,e,o="solv",n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=Nd(`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.
636
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await Ja(t),!await za()&&t.AUTO_UPDATE)return console.log("Found new version of solc! Updating..."),xd("solc update && solc update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Ya(a,t),"Epoch has been updated!";let p=a.totalMinutes,f=[ja,Fa,Ma];for(let T of f)if(await T(p,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),qa=Vd;var Qa=r(t=>{h.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await qa(t),process.exit(0)})},"epochTimerCommands");import pi from"inquirer";import{join as ei}from"path";import{spawnSync as Ht}from"node:child_process";import J from"chalk";import{spawnSync as $d}from"node:child_process";var bd=r((t,e,o="solv",n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=$d(`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.
639
637
  $ ssh ${o}@${t}
640
638
 
641
- 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"),Fa=Od;import Ha from"chalk";var kd=r((t,e)=>{console.log(Ha.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=E(t).trim(),n=Fa(e,`solana-keygen pubkey ${t}`).stdout.toString().trim();return o!==n?(console.log(Ha.yellow(`\u26A0\uFE0F Destination Identity Key is different.
639
+ 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=bd;import Za from"chalk";var Dd=r((t,e)=>{console.log(Za.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=E(t).trim(),n=Xa(e,`solana-keygen pubkey ${t}`).stdout.toString().trim();return o!==n?(console.log(Za.yellow(`\u26A0\uFE0F Destination Identity Key is different.
642
640
  Please check your Validator
643
641
  $ ssh solv@${e}
644
642
 
645
643
  Local Identity Key: ${o}
646
- Destination Identity Key: ${n}`)),!1):!0},"checkValidatorKey"),bt=kd;var io=Ya(C,yt),ja=Ya(C,ht),Ja=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===T.RPC,a=n?L:b;s&&(a=L);let i=K();if(!bt(a,t))return;console.log(Y.white("\u{1F7E2} Waiting for restart window..."));let l=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Kt(l,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
644
+ Destination Identity Key: ${n}`)),!1):!0},"checkValidatorKey"),Ft=Dd;var fo=ei(I,Tt),ti=ei(I,St),oi=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===g.RPC,a=n?P:b;s&&(a=P);let i=U();if(!Ft(a,t))return;console.log(J.white("\u{1F7E2} Waiting for restart window..."));let l=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ht(l,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
647
645
  $ ssh solv@${t}
648
646
 
649
- Failed Cmd: ${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(Y.white("\u{1F7E2} Setting identity on the new validator..."));let d=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} set-identity ${io}'`;if(Kt(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
647
+ Failed Cmd: ${i} -l ${y} 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 d=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${i} -l ${y} set-identity ${fo}'`;if(Ht(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
650
648
  $ ssh solv@${t}
651
649
 
652
- Failed Cmd: ${i} -l ${y} set-identity ${io}`));return}if(console.log(Y.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Kt(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${io} ${ja}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
650
+ Failed Cmd: ${i} -l ${y} set-identity ${fo}`));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 solv@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${fo} ${ti}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
653
651
  $ ssh solv@${t}
654
652
 
655
- Failed Cmd: ln -sf ${io} ${ja}`));return}if(console.log(Y.white("\u{1F7E2} Uploading the tower file to the new validator...")),Kt(`scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
653
+ Failed Cmd: ln -sf ${fo} ${ti}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ht(`scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
656
654
  $ ssh solv@${t}
657
655
 
658
- Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(Y.white("\u{1F7E2} Setting identity on the new validator...")),Kt(`${i} -l ${y} set-identity --require-tower ${a}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
656
+ Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),Ht(`${i} -l ${y} set-identity --require-tower ${a}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
659
657
 
660
658
  Failed Cmd: ${i} -l ${y} set-identity ${a}
661
- ln -sf ${a} ${O}`));return}if(Kt(`ln -sf ${a} ${O}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Y.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
659
+ ln -sf ${a} ${R}`));return}if(Ht(`ln -sf ${a} ${R}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
662
660
 
663
- Failed Cmd: ln -sf ${a} ${O}`));return}console.log(Y.white("\u{1F7E2} Identity changed successfully!")),await k({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as za}from"path";import F from"chalk";import{spawnSync as Dt}from"node:child_process";var Ba=za(C,yt),vd=za(C,ht),Ga="~/.ssh/id_rsa",Wa=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===T.RPC,a=n?L:b;s&&(a=L);let i=K();if(!bt(a,t))return;let l=`${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,m=`${i} -l ${y} set-identity ${Ba}`,d=`ln -sf ${Ba} ${vd}`,p=`scp ${y}/tower-1_9-${e}.bin solv@${t}:${y}`,f=`${i} -l ${y} set-identity --require-tower ${a}`,S=`ln -sf ${a} ${O}`;if(console.log(F.white("\u{1F7E2} Waiting for restart window...")),Dt(l,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
661
+ Failed Cmd: ln -sf ${a} ${R}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await _({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as si}from"path";import j from"chalk";import{spawnSync as jt}from"node:child_process";var ri=si(I,Tt),Kd=si(I,St),ni="~/.ssh/id_rsa",ai=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===g.RPC,a=n?P:b;s&&(a=P);let i=U();if(!Ft(a,t))return;let l=`${i} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,m=`${i} -l ${y} set-identity ${ri}`,d=`ln -sf ${ri} ${Kd}`,p=`scp ${y}/tower-1_9-${e}.bin solv@${t}:${y}`,f=`${i} -l ${y} set-identity --require-tower ${a}`,T=`ln -sf ${a} ${R}`;if(console.log(j.white("\u{1F7E2} Waiting for restart window...")),jt(l,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
664
662
 
665
- Failed Cmd: ${l}`));return}if(console.log(F.white("\u{1F7E2} Setting identity on the new validator...")),Dt(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
663
+ Failed Cmd: ${l}`));return}if(console.log(j.white("\u{1F7E2} Setting identity on the new validator...")),jt(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
666
664
 
667
- Failed Cmd: ${m}`));return}if(console.log(F.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Dt(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
665
+ Failed Cmd: ${m}`));return}if(console.log(j.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),jt(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
668
666
 
669
- Failed Cmd: ${d}`));return}if(console.log(F.white("\u{1F7E2} Uploading the tower file to the new validator...")),Dt(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
667
+ Failed Cmd: ${d}`));return}if(console.log(j.white("\u{1F7E2} Uploading the tower file to the new validator...")),jt(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
670
668
 
671
- Failed Cmd: ${p}`));return}console.log(F.white("\u{1F7E2} Setting identity on the new validator..."));let V=`ssh -i ${Ga} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${f}'`;Dt(V,{shell:!0,stdio:"inherit"}).status!==0&&console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
669
+ Failed Cmd: ${p}`));return}console.log(j.white("\u{1F7E2} Setting identity on the new validator..."));let $=`ssh -i ${ni} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${f}'`;jt($,{shell:!0,stdio:"inherit"}).status!==0&&console.log(j.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
672
670
  $ ssh solv@${t}
673
671
 
674
- Failed Cmd: ${f}`)),console.log(F.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let Ft=`ssh -i ${Ga} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${S}'`;if(Dt(Ft,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
672
+ Failed Cmd: ${f}`)),console.log(j.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let Jt=`ssh -i ${ni} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${T}'`;if(jt(Jt,{shell:!0,stdio:"inherit"}).status!==0){console.log(j.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
675
673
 
676
- Failed Cmd: ${S}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await k({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as Rd}from"node:child_process";function qa(t){let e=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return Rd(e,{shell:!0,stdio:"inherit"}).status===0}r(qa,"checkSSHConnection");import ce from"chalk";import{join as Xa}from"path";import{spawnSync as Ut}from"node:child_process";import J from"chalk";var co=Xa(C,yt),Qa=Xa(C,ht),Za=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===T.RPC,a=n?L:b;if(s&&(a=L),!bt(a,t))return;let c=Go,l=zo;console.log(J.white("\u{1F7E2} Waiting for restart window..."));let m=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${y} 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
674
+ Failed Cmd: ${T}`));return}console.log(j.white("\u{1F7E2} Identity changed successfully!")),await _({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as Ud}from"node:child_process";function ii(t){let e=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return Ud(e,{shell:!0,stdio:"inherit"}).status===0}r(ii,"checkSSHConnection");import ue from"chalk";import{join as li}from"path";import{spawnSync as Yt}from"node:child_process";import G from"chalk";var ho=li(I,Tt),ci=li(I,St),mi=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===g.RPC,a=n?P:b;if(s&&(a=P),!Ft(a,t))return;let c=Ct,l=It;console.log(G.white("\u{1F7E2} Waiting for restart window..."));let m=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Yt(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
677
675
  $ ssh solv@${t}
678
676
 
679
- Failed Cmd: ${c} -l ${y} 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 solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${y} set-identity ${co}'`;if(Ut(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
677
+ Failed Cmd: ${c} -l ${y} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(G.white("\u{1F7E2} Setting identity on the new validator..."));let p=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${y} set-identity ${ho}'`;if(Yt(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
680
678
  $ ssh solv@${t}
681
679
 
682
- Failed Cmd: ${c} -l ${y} set-identity ${co}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ut(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${co} ${Qa}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
680
+ Failed Cmd: ${c} -l ${y} set-identity ${ho}`));return}if(console.log(G.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Yt(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ln -sf ${ho} ${ci}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
683
681
  $ ssh solv@${t}
684
682
 
685
- Failed Cmd: ln -sf ${co} ${Qa}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ut(`scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
683
+ Failed Cmd: ln -sf ${ho} ${ci}`));return}if(console.log(G.white("\u{1F7E2} Uploading the tower file to the new validator...")),Yt(`scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
686
684
  $ ssh solv@${t}
687
685
 
688
- Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),Ut(`${l} -l ${y} set-identity --require-tower ${a}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
686
+ Failed Cmd: scp solv@${t}:${y}/tower-1_9-${e}.bin ${y}`));return}if(console.log(G.white("\u{1F7E2} Setting identity on the new validator...")),Yt(`${l} -l ${y} set-identity --require-tower ${a}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
689
687
 
690
688
  Failed Cmd: ${l} -l ${y} set-identity ${a}
691
- ln -sf ${a} ${O}`));return}if(Ut(`ln -sf ${a} ${O}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
689
+ ln -sf ${a} ${R}`));return}if(Yt(`ln -sf ${a} ${R}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(G.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
692
690
 
693
- Failed Cmd: ln -sf ${a} ${O}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await k({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var Cd=["Incoming","Outgoing"],ei=r(async(t,e)=>{t.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).description("Switch Validator Identity with No Downtime").action(async o=>{try{let n=e.NETWORK===u.TESTNET,s=e.NODE_TYPE===T.RPC,a=n?L:b;s&&(a=L);let i=E(a),c=o.switchType,l=o.ip;if(c===""||l===""){let d=await ti.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}}]);c=d.switchType,l=d.ip}if(!Cd.includes(c)){console.log(ce.yellow(`\u26A0\uFE0F Invalid Switch Type
694
- You can choose only Incoming or Outgoing`));return}if(!qa(l)){console.log("SSH Connection Failed");return}if(c==="Incoming"){if(o.v2MigrateIncoming){(await ti.prompt([{name:"confirm",type:"confirm",message:"Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1."}])).confirm||(console.log(ce.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ce.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await Za(l,i,e);return}await Ja(l,i,e)}else await Wa(l,i,e);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(ce.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ce.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as Id}from"node:child_process";var Ld=r((t="296877183",e=y)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${e} --hard-fork ${t} --deactivate-feature-gate 7uZBkJXJ1HkuP6R3MJfZs7mLwymBcDbKdqbF51ZWLier tvcF6b1TRz353zKuhBjinZkKzjmihXmBAHJdjNYw1sQ decoMktMcnmiq6t3u7g5BfgcQu91nKZr6RvMYf9z1Jb -- ${t} ${e}`,n=Id(o,{shell:!0,stdio:"pipe",cwd:e});if(n.status!==0)throw new Error(`createSnapshot: ${n.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),oi=Ld;import Mt from"inquirer";import Md from"dotenv";import Nt from"chalk";var lo={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:po,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}},Mo={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:fe,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:he,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:po,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 Vd}from"fs/promises";import{Connection as $d,Keypair as bd,VersionedTransaction as Kd}from"@solana/web3.js";import U from"chalk";import Dd from"inquirer";import Ud 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"),ri=Pd;var xd=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=or[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"),ni=xd;Ud.config();var si=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new $d(t,"confirmed"),m=await ri(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
695
- `)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(Ht+`
696
- `)),process.exit(0));let le=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
691
+ Failed Cmd: ln -sf ${a} ${R}`));return}console.log(G.white("\u{1F7E2} Identity changed successfully!")),await _({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var Md=["Incoming","Outgoing"],di=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).description("Switch Validator Identity with No Downtime").action(async o=>{try{let n=e.NETWORK===u.TESTNET,s=e.NODE_TYPE===g.RPC,a=n?P:b;s&&(a=P);let i=E(a),c=o.switchType,l=o.ip;if(c===""||l===""){let d=await pi.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"}}]);c=d.switchType,l=d.ip}if(!Md.includes(c)){console.log(ue.yellow(`\u26A0\uFE0F Invalid Switch Type
692
+ You can choose only Incoming or Outgoing`));return}if(!ii(l)){console.log("SSH Connection Failed");return}if(c==="Incoming"){if(o.v2MigrateIncoming){(await pi.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(ue.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ue.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await mi(l,i,e);return}await oi(l,i,e)}else await ai(l,i,e);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(ue.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ue.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as Fd}from"node:child_process";var Hd=r((t="296877183",e=y)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${e} --hard-fork ${t} --deactivate-feature-gate 7uZBkJXJ1HkuP6R3MJfZs7mLwymBcDbKdqbF51ZWLier tvcF6b1TRz353zKuhBjinZkKzjmihXmBAHJdjNYw1sQ decoMktMcnmiq6t3u7g5BfgcQu91nKZr6RvMYf9z1Jb -- ${t} ${e}`,n=Fd(o,{shell:!0,stdio:"pipe",cwd:e});if(n.status!==0)throw new Error(`createSnapshot: ${n.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),ui=Hd;import Bt from"inquirer";import Qd from"dotenv";import Rt from"chalk";var yo={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:To,associationAccount:"",decimal:9},JitoSOL:{tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSOL:{tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSOL:{tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},EPCT:{tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUP:{tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},BONK:{tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},JTO:{tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}},qo={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:ge,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Ee,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:To,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 Bd}from"fs/promises";import{Connection as Jd,Keypair as Gd,VersionedTransaction as zd}from"@solana/web3.js";import F from"chalk";import Wd from"inquirer";import qd from"dotenv";var jd=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"),fi=jd;var Yd=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=mr[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"),hi=Yd;qd.config();var yi=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new Jd(t,"confirmed"),m=await fi(e,o,s,a,i);if(typeof m=="string"){m.includes("Unauthorized")&&(console.error(F.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
693
+ `)),console.log(F.white("Get Your API key \u{1F447}")),console.log(F.white(Gt+`
694
+ `)),process.exit(0));let fe=`${F.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
697
695
 
698
696
  You can upgrade your API key to increase your rate limits.
699
697
  Get Your API key \u{1F447}
700
- Validators Solutions: ${Ht}
701
- `;console.error(U.white(le)),process.exit(0)}let d=Mo[s],p=Mo[a],f=`\u{1F504} Swap Quote \u{1F504}
698
+ Validators Solutions: ${Gt}
699
+ `;console.error(F.white(fe)),process.exit(0)}let d=qo[s],p=qo[a],f=`\u{1F504} Swap Quote \u{1F504}
702
700
 
703
701
  - \u{1F3E6} Input Token: ${d.symbol} (${s})
704
702
  - \u{1F4B0} Input Amount: ${i/Math.pow(10,d.decimal)} ${d.symbol}
@@ -707,18 +705,18 @@ Validators Solutions: ${Ht}
707
705
  - \u{1F4B0} Output Amount: ${Number(m?.outAmount)/Math.pow(10,p.decimal)} ${p.symbol}
708
706
 
709
707
  \u203B This quote is based on the current market rate and may change before the swap is completed.
710
- `;console.log(U.white(f)),console.log(U.gray(`You can also swap using the following command:
708
+ `;console.log(F.white(f)),console.log(F.gray(`You can also swap using the following command:
711
709
  $ solc swap --input ${s} --output ${a} --amount ${i} --skip-confirm
712
- `));let S=!1;c?S=(await Dd.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(U.cyan("Skipping confirmation...")),S=!0),S||(console.log(U.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let w=JSON.parse(await Vd(n,"utf8")),_=bd.fromSecretKey(new Uint8Array(Array.from(w))),N=await ni(e,o,m,_.publicKey.toString());if(typeof N=="string"){N.includes("Unauthorized")&&(console.error(U.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
713
- `)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(Ht+`
714
- `)),process.exit(0));let le=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
710
+ `));let T=!1;c?T=(await Wd.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(F.cyan("Skipping confirmation...")),T=!0),T||(console.log(F.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),m||process.exit(0);let A=JSON.parse(await Bd(n,"utf8")),N=Gd.fromSecretKey(new Uint8Array(Array.from(A))),O=await hi(e,o,m,N.publicKey.toString());if(typeof O=="string"){O.includes("Unauthorized")&&(console.error(F.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
711
+ `)),console.log(F.white("Get Your API key \u{1F447}")),console.log(F.white(Gt+`
712
+ `)),process.exit(0));let fe=`${F.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
715
713
 
716
714
  You can upgrade your API key to increase your rate limits.
717
715
  Get Your API key \u{1F447}
718
- Validators Solutions: ${Ht}
719
- `;console.error(U.white(le)),process.exit(0)}let z=Buffer.from(N.swapTransaction,"base64"),V=Kd.deserialize(z);V.sign([_]);let Ot=V.serialize(),Ft=await l.sendRawTransaction(Ot,{skipPreflight:!0,maxRetries:2}),Fo=V.message.recentBlockhash;return console.log(`Swapping...
720
- Transaction ID: ${Ft}`),await l.confirmTransaction({blockhash:Fo,lastValidBlockHeight:N.lastValidBlockHeight,signature:Ft},"confirmed"),Ft},"swap");Md.config();var ai=r(async(t,e)=>{t.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async o=>{try{await Fd(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"),Fd=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 Hd();let l=Zo,m=[...tr,"Other"],d=n,p="",f=s,S=a;if(d===""){let N=await Mt.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:fe}]);N.name==="Other"?d=(await Mt.prompt([{type:"input",name:"address",message:"Enter input mint address",default:he}])).address:(p=N.name,d=lo[p].tokenMint)}if(f===""){m=m.filter(V=>V!==p);let N=await Mt.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(N.name==="Other")f=(await Mt.prompt([{type:"input",name:"address",message:"Enter output mint address",default:Z}])).address;else{let V=N.name;f=lo[V].tokenMint}let z=N.name;f=lo[z].tokenMint}if(S===0){let N=await Mt.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);S=Number(N.amount)}let _=await si(t,l,!o||o===""?er:o,e,d,f,S,i);_||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/${_}`))},"swapCmd");var Hd=r(async()=>{let t=await Mt.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 k(t),console.log(Nt.green(`\u2714\uFE0E Config Updated Successfully!
721
- `)),wt()},"askForConfig");import{spawnSync as jd}from"node:child_process";var ii=r(()=>{jd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as Yd}from"node:child_process";var ci=r(()=>{Yd("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Jd}from"node:child_process";var li=r(()=>{Jd("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as Bd}from"node:child_process";var mi=r(()=>{Bd("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as Gd}from"node:child_process";var pi=r((t=!1)=>{Gd(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as zd}from"node:child_process";var di=r(()=>{zd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var ui=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{ii()}),t.command("start").description("Start Jupiter").action(()=>{ci()}),t.command("stop").description("Stop Jupiter").action(()=>{li()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{pi(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{mi()}),t.command("enable").description("Enable Jupiter").action(()=>{di()})},"jupiterCommands");import Qd from"chalk";import{spawnSync as Wd}from"node:child_process";var fi=r(()=>{h.command("pubkey").alias("p").description("Print pubkey from a keypair file (wrapper of solana-keygen)").option("-f, --file <path>","Keypair file path","identity.json").addHelpText("after",`
716
+ Validators Solutions: ${Gt}
717
+ `;console.error(F.white(fe)),process.exit(0)}let q=Buffer.from(O.swapTransaction,"base64"),$=zd.deserialize(q);$.sign([N]);let kt=$.serialize(),Jt=await l.sendRawTransaction(kt,{skipPreflight:!0,maxRetries:2}),Qo=$.message.recentBlockhash;return console.log(`Swapping...
718
+ Transaction ID: ${Jt}`),await l.confirmTransaction({blockhash:Qo,lastValidBlockHeight:O.lastValidBlockHeight,signature:Jt},"confirmed"),Jt},"swap");Qd.config();var Si=r(async(t,e)=>{t.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async o=>{try{await Xd(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(Rt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Rt.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),Xd=r(async(t,e,o,n="",s="",a=0,i=!0,c=!1)=>{console.log(Rt.white("Solana RPC URL:",t)),console.log(Rt.white("KeyfilePath:",e)),(!e||e===""||c)&&await Zd();let l=ir,m=[...cr,"Other"],d=n,p="",f=s,T=a;if(d===""){let O=await Bt.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:ge}]);O.name==="Other"?d=(await Bt.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Ee}])).address:(p=O.name,d=yo[p].tokenMint)}if(f===""){m=m.filter($=>$!==p);let O=await Bt.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(O.name==="Other")f=(await Bt.prompt([{type:"input",name:"address",message:"Enter output mint address",default:rt}])).address;else{let $=O.name;f=yo[$].tokenMint}let q=O.name;f=yo[q].tokenMint}if(T===0){let O=await Bt.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);T=Number(O.amount)}let N=await yi(t,l,!o||o===""?lr:o,e,d,f,T,i);N||process.exit(0),console.log(Rt.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(Rt.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${N}`))},"swapCmd");var Zd=r(async()=>{let t=await Bt.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await _(t),console.log(Rt.green(`\u2714\uFE0E Config Updated Successfully!
719
+ `)),_t()},"askForConfig");import{spawnSync as tu}from"node:child_process";var Ti=r(()=>{tu("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as eu}from"node:child_process";var gi=r(()=>{eu("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as ou}from"node:child_process";var Ei=r(()=>{ou("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as ru}from"node:child_process";var Ai=r(()=>{ru("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as nu}from"node:child_process";var wi=r((t=!1)=>{nu(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as su}from"node:child_process";var _i=r(()=>{su("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var Ni=r(()=>{let t=h.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{Ti()}),t.command("start").description("Start Jupiter").action(()=>{gi()}),t.command("stop").description("Stop Jupiter").action(()=>{Ei()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{wi(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{Ai()}),t.command("enable").description("Enable Jupiter").action(()=>{_i()})},"jupiterCommands");import cu from"chalk";import{spawnSync as au}from"node:child_process";var Oi=r(()=>{h.command("pubkey").alias("p").description("Print pubkey from a keypair file (wrapper of solana-keygen)").option("-f, --file <path>","Keypair file path","identity.json").addHelpText("after",`
722
720
  Examples:
723
721
  $ solc pubkey
724
722
  $ solc pubkey -f ~/.config/solana/id.json
@@ -726,5 +724,5 @@ Examples:
726
724
 
727
725
  Notes:
728
726
  - This runs: solana-keygen pubkey <file>
729
- - Defaults to "identity.json" in the current directory`).action(t=>{let o=`solana-keygen pubkey ${t.file||"identity.json"}`,n=Wd(o,{shell:!0,stdio:"inherit"});process.exit(n.status??0)})},"pubkeyCommand");var h=new qd;h.name("solc").description("\u{1FA84} solc - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(me,"-V","Display version");async function Xd(){try{let t=await I();qn(t),ts(t),Xn(t),hs(t),Jr(t),Gr(),es(t),xs(t),Ds(t),fs(),ns(),Gn(t),qs(t),os(),Js(),ra(t),aa(t),Ra(t),Wn(),ai(h,t),Ma(t),ei(h,t),ui(),Gs(),fi(),h.command("rm:log").description("Remove Logs").action(()=>{Qs()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{Zs()}),h.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot").option("-l, --ledger <ledger>","Ledger").action(e=>{console.log(Qd.white("\u{1F4DD} Creating Snapshot...")),oi(e.slot,e.ledger)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{ta(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{ea()}),h.command("config").description("Show Solc Config").action(()=>{Ze()}),h.command("vv").description("Show Solc Version").action(()=>{let e=Ae();console.log("version:",e)}),await h.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(t){console.log(t),process.exit(0)}}r(Xd,"main");Xd();export{h as program};
727
+ - Defaults to "identity.json" in the current directory`).action(t=>{let o=`solana-keygen pubkey ${t.file||"identity.json"}`,n=au(o,{shell:!0,stdio:"inherit"});process.exit(n.status??0)})},"pubkeyCommand");var h=new iu;h.name("solc").description("\u{1FA84} solc - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(he,"-V","Display version");async function lu(){try{let t=await v();ns(t),cs(t),as(t),_s(t),en(t),rn(),ls(t),Fs(t),Js(t),ws(),ds(),es(t),ia(t),ms(),Zs(),fa(t),Sa(t),Ua(t),rs(),na(),Si(h,t),Qa(t),di(h,t),Ni(),ea(),Oi(),h.command("rm:log").description("Remove Logs").action(()=>{ca()}),h.command("rm:snapshot").description("Remove Snapshot").action(()=>{ma()}),h.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot").option("-l, --ledger <ledger>","Ledger").action(e=>{console.log(cu.white("\u{1F4DD} Creating Snapshot...")),ui(e.slot,e.ledger)}),h.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{pa(t)}),h.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{da()}),h.command("config").description("Show Solc Config").action(()=>{ro()}),h.command("vv").description("Show Solc Version").action(()=>{let e=ke();console.log("version:",e)}),await h.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(t){console.log(t),process.exit(0)}}r(lu,"main");lu();export{h as program};
730
728
  //# sourceMappingURL=index.js.map