@gabrielhicks/solv 5.4.9 → 5.4.11
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 +107 -108
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var gT=Object.defineProperty;var t=(_,e)=>gT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as ia}from"commander";var it="5.4.9";var nt={name:"@gabrielhicks/solv",version:it,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"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var De=nt.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",Tt="relayer-keypair.json",yT="mainnet-validator-keypair.json",GT="mainnet-vote-account-keypair.json",kT="mainnet-authority-keypair.json",VT="testnet-validator-keypair.json",bT="testnet-vote-account-keypair.json",wT="testnet-authority-keypair.json",g="/home/solv",M=`${g}/${U_}`,da=`${g}/${A_}`,b=`${g}/${yT}`,fe=`${g}/${GT}`,Na=`${g}/${kT}`,K=`${g}/${VT}`,Ue=`${g}/${bT}`,Oa=`${g}/${wT}`,j=`${g}/solana-validator.log`,t_=g+"/start-validator.sh",P="/mnt/ledger",g_="/mnt/accounts",o_="/mnt/snapshots",st="solana-validator",St="agave-validator",rt="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ae=3,Rt="https://api.testnet.solana.com",Ct="https://api.mainnet-beta.solana.com",at="https://verify.validators.solutions/solv-migrate",ct="https://jup.validators.solutions/v1/jup",AE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(AE||(AE={}));var dt=Object.values(AE),Le="So11111111111111111111111111111111111111112",Me="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",LE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Nt="SOLV420",Ot={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as YT}from"child_process";var i_="3.0.10",w="3.0.10",ee="3.0.10",L_="3.0.10",Ft="3.0.10",M_="3.0.10";var lt="20.17.0",K_="0.713.30008",y_="0.713.30008";import{spawnSync as B}from"node:child_process";var vT=t((_=w,e=!1,E=!1)=>{E?e?(B(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave-mod rev-parse HEAD) /tmp/v${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(B(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave rev-parse HEAD) /tmp/v${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?B(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):B(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),G_=vT;var It="agave-validator",HT=t(()=>{try{return It}catch(_){return console.error(_),It}},"getSolanaCLI"),n_=HT;var ue=t(async(_,e=!1,E=!1)=>{G_(_,e,E)},"updateVersion"),pe=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),YT(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import so from"chalk";var u_;(function(_){_.EN="en",_.JA="ja"})(u_||(u_={}));var Dt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Dt||(Dt={}));var Pt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(Pt||(Pt={}));var O_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(O_||(O_={}));var ft;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(ft||(ft={}));var Ut;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Ut||(Ut={}));var At;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(At||(At={}));var Lt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Lt||(Lt={}));var me;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(me||(me={}));var he;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(he||(he={}));var pt=!0,mt=!1,ht=!0,Bt=!1,q={ID:"solv",LANG:u_.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"3.0.10",MAINNET_SOLANA_VERSION:"3.0.10",NODE_VERSION:"20.17.0",TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,SOLANA_NETWORK:"testnet",SOLV_TYPE:0,DISK_TYPES:1,IS_SETUP:!1,LANG_SETUP:!1,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:"ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG",IS_CLIENT:!1,VALIDATOR_IPS:[],MAINNET_TYPE:"SolanaClient",LEDGER_PATH:"/mnt/ledger",STAKE_ACCOUNT:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:"https://mainnet-beta.solana.com",KEYPAIR_PATH:"/home/solv/testnet-validator-keypair.json",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1},v={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},f={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},T_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},m={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",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"},h={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"},U=t((_=v.ROOT)=>{let e=_===v.ROOT?v.ROOT:_,E=`${e}/${h.MAINNET_VALIDATOR_KEY}`,o=`${e}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${h.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${h.TESTNET_VALIDATOR_KEY}`,T=`${e}/${h.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${h.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),F_=t((_=!0)=>{let e=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_KEY}`,E=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_VOTE_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${v.ROOT}/${T_.LOG}`,i=f.ACCOUNTS,n=f.LEDGER,T=f.SNAPSHOTS,s=`${v.ROOT}/${T_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var e_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ME="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",gt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Kt=9,s_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",yt="So11111111111111111111111111111111111111112",Gt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",kt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Mt;(function(_){_[_.ELSOL=s_]="ELSOL",_[_.SOL=yt]="SOL",_[_.USDC=Gt]="USDC",_[_.EPCT=kt]="EPCT"})(Mt||(Mt={}));var ut;(function(_){_.V6_BASE_URL="https://quote-api.jup.ag/v6",_.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",_.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(ut||(ut={}));var Ka={[yt]:9,[s_]:9,[Gt]:6,[kt]:6},Be="/home/solv/currentEpoch.json",uE=.5,ge="https://api.testnet.solana.com";import{spawnSync as pE}from"child_process";var Vt=t(()=>{pE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=q.NODE_VERSION;pE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),pE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var C_={version:"2.3.10",tag:"v2.3.10",commissionBps:0,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",shredReceiverAddr:"64.130.50.14:1002"},Ee={TESTNET:{Dallas:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.testnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.35.224:1002"}},MAINNET:{Amsterdam:{BLOCK_ENGINE_URL:"https://amsterdam.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://amsterdam.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"74.118.140.240:1002"},London:{BLOCK_ENGINE_URL:"https://london.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://london.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"142.91.127.175:1002"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.50.14:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.216.96:1002"},Tokyo:{BLOCK_ENGINE_URL:"https://tokyo.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://tokyo.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.9.160:1002"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://slc.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://slc.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.53.8:1002"},Singapore:{BLOCK_ENGINE_URL:"https://singapore.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://singapore.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.11.224:1002"}}};import{spawnSync as H}from"child_process";var Ke=t((_=C_.tag,e=!1,E=!1)=>{H("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),H("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(H(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),H(`CI_COMMIT=$(git -C /tmp/${_}-jito rev-parse HEAD) /tmp/${_}-jito/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-jito`,{shell:!0,stdio:"inherit"}),H("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),H(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),H(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):H(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as JT,writeFile as xT}from"fs/promises";import{homedir as QT}from"os";var te=t(async _=>{let E=`${QT()}/${T_.JITO_CONFIG}`,i={...JSON.parse(await JT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await xT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as bt}from"child_process";import qT from"inquirer";var wt=t((_,e=!0)=>{let E=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",o=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";bt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;bt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),vt=t(async()=>await qT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as oe}from"@skeet-framework/utils";import $T from"chalk";import WT from"inquirer";var Ht=t(async()=>{let _=await WT.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await oe("sudo ufw delete allow 8899/udp"),await oe("sudo ufw delete allow 8899/tcp"),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await oe("sudo ufw reload"),console.log($T.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var XT=t(()=>it,"getSolvVersion"),k_=XT;import{readFile as ZT,writeFile as _s}from"fs/promises";import{existsAsync as es}from"@skeet-framework/utils";var mE;(function(_){_.EN="en",_.JA="ja"})(mE||(mE={}));var sc=Object.values(mE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var Yt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Jt=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.NONE="none"})(F||(F={}));var Sc=Object.values(F).filter(_=>_!=="none"),V;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(V||(V={}));var xt=Object.values(V).filter(_=>_!=="none"),$;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})($||($={}));var zT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:$.TRIPLE,TESTNET_SOLANA_VERSION:i_,MAINNET_SOLANA_VERSION:w,NODE_VERSION:lt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:rt,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ct,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:g_,SNAPSHOTS_PATH:o_,MOD:!1},a_=zT;import{homedir as Es}from"os";var ts=t(async()=>{let e=`${Es()}/${Pe}`;return await es(e)?JSON.parse(await ZT(e,"utf-8")):(console.log("Creating default config file at",e),await _s(e,JSON.stringify(a_,null,2)),a_)},"readConfig"),k=ts;import os from"node-fetch";var z=t(async _=>{try{let e=await k();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
|
|
3
|
-
Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await
|
|
2
|
+
var mT=Object.defineProperty;var t=(_,e)=>mT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as _a}from"commander";var ot="5.4.11";var it={name:"@gabrielhicks/solv",version:ot,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"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var De=it.version;var _e="https://validators.solutions";var Pe="solv4.config.json";var U_="identity.json",A_="unstaked-identity.json",nt="relayer-keypair.json",BT="mainnet-validator-keypair.json",gT="mainnet-vote-account-keypair.json",KT="mainnet-authority-keypair.json",yT="testnet-validator-keypair.json",GT="testnet-vote-account-keypair.json",kT="testnet-authority-keypair.json",g="/home/solv",A=`${g}/${U_}`,ra=`${g}/${A_}`,b=`${g}/${BT}`,fe=`${g}/${gT}`,Ra=`${g}/${KT}`,K=`${g}/${yT}`,Ue=`${g}/${GT}`,Ca=`${g}/${kT}`,j=`${g}/solana-validator.log`,e_=g+"/start-validator.sh",P="/mnt/ledger",g_="/mnt/accounts",E_="/mnt/snapshots",Tt="solana-validator",st="agave-validator",St="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ae=3;var rt="https://api.mainnet-beta.solana.com",Rt="https://verify.validators.solutions/solv-migrate",Ct="https://jup.validators.solutions/v1/jup",AE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(AE||(AE={}));var at=Object.values(AE),Le="So11111111111111111111111111111111111111112",Me="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",LE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var ct="SOLV420",dt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as wT}from"child_process";var t_="3.0.10",w="3.0.10",ee="3.0.10",L_="3.0.10",Nt="3.0.10",M_="3.0.10";var Ot="20.17.0",K_="0.713.30008",y_="0.713.30008";import{spawnSync as B}from"node:child_process";var VT=t((_=w,e=!1,E=!1)=>{E?e?(B(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave-mod rev-parse HEAD) /tmp/v${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave-mod/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(B(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),B(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),B(`CI_COMMIT=$(git -C /tmp/v${_}-agave rev-parse HEAD) /tmp/v${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave`,{shell:!0,stdio:"inherit"}),B("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),B(`cp -r /home/solv/.local/share/solana/install/releases/v${_}-agave/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),B(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?B(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):B(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),G_=VT;var Ft="agave-validator",bT=t(()=>{try{return Ft}catch(_){return console.error(_),Ft}},"getSolanaCLI"),o_=bT;var ue=t(async(_,e=!1,E=!1)=>{G_(_,e,E)},"updateVersion"),pe=t(async(_,e=!1,E=10)=>{let o=o_(),i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),wT(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import no from"chalk";var u_;(function(_){_.EN="en",_.JA="ja"})(u_||(u_={}));var lt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(lt||(lt={}));var It;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(It||(It={}));var N_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(N_||(N_={}));var Dt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(Dt||(Dt={}));var Pt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Pt||(Pt={}));var ft;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(ft||(ft={}));var Ut;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Ut||(Ut={}));var me;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(me||(me={}));var he;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(he||(he={}));var Mt=!1,ut=!1,pt=!1,mt=!1,q={ID:"solv",LANG:u_.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"3.0.10",MAINNET_SOLANA_VERSION:"3.0.10",NODE_VERSION:"20.17.0",TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,SOLANA_NETWORK:"testnet",SOLV_TYPE:0,DISK_TYPES:1,IS_SETUP:!1,LANG_SETUP:!1,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:"ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG",IS_CLIENT:!1,VALIDATOR_IPS:[],MAINNET_TYPE:"SolanaClient",LEDGER_PATH:"/mnt/ledger",STAKE_ACCOUNT:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:"https://mainnet-beta.solana.com",KEYPAIR_PATH:"/home/solv/testnet-validator-keypair.json",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1},v={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},f={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},i_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},m={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",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"},h={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"},L=t((_=v.ROOT)=>{let e=_===v.ROOT?v.ROOT:_,E=`${e}/${h.MAINNET_VALIDATOR_KEY}`,o=`${e}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${h.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${h.TESTNET_VALIDATOR_KEY}`,T=`${e}/${h.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${h.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),O_=t((_=!0)=>{let e=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_KEY}`,E=_?`${v.ROOT}/${h.TESTNET_VALIDATOR_VOTE_KEY}`:`${v.ROOT}/${h.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${v.ROOT}/${i_.LOG}`,i=f.ACCOUNTS,n=f.LEDGER,T=f.SNAPSHOTS,s=`${v.ROOT}/${i_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var Z="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",ME="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",ht="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Bt=9,n_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",gt="So11111111111111111111111111111111111111112",Kt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",yt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",At;(function(_){_[_.ELSOL=n_]="ELSOL",_[_.SOL=gt]="SOL",_[_.USDC=Kt]="USDC",_[_.EPCT=yt]="EPCT"})(At||(At={}));var Lt;(function(_){_.V6_BASE_URL="https://quote-api.jup.ag/v6",_.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",_.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(Lt||(Lt={}));var pa={[gt]:9,[n_]:9,[Kt]:6,[yt]:6},Be="/home/solv/currentEpoch.json";var ge="https://api.testnet.solana.com";import{spawnSync as uE}from"child_process";var Gt=t(()=>{uE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=q.NODE_VERSION;uE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),uE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var R_={version:"2.3.10",tag:"v2.3.10",commissionBps:0,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",shredReceiverAddr:"64.130.50.14:1002"},Ee={TESTNET:{Dallas:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.testnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.35.224:1002"}},MAINNET:{Amsterdam:{BLOCK_ENGINE_URL:"https://amsterdam.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://amsterdam.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"74.118.140.240:1002"},London:{BLOCK_ENGINE_URL:"https://london.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://london.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"142.91.127.175:1002"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.50.14:1002"},NewYork:{BLOCK_ENGINE_URL:"https://ny.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.216.96:1002"},Tokyo:{BLOCK_ENGINE_URL:"https://tokyo.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://tokyo.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.9.160:1002"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://slc.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://slc.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.53.8:1002"},Singapore:{BLOCK_ENGINE_URL:"https://singapore.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://singapore.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.11.224:1002"}}};import{spawnSync as H}from"child_process";var Ke=t((_=R_.tag,e=!1,E=!1)=>{H("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),H("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(H(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),H(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),H(`CI_COMMIT=$(git -C /tmp/${_}-jito rev-parse HEAD) /tmp/${_}-jito/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-jito`,{shell:!0,stdio:"inherit"}),H("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),H(`cp -r /home/solv/.local/share/solana/install/releases/${_}-jito/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),H(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?H(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):H(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as vT,writeFile as HT}from"fs/promises";import{homedir as YT}from"os";var te=t(async _=>{let E=`${YT()}/${i_.JITO_CONFIG}`,i={...JSON.parse(await vT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await HT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as kt}from"child_process";import JT from"inquirer";var Vt=t((_,e=!0)=>{let E=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",o=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";kt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;kt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),bt=t(async()=>await JT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as oe}from"@skeet-framework/utils";import xT from"chalk";import QT from"inquirer";var wt=t(async()=>{let _=await QT.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await oe("sudo ufw delete allow 8899/udp"),await oe("sudo ufw delete allow 8899/tcp"),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await oe(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await oe("sudo ufw reload"),console.log(xT.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var qT=t(()=>ot,"getSolvVersion"),k_=qT;import{readFile as XT,writeFile as jT}from"fs/promises";import{existsAsync as zT}from"@skeet-framework/utils";var pE;(function(_){_.EN="en",_.JA="ja"})(pE||(pE={}));var tc=Object.values(pE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var vt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Ht=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.NONE="none"})(F||(F={}));var oc=Object.values(F).filter(_=>_!=="none"),V;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(V||(V={}));var Yt=Object.values(V).filter(_=>_!=="none"),$;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})($||($={}));var WT={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:V.AGAVE,MNT_DISK_TYPE:$.TRIPLE,TESTNET_SOLANA_VERSION:t_,MAINNET_SOLANA_VERSION:w,NODE_VERSION:Ot,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:St,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:rt,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:g_,SNAPSHOTS_PATH:E_,MOD:!1},C_=WT;import{homedir as ZT}from"os";var _s=t(async()=>{let e=`${ZT()}/${Pe}`;return await zT(e)?JSON.parse(await XT(e,"utf-8")):(console.log("Creating default config file at",e),await jT(e,JSON.stringify(C_,null,2)),C_)},"readConfig"),k=_s;import es from"node-fetch";var T_=t(async _=>{try{let e=await k();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
|
|
3
|
+
Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await es(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(E),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${_}`}),!1}},"sendDiscord");import{spawnSync as ns}from"child_process";import{Connection as Jt}from"@solana/web3.js";var ie=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new Jt("https://api.testnet.solana.com"):new Jt(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(a=>a.votePubkey===e);if(!s)return T.delinquent.find(R=>R.votePubkey===e)?(i.isActive=!1,i.reason="Validator is delinquent.",i):(i.isActive=!1,i.reason="Validator is not found in both current and delinquent lists.",i);if(T=await n.getVoteAccounts(),s=T.current.find(a=>a.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,C=await n.getSlot()-S;return C>o?(i.isActive=!1,i.reason=`Validator has not voted for ${C} slots.`,i):(i.isActive=!0,i.reason="Validator is active and voting.",i)}catch(n){return console.error(n),i.isActive=!1,i.reason="Failed to check validator status.",i}},"isValidatorActive");import{spawnSync as Es}from"child_process";var M=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=Es(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ts=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),Y=ts;import{sendDiscord as os}from"@skeet-framework/utils";var xt=30,is=t(async _=>{try{let e=_.NETWORK===c.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=L(),n=M(e?o:E),T=await ie(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=xt){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${xt} minutes!
|
|
4
4
|
Account: ${T.pubkey}
|
|
5
5
|
Reason: ${T.reason}
|
|
6
6
|
Message: Max retries reached, exiting catchup check...
|
|
7
|
-
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await os(S),!1}console.log("Waiting for validator to catch up..."),await Y(60*1e3),T=await ie(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Qt=is;var Ts=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=L(),n=e?o:i,T=!1;E?T=e?pt:mt:T=e?Mt:ut,T=T&&_.AUTO_RESTART;let s=M(n),S=`**${s}** updated solv to **${k_()}**`;if(await T_(S),T){let r=`Restarting **${s}**
|
|
8
|
+
_ _`;await T_(r);try{ns("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(N){let I=`Error restarting **${s}**: ${N?.message||"Unknown error"}`;return await T_(I),!1}let C=Math.floor(Date.now()/1e3),a=`**${s}** has restarted, catching up...
|
|
9
|
+
at: <t:${C}> (${C})
|
|
10
|
+
_ _`;await T_(a),await Y(180*1e3);let R=await Qt(_);if(R){let I=Math.floor(Date.now()/1e3)-C,O=Math.floor(I/60),l=I%60,G=O>0?`${O}m ${l}s`:`${l}s`,U=`**${s}** has caught up!
|
|
11
|
+
at: <t:${C}> (${C})
|
|
11
12
|
**${s}** took **${G}** to catch up after restart!
|
|
12
|
-
_ _`;await z(L)}else{let N=`**${s}** failed to catch up after update`;await z(N)}return R}return!0},"autoUpdate"),Wt=rs;import{homedir as Rs}from"os";import{readFile as Cs,writeFile as Xt}from"fs/promises";import{existsAsync as as}from"@skeet-framework/utils";var u=t(async _=>{let E=`${Rs()}/${Pe}`;await as(E)||(console.log("Creating default config file at",E),await Xt(E,JSON.stringify(a_,null,2)));let i={...JSON.parse(await Cs(E,"utf8")),..._},n=JSON.stringify(i,null,2);await Xt(E,n)},"updateDefaultConfig");var cs={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"},ye=cs;var ds={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:"},jt=ds;var Ns={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}"}},Ge=Ns;var Os={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"}},zt=Os;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Ve=[[],[") 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 Zt=[") \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"],_o=[[],[") \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 Fs={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"}},be=Fs;var ls={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"}},eo=ls;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Eo=[") \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 Is=t(_=>{let e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};switch(_){case u_.EN:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};break;case u_.JA:e={cmds:jt,subCmds:eo,logs:zt,installer:Zt,installerSub:_o,clientCmds:Eo};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),to=Is;import{existsSync as Us,readFileSync as As,writeFileSync as oo}from"fs";import{readFileSync as Ds,writeFileSync as Ps}from"fs";import{homedir as fs}from"os";var V_=t(_=>{let E=`${fs()}/${T_.CONFIG}`,i={...JSON.parse(Ds(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ps(E,n)},"updateSolvConfig");import{homedir as Ls}from"os";var io=t(()=>{let e=`${Ls()}/${T_.CONFIG}`;Us(e)||(oo(e,JSON.stringify(q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(As(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),oo(e,JSON.stringify(q,null,2)),E=q}let o=to(E.LANG);return E.RPC_URL||(E.RPC_URL=q.RPC_URL,V_({RPC_URL:q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,V_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",V_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as y}from"child_process";import{promises as no}from"fs";import us from"path";var Ms=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
|
|
13
|
+
_ _`;await T_(U)}else{let N=`**${s}** failed to catch up after update`;await T_(N)}return R}return!0},"autoUpdate"),qt=Ts;import{homedir as ss}from"os";import{readFile as Ss,writeFile as $t}from"fs/promises";import{existsAsync as rs}from"@skeet-framework/utils";var u=t(async _=>{let E=`${ss()}/${Pe}`;await rs(E)||(console.log("Creating default config file at",E),await $t(E,JSON.stringify(C_,null,2)));let i={...JSON.parse(await Ss(E,"utf8")),..._},n=JSON.stringify(i,null,2);await $t(E,n)},"updateDefaultConfig");var Rs={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"},ye=Rs;var Cs={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:"},Wt=Cs;var as={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}"}},Ge=as;var cs={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"}},Xt=cs;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Ve=[[],[") 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 jt=[") \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"],zt=[[],[") \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 ds={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"}},be=ds;var Ns={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"}},Zt=Ns;var we=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var _o=[") \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 Os=t(_=>{let e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};switch(_){case u_.EN:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we};break;case u_.JA:e={cmds:Wt,subCmds:Zt,logs:Xt,installer:jt,installerSub:zt,clientCmds:_o};break;default:e={cmds:ye,subCmds:be,logs:Ge,installer:ke,installerSub:Ve,clientCmds:we}}return e},"readLocale"),eo=Os;import{existsSync as Ds,readFileSync as Ps,writeFileSync as Eo}from"fs";import{readFileSync as Fs,writeFileSync as ls}from"fs";import{homedir as Is}from"os";var V_=t(_=>{let E=`${Is()}/${i_.CONFIG}`,i={...JSON.parse(Fs(E,"utf8")),..._},n=JSON.stringify(i,null,2);ls(E,n)},"updateSolvConfig");import{homedir as fs}from"os";var to=t(()=>{let e=`${fs()}/${i_.CONFIG}`;Ds(e)||(Eo(e,JSON.stringify(q,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(Ps(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Eo(e,JSON.stringify(q,null,2)),E=q}let o=eo(E.LANG);return E.RPC_URL||(E.RPC_URL=q.RPC_URL,V_({RPC_URL:q.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,V_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",V_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as y}from"child_process";import{promises as oo}from"fs";import As from"path";var Us=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
|
|
13
14
|
index a0c631ee9f..048b118660 100644
|
|
14
15
|
--- a/book/api/metrics-generated.md
|
|
15
16
|
+++ b/book/api/metrics-generated.md
|
|
@@ -5794,7 +5795,7 @@ index 479e0f1829..a97f5778d4 100644
|
|
|
5794
5795
|
|
|
5795
5796
|
/* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
|
|
5796
5797
|
at the NOTICE level to the logger. E.g. for a typical fd_log
|
|
5797
|
-
`;return{filePath:_,body:e}},"modDiff"),ve=
|
|
5798
|
+
`;return{filePath:_,body:e}},"modDiff"),ve=Us;var io=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?K_:y_),n=E||_.MOD,{filePath:T,body:s}=ve();y("sudo apt install --only-upgrade doublezero -y",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),y('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await oo.mkdir(As.dirname(T),{recursive:!0}),await oo.writeFile(T,s,"utf8"),y(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(y("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),y(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),y("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),y("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),y("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),y("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as Ls}from"node:child_process";var To=t(_=>{let e=_.NETWORK===c.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===F.JITO,i=_.VALIDATOR_TYPE===F.FRANKENDANCER,n=_.AUTO_RESTART,T=_.MOD,s=10;n&&!e&&(s=30);let S=e?t_:w;o&&(S=L_,e&&(S=ee)),i&&(S=y_,e&&(S=K_)),E&&(S=M_,o&&(S=Nt)),d.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).option("--mod","Modified Versions",!1).action(async r=>{let C=k_(),a=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(no.white(`Current solv version: ${C}`)),r.auto){await qt(_);return}if(r.migrateConfig){let R=to().config,N=$.TRIPLE;R.DISK_TYPES===0?N=$.DOUBLE:R.DISK_TYPES===1?N=$.SINGLE:N=$.TRIPLE;let I=R.SOLANA_NETWORK===N_.TESTNET,O=R.SOLV_TYPE===me.RPC_NODE,l=R.MAINNET_TYPE===he.JITO_MEV,G={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:N,RPC_TYPE:O?V.JITO:V.NONE,VALIDATOR_TYPE:l?F.JITO:I?F.AGAVE:F.SOLANA,TESTNET_SOLANA_VERSION:R.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:R.MAINNET_SOLANA_VERSION,NODE_VERSION:R.NODE_VERSION,TESTNET_DELINQUENT_STAKE:R.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:R.MAINNET_DELINQUENT_STAKE,COMMISSION:R.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:R.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:R.STAKE_ACCOUNT,HARVEST_ACCOUNT:R.HARVEST_ACCOUNT,IS_MEV_MODE:R.IS_MEV_MODE,RPC_URL:R.RPC_URL,KEYPAIR_PATH:R.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:R.DISCORD_WEBHOOK_URL,AUTO_UPDATE:R.AUTO_UPDATE,AUTO_RESTART:R.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:R.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await u(G)}if(r.config){if(await u({TESTNET_SOLANA_VERSION:t_,MAINNET_SOLANA_VERSION:w}),o){let R=e?ee:L_;await te({version:R,tag:`v${R}`})}console.log(no.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(r.firewall){await wt();return}if(r.background){let R=r.version,N=!!R.startsWith("3");if(await u({TESTNET_SOLANA_VERSION:t_,MAINNET_SOLANA_VERSION:w}),o){Ke(`v${R}`,r.mod||T,N),await te({version:R,tag:`v${R}`}),await pe(a,!0,s);return}if(i){await io(_,R,r.mod||T),await pe(a,!0,s);return}await ue(R,r.mod||T,N);let I=e?10:5;e&&Ls("solv start",{stdio:"inherit",shell:!0}),await pe(I,!0,s);return}else if(r.commission){let R=await bt();Vt(R.commission,e)}else Gt()})},"updateCommands");import{spawnSync as Ms}from"node:child_process";var so=t(_=>{try{let{log:e}=O_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Ms(E,{shell:!0,stdio:"inherit"});if(o.error)throw o.error;o.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):o.status!==0&&(console.error(`Child process exited with code ${o.status}`),process.exit(o.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var So=t(()=>{d.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(_=>{so(_)})},"logCommands");import c_ from"chalk";import{spawnSync as us}from"child_process";import{homedir as ps}from"os";var He=t(_=>{let e=ps(),E=L(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=N_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=N_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=N_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;us(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Ye}from"child_process";import{existsSync as ro,readdirSync as ms,rmSync as hs}from"fs";import{homedir as Bs}from"os";import Ro from"path";var Je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[h.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[h.TESTNET_VALIDATOR_KEY,h.TESTNET_VALITATOR_AUTHORITY_KEY,h.TESTNET_VALIDATOR_VOTE_KEY,h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[h.MAINNET_VALIDATOR_KEY,h.MAINNET_VALITATOR_AUTHORITY_KEY,h.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Ye(o,{shell:!0,stdio:"ignore"});let i=ms("./").filter(S=>S.endsWith("SV.json")),n=Bs(),T=Ro.join(n,"unstaked-identity.json");ro(T)&&Ye(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=Ro.join(n,e[s]);if(s++,ro(r)){console.log(`${r} is already exist!`),hs(S,{recursive:!0});continue}let C=`mv ${S} ${r}`;Ye(C,{shell:!0,stdio:"inherit"})}Ye("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as ao}from"child_process";var gs=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
|
|
5798
5799
|
Description=Jupiter API Service Instance
|
|
5799
5800
|
After=network.target
|
|
5800
5801
|
|
|
@@ -5809,19 +5810,19 @@ Environment=RUST_LOG=info
|
|
|
5809
5810
|
Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
|
|
5810
5811
|
|
|
5811
5812
|
[Install]
|
|
5812
|
-
WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),
|
|
5813
|
+
WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),Co=gs;import Ks from"inquirer";import ys from"chalk";var Gs=t(async()=>{let _=await Ks.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);ao(`sudo apt-get install unzip wget -y
|
|
5813
5814
|
wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
|
|
5814
5815
|
unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
|
|
5815
5816
|
chmod +x jupiter-swap-api
|
|
5816
|
-
rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=
|
|
5817
|
+
rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=Co(_.rpcUrl,_.grpcUrl,_.grpcToken);ao(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(ys.white(`\u{1F7E2} Jupiter Swap API Setup Completed
|
|
5817
5818
|
|
|
5818
|
-
$ solv jupiter --help`))},"jupiterAPISetup"),
|
|
5819
|
+
$ solv jupiter --help`))},"jupiterAPISetup"),co=Gs;import{existsAsync as ks}from"@skeet-framework/utils";import{readFile as Vs,writeFile as No}from"fs/promises";import{homedir as bs}from"os";import ws from"path";var a_=t(async()=>{let _=bs(),e=ws.join(_,i_.JITO_CONFIG);await ks(e)||(await No(e,JSON.stringify(R_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Vs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await No(e,JSON.stringify(R_,null,2)),E=R_}return E},"readOrCreateJitoConfig");import{spawnSync as vs}from"child_process";var ne=t(()=>{vs("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Te from"chalk";import xe from"inquirer";import Hs from"inquirer";var Oo=t(async _=>{let E=Object.keys(_?Ee.TESTNET:Ee.MAINNET),o=_?Ee.TESTNET:Ee.MAINNET,i=await Hs.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:E}]),n=i.region,T=o[n];return{version:R_.version,tag:R_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Ys=t(async()=>{try{let _=F.NONE,e=V.AGAVE,E=C_.COMMISSION,o=!1,i=await xe.prompt([{name:"network",type:"list",message:"Choose Network",choices:vt,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Ht,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[F.JITO,F.SOLANA]:[F.AGAVE,F.JITO,F.FRANKENDANCER];_=await xe.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:F.AGAVE}).then(r=>r.validatorType),e=V.NONE}if(i.nodeType===D.RPC&&(e=await xe.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:Yt,default:V.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await xe.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${C_.COMMISSION}%)'`,default:C_.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(E=S.commission,o=S.isDummy,_===F.JITO||_===F.FRANKENDANCER){await a_();let r=await Oo(n);await te(r)}}let{network:T,nodeType:s}=i;return console.log(Te.white("Network:",T)),console.log(Te.white("Node Type:",s)),console.log(Te.white("Validator Type:",_)),console.log(Te.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Te.white("Commission:",E)),await u({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Fo=Ys;import{spawnSync as W}from"child_process";var se=t((_=L_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-jito`;W(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),W(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),W(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),W("sudo rm -rf /home/solv/.local/share/solana/install/active_release/bin/",{shell:!0,stdio:"inherit"}),W(`cp -r /home/solv/.local/share/solana/install/releases/${o}/bin/ /home/solv/.local/share/solana/install/active_release/bin/`,{shell:!0,stdio:"inherit"}),W(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),W("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?W(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):W(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var lo=t(()=>`#!/bin/bash
|
|
5819
5820
|
exec agave-validator \\
|
|
5820
|
-
--identity ${
|
|
5821
|
+
--identity ${A} \\
|
|
5821
5822
|
--log ${j} \\
|
|
5822
5823
|
--accounts ${g_} \\
|
|
5823
5824
|
--ledger ${P} \\
|
|
5824
|
-
--snapshots ${
|
|
5825
|
+
--snapshots ${E_} \\
|
|
5825
5826
|
--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
|
|
5826
5827
|
--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
|
|
5827
5828
|
--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
|
|
@@ -5854,13 +5855,13 @@ exec agave-validator \\
|
|
|
5854
5855
|
--wal-recovery-mode skip_any_corrupted_record \\
|
|
5855
5856
|
--use-snapshot-archives-at-startup when-newest \\
|
|
5856
5857
|
--limit-ledger-size 400000000 \\
|
|
5857
|
-
`,"startJitoRPCScript");import{existsAsync as
|
|
5858
|
+
`,"startJitoRPCScript");import{existsAsync as Qs}from"@skeet-framework/utils";import{writeFile as qs}from"fs/promises";import{spawnSync as Js}from"node:child_process";var xs=t(()=>{let _=`sudo chmod +x ${e_}`;Js(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Se=xs;var Io=t(()=>`#!/bin/bash
|
|
5858
5859
|
exec agave-validator \\
|
|
5859
|
-
--identity ${
|
|
5860
|
+
--identity ${A} \\
|
|
5860
5861
|
--log ${j} \\
|
|
5861
5862
|
--accounts ${g_} \\
|
|
5862
5863
|
--ledger ${P} \\
|
|
5863
|
-
--snapshots ${
|
|
5864
|
+
--snapshots ${E_} \\
|
|
5864
5865
|
--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
|
|
5865
5866
|
--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
|
|
5866
5867
|
--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
|
|
@@ -5890,9 +5891,9 @@ exec agave-validator \\
|
|
|
5890
5891
|
--wal-recovery-mode skip_any_corrupted_record \\
|
|
5891
5892
|
--use-snapshot-archives-at-startup when-newest \\
|
|
5892
5893
|
--limit-ledger-size 400000000 \\
|
|
5893
|
-
`,"startRPCNodeScript");var
|
|
5894
|
+
`,"startRPCNodeScript");var $s=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case V.AGAVE:console.log("Agave RPC Node Setup"),G_(_.TESTNET_SOLANA_VERSION),E=Io();break;case V.JITO:console.log("JITO RPC Node Setup"),se(ee),E=lo();break;default:console.log("Unknown RPC Node Setup");break}if(await Qs(e_)){console.log("Startup script already exists. Skipping...");return}await qs(e_,E,"utf-8"),Se()},"setupRpcNode"),Do=$s;import{spawnSync as Ws}from"node:child_process";var Xs=t(_=>{Ws(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),BE=Xs;var Po=t((_=0,e,E,o,i,n="agave-validator")=>`#!/bin/bash
|
|
5894
5895
|
exec ${n} \\
|
|
5895
|
-
--identity ${
|
|
5896
|
+
--identity ${A} \\
|
|
5896
5897
|
--vote-account ${fe} \\
|
|
5897
5898
|
--authorized-voter ${b} \\
|
|
5898
5899
|
--log ${j} \\
|
|
@@ -5927,9 +5928,9 @@ exec ${n} \\
|
|
|
5927
5928
|
--snapshot-interval-slots 0 \\
|
|
5928
5929
|
--private-rpc \\
|
|
5929
5930
|
--full-rpc-api \\
|
|
5930
|
-
`,"startJitoMainnetScript");var
|
|
5931
|
+
`,"startJitoMainnetScript");var fo=t((_=1e4,e,E,o,i,n="agave-validator")=>`#!/bin/bash
|
|
5931
5932
|
exec ${n} \\
|
|
5932
|
-
--identity ${
|
|
5933
|
+
--identity ${A} \\
|
|
5933
5934
|
--vote-account ${Ue} \\
|
|
5934
5935
|
--authorized-voter ${K} \\
|
|
5935
5936
|
--log ${j} \\
|
|
@@ -5961,9 +5962,9 @@ exec ${n} \\
|
|
|
5961
5962
|
--expected-bank-hash 4oMrSXsLTiCc1X7S27kxSfGVraTCZoZ7YTy2skEB9bPk \\
|
|
5962
5963
|
--expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
|
|
5963
5964
|
--full-rpc-api \\
|
|
5964
|
-
`,"startJitoTestnetScript");var
|
|
5965
|
+
`,"startJitoTestnetScript");var Uo=t((_,e="agave-validator")=>`#!/bin/bash
|
|
5965
5966
|
exec ${e} \\
|
|
5966
|
-
--identity ${
|
|
5967
|
+
--identity ${A} \\
|
|
5967
5968
|
--vote-account ${fe} \\
|
|
5968
5969
|
--authorized-voter ${b} \\
|
|
5969
5970
|
--log ${j} \\
|
|
@@ -5993,9 +5994,9 @@ exec ${e} \\
|
|
|
5993
5994
|
--block-verification-method unified-scheduler \\
|
|
5994
5995
|
--snapshot-interval-slots 0 \\
|
|
5995
5996
|
--private-rpc \\
|
|
5996
|
-
`,"startMainnetValidatorScript");var
|
|
5997
|
+
`,"startMainnetValidatorScript");var gE=t(_=>`#!/bin/bash
|
|
5997
5998
|
exec agave-validator \\
|
|
5998
|
-
--identity ${
|
|
5999
|
+
--identity ${A} \\
|
|
5999
6000
|
--vote-account ${Ue} \\
|
|
6000
6001
|
--authorized-voter ${K} \\
|
|
6001
6002
|
--log ${j} \\
|
|
@@ -6024,14 +6025,14 @@ exec agave-validator \\
|
|
|
6024
6025
|
--full-rpc-api \\
|
|
6025
6026
|
--maximum-full-snapshots-to-retain 1 \\
|
|
6026
6027
|
--maximum-incremental-snapshots-to-retain 4 \\
|
|
6027
|
-
`,"startTestnetAgaveValidatorScript");import{existsAsync as
|
|
6028
|
-
`).slice(1),E=[],o=e.map(O=>O.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let O of e){let[l,G,
|
|
6028
|
+
`,"startTestnetAgaveValidatorScript");import{existsAsync as Ao}from"@skeet-framework/utils";import{writeFile as Lo}from"fs/promises";var js=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===c.MAINNET?(console.log("Mainnet Validator Node Setup"),await zs(_,e)):E===c.TESTNET?(console.log("Testnet Validator Node Setup"),await Zs(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),zs=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MAINNET_SOLANA_VERSION:o,MOD:i}=_;e=i;let n="",T=!!o.startsWith("3");switch(E){case F.SOLANA:BE(o),n=Uo(_);break;case F.JITO:console.log("JITO Validator Setup for Mainnet");let s=await a_();se(o,e,T),n=Po(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await Ao(e_)){console.log("Startup script already exists. Skipping...");return}await Lo(e_,n,"utf-8"),Se()},"setupMainnetValidator"),Zs=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o}=_;e=o;let i="",n=!!_.TESTNET_SOLANA_VERSION.startsWith("3");switch(E){case F.SOLANA:BE(_.TESTNET_SOLANA_VERSION),i=gE(_);case F.AGAVE:console.log("Agave Validator Setup for Testnet"),G_(_.TESTNET_SOLANA_VERSION,e,n),i=gE(_);break;case F.JITO:console.log("JITO Validator Setup for Testnet");let T=await a_();se(_.TESTNET_SOLANA_VERSION,e,n),i=fo(T.commissionBps,T.relayerUrl,T.blockEngineUrl,T.shredReceiverAddr,_);break;default:console.log("Unknown Validator Type for Testnet");break}if(await Ao(e_)){console.log("Startup script already exists. Skipping...");return}await Lo(e_,i,"utf-8"),Se()},"setupTestnetValidator"),Mo=js;import _i from"chalk";import{execSync as uo}from"node:child_process";function po(_){try{uo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{uo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(po,"createDirectoryIfNotExists");var mo=t(()=>{try{let _=[f.ACCOUNTS,f.LEDGER,f.SNAPSHOTS];for(let e of _)po(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as _S}from"child_process";function eS(){let e=_S("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
|
|
6029
|
+
`).slice(1),E=[],o=e.map(O=>O.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let O of e){let[l,G,U]=O.trim().split(/\s+/);if(!l||!G)continue;let Q=parseInt(G,10);if(isNaN(Q))continue;let S_=U!==void 0&&U!=="";U==="/"&&(S=l.replace(/p?\d*$/,""));let f_=o.some(Z_=>Z_!==l&&Z_.startsWith(l)),z_=l.startsWith("nvme")?"NVMe":"SATA";Q>=400*1024*1024*1024&&E.push({name:l,size:Q,mountpoint:U||"",isMounted:S_,hasPartition:f_,type:z_})}console.log("Found root disk name: ",S);let r=o.filter(O=>O.startsWith(S));r.forEach(O=>console.log("Found root disk partition: ",O));let a=E.filter(O=>!r.includes(O.name)).sort((O,l)=>l.size-O.size),R=a.filter(O=>O.type==="NVMe").sort((O,l)=>l.size-O.size),N=a.filter(O=>O.type==="SATA").sort((O,l)=>l.size-O.size),I=[...R,...N];if(I.length>0){let O=I[0];if(O.size>=850*1024*1024*1024&&!O.isMounted&&(i=!0),O.size>=1250*1024*1024*1024&&O.isMounted&&(T=!0),I.length>1){let l=I[1];l.size>=400*1024*1024*1024&&!l.isMounted&&(n=!0)}if(I.length>2){let l=I[2];l.size>=400*1024*1024*1024&&!l.isMounted&&(s=!0)}}return I.forEach((O,l)=>console.log(`Prioritized Disk ${l+1}: ${O.name} ${O.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(eS,"getPreferredDisks");var re=eS;import{spawnSync as b_}from"child_process";var F_=t(_=>{if(b_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return b_(E,{shell:!0,stdio:"inherit"}),b_("sudo udevadm trigger --action=change",{shell:!0}),b_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Qe}from"child_process";async function KE(_){for(let e=1;e<=5;e++){let o=Qe(`sudo blkid -s UUID -o value ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(o)return console.log(`[SUCCESS] Found UUID for ${_}: ${o}`),`UUID=${o}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${_}`),await Y(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(KE,"getUUID");var Re=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await KE(_),T=await KE(e),s=await KE(E),S=`${n} ${f.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
|
|
6029
6030
|
${T} ${f.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${f.LEDGER} ext4 defaults 0 0
|
|
6030
6031
|
${T} ${f.ACCOUNTS} ext4 defaults 0 0
|
|
6031
|
-
${s} ${f.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],
|
|
6032
|
+
${s} ${f.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],a=Qe("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let N of r)a.includes(N)||(console.log(`[INFO] Line to add: ${N}`),R.push(N));if(R.length){console.log(`[INFO] Lines to add all: ${R}`);let N=`echo "${R.join(`
|
|
6032
6033
|
`)}" | sudo tee -a /etc/fstab`;Qe(N,{shell:!0,encoding:"utf8"}),Qe("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
|
|
6033
6034
|
${R.join(`
|
|
6034
|
-
`)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as
|
|
6035
|
+
`)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as ES}from"child_process";var ho=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=ES(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var tS=t(async()=>{let _=re(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await u({MNT_DISK_TYPE:$.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=F_(E),T=F_(o),s=F_(i),S=n?E:"",r=T?o:"",C=s?i:"";console.log("Waiting for formatting to finish..."),await Y(5e3),await Re(n?S:"",T?r:"",s?C:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await u({MNT_DISK_TYPE:$.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=F_(E),n=F_(o);await Re(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await u({MNT_DISK_TYPE:$.SINGLE}),e.includes("/mnt")){ho(e);let E="/dev/"+_.disks[0].name;F_(E),await Re(E)}else{let E="/dev/"+_.disks[0].name;F_(E),await Re(E)}},"mountDirs"),Bo=tS;import{spawnSync as oS}from"child_process";var go=t(()=>{let _=[`sudo mkdir -p ${f.ROOT}`,`sudo chown -R solv:solv ${f.ROOT}`,`sudo chmod -R 755 ${f.ROOT}`,`sudo mkdir -p ${f.ACCOUNTS}`,`sudo chown -R solv:solv ${f.ACCOUNTS}`,`sudo chmod -R 755 ${f.ACCOUNTS}`,`sudo mkdir -p ${f.LEDGER}`,`sudo chown -R solv:solv ${f.LEDGER}`,`sudo chmod -R 755 ${f.LEDGER}`,`sudo mkdir -p ${f.SNAPSHOTS}`,`sudo chown -R solv:solv ${f.SNAPSHOTS}`,`sudo chmod -R 755 ${f.SNAPSHOTS}`];for(let e of _)oS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as qe}from"child_process";import{existsSync as iS}from"fs";function Ko(){if(!iS(m.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
|
|
6035
6036
|
# Increase UDP buffer sizes
|
|
6036
6037
|
net.core.rmem_default = 134217728
|
|
6037
6038
|
net.core.rmem_max = 134217728
|
|
@@ -6046,7 +6047,7 @@ fs.nr_open = 1000000
|
|
|
6046
6047
|
`,e=`
|
|
6047
6048
|
# Increase process file descriptor count limit
|
|
6048
6049
|
* - nofile 1000000
|
|
6049
|
-
`;qe(`echo "${_}" | sudo tee ${m.SOL_SYSTEM_CONFIG21} > /dev/null`),qe(`sudo sysctl -p ${m.SOL_SYSTEM_CONFIG21}`),qe(`echo "DefaultFILE=1000000" | sudo tee -a ${m.SOL_SYSTEM_CONF}`),qe(`echo "${e}" | sudo tee ${m.SOL_NOFILES_CONF} > /dev/null`)}}t(
|
|
6050
|
+
`;qe(`echo "${_}" | sudo tee ${m.SOL_SYSTEM_CONFIG21} > /dev/null`),qe(`sudo sysctl -p ${m.SOL_SYSTEM_CONFIG21}`),qe(`echo "DefaultFILE=1000000" | sudo tee -a ${m.SOL_SYSTEM_CONF}`),qe(`echo "${e}" | sudo tee ${m.SOL_NOFILES_CONF} > /dev/null`)}}t(Ko,"setupSystemd");var yE=t((_=q.USERNAME,e)=>{let{log:E}=O_(),o=e?"frankendancer":"agave",i=`${E} {
|
|
6050
6051
|
su ${_} ${_}
|
|
6051
6052
|
daily
|
|
6052
6053
|
rotate 1
|
|
@@ -6078,7 +6079,7 @@ fs.nr_open = 1000000
|
|
|
6078
6079
|
compress
|
|
6079
6080
|
copytruncate
|
|
6080
6081
|
}
|
|
6081
|
-
`),i)},"logRotates");import{existsSync as
|
|
6082
|
+
`),i)},"logRotates");import{existsSync as yo}from"fs";import{execSync as Go}from"child_process";function w_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&yo(m.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!yo(m.SOL_LOGROTATE)){let e=yE("solv",_);Go(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=yE("solv",_);Go(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(w_,"setupLogrotate");var nS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",TS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",sS=`/home/${q.USERNAME}/.local/share/solana/install/active_release/bin`,ko=t((_=!0)=>{let{scriptPath:e}=O_(_),E=_?TS:nS,o=sS;return`[Unit]
|
|
6082
6083
|
Description=Solana Validator
|
|
6083
6084
|
After=network.target
|
|
6084
6085
|
StartLimitIntervalSec=0
|
|
@@ -6097,7 +6098,7 @@ Environment="${E}"
|
|
|
6097
6098
|
ExecStart=${e}
|
|
6098
6099
|
|
|
6099
6100
|
[Install]
|
|
6100
|
-
WantedBy=multi-user.target`},"solvService");import{execSync as
|
|
6101
|
+
WantedBy=multi-user.target`},"solvService");import{execSync as SS}from"child_process";function Vo(_=!0){console.log("Creating solvService configuration for solana");let e=ko(_);SS(`echo "${e}" | sudo tee ${m.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(Vo,"setupSolvService");var bo=t((_=!0)=>{w_(),Vo(_),Ko()},"makeServices");import{spawnSync as GE}from"node:child_process";var wo=t(_=>{try{Je(_);let e=_.NETWORK;return e===c.TESTNET?(GE(`solana config set --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"}),GE(`solana airdrop 1 --url ${e} -k ${K}`,{shell:!0,stdio:"inherit"})):GE(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&He(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as vo}from"node:child_process";var $e=t((_=!1,e="45",E=E_,o=w,i=_?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",n=!1)=>{try{let T=`docker run -it --rm -v ${E}:${E} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${E} --min_download_speed ${e} --version ${o} --rpc ${i}`;if(_&&n){vo(`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:E});return}vo(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as rS}from"node:child_process";var We=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];rS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as RS}from"node:child_process";var CS=t(()=>{try{RS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Ho=CS;import kE from"fs";import{promisify as Jo}from"util";import{execSync as Yo}from"child_process";var aS=Jo(kE.readFile),cS=Jo(kE.access),Xe="/etc/sysctl.conf",dS=`# set default and maximum socket buffer sizes to 128MB
|
|
6101
6102
|
net.core.rmem_default=134217728
|
|
6102
6103
|
net.core.wmem_default=134217728
|
|
6103
6104
|
net.core.rmem_max=134217728
|
|
@@ -6108,9 +6109,9 @@ net.ipv4.tcp_rmem=10240 87380 134217728
|
|
|
6108
6109
|
net.ipv4.tcp_wmem=10240 87380 134217728
|
|
6109
6110
|
|
|
6110
6111
|
# Enable TCP westwood for kernels greater than or equal to 2.6.13
|
|
6111
|
-
net.ipv4.tcp_congestion_control=westwood`;async function
|
|
6112
|
-
${
|
|
6113
|
-
`,
|
|
6112
|
+
net.ipv4.tcp_congestion_control=westwood`;async function NS(){try{await cS(Xe,kE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${Xe} does not exist`)}try{let _=await aS(Xe,"utf8");if(!_.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=_.replace(/net\.core\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\n/g,"");e=e.replace(/net\.ipv4\.tcp_(rmem|wmem|congestion_control)=.*\n/g,""),e+=`
|
|
6113
|
+
${dS}
|
|
6114
|
+
`,Yo(`echo "${e}" | sudo tee ${Xe} > /dev/null`),Yo("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(NS,"updateSysctlConfig");var xo=NS;import{spawnSync as OS}from"child_process";var Qo=t(()=>{OS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as FS}from"node:child_process";var qo=t(()=>{FS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as $o}from"child_process";var Wo=t((_=!1,e=!1)=>{_?IS():lS(e)},"createSymLink"),lS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),$o(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),IS=t(()=>{$o("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import je from"chalk";var DS=t(()=>{let _=`${je.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${je.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
|
|
6114
6115
|
|
|
6115
6116
|
We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
|
|
6116
6117
|
It's our way of supporting the community and empowering you with fast, reliable connections.
|
|
@@ -6120,11 +6121,11 @@ To get your free API key, simply join us through the link below:
|
|
|
6120
6121
|
Validators DAO: ${je.white("`https://discord.gg/X4BgkBHavp`")}
|
|
6121
6122
|
|
|
6122
6123
|
Unlock fast connections and elevate your experience with your very own API key \u{1F680}
|
|
6123
|
-
`;console.log(je.cyan(e))},"rpcLog"),p_=
|
|
6124
|
+
`;console.log(je.cyan(e))},"rpcLog"),p_=DS;import{spawnSync as p}from"child_process";import{promises as VE}from"fs";import LS from"path";var PS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
|
|
6124
6125
|
sudo chmod -R 755 /mnt
|
|
6125
6126
|
sudo fdctl configure init all --config /home/solv/firedancer/config.toml
|
|
6126
6127
|
sudo chown -R solv:solv /mnt
|
|
6127
|
-
sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),
|
|
6128
|
+
sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Xo=PS;var fS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
|
|
6128
6129
|
Description=Firedancer Solana
|
|
6129
6130
|
After=network.target
|
|
6130
6131
|
StartLimitIntervalSec=0
|
|
@@ -6140,7 +6141,7 @@ ExecStart=/home/solv/start-firedancer.sh
|
|
|
6140
6141
|
|
|
6141
6142
|
[Install]
|
|
6142
6143
|
WantedBy=multi-user.target
|
|
6143
|
-
`}),"firedancerService"),
|
|
6144
|
+
`}),"firedancerService"),jo=fS;var US=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
|
|
6144
6145
|
user = "solv"
|
|
6145
6146
|
|
|
6146
6147
|
[log]
|
|
@@ -6307,7 +6308,7 @@ user = "solv"
|
|
|
6307
6308
|
commission_bps = 10000
|
|
6308
6309
|
|
|
6309
6310
|
[tiles.pack]
|
|
6310
|
-
schedule_strategy = "balanced"`:o}},"configToml"),
|
|
6311
|
+
schedule_strategy = "balanced"`:o}},"configToml"),zo=US;var AS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
|
|
6311
6312
|
Description=Relay port 9600 to localhost:80
|
|
6312
6313
|
After=network.target
|
|
6313
6314
|
|
|
@@ -6317,7 +6318,7 @@ Restart=always
|
|
|
6317
6318
|
|
|
6318
6319
|
[Install]
|
|
6319
6320
|
WantedBy=multi-user.target
|
|
6320
|
-
`}),"portRelayService"),
|
|
6321
|
+
`}),"portRelayService"),Zo=AS;var MS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?K_:y_,{filePath:i,body:n}=ve();_?(p('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),p('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await VE.mkdir(LS.dirname(i),{recursive:!0}),await VE.writeFile(i,n,"utf8"),p(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),p(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),p("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await a_(),{filePath:s,body:S}=Xo();p(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),p(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=jo();p(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let C=Zo();p("sudo apt install socat",{shell:!0,stdio:"inherit"}),p("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),p(`echo "${C.body}" | sudo tee ${C.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),p("sudo systemctl daemon-reload",{shell:!0});let a=zo(E,T);await VE.writeFile(a.filePath,a.body,"utf-8"),console.log(`config.toml written to ${a.filePath}`),p(`sudo chown solv:solv "${a.filePath}"`,{shell:!0,stdio:"inherit"}),w_(!0)},"setupFiredancer"),ze=MS;var ei=t(async(_=!1,e=!1,E=!1,o=!1)=>{try{_||(console.log(_i.white("\u{1F7E2} Initializing Setup")),await k(),await Fo());let i=await k(),n=i.NETWORK===c.TESTNET;switch(mo(),(!e||!E)&&await Bo(),bo(n),Qo(),Ho(),await xo(),wo(i),Wo(i.IS_DUMMY,n),i=await k(),i.NODE_TYPE){case D.RPC:await Do(i);break;case D.VALIDATOR:await Mo(i,o),i.VALIDATOR_TYPE===F.FRANKENDANCER&&await ze(o,i);break;default:throw new Error("Unknown Node Type")}E||go(),ne(),i.VALIDATOR_TYPE!==F.FRANKENDANCER&&(E||(i=await k(),qo(),$e(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),E||We(i),console.log(_i.white("\u{1F7E2} Setup Completed")),p_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var Ei=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
|
|
6321
6322
|
[Unit]
|
|
6322
6323
|
Description=Solana transaction relayer
|
|
6323
6324
|
Requires=network-online.target
|
|
@@ -6343,7 +6344,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
|
|
|
6343
6344
|
--verifying-key-pem-path=/home/solv/public.pem
|
|
6344
6345
|
|
|
6345
6346
|
[Install]
|
|
6346
|
-
WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),
|
|
6347
|
+
WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),ti=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
|
|
6347
6348
|
Description=Solana transaction relayer
|
|
6348
6349
|
Requires=network-online.target
|
|
6349
6350
|
After=network-online.target
|
|
@@ -6366,42 +6367,42 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
|
|
|
6366
6367
|
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
|
|
6367
6368
|
|
|
6368
6369
|
[Install]
|
|
6369
|
-
WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as Ze,spawnSync as
|
|
6370
|
+
WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as Ze,spawnSync as l_}from"child_process";var oi=t(async(_,e=!0)=>{l_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),l_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),l_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),l_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),l_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),l_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?Ei(_):ti(_);Ze(`echo "${o}" | sudo tee ${E} > /dev/null`),l_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),l_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),Ze("sudo ufw allow 11228",{stdio:"inherit"}),Ze("sudo ufw allow 11229",{stdio:"inherit"}),Ze("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as bE}from"node:child_process";var uS=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:_},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),ii=uS;import{spawnSync as pS}from"node:child_process";import{readFile as mS,writeFile as hS}from"fs/promises";var BS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await mS(_,"utf-8")).split(`
|
|
6370
6371
|
`);E.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let o=E.join(`
|
|
6371
|
-
`);await
|
|
6372
|
+
`);await hS(_,o),pS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),ni=BS;import gS from"inquirer";import{writeFile as KS}from"node:fs/promises";var Ti=t(async()=>{let e=(await gS.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,E="git clone https://github.com/rpcpool/yellowstone-grpc.git",o="cargo build -r",i="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";bE(E,{shell:!0,stdio:"inherit"}),bE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),bE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=ii(e),s=JSON.stringify(T,null,2);await KS(n,s,{encoding:"utf8"}),await ni()},"yellowstoneGeyser");var si=t(_=>{d.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let E=_.MOD||e.mod;try{if(e.vote)console.log(c_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),He(_),process.exit(0);else if(e.key)console.log(c_.white("\u{1F511} Setting up Validator Keypairs ...")),Je(_),process.exit(0);else if(e.relayer){console.log(c_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await a_()).blockEngineUrl;await oi(i,!1),console.log(c_.green(`Jito Relayer Setup Completed
|
|
6372
6373
|
|
|
6373
|
-
$ solv relayer --help`)),ne(),p_(),process.exit(0)}else if(e.jupiter)console.log(
|
|
6374
|
-
`).slice(1).filter(i=>i.split(/\s+/)[0]!=="").map(i=>{let n=i.split(/\s+/);return{Filesystem:n[0],Size:n[1],Used:n[2],Avail:n[3],Use:n[4],MountedOn:n[5]}}).sort((i,n)=>m_(n.Avail)-m_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&m_(i.Size)>9e11-1&&console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: red")}),o?console.log("your mount point is correct"):E.filter(n=>n.Filesystem.startsWith("/dev/")&&m_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import
|
|
6374
|
+
$ solv relayer --help`)),ne(),p_(),process.exit(0)}else if(e.jupiter)console.log(c_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await co(),ne(),p_(),process.exit(0);else if(e.geyser){console.log(c_.white("\u26A1\uFE0F Setting up Geyser ...")),await Ti();return}else if(e.firedancer){console.log(c_.white("\u{1F525} Setting up Firedancer ...")),await ze(E);return}await ei(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(c_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(c_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as yS}from"child_process";var wE=t(()=>{let E=yS("df -h").toString().split(`
|
|
6375
|
+
`).slice(1).filter(i=>i.split(/\s+/)[0]!=="").map(i=>{let n=i.split(/\s+/);return{Filesystem:n[0],Size:n[1],Used:n[2],Avail:n[3],Use:n[4],MountedOn:n[5]}}).sort((i,n)=>m_(n.Avail)-m_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&m_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&m_(i.Size)>9e11-1&&console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: red")}),o?console.log("your mount point is correct"):E.filter(n=>n.Filesystem.startsWith("/dev/")&&m_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Si from"chalk";import GS from"cli-table3";var vE=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Si.blue(o)),E=new GS({head:e,colWidths:[20,10,10,10,10,20]});_.forEach(o=>{E.push([o.Filesystem,o.Size,o.Used,o.Avail,o.Use,o.MountedOn].map(i=>Si.white(i)))}),console.log(E.toString())},"displayTable");var ri=t(async()=>{d.command("df").description("Disk Free Command").action(()=>{let _=wE();vE(_)})},"dfCommands"),m_=t(_=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},E=_.match(/[A-Za-z]+/)?.[0]||"",o=parseFloat(_);return e[E]?o*e[E]:o},"convertToBytes");var Ri=t(_=>{d.command("start").description("Start Solana Validator").action(()=>{We(_),process.exit(0)})},"startCommand");import{spawnSync as kS}from"node:child_process";import VS from"chalk";var Ci=t(async _=>{VS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];kS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var ai=t(_=>{d.command("stop").description("Stop Solana Validator").action(()=>{Ci(_),process.exit(0)})},"stopCommand");import{spawnSync as Ce}from"node:child_process";import ci from"chalk";var di=t(_=>{let e=o_();d.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===c.TESTNET,n=o&&i?10:30;E.rm&&(console.log(ci.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ce("solv stop",{stdio:"inherit",shell:!0}),Ce("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ce("solv get snapshot",{stdio:"inherit",shell:!0}),Ce("solv start",{stdio:"inherit",shell:!0}),console.log(ci.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let T=`${e} --ledger ${_.LEDGER_PATH} exit --max-delinquent-stake ${_.MAINNET_DELINQUENT_STAKE} --min-idle-time ${n}`;Ce(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Ni=t(_=>{let E=_.NETWORK===c.TESTNET?t_:w;_.NODE_TYPE===D.RPC&&(E=M_),d.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${E}`,E).option("-m, --mod <version>","Use modified installer",!1).action(async o=>{let i=_.VALIDATOR_TYPE===F.JITO,n=o.mod||_.MOD;if(i){let S=o.version||L_,r=`v${S}`,C=!!S.startsWith("3");Ke(r,n,C);return}_.NODE_TYPE===D.RPC&&(E=M_);let s=o.version||E;await ue(s,n)})},"installCommands");import{spawnSync as bS}from"child_process";var Oi=t(()=>{d.command("mtr").description("Mount Reload Command").action(()=>{bS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),d.command("disks").description("Show unmounted disks").action(()=>{let _=re();console.log(_)})},"mountCommands");import{spawnSync as HS}from"node:child_process";import Fi from"chalk";import{spawnSync as wS}from"child_process";var vS=t(async()=>{try{let _=wS("crontab",["-l"],{encoding:"utf-8"});if(_.status!==0)return console.log("No crontab for this user."),!1;let e=_.stdout;return console.log(e),e.includes("solv epochTimer")}catch(_){return console.error("Error reading crontab:",_),!1}},"hasEpochTimer"),_E=vS;var li=t(()=>{d.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await _E()&&(console.log(Fi.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let o=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;HS(o,{shell:!0,stdio:"inherit"}),console.log(Fi.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var ae={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 JS,mkdirSync as xS}from"fs";import QS from"inquirer";import{homedir as qS}from"os";import{spawnSync as YS}from"node:child_process";function Ii(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return YS(i,{shell:!0,stdio:"inherit"}).status===0}t(Ii,"executeSCP");var HE=t(async(_="")=>{let e=_;_===""&&(e=(await QS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(L()),o=qS(),i=o.includes("/home/solv")?"/home/solv":o+ae.SOLV_KEYPAIR_DOWNLOAD_PATH;JS(i)||xS(i,{recursive:!0});let n=!0,T=o+"/"+nt;E.push(T);for(let s of E){let S=s.split("/"),r=S[S.length-1];r=o.includes("/home/solv")?r:r.replace(".json",`-${e}.json`);let C=`${i}/${r}`;Ii(e,s,C,n)&&console.log(`Successfully Exported - ${C} \u{1F389}`)}},"download");import{spawnSync as $S}from"child_process";import{existsSync as WS}from"fs";import XS from"inquirer";import jS from"os";var Di=t(async(_="")=>{let e=jS.userInfo().homedir,E=_;_===""&&(E=(await XS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${ae.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=ae.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(L(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let S=`${o}/${s}`;if(!WS(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;$S(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as zS}from"child_process";import ZS from"inquirer";var Pi=t(async()=>{let _=await ZS.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${v.ROOT}/.ssh && echo "${_.pubkey}" >> ${v.AUTHORIZED_KEYS}`;zS(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import eE from"chalk";import{readFileSync as _r}from"fs";import er from"os";var fi=t(()=>{try{let e=`${er.userInfo().homedir}/.ssh/id_rsa.pub`,E=_r(e,"utf8");console.log(eE.white(`Your SSH Public Key is:
|
|
6375
6376
|
`)),console.log(eE.white(E))}catch(_){console.error(eE.white(`Error reading SSH Public Key
|
|
6376
|
-
`)),console.error(eE.white(_))}},"cat");import{spawnSync as
|
|
6377
|
-
`).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),
|
|
6378
|
-
Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)
|
|
6377
|
+
`)),console.error(eE.white(_))}},"cat");import{spawnSync as Er}from"child_process";var Ui=t(()=>{Er("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as tr}from"child_process";import{readFileSync as or}from"fs";import{Readable as ir}from"stream";var Ai=t(async _=>new Promise((e,E)=>{try{let o=tr("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
|
|
6378
|
+
`).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),nr=t(_=>{try{return JSON.parse(or(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),Li=t(async(_,e)=>{let E=[],o=ir.from(_);return o.on("data",async i=>{nr(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import EE from"chalk";import{Presets as rr,SingleBar as Rr}from"cli-progress";import Mi from"chalk";import{spawnSync as Tr}from"node:child_process";import sr from"node-fetch";var Sr=t(async()=>{let _=await sr(Rt,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(Mi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
|
|
6379
|
+
Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)Tr(E,{shell:!0,stdio:"ignore"});return console.log(Mi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),ui=Sr;var pi=t(()=>{let _=d.command("scp").description("Scp Commands").argument("<cmd>");_.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await HE(e.ip);return}await HE()}),_.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await ui();return}await Di(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await Pi()}),_.command("cat").description("Show SSH Public Key").action(()=>{fi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Ui()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Rr({},rr.shades_classic);e.start(1e4,0);let E=await Ai(e),o=await Li(E,e);e.stop(),console.log(EE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(EE.green(`
|
|
6379
6380
|
${o.join(`
|
|
6380
6381
|
`)}`)),console.log(EE.white(`
|
|
6381
6382
|
Only showing the first 10 results
|
|
6382
6383
|
|
|
6383
|
-
`)),console.log(EE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as
|
|
6384
|
-
`).filter(n=>n.includes(".json")),e=
|
|
6384
|
+
`)),console.log(EE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as Cr}from"child_process";var mi=t(_=>{d.command("status").description("Check Solana Validator Status").action(()=>{ar(_)})},"statusCommands"),ar=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`;Cr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as cr}from"node:child_process";var hi=t(async(_,e)=>{try{let E=await k(),o=E.NETWORK===c.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?c.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return cr(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import gi from"inquirer";import{spawnSync as dr}from"node:child_process";var Bi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=dr(`solana create-stake-account ${_} ${e}`,{shell:!0,stdio:"pipe"}),n=i.stdout.toString()+i.stderr.toString();if(n.includes("Signature:"))return console.log("Stake account created successfully:",n),!0;if(n.includes("Error:"))console.log("Error encountered:",n),o++,console.log(`Retrying... (${o}/${E})`);else{console.log("Unknown output:",n);break}o===E&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as Nr,existsAsync as Or}from"@skeet-framework/utils";import{execSync as Fr,spawnSync as oE}from"node:child_process";import lr from"node:os";var Ki=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await gi.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;oE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await gi.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Dr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return V_({STAKE_ACCOUNT:S}),Bi(T,Number(i.solAmount))},"stakeAccountQuestion"),Ir=lr.userInfo().homedir,tE=Ir+"/stake-account",Dr=t(async()=>{await Or(tE)||oE(`mkdir -p ${tE}`,{shell:!0});let _=oE(`ls ${tE}`,{shell:!0}).stdout.toString().split(`
|
|
6385
|
+
`).filter(n=>n.includes(".json")),e=Nr(_.length+1),E=`${tE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return oE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Fr(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Pr}from"node:child_process";var yi=t(async _=>{try{let E=(await k()).NETWORK===c.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Pr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as fr}from"node:child_process";var Gi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return fr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import J_ from"chalk";import{Connection as Ur,PublicKey as Ar}from"@solana/web3.js";import{stakePoolInfo as Lr}from"@solana/spl-stake-pool";var iE=t(async(_,e=Z)=>{try{let E=new Ur(_),o=new Ar(e);return await Lr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as Mr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as ur}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as pr}from"@metaplex-foundation/umi";var ki=t(async(_,e)=>{try{let E=pr(e);console.log(`mintPubkey: ${E}`);let o=ur(_),i=await Mr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ce from"chalk";import Vi from"inquirer";var bi=t(async _=>{let e=await Vi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:Z}]);try{let E=await iE(_,e.stakePoolAddress);if(!E)return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
|
|
6385
6386
|
Please check the correct address and try again.
|
|
6386
6387
|
`)),console.log(ce.white(`For stake pool information
|
|
6387
|
-
\u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await
|
|
6388
|
+
\u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await ki(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
|
|
6388
6389
|
Name: ${n.name}
|
|
6389
|
-
Token Mint: ${n.mint}`;return(await
|
|
6390
|
+
Token Mint: ${n.mint}`;return(await Vi.prompt([{type:"confirm",name:"confirm",message:T+`
|
|
6390
6391
|
Is this the correct Stake Pool?`}])).confirm?n:(console.log(ce.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(ce.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
|
|
6391
6392
|
Please check the correct address and try again.
|
|
6392
6393
|
`)),console.log(ce.white(`For stake pool information
|
|
6393
|
-
\u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as
|
|
6394
|
+
\u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Hr}from"fs/promises";import Oe from"inquirer";import{existsAsync as Yr}from"@skeet-framework/utils";import{Connection as Ji,Keypair as kr,PublicKey as Ne}from"@solana/web3.js";import{Connection as mr,PublicKey as hr,Keypair as Br}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as gr}from"@solana/spl-token";var de=t(async(_,e,E,o,i=!1)=>{try{let n=Br.fromSecretKey(new Uint8Array(e)),T=new hr(E),s=new mr(_);return(await gr(s,n,T,o,i)).address.toBase58()}catch(n){throw console.log("Error in getOrCreateDestinationAddress",n),new Error(JSON.stringify(n))}},"getOrCreateDestinationAddress");import{Spinner as Vr}from"cli-spinner";import h_ from"chalk";import{PublicKey as vi,Keypair as Hi,Transaction as wi,ComputeBudgetProgram as Kr,LAMPORTS_PER_SOL as yr}from"@solana/web3.js";import*as Yi from"@solana/spl-stake-pool";var v_=t(async(_,e,E,o=new vi(Z),i,n,T)=>{try{let s=Hi.fromSecretKey(new Uint8Array(e)),S=E*yr,{instructions:r,signers:C}=await Gr(_,e,S,o,i,n,T),a=new wi().add(...r);a.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});a.recentBlockhash=R.value.blockhash,a.sign(...C,s);let N=new wi().add(...r).add(Kr.setComputeUnitPrice({microLamports:1e3}));N.feePayer=s.publicKey,N.recentBlockhash=R.value.blockhash,N.sign(...C,s);let I=await _.sendRawTransaction(N.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...R.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),Gr=t(async(_,e,E,o=new vi(Z),i,n,T)=>{let S=Hi.fromSecretKey(new Uint8Array(e)).publicKey;return await Yi.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as xi}from"@skeet-framework/utils";var nE=t(async(_,e,E,o)=>{console.log(h_.white("Solana RPC URL:",_));let i=new Ji(_);E===0&&(E=await TE());let n=new Vr("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(h_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new Ne(e),s=kr.fromSecretKey(new Uint8Array(o)),S=n_;n.setSpinnerTitle(h_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await de(_,o,S,s.publicKey);await xi(1e3),n.setSpinnerTitle(h_.green("\u{1F504} Converting SOL to elSOL"));let C=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey),a=0;for(;C.status!=="success";){if(a++,a>10)return n.stop(!0),console.log(h_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(h_.yellow(`\u23F3 ${a} Times Retrying...`)),await xi(3e3),i=new Ji(_),C=await v_(i,o,E,T,new Ne(r),new Ne(ME),s.publicKey)}return n.stop(!0),console.log(h_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
|
|
6394
6395
|
|
|
6395
|
-
Signature:`,
|
|
6396
|
-
`)),await
|
|
6396
|
+
Signature:`,C.signature)),!0},"elSOLdeposit");import{Connection as br,Keypair as wr,PublicKey as H_}from"@solana/web3.js";import{Spinner as vr}from"cli-spinner";import Y_ from"chalk";import{sleep as Qi}from"@skeet-framework/utils";var qi=t(async(_,e,E,o,i)=>{let n=new br(_);E===0&&(E=await TE());let T=new vr("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(Y_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new H_(e),S=await iE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(Y_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,C=wr.fromSecretKey(new Uint8Array(o)),a=await de(_,o,r,C.publicKey),R=await de(_,o,r,new H_(ht),!0);await Qi(1e3),T.setSpinnerTitle(Y_.green(`\u{1F504} Converting SOL to ${i}`));let N=await v_(n,o,E,s,new H_(a),new H_(R),C.publicKey),I=0;for(;N.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(Y_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Y_.yellow(`\u23F3 ${I} Times Retrying...
|
|
6397
|
+
`)),await Qi(1e3),N=await v_(n,o,E,s,new H_(a),new H_(R),C.publicKey)}return T.stop(!0),console.log(Y_.white(`\u{1F4B0} You've got ${i} \u2728
|
|
6397
6398
|
|
|
6398
|
-
Signature:`,N.signature)),!0},"depositeLST");import{execSync as sE}from"node:child_process";import{homedir as
|
|
6399
|
-
`)),console.log(J_.white(T));return}let s=JSON.parse(await
|
|
6399
|
+
Signature:`,N.signature)),!0},"depositeLST");import{execSync as sE}from"node:child_process";import{homedir as Jr}from"os";var $i=t(_=>{d.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 E=Number(e.amount);console.log("RPC URL:",_.RPC_URL);let o=Z,i=_.NETWORK===c.TESTNET,n=Jr(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(sE(`solana config set --keypair ${T}`),!await Yr(T)){console.log(J_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
|
|
6400
|
+
`)),console.log(J_.white(T));return}let s=JSON.parse(await Hr(T,"utf-8"));if(e.elsol){await nE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await bi(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await qi(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await Ki(_))return;let r=await k(),{validatorVoteAccount:C,stakeAccounts:a}=await Qr(r);for await(let R of a)try{await hi(R,C)}catch{console.log(J_.yellow(`Network might be busy, please try again later
|
|
6400
6401
|
You can use a custom RPC endpoint to avoid this issue
|
|
6401
|
-
`))}}}),d.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await
|
|
6402
|
+
`))}}}),d.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await $r();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await xr();for await(let o of E)try{await yi(o)}catch{console.log(J_.yellow(`Network might be busy, please try again later
|
|
6402
6403
|
You can use a custom RPC endpoint to avoid this issue
|
|
6403
|
-
`))}}else{let E=await
|
|
6404
|
-
\u{1F4B0} Account Balance:`,e+" SOL")),console.log(J_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Oe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount")
|
|
6404
|
+
`))}}else{let E=await Wr();await Gi(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),TE=t(async()=>{let _=sE("solana address").toString().trim(),e=sE("solana balance").toString().replace("SOL","").trim();console.log(J_.white(`\u{1F4D7} Selected Wallet: ${_}
|
|
6405
|
+
\u{1F4B0} Account Balance:`,e+" SOL")),console.log(J_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Oe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),xr=t(async()=>{let _=await k();return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Qr=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?qr(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Oe.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 E}}])},"delegateStakeAsk"),qr=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return sE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),$r=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Oe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),Wr=t(async()=>{let _=(await k()).STAKE_ACCOUNTS;return await Oe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:_},{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 Xr}from"child_process";var Wi=t(()=>{try{return Xr("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as jr}from"child_process";var Xi=t(()=>{try{return jr("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import d_ from"chalk";import{Spinner as zr}from"cli-spinner";var x_;(function(_){_.successHex=d_.hex("#39A845"),_.warningHex=d_.hex("#FFD02E"),_.errorHex=d_.hex("#B5332E"),_.syncHex=d_.hex("#3073B7"),_.greyHex=d_.hex("#BEBDBD"),_.indigoHex=d_.hex("#3950A0"),_.pinkHex=d_.hex("#D8A1C4"),_.normal=e=>{console.log(d_.white(e))},_.syncSpinner=e=>{let E=new zr(d_.white(e)+` %s
|
|
6405
6406
|
`);try{return E.setSpinnerString(18),E.start(),E}catch(o){throw E.stop(!0),new Error(`syncSpinner Error: ${o}`)}},_.solvAA=()=>{let e=_.syncHex(" _ "),E=_.syncHex(" | | "),o=_.syncHex(" ___ ___ | |")+_.errorHex("_ __ "),i=_.syncHex("/ __|/ _ \\| |")+_.errorHex("\\ \\ / /"),n=_.syncHex("\\__ \\ (_) | |")+_.errorHex(" \\ V / "),T=_.syncHex("|___/\\___/|_|")+_.errorHex(" \\_/ ");console.log(`
|
|
6406
6407
|
${e}`),console.log(`${E}`),console.log(`${o}`),console.log(`${i}`),console.log(`${n}`),console.log(`${T}
|
|
6407
6408
|
`),console.log(`Solv Version: v${De}
|
|
@@ -6425,8 +6426,8 @@ $ solv mt -p <fileSystem>
|
|
|
6425
6426
|
$ solv umt -p <fileSystem>
|
|
6426
6427
|
`,i=`mount reload
|
|
6427
6428
|
$ solv mtr
|
|
6428
|
-
`;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(x_||(x_={}));import
|
|
6429
|
-
`)),console.log(
|
|
6429
|
+
`;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(x_||(x_={}));import __ from"chalk";import{spawnSync as Zr}from"node:child_process";var SE=t(_=>{Zr("solana config get",{shell:!0,stdio:"inherit"});let E=O_();console.log(__.white("start-validator.sh: ")+E.scriptPath),console.log(__.white("solv.service: ")+m.SOL_SERVICE),console.log(__.white("logrotate: ")+m.SOL_LOGROTATE),console.log(__.white("logrotate (fd): ")+m.FRANKENDANCER_LOGROTATE),console.log(__.white("sysctl.d: ")+m.SOL_SYSTEM_CONFIG21),console.log(__.white("limits.d: ")+m.SOL_NOFILES_CONF),console.log(__.white("system.conf: ")+m.SOL_SYSTEM_CONF),console.log(__.white("ledger: ")+E.ledger),console.log(__.white("accounts: ")+E.accounts),console.log(__.white("snapshots: ")+E.snapshots),console.log(__.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as ji}from"node:child_process";import _R from"chalk";var zi=t(_=>{let e=_.NETWORK===c.TESTNET,E=e?t_:w;_.NODE_TYPE===D.RPC&&(E=M_);let o=d.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");o.command("epoch").description("Show Validator's Epoch").action(()=>{let i=Wi();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=ji(i,{shell:!0,stdio:"pipe"});console.log(_R.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=Xi();console.log({slot:i})}),o.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","100").option("-s, --snapshotPath <snapshotPath>","Snapshot Path",_.SNAPSHOTS_PATH).option("-v, --version <version>","Specific Version Node",E).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(i=>{let n=i.minDownloadSpeed,T=i.snapshotPath,s=i.version,S=i.rpcUrl,r=i.avorio;$e(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${o_()} --ledger /mnt/ledger/ contact-info`;ji(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{SE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{x_.solvAA(),i.client?x_.installClientMessage():x_.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as eR}from"node:child_process";var Zi=t(()=>{eR("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as ER}from"node:child_process";var _n=t(()=>{ER("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as tR}from"node:child_process";var en=t(()=>{tR("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as oR}from"node:child_process";var En=t(()=>{oR("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as iR}from"node:child_process";var tn=t((_=!1)=>{iR(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import YE from"chalk";import{spawnSync as TR}from"child_process";import{spawnSync as nR}from"node:child_process";var on=t(()=>{nR("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var nn=t(()=>{let _=d.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{Zi()}),_.command("start").description("Start Relayer").action(()=>{_n()}),_.command("stop").description("Stop Relayer").action(()=>{en()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{tn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{En()}),_.command("enable").description("Enable Relayer").action(()=>{on()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(YE.red("Please provide a URL"));return}let E=`${o_()} --ledger ${P} set-relayer-config --relayer-url ${e.url}`;console.log(YE.white("Setting Relayer URL ...")),TR(E,{shell:!0,stdio:"inherit"}),console.log(YE.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as rR}from"child_process";import{spawnSync as sR}from"child_process";var rE=t(()=>{sR("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as SR}from"child_process";var Tn=t(()=>{SR("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var sn=t(_=>{rE();let e=`sudo rm -rf ${m.SOL_LOGROTATE}`;rR(e,{shell:!0,stdio:"inherit"}),w_(_),Tn()},"updateLogrotate");var Sn=t(_=>{d.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";sn(e),process.exit(0)})},"logrotateCommand");import rn from"chalk";import{spawnSync as RR}from"child_process";var Rn=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;RR(e,{shell:!0,stdio:"inherit"})}catch{console.log(rn.yellow(`You might need to install the Solana SPL CLI:
|
|
6430
|
+
`)),console.log(rn.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as aR}from"os";import{spawnSync as CR}from"child_process";var I_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=CR(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import cR from"chalk";import{spawnSync as dR}from"node:child_process";var Cn=t(_=>{d.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 o=`${aR()}/mainnet-authority-keypair.json`;await Rn(o),process.exit(0)}await NR(_),process.exit(0)})},"balanceCommands"),NR=t(async _=>{let e=OR(_),E=`Validator Key: ${e.validatorKey}
|
|
6430
6431
|
Address: ${e.validatorKeyAddress}
|
|
6431
6432
|
Balance: ${e.validatorKeyBalance}
|
|
6432
6433
|
Vote Key: ${e.voteKey}
|
|
@@ -6438,18 +6439,18 @@ Balance: ${e.authorityKeyBalance}
|
|
|
6438
6439
|
Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
|
|
6439
6440
|
Address: ${e.validatorKeyAddress}
|
|
6440
6441
|
Balance: ${e.validatorKeyBalance}
|
|
6441
|
-
Active Identity:`),console.log(
|
|
6442
|
+
Active Identity:`),console.log(cR.white(E)),dR(`solana-keygen pubkey ${A}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),OR=t(_=>{let e=L(),E=_.NETWORK===c.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:I_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:M(e.testnetValidatorKey),validatorKeyBalance:I_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:M(e.testnetValidatorVoteKey),voteKeyBalance:I_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:M(e.testnetValidatorAuthorityKey),authorityKeyBalance:I_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:I_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:M(e.mainnetValidatorVoteKey),voteKeyBalance:I_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:M(e.mainnetValidatorAuthorityKey),authorityKeyBalance:I_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");import{spawnSync as JE}from"node:child_process";var an=t(_=>{JE("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&JE(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),JE("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as FR}from"node:child_process";var cn=t(_=>{let E=`${o_()} --ledger ${_.LEDGER_PATH} monitor`;FR(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as lR}from"node:child_process";var dn=t(()=>{lR("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import RE from"inquirer";import{execSync as CE,spawnSync as xE}from"child_process";import Fe from"chalk";import{homedir as IR}from"os";var Nn=1e3,QE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(QE||(QE={}));var aE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(aE||(aE={}));var DR=Object.values(QE),On=t(_=>{d.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(Fe.blue(`\u2728 Coming Soon
|
|
6442
6443
|
This Feature is Currently Under Development
|
|
6443
|
-
Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await
|
|
6444
|
+
Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await PR(),n="0";try{let a=xE(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(a.status!==0)throw new Error("Invalid Wallet Address");n=a.stdout.toString(),console.log("toBalance:",n)}catch{console.log(Fe.red(`\u274C To Wallet is Invalid
|
|
6444
6445
|
Please Check the Wallet Address`)),process.exit(0)}let T=CE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(Fe.white(`\u{1F3E6} From Wallet: ${o}
|
|
6445
6446
|
\u{1F4B0} Balance: ${T}`)),console.log(Fe.white(`\u{1F3E6} To Wallet: ${i}
|
|
6446
|
-
\u{1F4B0} Balance: ${n}`));let{amount:s}=await RE.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),S=`solana transfer ${i} ${s} --allow-unfunded-recipient --keypair ${E} --url ${_.RPC_URL}`,r=
|
|
6447
|
-
Retrying Transaction in ${
|
|
6448
|
-
Retries Left: ${
|
|
6449
|
-
`)),console.log(
|
|
6447
|
+
\u{1F4B0} Balance: ${n}`));let{amount:s}=await RE.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),S=`solana transfer ${i} ${s} --allow-unfunded-recipient --keypair ${E} --url ${_.RPC_URL}`,r=xE(S,{shell:!0,stdio:"inherit"}),C=Ae;for(;r.status!==0&&C>0;)console.log(Fe.red(`\u274C Transaction Failed
|
|
6448
|
+
Retrying Transaction in ${Nn}ms
|
|
6449
|
+
Retries Left: ${C}`)),await Y(Nn),r=xE(S,{shell:!0,stdio:"inherit"}),C--;process.exit(0)})},"transferCommands"),qE=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),PR=t(async()=>{let _=IR(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=CE(`solana address -k ${o}`).toString().trim(),n=await RE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:DR}]),T=n.from==="Validator Account"?Object.values(aE).filter(a=>a!=="Validator Account"):Object.values(aE).filter(a=>a!=="Authority Account");if((await RE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:a}=await RE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:qE}]);i=a}else{let a=n.from==="Validator Account"?e:E;o=`${_}/${a}`,i=CE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,C=CE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:C,toAddress:i}},"selectFromKeypairs");import Fn from"chalk";import fR from"inquirer";import{execSync as $E,spawnSync as UR}from"node:child_process";var ln=t(async(_,e=!1)=>{let E=_.NETWORK===c.TESTNET,o=E?ge:_.RPC_URL,i=E?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",n=E?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",T=E?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",s=$E(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(Fn.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(Fn.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let N=await fR.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(N.sol)}let C=$E(`solana address --keypair ${T}`).toString().trim(),a=$E(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${C} ${a} ${S} --authorized-withdrawer ${n} --url ${o}`;UR(R,{shell:!0,stdio:"inherit"})},"withdraw");var In=t(_=>{d.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await ln(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as kR,spawnSync as VR}from"node:child_process";import{BN as Pn}from"bn.js";import{LAMPORTS_PER_SOL as WE}from"@solana/web3.js";import{Connection as uR,LAMPORTS_PER_SOL as pR}from"@solana/web3.js";import{Keypair as AR}from"@solana/web3.js";import{readFile as LR}from"fs/promises";var MR=t(async _=>{let e=JSON.parse(await LR(_,"utf8"));return AR.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),Dn=MR;import{homedir as mR}from"os";var s_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(s_||(s_={}));var hR={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},BR=t(async(_,e="auth",E=!1)=>{let o=new uR(_),i=mR(),n=L(i),s=`${E?"testnet":"mainnet"}${hR[e]}`,S=n[s],r=await Dn(S),C=await o.getBalance(r.publicKey),R=Number(C)/pR;if(isNaN(R))throw new Error("Failed to get balance");return R},"getBalance"),D_=BR;var gR=new Pn(3*WE),fn=t(async _=>{let e=await D_(_,s_.VALIDATOR),o=new Pn(Number(Number(e)*WE)).sub(gR),i=Number(o)/WE;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import le from"chalk";import{Keypair as KR,Connection as yR,PublicKey as GR,SystemProgram as Un,ComputeBudgetProgram as cE,VersionedTransaction as An,TransactionMessage as Ln}from"@solana/web3.js";var Mn=t(async(_,e,E,o)=>{let i=0;try{let n=new yR(_,"finalized"),T=KR.fromSecretKey(new Uint8Array(Array.from(e))),s=new GR(E),S=o;for(;;)try{let r=[Un.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:2e5}),cE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],C=await n.getLatestBlockhashAndContext({commitment:"finalized"}),a=new An(new Ln({instructions:r,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(a,{replaceRecentBlockhash:!0,sigVerify:!1});a.sign([T]);let N=[Un.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),cE.setComputeUnitLimit({units:R.value.unitsConsumed?Math.trunc(R.value.unitsConsumed*1.2):2e5}),cE.setComputeUnitPrice({microLamports:1e3})],I=new An(new Ln({instructions:N,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message());I.sign([T]);let O=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...C.value,signature:O},"finalized"),console.log("finalized signature:",O),O}catch(r){if(i++,i>Ae)throw new Error(JSON.stringify(r));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${r}`),await Y(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as bR}from"fs/promises";import{LAMPORTS_PER_SOL as wR}from"@solana/web3.js";var XE=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=L();await D_(_,s_.VOTE)<1?(console.log(le.white("Vote Account Balance is less than 1 SOL")),console.log(le.white("Skip withdrawing SOL from Vote Account to Authority Account"))):VR("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await fn(_);console.log(le.white(`Transferable Balance: ${i} SOL`));let n=i*wR;if(i<1)console.log(le.white("Validator Account Balance is less than 1 SOL")),console.log(le.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=kR(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await bR(E,"utf-8"));await Mn(_,s,T,n)}return!0},"collectSOL");import{readFile as jR}from"fs/promises";import zR from"inquirer";import jE from"chalk";import{execSync as vR}from"child_process";import{homedir as HR}from"os";var YR=t(async _=>{try{let e=HR(),{mainnetValidatorAuthorityKey:E}=L(e),o=`spl-token balance ${n_} --owner ${E} --url ${_}`,i=vR(o).toString().trim();return Number(i)}catch(e){return console.log(jE.red(`Error: ${e}`)),console.log(jE.yellow(`You might need to install the Solana SPL CLI:
|
|
6450
|
+
`)),console.log(jE.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),un=YR;import OE from"chalk";import{Connection as JR,PublicKey as pn,Keypair as xR,ComputeBudgetProgram as dE,VersionedTransaction as mn,TransactionMessage as hn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Bn,createTransferInstruction as gn,TOKEN_PROGRAM_ID as Kn}from"@solana/spl-token";var yn=t(async(_,e,E,o,i,n)=>{try{let T=new JR(_,"finalized"),s=xR.fromSecretKey(new Uint8Array(e)),S=new pn(E),r=new pn(i),C=Math.trunc(o*Math.pow(10,n)),a=await Bn(T,s,r,s.publicKey),R=await Bn(T,s,r,S,!0);for(;;)try{let N=[gn(a.address,R.address,s.publicKey,C,[],Kn),dE.setComputeUnitLimit({units:2e5}),dE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),O=new mn(new hn({instructions:N,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),l=await T.simulateTransaction(O,{replaceRecentBlockhash:!0,sigVerify:!1});O.sign([s]);let G=[gn(a.address,R.address,s.publicKey,C,[],Kn),dE.setComputeUnitLimit({units:l.value.unitsConsumed?Math.trunc(l.value.unitsConsumed*1.2):2e5}),dE.setComputeUnitPrice({microLamports:1e3})],U=new mn(new hn({instructions:G,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());U.sign([s]);let Q=await T.sendRawTransaction(U.serialize());return await T.confirmTransaction({...I.value,signature:Q},"finalized"),console.log("finalized signature:",Q),Q}catch(N){console.error("Transfer failed, retrying...",N)}}catch(T){throw console.error(T),T}},"transferSPLToken");import NE from"inquirer";import{spawnSync as Gn}from"child_process";import zE from"chalk";import{promises as kn}from"fs";var QR=t(async(_="epochTimer")=>{try{let e=Gn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(zE.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
|
|
6450
6451
|
`).filter(n=>!n.includes(_)).join(`
|
|
6451
|
-
`),i="/tmp/temp_crontab";await
|
|
6452
|
-
${
|
|
6452
|
+
`),i="/tmp/temp_crontab";await kn.writeFile(i,o,"utf-8"),Gn("crontab",[i]),await kn.unlink(i),console.log(zE.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(zE.red("Error removing cron job:",e))}},"removeCronJob"),Vn=QR;import bn from"chalk";var qR=t(async _=>{let e=_.NETWORK===c.TESTNET,E=await NE.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!E.mevOn)return await _E()&&await Vn(),await u({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
|
|
6453
|
+
${bn.green("No more Login to the server to update \u{1F331}")}
|
|
6453
6454
|
|
|
6454
6455
|
If you enable this, solv will update automatically when the solv/solana version is updated.
|
|
6455
6456
|
|
|
@@ -6457,99 +6458,97 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
|
|
|
6457
6458
|
|
|
6458
6459
|
AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
|
|
6459
6460
|
\u203B Please turn off if you are using no-downtime migration.
|
|
6460
|
-
`;console.log(
|
|
6461
|
-
Validator Address: ${
|
|
6461
|
+
`;console.log(bn.white(o));let i=await NE.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}]),n=_.RPC_URL,T="",s=await NE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await NE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await u({HARVEST_ACCOUNT:T,IS_MEV_MODE:E.mevOn,RPC_URL:n,DISCORD_WEBHOOK_URL:s.discordWebhookUrl,AUTO_UPDATE:i.autoUpdate,AUTO_RESTART:i.autoRestart}),!0},"mevOn"),wn=qR;import{spawnSync as ZR}from"node:child_process";import{Connection as XR}from"@solana/web3.js";import{Connection as $R}from"@solana/web3.js";var WR=t(async(_,e=10,E=.4)=>{try{let i=await new $R(_).getRecentPerformanceSamples(e);if(i.length===0)return console.warn("No performance samples available. Using fallback slot time."),E;let n=i.filter(s=>s.numSlots!==0);return n.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),E):n.reduce((s,S)=>s+S.samplePeriodSecs/S.numSlots,0)/n.length}catch(o){return console.error(`getAverageSlotTime failed: ${o}. Using fallback slot time.`),E}},"getAverageSlotTime"),vn=WR;var ZE=t(async _=>{try{let E=await new XR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await vn(_);console.log("timePerSlotSeconds",o);let n=(E.slotsInEpoch-E.slotIndex)*o,T=(E.slotIndex/E.slotsInEpoch*100).toFixed(2),s=Math.floor(n/(3600*24)),S=Math.floor(n%(3600*24)/3600),r=Math.floor(n%3600/60),C=Math.floor(n%60),a=`${s}d ${S}h ${r}m ${C}s`;return s===0&&(a=`${S}h ${r}m ${C}s`),{...E,estimatedTimeUntilNextEpoch:a,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var _C=.03,Hn=t(_=>{d.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await eC(_),{mainnetValidatorAuthorityKey:E}=L();console.log("Harvesting SOL..."),await XE(_.RPC_URL);let o=await D_(_.RPC_URL,s_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await Y(1e3),await XE(_.RPC_URL),o=await D_(_.RPC_URL,s_.VOTE),i++;let n=JSON.parse(await jR(E,"utf-8")),T=await D_(_.RPC_URL,s_.AUTH);if(T<1)console.log(OE.white("Authority Account Balance is less than 1 SOL")),console.log(OE.white("Skip converting SOL to elSOL"));else{let S=T-_C;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await nE(_.RPC_URL,Z,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await un(_.RPC_URL);if(s<1){let S=await ZE(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await T_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await yn(_.RPC_URL,n,e,s,n_,Bt),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await ZE(_.RPC_URL)).epoch} \u{1F4B0}
|
|
6462
|
+
Validator Address: ${M(E)}
|
|
6462
6463
|
Total Reward: ${s} elSOL
|
|
6463
|
-
Harvest Address: ${e}`;await
|
|
6464
|
+
Harvest Address: ${e}`;await T_(r)}console.log(OE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),d.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await wn(_)&&(ZR("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(OE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),eC=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await zR.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:qE}]);return await u({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as OC}from"@skeet-framework/utils";import{writeFile as EC}from"fs/promises";var tC=t(async _=>{await EC(Be,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),P_=tC;var oC=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await P_({...e,isLessThan1Day:!0})},"isLessThan1Day"),Yn=oC;var iC=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await P_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),Jn=iC;var nC=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await P_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),xn=nC;var TC=t(async(_,e)=>{let E=e.NETWORK===c.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=L(),T=E?M(n):M(i);await P_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
|
|
6464
6465
|
Validator: ${T}
|
|
6465
6466
|
Network: ${e.NETWORK}
|
|
6466
6467
|
CurrentEpoch: ${_.epoch}
|
|
6467
6468
|
Epoch has been updated!
|
|
6468
|
-
Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch")
|
|
6469
|
-
|
|
6470
|
-
Address: ${T}`;return await z(s),!1}return console.log(OC.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Xn=FC;async function lC(_="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${_}`,E=await fetch(e);if(!E.ok)throw new Error(`HTTP error! status: ${E.status}`);return(await E.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${_}:`,e),null}}t(lC,"getNpmLatestVersion");var jn=lC;async function IC(){let _=k_(),e=await jn();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(IC,"isVersionSame");var zn=IC;import{spawnSync as fC}from"child_process";import{spawnSync as DC}from"node:child_process";var Zn=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=DC(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
|
|
6471
|
-
`),n=i.find(R=>R.includes("Epoch Completed Time:")),T=i.find(R=>R.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(R=>R.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let a=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,C=r.match(a);if(C){let R=C[1]?parseInt(C[1]):0,N=C[2]?parseInt(C[2]):0,I=C[3]?parseInt(C[3]):0,O=C[4]?parseInt(C[4]):0,l=R*24*60+N*60+I+Math.floor(O/60);return{epoch:s,day:R,hour:N,min:I,sec:O,totalMinutes:l,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var UC=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?ge:_.RPC_URL,o=PC(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await Wn(),n=Zn(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=U(),r=await ie(E,A(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),await Xn(_),!await zn()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),fC("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await $n(n,_),"Epoch has been updated!";let C=n.totalMinutes,R=[qn,Qn,xn];for(let N of R)if(await N(C,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),_T=UC;var eT=t(_=>{d.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await _T(_),process.exit(0)})},"epochTimerCommands");import dT from"inquirer";import{join as iT}from"path";import{spawnSync as $_}from"node:child_process";import X from"chalk";import{spawnSync as AC}from"node:child_process";var LC=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=AC(`ssh -i ${i} -o StrictHostKeyChecking=no solv@${_} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:o});return T.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
|
|
6469
|
+
Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),Qn=TC;import{existsAsync as sC}from"@skeet-framework/utils";import{readFile as SC,writeFile as rC}from"fs/promises";import RC from"chalk";import{homedir as CC}from"os";var aC=t(async()=>{let e=CC().includes("/home/solv")?Be:"./currentEpoch.json";if(await sC(e))return JSON.parse(await SC(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await rC(e,JSON.stringify(E,null,2),"utf-8"),console.log(RC.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),qn=aC;async function cC(_="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${_}`,E=await fetch(e);if(!E.ok)throw new Error(`HTTP error! status: ${E.status}`);return(await E.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${_}:`,e),null}}t(cC,"getNpmLatestVersion");var $n=cC;async function dC(){let _=k_(),e=await $n();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(dC,"isVersionSame");var Wn=dC;import{spawnSync as FC}from"child_process";import{spawnSync as NC}from"node:child_process";var Xn=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=NC(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
|
|
6470
|
+
`),n=i.find(R=>R.includes("Epoch Completed Time:")),T=i.find(R=>R.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(R=>R.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let C=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,a=r.match(C);if(a){let R=a[1]?parseInt(a[1]):0,N=a[2]?parseInt(a[2]):0,I=a[3]?parseInt(a[3]):0,O=a[4]?parseInt(a[4]):0,l=R*24*60+N*60+I+Math.floor(O/60);return{epoch:s,day:R,hour:N,min:I,sec:O,totalMinutes:l,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var lC=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?ge:_.RPC_URL,o=OC(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await qn(),n=Xn(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=L(),r=await ie(E,M(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await Wn()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),FC("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await Qn(n,_),"Epoch has been updated!";let a=n.totalMinutes,R=[xn,Jn,Yn];for(let N of R)if(await N(a,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),jn=lC;var zn=t(_=>{d.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await jn(_),process.exit(0)})},"epochTimerCommands");import CT from"inquirer";import{join as ET}from"path";import{spawnSync as $_}from"node:child_process";import X from"chalk";import{spawnSync as IC}from"node:child_process";var DC=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=IC(`ssh -i ${i} -o StrictHostKeyChecking=no solv@${_} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:o});return T.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
|
|
6472
6471
|
$ ssh solv@${_}
|
|
6473
6472
|
|
|
6474
|
-
Failed Cmd: ${e}`),n={status:T.status,stdout:String(T.stdout),stderr:T.stderr.toString()},n):(n={status:T.status,stdout:T.stdout.toString(),stderr:T.stderr.toString()},n)}catch(T){return console.log(`scpSSH Error: ${T}`),n={status:null,stdout:"",stderr:String(T)},n}},"scpSSH"),FE=
|
|
6473
|
+
Failed Cmd: ${e}`),n={status:T.status,stdout:String(T.stdout),stderr:T.stderr.toString()},n):(n={status:T.status,stdout:T.stdout.toString(),stderr:T.stderr.toString()},n)}catch(T){return console.log(`scpSSH Error: ${T}`),n={status:null,stdout:"",stderr:String(T)},n}},"scpSSH"),FE=DC;import Zn from"chalk";var PC=t((_,e,E)=>{console.log(Zn.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=M(_).trim(),i=FE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(Zn.yellow(`\u26A0\uFE0F Destination Identity Key is different.
|
|
6475
6474
|
Please check your Validator
|
|
6476
6475
|
$ ssh ${E}@${e}
|
|
6477
6476
|
|
|
6478
6477
|
Local Identity Key: ${o}
|
|
6479
|
-
Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Q_=
|
|
6478
|
+
Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Q_=PC;var fC="agave-validator -l /mnt/ledger",UC="sudo fdctl",AC="--config /home/solv/firedancer/config.toml ",LC=t(_=>_==="agave"?[fC,""]:[UC,AC],"getSolanaCLIActive"),q_=LC;var _T="agave-validator -l /mnt/ledger",MC=t(()=>{try{return _T}catch(_){return console.error(_),_T}},"getSolanaCLIAgave"),lE=MC;import _t from"chalk";var IE=t(async(_,e)=>{try{console.log(_t.white("\u{1F50D} Detecting client type from remote configuration..."));let E=FE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case F.AGAVE:n="agave";break;case F.FRANKENDANCER:n="frankendancer";break;case F.JITO:n="agave";break;default:n="agave"}return console.log(_t.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(_t.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as uC}from"fs/promises";import et from"chalk";import{existsSync as pC}from"fs";var DE=t(async()=>{try{console.log(et.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!pC(_))return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Local configuration file not found"};let e=await uC(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case F.AGAVE:i="agave";break;case F.FRANKENDANCER:i="frankendancer";break;case F.JITO:i="agave";break;default:i="agave"}return console.log(et.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(et.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var PE=ET(g,A_),eT=ET(g,U_),tT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(X.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,N]=q_(C),[I,O]=q_(a),l=lE();if(!Q_(s,_,o))return;if(i){console.log(X.white("\u{1F7E2} Waiting for restart window..."));let Z_=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if($_(Z_,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
6480
6479
|
$ ssh ${o}@${_}
|
|
6481
6480
|
|
|
6482
|
-
Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(X.white("\u{1F7E2} Setting identity on the remote validator..."));let
|
|
6481
|
+
Failed Cmd: ${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(X.white("\u{1F7E2} Setting identity on the remote validator..."));let U=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${O}${PE}'`;if($_(U,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
6483
6482
|
$ ssh ${o}@${_}
|
|
6484
6483
|
|
|
6485
|
-
Failed Cmd: ${I} set-identity ${O}${PE}`));return}if(console.log(X.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),$_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${PE} ${
|
|
6484
|
+
Failed Cmd: ${I} set-identity ${O}${PE}`));return}if(console.log(X.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),$_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${PE} ${eT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
6486
6485
|
$ ssh ${o}@${_}
|
|
6487
6486
|
|
|
6488
|
-
Failed Cmd: ln -sf ${PE} ${
|
|
6487
|
+
Failed Cmd: ln -sf ${PE} ${eT}`));return}if(console.log(X.white("\u{1F7E2} Uploading the tower file to the new validator...")),$_(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
|
|
6489
6488
|
$ ssh ${o}@${_}
|
|
6490
6489
|
|
|
6491
6490
|
Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(X.white("\u{1F7E2} Setting identity on the local validator...")),$_(`${R} set-identity ${N}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
6492
6491
|
|
|
6493
6492
|
Failed Cmd: ${R} set-identity ${N}${s}
|
|
6494
|
-
ln -sf ${s} ${
|
|
6493
|
+
ln -sf ${s} ${A}`));return}if($_(`ln -sf ${s} ${A}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(X.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
6495
6494
|
|
|
6496
|
-
Failed Cmd: ln -sf ${s} ${
|
|
6495
|
+
Failed Cmd: ln -sf ${s} ${A}`));return}console.log(X.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as nT}from"path";import J from"chalk";import{spawnSync as W_}from"node:child_process";var oT=nT(g,A_),mC=nT(g,U_),iT="~/.ssh/id_rsa",TT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;T&&(s=K);let S=await DE(),r=await IE(_,o),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(J.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,N]=q_(C),[I,O]=q_(a),l=lE();if(!Q_(s,_,o))return;let U=`${l} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,Q=`${R} set-identity ${N}${oT}`,S_=`ln -sf ${oT} ${mC}`,f_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,r_=`${I} set-identity ${O}--require-tower ${s}`,z_=`ln -sf ${s} ${A}`;if(i&&(console.log(J.white("\u{1F7E2} Waiting for restart window...")),W_(U,{shell:!0,stdio:"inherit"}).status!==0)){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
6497
6496
|
|
|
6498
|
-
Failed Cmd: ${
|
|
6497
|
+
Failed Cmd: ${U}`));return}if(console.log(J.white("\u{1F7E2} Setting identity on the new validator...")),W_(Q,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
|
|
6499
6498
|
|
|
6500
|
-
Failed Cmd: ${Q}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),W_(
|
|
6499
|
+
Failed Cmd: ${Q}`));return}if(console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),W_(S_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
|
|
6501
6500
|
|
|
6502
|
-
Failed Cmd: ${
|
|
6501
|
+
Failed Cmd: ${S_}`));return}if(console.log(J.white("\u{1F7E2} Uploading the tower file to the new validator...")),W_(f_,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
|
|
6503
6502
|
|
|
6504
|
-
Failed Cmd: ${f_}`));return}console.log(J.white("\u{1F7E2} Setting identity on the new validator..."));let
|
|
6503
|
+
Failed Cmd: ${f_}`));return}console.log(J.white("\u{1F7E2} Setting identity on the new validator..."));let uT=`ssh -i ${iT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r_}'`;W_(uT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(J.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
|
|
6505
6504
|
$ ssh ${o}@${_}
|
|
6506
6505
|
|
|
6507
|
-
Failed Cmd: ${
|
|
6506
|
+
Failed Cmd: ${r_}`)),console.log(J.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let pT=`ssh -i ${iT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${z_}'`;if(W_(pT,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
|
|
6508
6507
|
|
|
6509
|
-
Failed Cmd: ${z_}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as
|
|
6508
|
+
Failed Cmd: ${z_}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as hC}from"node:child_process";function sT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return hC(E,{shell:!0,stdio:"inherit"}).status===0}t(sT,"checkSSHConnection");import Ie from"chalk";import{join as rT}from"path";import{spawnSync as X_}from"node:child_process";import z from"chalk";var fE=rT(g,A_),ST=rT(g,U_),RT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?K:b;if(T&&(s=K),!Q_(s,_,o))return;let r=Tt,C=st;if(i){console.log(z.white("\u{1F7E2} Waiting for restart window..."));let G=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(X_(G,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
6510
6509
|
$ ssh ${o}@${_}
|
|
6511
6510
|
|
|
6512
|
-
Failed Cmd: ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(
|
|
6511
|
+
Failed Cmd: ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(z.white("\u{1F7E2} Setting identity on the new validator..."));let a=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} set-identity ${fE}'`;if(X_(a,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
6513
6512
|
$ ssh ${o}@${_}
|
|
6514
6513
|
|
|
6515
|
-
Failed Cmd: ${r} -l ${P} set-identity ${fE}`));return}if(console.log(
|
|
6514
|
+
Failed Cmd: ${r} -l ${P} set-identity ${fE}`));return}if(console.log(z.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),X_(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${fE} ${ST}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
6516
6515
|
$ ssh ${o}@${_}
|
|
6517
6516
|
|
|
6518
|
-
Failed Cmd: ln -sf ${fE} ${
|
|
6517
|
+
Failed Cmd: ln -sf ${fE} ${ST}`));return}if(console.log(z.white("\u{1F7E2} Uploading the tower file to the new validator...")),X_(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
|
|
6519
6518
|
$ ssh ${o}@${_}
|
|
6520
6519
|
|
|
6521
|
-
Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(
|
|
6520
|
+
Failed Cmd: scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(z.white("\u{1F7E2} Setting identity on the new validator...")),X_(`${C} -l ${P} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
6522
6521
|
|
|
6523
|
-
Failed Cmd: ${
|
|
6524
|
-
ln -sf ${s} ${
|
|
6522
|
+
Failed Cmd: ${C} -l ${P} set-identity ${s}
|
|
6523
|
+
ln -sf ${s} ${A}`));return}if(X_(`ln -sf ${s} ${A}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
6525
6524
|
|
|
6526
|
-
Failed Cmd: ln -sf ${s} ${
|
|
6527
|
-
You can choose only Incoming or Outgoing`));return}if(!
|
|
6525
|
+
Failed Cmd: ln -sf ${s} ${A}`));return}console.log(z.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var BC=["Incoming","Outgoing"],aT=t(async(_,e)=>{_.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).option("--user <user>","SSH User","solv").option("--unsafe","Switch without waiting for a restart window",!1).description("Switch Validator Identity with No Downtime").action(async E=>{try{let o=e.NETWORK===c.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?K:b;i&&(T=K);let s=E.user,S=M(T),r=E.switchType,C=E.ip;if(r===""||C===""||s===""){let R=await CT.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}},{name:"user",type:"list",message:"Which user would you want to SSH as?",choices:["solv"]}]);r=R.switchType,C=R.ip,s=R.user}if(!BC.includes(r)){console.log(Ie.yellow(`\u26A0\uFE0F Invalid Switch Type
|
|
6526
|
+
You can choose only Incoming or Outgoing`));return}if(!sT(C,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await CT.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(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Ie.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await RT(C,S,e,s,n);return}await tT(C,S,e,s,n)}else await TT(C,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Ie.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ie.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as gC}from"node:child_process";var KC=t((_="306450862",e=P,E=E_)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${E} --hard-fork ${_} -- ${_} ${e}`;console.log("Parameters to createSnapshot:",_,e,E),console.log("Command:",o);let i=gC(o,{shell:!0,stdio:"pipe",cwd:e});if(i.status!==0)throw new Error(`createSnapshot: ${i.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),cT=KC;import j_ from"inquirer";import YC from"dotenv";import B_ from"chalk";var UE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:LE,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}},Et={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Le,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Me,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:LE,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 kC}from"fs/promises";import{Connection as VC,Keypair as bC,VersionedTransaction as wC}from"@solana/web3.js";import x from"chalk";import vC from"inquirer";import HC from"dotenv";var yC=t(async(_,e,E,o,i)=>{try{let n=`${_}/quote?inputMint=${E}&outputMint=${o}&amount=${i}`,T=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return T.status===429?"Too many requests, please try again later":T.status===401?"Unauthorized, please check your API key":await T.json()}catch(n){throw new Error(`Error getJupiterQuote: ${n}`)}},"getJupiterQuote"),dT=yC;var GC=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=dt[i];T?n={swapRequest:{quoteResponse:E,userPublicKey:o,feeAccount:T,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:n={swapRequest:{quoteResponse:E,userPublicKey:o,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let s=`${_}/swap`,S=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(n.swapRequest)});return S.status===429?"Too many requests, please try again later":await S.json()}catch(i){throw new Error(`Error postJupiterSwap: ${i}`)}},"postJupiterSwap"),NT=GC;HC.config();var OT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new VC(_,"confirmed"),r=await dT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
|
|
6528
6527
|
`)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
|
|
6529
|
-
`)),process.exit(0));let
|
|
6528
|
+
`)),process.exit(0));let r_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
|
|
6530
6529
|
|
|
6531
6530
|
You can upgrade your API key to increase your rate limits.
|
|
6532
6531
|
Get Your API key \u{1F447}
|
|
6533
6532
|
Validators Solutions: ${_e}
|
|
6534
|
-
`;console.error(x.white(
|
|
6533
|
+
`;console.error(x.white(r_)),process.exit(0)}let C=Et[i],a=Et[n],R=`\u{1F504} Swap Quote \u{1F504}
|
|
6535
6534
|
|
|
6536
|
-
- \u{1F3E6} Input Token: ${
|
|
6537
|
-
- \u{1F4B0} Input Amount: ${T/Math.pow(10,
|
|
6535
|
+
- \u{1F3E6} Input Token: ${C.symbol} (${i})
|
|
6536
|
+
- \u{1F4B0} Input Amount: ${T/Math.pow(10,C.decimal)} ${C.symbol}
|
|
6538
6537
|
|
|
6539
|
-
- \u{1F3E6} Output Token: ${
|
|
6540
|
-
- \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,
|
|
6538
|
+
- \u{1F3E6} Output Token: ${a.symbol} (${n})
|
|
6539
|
+
- \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,a.decimal)} ${a.symbol}
|
|
6541
6540
|
|
|
6542
6541
|
\u203B This quote is based on the current market rate and may change before the swap is completed.
|
|
6543
6542
|
`;console.log(x.white(R)),console.log(x.gray(`You can also swap using the following command:
|
|
6544
6543
|
$ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
|
|
6545
|
-
`));let N=!1;s?N=(await
|
|
6544
|
+
`));let N=!1;s?N=(await vC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(x.cyan("Skipping confirmation...")),N=!0),N||(console.log(x.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await kC(o,"utf8")),O=bC.fromSecretKey(new Uint8Array(Array.from(I))),l=await NT(e,E,r,O.publicKey.toString());if(typeof l=="string"){l.includes("Unauthorized")&&(console.error(x.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
|
|
6546
6545
|
`)),console.log(x.white("Get Your API key \u{1F447}")),console.log(x.white(_e+`
|
|
6547
|
-
`)),process.exit(0));let
|
|
6546
|
+
`)),process.exit(0));let r_=`${x.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
|
|
6548
6547
|
|
|
6549
6548
|
You can upgrade your API key to increase your rate limits.
|
|
6550
6549
|
Get Your API key \u{1F447}
|
|
6551
6550
|
Validators Solutions: ${_e}
|
|
6552
|
-
`;console.error(x.white(
|
|
6553
|
-
Transaction ID: ${
|
|
6554
|
-
`)),p_()},"askForConfig");import{spawnSync as
|
|
6551
|
+
`;console.error(x.white(r_)),process.exit(0)}let G=Buffer.from(l.swapTransaction,"base64"),U=wC.deserialize(G);U.sign([O]);let Q=U.serialize(),S_=await S.sendRawTransaction(Q,{skipPreflight:!0,maxRetries:2}),f_=U.message.recentBlockhash;return console.log(`Swapping...
|
|
6552
|
+
Transaction ID: ${S_}`),await S.confirmTransaction({blockhash:f_,lastValidBlockHeight:l.lastValidBlockHeight,signature:S_},"confirmed"),S_},"swap");YC.config();var FT=t(async(_,e)=>{_.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 E=>{try{await JC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(B_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(B_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),JC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(B_.white("Solana RPC URL:",_)),console.log(B_.white("KeyfilePath:",e)),(!e||e===""||s)&&await xC();let S=Ct,r=[...at,"Other"],C=o,a="",R=i,N=n;if(C===""){let l=await j_.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Le}]);l.name==="Other"?C=(await j_.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Me}])).address:(a=l.name,C=UE[a].tokenMint)}if(R===""){r=r.filter(U=>U!==a);let l=await j_.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(l.name==="Other")R=(await j_.prompt([{type:"input",name:"address",message:"Enter output mint address",default:n_}])).address;else{let U=l.name;R=UE[U].tokenMint}let G=l.name;R=UE[G].tokenMint}if(N===0){let l=await j_.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);N=Number(l.amount)}let O=await OT(_,S,!E||E===""?ct:E,e,C,R,N,T);O||process.exit(0),console.log(B_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(B_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${O}`))},"swapCmd");var xC=t(async()=>{let _=await j_.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 u(_),console.log(B_.green(`\u2714\uFE0E Config Updated Successfully!
|
|
6553
|
+
`)),p_()},"askForConfig");import{spawnSync as QC}from"node:child_process";var lT=t(()=>{QC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as qC}from"node:child_process";var IT=t(()=>{qC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as $C}from"node:child_process";var DT=t(()=>{$C("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as WC}from"node:child_process";var PT=t(()=>{WC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as XC}from"node:child_process";var fT=t((_=!1)=>{XC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as jC}from"node:child_process";var UT=t(()=>{jC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var AT=t(()=>{let _=d.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{lT()}),_.command("start").description("Start Jupiter").action(()=>{IT()}),_.command("stop").description("Stop Jupiter").action(()=>{DT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{fT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{PT()}),_.command("enable").description("Enable Jupiter").action(()=>{UT()})},"jupiterCommands");import ea from"chalk";import{spawnSync as zC}from"node:child_process";var ZC=t(()=>{let{stdout:_}=zC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),LT=ZC;var d=new _a;d.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(De,"-V","Display version");async function Ea(){try{let _=await k();Ri(_),di(_),ai(_),mi(_),To(_),So(),Ni(_),$i(_),zi(_),pi(),li(),si(_),Cn(_),Oi(),nn(),On(_),In(_),Hn(_),ri(),FT(d,_),zn(_),aT(d,_),AT(),Sn(_),d.command("rm:log").description("Remove Logs").action(()=>{rE()}),d.command("rm:snapshot").description("Remove Snapshot").action(()=>{an(_)}),d.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",_.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",_.SNAPSHOTS_PATH).action(e=>{console.log(ea.white("\u{1F4DD} Creating Snapshot...")),cT(e.slot,e.ledger,e.snapshots)}),d.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{cn(_)}),d.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{dn()}),d.command("config").description("Show Solv Config").action(()=>{SE(_)}),d.command("vv").description("Show Solv Version").action(()=>{let e=LT();console.log("version:",e)}),await d.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(Ea,"main");Ea();export{d as program};
|
|
6555
6554
|
//# sourceMappingURL=index.js.map
|