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