@gabrielhicks/solv 5.5.4 → 5.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- var xT=Object.defineProperty;var t=(_,e)=>xT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as cC}from"commander";var lt="5.5.4";var Ft={name:"@gabrielhicks/solv",version:lt,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 ge=Ft.version;var Se="https://validators.solutions";var ye="solv4.config.json";var u_="identity.json",p_="unstaked-identity.json",It="relayer-keypair.json",qT="mainnet-validator-keypair.json",$T="mainnet-vote-account-keypair.json",WT="mainnet-authority-keypair.json",XT="testnet-validator-keypair.json",jT="testnet-vote-account-keypair.json",zT="testnet-authority-keypair.json",G="/home/solv",U=`${G}/${u_}`,UC=`${G}/${p_}`,b=`${G}/${qT}`,b_=`${G}/${$T}`,AC=`${G}/${WT}`,g=`${G}/${XT}`,w_=`${G}/${jT}`,LC=`${G}/${zT}`,w=`${G}/solana-validator.log`,O_=G+"/start-validator.sh",f="/mnt/ledger",v_="/mnt/accounts",i_="/mnt/snapshots",Dt="solana-validator",Pt="agave-validator",ft="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ke=3;var Ut="https://api.mainnet-beta.solana.com",At="https://verify.validators.solutions/solv-migrate",Lt="https://jup.validators.solutions/v1/jup",KE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(KE||(KE={}));var Mt=Object.values(KE),Ge="So11111111111111111111111111111111111111112",ke="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",GE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var ut="SOLV420",pt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"},H_=["adreoi6W1MGA7eegERNcQTwQH3UuJaAnWjVZEq2cxcF","naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi","th734sEwvZZ5XfemLcvo6TXepPfawWBjz3HMYeQdhPi","BAPExw4zFmwSUjyPfQorenucofeafHLUetcoWTB4Gwnt","bay3c7G89NTxSULyM45gqJx3JoWtBBeXHvifCywwiwZ","BeRTyZTveVQsekrF63WhFvfGiABThym95x8uZaicDPgo","EF8o3aQnu853EEPJKUfqAgoa8szkVs28sv64xtBrRPSV","chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL","GsVJ62qt2nbRLT4f67LAo6Ve8eGhChJquYaK3wT1iG2v","ctz4yB16kvGiMrA4vdtKXEMYgkkfJLo6hMwDk9DZ3Vf","PARaNF4kcQW3BmaeMD3ELLAqUV7MDS8bMudaCEZ72NM","dedxpgLN1VXLHpekKra1JKkMGrw7tW1uuYz7Ec28iLK","DegEnNCbn6PrsvHvsErneRNv7KFTwnjW3uFVjf43e28v","Dcky7CK3aEHzdV9EF5YR1NaTJ9QfSyzW5cACbqEFKZNv","dksYs1gzQ7FzqyadN5XtcaeVbqKSN7X2SpfN3fcUW7G","dstCt4sDCQx1QFFJekmM5RjyFLsDRkaEjTgXd5gbpDB","eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK","ExCHpAsqeaDJGfUj41bhU2BuZK4fhRnJKvhG486rfKg","farmoWMKdJBxLxhMZpgU1uVjvjVJnQqrGhwAyDmcn8R","G1EaM8gLQU7DifPnCTQKP2PLvFf63tHvaXBAR8QFLg5Z","goJirTtcRjP6Wqkw7cHNvzjEva5rpvPDtj2ZnEmPAr6","wetfCN7bhjhBT8GTSAnah8ftoRoHB8H8Q87KkxDdRgK","8H6qQ2FKUjY8wmggSKHUENY38Nr9sQxDUbEZB6fiCHSX","hy1oTqvrknqoNmPWq2JtQMdDDnWkEGH2ab7N4r4rnJJ","jntrbAHjcxhP2eRUgCSACb6cMVhYm3jEQ3eQDZKicmz","akicJSdNFWszP2Le38t1NtVeywXtvoxdiGciaELwZHz","1i1yarXXz55VdvVL4v2HXcjMJPAv4fWJhY8x43bmwfL","LoV31z7KC5CZ8sdGovmRSDGB6csP1fJip1hiM7xDozw","magiCagux3C7nMKo2jKSbX6yWzYWMGKJ6ABRnw1zQ8U","JAfBCSxx2fZwdM5wTiLRAfJm3MpqXz3KnxjPhCQixGVh","mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe","phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1","pineBbb5K6SdV6KG1xibsR5DM1XsWuajtXSy3YYGY4N","prt1stdbFCFXpEcx9rxwJK63zhYo43V5JCXzGWXkPGn","rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg","rapTWQhZD2dPjJ91BXW4UnVKBt6NvX2aZxWSSYg66Y4","royLQKzrsSs9VbMZMDjZkMM8j3buBnwx7oH3wdifAk4","CitYBuKSE5W6CXEBAgY1B9fEMUdHXYSmZbXbAWd31Cr","axyaGn2eZM1dnDCagpd9aYa92gKWTrtEYb8vwc21ddr","sTeV1NswjBBo15qosoyQj1aYrgvoxomAduN1zFV6gCf","txtXxyX13G7h899vnZwNJsVRAMfWcwYZNT3jucRqqiW","hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M","te1emnh77qnpsdjcCi9FsyX8t4gf4HYWC4kTVHuH4MQ","tstidz7tN8armqvZ7ia2ck62mY9RD2BrwMtW2w8hcwk","vnd1sXYmA8YY9xHQBkKKurZeq7iCe6EQ9bGYNZJwh1c","YE11vEiXKKx95onU1EpjgwrHovgXamRTQvY52Mvde8i","5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on"],Y_=["adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ","nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC","BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP","b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF","chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1","chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe","CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP","parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz","dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S","DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup","dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH","eyeY8HangkSYirSBtopAfThXzhHL855wPnddz8WnemV","ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD","G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN","wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo","hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o","hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu","jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA","NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk","1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i","Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s","MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV","D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e","mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk","phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2","pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw","prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW","radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9","rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC","RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4","ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj","axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4","sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu","TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ","hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj","te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY","UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL","vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd","YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV","Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24","7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2","GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ","CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S"];import{spawnSync as es}from"child_process";import{spawnSync as K}from"node:child_process";var ZT=t((_,e=!1,E=!1)=>{E?e?(K(`mkdir /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`cd /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave-mod checkout ${_}-mod`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),K(`CI_COMMIT=$(git -C /tmp/${_}-agave-mod rev-parse HEAD) /tmp/${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),K(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-agave-mod /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),K(`sudo rm -rf /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(K(`mkdir /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`cd /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),K(`CI_COMMIT=$(git -C /tmp/${_}-agave rev-parse HEAD) /tmp/${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-agave`,{shell:!0,stdio:"inherit"}),K("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),K(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-agave /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),K(`sudo rm -rf /tmp/${_}-agave`,{shell:!0,stdio:"inherit"})):e?K(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):K(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),J_=ZT;var mt="agave-validator",_s=t(()=>{try{return mt}catch(_){return console.error(_),mt}},"getSolanaCLI"),n_=_s;var T_="3.0.10",__="3.0.10",re="",ae="3.0.10",l_="3.0.10",m_="",kE="3.0.10",VE="3.0.10",Re="_patch1",ht="3.0.10",h_="3.0.10";var Bt="20.17.0",x_="0.802.30008",F_="0.802.30008";var Ve=t(async(_,e=!1,E=!1)=>{let o=re,n=`${`v${_}`}${o}`;J_(n,e,E)},"updateVersion"),Ce=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${f} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${f} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),es(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Po from"chalk";var B_;(function(_){_.EN="en",_.JA="ja"})(B_||(B_={}));var gt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(gt||(gt={}));var yt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(yt||(yt={}));var I_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(I_||(I_={}));var Kt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(Kt||(Kt={}));var Gt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Gt||(Gt={}));var kt;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(kt||(kt={}));var Vt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Vt||(Vt={}));var be;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(be||(be={}));var we;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(we||(we={}));var vt=!1,Ht=!1,Yt=!1,Jt=!1,xt=!1,Qt=!1,$={ID:"solv",LANG:B_.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},H={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},M={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},s_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},B={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"},y={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((_=H.ROOT)=>{let e=_===H.ROOT?H.ROOT:_,E=`${e}/${y.MAINNET_VALIDATOR_KEY}`,o=`${e}/${y.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${y.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${y.TESTNET_VALIDATOR_KEY}`,T=`${e}/${y.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${y.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),D_=t((_=!0)=>{let e=_?`${H.ROOT}/${y.TESTNET_VALIDATOR_KEY}`:`${H.ROOT}/${y.MAINNET_VALIDATOR_KEY}`,E=_?`${H.ROOT}/${y.TESTNET_VALIDATOR_VOTE_KEY}`:`${H.ROOT}/${y.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${H.ROOT}/${s_.LOG}`,i=M.ACCOUNTS,n=M.LEDGER,T=M.SNAPSHOTS,s=`${H.ROOT}/${s_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var E_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",bE="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",qt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",$t=9,S_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Wt="So11111111111111111111111111111111111111112",Xt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",jt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",bt;(function(_){_[_.ELSOL=S_]="ELSOL",_[_.SOL=Wt]="SOL",_[_.USDC=Xt]="USDC",_[_.EPCT=jt]="EPCT"})(bt||(bt={}));var wt;(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"})(wt||(wt={}));var YC={[Wt]:9,[S_]:9,[Xt]:6,[jt]:6},ve="/home/solv/currentEpoch.json";var He="https://api.testnet.solana.com";import{spawnSync as wE}from"child_process";var zt=t(()=>{wE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=$.NODE_VERSION;wE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),wE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");import{spawnSync as Y}from"child_process";var Ye=t((_,e=!1,E=!1)=>{Y("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),Y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(Y(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),Y(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),Y("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),Y(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),Y(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"})):e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):Y(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Es,writeFile as ts}from"fs/promises";import{homedir as os}from"os";var g_=t(async _=>{let E=`${os()}/${s_.JITO_CONFIG}`,i={...JSON.parse(await Es(E,"utf8")),..._},n=JSON.stringify(i,null,2);await ts(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Zt}from"child_process";import is from"inquirer";var _o=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";Zt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;Zt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),eo=t(async()=>await is.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as ce}from"@skeet-framework/utils";import ns from"chalk";import Ts from"inquirer";var Eo=t(async()=>{let _=await Ts.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await ce("sudo ufw delete allow 8899/udp"),await ce("sudo ufw delete allow 8899/tcp"),await ce(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await ce(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await ce("sudo ufw reload"),console.log(ns.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var ss=t(()=>lt,"getSolvVersion"),Q_=ss;import{readFile as as,writeFile as Rs}from"fs/promises";import{existsAsync as Cs}from"@skeet-framework/utils";var vE;(function(_){_.EN="en",_.JA="ja"})(vE||(vE={}));var dc=Object.values(vE),d;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(d||(d={}));var to=Object.values(d),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var oo=Object.values(D),l;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.BAM="bam",_.NONE="none"})(l||(l={}));var Nc=Object.values(l).filter(_=>_!=="none"),v;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(v||(v={}));var io=Object.values(v).filter(_=>_!=="none"),W;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(W||(W={}));var rs={NETWORK:d.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:l.NONE,RPC_TYPE:v.AGAVE,MNT_DISK_TYPE:W.TRIPLE,TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__,NODE_VERSION:Bt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:ft,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ut,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:f,ACCOUNTS_PATH:v_,SNAPSHOTS_PATH:i_,MOD:!1},c_=rs;import{homedir as cs}from"os";var ds=t(async()=>{let e=`${cs()}/${ye}`;return await Cs(e)?JSON.parse(await as(e,"utf-8")):(console.log("Creating default config file at",e),await Rs(e,JSON.stringify(c_,null,2)),c_)},"readConfig"),V=ds;import Ns from"node-fetch";var r_=t(async _=>{try{let e=await V();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
- Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await Ns(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 Ds}from"child_process";import{Connection as no}from"@solana/web3.js";var de=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new no("https://api.testnet.solana.com"):new no(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(R=>R.votePubkey===e);if(!s)return T.delinquent.find(c=>c.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(R=>R.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,a=await n.getSlot()-S;return a>o?(i.isActive=!1,i.reason=`Validator has not voted for ${a} 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 Os}from"child_process";var p=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=Os(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ls=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),J=ls;import{sendDiscord as Fs}from"@skeet-framework/utils";var To=30,Is=t(async _=>{try{let e=_.NETWORK===d.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=u(),n=p(e?o:E),T=await de(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=To){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${To} minutes!
2
+ var xT=Object.defineProperty;var t=(_,e)=>xT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as cC}from"commander";var lt="5.5.5";var Ft={name:"@gabrielhicks/solv",version:lt,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 ye=Ft.version;var re="https://validators.solutions";var Ke="solv4.config.json";var u_="identity.json",p_="unstaked-identity.json",It="relayer-keypair.json",qT="mainnet-validator-keypair.json",$T="mainnet-vote-account-keypair.json",WT="mainnet-authority-keypair.json",XT="testnet-validator-keypair.json",jT="testnet-vote-account-keypair.json",zT="testnet-authority-keypair.json",G="/home/solv",U=`${G}/${u_}`,UC=`${G}/${p_}`,b=`${G}/${qT}`,w_=`${G}/${$T}`,AC=`${G}/${WT}`,g=`${G}/${XT}`,v_=`${G}/${jT}`,LC=`${G}/${zT}`,w=`${G}/solana-validator.log`,l_=G+"/start-validator.sh",f="/mnt/ledger",H_="/mnt/accounts",i_="/mnt/snapshots",Dt="solana-validator",Pt="agave-validator",ft="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ge=3;var Ut="https://api.mainnet-beta.solana.com",At="https://verify.validators.solutions/solv-migrate",Lt="https://jup.validators.solutions/v1/jup",GE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(GE||(GE={}));var Mt=Object.values(GE),ke="So11111111111111111111111111111111111111112",Ve="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",kE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var ut="SOLV420",pt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"},Y_=["adreoi6W1MGA7eegERNcQTwQH3UuJaAnWjVZEq2cxcF","naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi","th734sEwvZZ5XfemLcvo6TXepPfawWBjz3HMYeQdhPi","BAPExw4zFmwSUjyPfQorenucofeafHLUetcoWTB4Gwnt","bay3c7G89NTxSULyM45gqJx3JoWtBBeXHvifCywwiwZ","BeRTyZTveVQsekrF63WhFvfGiABThym95x8uZaicDPgo","EF8o3aQnu853EEPJKUfqAgoa8szkVs28sv64xtBrRPSV","chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL","GsVJ62qt2nbRLT4f67LAo6Ve8eGhChJquYaK3wT1iG2v","ctz4yB16kvGiMrA4vdtKXEMYgkkfJLo6hMwDk9DZ3Vf","PARaNF4kcQW3BmaeMD3ELLAqUV7MDS8bMudaCEZ72NM","dedxpgLN1VXLHpekKra1JKkMGrw7tW1uuYz7Ec28iLK","DegEnNCbn6PrsvHvsErneRNv7KFTwnjW3uFVjf43e28v","Dcky7CK3aEHzdV9EF5YR1NaTJ9QfSyzW5cACbqEFKZNv","dksYs1gzQ7FzqyadN5XtcaeVbqKSN7X2SpfN3fcUW7G","dstCt4sDCQx1QFFJekmM5RjyFLsDRkaEjTgXd5gbpDB","eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK","ExCHpAsqeaDJGfUj41bhU2BuZK4fhRnJKvhG486rfKg","farmoWMKdJBxLxhMZpgU1uVjvjVJnQqrGhwAyDmcn8R","G1EaM8gLQU7DifPnCTQKP2PLvFf63tHvaXBAR8QFLg5Z","goJirTtcRjP6Wqkw7cHNvzjEva5rpvPDtj2ZnEmPAr6","wetfCN7bhjhBT8GTSAnah8ftoRoHB8H8Q87KkxDdRgK","8H6qQ2FKUjY8wmggSKHUENY38Nr9sQxDUbEZB6fiCHSX","hy1oTqvrknqoNmPWq2JtQMdDDnWkEGH2ab7N4r4rnJJ","jntrbAHjcxhP2eRUgCSACb6cMVhYm3jEQ3eQDZKicmz","akicJSdNFWszP2Le38t1NtVeywXtvoxdiGciaELwZHz","1i1yarXXz55VdvVL4v2HXcjMJPAv4fWJhY8x43bmwfL","LoV31z7KC5CZ8sdGovmRSDGB6csP1fJip1hiM7xDozw","magiCagux3C7nMKo2jKSbX6yWzYWMGKJ6ABRnw1zQ8U","JAfBCSxx2fZwdM5wTiLRAfJm3MpqXz3KnxjPhCQixGVh","mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe","phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1","pineBbb5K6SdV6KG1xibsR5DM1XsWuajtXSy3YYGY4N","prt1stdbFCFXpEcx9rxwJK63zhYo43V5JCXzGWXkPGn","rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg","rapTWQhZD2dPjJ91BXW4UnVKBt6NvX2aZxWSSYg66Y4","royLQKzrsSs9VbMZMDjZkMM8j3buBnwx7oH3wdifAk4","CitYBuKSE5W6CXEBAgY1B9fEMUdHXYSmZbXbAWd31Cr","axyaGn2eZM1dnDCagpd9aYa92gKWTrtEYb8vwc21ddr","sTeV1NswjBBo15qosoyQj1aYrgvoxomAduN1zFV6gCf","txtXxyX13G7h899vnZwNJsVRAMfWcwYZNT3jucRqqiW","hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M","te1emnh77qnpsdjcCi9FsyX8t4gf4HYWC4kTVHuH4MQ","tstidz7tN8armqvZ7ia2ck62mY9RD2BrwMtW2w8hcwk","vnd1sXYmA8YY9xHQBkKKurZeq7iCe6EQ9bGYNZJwh1c","YE11vEiXKKx95onU1EpjgwrHovgXamRTQvY52Mvde8i","5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on"],J_=["adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ","nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC","BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP","b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF","chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1","chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe","CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP","parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz","dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S","DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup","dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH","eyeY8HangkSYirSBtopAfThXzhHL855wPnddz8WnemV","ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD","G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN","wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo","hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o","hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu","jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA","NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk","1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i","Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s","MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV","D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e","mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk","phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2","pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw","prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW","radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9","rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC","RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4","ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj","axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4","sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu","TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ","hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj","te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY","UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL","vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd","YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV","Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24","7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2","GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ","CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S"];import{spawnSync as es}from"child_process";import{spawnSync as K}from"node:child_process";var ZT=t((_,e=!1,E=!1)=>{E?e?(K(`mkdir /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`cd /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave-mod checkout ${_}-mod`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),K(`CI_COMMIT=$(git -C /tmp/${_}-agave-mod rev-parse HEAD) /tmp/${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),K(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-agave-mod /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),K(`sudo rm -rf /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(K(`mkdir /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`cd /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),K(`CI_COMMIT=$(git -C /tmp/${_}-agave rev-parse HEAD) /tmp/${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-agave`,{shell:!0,stdio:"inherit"}),K("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),K(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-agave /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),K(`sudo rm -rf /tmp/${_}-agave`,{shell:!0,stdio:"inherit"})):e?K(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):K(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),x_=ZT;var mt="agave-validator",_s=t(()=>{try{return mt}catch(_){return console.error(_),mt}},"getSolanaCLI"),n_=_s;var T_="3.0.10",__="3.0.10",ae="",Re="3.0.10",m_="3.0.10",c_="",VE="3.0.10",Ce="3.0.10",h_="_patch1",ht="3.0.10",B_="3.0.10";var Bt="20.17.0",Q_="0.802.30008",F_="0.802.30008";var be=t(async(_,e=!1,E=!1)=>{let o=ae,n=`${`v${_}`}${o}`;x_(n,e,E)},"updateVersion"),ce=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${f} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${f} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),es(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Po from"chalk";var g_;(function(_){_.EN="en",_.JA="ja"})(g_||(g_={}));var gt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(gt||(gt={}));var yt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(yt||(yt={}));var I_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(I_||(I_={}));var Kt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(Kt||(Kt={}));var Gt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Gt||(Gt={}));var kt;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(kt||(kt={}));var Vt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Vt||(Vt={}));var we;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(we||(we={}));var ve;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(ve||(ve={}));var vt=!1,Ht=!1,Yt=!1,Jt=!1,xt=!1,Qt=!1,$={ID:"solv",LANG:g_.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},H={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},M={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},s_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},B={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"},y={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((_=H.ROOT)=>{let e=_===H.ROOT?H.ROOT:_,E=`${e}/${y.MAINNET_VALIDATOR_KEY}`,o=`${e}/${y.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${y.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${y.TESTNET_VALIDATOR_KEY}`,T=`${e}/${y.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${y.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),D_=t((_=!0)=>{let e=_?`${H.ROOT}/${y.TESTNET_VALIDATOR_KEY}`:`${H.ROOT}/${y.MAINNET_VALIDATOR_KEY}`,E=_?`${H.ROOT}/${y.TESTNET_VALIDATOR_VOTE_KEY}`:`${H.ROOT}/${y.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${H.ROOT}/${s_.LOG}`,i=M.ACCOUNTS,n=M.LEDGER,T=M.SNAPSHOTS,s=`${H.ROOT}/${s_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var E_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",bE="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",qt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",$t=9,S_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Wt="So11111111111111111111111111111111111111112",Xt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",jt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",bt;(function(_){_[_.ELSOL=S_]="ELSOL",_[_.SOL=Wt]="SOL",_[_.USDC=Xt]="USDC",_[_.EPCT=jt]="EPCT"})(bt||(bt={}));var wt;(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"})(wt||(wt={}));var YC={[Wt]:9,[S_]:9,[Xt]:6,[jt]:6},He="/home/solv/currentEpoch.json";var Ye="https://api.testnet.solana.com";import{spawnSync as wE}from"child_process";var zt=t(()=>{wE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=$.NODE_VERSION;wE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),wE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");import{spawnSync as Y}from"child_process";var Je=t((_,e=!1,E=!1)=>{Y("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),Y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(Y(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),Y(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),Y("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),Y(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),Y(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"})):e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):Y(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Es,writeFile as ts}from"fs/promises";import{homedir as os}from"os";var y_=t(async _=>{let E=`${os()}/${s_.JITO_CONFIG}`,i={...JSON.parse(await Es(E,"utf8")),..._},n=JSON.stringify(i,null,2);await ts(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Zt}from"child_process";import is from"inquirer";var _o=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";Zt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;Zt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),eo=t(async()=>await is.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as de}from"@skeet-framework/utils";import ns from"chalk";import Ts from"inquirer";var Eo=t(async()=>{let _=await Ts.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await de("sudo ufw delete allow 8899/udp"),await de("sudo ufw delete allow 8899/tcp"),await de(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await de(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await de("sudo ufw reload"),console.log(ns.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var ss=t(()=>lt,"getSolvVersion"),q_=ss;import{readFile as as,writeFile as Rs}from"fs/promises";import{existsAsync as Cs}from"@skeet-framework/utils";var vE;(function(_){_.EN="en",_.JA="ja"})(vE||(vE={}));var dc=Object.values(vE),N;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(N||(N={}));var to=Object.values(N),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var oo=Object.values(D),l;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.BAM="bam",_.NONE="none"})(l||(l={}));var Nc=Object.values(l).filter(_=>_!=="none"),v;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(v||(v={}));var io=Object.values(v).filter(_=>_!=="none"),W;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(W||(W={}));var rs={NETWORK:N.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:l.NONE,RPC_TYPE:v.AGAVE,MNT_DISK_TYPE:W.TRIPLE,TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__,NODE_VERSION:Bt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:ft,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ut,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:f,ACCOUNTS_PATH:H_,SNAPSHOTS_PATH:i_,MOD:!1},d_=rs;import{homedir as cs}from"os";var ds=t(async()=>{let e=`${cs()}/${Ke}`;return await Cs(e)?JSON.parse(await as(e,"utf-8")):(console.log("Creating default config file at",e),await Rs(e,JSON.stringify(d_,null,2)),d_)},"readConfig"),V=ds;import Ns from"node-fetch";var r_=t(async _=>{try{let e=await V();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
+ Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await Ns(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 Ds}from"child_process";import{Connection as no}from"@solana/web3.js";var Ne=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new no("https://api.testnet.solana.com"):new no(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(R=>R.votePubkey===e);if(!s)return T.delinquent.find(c=>c.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(R=>R.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,a=await n.getSlot()-S;return a>o?(i.isActive=!1,i.reason=`Validator has not voted for ${a} 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 Os}from"child_process";var p=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=Os(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ls=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),J=ls;import{sendDiscord as Fs}from"@skeet-framework/utils";var To=30,Is=t(async _=>{try{let e=_.NETWORK===N.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=u(),n=p(e?o:E),T=await Ne(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=To){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${To} 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 Fs(S),!1}console.log("Waiting for validator to catch up..."),await J(60*1e3),T=await de(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),so=Is;var Ps=t(async _=>{let e=_.NETWORK===d.MAINNET,E=_.VALIDATOR_TYPE===l.FRANKENDANCER,o=_.VALIDATOR_TYPE===l.BAM,{mainnetValidatorKey:i,testnetValidatorKey:n}=u(),T=e?i:n,s=!1;E?s=e?Yt:Jt:o?s=e?xt:Qt:s=e?vt:Ht,s=s&&_.AUTO_RESTART;let S=p(T),r=`**${S}** updated solv to **${Q_()}**`;if(await r_(r),s){let a=`Restarting **${S}**
8
- _ _`;await r_(a);try{Ds("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(I){let N=`Error restarting **${S}**: ${I?.message||"Unknown error"}`;return await r_(N),!1}let R=Math.floor(Date.now()/1e3),c=`**${S}** has restarted, catching up...
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Fs(S),!1}console.log("Waiting for validator to catch up..."),await J(60*1e3),T=await Ne(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),so=Is;var Ps=t(async _=>{let e=_.NETWORK===N.MAINNET,E=_.VALIDATOR_TYPE===l.FRANKENDANCER,o=_.VALIDATOR_TYPE===l.BAM,{mainnetValidatorKey:i,testnetValidatorKey:n}=u(),T=e?i:n,s=!1;E?s=e?Yt:Jt:o?s=e?xt:Qt:s=e?vt:Ht,s=s&&_.AUTO_RESTART;let S=p(T),r=`**${S}** updated solv to **${q_()}**`;if(await r_(r),s){let a=`Restarting **${S}**
8
+ _ _`;await r_(a);try{Ds("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(F){let d=`Error restarting **${S}**: ${F?.message||"Unknown error"}`;return await r_(d),!1}let R=Math.floor(Date.now()/1e3),c=`**${S}** has restarted, catching up...
9
9
  at: <t:${R}> (${R})
10
- _ _`;await r_(c),await J(180*1e3);let C=await so(_);if(C){let N=Math.floor(Date.now()/1e3)-R,O=Math.floor(N/60),A=N%60,P=O>0?`${O}m ${A}s`:`${A}s`,L=`**${S}** has caught up!
10
+ _ _`;await r_(c),await J(180*1e3);let C=await so(_);if(C){let d=Math.floor(Date.now()/1e3)-R,O=Math.floor(d/60),A=d%60,P=O>0?`${O}m ${A}s`:`${A}s`,L=`**${S}** has caught up!
11
11
  at: <t:${R}> (${R})
12
12
  **${S}** took **${P}** to catch up after restart!
13
- _ _`;await r_(L)}else{let I=`**${S}** failed to catch up after update`;await r_(I)}return C}return!0},"autoUpdate"),So=Ps;import{homedir as fs}from"os";import{readFile as Us,writeFile as ro}from"fs/promises";import{existsAsync as As}from"@skeet-framework/utils";var m=t(async _=>{let E=`${fs()}/${ye}`;await As(E)||(console.log("Creating default config file at",E),await ro(E,JSON.stringify(c_,null,2)));let i={...JSON.parse(await Us(E,"utf8")),..._},n=JSON.stringify(i,null,2);await ro(E,n)},"updateDefaultConfig");var Ls={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"},Je=Ls;var Ms={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:"},ao=Ms;var us={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}"}},xe=us;var ps={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"}},Ro=ps;var Qe=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],qe=[[],[") 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 Co=[") \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"],co=[[],[") \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 ms={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"}},$e=ms;var hs={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"}},No=hs;var We=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Oo=[") \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 Bs=t(_=>{let e={cmds:Je,subCmds:$e,logs:xe,installer:Qe,installerSub:qe,clientCmds:We};switch(_){case B_.EN:e={cmds:Je,subCmds:$e,logs:xe,installer:Qe,installerSub:qe,clientCmds:We};break;case B_.JA:e={cmds:ao,subCmds:No,logs:Ro,installer:Co,installerSub:co,clientCmds:Oo};break;default:e={cmds:Je,subCmds:$e,logs:xe,installer:Qe,installerSub:qe,clientCmds:We}}return e},"readLocale"),lo=Bs;import{existsSync as Gs,readFileSync as ks,writeFileSync as Fo}from"fs";import{readFileSync as gs,writeFileSync as ys}from"fs";import{homedir as Ks}from"os";var q_=t(_=>{let E=`${Ks()}/${s_.CONFIG}`,i={...JSON.parse(gs(E,"utf8")),..._},n=JSON.stringify(i,null,2);ys(E,n)},"updateSolvConfig");import{homedir as Vs}from"os";var Io=t(()=>{let e=`${Vs()}/${s_.CONFIG}`;Gs(e)||(Fo(e,JSON.stringify($,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(ks(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Fo(e,JSON.stringify($,null,2)),E=$}let o=lo(E.LANG);return E.RPC_URL||(E.RPC_URL=$.RPC_URL,q_({RPC_URL:$.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,q_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",q_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as k}from"child_process";import{promises as Do}from"fs";import ws from"path";var bs=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 r_(L)}else{let F=`**${S}** failed to catch up after update`;await r_(F)}return C}return!0},"autoUpdate"),So=Ps;import{homedir as fs}from"os";import{readFile as Us,writeFile as ro}from"fs/promises";import{existsAsync as As}from"@skeet-framework/utils";var m=t(async _=>{let E=`${fs()}/${Ke}`;await As(E)||(console.log("Creating default config file at",E),await ro(E,JSON.stringify(d_,null,2)));let i={...JSON.parse(await Us(E,"utf8")),..._},n=JSON.stringify(i,null,2);await ro(E,n)},"updateDefaultConfig");var Ls={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"},xe=Ls;var Ms={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:"},ao=Ms;var us={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}"}},Qe=us;var ps={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"}},Ro=ps;var qe=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],$e=[[],[") 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 Co=[") \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"],co=[[],[") \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 ms={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"}},We=ms;var hs={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"}},No=hs;var Xe=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Oo=[") \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 Bs=t(_=>{let e={cmds:xe,subCmds:We,logs:Qe,installer:qe,installerSub:$e,clientCmds:Xe};switch(_){case g_.EN:e={cmds:xe,subCmds:We,logs:Qe,installer:qe,installerSub:$e,clientCmds:Xe};break;case g_.JA:e={cmds:ao,subCmds:No,logs:Ro,installer:Co,installerSub:co,clientCmds:Oo};break;default:e={cmds:xe,subCmds:We,logs:Qe,installer:qe,installerSub:$e,clientCmds:Xe}}return e},"readLocale"),lo=Bs;import{existsSync as Gs,readFileSync as ks,writeFileSync as Fo}from"fs";import{readFileSync as gs,writeFileSync as ys}from"fs";import{homedir as Ks}from"os";var $_=t(_=>{let E=`${Ks()}/${s_.CONFIG}`,i={...JSON.parse(gs(E,"utf8")),..._},n=JSON.stringify(i,null,2);ys(E,n)},"updateSolvConfig");import{homedir as Vs}from"os";var Io=t(()=>{let e=`${Vs()}/${s_.CONFIG}`;Gs(e)||(Fo(e,JSON.stringify($,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(ks(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Fo(e,JSON.stringify($,null,2)),E=$}let o=lo(E.LANG);return E.RPC_URL||(E.RPC_URL=$.RPC_URL,$_({RPC_URL:$.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,$_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",$_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as k}from"child_process";import{promises as Do}from"fs";import ws from"path";var bs=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
14
14
  index a0c631ee9f..048b118660 100644
15
15
  --- a/book/api/metrics-generated.md
16
16
  +++ b/book/api/metrics-generated.md
@@ -5795,7 +5795,7 @@ index 479e0f1829..a97f5778d4 100644
5795
5795
 
5796
5796
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5797
5797
  at the NOTICE level to the logger. E.g. for a typical fd_log
5798
- `;return{filePath:_,body:e}},"modDiff"),Xe=bs;var je=t(async(_,e,E=!1)=>{let o=_.NETWORK===d.TESTNET,i=e||(o?x_:F_),n=E||_.MOD,{filePath:T,body:s}=Xe();k("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await Do.mkdir(ws.dirname(T),{recursive:!0}),await Do.writeFile(T,s,"utf8"),k(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),k("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as vs}from"node:child_process";import{spawnSync as x}from"child_process";var ze=t((_,e=!1,E=!1)=>{x("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),x("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(x(`mkdir /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`cd /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`git clone https://github.com/jito-labs/bam-client.git --recurse-submodules /tmp/${_}`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),x(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),x("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),x(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),x(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"})):e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):x(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"bamUpdate");var fo=t(_=>{let e=_.NETWORK===d.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===l.JITO,i=_.VALIDATOR_TYPE===l.BAM,n=_.VALIDATOR_TYPE===l.FRANKENDANCER,T=_.AUTO_RESTART,s=_.MOD,S=10;T&&!e&&(S=30);let r=e?T_:__;o&&(r=l_,e&&(r=ae)),i&&(r=VE,e&&(r=kE)),n&&(r=F_,e&&(r=x_)),E&&(r=h_,o&&(r=ht)),F.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${r}`,r).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 a=>{let R=Q_(),c=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(Po.white(`Current solv version: ${R}`)),a.auto){await So(_);return}if(a.migrateConfig){let C=Io().config,I=W.TRIPLE;C.DISK_TYPES===0?I=W.DOUBLE:C.DISK_TYPES===1?I=W.SINGLE:I=W.TRIPLE;let N=C.SOLANA_NETWORK===I_.TESTNET,O=C.SOLV_TYPE===be.RPC_NODE,A=C.MAINNET_TYPE===we.JITO_MEV,P={NETWORK:N?d.TESTNET:d.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:I,RPC_TYPE:O?v.JITO:v.NONE,VALIDATOR_TYPE:A?l.JITO:N?l.AGAVE:l.SOLANA,TESTNET_SOLANA_VERSION:C.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:C.MAINNET_SOLANA_VERSION,NODE_VERSION:C.NODE_VERSION,TESTNET_DELINQUENT_STAKE:C.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:C.MAINNET_DELINQUENT_STAKE,COMMISSION:C.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:C.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:C.STAKE_ACCOUNT,HARVEST_ACCOUNT:C.HARVEST_ACCOUNT,IS_MEV_MODE:C.IS_MEV_MODE,RPC_URL:C.RPC_URL,KEYPAIR_PATH:C.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:C.DISCORD_WEBHOOK_URL,AUTO_UPDATE:C.AUTO_UPDATE,AUTO_RESTART:C.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:C.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await m(P)}if(a.config){if(await m({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__}),o){let C=e?ae:l_;await g_({version:C,tag:`v${C}`})}if(i){let C=e?kE:VE;await g_({version:C,tag:`v${C}`})}console.log(Po.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await Eo();return}if(a.background){let C=a.version,I=!!C.startsWith("3");if(await m({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__}),o){let O=m_,A=`v${C}-jito`,P=`v${C}-mod`,L=a.mod||s?`${P}${O}`:`${A}${O}`;Ye(L,a.mod||s,I),await g_({version:C,tag:`v${C}`}),await Ce(c,!0,S);return}if(i){let O=Re,A=`v${C}-bam`,P=`v${C}-mod`,L=a.mod||s?`${P}${O}`:`${A}${O}`;ze(L,a.mod||s,I),await g_({version:C,tag:`v${C}`}),await Ce(c,!0,S);return}if(n){await je(_,C,a.mod||s),await Ce(c,!0,S);return}await Ve(C,a.mod||s,I);let N=e?10:5;e&&vs("solv start",{stdio:"inherit",shell:!0}),await Ce(N,!0,S);return}else if(a.commission){let C=await eo();_o(C.commission,e)}else zt()})},"updateCommands");import{spawnSync as Hs}from"node:child_process";var Uo=t(_=>{try{let{log:e}=D_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Hs(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 Ao=t(()=>{F.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(_=>{Uo(_)})},"logCommands");import d_ from"chalk";import{spawnSync as Ys}from"child_process";import{homedir as Js}from"os";var Ze=t(_=>{let e=Js(),E=u(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=I_.TESTNET,s=_.COMMISSION;_.NETWORK===d.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=I_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===d.TESTNET&&(S=I_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;Ys(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as _E}from"child_process";import{existsSync as Lo,readdirSync as xs,rmSync as Qs}from"fs";import{homedir as qs}from"os";import Mo from"path";var eE=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[y.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===d.TESTNET?(e=[y.TESTNET_VALIDATOR_KEY,y.TESTNET_VALITATOR_AUTHORITY_KEY,y.TESTNET_VALIDATOR_VOTE_KEY,y.MAINNET_VALIDATOR_KEY,y.MAINNET_VALITATOR_AUTHORITY_KEY,y.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[y.MAINNET_VALIDATOR_KEY,y.MAINNET_VALITATOR_AUTHORITY_KEY,y.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;_E(o,{shell:!0,stdio:"ignore"});let i=xs("./").filter(S=>S.endsWith("SV.json")),n=qs(),T=Mo.join(n,"unstaked-identity.json");Lo(T)&&_E(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=Mo.join(n,e[s]);if(s++,Lo(r)){console.log(`${r} is already exist!`),Qs(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;_E(a,{shell:!0,stdio:"inherit"})}_E("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as po}from"child_process";var $s=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5798
+ `;return{filePath:_,body:e}},"modDiff"),je=bs;var ze=t(async(_,e,E=!1)=>{let o=_.NETWORK===N.TESTNET,i=e||(o?Q_:F_),n=E||_.MOD,{filePath:T,body:s}=je();k("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await Do.mkdir(ws.dirname(T),{recursive:!0}),await Do.writeFile(T,s,"utf8"),k(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),k("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as vs}from"node:child_process";import{spawnSync as x}from"child_process";var Ze=t((_,e=!1,E=!1)=>{x("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),x("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(x(`mkdir /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`cd /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`git clone https://github.com/jito-labs/bam-client.git --recurse-submodules /tmp/${_}`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),x(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),x("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),x(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),x(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"})):e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):x(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"bamUpdate");var fo=t(_=>{let e=_.NETWORK===N.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===l.JITO,i=_.VALIDATOR_TYPE===l.BAM,n=_.VALIDATOR_TYPE===l.FRANKENDANCER,T=_.AUTO_RESTART,s=_.MOD,S=10;T&&!e&&(S=30);let r=e?T_:__;o&&(r=m_,e&&(r=Re)),i&&(r=Ce,e&&(r=VE)),n&&(r=F_,e&&(r=Q_)),E&&(r=B_,o&&(r=ht)),I.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${r}`,r).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 a=>{let R=q_(),c=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(Po.white(`Current solv version: ${R}`)),a.auto){await So(_);return}if(a.migrateConfig){let C=Io().config,F=W.TRIPLE;C.DISK_TYPES===0?F=W.DOUBLE:C.DISK_TYPES===1?F=W.SINGLE:F=W.TRIPLE;let d=C.SOLANA_NETWORK===I_.TESTNET,O=C.SOLV_TYPE===we.RPC_NODE,A=C.MAINNET_TYPE===ve.JITO_MEV,P={NETWORK:d?N.TESTNET:N.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:F,RPC_TYPE:O?v.JITO:v.NONE,VALIDATOR_TYPE:A?l.JITO:d?l.AGAVE:l.SOLANA,TESTNET_SOLANA_VERSION:C.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:C.MAINNET_SOLANA_VERSION,NODE_VERSION:C.NODE_VERSION,TESTNET_DELINQUENT_STAKE:C.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:C.MAINNET_DELINQUENT_STAKE,COMMISSION:C.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:C.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:C.STAKE_ACCOUNT,HARVEST_ACCOUNT:C.HARVEST_ACCOUNT,IS_MEV_MODE:C.IS_MEV_MODE,RPC_URL:C.RPC_URL,KEYPAIR_PATH:C.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:C.DISCORD_WEBHOOK_URL,AUTO_UPDATE:C.AUTO_UPDATE,AUTO_RESTART:C.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:C.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await m(P)}if(a.config){if(await m({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__}),o){let C=e?Re:m_;await y_({version:C,tag:`v${C}`})}if(i){let C=e?VE:Ce;await y_({version:C,tag:`v${C}`})}console.log(Po.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await Eo();return}if(a.background){let C=a.version,F=!!C.startsWith("3");if(await m({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__}),o){let O=c_,A=`v${C}-jito`,P=`v${C}-mod`,L=a.mod||s?`${P}${O}`:`${A}${O}`;Je(L,a.mod||s,F),await y_({version:C,tag:`v${C}`}),await ce(c,!0,S);return}if(i){let O=h_,A=`v${C}-bam`,P=`v${C}-mod`,L=a.mod||s?`${P}${O}`:`${A}${O}`;Ze(L,a.mod||s,F),await y_({version:C,tag:`v${C}`}),await ce(c,!0,S);return}if(n){await ze(_,C,a.mod||s),await ce(c,!0,S);return}await be(C,a.mod||s,F);let d=e?10:5;e&&vs("solv start",{stdio:"inherit",shell:!0}),await ce(d,!0,S);return}else if(a.commission){let C=await eo();_o(C.commission,e)}else zt()})},"updateCommands");import{spawnSync as Hs}from"node:child_process";var Uo=t(_=>{try{let{log:e}=D_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Hs(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 Ao=t(()=>{I.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(_=>{Uo(_)})},"logCommands");import N_ from"chalk";import{spawnSync as Ys}from"child_process";import{homedir as Js}from"os";var _E=t(_=>{let e=Js(),E=u(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=I_.TESTNET,s=_.COMMISSION;_.NETWORK===N.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=I_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===N.TESTNET&&(S=I_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;Ys(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as eE}from"child_process";import{existsSync as Lo,readdirSync as xs,rmSync as Qs}from"fs";import{homedir as qs}from"os";import Mo from"path";var EE=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[y.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===N.TESTNET?(e=[y.TESTNET_VALIDATOR_KEY,y.TESTNET_VALITATOR_AUTHORITY_KEY,y.TESTNET_VALIDATOR_VOTE_KEY,y.MAINNET_VALIDATOR_KEY,y.MAINNET_VALITATOR_AUTHORITY_KEY,y.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[y.MAINNET_VALIDATOR_KEY,y.MAINNET_VALITATOR_AUTHORITY_KEY,y.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;eE(o,{shell:!0,stdio:"ignore"});let i=xs("./").filter(S=>S.endsWith("SV.json")),n=qs(),T=Mo.join(n,"unstaked-identity.json");Lo(T)&&eE(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=Mo.join(n,e[s]);if(s++,Lo(r)){console.log(`${r} is already exist!`),Qs(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;eE(a,{shell:!0,stdio:"inherit"})}eE("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 po}from"child_process";var $s=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5799
5799
  Description=Jupiter API Service Instance
5800
5800
  After=network.target
5801
5801
 
@@ -5816,11 +5816,11 @@ unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5816
5816
  chmod +x jupiter-swap-api
5817
5817
  rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=uo(_.rpcUrl,_.grpcUrl,_.grpcToken);po(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(Xs.white(`\u{1F7E2} Jupiter Swap API Setup Completed
5818
5818
 
5819
- $ solv jupiter --help`))},"jupiterAPISetup"),mo=js;var y_={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",bamUrl:"http://frankfurt.mainnet.bam.jito.wtf"},Ne={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",BAM_URL:"http://dallas.testnet.bam.jito.wtf"},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",BAM_URL:"http://ny.testnet.bam.jito.wtf"},SaltLakeCity:{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",BAM_URL:"http://ny.testnet.bam.jito.wtf"}},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",BAM_URL:"http://amsterdam.mainnet.bam.jito.wtf"},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",BAM_URL:"http://london.mainnet.bam.jito.wtf"},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",BAM_URL:"http://frankfurt.mainnet.bam.jito.wtf"},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",BAM_URL:"http://ny.mainnet.bam.jito.wtf"},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",BAM_URL:"http://tokyo.mainnet.bam.jito.wtf"},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",BAM_URL:"http://slc.mainnet.bam.jito.wtf"},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",BAM_URL:"http://singapore.mainnet.bam.jito.wtf"},Dublin:{BLOCK_ENGINE_URL:"https://dublin.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://dublin.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.61.8:1002",BAM_URL:""}}};import{existsAsync as zs}from"@skeet-framework/utils";import{readFile as Zs,writeFile as ho}from"fs/promises";import{homedir as _S}from"os";import eS from"path";var t_=t(async()=>{let _=_S(),e=eS.join(_,s_.JITO_CONFIG);await zs(e)||(await ho(e,JSON.stringify(y_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Zs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await ho(e,JSON.stringify(y_,null,2)),E=y_}return E},"readOrCreateJitoConfig");import{spawnSync as ES}from"child_process";var Oe=t(()=>{ES("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import le from"chalk";import EE from"inquirer";import tS from"inquirer";var Bo=t(async _=>{let E=Object.keys(_?Ne.TESTNET:Ne.MAINNET),o=_?Ne.TESTNET:Ne.MAINNET,i=await tS.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:y_.version,tag:y_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR,bamUrl:T.BAM_URL}},"askJitoSetting");var oS=t(async()=>{try{let _=l.NONE,e=v.AGAVE,E=c_.COMMISSION,o=!1,i=await EE.prompt([{name:"network",type:"list",message:"Choose Network",choices:to,default:d.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:oo,default:D.RPC}]),n=i.network===d.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===d.MAINNET?[l.JITO,l.SOLANA]:[l.AGAVE,l.JITO,l.FRANKENDANCER,l.BAM];_=await EE.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:l.AGAVE}).then(r=>r.validatorType),e=v.NONE}if(i.nodeType===D.RPC&&(e=await EE.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:io,default:v.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await EE.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,_===l.JITO||_===l.FRANKENDANCER||_===l.BAM){await t_();let r=await Bo(n);await g_(r)}}let{network:T,nodeType:s}=i;return console.log(le.white("Network:",T)),console.log(le.white("Node Type:",s)),console.log(le.white("Validator Type:",_)),console.log(le.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(le.white("Commission:",E)),await m({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),go=oS;import{spawnSync as X}from"child_process";var Fe=t((_=l_,e=!1,E=!1)=>{E?e?X(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(X(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),X(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),X(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),X("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),X(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),X(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"}),X("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})):e?X(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):X(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var yo=t(()=>`#!/bin/bash
5819
+ $ solv jupiter --help`))},"jupiterAPISetup"),mo=js;var K_={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",bamUrl:"http://frankfurt.mainnet.bam.jito.wtf"},Oe={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",BAM_URL:"http://dallas.testnet.bam.jito.wtf"},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",BAM_URL:"http://ny.testnet.bam.jito.wtf"},SaltLakeCity:{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",BAM_URL:"http://ny.testnet.bam.jito.wtf"}},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",BAM_URL:"http://amsterdam.mainnet.bam.jito.wtf"},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",BAM_URL:"http://london.mainnet.bam.jito.wtf"},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",BAM_URL:"http://frankfurt.mainnet.bam.jito.wtf"},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",BAM_URL:"http://ny.mainnet.bam.jito.wtf"},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",BAM_URL:"http://tokyo.mainnet.bam.jito.wtf"},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",BAM_URL:"http://slc.mainnet.bam.jito.wtf"},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",BAM_URL:"http://singapore.mainnet.bam.jito.wtf"},Dublin:{BLOCK_ENGINE_URL:"https://dublin.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://dublin.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.61.8:1002",BAM_URL:""}}};import{existsAsync as zs}from"@skeet-framework/utils";import{readFile as Zs,writeFile as ho}from"fs/promises";import{homedir as _S}from"os";import eS from"path";var t_=t(async()=>{let _=_S(),e=eS.join(_,s_.JITO_CONFIG);await zs(e)||(await ho(e,JSON.stringify(K_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Zs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await ho(e,JSON.stringify(K_,null,2)),E=K_}return E},"readOrCreateJitoConfig");import{spawnSync as ES}from"child_process";var le=t(()=>{ES("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Fe from"chalk";import tE from"inquirer";import tS from"inquirer";var Bo=t(async _=>{let E=Object.keys(_?Oe.TESTNET:Oe.MAINNET),o=_?Oe.TESTNET:Oe.MAINNET,i=await tS.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:K_.version,tag:K_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR,bamUrl:T.BAM_URL}},"askJitoSetting");var oS=t(async()=>{try{let _=l.NONE,e=v.AGAVE,E=d_.COMMISSION,o=!1,i=await tE.prompt([{name:"network",type:"list",message:"Choose Network",choices:to,default:N.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:oo,default:D.RPC}]),n=i.network===N.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===N.MAINNET?[l.JITO,l.SOLANA]:[l.AGAVE,l.JITO,l.FRANKENDANCER,l.BAM];_=await tE.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:l.AGAVE}).then(r=>r.validatorType),e=v.NONE}if(i.nodeType===D.RPC&&(e=await tE.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:io,default:v.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await tE.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${d_.COMMISSION}%)'`,default:d_.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,_===l.JITO||_===l.FRANKENDANCER||_===l.BAM){await t_();let r=await Bo(n);await y_(r)}}let{network:T,nodeType:s}=i;return console.log(Fe.white("Network:",T)),console.log(Fe.white("Node Type:",s)),console.log(Fe.white("Validator Type:",_)),console.log(Fe.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Fe.white("Commission:",E)),await m({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),go=oS;import{spawnSync as X}from"child_process";var Ie=t((_=m_,e=!1,E=!1)=>{E?e?X(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(X(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),X(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),X(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),X("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),X(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),X(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"}),X("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})):e?X(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):X(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var yo=t(()=>`#!/bin/bash
5820
5820
  exec agave-validator \\
5821
5821
  --identity ${U} \\
5822
5822
  --log ${w} \\
5823
- --accounts ${v_} \\
5823
+ --accounts ${H_} \\
5824
5824
  --ledger ${f} \\
5825
5825
  --snapshots ${i_} \\
5826
5826
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
@@ -5855,11 +5855,11 @@ exec agave-validator \\
5855
5855
  --wal-recovery-mode skip_any_corrupted_record \\
5856
5856
  --use-snapshot-archives-at-startup when-newest \\
5857
5857
  --limit-ledger-size 400000000 \\
5858
- `,"startJitoRPCScript");import{existsAsync as TS}from"@skeet-framework/utils";import{writeFile as sS}from"fs/promises";import{spawnSync as iS}from"node:child_process";var nS=t(()=>{let _=`sudo chmod +x ${O_}`;iS(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Ie=nS;var Ko=t(()=>`#!/bin/bash
5858
+ `,"startJitoRPCScript");import{existsAsync as TS}from"@skeet-framework/utils";import{writeFile as sS}from"fs/promises";import{spawnSync as iS}from"node:child_process";var nS=t(()=>{let _=`sudo chmod +x ${l_}`;iS(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),De=nS;var Ko=t(()=>`#!/bin/bash
5859
5859
  exec agave-validator \\
5860
5860
  --identity ${U} \\
5861
5861
  --log ${w} \\
5862
- --accounts ${v_} \\
5862
+ --accounts ${H_} \\
5863
5863
  --ledger ${f} \\
5864
5864
  --snapshots ${i_} \\
5865
5865
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
@@ -5891,8 +5891,8 @@ exec agave-validator \\
5891
5891
  --wal-recovery-mode skip_any_corrupted_record \\
5892
5892
  --use-snapshot-archives-at-startup when-newest \\
5893
5893
  --limit-ledger-size 400000000 \\
5894
- `,"startRPCNodeScript");var SS=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case v.AGAVE:console.log("Agave RPC Node Setup"),J_(_.TESTNET_SOLANA_VERSION),E=Ko();break;case v.JITO:console.log("JITO RPC Node Setup");let o=m_,n=`${`v${ae}-jito`}${o}`;Fe(n),E=yo();break;default:console.log("Unknown RPC Node Setup");break}if(await TS(O_)){console.log("Startup script already exists. Skipping...");return}await sS(O_,E,"utf-8"),Ie()},"setupRpcNode"),Go=SS;import{spawnSync as rS}from"node:child_process";var aS=t(_=>{rS(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),JE=aS;import ko from"chalk";import{spawnSync as RS}from"child_process";var Vo=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;RS(e,{shell:!0,stdio:"inherit"})}catch{console.log(ko.yellow(`You might need to install the Solana SPL CLI:
5895
- `)),console.log(ko.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as cS}from"os";import{spawnSync as CS}from"child_process";var P_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=CS(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import dS from"chalk";import{spawnSync as NS}from"node:child_process";var bo=t(_=>{F.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let o=`${cS()}/mainnet-authority-keypair.json`;await Vo(o),process.exit(0)}await OS(_),process.exit(0)})},"balanceCommands"),OS=t(async _=>{let e=j(_),E=`Validator Key: ${e.validatorKey}
5894
+ `,"startRPCNodeScript");var SS=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case v.AGAVE:console.log("Agave RPC Node Setup"),x_(_.TESTNET_SOLANA_VERSION),E=Ko();break;case v.JITO:console.log("JITO RPC Node Setup");let o=c_,n=`${`v${Re}-jito`}${o}`;Ie(n),E=yo();break;default:console.log("Unknown RPC Node Setup");break}if(await TS(l_)){console.log("Startup script already exists. Skipping...");return}await sS(l_,E,"utf-8"),De()},"setupRpcNode"),Go=SS;import{spawnSync as rS}from"node:child_process";var aS=t(_=>{rS(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),JE=aS;import ko from"chalk";import{spawnSync as RS}from"child_process";var Vo=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;RS(e,{shell:!0,stdio:"inherit"})}catch{console.log(ko.yellow(`You might need to install the Solana SPL CLI:
5895
+ `)),console.log(ko.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as cS}from"os";import{spawnSync as CS}from"child_process";var P_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=CS(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import dS from"chalk";import{spawnSync as NS}from"node:child_process";var bo=t(_=>{I.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=`${cS()}/mainnet-authority-keypair.json`;await Vo(o),process.exit(0)}await OS(_),process.exit(0)})},"balanceCommands"),OS=t(async _=>{let e=j(_),E=`Validator Key: ${e.validatorKey}
5896
5896
  Address: ${e.validatorKeyAddress}
5897
5897
  Balance: ${e.validatorKeyBalance}
5898
5898
  Vote Key: ${e.voteKey}
@@ -5904,11 +5904,11 @@ Balance: ${e.authorityKeyBalance}
5904
5904
  Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
5905
5905
  Address: ${e.validatorKeyAddress}
5906
5906
  Balance: ${e.validatorKeyBalance}
5907
- Active Identity:`),console.log(dS.white(E)),NS(`solana-keygen pubkey ${U}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),j=t(_=>{let e=u(),E=_.NETWORK===d.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:p(e.mainnetValidatorKey),validatorKeyBalance:P_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:p(e.testnetValidatorKey),validatorKeyBalance:P_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:p(e.testnetValidatorVoteKey),voteKeyBalance:P_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:p(e.testnetValidatorAuthorityKey),authorityKeyBalance:P_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:p(e.mainnetValidatorKey),validatorKeyBalance:P_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:p(e.mainnetValidatorVoteKey),voteKeyBalance:P_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:p(e.mainnetValidatorAuthorityKey),authorityKeyBalance:P_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");var wo=t((_=0,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),r=Y_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5907
+ Active Identity:`),console.log(dS.white(E)),NS(`solana-keygen pubkey ${U}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),j=t(_=>{let e=u(),E=_.NETWORK===N.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:p(e.mainnetValidatorKey),validatorKeyBalance:P_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:p(e.testnetValidatorKey),validatorKeyBalance:P_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:p(e.testnetValidatorVoteKey),voteKeyBalance:P_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:p(e.testnetValidatorAuthorityKey),authorityKeyBalance:P_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:p(e.mainnetValidatorKey),validatorKeyBalance:P_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:p(e.mainnetValidatorVoteKey),voteKeyBalance:P_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:p(e.mainnetValidatorAuthorityKey),authorityKeyBalance:P_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");var wo=t((_=0,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),r=J_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5908
5908
  `);return`#!/bin/bash
5909
5909
  exec ${n} \\
5910
5910
  --identity ${U} \\
5911
- --vote-account ${b_} \\
5911
+ --vote-account ${w_} \\
5912
5912
  --authorized-voter ${b} \\
5913
5913
  --log ${w} \\
5914
5914
  --accounts ${i.ACCOUNTS_PATH} \\
@@ -5937,11 +5937,11 @@ ${r}
5937
5937
  --snapshot-interval-slots 0 \\
5938
5938
  --private-rpc \\
5939
5939
  --full-rpc-api \\
5940
- `},"startJitoMainnetScript");var vo=t((_=1e4,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),r=H_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5940
+ `},"startJitoMainnetScript");var vo=t((_=1e4,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),r=Y_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5941
5941
  `);return`#!/bin/bash
5942
5942
  exec ${n} \\
5943
5943
  --identity ${U} \\
5944
- --vote-account ${w_} \\
5944
+ --vote-account ${v_} \\
5945
5945
  --authorized-voter ${g} \\
5946
5946
  --log ${w} \\
5947
5947
  --accounts ${i.ACCOUNTS_PATH} \\
@@ -5969,11 +5969,11 @@ ${r}
5969
5969
  --expected-shred-version 41708 \\
5970
5970
  --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
5971
5971
  --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5972
- `},"startJitoTestnetScript");var Ho=t((_,e="agave-validator")=>{let{validatorKeyAddress:E}=j(_),n=Y_.filter(s=>s!==E).map(s=>`--known-validator ${s} \\`).join(`
5972
+ `},"startJitoTestnetScript");var Ho=t((_,e="agave-validator")=>{let{validatorKeyAddress:E}=j(_),n=J_.filter(s=>s!==E).map(s=>`--known-validator ${s} \\`).join(`
5973
5973
  `);return`#!/bin/bash
5974
5974
  exec ${e} \\
5975
5975
  --identity ${U} \\
5976
- --vote-account ${b_} \\
5976
+ --vote-account ${w_} \\
5977
5977
  --authorized-voter ${b} \\
5978
5978
  --log ${w} \\
5979
5979
  --accounts ${_.ACCOUNTS_PATH} \\
@@ -5997,11 +5997,11 @@ ${n}
5997
5997
  --block-verification-method unified-scheduler \\
5998
5998
  --snapshot-interval-slots 0 \\
5999
5999
  --private-rpc \\
6000
- `},"startMainnetValidatorScript");var xE=t(_=>{let{validatorKeyAddress:e}=j(_),i=H_.filter(T=>T!==e).map(T=>`--known-validator ${T} \\`).join(`
6000
+ `},"startMainnetValidatorScript");var xE=t(_=>{let{validatorKeyAddress:e}=j(_),i=Y_.filter(T=>T!==e).map(T=>`--known-validator ${T} \\`).join(`
6001
6001
  `);return`#!/bin/bash
6002
6002
  exec agave-validator \\
6003
6003
  --identity ${U} \\
6004
- --vote-account ${w_} \\
6004
+ --vote-account ${v_} \\
6005
6005
  --authorized-voter ${g} \\
6006
6006
  --log ${w} \\
6007
6007
  --accounts ${_.ACCOUNTS_PATH} \\
@@ -6024,11 +6024,11 @@ ${i}
6024
6024
  --block-verification-method unified-scheduler \\
6025
6025
  --maximum-full-snapshots-to-retain 1 \\
6026
6026
  --maximum-incremental-snapshots-to-retain 2 \\
6027
- `},"startTestnetAgaveValidatorScript");import{writeFile as jo}from"fs/promises";var Yo=t((_=0,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=Y_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
6027
+ `},"startTestnetAgaveValidatorScript");import{writeFile as jo}from"fs/promises";var Yo=t((_=0,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=J_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
6028
6028
  `);return`#!/bin/bash
6029
6029
  exec ${T} \\
6030
6030
  --identity ${U} \\
6031
- --vote-account ${b_} \\
6031
+ --vote-account ${w_} \\
6032
6032
  --authorized-voter ${b} \\
6033
6033
  --log ${w} \\
6034
6034
  --accounts ${n.ACCOUNTS_PATH} \\
@@ -6058,11 +6058,11 @@ ${a}
6058
6058
  --snapshot-interval-slots 0 \\
6059
6059
  --private-rpc \\
6060
6060
  --full-rpc-api \\
6061
- `},"startBamMainnetScript");import{spawnSync as z}from"child_process";var QE=t((_,e=!1,E=!1)=>{E?e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(z(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),z(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} clone https://github.com/jito-labs/bam-client.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),z(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),z("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),z(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),z(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"}),z("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})):e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):z(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installBam");var Jo=t((_=1e4,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=H_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
6061
+ `},"startBamMainnetScript");import{spawnSync as z}from"child_process";var QE=t((_,e=!1,E=!1)=>{E?e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(z(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),z(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} clone https://github.com/jito-labs/bam-client.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),z(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),z("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),z(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),z(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"}),z("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})):e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):z(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installBam");var Jo=t((_=1e4,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=Y_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
6062
6062
  `);return`#!/bin/bash
6063
6063
  exec ${T} \\
6064
6064
  --identity ${U} \\
6065
- --vote-account ${w_} \\
6065
+ --vote-account ${v_} \\
6066
6066
  --authorized-voter ${g} \\
6067
6067
  --log ${w} \\
6068
6068
  --accounts ${n.ACCOUNTS_PATH} \\
@@ -6320,14 +6320,14 @@ WantedBy=multi-user.target
6320
6320
  compress
6321
6321
  copytruncate
6322
6322
  }
6323
- `),i)},"logRotates");import{existsSync as Wo}from"fs";import{execSync as Xo}from"child_process";function $_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&Wo(B.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!Wo(B.SOL_LOGROTATE)){let e=qE("solv",_);Xo(`echo "${e}" | sudo tee ${B.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=qE("solv",_);Xo(`echo "${e}" | sudo tee ${B.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t($_,"setupLogrotate");var fS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===d.TESTNET),o=E?x_:F_,{filePath:i,body:n}=Xe();_?(h('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),h('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),h("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),h(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await $E.mkdir(PS.dirname(i),{recursive:!0}),await $E.writeFile(i,n,"utf8"),h(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),h(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(h("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),h(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),h("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await t_(),{filePath:s,body:S}=xo();h(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),h(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Qo();h(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=$o();h("sudo apt install socat",{shell:!0,stdio:"inherit"}),h("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),h(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),h("sudo systemctl daemon-reload",{shell:!0});let R=qo(E,T);await $E.writeFile(R.filePath,R.body,"utf-8"),console.log(`config.toml written to ${R.filePath}`),h(`sudo chown solv:solv "${R.filePath}"`,{shell:!0,stdio:"inherit"}),$_(!0)},"setupFiredancer"),De=fS;var US=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===d.MAINNET?(console.log("Mainnet Validator Node Setup"),await AS(_,e)):E===d.TESTNET?(console.log("Testnet Validator Node Setup"),await LS(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),AS=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 l.SOLANA:let s=re,r=`${`v${o}`}${s}`;JE(r),n=Ho(_);break;case l.JITO:console.log("JITO Validator Setup for Mainnet");let a=await t_(),R=m_,c=`v${o}-jito`,C=`v${o}-mod`,I=e?`${C}${R}`:`${c}${R}`;Fe(I,e,T),n=wo(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,_);break;case l.BAM:console.log("JITO Validator Setup for Mainnet");let N=await t_(),O=Re,A=`v${o}-bam`,P=`v${o}-mod`,L=e?`${P}${O}`:`${A}${O}`;QE(L,e,T),n=Yo(N.commissionBps,N.relayerUrl,N.blockEngineUrl,N.shredReceiverAddr,N.bamUrl,_);break;case l.FRANKENDANCER:await De(e,_);break;default:console.log("Unknown Validator Type for Mainnet");break}await jo(O_,n,"utf-8"),Ie()},"setupMainnetValidator"),LS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o,TESTNET_SOLANA_VERSION:i}=_;e=o;let n="",T=!!i.startsWith("3"),s=re,r=`${`v${i}`}${s}`,a=m_,R=`v${i}-jito`,c=`v${i}-mod`,C=e?`${c}${a}`:`${R}${a}`,I=Re,N=`v${i}-bam`,O=`v${i}-mod`,A=e?`${O}${I}`:`${N}${I}`;switch(E){case l.SOLANA:JE(r),n=xE(_);case l.AGAVE:console.log("Agave Validator Setup for Testnet"),J_(r,e,T),n=xE(_);break;case l.JITO:console.log("JITO Validator Setup for Testnet");let P=await t_();Fe(C,e,T),n=vo(P.commissionBps,P.relayerUrl,P.blockEngineUrl,P.shredReceiverAddr,_);break;case l.BAM:console.log("BAM Validator Setup for Mainnet");let L=await t_();QE(A,e,T),n=Jo(L.commissionBps,L.relayerUrl,L.blockEngineUrl,L.shredReceiverAddr,L.bamUrl,_);break;case l.FRANKENDANCER:console.log("FRANKENDANCER Validator Setup for Mainnet"),await De(e,_);break;default:console.log("Unknown Validator Type for Testnet");break}await jo(O_,n,"utf-8"),Ie()},"setupTestnetValidator"),zo=US;import zE from"chalk";import{execSync as Zo}from"node:child_process";function _i(_){try{Zo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{Zo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(_i,"createDirectoryIfNotExists");var ei=t(()=>{try{let _=[M.ACCOUNTS,M.LEDGER,M.SNAPSHOTS];for(let e of _)_i(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as MS}from"child_process";function uS(){let e=MS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6324
- `).slice(1),E=[],o=e.map(N=>N.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let N of e){let[O,A,P]=N.trim().split(/\s+/);if(!O||!A)continue;let L=parseInt(A,10);if(isNaN(L))continue;let R_=P!==void 0&&P!=="";P==="/"&&(S=O.replace(/p?\d*$/,""));let M_=o.some(se=>se!==O&&se.startsWith(O)),Te=O.startsWith("nvme")?"NVMe":"SATA";L>=400*1024*1024*1024&&E.push({name:O,size:L,mountpoint:P||"",isMounted:R_,hasPartition:M_,type:Te})}console.log("Found root disk name: ",S);let r=o.filter(N=>N.startsWith(S));r.forEach(N=>console.log("Found root disk partition: ",N));let R=E.filter(N=>!r.includes(N.name)).sort((N,O)=>O.size-N.size),c=R.filter(N=>N.type==="NVMe").sort((N,O)=>O.size-N.size),C=R.filter(N=>N.type==="SATA").sort((N,O)=>O.size-N.size),I=[...c,...C];if(I.length>0){let N=I[0];if(N.size>=850*1024*1024*1024&&!N.isMounted&&(i=!0),N.size>=1250*1024*1024*1024&&N.isMounted&&(T=!0),I.length>1){let O=I[1];O.size>=400*1024*1024*1024&&!O.isMounted&&(n=!0)}if(I.length>2){let O=I[2];O.size>=400*1024*1024*1024&&!O.isMounted&&(s=!0)}}return I.forEach((N,O)=>console.log(`Prioritized Disk ${O+1}: ${N.name} ${N.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(uS,"getPreferredDisks");var Pe=uS;import{spawnSync as W_}from"child_process";var f_=t(_=>{if(W_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return W_("sudo udevadm trigger --action=change",{shell:!0}),W_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return W_(E,{shell:!0,stdio:"inherit"}),W_("sudo udevadm trigger --action=change",{shell:!0}),W_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as tE}from"child_process";async function WE(_){for(let e=1;e<=5;e++){let o=tE(`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 J(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(WE,"getUUID");var fe=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await WE(_),T=await WE(e),s=await WE(E),S=`${n} ${M.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${M.LEDGER} ext4 defaults 0 0
6323
+ `),i)},"logRotates");import{existsSync as Wo}from"fs";import{execSync as Xo}from"child_process";function W_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&Wo(B.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!Wo(B.SOL_LOGROTATE)){let e=qE("solv",_);Xo(`echo "${e}" | sudo tee ${B.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=qE("solv",_);Xo(`echo "${e}" | sudo tee ${B.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(W_,"setupLogrotate");var fS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===N.TESTNET),o=E?Q_:F_,{filePath:i,body:n}=je();_?(h('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),h('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),h("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),h(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await $E.mkdir(PS.dirname(i),{recursive:!0}),await $E.writeFile(i,n,"utf8"),h(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),h(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(h("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),h(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),h("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await t_(),{filePath:s,body:S}=xo();h(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),h(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Qo();h(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=$o();h("sudo apt install socat",{shell:!0,stdio:"inherit"}),h("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),h(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),h("sudo systemctl daemon-reload",{shell:!0});let R=qo(E,T);await $E.writeFile(R.filePath,R.body,"utf-8"),console.log(`config.toml written to ${R.filePath}`),h(`sudo chown solv:solv "${R.filePath}"`,{shell:!0,stdio:"inherit"}),W_(!0)},"setupFiredancer"),Pe=fS;var US=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===N.MAINNET?(console.log("Mainnet Validator Node Setup"),await AS(_,e)):E===N.TESTNET?(console.log("Testnet Validator Node Setup"),await LS(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),AS=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 l.SOLANA:let s=ae,r=`${`v${o}`}${s}`;JE(r),n=Ho(_);break;case l.JITO:console.log("JITO Validator Setup for Mainnet");let a=await t_(),R=c_,c=`v${o}-jito`,C=`v${o}-mod`,F=e?`${C}${R}`:`${c}${R}`;Ie(F,e,T),n=wo(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,_);break;case l.BAM:console.log("JITO Validator Setup for Mainnet");let d=await t_(),O=h_,A=`v${o}-bam`,P=`v${o}-mod`,L=e?`${P}${O}`:`${A}${O}`;QE(L,e,T),n=Yo(d.commissionBps,d.relayerUrl,d.blockEngineUrl,d.shredReceiverAddr,d.bamUrl,_);break;case l.FRANKENDANCER:await Pe(e,_);break;default:console.log("Unknown Validator Type for Mainnet");break}await jo(l_,n,"utf-8"),De()},"setupMainnetValidator"),LS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o,TESTNET_SOLANA_VERSION:i}=_;e=o;let n="",T=!!i.startsWith("3"),s=ae,r=`${`v${i}`}${s}`,a=c_,R=`v${i}-jito`,c=`v${i}-mod`,C=e?`${c}${a}`:`${R}${a}`,F=h_,d=`v${i}-bam`,O=`v${i}-mod`,A=e?`${O}${F}`:`${d}${F}`;switch(E){case l.SOLANA:JE(r),n=xE(_);case l.AGAVE:console.log("Agave Validator Setup for Testnet"),x_(r,e,T),n=xE(_);break;case l.JITO:console.log("JITO Validator Setup for Testnet");let P=await t_();Ie(C,e,T),n=vo(P.commissionBps,P.relayerUrl,P.blockEngineUrl,P.shredReceiverAddr,_);break;case l.BAM:console.log("BAM Validator Setup for Mainnet");let L=await t_();QE(A,e,T),n=Jo(L.commissionBps,L.relayerUrl,L.blockEngineUrl,L.shredReceiverAddr,L.bamUrl,_);break;case l.FRANKENDANCER:console.log("FRANKENDANCER Validator Setup for Mainnet"),await Pe(e,_);break;default:console.log("Unknown Validator Type for Testnet");break}await jo(l_,n,"utf-8"),De()},"setupTestnetValidator"),zo=US;import zE from"chalk";import{execSync as Zo}from"node:child_process";function _i(_){try{Zo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{Zo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(_i,"createDirectoryIfNotExists");var ei=t(()=>{try{let _=[M.ACCOUNTS,M.LEDGER,M.SNAPSHOTS];for(let e of _)_i(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as MS}from"child_process";function uS(){let e=MS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6324
+ `).slice(1),E=[],o=e.map(d=>d.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let d of e){let[O,A,P]=d.trim().split(/\s+/);if(!O||!A)continue;let L=parseInt(A,10);if(isNaN(L))continue;let R_=P!==void 0&&P!=="";P==="/"&&(S=O.replace(/p?\d*$/,""));let M_=o.some(Se=>Se!==O&&Se.startsWith(O)),se=O.startsWith("nvme")?"NVMe":"SATA";L>=400*1024*1024*1024&&E.push({name:O,size:L,mountpoint:P||"",isMounted:R_,hasPartition:M_,type:se})}console.log("Found root disk name: ",S);let r=o.filter(d=>d.startsWith(S));r.forEach(d=>console.log("Found root disk partition: ",d));let R=E.filter(d=>!r.includes(d.name)).sort((d,O)=>O.size-d.size),c=R.filter(d=>d.type==="NVMe").sort((d,O)=>O.size-d.size),C=R.filter(d=>d.type==="SATA").sort((d,O)=>O.size-d.size),F=[...c,...C];if(F.length>0){let d=F[0];if(d.size>=850*1024*1024*1024&&!d.isMounted&&(i=!0),d.size>=1250*1024*1024*1024&&d.isMounted&&(T=!0),F.length>1){let O=F[1];O.size>=400*1024*1024*1024&&!O.isMounted&&(n=!0)}if(F.length>2){let O=F[2];O.size>=400*1024*1024*1024&&!O.isMounted&&(s=!0)}}return F.forEach((d,O)=>console.log(`Prioritized Disk ${O+1}: ${d.name} ${d.size}`)),{disks:F,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(uS,"getPreferredDisks");var fe=uS;import{spawnSync as X_}from"child_process";var f_=t(_=>{if(X_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return X_("sudo udevadm trigger --action=change",{shell:!0}),X_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return X_(E,{shell:!0,stdio:"inherit"}),X_("sudo udevadm trigger --action=change",{shell:!0}),X_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as oE}from"child_process";async function WE(_){for(let e=1;e<=5;e++){let o=oE(`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 J(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(WE,"getUUID");var Ue=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await WE(_),T=await WE(e),s=await WE(E),S=`${n} ${M.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${M.LEDGER} ext4 defaults 0 0
6325
6325
  ${T} ${M.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${M.LEDGER} ext4 defaults 0 0
6326
6326
  ${T} ${M.ACCOUNTS} ext4 defaults 0 0
6327
- ${s} ${M.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],R=tE("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,c=[];for(let C of r)R.includes(C)||(console.log(`[INFO] Line to add: ${C}`),c.push(C));if(c.length){console.log(`[INFO] Lines to add all: ${c}`);let C=`echo "${c.join(`
6328
- `)}" | sudo tee -a /etc/fstab`;tE(C,{shell:!0,encoding:"utf8"}),tE("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6327
+ ${s} ${M.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],R=oE("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,c=[];for(let C of r)R.includes(C)||(console.log(`[INFO] Line to add: ${C}`),c.push(C));if(c.length){console.log(`[INFO] Lines to add all: ${c}`);let C=`echo "${c.join(`
6328
+ `)}" | sudo tee -a /etc/fstab`;oE(C,{shell:!0,encoding:"utf8"}),oE("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6329
6329
  ${c.join(`
6330
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as pS}from"child_process";var Ei=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=pS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var mS=t(async()=>{let _=Pe(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await m({MNT_DISK_TYPE:W.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:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await J(5e3),await fe(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await m({MNT_DISK_TYPE:W.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=f_(E),n=f_(o);await fe(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await m({MNT_DISK_TYPE:W.SINGLE}),e.includes("/mnt")){Ei(e);let E="/dev/"+_.disks[0].name;f_(E),await fe(E)}else{let E="/dev/"+_.disks[0].name;f_(E),await fe(E)}},"mountDirs"),ti=mS;import{spawnSync as hS}from"child_process";var oi=t(()=>{let _=[`sudo mkdir -p ${M.ROOT}`,`sudo chown -R solv:solv ${M.ROOT}`,`sudo chmod -R 755 ${M.ROOT}`,`sudo mkdir -p ${M.ACCOUNTS}`,`sudo chown -R solv:solv ${M.ACCOUNTS}`,`sudo chmod -R 755 ${M.ACCOUNTS}`,`sudo mkdir -p ${M.LEDGER}`,`sudo chown -R solv:solv ${M.LEDGER}`,`sudo chmod -R 755 ${M.LEDGER}`,`sudo mkdir -p ${M.SNAPSHOTS}`,`sudo chown -R solv:solv ${M.SNAPSHOTS}`,`sudo chmod -R 755 ${M.SNAPSHOTS}`];for(let e of _)hS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as oE}from"child_process";import{existsSync as BS}from"fs";function ii(){if(!BS(B.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6330
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as pS}from"child_process";var Ei=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=pS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var mS=t(async()=>{let _=fe(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await m({MNT_DISK_TYPE:W.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:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await J(5e3),await Ue(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await m({MNT_DISK_TYPE:W.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=f_(E),n=f_(o);await Ue(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await m({MNT_DISK_TYPE:W.SINGLE}),e.includes("/mnt")){Ei(e);let E="/dev/"+_.disks[0].name;f_(E),await Ue(E)}else{let E="/dev/"+_.disks[0].name;f_(E),await Ue(E)}},"mountDirs"),ti=mS;import{spawnSync as hS}from"child_process";var oi=t(()=>{let _=[`sudo mkdir -p ${M.ROOT}`,`sudo chown -R solv:solv ${M.ROOT}`,`sudo chmod -R 755 ${M.ROOT}`,`sudo mkdir -p ${M.ACCOUNTS}`,`sudo chown -R solv:solv ${M.ACCOUNTS}`,`sudo chmod -R 755 ${M.ACCOUNTS}`,`sudo mkdir -p ${M.LEDGER}`,`sudo chown -R solv:solv ${M.LEDGER}`,`sudo chmod -R 755 ${M.LEDGER}`,`sudo mkdir -p ${M.SNAPSHOTS}`,`sudo chown -R solv:solv ${M.SNAPSHOTS}`,`sudo chmod -R 755 ${M.SNAPSHOTS}`];for(let e of _)hS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as iE}from"child_process";import{existsSync as BS}from"fs";function ii(){if(!BS(B.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6331
6331
  # Increase UDP buffer sizes
6332
6332
  net.core.rmem_default = 134217728
6333
6333
  net.core.rmem_max = 134217728
@@ -6342,7 +6342,7 @@ fs.nr_open = 1000000
6342
6342
  `,e=`
6343
6343
  # Increase process file descriptor count limit
6344
6344
  * - nofile 1000000
6345
- `;oE(`echo "${_}" | sudo tee ${B.SOL_SYSTEM_CONFIG21} > /dev/null`),oE(`sudo sysctl -p ${B.SOL_SYSTEM_CONFIG21}`),oE(`echo "DefaultFILE=1000000" | sudo tee -a ${B.SOL_SYSTEM_CONF}`),oE(`echo "${e}" | sudo tee ${B.SOL_NOFILES_CONF} > /dev/null`)}}t(ii,"setupSystemd");var gS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",yS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",KS=`/home/${$.USERNAME}/.local/share/solana/install/active_release/bin`,ni=t((_=!0)=>{let{scriptPath:e}=D_(_),E=_?yS:gS,o=KS;return`[Unit]
6345
+ `;iE(`echo "${_}" | sudo tee ${B.SOL_SYSTEM_CONFIG21} > /dev/null`),iE(`sudo sysctl -p ${B.SOL_SYSTEM_CONFIG21}`),iE(`echo "DefaultFILE=1000000" | sudo tee -a ${B.SOL_SYSTEM_CONF}`),iE(`echo "${e}" | sudo tee ${B.SOL_NOFILES_CONF} > /dev/null`)}}t(ii,"setupSystemd");var gS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",yS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",KS=`/home/${$.USERNAME}/.local/share/solana/install/active_release/bin`,ni=t((_=!0)=>{let{scriptPath:e}=D_(_),E=_?yS:gS,o=KS;return`[Unit]
6346
6346
  Description=Solana Validator
6347
6347
  After=network.target
6348
6348
  StartLimitIntervalSec=0
@@ -6361,7 +6361,7 @@ Environment="${E}"
6361
6361
  ExecStart=${e}
6362
6362
 
6363
6363
  [Install]
6364
- WantedBy=multi-user.target`},"solvService");import{execSync as GS}from"child_process";function Ti(_=!0){console.log("Creating solvService configuration for solana");let e=ni(_);GS(`echo "${e}" | sudo tee ${B.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(Ti,"setupSolvService");var si=t((_=!0)=>{$_(),Ti(_),ii()},"makeServices");import{spawnSync as XE}from"node:child_process";var Si=t(_=>{try{eE(_);let e=_.NETWORK;return e===d.TESTNET?(XE(`solana config set --url ${e} -k ${g}`,{shell:!0,stdio:"inherit"}),XE(`solana airdrop 1 --url ${e} -k ${g}`,{shell:!0,stdio:"inherit"})):XE(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&Ze(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as ri}from"node:child_process";var iE=t((_=!1,e="45",E=i_,o=__,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){ri(`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}ri(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as kS}from"node:child_process";var nE=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`];kS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as VS}from"node:child_process";var bS=t(()=>{try{VS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),ai=bS;import jE from"fs";import{promisify as Ci}from"util";import{execSync as Ri}from"child_process";var wS=Ci(jE.readFile),vS=Ci(jE.access),TE="/etc/sysctl.conf",HS=`# set default and maximum socket buffer sizes to 128MB
6364
+ WantedBy=multi-user.target`},"solvService");import{execSync as GS}from"child_process";function Ti(_=!0){console.log("Creating solvService configuration for solana");let e=ni(_);GS(`echo "${e}" | sudo tee ${B.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(Ti,"setupSolvService");var si=t((_=!0)=>{W_(),Ti(_),ii()},"makeServices");import{spawnSync as XE}from"node:child_process";var Si=t(_=>{try{EE(_);let e=_.NETWORK;return e===N.TESTNET?(XE(`solana config set --url ${e} -k ${g}`,{shell:!0,stdio:"inherit"}),XE(`solana airdrop 1 --url ${e} -k ${g}`,{shell:!0,stdio:"inherit"})):XE(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&_E(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as ri}from"node:child_process";var nE=t((_=!1,e="45",E=i_,o=__,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){ri(`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}ri(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as kS}from"node:child_process";var TE=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`];kS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as VS}from"node:child_process";var bS=t(()=>{try{VS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),ai=bS;import jE from"fs";import{promisify as Ci}from"util";import{execSync as Ri}from"child_process";var wS=Ci(jE.readFile),vS=Ci(jE.access),sE="/etc/sysctl.conf",HS=`# set default and maximum socket buffer sizes to 128MB
6365
6365
  net.core.rmem_default=134217728
6366
6366
  net.core.wmem_default=134217728
6367
6367
  net.core.rmem_max=134217728
@@ -6372,19 +6372,19 @@ net.ipv4.tcp_rmem=10240 87380 134217728
6372
6372
  net.ipv4.tcp_wmem=10240 87380 134217728
6373
6373
 
6374
6374
  # Enable TCP westwood for kernels greater than or equal to 2.6.13
6375
- net.ipv4.tcp_congestion_control=westwood`;async function YS(){try{await vS(TE,jE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${TE} does not exist`)}try{let _=await wS(TE,"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+=`
6375
+ net.ipv4.tcp_congestion_control=westwood`;async function YS(){try{await vS(sE,jE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${sE} does not exist`)}try{let _=await wS(sE,"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+=`
6376
6376
  ${HS}
6377
- `,Ri(`echo "${e}" | sudo tee ${TE} > /dev/null`),Ri("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(YS,"updateSysctlConfig");var ci=YS;import{spawnSync as JS}from"child_process";var di=t(()=>{JS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as xS}from"node:child_process";var Ni=t(()=>{xS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Oi}from"child_process";var li=t((_=!1,e=!1)=>{_?qS():QS(e)},"createSymLink"),QS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),Oi(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),qS=t(()=>{Oi("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import sE from"chalk";var $S=t(()=>{let _=`${sE.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${sE.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6377
+ `,Ri(`echo "${e}" | sudo tee ${sE} > /dev/null`),Ri("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(YS,"updateSysctlConfig");var ci=YS;import{spawnSync as JS}from"child_process";var di=t(()=>{JS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as xS}from"node:child_process";var Ni=t(()=>{xS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Oi}from"child_process";var li=t((_=!1,e=!1)=>{_?qS():QS(e)},"createSymLink"),QS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),Oi(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),qS=t(()=>{Oi("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import SE from"chalk";var $S=t(()=>{let _=`${SE.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${SE.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6378
6378
 
6379
6379
  We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
6380
6380
  It's our way of supporting the community and empowering you with fast, reliable connections.
6381
6381
 
6382
6382
  To get your free API key, simply join us through the link below:
6383
6383
 
6384
- Validators DAO: ${sE.white("`https://discord.gg/X4BgkBHavp`")}
6384
+ Validators DAO: ${SE.white("`https://discord.gg/X4BgkBHavp`")}
6385
6385
 
6386
6386
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6387
- `;console.log(sE.cyan(e))},"rpcLog"),K_=$S;var Fi=t(async(_,e,E,o)=>{try{_||(console.log(zE.white("\u{1F7E2} Initializing Setup")),await V(),await go());let i=await V(),n=i.NETWORK===d.TESTNET;switch(e||(console.log(zE.white("\u{1F7E2} Entering Mount Phase")),ei(),await ti()),si(n),di(),ai(),await ci(),e||Si(i),li(i.IS_DUMMY,n),i=await V(),i.NODE_TYPE){case D.RPC:await Go(i);break;case D.VALIDATOR:await zo(i,o);break;default:throw new Error("Unknown Node Type")}e||oi(),Oe(),i.VALIDATOR_TYPE!==l.FRANKENDANCER&&(E||(i=await V(),Ni(),iE(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),e||nE(i),console.log(zE.white("\u{1F7E2} Setup Completed")),K_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var Ii=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6387
+ `;console.log(SE.cyan(e))},"rpcLog"),G_=$S;var Fi=t(async(_,e,E,o)=>{try{_||(console.log(zE.white("\u{1F7E2} Initializing Setup")),await V(),await go());let i=await V(),n=i.NETWORK===N.TESTNET;switch(e||(console.log(zE.white("\u{1F7E2} Entering Mount Phase")),ei(),await ti()),si(n),di(),ai(),await ci(),e||Si(i),li(i.IS_DUMMY,n),i=await V(),i.NODE_TYPE){case D.RPC:await Go(i);break;case D.VALIDATOR:await zo(i,o);break;default:throw new Error("Unknown Node Type")}e||oi(),le(),i.VALIDATOR_TYPE!==l.FRANKENDANCER&&(E||(i=await V(),Ni(),nE(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),e||TE(i),console.log(zE.white("\u{1F7E2} Setup Completed")),G_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var Ii=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6388
6388
  [Unit]
6389
6389
  Description=Solana transaction relayer
6390
6390
  Requires=network-online.target
@@ -6433,45 +6433,45 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
6433
6433
  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
6434
6434
 
6435
6435
  [Install]
6436
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as SE,spawnSync as U_}from"child_process";var Pi=t(async(_,e=!0)=>{U_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),U_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),U_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),U_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),U_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),U_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?Ii(_):Di(_);SE(`echo "${o}" | sudo tee ${E} > /dev/null`),U_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),U_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),SE("sudo ufw allow 11228",{stdio:"inherit"}),SE("sudo ufw allow 11229",{stdio:"inherit"}),SE("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as ZE}from"node:child_process";var WS=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"),fi=WS;import{spawnSync as XS}from"node:child_process";import{readFile as jS,writeFile as zS}from"fs/promises";var ZS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await jS(_,"utf-8")).split(`
6436
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as rE,spawnSync as U_}from"child_process";var Pi=t(async(_,e=!0)=>{U_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),U_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),U_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),U_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),U_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),U_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?Ii(_):Di(_);rE(`echo "${o}" | sudo tee ${E} > /dev/null`),U_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),U_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),rE("sudo ufw allow 11228",{stdio:"inherit"}),rE("sudo ufw allow 11229",{stdio:"inherit"}),rE("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as ZE}from"node:child_process";var WS=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"),fi=WS;import{spawnSync as XS}from"node:child_process";import{readFile as jS,writeFile as zS}from"fs/promises";var ZS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await jS(_,"utf-8")).split(`
6437
6437
  `);E.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let o=E.join(`
6438
- `);await zS(_,o),XS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Ui=ZS;import _r from"inquirer";import{writeFile as er}from"node:fs/promises";var Ai=t(async()=>{let e=(await _r.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";ZE(E,{shell:!0,stdio:"inherit"}),ZE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),ZE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=fi(e),s=JSON.stringify(T,null,2);await er(n,s,{encoding:"utf8"}),await Ui()},"yellowstoneGeyser");var Li=t(_=>{F.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let E=_.MOD||e.mod;try{if(e.vote)console.log(d_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ze(_),process.exit(0);else if(e.key)console.log(d_.white("\u{1F511} Setting up Validator Keypairs ...")),eE(_),process.exit(0);else if(e.relayer){console.log(d_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await t_()).blockEngineUrl;await Pi(i,!1),console.log(d_.green(`Jito Relayer Setup Completed
6438
+ `);await zS(_,o),XS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Ui=ZS;import _r from"inquirer";import{writeFile as er}from"node:fs/promises";var Ai=t(async()=>{let e=(await _r.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";ZE(E,{shell:!0,stdio:"inherit"}),ZE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),ZE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=fi(e),s=JSON.stringify(T,null,2);await er(n,s,{encoding:"utf8"}),await Ui()},"yellowstoneGeyser");var Li=t(_=>{I.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(N_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),_E(_),process.exit(0);else if(e.key)console.log(N_.white("\u{1F511} Setting up Validator Keypairs ...")),EE(_),process.exit(0);else if(e.relayer){console.log(N_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await t_()).blockEngineUrl;await Pi(i,!1),console.log(N_.green(`Jito Relayer Setup Completed
6439
6439
 
6440
- $ solv relayer --help`)),Oe(),K_(),process.exit(0)}else if(e.jupiter)console.log(d_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await mo(),Oe(),K_(),process.exit(0);else if(e.geyser){console.log(d_.white("\u26A1\uFE0F Setting up Geyser ...")),await Ai();return}else if(e.firedancer){console.log(d_.white("\u{1F525} Setting up Firedancer ...")),await De(E);return}await Fi(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(d_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(d_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Er}from"child_process";var _t=t(()=>{let E=Er("df -h").toString().split(`
6441
- `).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)=>G_(n.Avail)-G_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&G_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&G_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&G_(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/")&&G_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Mi from"chalk";import tr from"cli-table3";var et=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Mi.blue(o)),E=new tr({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=>Mi.white(i)))}),console.log(E.toString())},"displayTable");var ui=t(async()=>{F.command("df").description("Disk Free Command").action(()=>{let _=_t();et(_)})},"dfCommands"),G_=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 pi=t(_=>{F.command("start").description("Start Solana Validator").action(()=>{nE(_),process.exit(0)})},"startCommand");import{spawnSync as or}from"node:child_process";import ir from"chalk";var mi=t(async _=>{ir.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`];or(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var hi=t(_=>{F.command("stop").description("Stop Solana Validator").action(()=>{mi(_),process.exit(0)})},"stopCommand");import{spawnSync as Ue}from"node:child_process";import Bi from"chalk";var gi=t(_=>{let e=n_();F.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===d.TESTNET,n=o&&i?10:30;E.rm&&(console.log(Bi.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ue("solv stop",{stdio:"inherit",shell:!0}),Ue("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ue("solv get snapshot",{stdio:"inherit",shell:!0}),Ue("solv start",{stdio:"inherit",shell:!0}),console.log(Bi.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}`;Ue(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var yi=t(_=>{let E=_.NETWORK===d.TESTNET?T_:__;_.NODE_TYPE===D.RPC&&(E=h_),F.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===l.JITO,n=_.VALIDATOR_TYPE===l.BAM,T=_.VALIDATOR_TYPE===l.FRANKENDANCER,s=o.mod||_.MOD;if(i){let a=o.version||l_,R=`v${a}`,c=!!a.startsWith("3");Ye(R,s,c);return}if(n){let a=o.version||l_,R=`v${a}`,c=!!a.startsWith("3");ze(R,s,c);return}if(T){let a=o.version||F_;je(_,a,s);return}_.NODE_TYPE===D.RPC&&(E=h_);let r=o.version||E;await Ve(r,s)})},"installCommands");import{spawnSync as nr}from"child_process";var Ki=t(()=>{F.command("mtr").description("Mount Reload Command").action(()=>{nr("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),F.command("disks").description("Show unmounted disks").action(()=>{let _=Pe();console.log(_)})},"mountCommands");import{spawnSync as Sr}from"node:child_process";import Gi from"chalk";import{spawnSync as Tr}from"child_process";var sr=t(async()=>{try{let _=Tr("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"),rE=sr;var ki=t(()=>{F.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 rE()&&(console.log(Gi.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 -`;Sr(o,{shell:!0,stdio:"inherit"}),console.log(Gi.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 ar,mkdirSync as Rr}from"fs";import Cr from"inquirer";import{homedir as cr}from"os";import{spawnSync as rr}from"node:child_process";function Vi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return rr(i,{shell:!0,stdio:"inherit"}).status===0}t(Vi,"executeSCP");var Et=t(async(_="")=>{let e=_;_===""&&(e=(await Cr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(u()),o=cr(),i=o.includes("/home/solv")?"/home/solv":o+Ae.SOLV_KEYPAIR_DOWNLOAD_PATH;ar(i)||Rr(i,{recursive:!0});let n=!0,T=o+"/"+It;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 a=`${i}/${r}`;Vi(e,s,a,n)&&console.log(`Successfully Exported - ${a} \u{1F389}`)}},"download");import{spawnSync as dr}from"child_process";import{existsSync as Nr}from"fs";import Or from"inquirer";import lr from"os";var bi=t(async(_="")=>{let e=lr.userInfo().homedir,E=_;_===""&&(E=(await Or.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(u(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(!Nr(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;dr(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as Fr}from"child_process";import Ir from"inquirer";var wi=t(async()=>{let _=await Ir.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${H.ROOT}/.ssh && echo "${_.pubkey}" >> ${H.AUTHORIZED_KEYS}`;Fr(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import aE from"chalk";import{readFileSync as Dr}from"fs";import Pr from"os";var vi=t(()=>{try{let e=`${Pr.userInfo().homedir}/.ssh/id_rsa.pub`,E=Dr(e,"utf8");console.log(aE.white(`Your SSH Public Key is:
6442
- `)),console.log(aE.white(E))}catch(_){console.error(aE.white(`Error reading SSH Public Key
6443
- `)),console.error(aE.white(_))}},"cat");import{spawnSync as fr}from"child_process";var Hi=t(()=>{fr("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Ur}from"child_process";import{readFileSync as Ar}from"fs";import{Readable as Lr}from"stream";var Yi=t(async _=>new Promise((e,E)=>{try{let o=Ur("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6444
- `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),Mr=t(_=>{try{return JSON.parse(Ar(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),Ji=t(async(_,e)=>{let E=[],o=Lr.from(_);return o.on("data",async i=>{Mr(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import RE from"chalk";import{Presets as hr,SingleBar as Br}from"cli-progress";import xi from"chalk";import{spawnSync as ur}from"node:child_process";import pr from"node-fetch";var mr=t(async()=>{let _=await pr(At,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(xi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6445
- Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)ur(E,{shell:!0,stdio:"ignore"});return console.log(xi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),Qi=mr;var qi=t(()=>{let _=F.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 Et(e.ip);return}await Et()}),_.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 Qi();return}await bi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await wi()}),_.command("cat").description("Show SSH Public Key").action(()=>{vi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Hi()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Br({},hr.shades_classic);e.start(1e4,0);let E=await Yi(e),o=await Ji(E,e);e.stop(),console.log(RE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(RE.green(`
6440
+ $ solv relayer --help`)),le(),G_(),process.exit(0)}else if(e.jupiter)console.log(N_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await mo(),le(),G_(),process.exit(0);else if(e.geyser){console.log(N_.white("\u26A1\uFE0F Setting up Geyser ...")),await Ai();return}else if(e.firedancer){console.log(N_.white("\u{1F525} Setting up Firedancer ...")),await Pe(E);return}await Fi(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(N_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(N_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Er}from"child_process";var _t=t(()=>{let E=Er("df -h").toString().split(`
6441
+ `).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)=>k_(n.Avail)-k_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&k_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&k_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&k_(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/")&&k_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Mi from"chalk";import tr from"cli-table3";var et=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Mi.blue(o)),E=new tr({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=>Mi.white(i)))}),console.log(E.toString())},"displayTable");var ui=t(async()=>{I.command("df").description("Disk Free Command").action(()=>{let _=_t();et(_)})},"dfCommands"),k_=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 pi=t(_=>{I.command("start").description("Start Solana Validator").action(()=>{TE(_),process.exit(0)})},"startCommand");import{spawnSync as or}from"node:child_process";import ir from"chalk";var mi=t(async _=>{ir.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`];or(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var hi=t(_=>{I.command("stop").description("Stop Solana Validator").action(()=>{mi(_),process.exit(0)})},"stopCommand");import{spawnSync as Ae}from"node:child_process";import Bi from"chalk";var gi=t(_=>{let e=n_();I.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===N.TESTNET,n=o&&i?10:30;E.rm&&(console.log(Bi.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ae("solv stop",{stdio:"inherit",shell:!0}),Ae("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ae("solv get snapshot",{stdio:"inherit",shell:!0}),Ae("solv start",{stdio:"inherit",shell:!0}),console.log(Bi.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}`;Ae(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var yi=t(_=>{let E=_.NETWORK===N.TESTNET?T_:__;_.NODE_TYPE===D.RPC&&(E=B_),I.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===l.JITO,n=_.VALIDATOR_TYPE===l.BAM,T=_.VALIDATOR_TYPE===l.FRANKENDANCER,s=o.mod||_.MOD;if(i){let a=o.version||m_,R=c_,c=`v${a}-jito`,C=`v${a}-mod`,F=s?`${C}${R}`:`${c}${R}`,d=!!a.startsWith("3");Je(F,s,d);return}if(n){let a=o.version||Ce,R=h_,c=`v${a}-bam`,C=`v${a}-mod`,F=s?`${C}${R}`:`${c}${R}`,d=!!a.startsWith("3");Ze(F,s,d);return}if(T){let a=o.version||F_;ze(_,a,s);return}_.NODE_TYPE===D.RPC&&(E=B_);let r=o.version||E;await be(r,s)})},"installCommands");import{spawnSync as nr}from"child_process";var Ki=t(()=>{I.command("mtr").description("Mount Reload Command").action(()=>{nr("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),I.command("disks").description("Show unmounted disks").action(()=>{let _=fe();console.log(_)})},"mountCommands");import{spawnSync as Sr}from"node:child_process";import Gi from"chalk";import{spawnSync as Tr}from"child_process";var sr=t(async()=>{try{let _=Tr("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"),aE=sr;var ki=t(()=>{I.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 aE()&&(console.log(Gi.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 -`;Sr(o,{shell:!0,stdio:"inherit"}),console.log(Gi.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var Le={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 ar,mkdirSync as Rr}from"fs";import Cr from"inquirer";import{homedir as cr}from"os";import{spawnSync as rr}from"node:child_process";function Vi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return rr(i,{shell:!0,stdio:"inherit"}).status===0}t(Vi,"executeSCP");var Et=t(async(_="")=>{let e=_;_===""&&(e=(await Cr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(u()),o=cr(),i=o.includes("/home/solv")?"/home/solv":o+Le.SOLV_KEYPAIR_DOWNLOAD_PATH;ar(i)||Rr(i,{recursive:!0});let n=!0,T=o+"/"+It;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 a=`${i}/${r}`;Vi(e,s,a,n)&&console.log(`Successfully Exported - ${a} \u{1F389}`)}},"download");import{spawnSync as dr}from"child_process";import{existsSync as Nr}from"fs";import Or from"inquirer";import lr from"os";var bi=t(async(_="")=>{let e=lr.userInfo().homedir,E=_;_===""&&(E=(await Or.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${Le.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=Le.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(u(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(!Nr(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;dr(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as Fr}from"child_process";import Ir from"inquirer";var wi=t(async()=>{let _=await Ir.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${H.ROOT}/.ssh && echo "${_.pubkey}" >> ${H.AUTHORIZED_KEYS}`;Fr(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import RE from"chalk";import{readFileSync as Dr}from"fs";import Pr from"os";var vi=t(()=>{try{let e=`${Pr.userInfo().homedir}/.ssh/id_rsa.pub`,E=Dr(e,"utf8");console.log(RE.white(`Your SSH Public Key is:
6442
+ `)),console.log(RE.white(E))}catch(_){console.error(RE.white(`Error reading SSH Public Key
6443
+ `)),console.error(RE.white(_))}},"cat");import{spawnSync as fr}from"child_process";var Hi=t(()=>{fr("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Ur}from"child_process";import{readFileSync as Ar}from"fs";import{Readable as Lr}from"stream";var Yi=t(async _=>new Promise((e,E)=>{try{let o=Ur("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6444
+ `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),Mr=t(_=>{try{return JSON.parse(Ar(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),Ji=t(async(_,e)=>{let E=[],o=Lr.from(_);return o.on("data",async i=>{Mr(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import CE from"chalk";import{Presets as hr,SingleBar as Br}from"cli-progress";import xi from"chalk";import{spawnSync as ur}from"node:child_process";import pr from"node-fetch";var mr=t(async()=>{let _=await pr(At,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(xi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6445
+ Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)ur(E,{shell:!0,stdio:"ignore"});return console.log(xi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),Qi=mr;var qi=t(()=>{let _=I.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 Et(e.ip);return}await Et()}),_.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 Qi();return}await bi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await wi()}),_.command("cat").description("Show SSH Public Key").action(()=>{vi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Hi()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Br({},hr.shades_classic);e.start(1e4,0);let E=await Yi(e),o=await Ji(E,e);e.stop(),console.log(CE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(CE.green(`
6446
6446
  ${o.join(`
6447
- `)}`)),console.log(RE.white(`
6447
+ `)}`)),console.log(CE.white(`
6448
6448
  Only showing the first 10 results
6449
6449
 
6450
- `)),console.log(RE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as gr}from"child_process";var $i=t(_=>{F.command("status").description("Check Solana Validator Status").action(()=>{yr(_)})},"statusCommands"),yr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`;gr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Kr}from"node:child_process";var Wi=t(async(_,e)=>{try{let E=await V(),o=E.NETWORK===d.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?d.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return Kr(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import ji from"inquirer";import{spawnSync as Gr}from"node:child_process";var Xi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=Gr(`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 kr,existsAsync as Vr}from"@skeet-framework/utils";import{execSync as br,spawnSync as cE}from"node:child_process";import wr from"node:os";var zi=t(async _=>{let e=_.NETWORK===d.TESTNET;if(!(await ji.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;cE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await ji.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Hr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return q_({STAKE_ACCOUNT:S}),Xi(T,Number(i.solAmount))},"stakeAccountQuestion"),vr=wr.userInfo().homedir,CE=vr+"/stake-account",Hr=t(async()=>{await Vr(CE)||cE(`mkdir -p ${CE}`,{shell:!0});let _=cE(`ls ${CE}`,{shell:!0}).stdout.toString().split(`
6451
- `).filter(n=>n.includes(".json")),e=kr(_.length+1),E=`${CE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return cE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:br(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Yr}from"node:child_process";var Zi=t(async _=>{try{let E=(await V()).NETWORK===d.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Yr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Jr}from"node:child_process";var _n=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return Jr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import Z_ from"chalk";import{Connection as xr,PublicKey as Qr}from"@solana/web3.js";import{stakePoolInfo as qr}from"@solana/spl-stake-pool";var dE=t(async(_,e=E_)=>{try{let E=new xr(_),o=new Qr(e);return await qr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as $r}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Wr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Xr}from"@metaplex-foundation/umi";var en=t(async(_,e)=>{try{let E=Xr(e);console.log(`mintPubkey: ${E}`);let o=Wr(_),i=await $r(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import Le from"chalk";import En from"inquirer";var tn=t(async _=>{let e=await En.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:E_}]);try{let E=await dE(_,e.stakePoolAddress);if(!E)return console.log(Le.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6450
+ `)),console.log(CE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as gr}from"child_process";var $i=t(_=>{I.command("status").description("Check Solana Validator Status").action(()=>{yr(_)})},"statusCommands"),yr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`;gr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Kr}from"node:child_process";var Wi=t(async(_,e)=>{try{let E=await V(),o=E.NETWORK===N.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?N.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return Kr(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import ji from"inquirer";import{spawnSync as Gr}from"node:child_process";var Xi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=Gr(`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 kr,existsAsync as Vr}from"@skeet-framework/utils";import{execSync as br,spawnSync as dE}from"node:child_process";import wr from"node:os";var zi=t(async _=>{let e=_.NETWORK===N.TESTNET;if(!(await ji.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;dE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await ji.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Hr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return $_({STAKE_ACCOUNT:S}),Xi(T,Number(i.solAmount))},"stakeAccountQuestion"),vr=wr.userInfo().homedir,cE=vr+"/stake-account",Hr=t(async()=>{await Vr(cE)||dE(`mkdir -p ${cE}`,{shell:!0});let _=dE(`ls ${cE}`,{shell:!0}).stdout.toString().split(`
6451
+ `).filter(n=>n.includes(".json")),e=kr(_.length+1),E=`${cE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return dE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:br(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Yr}from"node:child_process";var Zi=t(async _=>{try{let E=(await V()).NETWORK===N.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Yr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Jr}from"node:child_process";var _n=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return Jr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import _e from"chalk";import{Connection as xr,PublicKey as Qr}from"@solana/web3.js";import{stakePoolInfo as qr}from"@solana/spl-stake-pool";var NE=t(async(_,e=E_)=>{try{let E=new xr(_),o=new Qr(e);return await qr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as $r}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Wr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Xr}from"@metaplex-foundation/umi";var en=t(async(_,e)=>{try{let E=Xr(e);console.log(`mintPubkey: ${E}`);let o=Wr(_),i=await $r(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import Me from"chalk";import En from"inquirer";var tn=t(async _=>{let e=await En.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:E_}]);try{let E=await NE(_,e.stakePoolAddress);if(!E)return console.log(Me.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6452
6452
  Please check the correct address and try again.
6453
- `)),console.log(Le.white(`For stake pool information
6453
+ `)),console.log(Me.white(`For stake pool information
6454
6454
  \u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await en(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
6455
6455
  Name: ${n.name}
6456
6456
  Token Mint: ${n.mint}`;return(await En.prompt([{type:"confirm",name:"confirm",message:T+`
6457
- Is this the correct Stake Pool?`}])).confirm?n:(console.log(Le.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(Le.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6457
+ Is this the correct Stake Pool?`}])).confirm?n:(console.log(Me.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(Me.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6458
6458
  Please check the correct address and try again.
6459
- `)),console.log(Le.white(`For stake pool information
6460
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Sa}from"fs/promises";import pe from"inquirer";import{existsAsync as ra}from"@skeet-framework/utils";import{Connection as Sn,Keypair as oa,PublicKey as ue}from"@solana/web3.js";import{Connection as jr,PublicKey as zr,Keypair as Zr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as _a}from"@solana/spl-token";var Me=t(async(_,e,E,o,i=!1)=>{try{let n=Zr.fromSecretKey(new Uint8Array(e)),T=new zr(E),s=new jr(_);return(await _a(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 ia}from"cli-spinner";import k_ from"chalk";import{PublicKey as nn,Keypair as Tn,Transaction as on,ComputeBudgetProgram as ea,LAMPORTS_PER_SOL as Ea}from"@solana/web3.js";import*as sn from"@solana/spl-stake-pool";var X_=t(async(_,e,E,o=new nn(E_),i,n,T)=>{try{let s=Tn.fromSecretKey(new Uint8Array(e)),S=E*Ea,{instructions:r,signers:a}=await ta(_,e,S,o,i,n,T),R=new on().add(...r);R.feePayer=s.publicKey;let c=await _.getLatestBlockhashAndContext({commitment:"finalized"});R.recentBlockhash=c.value.blockhash,R.sign(...a,s);let C=new on().add(...r).add(ea.setComputeUnitPrice({microLamports:1e3}));C.feePayer=s.publicKey,C.recentBlockhash=c.value.blockhash,C.sign(...a,s);let I=await _.sendRawTransaction(C.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...c.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),ta=t(async(_,e,E,o=new nn(E_),i,n,T)=>{let S=Tn.fromSecretKey(new Uint8Array(e)).publicKey;return await sn.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as rn}from"@skeet-framework/utils";var NE=t(async(_,e,E,o)=>{console.log(k_.white("Solana RPC URL:",_));let i=new Sn(_);E===0&&(E=await OE());let n=new ia("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(k_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new ue(e),s=oa.fromSecretKey(new Uint8Array(o)),S=S_;n.setSpinnerTitle(k_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await Me(_,o,S,s.publicKey);await rn(1e3),n.setSpinnerTitle(k_.green("\u{1F504} Converting SOL to elSOL"));let a=await X_(i,o,E,T,new ue(r),new ue(bE),s.publicKey),R=0;for(;a.status!=="success";){if(R++,R>10)return n.stop(!0),console.log(k_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(k_.yellow(`\u23F3 ${R} Times Retrying...`)),await rn(3e3),i=new Sn(_),a=await X_(i,o,E,T,new ue(r),new ue(bE),s.publicKey)}return n.stop(!0),console.log(k_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6459
+ `)),console.log(Me.white(`For stake pool information
6460
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Sa}from"fs/promises";import me from"inquirer";import{existsAsync as ra}from"@skeet-framework/utils";import{Connection as Sn,Keypair as oa,PublicKey as pe}from"@solana/web3.js";import{Connection as jr,PublicKey as zr,Keypair as Zr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as _a}from"@solana/spl-token";var ue=t(async(_,e,E,o,i=!1)=>{try{let n=Zr.fromSecretKey(new Uint8Array(e)),T=new zr(E),s=new jr(_);return(await _a(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 ia}from"cli-spinner";import V_ from"chalk";import{PublicKey as nn,Keypair as Tn,Transaction as on,ComputeBudgetProgram as ea,LAMPORTS_PER_SOL as Ea}from"@solana/web3.js";import*as sn from"@solana/spl-stake-pool";var j_=t(async(_,e,E,o=new nn(E_),i,n,T)=>{try{let s=Tn.fromSecretKey(new Uint8Array(e)),S=E*Ea,{instructions:r,signers:a}=await ta(_,e,S,o,i,n,T),R=new on().add(...r);R.feePayer=s.publicKey;let c=await _.getLatestBlockhashAndContext({commitment:"finalized"});R.recentBlockhash=c.value.blockhash,R.sign(...a,s);let C=new on().add(...r).add(ea.setComputeUnitPrice({microLamports:1e3}));C.feePayer=s.publicKey,C.recentBlockhash=c.value.blockhash,C.sign(...a,s);let F=await _.sendRawTransaction(C.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...c.value,signature:F},"finalized"),{status:"success",signature:F}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),ta=t(async(_,e,E,o=new nn(E_),i,n,T)=>{let S=Tn.fromSecretKey(new Uint8Array(e)).publicKey;return await sn.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as rn}from"@skeet-framework/utils";var OE=t(async(_,e,E,o)=>{console.log(V_.white("Solana RPC URL:",_));let i=new Sn(_);E===0&&(E=await lE());let n=new ia("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(V_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new pe(e),s=oa.fromSecretKey(new Uint8Array(o)),S=S_;n.setSpinnerTitle(V_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await ue(_,o,S,s.publicKey);await rn(1e3),n.setSpinnerTitle(V_.green("\u{1F504} Converting SOL to elSOL"));let a=await j_(i,o,E,T,new pe(r),new pe(bE),s.publicKey),R=0;for(;a.status!=="success";){if(R++,R>10)return n.stop(!0),console.log(V_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(V_.yellow(`\u23F3 ${R} Times Retrying...`)),await rn(3e3),i=new Sn(_),a=await j_(i,o,E,T,new pe(r),new pe(bE),s.publicKey)}return n.stop(!0),console.log(V_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6461
6461
 
6462
- Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as na,Keypair as Ta,PublicKey as j_}from"@solana/web3.js";import{Spinner as sa}from"cli-spinner";import z_ from"chalk";import{sleep as an}from"@skeet-framework/utils";var Rn=t(async(_,e,E,o,i)=>{let n=new na(_);E===0&&(E=await OE());let T=new sa("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(z_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new j_(e),S=await dE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(z_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,a=Ta.fromSecretKey(new Uint8Array(o)),R=await Me(_,o,r,a.publicKey),c=await Me(_,o,r,new j_(qt),!0);await an(1e3),T.setSpinnerTitle(z_.green(`\u{1F504} Converting SOL to ${i}`));let C=await X_(n,o,E,s,new j_(R),new j_(c),a.publicKey),I=0;for(;C.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(z_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(z_.yellow(`\u23F3 ${I} Times Retrying...
6463
- `)),await an(1e3),C=await X_(n,o,E,s,new j_(R),new j_(c),a.publicKey)}return T.stop(!0),console.log(z_.white(`\u{1F4B0} You've got ${i} \u2728
6462
+ Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as na,Keypair as Ta,PublicKey as z_}from"@solana/web3.js";import{Spinner as sa}from"cli-spinner";import Z_ from"chalk";import{sleep as an}from"@skeet-framework/utils";var Rn=t(async(_,e,E,o,i)=>{let n=new na(_);E===0&&(E=await lE());let T=new sa("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(Z_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new z_(e),S=await NE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(Z_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,a=Ta.fromSecretKey(new Uint8Array(o)),R=await ue(_,o,r,a.publicKey),c=await ue(_,o,r,new z_(qt),!0);await an(1e3),T.setSpinnerTitle(Z_.green(`\u{1F504} Converting SOL to ${i}`));let C=await j_(n,o,E,s,new z_(R),new z_(c),a.publicKey),F=0;for(;C.status!=="success";){if(F++,F>10)return T.stop(!0),console.log(Z_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Z_.yellow(`\u23F3 ${F} Times Retrying...
6463
+ `)),await an(1e3),C=await j_(n,o,E,s,new z_(R),new z_(c),a.publicKey)}return T.stop(!0),console.log(Z_.white(`\u{1F4B0} You've got ${i} \u2728
6464
6464
 
6465
- Signature:`,C.signature)),!0},"depositeLST");import{execSync as lE}from"node:child_process";import{homedir as aa}from"os";var Cn=t(_=>{F.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let E=Number(e.amount);console.log("RPC URL:",_.RPC_URL);let o=E_,i=_.NETWORK===d.TESTNET,n=aa(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(lE(`solana config set --keypair ${T}`),!await ra(T)){console.log(Z_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6466
- `)),console.log(Z_.white(T));return}let s=JSON.parse(await Sa(T,"utf-8"));if(e.elsol){await NE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await tn(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await Rn(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await zi(_))return;let r=await V(),{validatorVoteAccount:a,stakeAccounts:R}=await Ca(r);for await(let c of R)try{await Wi(c,a)}catch{console.log(Z_.yellow(`Network might be busy, please try again later
6465
+ Signature:`,C.signature)),!0},"depositeLST");import{execSync as FE}from"node:child_process";import{homedir as aa}from"os";var Cn=t(_=>{I.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=E_,i=_.NETWORK===N.TESTNET,n=aa(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(FE(`solana config set --keypair ${T}`),!await ra(T)){console.log(_e.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6466
+ `)),console.log(_e.white(T));return}let s=JSON.parse(await Sa(T,"utf-8"));if(e.elsol){await OE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await tn(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await Rn(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await zi(_))return;let r=await V(),{validatorVoteAccount:a,stakeAccounts:R}=await Ca(r);for await(let c of R)try{await Wi(c,a)}catch{console.log(_e.yellow(`Network might be busy, please try again later
6467
6467
  You can use a custom RPC endpoint to avoid this issue
6468
- `))}}}),F.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await da();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await Ra();for await(let o of E)try{await Zi(o)}catch{console.log(Z_.yellow(`Network might be busy, please try again later
6468
+ `))}}}),I.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await da();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await Ra();for await(let o of E)try{await Zi(o)}catch{console.log(_e.yellow(`Network might be busy, please try again later
6469
6469
  You can use a custom RPC endpoint to avoid this issue
6470
- `))}}else{let E=await Na();await _n(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),OE=t(async()=>{let _=lE("solana address").toString().trim(),e=lE("solana balance").toString().replace("SOL","").trim();console.log(Z_.white(`\u{1F4D7} Selected Wallet: ${_}
6471
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Z_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await pe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),Ra=t(async()=>{let _=await V();return await pe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Ca=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===d.TESTNET?ca(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await pe.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"),ca=t(_=>{let o=`/home/solv/${_.NETWORK===d.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return lE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),da=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await pe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),Na=t(async()=>{let _=(await V()).STAKE_ACCOUNTS;return await pe.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 Oa}from"child_process";var cn=t(()=>{try{return Oa("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as la}from"child_process";var dn=t(()=>{try{return la("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import N_ from"chalk";import{Spinner as Fa}from"cli-spinner";var _e;(function(_){_.successHex=N_.hex("#39A845"),_.warningHex=N_.hex("#FFD02E"),_.errorHex=N_.hex("#B5332E"),_.syncHex=N_.hex("#3073B7"),_.greyHex=N_.hex("#BEBDBD"),_.indigoHex=N_.hex("#3950A0"),_.pinkHex=N_.hex("#D8A1C4"),_.normal=e=>{console.log(N_.white(e))},_.syncSpinner=e=>{let E=new Fa(N_.white(e)+` %s
6470
+ `))}}else{let E=await Na();await _n(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),lE=t(async()=>{let _=FE("solana address").toString().trim(),e=FE("solana balance").toString().replace("SOL","").trim();console.log(_e.white(`\u{1F4D7} Selected Wallet: ${_}
6471
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(_e.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await me.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),Ra=t(async()=>{let _=await V();return await me.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Ca=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===N.TESTNET?ca(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await me.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"),ca=t(_=>{let o=`/home/solv/${_.NETWORK===N.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return FE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),da=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await me.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),Na=t(async()=>{let _=(await V()).STAKE_ACCOUNTS;return await me.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 Oa}from"child_process";var cn=t(()=>{try{return Oa("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as la}from"child_process";var dn=t(()=>{try{return la("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import O_ from"chalk";import{Spinner as Fa}from"cli-spinner";var ee;(function(_){_.successHex=O_.hex("#39A845"),_.warningHex=O_.hex("#FFD02E"),_.errorHex=O_.hex("#B5332E"),_.syncHex=O_.hex("#3073B7"),_.greyHex=O_.hex("#BEBDBD"),_.indigoHex=O_.hex("#3950A0"),_.pinkHex=O_.hex("#D8A1C4"),_.normal=e=>{console.log(O_.white(e))},_.syncSpinner=e=>{let E=new Fa(O_.white(e)+` %s
6472
6472
  `);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(`
6473
6473
  ${e}`),console.log(`${E}`),console.log(`${o}`),console.log(`${i}`),console.log(`${n}`),console.log(`${T}
6474
- `),console.log(`Solv Version: v${ge}
6474
+ `),console.log(`Solv Version: v${ye}
6475
6475
  `)},_.installMessage=()=>{let e=_.warningHex("\u{1F525} Welcome to Solana Validator Tool Solv \u{1F525}"),E=`
6476
6476
  Solv is born and ready for running Solana Validator \u{1F680}
6477
6477
 
@@ -6492,17 +6492,17 @@ $ solv mt -p <fileSystem>
6492
6492
  $ solv umt -p <fileSystem>
6493
6493
  `,i=`mount reload
6494
6494
  $ solv mtr
6495
- `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(_e||(_e={}));import o_ from"chalk";import{spawnSync as Ia}from"node:child_process";var FE=t(_=>{Ia("solana config get",{shell:!0,stdio:"inherit"});let E=D_();console.log(o_.white("start-validator.sh: ")+E.scriptPath),console.log(o_.white("solv.service: ")+B.SOL_SERVICE),console.log(o_.white("logrotate: ")+B.SOL_LOGROTATE),console.log(o_.white("logrotate (fd): ")+B.FRANKENDANCER_LOGROTATE),console.log(o_.white("sysctl.d: ")+B.SOL_SYSTEM_CONFIG21),console.log(o_.white("limits.d: ")+B.SOL_NOFILES_CONF),console.log(o_.white("system.conf: ")+B.SOL_SYSTEM_CONF),console.log(o_.white("ledger: ")+E.ledger),console.log(o_.white("accounts: ")+E.accounts),console.log(o_.white("snapshots: ")+E.snapshots),console.log(o_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Nn}from"node:child_process";import Da from"chalk";var On=t(_=>{let e=_.NETWORK===d.TESTNET,E=e?T_:__;_.NODE_TYPE===D.RPC&&(E=h_);let o=F.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=cn();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Nn(i,{shell:!0,stdio:"pipe"});console.log(Da.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=dn();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;iE(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${n_()} --ledger /mnt/ledger/ contact-info`;Nn(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{FE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{_e.solvAA(),i.client?_e.installClientMessage():_e.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Pa}from"node:child_process";var ln=t(()=>{Pa("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as fa}from"node:child_process";var Fn=t(()=>{fa("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Ua}from"node:child_process";var In=t(()=>{Ua("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Aa}from"node:child_process";var Dn=t(()=>{Aa("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as La}from"node:child_process";var Pn=t((_=!1)=>{La(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import tt from"chalk";import{spawnSync as ua}from"child_process";import{spawnSync as Ma}from"node:child_process";var fn=t(()=>{Ma("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Un=t(()=>{let _=F.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{ln()}),_.command("start").description("Start Relayer").action(()=>{Fn()}),_.command("stop").description("Stop Relayer").action(()=>{In()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{Pn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{Dn()}),_.command("enable").description("Enable Relayer").action(()=>{fn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(tt.red("Please provide a URL"));return}let E=`${n_()} --ledger ${f} set-relayer-config --relayer-url ${e.url}`;console.log(tt.white("Setting Relayer URL ...")),ua(E,{shell:!0,stdio:"inherit"}),console.log(tt.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as ha}from"child_process";import{spawnSync as pa}from"child_process";var IE=t(()=>{pa("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as ma}from"child_process";var An=t(()=>{ma("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var Ln=t(_=>{IE();let e=`sudo rm -rf ${B.SOL_LOGROTATE}`;ha(e,{shell:!0,stdio:"inherit"}),$_(_),An()},"updateLogrotate");var Mn=t(_=>{F.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";Ln(e),process.exit(0)})},"logrotateCommand");import{spawnSync as ot}from"node:child_process";var un=t(_=>{ot("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&ot(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),ot("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as Ba}from"node:child_process";var pn=t(_=>{let E=`${n_()} --ledger ${_.LEDGER_PATH} monitor`;Ba(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as ga}from"node:child_process";var mn=t(()=>{ga("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import DE from"inquirer";import{execSync as PE,spawnSync as it}from"child_process";import me from"chalk";import{homedir as ya}from"os";var hn=1e3,nt;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(nt||(nt={}));var fE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(fE||(fE={}));var Ka=Object.values(nt),Bn=t(_=>{F.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(me.blue(`\u2728 Coming Soon
6495
+ `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(ee||(ee={}));import o_ from"chalk";import{spawnSync as Ia}from"node:child_process";var IE=t(_=>{Ia("solana config get",{shell:!0,stdio:"inherit"});let E=D_();console.log(o_.white("start-validator.sh: ")+E.scriptPath),console.log(o_.white("solv.service: ")+B.SOL_SERVICE),console.log(o_.white("logrotate: ")+B.SOL_LOGROTATE),console.log(o_.white("logrotate (fd): ")+B.FRANKENDANCER_LOGROTATE),console.log(o_.white("sysctl.d: ")+B.SOL_SYSTEM_CONFIG21),console.log(o_.white("limits.d: ")+B.SOL_NOFILES_CONF),console.log(o_.white("system.conf: ")+B.SOL_SYSTEM_CONF),console.log(o_.white("ledger: ")+E.ledger),console.log(o_.white("accounts: ")+E.accounts),console.log(o_.white("snapshots: ")+E.snapshots),console.log(o_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Nn}from"node:child_process";import Da from"chalk";var On=t(_=>{let e=_.NETWORK===N.TESTNET,E=e?T_:__;_.NODE_TYPE===D.RPC&&(E=B_);let o=I.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=cn();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Nn(i,{shell:!0,stdio:"pipe"});console.log(Da.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=dn();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;nE(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${n_()} --ledger /mnt/ledger/ contact-info`;Nn(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{IE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{ee.solvAA(),i.client?ee.installClientMessage():ee.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Pa}from"node:child_process";var ln=t(()=>{Pa("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as fa}from"node:child_process";var Fn=t(()=>{fa("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Ua}from"node:child_process";var In=t(()=>{Ua("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Aa}from"node:child_process";var Dn=t(()=>{Aa("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as La}from"node:child_process";var Pn=t((_=!1)=>{La(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import tt from"chalk";import{spawnSync as ua}from"child_process";import{spawnSync as Ma}from"node:child_process";var fn=t(()=>{Ma("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Un=t(()=>{let _=I.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{ln()}),_.command("start").description("Start Relayer").action(()=>{Fn()}),_.command("stop").description("Stop Relayer").action(()=>{In()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{Pn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{Dn()}),_.command("enable").description("Enable Relayer").action(()=>{fn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(tt.red("Please provide a URL"));return}let E=`${n_()} --ledger ${f} set-relayer-config --relayer-url ${e.url}`;console.log(tt.white("Setting Relayer URL ...")),ua(E,{shell:!0,stdio:"inherit"}),console.log(tt.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as ha}from"child_process";import{spawnSync as pa}from"child_process";var DE=t(()=>{pa("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as ma}from"child_process";var An=t(()=>{ma("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var Ln=t(_=>{DE();let e=`sudo rm -rf ${B.SOL_LOGROTATE}`;ha(e,{shell:!0,stdio:"inherit"}),W_(_),An()},"updateLogrotate");var Mn=t(_=>{I.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";Ln(e),process.exit(0)})},"logrotateCommand");import{spawnSync as ot}from"node:child_process";var un=t(_=>{ot("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&ot(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),ot("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as Ba}from"node:child_process";var pn=t(_=>{let E=`${n_()} --ledger ${_.LEDGER_PATH} monitor`;Ba(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as ga}from"node:child_process";var mn=t(()=>{ga("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import PE from"inquirer";import{execSync as fE,spawnSync as it}from"child_process";import he from"chalk";import{homedir as ya}from"os";var hn=1e3,nt;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(nt||(nt={}));var UE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(UE||(UE={}));var Ka=Object.values(nt),Bn=t(_=>{I.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(he.blue(`\u2728 Coming Soon
6496
6496
  This Feature is Currently Under Development
6497
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await Ga(),n="0";try{let R=it(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(R.status!==0)throw new Error("Invalid Wallet Address");n=R.stdout.toString(),console.log("toBalance:",n)}catch{console.log(me.red(`\u274C To Wallet is Invalid
6498
- Please Check the Wallet Address`)),process.exit(0)}let T=PE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(me.white(`\u{1F3E6} From Wallet: ${o}
6499
- \u{1F4B0} Balance: ${T}`)),console.log(me.white(`\u{1F3E6} To Wallet: ${i}
6500
- \u{1F4B0} Balance: ${n}`));let{amount:s}=await DE.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=it(S,{shell:!0,stdio:"inherit"}),a=Ke;for(;r.status!==0&&a>0;)console.log(me.red(`\u274C Transaction Failed
6497
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await Ga(),n="0";try{let R=it(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(R.status!==0)throw new Error("Invalid Wallet Address");n=R.stdout.toString(),console.log("toBalance:",n)}catch{console.log(he.red(`\u274C To Wallet is Invalid
6498
+ Please Check the Wallet Address`)),process.exit(0)}let T=fE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(he.white(`\u{1F3E6} From Wallet: ${o}
6499
+ \u{1F4B0} Balance: ${T}`)),console.log(he.white(`\u{1F3E6} To Wallet: ${i}
6500
+ \u{1F4B0} Balance: ${n}`));let{amount:s}=await PE.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=it(S,{shell:!0,stdio:"inherit"}),a=Ge;for(;r.status!==0&&a>0;)console.log(he.red(`\u274C Transaction Failed
6501
6501
  Retrying Transaction in ${hn}ms
6502
- Retries Left: ${a}`)),await J(hn),r=it(S,{shell:!0,stdio:"inherit"}),a--;process.exit(0)})},"transferCommands"),Tt=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Ga=t(async()=>{let _=ya(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=PE(`solana address -k ${o}`).toString().trim(),n=await DE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:Ka}]),T=n.from==="Validator Account"?Object.values(fE).filter(R=>R!=="Validator Account"):Object.values(fE).filter(R=>R!=="Authority Account");if((await DE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:R}=await DE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:Tt}]);i=R}else{let R=n.from==="Validator Account"?e:E;o=`${_}/${R}`,i=PE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,a=PE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:a,toAddress:i}},"selectFromKeypairs");import gn from"chalk";import ka from"inquirer";import{execSync as st,spawnSync as Va}from"node:child_process";var yn=t(async(_,e=!1)=>{let E=_.NETWORK===d.TESTNET,o=E?He:_.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=st(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(gn.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(gn.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let C=await ka.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(C.sol)}let a=st(`solana address --keypair ${T}`).toString().trim(),R=st(`solana address --keypair ${n}`).toString().trim(),c=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${a} ${R} ${S} --authorized-withdrawer ${n} --url ${o}`;Va(c,{shell:!0,stdio:"inherit"})},"withdraw");var Kn=t(_=>{F.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await yn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as ja,spawnSync as za}from"node:child_process";import{BN as kn}from"bn.js";import{LAMPORTS_PER_SOL as St}from"@solana/web3.js";import{Connection as Ha,LAMPORTS_PER_SOL as Ya}from"@solana/web3.js";import{Keypair as ba}from"@solana/web3.js";import{readFile as wa}from"fs/promises";var va=t(async _=>{let e=JSON.parse(await wa(_,"utf8"));return ba.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),Gn=va;import{homedir as Ja}from"os";var a_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(a_||(a_={}));var xa={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},Qa=t(async(_,e="auth",E=!1)=>{let o=new Ha(_),i=Ja(),n=u(i),s=`${E?"testnet":"mainnet"}${xa[e]}`,S=n[s],r=await Gn(S),a=await o.getBalance(r.publicKey),c=Number(a)/Ya;if(isNaN(c))throw new Error("Failed to get balance");return c},"getBalance"),A_=Qa;var qa=new kn(3*St),Vn=t(async _=>{let e=await A_(_,a_.VALIDATOR),o=new kn(Number(Number(e)*St)).sub(qa),i=Number(o)/St;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import he from"chalk";import{Keypair as $a,Connection as Wa,PublicKey as Xa,SystemProgram as bn,ComputeBudgetProgram as UE,VersionedTransaction as wn,TransactionMessage as vn}from"@solana/web3.js";var Hn=t(async(_,e,E,o)=>{let i=0;try{let n=new Wa(_,"finalized"),T=$a.fromSecretKey(new Uint8Array(Array.from(e))),s=new Xa(E),S=o;for(;;)try{let r=[bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),UE.setComputeUnitLimit({units:2e5}),UE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],a=await n.getLatestBlockhashAndContext({commitment:"finalized"}),R=new wn(new vn({instructions:r,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message()),c=await n.simulateTransaction(R,{replaceRecentBlockhash:!0,sigVerify:!1});R.sign([T]);let C=[bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),UE.setComputeUnitLimit({units:c.value.unitsConsumed?Math.trunc(c.value.unitsConsumed*1.2):2e5}),UE.setComputeUnitPrice({microLamports:1e3})],I=new wn(new vn({instructions:C,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message());I.sign([T]);let N=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...a.value,signature:N},"finalized"),console.log("finalized signature:",N),N}catch(r){if(i++,i>Ke)throw new Error(JSON.stringify(r));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${r}`),await J(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as Za}from"fs/promises";import{LAMPORTS_PER_SOL as _R}from"@solana/web3.js";var rt=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=u();await A_(_,a_.VOTE)<1?(console.log(he.white("Vote Account Balance is less than 1 SOL")),console.log(he.white("Skip withdrawing SOL from Vote Account to Authority Account"))):za("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await Vn(_);console.log(he.white(`Transferable Balance: ${i} SOL`));let n=i*_R;if(i<1)console.log(he.white("Validator Account Balance is less than 1 SOL")),console.log(he.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=ja(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await Za(E,"utf-8"));await Hn(_,s,T,n)}return!0},"collectSOL");import{readFile as aR}from"fs/promises";import RR from"inquirer";import at from"chalk";import{execSync as eR}from"child_process";import{homedir as ER}from"os";var tR=t(async _=>{try{let e=ER(),{mainnetValidatorAuthorityKey:E}=u(e),o=`spl-token balance ${S_} --owner ${E} --url ${_}`,i=eR(o).toString().trim();return Number(i)}catch(e){return console.log(at.red(`Error: ${e}`)),console.log(at.yellow(`You might need to install the Solana SPL CLI:
6503
- `)),console.log(at.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Yn=tR;import ME from"chalk";import{Connection as oR,PublicKey as Jn,Keypair as iR,ComputeBudgetProgram as AE,VersionedTransaction as xn,TransactionMessage as Qn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as qn,createTransferInstruction as $n,TOKEN_PROGRAM_ID as Wn}from"@solana/spl-token";var Xn=t(async(_,e,E,o,i,n)=>{try{let T=new oR(_,"finalized"),s=iR.fromSecretKey(new Uint8Array(e)),S=new Jn(E),r=new Jn(i),a=Math.trunc(o*Math.pow(10,n)),R=await qn(T,s,r,s.publicKey),c=await qn(T,s,r,S,!0);for(;;)try{let C=[$n(R.address,c.address,s.publicKey,a,[],Wn),AE.setComputeUnitLimit({units:2e5}),AE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),N=new xn(new Qn({instructions:C,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),O=await T.simulateTransaction(N,{replaceRecentBlockhash:!0,sigVerify:!1});N.sign([s]);let A=[$n(R.address,c.address,s.publicKey,a,[],Wn),AE.setComputeUnitLimit({units:O.value.unitsConsumed?Math.trunc(O.value.unitsConsumed*1.2):2e5}),AE.setComputeUnitPrice({microLamports:1e3})],P=new xn(new Qn({instructions:A,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());P.sign([s]);let L=await T.sendRawTransaction(P.serialize());return await T.confirmTransaction({...I.value,signature:L},"finalized"),console.log("finalized signature:",L),L}catch(C){console.error("Transfer failed, retrying...",C)}}catch(T){throw console.error(T),T}},"transferSPLToken");import LE from"inquirer";import{spawnSync as jn}from"child_process";import Rt from"chalk";import{promises as zn}from"fs";var nR=t(async(_="epochTimer")=>{try{let e=jn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Rt.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6502
+ Retries Left: ${a}`)),await J(hn),r=it(S,{shell:!0,stdio:"inherit"}),a--;process.exit(0)})},"transferCommands"),Tt=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Ga=t(async()=>{let _=ya(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=fE(`solana address -k ${o}`).toString().trim(),n=await PE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:Ka}]),T=n.from==="Validator Account"?Object.values(UE).filter(R=>R!=="Validator Account"):Object.values(UE).filter(R=>R!=="Authority Account");if((await PE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:R}=await PE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:Tt}]);i=R}else{let R=n.from==="Validator Account"?e:E;o=`${_}/${R}`,i=fE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,a=fE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:a,toAddress:i}},"selectFromKeypairs");import gn from"chalk";import ka from"inquirer";import{execSync as st,spawnSync as Va}from"node:child_process";var yn=t(async(_,e=!1)=>{let E=_.NETWORK===N.TESTNET,o=E?Ye:_.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=st(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(gn.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(gn.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let C=await ka.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(C.sol)}let a=st(`solana address --keypair ${T}`).toString().trim(),R=st(`solana address --keypair ${n}`).toString().trim(),c=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${a} ${R} ${S} --authorized-withdrawer ${n} --url ${o}`;Va(c,{shell:!0,stdio:"inherit"})},"withdraw");var Kn=t(_=>{I.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await yn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as ja,spawnSync as za}from"node:child_process";import{BN as kn}from"bn.js";import{LAMPORTS_PER_SOL as St}from"@solana/web3.js";import{Connection as Ha,LAMPORTS_PER_SOL as Ya}from"@solana/web3.js";import{Keypair as ba}from"@solana/web3.js";import{readFile as wa}from"fs/promises";var va=t(async _=>{let e=JSON.parse(await wa(_,"utf8"));return ba.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),Gn=va;import{homedir as Ja}from"os";var a_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(a_||(a_={}));var xa={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},Qa=t(async(_,e="auth",E=!1)=>{let o=new Ha(_),i=Ja(),n=u(i),s=`${E?"testnet":"mainnet"}${xa[e]}`,S=n[s],r=await Gn(S),a=await o.getBalance(r.publicKey),c=Number(a)/Ya;if(isNaN(c))throw new Error("Failed to get balance");return c},"getBalance"),A_=Qa;var qa=new kn(3*St),Vn=t(async _=>{let e=await A_(_,a_.VALIDATOR),o=new kn(Number(Number(e)*St)).sub(qa),i=Number(o)/St;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import Be from"chalk";import{Keypair as $a,Connection as Wa,PublicKey as Xa,SystemProgram as bn,ComputeBudgetProgram as AE,VersionedTransaction as wn,TransactionMessage as vn}from"@solana/web3.js";var Hn=t(async(_,e,E,o)=>{let i=0;try{let n=new Wa(_,"finalized"),T=$a.fromSecretKey(new Uint8Array(Array.from(e))),s=new Xa(E),S=o;for(;;)try{let r=[bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),AE.setComputeUnitLimit({units:2e5}),AE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],a=await n.getLatestBlockhashAndContext({commitment:"finalized"}),R=new wn(new vn({instructions:r,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message()),c=await n.simulateTransaction(R,{replaceRecentBlockhash:!0,sigVerify:!1});R.sign([T]);let C=[bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),AE.setComputeUnitLimit({units:c.value.unitsConsumed?Math.trunc(c.value.unitsConsumed*1.2):2e5}),AE.setComputeUnitPrice({microLamports:1e3})],F=new wn(new vn({instructions:C,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message());F.sign([T]);let d=await n.sendRawTransaction(F.serialize());return await n.confirmTransaction({...a.value,signature:d},"finalized"),console.log("finalized signature:",d),d}catch(r){if(i++,i>Ge)throw new Error(JSON.stringify(r));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${r}`),await J(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as Za}from"fs/promises";import{LAMPORTS_PER_SOL as _R}from"@solana/web3.js";var rt=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=u();await A_(_,a_.VOTE)<1?(console.log(Be.white("Vote Account Balance is less than 1 SOL")),console.log(Be.white("Skip withdrawing SOL from Vote Account to Authority Account"))):za("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await Vn(_);console.log(Be.white(`Transferable Balance: ${i} SOL`));let n=i*_R;if(i<1)console.log(Be.white("Validator Account Balance is less than 1 SOL")),console.log(Be.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=ja(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await Za(E,"utf-8"));await Hn(_,s,T,n)}return!0},"collectSOL");import{readFile as aR}from"fs/promises";import RR from"inquirer";import at from"chalk";import{execSync as eR}from"child_process";import{homedir as ER}from"os";var tR=t(async _=>{try{let e=ER(),{mainnetValidatorAuthorityKey:E}=u(e),o=`spl-token balance ${S_} --owner ${E} --url ${_}`,i=eR(o).toString().trim();return Number(i)}catch(e){return console.log(at.red(`Error: ${e}`)),console.log(at.yellow(`You might need to install the Solana SPL CLI:
6503
+ `)),console.log(at.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Yn=tR;import uE from"chalk";import{Connection as oR,PublicKey as Jn,Keypair as iR,ComputeBudgetProgram as LE,VersionedTransaction as xn,TransactionMessage as Qn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as qn,createTransferInstruction as $n,TOKEN_PROGRAM_ID as Wn}from"@solana/spl-token";var Xn=t(async(_,e,E,o,i,n)=>{try{let T=new oR(_,"finalized"),s=iR.fromSecretKey(new Uint8Array(e)),S=new Jn(E),r=new Jn(i),a=Math.trunc(o*Math.pow(10,n)),R=await qn(T,s,r,s.publicKey),c=await qn(T,s,r,S,!0);for(;;)try{let C=[$n(R.address,c.address,s.publicKey,a,[],Wn),LE.setComputeUnitLimit({units:2e5}),LE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],F=await T.getLatestBlockhashAndContext({commitment:"finalized"}),d=new xn(new Qn({instructions:C,payerKey:s.publicKey,recentBlockhash:F.value.blockhash}).compileToV0Message()),O=await T.simulateTransaction(d,{replaceRecentBlockhash:!0,sigVerify:!1});d.sign([s]);let A=[$n(R.address,c.address,s.publicKey,a,[],Wn),LE.setComputeUnitLimit({units:O.value.unitsConsumed?Math.trunc(O.value.unitsConsumed*1.2):2e5}),LE.setComputeUnitPrice({microLamports:1e3})],P=new xn(new Qn({instructions:A,payerKey:s.publicKey,recentBlockhash:F.value.blockhash}).compileToV0Message());P.sign([s]);let L=await T.sendRawTransaction(P.serialize());return await T.confirmTransaction({...F.value,signature:L},"finalized"),console.log("finalized signature:",L),L}catch(C){console.error("Transfer failed, retrying...",C)}}catch(T){throw console.error(T),T}},"transferSPLToken");import ME from"inquirer";import{spawnSync as jn}from"child_process";import Rt from"chalk";import{promises as zn}from"fs";var nR=t(async(_="epochTimer")=>{try{let e=jn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Rt.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6504
6504
  `).filter(n=>!n.includes(_)).join(`
6505
- `),i="/tmp/temp_crontab";await zn.writeFile(i,o,"utf-8"),jn("crontab",[i]),await zn.unlink(i),console.log(Rt.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Rt.red("Error removing cron job:",e))}},"removeCronJob"),Zn=nR;import _T from"chalk";var TR=t(async _=>{let e=_.NETWORK===d.TESTNET,E=await LE.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 rE()&&await Zn(),await m({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6505
+ `),i="/tmp/temp_crontab";await zn.writeFile(i,o,"utf-8"),jn("crontab",[i]),await zn.unlink(i),console.log(Rt.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Rt.red("Error removing cron job:",e))}},"removeCronJob"),Zn=nR;import _T from"chalk";var TR=t(async _=>{let e=_.NETWORK===N.TESTNET,E=await ME.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 aE()&&await Zn(),await m({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6506
6506
  ${_T.green("No more Login to the server to update \u{1F331}")}
6507
6507
 
6508
6508
  If you enable this, solv will update automatically when the solv/solana version is updated.
@@ -6511,78 +6511,78 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
6511
6511
 
6512
6512
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
6513
6513
  \u203B Please turn off if you are using no-downtime migration.
6514
- `;console.log(_T.white(o));let i=await LE.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 LE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await LE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await m({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"),eT=TR;import{spawnSync as CR}from"node:child_process";import{Connection as rR}from"@solana/web3.js";import{Connection as sR}from"@solana/web3.js";var SR=t(async(_,e=10,E=.4)=>{try{let i=await new sR(_).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"),ET=SR;var Ct=t(async _=>{try{let E=await new rR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await ET(_);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),a=Math.floor(n%60),R=`${s}d ${S}h ${r}m ${a}s`;return s===0&&(R=`${S}h ${r}m ${a}s`),{...E,estimatedTimeUntilNextEpoch:R,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var cR=.03,tT=t(_=>{F.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await dR(_),{mainnetValidatorAuthorityKey:E}=u();console.log("Harvesting SOL..."),await rt(_.RPC_URL);let o=await A_(_.RPC_URL,a_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await J(1e3),await rt(_.RPC_URL),o=await A_(_.RPC_URL,a_.VOTE),i++;let n=JSON.parse(await aR(E,"utf-8")),T=await A_(_.RPC_URL,a_.AUTH);if(T<1)console.log(ME.white("Authority Account Balance is less than 1 SOL")),console.log(ME.white("Skip converting SOL to elSOL"));else{let S=T-cR;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await NE(_.RPC_URL,E_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await Yn(_.RPC_URL);if(s<1){let S=await Ct(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await r_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await Xn(_.RPC_URL,n,e,s,S_,$t),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await Ct(_.RPC_URL)).epoch} \u{1F4B0}
6514
+ `;console.log(_T.white(o));let i=await ME.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 ME.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await ME.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await m({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"),eT=TR;import{spawnSync as CR}from"node:child_process";import{Connection as rR}from"@solana/web3.js";import{Connection as sR}from"@solana/web3.js";var SR=t(async(_,e=10,E=.4)=>{try{let i=await new sR(_).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"),ET=SR;var Ct=t(async _=>{try{let E=await new rR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await ET(_);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),a=Math.floor(n%60),R=`${s}d ${S}h ${r}m ${a}s`;return s===0&&(R=`${S}h ${r}m ${a}s`),{...E,estimatedTimeUntilNextEpoch:R,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var cR=.03,tT=t(_=>{I.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await dR(_),{mainnetValidatorAuthorityKey:E}=u();console.log("Harvesting SOL..."),await rt(_.RPC_URL);let o=await A_(_.RPC_URL,a_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await J(1e3),await rt(_.RPC_URL),o=await A_(_.RPC_URL,a_.VOTE),i++;let n=JSON.parse(await aR(E,"utf-8")),T=await A_(_.RPC_URL,a_.AUTH);if(T<1)console.log(uE.white("Authority Account Balance is less than 1 SOL")),console.log(uE.white("Skip converting SOL to elSOL"));else{let S=T-cR;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await OE(_.RPC_URL,E_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await Yn(_.RPC_URL);if(s<1){let S=await Ct(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await r_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await Xn(_.RPC_URL,n,e,s,S_,$t),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await Ct(_.RPC_URL)).epoch} \u{1F4B0}
6515
6515
  Validator Address: ${p(E)}
6516
6516
  Total Reward: ${s} elSOL
6517
- Harvest Address: ${e}`;await r_(r)}console.log(ME.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),F.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await eT(_)&&(CR("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(ME.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),dR=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await RR.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:Tt}]);return await m({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as hR}from"@skeet-framework/utils";import{writeFile as NR}from"fs/promises";var OR=t(async _=>{await NR(ve,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),L_=OR;var lR=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await L_({...e,isLessThan1Day:!0})},"isLessThan1Day"),oT=lR;var FR=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await L_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),iT=FR;var IR=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await L_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),nT=IR;var DR=t(async(_,e)=>{let E=e.NETWORK===d.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=u(),T=E?p(n):p(i);await L_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6517
+ Harvest Address: ${e}`;await r_(r)}console.log(uE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),I.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await eT(_)&&(CR("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(uE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),dR=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await RR.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:Tt}]);return await m({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as hR}from"@skeet-framework/utils";import{writeFile as NR}from"fs/promises";var OR=t(async _=>{await NR(He,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),L_=OR;var lR=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await L_({...e,isLessThan1Day:!0})},"isLessThan1Day"),oT=lR;var FR=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await L_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),iT=FR;var IR=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await L_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),nT=IR;var DR=t(async(_,e)=>{let E=e.NETWORK===N.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=u(),T=E?p(n):p(i);await L_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6518
6518
  Validator: ${T}
6519
6519
  Network: ${e.NETWORK}
6520
6520
  CurrentEpoch: ${_.epoch}
6521
6521
  Epoch has been updated!
6522
- Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),TT=DR;import{existsAsync as PR}from"@skeet-framework/utils";import{readFile as fR,writeFile as UR}from"fs/promises";import AR from"chalk";import{homedir as LR}from"os";var MR=t(async()=>{let e=LR().includes("/home/solv")?ve:"./currentEpoch.json";if(await PR(e))return JSON.parse(await fR(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await UR(e,JSON.stringify(E,null,2),"utf-8"),console.log(AR.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),sT=MR;async function uR(_="@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(uR,"getNpmLatestVersion");var ST=uR;async function pR(){let _=Q_(),e=await ST();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(pR,"isVersionSame");var rT=pR;import{spawnSync as BR}from"child_process";import{spawnSync as mR}from"node:child_process";var aT=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=mR(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6523
- `),n=i.find(c=>c.includes("Epoch Completed Time:")),T=i.find(c=>c.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(c=>c.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*)?/,R=r.match(a);if(R){let c=R[1]?parseInt(R[1]):0,C=R[2]?parseInt(R[2]):0,I=R[3]?parseInt(R[3]):0,N=R[4]?parseInt(R[4]):0,O=c*24*60+C*60+I+Math.floor(N/60);return{epoch:s,day:c,hour:C,min:I,sec:N,totalMinutes:O,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var gR=t(async _=>{let e=_.NETWORK===d.TESTNET,E=e?He:_.RPC_URL,o=hR(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await sT(),n=aT(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=u(),r=await de(E,p(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await rT()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),BR("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await TT(n,_),"Epoch has been updated!";let R=n.totalMinutes,c=[nT,iT,oT];for(let C of c)if(await C(R,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),RT=gR;var CT=t(_=>{F.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await RT(_),process.exit(0)})},"epochTimerCommands");import MT from"inquirer";import{join as OT}from"path";import{spawnSync as te}from"node:child_process";import Z from"chalk";import{spawnSync as yR}from"node:child_process";var KR=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=yR(`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.
6522
+ Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),TT=DR;import{existsAsync as PR}from"@skeet-framework/utils";import{readFile as fR,writeFile as UR}from"fs/promises";import AR from"chalk";import{homedir as LR}from"os";var MR=t(async()=>{let e=LR().includes("/home/solv")?He:"./currentEpoch.json";if(await PR(e))return JSON.parse(await fR(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await UR(e,JSON.stringify(E,null,2),"utf-8"),console.log(AR.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),sT=MR;async function uR(_="@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(uR,"getNpmLatestVersion");var ST=uR;async function pR(){let _=q_(),e=await ST();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(pR,"isVersionSame");var rT=pR;import{spawnSync as BR}from"child_process";import{spawnSync as mR}from"node:child_process";var aT=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=mR(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6523
+ `),n=i.find(c=>c.includes("Epoch Completed Time:")),T=i.find(c=>c.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(c=>c.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*)?/,R=r.match(a);if(R){let c=R[1]?parseInt(R[1]):0,C=R[2]?parseInt(R[2]):0,F=R[3]?parseInt(R[3]):0,d=R[4]?parseInt(R[4]):0,O=c*24*60+C*60+F+Math.floor(d/60);return{epoch:s,day:c,hour:C,min:F,sec:d,totalMinutes:O,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var gR=t(async _=>{let e=_.NETWORK===N.TESTNET,E=e?Ye:_.RPC_URL,o=hR(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await sT(),n=aT(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=u(),r=await Ne(E,p(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await rT()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),BR("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await TT(n,_),"Epoch has been updated!";let R=n.totalMinutes,c=[nT,iT,oT];for(let C of c)if(await C(R,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),RT=gR;var CT=t(_=>{I.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await RT(_),process.exit(0)})},"epochTimerCommands");import MT from"inquirer";import{join as OT}from"path";import{spawnSync as oe}from"node:child_process";import Z from"chalk";import{spawnSync as yR}from"node:child_process";var KR=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=yR(`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.
6524
6524
  $ ssh solv@${_}
6525
6525
 
6526
- 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"),uE=KR;import cT from"chalk";var GR=t((_,e,E)=>{console.log(cT.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=p(_).trim(),i=uE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(cT.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6526
+ 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"),pE=KR;import cT from"chalk";var GR=t((_,e,E)=>{console.log(cT.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=p(_).trim(),i=pE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(cT.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6527
6527
  Please check your Validator
6528
6528
  $ ssh ${E}@${e}
6529
6529
 
6530
6530
  Local Identity Key: ${o}
6531
- Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),ee=GR;var kR="agave-validator -l /mnt/ledger",VR="sudo fdctl",bR="--config /home/solv/firedancer/config.toml ",wR=t(_=>_==="agave"?[kR,""]:[VR,bR],"getSolanaCLIActive"),Ee=wR;var dT="agave-validator -l /mnt/ledger",vR=t(()=>{try{return dT}catch(_){return console.error(_),dT}},"getSolanaCLIAgave"),pE=vR;import ct from"chalk";var mE=t(async(_,e)=>{try{console.log(ct.white("\u{1F50D} Detecting client type from remote configuration..."));let E=uE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:l.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case l.AGAVE:n="agave";break;case l.FRANKENDANCER:n="frankendancer";break;case l.JITO:n="agave";break;default:n="agave"}return console.log(ct.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(ct.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:l.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as HR}from"fs/promises";import dt from"chalk";import{existsSync as YR}from"fs";var hE=t(async()=>{try{console.log(dt.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!YR(_))return{client:"agave",validatorType:l.AGAVE,success:!1,error:"Local configuration file not found"};let e=await HR(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case l.AGAVE:i="agave";break;case l.FRANKENDANCER:i="frankendancer";break;case l.JITO:i="agave";break;default:i="agave"}return console.log(dt.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(dt.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:l.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var BE=OT(G,p_),NT=OT(G,u_),lT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===d.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;T&&(s=g);let S=await hE(),r=await mE(_,o),a=S.success?S.client:"agave",R=r.success?r.client:"agave";console.log(Z.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=Ee(a),[I,N]=Ee(R),O=pE();if(!ee(s,_,o))return;if(i){console.log(Z.white("\u{1F7E2} Waiting for restart window..."));let se=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(te(se,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6531
+ Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),Ee=GR;var kR="agave-validator -l /mnt/ledger",VR="sudo fdctl",bR="--config /home/solv/firedancer/config.toml ",wR=t(_=>_==="agave"?[kR,""]:[VR,bR],"getSolanaCLIActive"),te=wR;var dT="agave-validator -l /mnt/ledger",vR=t(()=>{try{return dT}catch(_){return console.error(_),dT}},"getSolanaCLIAgave"),mE=vR;import ct from"chalk";var hE=t(async(_,e)=>{try{console.log(ct.white("\u{1F50D} Detecting client type from remote configuration..."));let E=pE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:l.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case l.AGAVE:n="agave";break;case l.FRANKENDANCER:n="frankendancer";break;case l.JITO:n="agave";break;default:n="agave"}return console.log(ct.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(ct.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:l.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as HR}from"fs/promises";import dt from"chalk";import{existsSync as YR}from"fs";var BE=t(async()=>{try{console.log(dt.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!YR(_))return{client:"agave",validatorType:l.AGAVE,success:!1,error:"Local configuration file not found"};let e=await HR(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case l.AGAVE:i="agave";break;case l.FRANKENDANCER:i="frankendancer";break;case l.JITO:i="agave";break;default:i="agave"}return console.log(dt.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(dt.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:l.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var gE=OT(G,p_),NT=OT(G,u_),lT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===N.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;T&&(s=g);let S=await BE(),r=await hE(_,o),a=S.success?S.client:"agave",R=r.success?r.client:"agave";console.log(Z.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=te(a),[F,d]=te(R),O=mE();if(!Ee(s,_,o))return;if(i){console.log(Z.white("\u{1F7E2} Waiting for restart window..."));let Se=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(oe(Se,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6532
6532
  $ ssh ${o}@${_}
6533
6533
 
6534
- Failed Cmd: ${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(Z.white("\u{1F7E2} Setting identity on the remote validator..."));let P=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${N}${BE}'`;if(te(P,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6534
+ Failed Cmd: ${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(Z.white("\u{1F7E2} Setting identity on the remote validator..."));let P=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${F} set-identity ${d}${gE}'`;if(oe(P,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6535
6535
  $ ssh ${o}@${_}
6536
6536
 
6537
- Failed Cmd: ${I} set-identity ${N}${BE}`));return}if(console.log(Z.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),te(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${BE} ${NT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6537
+ Failed Cmd: ${F} set-identity ${d}${gE}`));return}if(console.log(Z.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),oe(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${gE} ${NT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6538
6538
  $ ssh ${o}@${_}
6539
6539
 
6540
- Failed Cmd: ln -sf ${BE} ${NT}`));return}if(console.log(Z.white("\u{1F7E2} Uploading the tower file to the new validator...")),te(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6540
+ Failed Cmd: ln -sf ${gE} ${NT}`));return}if(console.log(Z.white("\u{1F7E2} Uploading the tower file to the new validator...")),oe(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6541
6541
  $ ssh ${o}@${_}
6542
6542
 
6543
- Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(Z.white("\u{1F7E2} Setting identity on the local validator...")),te(`${c} set-identity ${C}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6543
+ Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(Z.white("\u{1F7E2} Setting identity on the local validator...")),oe(`${c} set-identity ${C}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6544
6544
 
6545
6545
  Failed Cmd: ${c} set-identity ${C}${s}
6546
- ln -sf ${s} ${U}`));return}if(te(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6546
+ ln -sf ${s} ${U}`));return}if(oe(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6547
6547
 
6548
- Failed Cmd: ln -sf ${s} ${U}`));return}console.log(Z.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as DT}from"path";import Q from"chalk";import{spawnSync as oe}from"node:child_process";var FT=DT(G,p_),JR=DT(G,u_),IT="~/.ssh/id_rsa",PT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===d.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;T&&(s=g);let S=await hE(),r=await mE(_,o),a=S.success?S.client:"agave",R=r.success?r.client:"agave";console.log(Q.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=Ee(a),[I,N]=Ee(R),O=pE();if(!ee(s,_,o))return;let P=`${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,L=`${c} set-identity ${C}${FT}`,R_=`ln -sf ${FT} ${JR}`,M_=`scp ${f}/tower-1_9-${e}.bin ${o}@${_}:${f}`,C_=`${I} set-identity ${N}--require-tower ${s}`,Te=`ln -sf ${s} ${U}`;if(i&&(console.log(Q.white("\u{1F7E2} Waiting for restart window...")),oe(P,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Q.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6548
+ Failed Cmd: ln -sf ${s} ${U}`));return}console.log(Z.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as DT}from"path";import Q from"chalk";import{spawnSync as ie}from"node:child_process";var FT=DT(G,p_),JR=DT(G,u_),IT="~/.ssh/id_rsa",PT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===N.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;T&&(s=g);let S=await BE(),r=await hE(_,o),a=S.success?S.client:"agave",R=r.success?r.client:"agave";console.log(Q.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=te(a),[F,d]=te(R),O=mE();if(!Ee(s,_,o))return;let P=`${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,L=`${c} set-identity ${C}${FT}`,R_=`ln -sf ${FT} ${JR}`,M_=`scp ${f}/tower-1_9-${e}.bin ${o}@${_}:${f}`,C_=`${F} set-identity ${d}--require-tower ${s}`,se=`ln -sf ${s} ${U}`;if(i&&(console.log(Q.white("\u{1F7E2} Waiting for restart window...")),ie(P,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Q.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6549
6549
 
6550
- Failed Cmd: ${P}`));return}if(console.log(Q.white("\u{1F7E2} Setting identity on the new validator...")),oe(L,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6550
+ Failed Cmd: ${P}`));return}if(console.log(Q.white("\u{1F7E2} Setting identity on the new validator...")),ie(L,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6551
6551
 
6552
- Failed Cmd: ${L}`));return}if(console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),oe(R_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6552
+ Failed Cmd: ${L}`));return}if(console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ie(R_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6553
6553
 
6554
- Failed Cmd: ${R_}`));return}if(console.log(Q.white("\u{1F7E2} Uploading the tower file to the new validator...")),oe(M_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6554
+ Failed Cmd: ${R_}`));return}if(console.log(Q.white("\u{1F7E2} Uploading the tower file to the new validator...")),ie(M_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6555
6555
 
6556
- Failed Cmd: ${M_}`));return}console.log(Q.white("\u{1F7E2} Setting identity on the new validator..."));let YT=`ssh -i ${IT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${C_}'`;oe(YT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(Q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6556
+ Failed Cmd: ${M_}`));return}console.log(Q.white("\u{1F7E2} Setting identity on the new validator..."));let YT=`ssh -i ${IT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${C_}'`;ie(YT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(Q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6557
6557
  $ ssh ${o}@${_}
6558
6558
 
6559
- Failed Cmd: ${C_}`)),console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let JT=`ssh -i ${IT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${Te}'`;if(oe(JT,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6559
+ Failed Cmd: ${C_}`)),console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let JT=`ssh -i ${IT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${se}'`;if(ie(JT,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6560
6560
 
6561
- Failed Cmd: ${Te}`));return}console.log(Q.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as xR}from"node:child_process";function fT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return xR(E,{shell:!0,stdio:"inherit"}).status===0}t(fT,"checkSSHConnection");import Be from"chalk";import{join as AT}from"path";import{spawnSync as ie}from"node:child_process";import e_ from"chalk";var gE=AT(G,p_),UT=AT(G,u_),LT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===d.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;if(T&&(s=g),!ee(s,_,o))return;let r=Dt,a=Pt;if(i){console.log(e_.white("\u{1F7E2} Waiting for restart window..."));let A=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(ie(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6561
+ Failed Cmd: ${se}`));return}console.log(Q.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as xR}from"node:child_process";function fT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return xR(E,{shell:!0,stdio:"inherit"}).status===0}t(fT,"checkSSHConnection");import ge from"chalk";import{join as AT}from"path";import{spawnSync as ne}from"node:child_process";import e_ from"chalk";var yE=AT(G,p_),UT=AT(G,u_),LT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===N.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;if(T&&(s=g),!Ee(s,_,o))return;let r=Dt,a=Pt;if(i){console.log(e_.white("\u{1F7E2} Waiting for restart window..."));let A=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(ne(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6562
6562
  $ ssh ${o}@${_}
6563
6563
 
6564
- Failed Cmd: ${r} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(e_.white("\u{1F7E2} Setting identity on the new validator..."));let R=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${f} set-identity ${gE}'`;if(ie(R,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6564
+ Failed Cmd: ${r} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(e_.white("\u{1F7E2} Setting identity on the new validator..."));let R=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${f} set-identity ${yE}'`;if(ne(R,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6565
6565
  $ ssh ${o}@${_}
6566
6566
 
6567
- Failed Cmd: ${r} -l ${f} set-identity ${gE}`));return}if(console.log(e_.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ie(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${gE} ${UT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6567
+ Failed Cmd: ${r} -l ${f} set-identity ${yE}`));return}if(console.log(e_.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ne(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${yE} ${UT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6568
6568
  $ ssh ${o}@${_}
6569
6569
 
6570
- Failed Cmd: ln -sf ${gE} ${UT}`));return}if(console.log(e_.white("\u{1F7E2} Uploading the tower file to the new validator...")),ie(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6570
+ Failed Cmd: ln -sf ${yE} ${UT}`));return}if(console.log(e_.white("\u{1F7E2} Uploading the tower file to the new validator...")),ne(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6571
6571
  $ ssh ${o}@${_}
6572
6572
 
6573
- Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(e_.white("\u{1F7E2} Setting identity on the new validator...")),ie(`${a} -l ${f} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6573
+ Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(e_.white("\u{1F7E2} Setting identity on the new validator...")),ne(`${a} -l ${f} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6574
6574
 
6575
6575
  Failed Cmd: ${a} -l ${f} set-identity ${s}
6576
- ln -sf ${s} ${U}`));return}if(ie(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6576
+ ln -sf ${s} ${U}`));return}if(ne(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6577
6577
 
6578
- Failed Cmd: ln -sf ${s} ${U}`));return}console.log(e_.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var QR=["Incoming","Outgoing"],uT=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===d.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?g:b;i&&(T=g);let s=E.user,S=p(T),r=E.switchType,a=E.ip;if(r===""||a===""||s===""){let c=await MT.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=c.switchType,a=c.ip,s=c.user}if(!QR.includes(r)){console.log(Be.yellow(`\u26A0\uFE0F Invalid Switch Type
6579
- You can choose only Incoming or Outgoing`));return}if(!fT(a,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await MT.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(Be.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Be.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await LT(a,S,e,s,n);return}await lT(a,S,e,s,n)}else await PT(a,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Be.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Be.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as qR}from"node:child_process";var $R=t((_="306450862",e=f,E=i_)=>{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=qR(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"),pT=$R;import ne from"inquirer";import tC from"dotenv";import V_ from"chalk";var yE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:GE,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}},Nt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Ge,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:ke,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:GE,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 jR}from"fs/promises";import{Connection as zR,Keypair as ZR,VersionedTransaction as _C}from"@solana/web3.js";import q from"chalk";import eC from"inquirer";import EC from"dotenv";var WR=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"),mT=WR;var XR=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=pt[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"),hT=XR;EC.config();var BT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new zR(_,"confirmed"),r=await mT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(q.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6580
- `)),console.log(q.white("Get Your API key \u{1F447}")),console.log(q.white(Se+`
6578
+ Failed Cmd: ln -sf ${s} ${U}`));return}console.log(e_.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var QR=["Incoming","Outgoing"],uT=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===N.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?g:b;i&&(T=g);let s=E.user,S=p(T),r=E.switchType,a=E.ip;if(r===""||a===""||s===""){let c=await MT.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=c.switchType,a=c.ip,s=c.user}if(!QR.includes(r)){console.log(ge.yellow(`\u26A0\uFE0F Invalid Switch Type
6579
+ You can choose only Incoming or Outgoing`));return}if(!fT(a,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await MT.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(ge.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ge.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await LT(a,S,e,s,n);return}await lT(a,S,e,s,n)}else await PT(a,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(ge.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ge.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as qR}from"node:child_process";var $R=t((_="306450862",e=f,E=i_)=>{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=qR(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"),pT=$R;import Te from"inquirer";import tC from"dotenv";import b_ from"chalk";var KE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:kE,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}},Nt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:ke,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:Ve,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:kE,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 jR}from"fs/promises";import{Connection as zR,Keypair as ZR,VersionedTransaction as _C}from"@solana/web3.js";import q from"chalk";import eC from"inquirer";import EC from"dotenv";var WR=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"),mT=WR;var XR=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=pt[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"),hT=XR;EC.config();var BT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new zR(_,"confirmed"),r=await mT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(q.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6580
+ `)),console.log(q.white("Get Your API key \u{1F447}")),console.log(q.white(re+`
6581
6581
  `)),process.exit(0));let C_=`${q.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6582
6582
 
6583
6583
  You can upgrade your API key to increase your rate limits.
6584
6584
  Get Your API key \u{1F447}
6585
- Validators Solutions: ${Se}
6585
+ Validators Solutions: ${re}
6586
6586
  `;console.error(q.white(C_)),process.exit(0)}let a=Nt[i],R=Nt[n],c=`\u{1F504} Swap Quote \u{1F504}
6587
6587
 
6588
6588
  - \u{1F3E6} Input Token: ${a.symbol} (${i})
@@ -6594,14 +6594,14 @@ Validators Solutions: ${Se}
6594
6594
  \u203B This quote is based on the current market rate and may change before the swap is completed.
6595
6595
  `;console.log(q.white(c)),console.log(q.gray(`You can also swap using the following command:
6596
6596
  $ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
6597
- `));let C=!1;s?C=(await eC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(q.cyan("Skipping confirmation...")),C=!0),C||(console.log(q.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await jR(o,"utf8")),N=ZR.fromSecretKey(new Uint8Array(Array.from(I))),O=await hT(e,E,r,N.publicKey.toString());if(typeof O=="string"){O.includes("Unauthorized")&&(console.error(q.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6598
- `)),console.log(q.white("Get Your API key \u{1F447}")),console.log(q.white(Se+`
6597
+ `));let C=!1;s?C=(await eC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(q.cyan("Skipping confirmation...")),C=!0),C||(console.log(q.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let F=JSON.parse(await jR(o,"utf8")),d=ZR.fromSecretKey(new Uint8Array(Array.from(F))),O=await hT(e,E,r,d.publicKey.toString());if(typeof O=="string"){O.includes("Unauthorized")&&(console.error(q.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6598
+ `)),console.log(q.white("Get Your API key \u{1F447}")),console.log(q.white(re+`
6599
6599
  `)),process.exit(0));let C_=`${q.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6600
6600
 
6601
6601
  You can upgrade your API key to increase your rate limits.
6602
6602
  Get Your API key \u{1F447}
6603
- Validators Solutions: ${Se}
6604
- `;console.error(q.white(C_)),process.exit(0)}let A=Buffer.from(O.swapTransaction,"base64"),P=_C.deserialize(A);P.sign([N]);let L=P.serialize(),R_=await S.sendRawTransaction(L,{skipPreflight:!0,maxRetries:2}),M_=P.message.recentBlockhash;return console.log(`Swapping...
6605
- Transaction ID: ${R_}`),await S.confirmTransaction({blockhash:M_,lastValidBlockHeight:O.lastValidBlockHeight,signature:R_},"confirmed"),R_},"swap");tC.config();var gT=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 oC(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(V_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(V_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),oC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(V_.white("Solana RPC URL:",_)),console.log(V_.white("KeyfilePath:",e)),(!e||e===""||s)&&await iC();let S=Lt,r=[...Mt,"Other"],a=o,R="",c=i,C=n;if(a===""){let O=await ne.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Ge}]);O.name==="Other"?a=(await ne.prompt([{type:"input",name:"address",message:"Enter input mint address",default:ke}])).address:(R=O.name,a=yE[R].tokenMint)}if(c===""){r=r.filter(P=>P!==R);let O=await ne.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(O.name==="Other")c=(await ne.prompt([{type:"input",name:"address",message:"Enter output mint address",default:S_}])).address;else{let P=O.name;c=yE[P].tokenMint}let A=O.name;c=yE[A].tokenMint}if(C===0){let O=await ne.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);C=Number(O.amount)}let N=await BT(_,S,!E||E===""?ut:E,e,a,c,C,T);N||process.exit(0),console.log(V_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(V_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${N}`))},"swapCmd");var iC=t(async()=>{let _=await ne.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 m(_),console.log(V_.green(`\u2714\uFE0E Config Updated Successfully!
6606
- `)),K_()},"askForConfig");import{spawnSync as nC}from"node:child_process";var yT=t(()=>{nC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as TC}from"node:child_process";var KT=t(()=>{TC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as sC}from"node:child_process";var GT=t(()=>{sC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as SC}from"node:child_process";var kT=t(()=>{SC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as rC}from"node:child_process";var VT=t((_=!1)=>{rC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as aC}from"node:child_process";var bT=t(()=>{aC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var wT=t(()=>{let _=F.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{yT()}),_.command("start").description("Start Jupiter").action(()=>{KT()}),_.command("stop").description("Stop Jupiter").action(()=>{GT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{VT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{kT()}),_.command("enable").description("Enable Jupiter").action(()=>{bT()})},"jupiterCommands");import dC from"chalk";import{spawnSync as RC}from"node:child_process";var CC=t(()=>{let{stdout:_}=RC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),vT=CC;var F=new cC;F.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(ge,"-V","Display version");async function NC(){try{let _=await V();pi(_),gi(_),hi(_),$i(_),fo(_),Ao(),yi(_),Cn(_),On(_),qi(),ki(),Li(_),bo(_),Ki(),Un(),Bn(_),Kn(_),tT(_),ui(),gT(F,_),CT(_),uT(F,_),wT(),Mn(_),F.command("rm:log").description("Remove Logs").action(()=>{IE()}),F.command("rm:snapshot").description("Remove Snapshot").action(()=>{un(_)}),F.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(dC.white("\u{1F4DD} Creating Snapshot...")),pT(e.slot,e.ledger,e.snapshots)}),F.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{pn(_)}),F.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{mn()}),F.command("config").description("Show Solv Config").action(()=>{FE(_)}),F.command("vv").description("Show Solv Version").action(()=>{let e=vT();console.log("version:",e)}),await F.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(NC,"main");NC();export{F as program};
6603
+ Validators Solutions: ${re}
6604
+ `;console.error(q.white(C_)),process.exit(0)}let A=Buffer.from(O.swapTransaction,"base64"),P=_C.deserialize(A);P.sign([d]);let L=P.serialize(),R_=await S.sendRawTransaction(L,{skipPreflight:!0,maxRetries:2}),M_=P.message.recentBlockhash;return console.log(`Swapping...
6605
+ Transaction ID: ${R_}`),await S.confirmTransaction({blockhash:M_,lastValidBlockHeight:O.lastValidBlockHeight,signature:R_},"confirmed"),R_},"swap");tC.config();var gT=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 oC(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"),oC=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 iC();let S=Lt,r=[...Mt,"Other"],a=o,R="",c=i,C=n;if(a===""){let O=await Te.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:ke}]);O.name==="Other"?a=(await Te.prompt([{type:"input",name:"address",message:"Enter input mint address",default:Ve}])).address:(R=O.name,a=KE[R].tokenMint)}if(c===""){r=r.filter(P=>P!==R);let O=await Te.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(O.name==="Other")c=(await Te.prompt([{type:"input",name:"address",message:"Enter output mint address",default:S_}])).address;else{let P=O.name;c=KE[P].tokenMint}let A=O.name;c=KE[A].tokenMint}if(C===0){let O=await Te.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);C=Number(O.amount)}let d=await BT(_,S,!E||E===""?ut:E,e,a,c,C,T);d||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/${d}`))},"swapCmd");var iC=t(async()=>{let _=await Te.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 m(_),console.log(b_.green(`\u2714\uFE0E Config Updated Successfully!
6606
+ `)),G_()},"askForConfig");import{spawnSync as nC}from"node:child_process";var yT=t(()=>{nC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as TC}from"node:child_process";var KT=t(()=>{TC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as sC}from"node:child_process";var GT=t(()=>{sC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as SC}from"node:child_process";var kT=t(()=>{SC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as rC}from"node:child_process";var VT=t((_=!1)=>{rC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as aC}from"node:child_process";var bT=t(()=>{aC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var wT=t(()=>{let _=I.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{yT()}),_.command("start").description("Start Jupiter").action(()=>{KT()}),_.command("stop").description("Stop Jupiter").action(()=>{GT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{VT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{kT()}),_.command("enable").description("Enable Jupiter").action(()=>{bT()})},"jupiterCommands");import dC from"chalk";import{spawnSync as RC}from"node:child_process";var CC=t(()=>{let{stdout:_}=RC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),vT=CC;var I=new cC;I.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(ye,"-V","Display version");async function NC(){try{let _=await V();pi(_),gi(_),hi(_),$i(_),fo(_),Ao(),yi(_),Cn(_),On(_),qi(),ki(),Li(_),bo(_),Ki(),Un(),Bn(_),Kn(_),tT(_),ui(),gT(I,_),CT(_),uT(I,_),wT(),Mn(_),I.command("rm:log").description("Remove Logs").action(()=>{DE()}),I.command("rm:snapshot").description("Remove Snapshot").action(()=>{un(_)}),I.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(dC.white("\u{1F4DD} Creating Snapshot...")),pT(e.slot,e.ledger,e.snapshots)}),I.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{pn(_)}),I.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{mn()}),I.command("config").description("Show Solv Config").action(()=>{IE(_)}),I.command("vv").description("Show Solv Version").action(()=>{let e=vT();console.log("version:",e)}),await I.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(NC,"main");NC();export{I as program};
6607
6607
  //# sourceMappingURL=index.js.map