@gabrielhicks/solv 5.5.3 → 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 VT=Object.defineProperty;var t=(_,e)=>VT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as TC}from"commander";var at="5.5.3";var Ct={name:"@gabrielhicks/solv",version:at,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 pe=Ct.version;var Te="https://validators.solutions";var me="solv4.config.json";var p_="identity.json",m_="unstaked-identity.json",ct="relayer-keypair.json",wT="mainnet-validator-keypair.json",vT="mainnet-vote-account-keypair.json",HT="mainnet-authority-keypair.json",YT="testnet-validator-keypair.json",JT="testnet-vote-account-keypair.json",xT="testnet-authority-keypair.json",y="/home/solv",f=`${y}/${p_}`,OC=`${y}/${m_}`,V=`${y}/${wT}`,k_=`${y}/${vT}`,lC=`${y}/${HT}`,h=`${y}/${YT}`,V_=`${y}/${JT}`,FC=`${y}/${xT}`,b=`${y}/solana-validator.log`,F_=y+"/start-validator.sh",P="/mnt/ledger",b_="/mnt/accounts",n_="/mnt/snapshots",dt="solana-validator",Nt="agave-validator",Ot="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var he=3;var lt="https://api.mainnet-beta.solana.com",Ft="https://verify.validators.solutions/solv-migrate",It="https://jup.validators.solutions/v1/jup",hE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(hE||(hE={}));var Dt=Object.values(hE),Be="So11111111111111111111111111111111111111112",ge="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",BE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var Pt="SOLV420",ft={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"},w_=["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"],v_=["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 $T}from"child_process";var T_="3.0.10",v="3.0.10",se="3.0.10",s_="3.0.10",Ut="3.0.10",h_="3.0.10";var At="20.17.0",H_="0.802.30008",I_="0.802.30008";import{spawnSync as g}from"node:child_process";var QT=t((_=v,e=!1,E=!1)=>{E?e?(g(`mkdir /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),g(`cd /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),g(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),g(`git -C /tmp/v${_}-agave-mod checkout v${_}-mod`,{shell:!0,stdio:"inherit"}),g(`git -C /tmp/v${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),g(`CI_COMMIT=$(git -C /tmp/v${_}-agave-mod rev-parse HEAD) /tmp/v${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave-mod`,{shell:!0,stdio:"inherit"}),g("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),g(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/v${_}-agave-mod /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),g(`sudo rm -rf /tmp/v${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(g(`mkdir /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),g(`cd /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),g(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"}),g(`git -C /tmp/v${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),g(`git -C /tmp/v${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),g(`CI_COMMIT=$(git -C /tmp/v${_}-agave rev-parse HEAD) /tmp/v${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/v${_}-agave`,{shell:!0,stdio:"inherit"}),g("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),g(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/v${_}-agave /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),g(`sudo rm -rf /tmp/v${_}-agave`,{shell:!0,stdio:"inherit"})):e?g(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):g(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Y_=QT;var Lt="agave-validator",qT=t(()=>{try{return Lt}catch(_){return console.error(_),Lt}},"getSolanaCLI"),S_=qT;var ye=t(async(_,e=!1,E=!1)=>{Y_(_,e,E)},"updateVersion"),Ke=t(async(_,e=!1,E=10)=>{let o=S_(),i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${P} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),$T(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Co from"chalk";var B_;(function(_){_.EN="en",_.JA="ja"})(B_||(B_={}));var Mt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Mt||(Mt={}));var ut;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(ut||(ut={}));var D_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(D_||(D_={}));var pt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(pt||(pt={}));var mt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(mt||(mt={}));var ht;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(ht||(ht={}));var Bt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Bt||(Bt={}));var Ge;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(Ge||(Ge={}));var ke;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(ke||(ke={}));var Kt=!1,Gt=!1,kt=!1,Vt=!0,W={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"},U={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},r_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},m={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",SOL_SYSTEM_CONFIG21:"/etc/sysctl.d/21-solana-validator.conf",SOL_NOFILES_CONF:"/etc/security/limits.d/90-solana-nofiles.conf",SOL_SYSTEM_CONF:"/etc/systemd/system.conf",SOLANA_PATH:"/home/solv/.local/share/solana/install"},B={MAINNET_VALIDATOR_KEY:"mainnet-validator-keypair.json",MAINNET_VALIDATOR_VOTE_KEY:"mainnet-vote-account-keypair.json",MAINNET_VALITATOR_AUTHORITY_KEY:"mainnet-authority-keypair.json",TESTNET_VALIDATOR_KEY:"testnet-validator-keypair.json",TESTNET_VALIDATOR_VOTE_KEY:"testnet-vote-account-keypair.json",TESTNET_VALITATOR_AUTHORITY_KEY:"testnet-authority-keypair.json"},L=t((_=H.ROOT)=>{let e=_===H.ROOT?H.ROOT:_,E=`${e}/${B.MAINNET_VALIDATOR_KEY}`,o=`${e}/${B.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${B.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${B.TESTNET_VALIDATOR_KEY}`,T=`${e}/${B.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${B.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),P_=t((_=!0)=>{let e=_?`${H.ROOT}/${B.TESTNET_VALIDATOR_KEY}`:`${H.ROOT}/${B.MAINNET_VALIDATOR_KEY}`,E=_?`${H.ROOT}/${B.TESTNET_VALIDATOR_VOTE_KEY}`:`${H.ROOT}/${B.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${H.ROOT}/${r_.LOG}`,i=U.ACCOUNTS,n=U.LEDGER,T=U.SNAPSHOTS,s=`${H.ROOT}/${r_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var E_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",gE="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",bt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",wt=9,R_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",vt="So11111111111111111111111111111111111111112",Ht="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Yt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",gt;(function(_){_[_.ELSOL=R_]="ELSOL",_[_.SOL=vt]="SOL",_[_.USDC=Ht]="USDC",_[_.EPCT=Yt]="EPCT"})(gt||(gt={}));var yt;(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"})(yt||(yt={}));var GC={[vt]:9,[R_]:9,[Ht]:6,[Yt]:6},Ve="/home/solv/currentEpoch.json";var be="https://api.testnet.solana.com";import{spawnSync as yE}from"child_process";var Jt=t(()=>{yE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=W.NODE_VERSION;yE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),yE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var t_={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"},Se={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{spawnSync as Y}from"child_process";var we=t((_=t_.tag,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/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):(Y(`mkdir /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),Y(`cd /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),Y(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}-jito`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_}-jito checkout ${_}-jito`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_}-jito submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),Y(`CI_COMMIT=$(git -C /tmp/${_}-jito rev-parse HEAD) /tmp/${_}-jito/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-jito`,{shell:!0,stdio:"inherit"}),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/${_}-jito /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),Y(`sudo rm -rf /tmp/${_}-jito`,{shell:!0,stdio:"inherit"})):e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):Y(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as WT,writeFile as XT}from"fs/promises";import{homedir as jT}from"os";var re=t(async _=>{let E=`${jT()}/${r_.JITO_CONFIG}`,i={...JSON.parse(await WT(E,"utf8")),..._},n=JSON.stringify(i,null,2);await XT(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as xt}from"child_process";import zT from"inquirer";var Qt=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";xt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;xt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),qt=t(async()=>await zT.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Re}from"@skeet-framework/utils";import ZT from"chalk";import _s from"inquirer";var $t=t(async()=>{let _=await _s.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Re("sudo ufw delete allow 8899/udp"),await Re("sudo ufw delete allow 8899/tcp"),await Re(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await Re(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await Re("sudo ufw reload"),console.log(ZT.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var es=t(()=>at,"getSolvVersion"),J_=es;import{readFile as os,writeFile as is}from"fs/promises";import{existsAsync as ns}from"@skeet-framework/utils";var KE;(function(_){_.EN="en",_.JA="ja"})(KE||(KE={}));var rc=Object.values(KE),c;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(c||(c={}));var Wt=Object.values(c),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var Xt=Object.values(D),d;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.BAM="bam",_.NONE="none"})(d||(d={}));var Rc=Object.values(d).filter(_=>_!=="none"),w;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(w||(w={}));var jt=Object.values(w).filter(_=>_!=="none"),X;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(X||(X={}));var ts={NETWORK:c.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:d.NONE,RPC_TYPE:w.AGAVE,MNT_DISK_TYPE:X.TRIPLE,TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:v,NODE_VERSION:At,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:Ot,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:lt,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:P,ACCOUNTS_PATH:b_,SNAPSHOTS_PATH:n_,MOD:!1},N_=ts;import{homedir as Ts}from"os";var ss=t(async()=>{let e=`${Ts()}/${me}`;return await ns(e)?JSON.parse(await os(e,"utf-8")):(console.log("Creating default config file at",e),await is(e,JSON.stringify(N_,null,2)),N_)},"readConfig"),k=ss;import Ss from"node-fetch";var a_=t(async _=>{try{let e=await k();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
- Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await Ss(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 cs}from"child_process";import{Connection as zt}from"@solana/web3.js";var ae=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new zt("https://api.testnet.solana.com"):new zt(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(a=>a.votePubkey===e);if(!s)return T.delinquent.find(R=>R.votePubkey===e)?(i.isActive=!1,i.reason="Validator is delinquent.",i):(i.isActive=!1,i.reason="Validator is not found in both current and delinquent lists.",i);if(T=await n.getVoteAccounts(),s=T.current.find(a=>a.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,C=await n.getSlot()-S;return C>o?(i.isActive=!1,i.reason=`Validator has not voted for ${C} slots.`,i):(i.isActive=!0,i.reason="Validator is active and voting.",i)}catch(n){return console.error(n),i.isActive=!1,i.reason="Failed to check validator status.",i}},"isValidatorActive");import{spawnSync as rs}from"child_process";var M=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=rs(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var Rs=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),J=Rs;import{sendDiscord as as}from"@skeet-framework/utils";var Zt=30,Cs=t(async _=>{try{let e=_.NETWORK===c.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=L(),n=M(e?o:E),T=await ae(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=Zt){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${Zt} 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 as(S),!1}console.log("Waiting for validator to catch up..."),await J(60*1e3),T=await ae(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),_o=Cs;var ds=t(async _=>{let e=_.NETWORK===c.MAINNET,E=_.VALIDATOR_TYPE===d.FRANKENDANCER,{mainnetValidatorKey:o,testnetValidatorKey:i}=L(),n=e?o:i,T=!1;E?T=e?kt:Vt:T=e?Kt:Gt,T=T&&_.AUTO_RESTART;let s=M(n),S=`**${s}** updated solv to **${J_()}**`;if(await a_(S),T){let r=`Restarting **${s}**
8
- _ _`;await a_(r);try{cs("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(O){let I=`Error restarting **${s}**: ${O?.message||"Unknown error"}`;return await a_(I),!1}let C=Math.floor(Date.now()/1e3),a=`**${s}** has restarted, catching up...
9
- at: <t:${C}> (${C})
10
- _ _`;await a_(a),await J(180*1e3);let R=await _o(_);if(R){let I=Math.floor(Date.now()/1e3)-C,l=Math.floor(I/60),F=I%60,G=l>0?`${l}m ${F}s`:`${F}s`,A=`**${s}** has caught up!
11
- at: <t:${C}> (${C})
12
- **${s}** took **${G}** to catch up after restart!
13
- _ _`;await a_(A)}else{let O=`**${s}** failed to catch up after update`;await a_(O)}return R}return!0},"autoUpdate"),eo=ds;import{homedir as Ns}from"os";import{readFile as Os,writeFile as Eo}from"fs/promises";import{existsAsync as ls}from"@skeet-framework/utils";var u=t(async _=>{let E=`${Ns()}/${me}`;await ls(E)||(console.log("Creating default config file at",E),await Eo(E,JSON.stringify(N_,null,2)));let i={...JSON.parse(await Os(E,"utf8")),..._},n=JSON.stringify(i,null,2);await Eo(E,n)},"updateDefaultConfig");var Fs={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"},ve=Fs;var Is={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:"},to=Is;var Ds={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}"}},He=Ds;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"}},oo=Ps;var Ye=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Je=[[],[") 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 io=[") \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"],no=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var fs={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},xe=fs;var Us={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"}},To=Us;var Qe=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var so=[") \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 As=t(_=>{let e={cmds:ve,subCmds:xe,logs:He,installer:Ye,installerSub:Je,clientCmds:Qe};switch(_){case B_.EN:e={cmds:ve,subCmds:xe,logs:He,installer:Ye,installerSub:Je,clientCmds:Qe};break;case B_.JA:e={cmds:to,subCmds:To,logs:oo,installer:io,installerSub:no,clientCmds:so};break;default:e={cmds:ve,subCmds:xe,logs:He,installer:Ye,installerSub:Je,clientCmds:Qe}}return e},"readLocale"),So=As;import{existsSync as ps,readFileSync as ms,writeFileSync as ro}from"fs";import{readFileSync as Ls,writeFileSync as Ms}from"fs";import{homedir as us}from"os";var x_=t(_=>{let E=`${us()}/${r_.CONFIG}`,i={...JSON.parse(Ls(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ms(E,n)},"updateSolvConfig");import{homedir as hs}from"os";var Ro=t(()=>{let e=`${hs()}/${r_.CONFIG}`;ps(e)||(ro(e,JSON.stringify(W,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(ms(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),ro(e,JSON.stringify(W,null,2)),E=W}let o=So(E.LANG);return E.RPC_URL||(E.RPC_URL=W.RPC_URL,x_({RPC_URL:W.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,x_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",x_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as K}from"child_process";import{promises as ao}from"fs";import gs 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
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
+ at: <t:${R}> (${R})
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
+ at: <t:${R}> (${R})
12
+ **${S}** took **${P}** to catch up after restart!
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"),qe=Bs;var $e=t(async(_,e,E=!1)=>{let o=_.NETWORK===c.TESTNET,i=e||(o?H_:I_),n=E||_.MOD,{filePath:T,body:s}=qe();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 ao.mkdir(gs.dirname(T),{recursive:!0}),await ao.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 ys}from"node:child_process";var co=t(_=>{let e=_.NETWORK===c.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===d.JITO,i=_.VALIDATOR_TYPE===d.FRANKENDANCER,n=_.AUTO_RESTART,T=_.MOD,s=10;n&&!e&&(s=30);let S=e?T_:v;o&&(S=s_,e&&(S=se)),i&&(S=I_,e&&(S=H_)),E&&(S=h_,o&&(S=Ut)),N.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${S}`,S).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).option("--mod","Modified Versions",!1).action(async r=>{let C=J_(),a=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(Co.white(`Current solv version: ${C}`)),r.auto){await eo(_);return}if(r.migrateConfig){let R=Ro().config,O=X.TRIPLE;R.DISK_TYPES===0?O=X.DOUBLE:R.DISK_TYPES===1?O=X.SINGLE:O=X.TRIPLE;let I=R.SOLANA_NETWORK===D_.TESTNET,l=R.SOLV_TYPE===Ge.RPC_NODE,F=R.MAINNET_TYPE===ke.JITO_MEV,G={NETWORK:I?c.TESTNET:c.MAINNET,NODE_TYPE:l?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:O,RPC_TYPE:l?w.JITO:w.NONE,VALIDATOR_TYPE:F?d.JITO:I?d.AGAVE:d.SOLANA,TESTNET_SOLANA_VERSION:R.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:R.MAINNET_SOLANA_VERSION,NODE_VERSION:R.NODE_VERSION,TESTNET_DELINQUENT_STAKE:R.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:R.MAINNET_DELINQUENT_STAKE,COMMISSION:R.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:R.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:R.STAKE_ACCOUNT,HARVEST_ACCOUNT:R.HARVEST_ACCOUNT,IS_MEV_MODE:R.IS_MEV_MODE,RPC_URL:R.RPC_URL,KEYPAIR_PATH:R.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:R.DISCORD_WEBHOOK_URL,AUTO_UPDATE:R.AUTO_UPDATE,AUTO_RESTART:R.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:R.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await u(G)}if(r.config){if(await u({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:v}),o){let R=e?se:s_;await re({version:R,tag:`v${R}`})}console.log(Co.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(r.firewall){await $t();return}if(r.background){let R=r.version,O=!!R.startsWith("3");if(await u({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:v}),o){we(`v${R}`,r.mod||T,O),await re({version:R,tag:`v${R}`}),await Ke(a,!0,s);return}if(i){await $e(_,R,r.mod||T),await Ke(a,!0,s);return}await ye(R,r.mod||T,O);let I=e?10:5;e&&ys("solv start",{stdio:"inherit",shell:!0}),await Ke(I,!0,s);return}else if(r.commission){let R=await qt();Qt(R.commission,e)}else Jt()})},"updateCommands");import{spawnSync as Ks}from"node:child_process";var No=t(_=>{try{let{log:e}=P_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Ks(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 Oo=t(()=>{N.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(_=>{No(_)})},"logCommands");import O_ from"chalk";import{spawnSync as Gs}from"child_process";import{homedir as ks}from"os";var We=t(_=>{let e=ks(),E=L(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=D_.TESTNET,s=_.COMMISSION;_.NETWORK===c.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=D_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===c.TESTNET&&(S=D_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;Gs(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Xe}from"child_process";import{existsSync as lo,readdirSync as Vs,rmSync as bs}from"fs";import{homedir as ws}from"os";import Fo from"path";var je=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[B.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===c.TESTNET?(e=[B.TESTNET_VALIDATOR_KEY,B.TESTNET_VALITATOR_AUTHORITY_KEY,B.TESTNET_VALIDATOR_VOTE_KEY,B.MAINNET_VALIDATOR_KEY,B.MAINNET_VALITATOR_AUTHORITY_KEY,B.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[B.MAINNET_VALIDATOR_KEY,B.MAINNET_VALITATOR_AUTHORITY_KEY,B.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;Xe(o,{shell:!0,stdio:"ignore"});let i=Vs("./").filter(S=>S.endsWith("SV.json")),n=ws(),T=Fo.join(n,"unstaked-identity.json");lo(T)&&Xe(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=Fo.join(n,e[s]);if(s++,lo(r)){console.log(`${r} is already exist!`),bs(S,{recursive:!0});continue}let C=`mv ${S} ${r}`;Xe(C,{shell:!0,stdio:"inherit"})}Xe("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 Do}from"child_process";var vs=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
 
@@ -5810,19 +5810,19 @@ Environment=RUST_LOG=info
5810
5810
  Environment=PATH=/home/solv/.local/share/solana/install/active_release/bin:/home/solv/.local/share/pnpm:/home/solv/.cargo/env:/home/solv/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/solv/.local/share/pnpm/npx
5811
5811
 
5812
5812
  [Install]
5813
- WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),Io=vs;import Hs from"inquirer";import Ys from"chalk";var Js=t(async()=>{let _=await Hs.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);Do(`sudo apt-get install unzip wget -y
5813
+ WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),uo=$s;import Ws from"inquirer";import Xs from"chalk";var js=t(async()=>{let _=await Ws.prompt([{name:"rpcUrl",message:"Enter RPC URL",type:"input",default:"http://localhost:8899"},{name:"grpcUrl",message:"Enter GRPC URL",type:"input",default:"http://localhost:10000"},{name:"grpcToken",message:"Enter GRPC Token",type:"input",default:"token"}]);po(`sudo apt-get install unzip wget -y
5814
5814
  wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5815
5815
  unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5816
5816
  chmod +x jupiter-swap-api
5817
- rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=Io(_.rpcUrl,_.grpcUrl,_.grpcToken);Do(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(Ys.white(`\u{1F7E2} Jupiter Swap API Setup Completed
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"),Po=Js;import{existsAsync as xs}from"@skeet-framework/utils";import{readFile as Qs,writeFile as fo}from"fs/promises";import{homedir as qs}from"os";import $s from"path";var o_=t(async()=>{let _=qs(),e=$s.join(_,r_.JITO_CONFIG);await xs(e)||(await fo(e,JSON.stringify(t_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Qs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await fo(e,JSON.stringify(t_,null,2)),E=t_}return E},"readOrCreateJitoConfig");import{spawnSync as Ws}from"child_process";var Ce=t(()=>{Ws("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import ce from"chalk";import ze from"inquirer";import Xs from"inquirer";var Uo=t(async _=>{let E=Object.keys(_?Se.TESTNET:Se.MAINNET),o=_?Se.TESTNET:Se.MAINNET,i=await Xs.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:t_.version,tag:t_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR,bamUrl:T.BAM_URL}},"askJitoSetting");var js=t(async()=>{try{let _=d.NONE,e=w.AGAVE,E=N_.COMMISSION,o=!1,i=await ze.prompt([{name:"network",type:"list",message:"Choose Network",choices:Wt,default:c.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Xt,default:D.RPC}]),n=i.network===c.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===c.MAINNET?[d.JITO,d.SOLANA]:[d.AGAVE,d.JITO,d.FRANKENDANCER,d.BAM];_=await ze.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:d.AGAVE}).then(r=>r.validatorType),e=w.NONE}if(i.nodeType===D.RPC&&(e=await ze.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:jt,default:w.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await ze.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${N_.COMMISSION}%)'`,default:N_.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,_===d.JITO||_===d.FRANKENDANCER||_===d.BAM){await o_();let r=await Uo(n);await re(r)}}let{network:T,nodeType:s}=i;return console.log(ce.white("Network:",T)),console.log(ce.white("Node Type:",s)),console.log(ce.white("Validator Type:",_)),console.log(ce.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(ce.white("Commission:",E)),await u({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Ao=js;import{spawnSync as j}from"child_process";var de=t((_=s_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-jito`;j(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),j(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${o} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),j(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),j(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),j("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),j(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${o} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),j(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),j("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?j(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):j(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-jito/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var Lo=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
- --identity ${f} \\
5822
- --log ${b} \\
5823
- --accounts ${b_} \\
5824
- --ledger ${P} \\
5825
- --snapshots ${n_} \\
5821
+ --identity ${U} \\
5822
+ --log ${w} \\
5823
+ --accounts ${H_} \\
5824
+ --ledger ${f} \\
5825
+ --snapshots ${i_} \\
5826
5826
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5827
5827
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5828
5828
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
@@ -5855,13 +5855,13 @@ 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 _S}from"@skeet-framework/utils";import{writeFile as eS}from"fs/promises";import{spawnSync as zs}from"node:child_process";var Zs=t(()=>{let _=`sudo chmod +x ${F_}`;zs(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Ne=Zs;var Mo=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
- --identity ${f} \\
5861
- --log ${b} \\
5862
- --accounts ${b_} \\
5863
- --ledger ${P} \\
5864
- --snapshots ${n_} \\
5860
+ --identity ${U} \\
5861
+ --log ${w} \\
5862
+ --accounts ${H_} \\
5863
+ --ledger ${f} \\
5864
+ --snapshots ${i_} \\
5865
5865
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5866
5866
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5867
5867
  --entrypoint entrypoint3.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 ES=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case w.AGAVE:console.log("Agave RPC Node Setup"),Y_(_.TESTNET_SOLANA_VERSION),E=Mo();break;case w.JITO:console.log("JITO RPC Node Setup"),de(se),E=Lo();break;default:console.log("Unknown RPC Node Setup");break}if(await _S(F_)){console.log("Startup script already exists. Skipping...");return}await eS(F_,E,"utf-8"),Ne()},"setupRpcNode"),uo=ES;import{spawnSync as tS}from"node:child_process";var oS=t(_=>{tS(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/v${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),VE=oS;import po from"chalk";import{spawnSync as iS}from"child_process";var mo=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;iS(e,{shell:!0,stdio:"inherit"})}catch{console.log(po.yellow(`You might need to install the Solana SPL CLI:
5895
- `)),console.log(po.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as TS}from"os";import{spawnSync as nS}from"child_process";var f_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=nS(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import sS from"chalk";import{spawnSync as SS}from"node:child_process";var ho=t(_=>{N.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=`${TS()}/mainnet-authority-keypair.json`;await mo(o),process.exit(0)}await rS(_),process.exit(0)})},"balanceCommands"),rS=t(async _=>{let e=z(_),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,13 +5904,13 @@ 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(sS.white(E)),SS(`solana-keygen pubkey ${f}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),z=t(_=>{let e=L(),E=_.NETWORK===c.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:f_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:M(e.testnetValidatorKey),validatorKeyBalance:f_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:M(e.testnetValidatorVoteKey),voteKeyBalance:f_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:M(e.testnetValidatorAuthorityKey),authorityKeyBalance:f_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:M(e.mainnetValidatorKey),validatorKeyBalance:f_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:M(e.mainnetValidatorVoteKey),voteKeyBalance:f_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:M(e.mainnetValidatorAuthorityKey),authorityKeyBalance:f_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");var Bo=t((_=0,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=z(i),r=v_.filter(a=>a!==T).map(a=>`--known-validator ${a} \\`).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
- --identity ${f} \\
5911
- --vote-account ${k_} \\
5912
- --authorized-voter ${V} \\
5913
- --log ${b} \\
5910
+ --identity ${U} \\
5911
+ --vote-account ${w_} \\
5912
+ --authorized-voter ${b} \\
5913
+ --log ${w} \\
5914
5914
  --accounts ${i.ACCOUNTS_PATH} \\
5915
5915
  --ledger ${i.LEDGER_PATH} \\
5916
5916
  --snapshots ${i.SNAPSHOTS_PATH} \\
@@ -5937,13 +5937,13 @@ ${r}
5937
5937
  --snapshot-interval-slots 0 \\
5938
5938
  --private-rpc \\
5939
5939
  --full-rpc-api \\
5940
- `},"startJitoMainnetScript");var go=t((_=1e4,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=z(i),r=w_.filter(a=>a!==T).map(a=>`--known-validator ${a} \\`).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
- --identity ${f} \\
5944
- --vote-account ${V_} \\
5945
- --authorized-voter ${h} \\
5946
- --log ${b} \\
5943
+ --identity ${U} \\
5944
+ --vote-account ${v_} \\
5945
+ --authorized-voter ${g} \\
5946
+ --log ${w} \\
5947
5947
  --accounts ${i.ACCOUNTS_PATH} \\
5948
5948
  --ledger ${i.LEDGER_PATH} \\
5949
5949
  --snapshots ${i.SNAPSHOTS_PATH} \\
@@ -5969,13 +5969,13 @@ ${r}
5969
5969
  --expected-shred-version 41708 \\
5970
5970
  --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
5971
5971
  --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5972
- `},"startJitoTestnetScript");var yo=t((_,e="agave-validator")=>{let{validatorKeyAddress:E}=z(_),n=v_.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
- --identity ${f} \\
5976
- --vote-account ${k_} \\
5977
- --authorized-voter ${V} \\
5978
- --log ${b} \\
5975
+ --identity ${U} \\
5976
+ --vote-account ${w_} \\
5977
+ --authorized-voter ${b} \\
5978
+ --log ${w} \\
5979
5979
  --accounts ${_.ACCOUNTS_PATH} \\
5980
5980
  --ledger ${_.LEDGER_PATH} \\
5981
5981
  --snapshots ${_.SNAPSHOTS_PATH} \\
@@ -5997,13 +5997,13 @@ ${n}
5997
5997
  --block-verification-method unified-scheduler \\
5998
5998
  --snapshot-interval-slots 0 \\
5999
5999
  --private-rpc \\
6000
- `},"startMainnetValidatorScript");var bE=t(_=>{let{validatorKeyAddress:e}=z(_),i=w_.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
- --identity ${f} \\
6004
- --vote-account ${V_} \\
6005
- --authorized-voter ${h} \\
6006
- --log ${b} \\
6003
+ --identity ${U} \\
6004
+ --vote-account ${v_} \\
6005
+ --authorized-voter ${g} \\
6006
+ --log ${w} \\
6007
6007
  --accounts ${_.ACCOUNTS_PATH} \\
6008
6008
  --ledger ${_.LEDGER_PATH} \\
6009
6009
  --snapshots ${_.SNAPSHOTS_PATH} \\
@@ -6024,13 +6024,13 @@ ${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 Yo}from"fs/promises";var Ko=t((_=0,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=z(n),C=v_.filter(R=>R!==s).map(R=>`--known-validator ${R} \\`).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
- --identity ${f} \\
6031
- --vote-account ${k_} \\
6032
- --authorized-voter ${V} \\
6033
- --log ${b} \\
6030
+ --identity ${U} \\
6031
+ --vote-account ${w_} \\
6032
+ --authorized-voter ${b} \\
6033
+ --log ${w} \\
6034
6034
  --accounts ${n.ACCOUNTS_PATH} \\
6035
6035
  --ledger ${n.LEDGER_PATH} \\
6036
6036
  --snapshots ${n.SNAPSHOTS_PATH} \\
@@ -6039,7 +6039,7 @@ exec ${T} \\
6039
6039
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
6040
6040
  --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
6041
6041
  --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
6042
- ${C}
6042
+ ${a}
6043
6043
  --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
6044
6044
  --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
6045
6045
  --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
@@ -6058,20 +6058,20 @@ ${C}
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 wE=t((_=s_,e=!1,E=!1)=>{if(E)if(e){let o=`v${_}-mod`;Z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/v${o}/installer)"`,{shell:!0,stdio:"inherit"})}else{let o=`v${_}-bam`;Z(`mkdir /tmp/${o}`,{shell:!0,stdio:"inherit"}),Z(`cd /tmp/${o}`,{shell:!0,stdio:"inherit"}),Z(`git -C /tmp/${o} clone https://github.com/jito-labs/bam-client.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),Z(`git -C /tmp/${o} checkout ${o}`,{shell:!0,stdio:"inherit"}),Z(`git -C /tmp/${o} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),Z(`CI_COMMIT=$(git -C /tmp/${o} rev-parse HEAD) /tmp/${o}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${o}`,{shell:!0,stdio:"inherit"}),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/${o} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),Z(`sudo rm -rf /tmp/${o}`,{shell:!0,stdio:"inherit"}),Z("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})}else e?Z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/v${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):Z(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/v${_}-bam/install)"`,{shell:!0,stdio:"inherit"})},"installBam");var Go=t((_=1e4,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=z(n),C=w_.filter(R=>R!==s).map(R=>`--known-validator ${R} \\`).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
- --identity ${f} \\
6065
- --vote-account ${V_} \\
6066
- --authorized-voter ${h} \\
6067
- --log ${b} \\
6064
+ --identity ${U} \\
6065
+ --vote-account ${v_} \\
6066
+ --authorized-voter ${g} \\
6067
+ --log ${w} \\
6068
6068
  --accounts ${n.ACCOUNTS_PATH} \\
6069
6069
  --ledger ${n.LEDGER_PATH} \\
6070
6070
  --snapshots ${n.SNAPSHOTS_PATH} \\
6071
6071
  --entrypoint entrypoint.testnet.solana.com:8001 \\
6072
6072
  --entrypoint entrypoint2.testnet.solana.com:8001 \\
6073
6073
  --entrypoint entrypoint3.testnet.solana.com:8001 \\
6074
- ${C}
6074
+ ${a}
6075
6075
  --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\
6076
6076
  --tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\
6077
6077
  --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
@@ -6091,11 +6091,11 @@ ${C}
6091
6091
  --expected-shred-version 41708 \\
6092
6092
  --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
6093
6093
  --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
6094
- `},"startBamTestnetScript");import{spawnSync as p}from"child_process";import{promises as HE}from"fs";import dS from"path";var RS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6094
+ `},"startBamTestnetScript");import{spawnSync as h}from"child_process";import{promises as $E}from"fs";import PS from"path";var lS=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6095
6095
  sudo chmod -R 755 /mnt
6096
6096
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
6097
6097
  sudo chown -R solv:solv /mnt
6098
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),ko=RS;var aS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6098
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),xo=lS;var FS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6099
6099
  Description=Firedancer Solana
6100
6100
  After=network.target
6101
6101
  StartLimitIntervalSec=0
@@ -6111,7 +6111,7 @@ ExecStart=/home/solv/start-firedancer.sh
6111
6111
 
6112
6112
  [Install]
6113
6113
  WantedBy=multi-user.target
6114
- `}),"firedancerService"),Vo=aS;var CS=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6114
+ `}),"firedancerService"),Qo=FS;var IS=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6115
6115
  user = "solv"
6116
6116
 
6117
6117
  [log]
@@ -6278,7 +6278,7 @@ user = "solv"
6278
6278
  commission_bps = 10000
6279
6279
 
6280
6280
  [tiles.pack]
6281
- schedule_strategy = "balanced"`:o}},"configToml"),bo=CS;var cS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6281
+ schedule_strategy = "balanced"`:o}},"configToml"),qo=IS;var DS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6282
6282
  Description=Relay port 9600 to localhost:80
6283
6283
  After=network.target
6284
6284
 
@@ -6288,7 +6288,7 @@ Restart=always
6288
6288
 
6289
6289
  [Install]
6290
6290
  WantedBy=multi-user.target
6291
- `}),"portRelayService"),wo=cS;var vE=t((_=W.USERNAME,e)=>{let{log:E}=P_(),o=e?"frankendancer":"agave",i=`${E} {
6291
+ `}),"portRelayService"),$o=DS;var qE=t((_=$.USERNAME,e)=>{let{log:E}=D_(),o=e?"frankendancer":"agave",i=`${E} {
6292
6292
  su ${_} ${_}
6293
6293
  daily
6294
6294
  rotate 1
@@ -6320,14 +6320,14 @@ WantedBy=multi-user.target
6320
6320
  compress
6321
6321
  copytruncate
6322
6322
  }
6323
- `),i)},"logRotates");import{existsSync as vo}from"fs";import{execSync as Ho}from"child_process";function Q_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&vo(m.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!vo(m.SOL_LOGROTATE)){let e=vE("solv",_);Ho(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=vE("solv",_);Ho(`echo "${e}" | sudo tee ${m.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(Q_,"setupLogrotate");var NS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===c.TESTNET),o=E?H_:I_,{filePath:i,body:n}=qe();_?(p('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),p('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await HE.mkdir(dS.dirname(i),{recursive:!0}),await HE.writeFile(i,n,"utf8"),p(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),p(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(p("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),p(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),p("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),p("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await o_(),{filePath:s,body:S}=ko();p(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),p(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Vo();p(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let C=wo();p("sudo apt install socat",{shell:!0,stdio:"inherit"}),p("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),p(`echo "${C.body}" | sudo tee ${C.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),p("sudo systemctl daemon-reload",{shell:!0});let a=bo(E,T);await HE.writeFile(a.filePath,a.body,"utf-8"),console.log(`config.toml written to ${a.filePath}`),p(`sudo chown solv:solv "${a.filePath}"`,{shell:!0,stdio:"inherit"}),Q_(!0)},"setupFiredancer"),Oe=NS;var OS=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===c.MAINNET?(console.log("Mainnet Validator Node Setup"),await lS(_,e)):E===c.TESTNET?(console.log("Testnet Validator Node Setup"),await FS(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),lS=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 d.SOLANA:VE(o),n=yo(_);break;case d.JITO:console.log("JITO Validator Setup for Mainnet");let s=await o_();de(o,e,T),n=Bo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,_);break;case d.BAM:console.log("JITO Validator Setup for Mainnet");let S=await o_();wE(o,e,T),n=Ko(S.commissionBps,S.relayerUrl,S.blockEngineUrl,S.shredReceiverAddr,S.bamUrl,_);break;case d.FRANKENDANCER:await Oe(e,_);break;default:console.log("Unknown Validator Type for Mainnet");break}await Yo(F_,n,"utf-8"),Ne()},"setupMainnetValidator"),FS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o}=_;e=o;let i="",n=!!_.TESTNET_SOLANA_VERSION.startsWith("3");switch(E){case d.SOLANA:VE(_.TESTNET_SOLANA_VERSION),i=bE(_);case d.AGAVE:console.log("Agave Validator Setup for Testnet"),Y_(_.TESTNET_SOLANA_VERSION,e,n),i=bE(_);break;case d.JITO:console.log("JITO Validator Setup for Testnet");let T=await o_();de(_.TESTNET_SOLANA_VERSION,e,n),i=go(T.commissionBps,T.relayerUrl,T.blockEngineUrl,T.shredReceiverAddr,_);break;case d.BAM:console.log("BAM Validator Setup for Mainnet");let s=await o_();wE(_.TESTNET_SOLANA_VERSION,e,n),i=Go(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,s.bamUrl,_);break;case d.FRANKENDANCER:console.log("FRANKENDANCER Validator Setup for Mainnet"),await Oe(e,_);break;default:console.log("Unknown Validator Type for Testnet");break}await Yo(F_,i,"utf-8"),Ne()},"setupTestnetValidator"),Jo=OS;import QE from"chalk";import{execSync as xo}from"node:child_process";function Qo(_){try{xo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{xo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(Qo,"createDirectoryIfNotExists");var qo=t(()=>{try{let _=[U.ACCOUNTS,U.LEDGER,U.SNAPSHOTS];for(let e of _)Qo(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as IS}from"child_process";function DS(){let e=IS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6324
- `).slice(1),E=[],o=e.map(l=>l.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let l of e){let[F,G,A]=l.trim().split(/\s+/);if(!F||!G)continue;let $=parseInt(G,10);if(isNaN($))continue;let c_=A!==void 0&&A!=="";A==="/"&&(S=F.replace(/p?\d*$/,""));let u_=o.some(ne=>ne!==F&&ne.startsWith(F)),ie=F.startsWith("nvme")?"NVMe":"SATA";$>=400*1024*1024*1024&&E.push({name:F,size:$,mountpoint:A||"",isMounted:c_,hasPartition:u_,type:ie})}console.log("Found root disk name: ",S);let r=o.filter(l=>l.startsWith(S));r.forEach(l=>console.log("Found root disk partition: ",l));let a=E.filter(l=>!r.includes(l.name)).sort((l,F)=>F.size-l.size),R=a.filter(l=>l.type==="NVMe").sort((l,F)=>F.size-l.size),O=a.filter(l=>l.type==="SATA").sort((l,F)=>F.size-l.size),I=[...R,...O];if(I.length>0){let l=I[0];if(l.size>=850*1024*1024*1024&&!l.isMounted&&(i=!0),l.size>=1250*1024*1024*1024&&l.isMounted&&(T=!0),I.length>1){let F=I[1];F.size>=400*1024*1024*1024&&!F.isMounted&&(n=!0)}if(I.length>2){let F=I[2];F.size>=400*1024*1024*1024&&!F.isMounted&&(s=!0)}}return I.forEach((l,F)=>console.log(`Prioritized Disk ${F+1}: ${l.name} ${l.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(DS,"getPreferredDisks");var le=DS;import{spawnSync as q_}from"child_process";var U_=t(_=>{if(q_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return q_("sudo udevadm trigger --action=change",{shell:!0}),q_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return q_(E,{shell:!0,stdio:"inherit"}),q_("sudo udevadm trigger --action=change",{shell:!0}),q_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as Ze}from"child_process";async function YE(_){for(let e=1;e<=5;e++){let o=Ze(`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(YE,"getUUID");var Fe=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await YE(_),T=await YE(e),s=await YE(E),S=`${n} ${U.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${U.LEDGER} ext4 defaults 0 0
6325
- ${T} ${U.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${U.LEDGER} ext4 defaults 0 0
6326
- ${T} ${U.ACCOUNTS} ext4 defaults 0 0
6327
- ${s} ${U.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],a=Ze("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,R=[];for(let O of r)a.includes(O)||(console.log(`[INFO] Line to add: ${O}`),R.push(O));if(R.length){console.log(`[INFO] Lines to add all: ${R}`);let O=`echo "${R.join(`
6328
- `)}" | sudo tee -a /etc/fstab`;Ze(O,{shell:!0,encoding:"utf8"}),Ze("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6329
- ${R.join(`
6330
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as PS}from"child_process";var $o=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 fS=t(async()=>{let _=le(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await u({MNT_DISK_TYPE:X.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=U_(E),T=U_(o),s=U_(i),S=n?E:"",r=T?o:"",C=s?i:"";console.log("Waiting for formatting to finish..."),await J(5e3),await Fe(n?S:"",T?r:"",s?C:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await u({MNT_DISK_TYPE:X.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=U_(E),n=U_(o);await Fe(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await u({MNT_DISK_TYPE:X.SINGLE}),e.includes("/mnt")){$o(e);let E="/dev/"+_.disks[0].name;U_(E),await Fe(E)}else{let E="/dev/"+_.disks[0].name;U_(E),await Fe(E)}},"mountDirs"),Wo=fS;import{spawnSync as US}from"child_process";var Xo=t(()=>{let _=[`sudo mkdir -p ${U.ROOT}`,`sudo chown -R solv:solv ${U.ROOT}`,`sudo chmod -R 755 ${U.ROOT}`,`sudo mkdir -p ${U.ACCOUNTS}`,`sudo chown -R solv:solv ${U.ACCOUNTS}`,`sudo chmod -R 755 ${U.ACCOUNTS}`,`sudo mkdir -p ${U.LEDGER}`,`sudo chown -R solv:solv ${U.LEDGER}`,`sudo chmod -R 755 ${U.LEDGER}`,`sudo mkdir -p ${U.SNAPSHOTS}`,`sudo chown -R solv:solv ${U.SNAPSHOTS}`,`sudo chmod -R 755 ${U.SNAPSHOTS}`];for(let e of _)US(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as _E}from"child_process";import{existsSync as AS}from"fs";function jo(){if(!AS(m.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
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
+ ${T} ${M.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${M.LEDGER} ext4 defaults 0 0
6326
+ ${T} ${M.ACCOUNTS} ext4 defaults 0 0
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
+ ${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 _=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
- `;_E(`echo "${_}" | sudo tee ${m.SOL_SYSTEM_CONFIG21} > /dev/null`),_E(`sudo sysctl -p ${m.SOL_SYSTEM_CONFIG21}`),_E(`echo "DefaultFILE=1000000" | sudo tee -a ${m.SOL_SYSTEM_CONF}`),_E(`echo "${e}" | sudo tee ${m.SOL_NOFILES_CONF} > /dev/null`)}}t(jo,"setupSystemd");var LS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",MS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",uS=`/home/${W.USERNAME}/.local/share/solana/install/active_release/bin`,zo=t((_=!0)=>{let{scriptPath:e}=P_(_),E=_?MS:LS,o=uS;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
@@ -6354,14 +6354,14 @@ RestartSec=1
6354
6354
  LimitNOFILE=1000000
6355
6355
  LimitMEMLOCK=infinity
6356
6356
  LogRateLimitIntervalSec=0
6357
- User=${W.USERNAME}
6357
+ User=${$.USERNAME}
6358
6358
  Environment=PATH=${o}
6359
6359
  WorkingDirectory=${H.ROOT}
6360
6360
  Environment="${E}"
6361
6361
  ExecStart=${e}
6362
6362
 
6363
6363
  [Install]
6364
- WantedBy=multi-user.target`},"solvService");import{execSync as pS}from"child_process";function Zo(_=!0){console.log("Creating solvService configuration for solana");let e=zo(_);pS(`echo "${e}" | sudo tee ${m.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(Zo,"setupSolvService");var _i=t((_=!0)=>{Q_(),Zo(_),jo()},"makeServices");import{spawnSync as JE}from"node:child_process";var ei=t(_=>{try{je(_);let e=_.NETWORK;return e===c.TESTNET?(JE(`solana config set --url ${e} -k ${h}`,{shell:!0,stdio:"inherit"}),JE(`solana airdrop 1 --url ${e} -k ${h}`,{shell:!0,stdio:"inherit"})):JE(`solana config set --url ${e} -k ${V}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&We(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as Ei}from"node:child_process";var eE=t((_=!1,e="45",E=n_,o=v,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){Ei(`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}Ei(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as mS}from"node:child_process";var EE=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===d.FRANKENDANCER?"frankendancer":"solv"}`];mS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as hS}from"node:child_process";var BS=t(()=>{try{hS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),ti=BS;import xE from"fs";import{promisify as ii}from"util";import{execSync as oi}from"child_process";var gS=ii(xE.readFile),yS=ii(xE.access),tE="/etc/sysctl.conf",KS=`# 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 GS(){try{await yS(tE,xE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${tE} does not exist`)}try{let _=await gS(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+=`
6376
- ${KS}
6377
- `,oi(`echo "${e}" | sudo tee ${tE} > /dev/null`),oi("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(GS,"updateSysctlConfig");var ni=GS;import{spawnSync as kS}from"child_process";var Ti=t(()=>{kS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as VS}from"node:child_process";var si=t(()=>{VS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Si}from"child_process";var ri=t((_=!1,e=!1)=>{_?wS():bS(e)},"createSymLink"),bS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),Si(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),wS=t(()=>{Si("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import oE from"chalk";var vS=t(()=>{let _=`${oE.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${oE.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
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
+ ${HS}
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: ${oE.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(oE.cyan(e))},"rpcLog"),g_=vS;var Ri=t(async(_,e,E,o)=>{try{_||(console.log(QE.white("\u{1F7E2} Initializing Setup")),await k(),await Ao());let i=await k(),n=i.NETWORK===c.TESTNET;switch(e||(console.log(QE.white("\u{1F7E2} Entering Mount Phase")),qo(),await Wo()),_i(n),Ti(),ti(),await ni(),e||ei(i),ri(i.IS_DUMMY,n),i=await k(),i.NODE_TYPE){case D.RPC:await uo(i);break;case D.VALIDATOR:await Jo(i,o);break;default:throw new Error("Unknown Node Type")}e||Xo(),Ce(),i.VALIDATOR_TYPE!==d.FRANKENDANCER&&(E||(i=await k(),si(),eE(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),e||EE(i),console.log(QE.white("\u{1F7E2} Setup Completed")),g_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var ai=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
@@ -6410,7 +6410,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
6410
6410
  --verifying-key-pem-path=/home/solv/public.pem
6411
6411
 
6412
6412
  [Install]
6413
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),Ci=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6413
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),Di=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6414
6414
  Description=Solana transaction relayer
6415
6415
  Requires=network-online.target
6416
6416
  After=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 iE,spawnSync as A_}from"child_process";var ci=t(async(_,e=!0)=>{A_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),A_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),A_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),A_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),A_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),A_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?ai(_):Ci(_);iE(`echo "${o}" | sudo tee ${E} > /dev/null`),A_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),A_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),iE("sudo ufw allow 11228",{stdio:"inherit"}),iE("sudo ufw allow 11229",{stdio:"inherit"}),iE("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as qE}from"node:child_process";var HS=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"),di=HS;import{spawnSync as YS}from"node:child_process";import{readFile as JS,writeFile as xS}from"fs/promises";var QS=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 xS(_,o),YS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Ni=QS;import qS from"inquirer";import{writeFile as $S}from"node:fs/promises";var Oi=t(async()=>{let e=(await qS.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";qE(E,{shell:!0,stdio:"inherit"}),qE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),qE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=di(e),s=JSON.stringify(T,null,2);await $S(n,s,{encoding:"utf8"}),await Ni()},"yellowstoneGeyser");var li=t(_=>{N.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(O_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),We(_),process.exit(0);else if(e.key)console.log(O_.white("\u{1F511} Setting up Validator Keypairs ...")),je(_),process.exit(0);else if(e.relayer){console.log(O_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await o_()).blockEngineUrl;await ci(i,!1),console.log(O_.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`)),Ce(),g_(),process.exit(0)}else if(e.jupiter)console.log(O_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Po(),Ce(),g_(),process.exit(0);else if(e.geyser){console.log(O_.white("\u26A1\uFE0F Setting up Geyser ...")),await Oi();return}else if(e.firedancer){console.log(O_.white("\u{1F525} Setting up Firedancer ...")),await Oe(E);return}await Ri(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(O_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(O_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as WS}from"child_process";var $E=t(()=>{let E=WS("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)=>y_(n.Avail)-y_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&y_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&y_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&y_(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/")&&y_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Fi from"chalk";import XS from"cli-table3";var WE=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Fi.blue(o)),E=new XS({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=>Fi.white(i)))}),console.log(E.toString())},"displayTable");var Ii=t(async()=>{N.command("df").description("Disk Free Command").action(()=>{let _=$E();WE(_)})},"dfCommands"),y_=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 Di=t(_=>{N.command("start").description("Start Solana Validator").action(()=>{EE(_),process.exit(0)})},"startCommand");import{spawnSync as jS}from"node:child_process";import zS from"chalk";var Pi=t(async _=>{zS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===d.FRANKENDANCER?"frankendancer":"solv"}`];jS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var fi=t(_=>{N.command("stop").description("Stop Solana Validator").action(()=>{Pi(_),process.exit(0)})},"stopCommand");import{spawnSync as Ie}from"node:child_process";import Ui from"chalk";var Ai=t(_=>{let e=S_();N.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===c.TESTNET,n=o&&i?10:30;E.rm&&(console.log(Ui.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ie("solv stop",{stdio:"inherit",shell:!0}),Ie("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ie("solv get snapshot",{stdio:"inherit",shell:!0}),Ie("solv start",{stdio:"inherit",shell:!0}),console.log(Ui.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}`;Ie(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");import{spawnSync as x}from"child_process";var Li=t((_=t_.tag,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/${_}-mod/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/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_}-bam checkout ${_}-bam`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_}-bam submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),x(`CI_COMMIT=$(git -C /tmp/${_}-bam rev-parse HEAD) /tmp/${_}-bam/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-bam`,{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/${_}-bam /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),x(`sudo rm -rf /tmp/${_}-bam`,{shell:!0,stdio:"inherit"})):e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):x(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}-bam/install)"`,{shell:!0,stdio:"inherit"})},"bamUpdate");var Mi=t(_=>{let E=_.NETWORK===c.TESTNET?T_:v;_.NODE_TYPE===D.RPC&&(E=h_),N.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===d.JITO,n=_.VALIDATOR_TYPE===d.BAM,T=_.VALIDATOR_TYPE===d.FRANKENDANCER,s=o.mod||_.MOD;if(i){let C=o.version||s_,a=`v${C}`,R=!!C.startsWith("3");we(a,s,R);return}if(n){let C=o.version||s_,a=`v${C}`,R=!!C.startsWith("3");Li(a,s,R);return}if(T){let C=o.version||I_;$e(_,C,s);return}_.NODE_TYPE===D.RPC&&(E=h_);let r=o.version||E;await ye(r,s)})},"installCommands");import{spawnSync as ZS}from"child_process";var ui=t(()=>{N.command("mtr").description("Mount Reload Command").action(()=>{ZS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),N.command("disks").description("Show unmounted disks").action(()=>{let _=le();console.log(_)})},"mountCommands");import{spawnSync as Er}from"node:child_process";import pi from"chalk";import{spawnSync as _r}from"child_process";var er=t(async()=>{try{let _=_r("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"),nE=er;var mi=t(()=>{N.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 nE()&&(console.log(pi.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 -`;Er(o,{shell:!0,stdio:"inherit"}),console.log(pi.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var De={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 or,mkdirSync as ir}from"fs";import nr from"inquirer";import{homedir as Tr}from"os";import{spawnSync as tr}from"node:child_process";function hi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return tr(i,{shell:!0,stdio:"inherit"}).status===0}t(hi,"executeSCP");var XE=t(async(_="")=>{let e=_;_===""&&(e=(await nr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(L()),o=Tr(),i=o.includes("/home/solv")?"/home/solv":o+De.SOLV_KEYPAIR_DOWNLOAD_PATH;or(i)||ir(i,{recursive:!0});let n=!0,T=o+"/"+ct;E.push(T);for(let s of E){let S=s.split("/"),r=S[S.length-1];r=o.includes("/home/solv")?r:r.replace(".json",`-${e}.json`);let C=`${i}/${r}`;hi(e,s,C,n)&&console.log(`Successfully Exported - ${C} \u{1F389}`)}},"download");import{spawnSync as sr}from"child_process";import{existsSync as Sr}from"fs";import rr from"inquirer";import Rr from"os";var Bi=t(async(_="")=>{let e=Rr.userInfo().homedir,E=_;_===""&&(E=(await rr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${De.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=De.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(L(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let S=`${o}/${s}`;if(!Sr(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;sr(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as ar}from"child_process";import Cr from"inquirer";var gi=t(async()=>{let _=await Cr.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}`;ar(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import TE from"chalk";import{readFileSync as cr}from"fs";import dr from"os";var yi=t(()=>{try{let e=`${dr.userInfo().homedir}/.ssh/id_rsa.pub`,E=cr(e,"utf8");console.log(TE.white(`Your SSH Public Key is:
6442
- `)),console.log(TE.white(E))}catch(_){console.error(TE.white(`Error reading SSH Public Key
6443
- `)),console.error(TE.white(_))}},"cat");import{spawnSync as Nr}from"child_process";var Ki=t(()=>{Nr("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Or}from"child_process";import{readFileSync as lr}from"fs";import{Readable as Fr}from"stream";var Gi=t(async _=>new Promise((e,E)=>{try{let o=Or("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"),Ir=t(_=>{try{return JSON.parse(lr(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),ki=t(async(_,e)=>{let E=[],o=Fr.from(_);return o.on("data",async i=>{Ir(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import sE from"chalk";import{Presets as Ur,SingleBar as Ar}from"cli-progress";import Vi from"chalk";import{spawnSync as Dr}from"node:child_process";import Pr from"node-fetch";var fr=t(async()=>{let _=await Pr(Ft,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(Vi.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)Dr(E,{shell:!0,stdio:"ignore"});return console.log(Vi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),bi=fr;var wi=t(()=>{let _=N.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 XE(e.ip);return}await XE()}),_.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 bi();return}await Bi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await gi()}),_.command("cat").description("Show SSH Public Key").action(()=>{yi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Ki()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Ar({},Ur.shades_classic);e.start(1e4,0);let E=await Gi(e),o=await ki(E,e);e.stop(),console.log(sE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(sE.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(sE.white(`
6447
+ `)}`)),console.log(CE.white(`
6448
6448
  Only showing the first 10 results
6449
6449
 
6450
- `)),console.log(sE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as Lr}from"child_process";var vi=t(_=>{N.command("status").description("Check Solana Validator Status").action(()=>{Mr(_)})},"statusCommands"),Mr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===d.FRANKENDANCER?"frankendancer":"solv"}`;Lr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as ur}from"node:child_process";var Hi=t(async(_,e)=>{try{let E=await k(),o=E.NETWORK===c.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?c.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return ur(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import Ji from"inquirer";import{spawnSync as pr}from"node:child_process";var Yi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=pr(`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 mr,existsAsync as hr}from"@skeet-framework/utils";import{execSync as Br,spawnSync as rE}from"node:child_process";import gr from"node:os";var xi=t(async _=>{let e=_.NETWORK===c.TESTNET;if(!(await Ji.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;rE(`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 Kr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return x_({STAKE_ACCOUNT:S}),Yi(T,Number(i.solAmount))},"stakeAccountQuestion"),yr=gr.userInfo().homedir,SE=yr+"/stake-account",Kr=t(async()=>{await hr(SE)||rE(`mkdir -p ${SE}`,{shell:!0});let _=rE(`ls ${SE}`,{shell:!0}).stdout.toString().split(`
6451
- `).filter(n=>n.includes(".json")),e=mr(_.length+1),E=`${SE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return rE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:Br(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Gr}from"node:child_process";var Qi=t(async _=>{try{let E=(await k()).NETWORK===c.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Gr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as kr}from"node:child_process";var qi=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return kr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import j_ from"chalk";import{Connection as Vr,PublicKey as br}from"@solana/web3.js";import{stakePoolInfo as wr}from"@solana/spl-stake-pool";var RE=t(async(_,e=E_)=>{try{let E=new Vr(_),o=new br(e);return await wr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as vr}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Hr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Yr}from"@metaplex-foundation/umi";var $i=t(async(_,e)=>{try{let E=Yr(e);console.log(`mintPubkey: ${E}`);let o=Hr(_),i=await vr(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import Pe from"chalk";import Wi from"inquirer";var Xi=t(async _=>{let e=await Wi.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:E_}]);try{let E=await RE(_,e.stakePoolAddress);if(!E)return console.log(Pe.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(Pe.white(`For stake pool information
6454
- \u{1F517} https://solanacompass.com/stake-pools/`)),null;let o=E.poolMint,i=await $i(_,o);i||(i={name:o,symbol:o,mint:o,uri:"no metadata"});let n={...i,stakePoolAddress:e.stakePoolAddress},T=`\u{1FA99} ${n.symbol}
6453
+ `)),console.log(Me.white(`For stake pool information
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
- Token Mint: ${n.mint}`;return(await Wi.prompt([{type:"confirm",name:"confirm",message:T+`
6457
- Is this the correct Stake Pool?`}])).confirm?n:(console.log(Pe.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(Pe.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
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(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(Pe.white(`For stake pool information
6460
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as ER}from"fs/promises";import Ae from"inquirer";import{existsAsync as tR}from"@skeet-framework/utils";import{Connection as en,Keypair as jr,PublicKey as Ue}from"@solana/web3.js";import{Connection as Jr,PublicKey as xr,Keypair as Qr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as qr}from"@solana/spl-token";var fe=t(async(_,e,E,o,i=!1)=>{try{let n=Qr.fromSecretKey(new Uint8Array(e)),T=new xr(E),s=new Jr(_);return(await qr(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 zr}from"cli-spinner";import K_ from"chalk";import{PublicKey as zi,Keypair as Zi,Transaction as ji,ComputeBudgetProgram as $r,LAMPORTS_PER_SOL as Wr}from"@solana/web3.js";import*as _n from"@solana/spl-stake-pool";var $_=t(async(_,e,E,o=new zi(E_),i,n,T)=>{try{let s=Zi.fromSecretKey(new Uint8Array(e)),S=E*Wr,{instructions:r,signers:C}=await Xr(_,e,S,o,i,n,T),a=new ji().add(...r);a.feePayer=s.publicKey;let R=await _.getLatestBlockhashAndContext({commitment:"finalized"});a.recentBlockhash=R.value.blockhash,a.sign(...C,s);let O=new ji().add(...r).add($r.setComputeUnitPrice({microLamports:1e3}));O.feePayer=s.publicKey,O.recentBlockhash=R.value.blockhash,O.sign(...C,s);let I=await _.sendRawTransaction(O.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...R.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),Xr=t(async(_,e,E,o=new zi(E_),i,n,T)=>{let S=Zi.fromSecretKey(new Uint8Array(e)).publicKey;return await _n.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as En}from"@skeet-framework/utils";var aE=t(async(_,e,E,o)=>{console.log(K_.white("Solana RPC URL:",_));let i=new en(_);E===0&&(E=await CE());let n=new zr("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(K_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new Ue(e),s=jr.fromSecretKey(new Uint8Array(o)),S=R_;n.setSpinnerTitle(K_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await fe(_,o,S,s.publicKey);await En(1e3),n.setSpinnerTitle(K_.green("\u{1F504} Converting SOL to elSOL"));let C=await $_(i,o,E,T,new Ue(r),new Ue(gE),s.publicKey),a=0;for(;C.status!=="success";){if(a++,a>10)return n.stop(!0),console.log(K_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(K_.yellow(`\u23F3 ${a} Times Retrying...`)),await En(3e3),i=new en(_),C=await $_(i,o,E,T,new Ue(r),new Ue(gE),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:`,C.signature)),!0},"elSOLdeposit");import{Connection as Zr,Keypair as _R,PublicKey as W_}from"@solana/web3.js";import{Spinner as eR}from"cli-spinner";import X_ from"chalk";import{sleep as tn}from"@skeet-framework/utils";var on=t(async(_,e,E,o,i)=>{let n=new Zr(_);E===0&&(E=await CE());let T=new eR("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(X_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new W_(e),S=await RE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(X_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,C=_R.fromSecretKey(new Uint8Array(o)),a=await fe(_,o,r,C.publicKey),R=await fe(_,o,r,new W_(bt),!0);await tn(1e3),T.setSpinnerTitle(X_.green(`\u{1F504} Converting SOL to ${i}`));let O=await $_(n,o,E,s,new W_(a),new W_(R),C.publicKey),I=0;for(;O.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(X_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(X_.yellow(`\u23F3 ${I} Times Retrying...
6463
- `)),await tn(1e3),O=await $_(n,o,E,s,new W_(a),new W_(R),C.publicKey)}return T.stop(!0),console.log(X_.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:`,O.signature)),!0},"depositeLST");import{execSync as cE}from"node:child_process";import{homedir as oR}from"os";var nn=t(_=>{N.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===c.TESTNET,n=oR(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(cE(`solana config set --keypair ${T}`),!await tR(T)){console.log(j_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6466
- `)),console.log(j_.white(T));return}let s=JSON.parse(await ER(T,"utf-8"));if(e.elsol){await aE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await Xi(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await on(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await xi(_))return;let r=await k(),{validatorVoteAccount:C,stakeAccounts:a}=await nR(r);for await(let R of a)try{await Hi(R,C)}catch{console.log(j_.yellow(`Network might be busy, please try again later
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
- `))}}}),N.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await sR();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await iR();for await(let o of E)try{await Qi(o)}catch{console.log(j_.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 SR();await qi(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),CE=t(async()=>{let _=cE("solana address").toString().trim(),e=cE("solana balance").toString().replace("SOL","").trim();console.log(j_.white(`\u{1F4D7} Selected Wallet: ${_}
6471
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(j_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Ae.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),iR=t(async()=>{let _=await k();return await Ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),nR=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===c.TESTNET?TR(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return E}}])},"delegateStakeAsk"),TR=t(_=>{let o=`/home/solv/${_.NETWORK===c.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return cE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),sR=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Ae.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),SR=t(async()=>{let _=(await k()).STAKE_ACCOUNTS;return await Ae.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 rR}from"child_process";var Tn=t(()=>{try{return rR("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as RR}from"child_process";var sn=t(()=>{try{return RR("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import l_ from"chalk";import{Spinner as aR}from"cli-spinner";var z_;(function(_){_.successHex=l_.hex("#39A845"),_.warningHex=l_.hex("#FFD02E"),_.errorHex=l_.hex("#B5332E"),_.syncHex=l_.hex("#3073B7"),_.greyHex=l_.hex("#BEBDBD"),_.indigoHex=l_.hex("#3950A0"),_.pinkHex=l_.hex("#D8A1C4"),_.normal=e=>{console.log(l_.white(e))},_.syncSpinner=e=>{let E=new aR(l_.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${pe}
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,18 +6492,18 @@ $ 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))}})(z_||(z_={}));import i_ from"chalk";import{spawnSync as CR}from"node:child_process";var dE=t(_=>{CR("solana config get",{shell:!0,stdio:"inherit"});let E=P_();console.log(i_.white("start-validator.sh: ")+E.scriptPath),console.log(i_.white("solv.service: ")+m.SOL_SERVICE),console.log(i_.white("logrotate: ")+m.SOL_LOGROTATE),console.log(i_.white("logrotate (fd): ")+m.FRANKENDANCER_LOGROTATE),console.log(i_.white("sysctl.d: ")+m.SOL_SYSTEM_CONFIG21),console.log(i_.white("limits.d: ")+m.SOL_NOFILES_CONF),console.log(i_.white("system.conf: ")+m.SOL_SYSTEM_CONF),console.log(i_.white("ledger: ")+E.ledger),console.log(i_.white("accounts: ")+E.accounts),console.log(i_.white("snapshots: ")+E.snapshots),console.log(i_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Sn}from"node:child_process";import cR from"chalk";var rn=t(_=>{let e=_.NETWORK===c.TESTNET,E=e?T_:v;_.NODE_TYPE===D.RPC&&(E=h_);let o=N.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=Tn();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Sn(i,{shell:!0,stdio:"pipe"});console.log(cR.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=sn();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;eE(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${S_()} --ledger /mnt/ledger/ contact-info`;Sn(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{dE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{z_.solvAA(),i.client?z_.installClientMessage():z_.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as dR}from"node:child_process";var Rn=t(()=>{dR("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as NR}from"node:child_process";var an=t(()=>{NR("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as OR}from"node:child_process";var Cn=t(()=>{OR("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as lR}from"node:child_process";var cn=t(()=>{lR("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as FR}from"node:child_process";var dn=t((_=!1)=>{FR(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import jE from"chalk";import{spawnSync as DR}from"child_process";import{spawnSync as IR}from"node:child_process";var Nn=t(()=>{IR("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var On=t(()=>{let _=N.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{Rn()}),_.command("start").description("Start Relayer").action(()=>{an()}),_.command("stop").description("Stop Relayer").action(()=>{Cn()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{dn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{cn()}),_.command("enable").description("Enable Relayer").action(()=>{Nn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(jE.red("Please provide a URL"));return}let E=`${S_()} --ledger ${P} set-relayer-config --relayer-url ${e.url}`;console.log(jE.white("Setting Relayer URL ...")),DR(E,{shell:!0,stdio:"inherit"}),console.log(jE.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as UR}from"child_process";import{spawnSync as PR}from"child_process";var NE=t(()=>{PR("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as fR}from"child_process";var ln=t(()=>{fR("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var Fn=t(_=>{NE();let e=`sudo rm -rf ${m.SOL_LOGROTATE}`;UR(e,{shell:!0,stdio:"inherit"}),Q_(_),ln()},"updateLogrotate");var In=t(_=>{N.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";Fn(e),process.exit(0)})},"logrotateCommand");import{spawnSync as zE}from"node:child_process";var Dn=t(_=>{zE("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&zE(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),zE("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as AR}from"node:child_process";var Pn=t(_=>{let E=`${S_()} --ledger ${_.LEDGER_PATH} monitor`;AR(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as LR}from"node:child_process";var fn=t(()=>{LR("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import OE from"inquirer";import{execSync as lE,spawnSync as ZE}from"child_process";import Le from"chalk";import{homedir as MR}from"os";var Un=1e3,_t;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(_t||(_t={}));var FE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(FE||(FE={}));var uR=Object.values(_t),An=t(_=>{N.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(Le.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 pR(),n="0";try{let a=ZE(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(a.status!==0)throw new Error("Invalid Wallet Address");n=a.stdout.toString(),console.log("toBalance:",n)}catch{console.log(Le.red(`\u274C To Wallet is Invalid
6498
- Please Check the Wallet Address`)),process.exit(0)}let T=lE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(Le.white(`\u{1F3E6} From Wallet: ${o}
6499
- \u{1F4B0} Balance: ${T}`)),console.log(Le.white(`\u{1F3E6} To Wallet: ${i}
6500
- \u{1F4B0} Balance: ${n}`));let{amount:s}=await OE.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=ZE(S,{shell:!0,stdio:"inherit"}),C=he;for(;r.status!==0&&C>0;)console.log(Le.red(`\u274C Transaction Failed
6501
- Retrying Transaction in ${Un}ms
6502
- Retries Left: ${C}`)),await J(Un),r=ZE(S,{shell:!0,stdio:"inherit"}),C--;process.exit(0)})},"transferCommands"),et=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),pR=t(async()=>{let _=MR(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=lE(`solana address -k ${o}`).toString().trim(),n=await OE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:uR}]),T=n.from==="Validator Account"?Object.values(FE).filter(a=>a!=="Validator Account"):Object.values(FE).filter(a=>a!=="Authority Account");if((await OE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:a}=await OE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:et}]);i=a}else{let a=n.from==="Validator Account"?e:E;o=`${_}/${a}`,i=lE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,C=lE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:C,toAddress:i}},"selectFromKeypairs");import Ln from"chalk";import mR from"inquirer";import{execSync as Et,spawnSync as hR}from"node:child_process";var Mn=t(async(_,e=!1)=>{let E=_.NETWORK===c.TESTNET,o=E?be:_.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=Et(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(Ln.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(Ln.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let O=await mR.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(O.sol)}let C=Et(`solana address --keypair ${T}`).toString().trim(),a=Et(`solana address --keypair ${n}`).toString().trim(),R=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${C} ${a} ${S} --authorized-withdrawer ${n} --url ${o}`;hR(R,{shell:!0,stdio:"inherit"})},"withdraw");var un=t(_=>{N.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await Mn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as JR,spawnSync as xR}from"node:child_process";import{BN as mn}from"bn.js";import{LAMPORTS_PER_SOL as tt}from"@solana/web3.js";import{Connection as KR,LAMPORTS_PER_SOL as GR}from"@solana/web3.js";import{Keypair as BR}from"@solana/web3.js";import{readFile as gR}from"fs/promises";var yR=t(async _=>{let e=JSON.parse(await gR(_,"utf8"));return BR.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),pn=yR;import{homedir as kR}from"os";var C_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(C_||(C_={}));var VR={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},bR=t(async(_,e="auth",E=!1)=>{let o=new KR(_),i=kR(),n=L(i),s=`${E?"testnet":"mainnet"}${VR[e]}`,S=n[s],r=await pn(S),C=await o.getBalance(r.publicKey),R=Number(C)/GR;if(isNaN(R))throw new Error("Failed to get balance");return R},"getBalance"),L_=bR;var wR=new mn(3*tt),hn=t(async _=>{let e=await L_(_,C_.VALIDATOR),o=new mn(Number(Number(e)*tt)).sub(wR),i=Number(o)/tt;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import Me from"chalk";import{Keypair as vR,Connection as HR,PublicKey as YR,SystemProgram as Bn,ComputeBudgetProgram as IE,VersionedTransaction as gn,TransactionMessage as yn}from"@solana/web3.js";var Kn=t(async(_,e,E,o)=>{let i=0;try{let n=new HR(_,"finalized"),T=vR.fromSecretKey(new Uint8Array(Array.from(e))),s=new YR(E),S=o;for(;;)try{let r=[Bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),IE.setComputeUnitLimit({units:2e5}),IE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],C=await n.getLatestBlockhashAndContext({commitment:"finalized"}),a=new gn(new yn({instructions:r,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message()),R=await n.simulateTransaction(a,{replaceRecentBlockhash:!0,sigVerify:!1});a.sign([T]);let O=[Bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),IE.setComputeUnitLimit({units:R.value.unitsConsumed?Math.trunc(R.value.unitsConsumed*1.2):2e5}),IE.setComputeUnitPrice({microLamports:1e3})],I=new gn(new yn({instructions:O,payerKey:T.publicKey,recentBlockhash:C.value.blockhash}).compileToV0Message());I.sign([T]);let l=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...C.value,signature:l},"finalized"),console.log("finalized signature:",l),l}catch(r){if(i++,i>he)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 QR}from"fs/promises";import{LAMPORTS_PER_SOL as qR}from"@solana/web3.js";var ot=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=L();await L_(_,C_.VOTE)<1?(console.log(Me.white("Vote Account Balance is less than 1 SOL")),console.log(Me.white("Skip withdrawing SOL from Vote Account to Authority Account"))):xR("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await hn(_);console.log(Me.white(`Transferable Balance: ${i} SOL`));let n=i*qR;if(i<1)console.log(Me.white("Validator Account Balance is less than 1 SOL")),console.log(Me.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=JR(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await QR(E,"utf-8"));await Kn(_,s,T,n)}return!0},"collectSOL");import{readFile as oa}from"fs/promises";import ia from"inquirer";import it from"chalk";import{execSync as $R}from"child_process";import{homedir as WR}from"os";var XR=t(async _=>{try{let e=WR(),{mainnetValidatorAuthorityKey:E}=L(e),o=`spl-token balance ${R_} --owner ${E} --url ${_}`,i=$R(o).toString().trim();return Number(i)}catch(e){return console.log(it.red(`Error: ${e}`)),console.log(it.yellow(`You might need to install the Solana SPL CLI:
6503
- `)),console.log(it.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Gn=XR;import fE from"chalk";import{Connection as jR,PublicKey as kn,Keypair as zR,ComputeBudgetProgram as DE,VersionedTransaction as Vn,TransactionMessage as bn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as wn,createTransferInstruction as vn,TOKEN_PROGRAM_ID as Hn}from"@solana/spl-token";var Yn=t(async(_,e,E,o,i,n)=>{try{let T=new jR(_,"finalized"),s=zR.fromSecretKey(new Uint8Array(e)),S=new kn(E),r=new kn(i),C=Math.trunc(o*Math.pow(10,n)),a=await wn(T,s,r,s.publicKey),R=await wn(T,s,r,S,!0);for(;;)try{let O=[vn(a.address,R.address,s.publicKey,C,[],Hn),DE.setComputeUnitLimit({units:2e5}),DE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),l=new Vn(new bn({instructions:O,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),F=await T.simulateTransaction(l,{replaceRecentBlockhash:!0,sigVerify:!1});l.sign([s]);let G=[vn(a.address,R.address,s.publicKey,C,[],Hn),DE.setComputeUnitLimit({units:F.value.unitsConsumed?Math.trunc(F.value.unitsConsumed*1.2):2e5}),DE.setComputeUnitPrice({microLamports:1e3})],A=new Vn(new bn({instructions:G,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());A.sign([s]);let $=await T.sendRawTransaction(A.serialize());return await T.confirmTransaction({...I.value,signature:$},"finalized"),console.log("finalized signature:",$),$}catch(O){console.error("Transfer failed, retrying...",O)}}catch(T){throw console.error(T),T}},"transferSPLToken");import PE from"inquirer";import{spawnSync as Jn}from"child_process";import nt from"chalk";import{promises as xn}from"fs";var ZR=t(async(_="epochTimer")=>{try{let e=Jn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(nt.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
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
+ 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=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 xn.writeFile(i,o,"utf-8"),Jn("crontab",[i]),await xn.unlink(i),console.log(nt.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(nt.red("Error removing cron job:",e))}},"removeCronJob"),Qn=ZR;import qn from"chalk";var _a=t(async _=>{let e=_.NETWORK===c.TESTNET,E=await PE.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 nE()&&await Qn(),await u({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6506
- ${qn.green("No more Login to the server to update \u{1F331}")}
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
+ ${_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.
6509
6509
 
@@ -6511,97 +6511,97 @@ 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(qn.white(o));let i=await PE.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 PE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await PE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await u({HARVEST_ACCOUNT:T,IS_MEV_MODE:E.mevOn,RPC_URL:n,DISCORD_WEBHOOK_URL:s.discordWebhookUrl,AUTO_UPDATE:i.autoUpdate,AUTO_RESTART:i.autoRestart}),!0},"mevOn"),$n=_a;import{spawnSync as na}from"node:child_process";import{Connection as ta}from"@solana/web3.js";import{Connection as ea}from"@solana/web3.js";var Ea=t(async(_,e=10,E=.4)=>{try{let i=await new ea(_).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"),Wn=Ea;var Tt=t(async _=>{try{let E=await new ta(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await Wn(_);console.log("timePerSlotSeconds",o);let n=(E.slotsInEpoch-E.slotIndex)*o,T=(E.slotIndex/E.slotsInEpoch*100).toFixed(2),s=Math.floor(n/(3600*24)),S=Math.floor(n%(3600*24)/3600),r=Math.floor(n%3600/60),C=Math.floor(n%60),a=`${s}d ${S}h ${r}m ${C}s`;return s===0&&(a=`${S}h ${r}m ${C}s`),{...E,estimatedTimeUntilNextEpoch:a,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var Ta=.03,Xn=t(_=>{N.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await sa(_),{mainnetValidatorAuthorityKey:E}=L();console.log("Harvesting SOL..."),await ot(_.RPC_URL);let o=await L_(_.RPC_URL,C_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await J(1e3),await ot(_.RPC_URL),o=await L_(_.RPC_URL,C_.VOTE),i++;let n=JSON.parse(await oa(E,"utf-8")),T=await L_(_.RPC_URL,C_.AUTH);if(T<1)console.log(fE.white("Authority Account Balance is less than 1 SOL")),console.log(fE.white("Skip converting SOL to elSOL"));else{let S=T-Ta;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await aE(_.RPC_URL,E_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await Gn(_.RPC_URL);if(s<1){let S=await Tt(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await a_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await Yn(_.RPC_URL,n,e,s,R_,wt),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await Tt(_.RPC_URL)).epoch} \u{1F4B0}
6515
- Validator Address: ${M(E)}
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
+ Validator Address: ${p(E)}
6516
6516
  Total Reward: ${s} elSOL
6517
- Harvest Address: ${e}`;await a_(r)}console.log(fE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),N.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await $n(_)&&(na("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(fE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),sa=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await ia.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:et}]);return await u({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as Ua}from"@skeet-framework/utils";import{writeFile as Sa}from"fs/promises";var ra=t(async _=>{await Sa(Ve,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),M_=ra;var Ra=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await M_({...e,isLessThan1Day:!0})},"isLessThan1Day"),jn=Ra;var aa=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await M_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),zn=aa;var Ca=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await M_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),Zn=Ca;var ca=t(async(_,e)=>{let E=e.NETWORK===c.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=L(),T=E?M(n):M(i);await M_(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"),_T=ca;import{existsAsync as da}from"@skeet-framework/utils";import{readFile as Na,writeFile as Oa}from"fs/promises";import la from"chalk";import{homedir as Fa}from"os";var Ia=t(async()=>{let e=Fa().includes("/home/solv")?Ve:"./currentEpoch.json";if(await da(e))return JSON.parse(await Na(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await Oa(e,JSON.stringify(E,null,2),"utf-8"),console.log(la.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),eT=Ia;async function Da(_="@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(Da,"getNpmLatestVersion");var ET=Da;async function Pa(){let _=J_(),e=await ET();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(Pa,"isVersionSame");var tT=Pa;import{spawnSync as Aa}from"child_process";import{spawnSync as fa}from"node:child_process";var oT=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=fa(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6523
- `),n=i.find(R=>R.includes("Epoch Completed Time:")),T=i.find(R=>R.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(R=>R.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let C=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,a=r.match(C);if(a){let R=a[1]?parseInt(a[1]):0,O=a[2]?parseInt(a[2]):0,I=a[3]?parseInt(a[3]):0,l=a[4]?parseInt(a[4]):0,F=R*24*60+O*60+I+Math.floor(l/60);return{epoch:s,day:R,hour:O,min:I,sec:l,totalMinutes:F,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var La=t(async _=>{let e=_.NETWORK===c.TESTNET,E=e?be:_.RPC_URL,o=Ua(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await eT(),n=oT(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=L(),r=await ae(E,M(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await tT()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),Aa("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await _T(n,_),"Epoch has been updated!";let a=n.totalMinutes,R=[Zn,zn,jn];for(let O of R)if(await O(a,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),iT=La;var nT=t(_=>{N.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await iT(_),process.exit(0)})},"epochTimerCommands");import IT from"inquirer";import{join as rT}from"path";import{spawnSync as ee}from"node:child_process";import __ from"chalk";import{spawnSync as Ma}from"node:child_process";var ua=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=Ma(`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=ua;import TT from"chalk";var pa=t((_,e,E)=>{console.log(TT.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=M(_).trim(),i=UE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(TT.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"),Z_=pa;var ma="agave-validator -l /mnt/ledger",ha="sudo fdctl",Ba="--config /home/solv/firedancer/config.toml ",ga=t(_=>_==="agave"?[ma,""]:[ha,Ba],"getSolanaCLIActive"),_e=ga;var sT="agave-validator -l /mnt/ledger",ya=t(()=>{try{return sT}catch(_){return console.error(_),sT}},"getSolanaCLIAgave"),AE=ya;import st from"chalk";var LE=t(async(_,e)=>{try{console.log(st.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:d.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case d.AGAVE:n="agave";break;case d.FRANKENDANCER:n="frankendancer";break;case d.JITO:n="agave";break;default:n="agave"}return console.log(st.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(st.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:d.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as Ka}from"fs/promises";import St from"chalk";import{existsSync as Ga}from"fs";var ME=t(async()=>{try{console.log(St.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!Ga(_))return{client:"agave",validatorType:d.AGAVE,success:!1,error:"Local configuration file not found"};let e=await Ka(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case d.AGAVE:i="agave";break;case d.FRANKENDANCER:i="frankendancer";break;case d.JITO:i="agave";break;default:i="agave"}return console.log(St.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(St.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:d.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var uE=rT(y,m_),ST=rT(y,p_),RT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?h:V;T&&(s=h);let S=await ME(),r=await LE(_,o),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(__.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,O]=_e(C),[I,l]=_e(a),F=AE();if(!Z_(s,_,o))return;if(i){console.log(__.white("\u{1F7E2} Waiting for restart window..."));let ne=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${F} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(ee(ne,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.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: ${F} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(__.white("\u{1F7E2} Setting identity on the remote validator..."));let A=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${l}${uE}'`;if(ee(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.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 ${l}${uE}`));return}if(console.log(__.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ee(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${uE} ${ST}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.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 ${uE} ${ST}`));return}if(console.log(__.white("\u{1F7E2} Uploading the tower file to the new validator...")),ee(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.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}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(__.white("\u{1F7E2} Setting identity on the local validator...")),ee(`${R} set-identity ${O}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.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
- Failed Cmd: ${R} set-identity ${O}${s}
6546
- ln -sf ${s} ${f}`));return}if(ee(`ln -sf ${s} ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6545
+ Failed Cmd: ${c} set-identity ${C}${s}
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} ${f}`));return}console.log(__.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as cT}from"path";import Q from"chalk";import{spawnSync as Ee}from"node:child_process";var aT=cT(y,m_),ka=cT(y,p_),CT="~/.ssh/id_rsa",dT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?h:V;T&&(s=h);let S=await ME(),r=await LE(_,o),C=S.success?S.client:"agave",a=r.success?r.client:"agave";console.log(Q.green(`\u2705 Local client: ${C}, Remote client: ${a}`));let[R,O]=_e(C),[I,l]=_e(a),F=AE();if(!Z_(s,_,o))return;let A=`${F} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,$=`${R} set-identity ${O}${aT}`,c_=`ln -sf ${aT} ${ka}`,u_=`scp ${P}/tower-1_9-${e}.bin ${o}@${_}:${P}`,d_=`${I} set-identity ${l}--require-tower ${s}`,ie=`ln -sf ${s} ${f}`;if(i&&(console.log(Q.white("\u{1F7E2} Waiting for restart window...")),Ee(A,{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: ${A}`));return}if(console.log(Q.white("\u{1F7E2} Setting identity on the new validator...")),Ee($,{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: ${$}`));return}if(console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),Ee(c_,{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: ${c_}`));return}if(console.log(Q.white("\u{1F7E2} Uploading the tower file to the new validator...")),Ee(u_,{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: ${u_}`));return}console.log(Q.white("\u{1F7E2} Setting identity on the new validator..."));let GT=`ssh -i ${CT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${d_}'`;Ee(GT,{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: ${d_}`)),console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let kT=`ssh -i ${CT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${ie}'`;if(Ee(kT,{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: ${ie}`));return}console.log(Q.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as Va}from"node:child_process";function NT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return Va(E,{shell:!0,stdio:"inherit"}).status===0}t(NT,"checkSSHConnection");import ue from"chalk";import{join as lT}from"path";import{spawnSync as te}from"node:child_process";import e_ from"chalk";var pE=lT(y,m_),OT=lT(y,p_),FT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===c.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?h:V;if(T&&(s=h),!Z_(s,_,o))return;let r=dt,C=Nt;if(i){console.log(e_.white("\u{1F7E2} Waiting for restart window..."));let G=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(te(G,{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 ${P} 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 a=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${P} set-identity ${pE}'`;if(te(a,{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 ${P} set-identity ${pE}`));return}if(console.log(e_.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 ${pE} ${OT}'`,{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 ${pE} ${OT}`));return}if(console.log(e_.white("\u{1F7E2} Uploading the tower file to the new validator...")),te(`scp ${o}@${_}:${P}/tower-1_9-${e}.bin ${P}`,{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}@${_}:${P}/tower-1_9-${e}.bin ${P}`));return}if(console.log(e_.white("\u{1F7E2} Setting identity on the new validator...")),te(`${C} -l ${P} 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
- Failed Cmd: ${C} -l ${P} set-identity ${s}
6576
- ln -sf ${s} ${f}`));return}if(te(`ln -sf ${s} ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6575
+ Failed Cmd: ${a} -l ${f} set-identity ${s}
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} ${f}`));return}console.log(e_.white("\u{1F7E2} Identity changed successfully!")),await u({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var ba=["Incoming","Outgoing"],DT=t(async(_,e)=>{_.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).option("--user <user>","SSH User","solv").option("--unsafe","Switch without waiting for a restart window",!1).description("Switch Validator Identity with No Downtime").action(async E=>{try{let o=e.NETWORK===c.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?h:V;i&&(T=h);let s=E.user,S=M(T),r=E.switchType,C=E.ip;if(r===""||C===""||s===""){let R=await IT.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}},{name:"user",type:"list",message:"Which user would you want to SSH as?",choices:["solv"]}]);r=R.switchType,C=R.ip,s=R.user}if(!ba.includes(r)){console.log(ue.yellow(`\u26A0\uFE0F Invalid Switch Type
6579
- You can choose only Incoming or Outgoing`));return}if(!NT(C,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await IT.prompt([{name:"confirm",type:"confirm",message:"Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1."}])).confirm||(console.log(ue.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(ue.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await FT(C,S,e,s,n);return}await RT(C,S,e,s,n)}else await dT(C,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(ue.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ue.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as wa}from"node:child_process";var va=t((_="306450862",e=P,E=n_)=>{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=wa(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=va;import oe from"inquirer";import Xa from"dotenv";import G_ from"chalk";var mE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:BE,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}},rt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Be,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:ge,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:BE,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 Ja}from"fs/promises";import{Connection as xa,Keypair as Qa,VersionedTransaction as qa}from"@solana/web3.js";import q from"chalk";import $a from"inquirer";import Wa from"dotenv";var Ha=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"),fT=Ha;var Ya=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=ft[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"),UT=Ya;Wa.config();var AT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new xa(_,"confirmed"),r=await fT(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(Te+`
6581
- `)),process.exit(0));let d_=`${q.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
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
+ `)),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: ${Te}
6586
- `;console.error(q.white(d_)),process.exit(0)}let C=rt[i],a=rt[n],R=`\u{1F504} Swap Quote \u{1F504}
6585
+ Validators Solutions: ${re}
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
- - \u{1F3E6} Input Token: ${C.symbol} (${i})
6589
- - \u{1F4B0} Input Amount: ${T/Math.pow(10,C.decimal)} ${C.symbol}
6588
+ - \u{1F3E6} Input Token: ${a.symbol} (${i})
6589
+ - \u{1F4B0} Input Amount: ${T/Math.pow(10,a.decimal)} ${a.symbol}
6590
6590
 
6591
- - \u{1F3E6} Output Token: ${a.symbol} (${n})
6592
- - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,a.decimal)} ${a.symbol}
6591
+ - \u{1F3E6} Output Token: ${R.symbol} (${n})
6592
+ - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,R.decimal)} ${R.symbol}
6593
6593
 
6594
6594
  \u203B This quote is based on the current market rate and may change before the swap is completed.
6595
- `;console.log(q.white(R)),console.log(q.gray(`You can also swap using the following command:
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 O=!1;s?O=(await $a.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(q.cyan("Skipping confirmation...")),O=!0),O||(console.log(q.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await Ja(o,"utf8")),l=Qa.fromSecretKey(new Uint8Array(Array.from(I))),F=await UT(e,E,r,l.publicKey.toString());if(typeof F=="string"){F.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(Te+`
6599
- `)),process.exit(0));let d_=`${q.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
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
+ `)),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: ${Te}
6604
- `;console.error(q.white(d_)),process.exit(0)}let G=Buffer.from(F.swapTransaction,"base64"),A=qa.deserialize(G);A.sign([l]);let $=A.serialize(),c_=await S.sendRawTransaction($,{skipPreflight:!0,maxRetries:2}),u_=A.message.recentBlockhash;return console.log(`Swapping...
6605
- Transaction ID: ${c_}`),await S.confirmTransaction({blockhash:u_,lastValidBlockHeight:F.lastValidBlockHeight,signature:c_},"confirmed"),c_},"swap");Xa.config();var LT=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 ja(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(G_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(G_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),ja=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(G_.white("Solana RPC URL:",_)),console.log(G_.white("KeyfilePath:",e)),(!e||e===""||s)&&await za();let S=It,r=[...Dt,"Other"],C=o,a="",R=i,O=n;if(C===""){let F=await oe.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Be}]);F.name==="Other"?C=(await oe.prompt([{type:"input",name:"address",message:"Enter input mint address",default:ge}])).address:(a=F.name,C=mE[a].tokenMint)}if(R===""){r=r.filter(A=>A!==a);let F=await oe.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(F.name==="Other")R=(await oe.prompt([{type:"input",name:"address",message:"Enter output mint address",default:R_}])).address;else{let A=F.name;R=mE[A].tokenMint}let G=F.name;R=mE[G].tokenMint}if(O===0){let F=await oe.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);O=Number(F.amount)}let l=await AT(_,S,!E||E===""?Pt:E,e,C,R,O,T);l||process.exit(0),console.log(G_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(G_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${l}`))},"swapCmd");var za=t(async()=>{let _=await oe.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await u(_),console.log(G_.green(`\u2714\uFE0E Config Updated Successfully!
6606
- `)),g_()},"askForConfig");import{spawnSync as Za}from"node:child_process";var MT=t(()=>{Za("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as _C}from"node:child_process";var uT=t(()=>{_C("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as eC}from"node:child_process";var pT=t(()=>{eC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as EC}from"node:child_process";var mT=t(()=>{EC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as tC}from"node:child_process";var hT=t((_=!1)=>{tC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as oC}from"node:child_process";var BT=t(()=>{oC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var gT=t(()=>{let _=N.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{MT()}),_.command("start").description("Start Jupiter").action(()=>{uT()}),_.command("stop").description("Stop Jupiter").action(()=>{pT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{hT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{mT()}),_.command("enable").description("Enable Jupiter").action(()=>{BT()})},"jupiterCommands");import sC from"chalk";import{spawnSync as iC}from"node:child_process";var nC=t(()=>{let{stdout:_}=iC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),yT=nC;var N=new TC;N.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(pe,"-V","Display version");async function SC(){try{let _=await k();Di(_),Ai(_),fi(_),vi(_),co(_),Oo(),Mi(_),nn(_),rn(_),wi(),mi(),li(_),ho(_),ui(),On(),An(_),un(_),Xn(_),Ii(),LT(N,_),nT(_),DT(N,_),gT(),In(_),N.command("rm:log").description("Remove Logs").action(()=>{NE()}),N.command("rm:snapshot").description("Remove Snapshot").action(()=>{Dn(_)}),N.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(sC.white("\u{1F4DD} Creating Snapshot...")),PT(e.slot,e.ledger,e.snapshots)}),N.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Pn(_)}),N.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{fn()}),N.command("config").description("Show Solv Config").action(()=>{dE(_)}),N.command("vv").description("Show Solv Version").action(()=>{let e=yT();console.log("version:",e)}),await N.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(SC,"main");SC();export{N 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