@gabrielhicks/solv 5.5.4 → 5.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- var xT=Object.defineProperty;var t=(_,e)=>xT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as cC}from"commander";var lt="5.5.4";var Ft={name:"@gabrielhicks/solv",version:lt,description:"Solana Validator CLI SOLV",main:"dist/index.js",type:"module",repository:"https://github.com/gabrielhicks/solv",keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",bin:{solv:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var ge=Ft.version;var Se="https://validators.solutions";var ye="solv4.config.json";var u_="identity.json",p_="unstaked-identity.json",It="relayer-keypair.json",qT="mainnet-validator-keypair.json",$T="mainnet-vote-account-keypair.json",WT="mainnet-authority-keypair.json",XT="testnet-validator-keypair.json",jT="testnet-vote-account-keypair.json",zT="testnet-authority-keypair.json",G="/home/solv",U=`${G}/${u_}`,UC=`${G}/${p_}`,b=`${G}/${qT}`,b_=`${G}/${$T}`,AC=`${G}/${WT}`,g=`${G}/${XT}`,w_=`${G}/${jT}`,LC=`${G}/${zT}`,w=`${G}/solana-validator.log`,O_=G+"/start-validator.sh",f="/mnt/ledger",v_="/mnt/accounts",i_="/mnt/snapshots",Dt="solana-validator",Pt="agave-validator",ft="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ke=3;var Ut="https://api.mainnet-beta.solana.com",At="https://verify.validators.solutions/solv-migrate",Lt="https://jup.validators.solutions/v1/jup",KE;(function(_){_.SOL="SOL",_.USDC="USDC",_.elSOL="elSOL",_.JitoSOL="JitoSOL",_.mSOL="mSOL",_.bSOL="bSOL",_.EPCT="EPCT",_.JUP="JUP",_.BONK="BONK",_.JTO="JTO"})(KE||(KE={}));var Mt=Object.values(KE),Ge="So11111111111111111111111111111111111111112",ke="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",GE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var ut="SOLV420",pt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"},H_=["adreoi6W1MGA7eegERNcQTwQH3UuJaAnWjVZEq2cxcF","naterTR45j7aWs16S3qx8V29CfM314dzfvtCSitiAYi","th734sEwvZZ5XfemLcvo6TXepPfawWBjz3HMYeQdhPi","BAPExw4zFmwSUjyPfQorenucofeafHLUetcoWTB4Gwnt","bay3c7G89NTxSULyM45gqJx3JoWtBBeXHvifCywwiwZ","BeRTyZTveVQsekrF63WhFvfGiABThym95x8uZaicDPgo","EF8o3aQnu853EEPJKUfqAgoa8szkVs28sv64xtBrRPSV","chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL","GsVJ62qt2nbRLT4f67LAo6Ve8eGhChJquYaK3wT1iG2v","ctz4yB16kvGiMrA4vdtKXEMYgkkfJLo6hMwDk9DZ3Vf","PARaNF4kcQW3BmaeMD3ELLAqUV7MDS8bMudaCEZ72NM","dedxpgLN1VXLHpekKra1JKkMGrw7tW1uuYz7Ec28iLK","DegEnNCbn6PrsvHvsErneRNv7KFTwnjW3uFVjf43e28v","Dcky7CK3aEHzdV9EF5YR1NaTJ9QfSyzW5cACbqEFKZNv","dksYs1gzQ7FzqyadN5XtcaeVbqKSN7X2SpfN3fcUW7G","dstCt4sDCQx1QFFJekmM5RjyFLsDRkaEjTgXd5gbpDB","eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK","ExCHpAsqeaDJGfUj41bhU2BuZK4fhRnJKvhG486rfKg","farmoWMKdJBxLxhMZpgU1uVjvjVJnQqrGhwAyDmcn8R","G1EaM8gLQU7DifPnCTQKP2PLvFf63tHvaXBAR8QFLg5Z","goJirTtcRjP6Wqkw7cHNvzjEva5rpvPDtj2ZnEmPAr6","wetfCN7bhjhBT8GTSAnah8ftoRoHB8H8Q87KkxDdRgK","8H6qQ2FKUjY8wmggSKHUENY38Nr9sQxDUbEZB6fiCHSX","hy1oTqvrknqoNmPWq2JtQMdDDnWkEGH2ab7N4r4rnJJ","jntrbAHjcxhP2eRUgCSACb6cMVhYm3jEQ3eQDZKicmz","akicJSdNFWszP2Le38t1NtVeywXtvoxdiGciaELwZHz","1i1yarXXz55VdvVL4v2HXcjMJPAv4fWJhY8x43bmwfL","LoV31z7KC5CZ8sdGovmRSDGB6csP1fJip1hiM7xDozw","magiCagux3C7nMKo2jKSbX6yWzYWMGKJ6ABRnw1zQ8U","JAfBCSxx2fZwdM5wTiLRAfJm3MpqXz3KnxjPhCQixGVh","mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe","phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1","pineBbb5K6SdV6KG1xibsR5DM1XsWuajtXSy3YYGY4N","prt1stdbFCFXpEcx9rxwJK63zhYo43V5JCXzGWXkPGn","rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg","rapTWQhZD2dPjJ91BXW4UnVKBt6NvX2aZxWSSYg66Y4","royLQKzrsSs9VbMZMDjZkMM8j3buBnwx7oH3wdifAk4","CitYBuKSE5W6CXEBAgY1B9fEMUdHXYSmZbXbAWd31Cr","axyaGn2eZM1dnDCagpd9aYa92gKWTrtEYb8vwc21ddr","sTeV1NswjBBo15qosoyQj1aYrgvoxomAduN1zFV6gCf","txtXxyX13G7h899vnZwNJsVRAMfWcwYZNT3jucRqqiW","hxTzWqz2WMdLhbMgYfsWiWYdtx8pY582FKwQpfGL59M","te1emnh77qnpsdjcCi9FsyX8t4gf4HYWC4kTVHuH4MQ","tstidz7tN8armqvZ7ia2ck62mY9RD2BrwMtW2w8hcwk","vnd1sXYmA8YY9xHQBkKKurZeq7iCe6EQ9bGYNZJwh1c","YE11vEiXKKx95onU1EpjgwrHovgXamRTQvY52Mvde8i","5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on"],Y_=["adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ","nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC","BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP","b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF","chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1","chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe","CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP","parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz","dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S","DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup","dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH","eyeY8HangkSYirSBtopAfThXzhHL855wPnddz8WnemV","ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD","G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN","wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo","hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o","hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu","jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA","NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk","1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i","Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s","MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV","D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e","mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk","phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2","pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw","prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW","radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9","rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC","RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4","ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj","axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4","sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu","TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ","hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj","te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY","UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL","vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd","YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV","Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24","7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2","GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ","CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S"];import{spawnSync as es}from"child_process";import{spawnSync as K}from"node:child_process";var ZT=t((_,e=!1,E=!1)=>{E?e?(K(`mkdir /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`cd /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`git clone https://github.com/gabrielhicks/agave.git --recurse-submodules /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave-mod checkout ${_}-mod`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave-mod submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),K(`CI_COMMIT=$(git -C /tmp/${_}-agave-mod rev-parse HEAD) /tmp/${_}-agave-mod/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-agave-mod`,{shell:!0,stdio:"inherit"}),K("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),K(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-agave-mod /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),K(`sudo rm -rf /tmp/${_}-agave-mod`,{shell:!0,stdio:"inherit"})):(K(`mkdir /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`cd /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`git clone https://github.com/anza-xyz/agave.git --recurse-submodules /tmp/${_}-agave`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave checkout v${_}`,{shell:!0,stdio:"inherit"}),K(`git -C /tmp/${_}-agave submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),K(`CI_COMMIT=$(git -C /tmp/${_}-agave rev-parse HEAD) /tmp/${_}-agave/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}-agave`,{shell:!0,stdio:"inherit"}),K("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),K(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_}-agave /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),K(`sudo rm -rf /tmp/${_}-agave`,{shell:!0,stdio:"inherit"})):e?K(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/${_}-mod/installer)"`,{shell:!0,stdio:"inherit"}):K(`sh -c "$(curl --netrc-optional -sSfL https://release.anza.xyz/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installAgave"),J_=ZT;var mt="agave-validator",_s=t(()=>{try{return mt}catch(_){return console.error(_),mt}},"getSolanaCLI"),n_=_s;var T_="3.0.10",__="3.0.10",re="",ae="3.0.10",l_="3.0.10",m_="",kE="3.0.10",VE="3.0.10",Re="_patch1",ht="3.0.10",h_="3.0.10";var Bt="20.17.0",x_="0.802.30008",F_="0.802.30008";var Ve=t(async(_,e=!1,E=!1)=>{let o=re,n=`${`v${_}`}${o}`;J_(n,e,E)},"updateVersion"),Ce=t(async(_,e=!1,E=10)=>{let o=n_(),i=`${o} --ledger ${f} exit --max-delinquent-stake ${_} --monitor --min-idle-time ${E}`;e&&(i=`${o} --ledger ${f} exit --max-delinquent-stake ${_} --min-idle-time ${E}`),es(i,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Po from"chalk";var B_;(function(_){_.EN="en",_.JA="ja"})(B_||(B_={}));var gt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(gt||(gt={}));var yt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(yt||(yt={}));var I_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(I_||(I_={}));var Kt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(Kt||(Kt={}));var Gt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(Gt||(Gt={}));var kt;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(kt||(kt={}));var Vt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Vt||(Vt={}));var be;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(be||(be={}));var we;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(we||(we={}));var vt=!1,Ht=!1,Yt=!1,Jt=!1,xt=!1,Qt=!1,$={ID:"solv",LANG:B_.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"3.0.10",MAINNET_SOLANA_VERSION:"3.0.10",NODE_VERSION:"20.17.0",TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,SOLANA_NETWORK:"testnet",SOLV_TYPE:0,DISK_TYPES:1,IS_SETUP:!1,LANG_SETUP:!1,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:"ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG",IS_CLIENT:!1,VALIDATOR_IPS:[],MAINNET_TYPE:"SolanaClient",LEDGER_PATH:"/mnt/ledger",STAKE_ACCOUNT:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:"https://mainnet-beta.solana.com",KEYPAIR_PATH:"/home/solv/testnet-validator-keypair.json",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1},H={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},M={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},s_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},B={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",FRANKENDANCER_LOGROTATE:"/etc/logrotate.d/frankendancer",SOL_SYSTEM_CONFIG21:"/etc/sysctl.d/21-solana-validator.conf",SOL_NOFILES_CONF:"/etc/security/limits.d/90-solana-nofiles.conf",SOL_SYSTEM_CONF:"/etc/systemd/system.conf",SOLANA_PATH:"/home/solv/.local/share/solana/install"},y={MAINNET_VALIDATOR_KEY:"mainnet-validator-keypair.json",MAINNET_VALIDATOR_VOTE_KEY:"mainnet-vote-account-keypair.json",MAINNET_VALITATOR_AUTHORITY_KEY:"mainnet-authority-keypair.json",TESTNET_VALIDATOR_KEY:"testnet-validator-keypair.json",TESTNET_VALIDATOR_VOTE_KEY:"testnet-vote-account-keypair.json",TESTNET_VALITATOR_AUTHORITY_KEY:"testnet-authority-keypair.json"},u=t((_=H.ROOT)=>{let e=_===H.ROOT?H.ROOT:_,E=`${e}/${y.MAINNET_VALIDATOR_KEY}`,o=`${e}/${y.MAINNET_VALIDATOR_VOTE_KEY}`,i=`${e}/${y.MAINNET_VALITATOR_AUTHORITY_KEY}`,n=`${e}/${y.TESTNET_VALIDATOR_KEY}`,T=`${e}/${y.TESTNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${y.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:E,mainnetValidatorVoteKey:o,mainnetValidatorAuthorityKey:i,testnetValidatorKey:n,testnetValidatorVoteKey:T,testnetValidatorAuthorityKey:s}},"getAllKeyPaths"),D_=t((_=!0)=>{let e=_?`${H.ROOT}/${y.TESTNET_VALIDATOR_KEY}`:`${H.ROOT}/${y.MAINNET_VALIDATOR_KEY}`,E=_?`${H.ROOT}/${y.TESTNET_VALIDATOR_VOTE_KEY}`:`${H.ROOT}/${y.MAINNET_VALIDATOR_VOTE_KEY}`,o=`${H.ROOT}/${s_.LOG}`,i=M.ACCOUNTS,n=M.LEDGER,T=M.SNAPSHOTS,s=`${H.ROOT}/${s_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var E_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",bE="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",qt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",$t=9,S_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",Wt="So11111111111111111111111111111111111111112",Xt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",jt="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",bt;(function(_){_[_.ELSOL=S_]="ELSOL",_[_.SOL=Wt]="SOL",_[_.USDC=Xt]="USDC",_[_.EPCT=jt]="EPCT"})(bt||(bt={}));var wt;(function(_){_.V6_BASE_URL="https://quote-api.jup.ag/v6",_.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",_.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(wt||(wt={}));var YC={[Wt]:9,[S_]:9,[Xt]:6,[jt]:6},ve="/home/solv/currentEpoch.json";var He="https://api.testnet.solana.com";import{spawnSync as wE}from"child_process";var zt=t(()=>{wE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=$.NODE_VERSION;wE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),wE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");import{spawnSync as Y}from"child_process";var Ye=t((_,e=!1,E=!1)=>{Y("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),Y("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(Y(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`git clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules /tmp/${_}`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),Y(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),Y(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),Y("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),Y(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),Y(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"})):e?Y(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):Y(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as Es,writeFile as ts}from"fs/promises";import{homedir as os}from"os";var g_=t(async _=>{let E=`${os()}/${s_.JITO_CONFIG}`,i={...JSON.parse(await Es(E,"utf8")),..._},n=JSON.stringify(i,null,2);await ts(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Zt}from"child_process";import is from"inquirer";var _o=t((_,e=!0)=>{let E=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",o=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";Zt(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;Zt(n,{shell:!0,stdio:"inherit"})},"updateCommission"),eo=t(async()=>await is.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as ce}from"@skeet-framework/utils";import ns from"chalk";import Ts from"inquirer";var Eo=t(async()=>{let _=await Ts.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await ce("sudo ufw delete allow 8899/udp"),await ce("sudo ufw delete allow 8899/tcp"),await ce(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await ce(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await ce("sudo ufw reload"),console.log(ns.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var ss=t(()=>lt,"getSolvVersion"),Q_=ss;import{readFile as as,writeFile as Rs}from"fs/promises";import{existsAsync as Cs}from"@skeet-framework/utils";var vE;(function(_){_.EN="en",_.JA="ja"})(vE||(vE={}));var dc=Object.values(vE),d;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(d||(d={}));var to=Object.values(d),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var oo=Object.values(D),l;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.BAM="bam",_.NONE="none"})(l||(l={}));var Nc=Object.values(l).filter(_=>_!=="none"),v;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(v||(v={}));var io=Object.values(v).filter(_=>_!=="none"),W;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(W||(W={}));var rs={NETWORK:d.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:l.NONE,RPC_TYPE:v.AGAVE,MNT_DISK_TYPE:W.TRIPLE,TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__,NODE_VERSION:Bt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:ft,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:Ut,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:f,ACCOUNTS_PATH:v_,SNAPSHOTS_PATH:i_,MOD:!1},c_=rs;import{homedir as cs}from"os";var ds=t(async()=>{let e=`${cs()}/${ye}`;return await Cs(e)?JSON.parse(await as(e,"utf-8")):(console.log("Creating default config file at",e),await Rs(e,JSON.stringify(c_,null,2)),c_)},"readConfig"),V=ds;import Ns from"node-fetch";var r_=t(async _=>{try{let e=await V();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
3
- Please set DISCORD_WEBHOOK_URL in .env`);let E={content:_,username:"\u{1FA84} Solv Notifier"};return(await Ns(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(E),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${_}`}),!1}},"sendDiscord");import{spawnSync as Ds}from"child_process";import{Connection as no}from"@solana/web3.js";var de=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new no("https://api.testnet.solana.com"):new no(_,"confirmed"),T=await n.getVoteAccounts(),s=T.current.find(R=>R.votePubkey===e);if(!s)return T.delinquent.find(c=>c.votePubkey===e)?(i.isActive=!1,i.reason="Validator is delinquent.",i):(i.isActive=!1,i.reason="Validator is not found in both current and delinquent lists.",i);if(T=await n.getVoteAccounts(),s=T.current.find(R=>R.votePubkey===e),!s)return i.isActive=!1,i.reason="Validator is not found in the current list.",i;let S=s.lastVote,a=await n.getSlot()-S;return a>o?(i.isActive=!1,i.reason=`Validator has not voted for ${a} slots.`,i):(i.isActive=!0,i.reason="Validator is active and voting.",i)}catch(n){return console.error(n),i.isActive=!1,i.reason="Failed to check validator status.",i}},"isValidatorActive");import{spawnSync as Os}from"child_process";var p=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=Os(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var ls=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),J=ls;import{sendDiscord as Fs}from"@skeet-framework/utils";var To=30,Is=t(async _=>{try{let e=_.NETWORK===d.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=u(),n=p(e?o:E),T=await de(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=To){console.log("Max retries reached, exiting...");let S=`\u26A0\uFE0F Validator is not active for ${To} minutes!
2
+ var QT=Object.defineProperty;var t=(_,e)=>QT(_,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as NC}from"commander";var ft="5.5.6";var Ut={name:"@gabrielhicks/solv",version:ft,description:"Solana Validator CLI SOLV",main:"dist/index.js",type:"module",repository:"https://github.com/gabrielhicks/solv",keywords:["solana","validator","cli","validator-tool","Node.js","web3"],files:["dist"],author:"ELSOUL LABO B.V.",private:!1,license:"Apache-2.0",bin:{solv:"./dist/index.js"},scripts:{test:"vitest",build:"tsup src/index.ts && npx tsx add-line.ts",dev:"nodemon",start:"node dist/index.js"},dependencies:{"@jup-ag/api":"6.0.27","@metaplex-foundation/mpl-token-metadata":"3.2.1","@metaplex-foundation/umi":"0.9.2","@metaplex-foundation/umi-bundle-defaults":"0.9.2","@skeet-framework/utils":"1.3.11","@solana/spl-stake-pool":"1.1.5","@solana/spl-token":"0.4.8","@solana/web3.js":"1.95.4","bigint-buffer":"1.1.5","bn.js":"5.2.1",bs58:"6.0.0",chalk:"5.3.0","chalk-pipe":"6.1.0","cli-progress":"3.12.0","cli-spinner":"0.2.10","cli-table3":"0.6.5",commander:"12.1.0",dotenv:"16.4.5",inquirer:"10.2.0","node-fetch":"3.3.2",prompt:"1.3.0"},devDependencies:{"@changesets/changelog-github":"0.5.0","@changesets/cli":"2.27.7","@solana-developers/helpers":"^2.5.6","@swc/core":"1.7.21","@types/bn.js":"5.1.5","@types/cli-progress":"3.11.6","@types/cli-spinner":"0.2.3","@types/inquirer":"9.0.7","@types/node":"22.5.1","@types/node-fetch":"2.6.11","@types/prompt":"1.1.8","@typescript-eslint/eslint-plugin":"8.3.0","@typescript-eslint/parser":"8.3.0",eslint:"9.9.1","eslint-config-prettier":"9.1.0",nodemon:"3.1.7",prettier:"3.3.3",tsup:"8.2.4",typescript:"5.5.4",vite:"5.4.2","vite-tsconfig-paths":"5.0.1",vitest:"2.0.5"},overrides:{chalk:"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}};var Ge=Ut.version;var ae="https://validators.solutions";var ke="solv4.config.json";var m_="identity.json",h_="unstaked-identity.json",At="relayer-keypair.json",$T="mainnet-validator-keypair.json",WT="mainnet-vote-account-keypair.json",XT="mainnet-authority-keypair.json",jT="testnet-validator-keypair.json",zT="testnet-vote-account-keypair.json",ZT="testnet-authority-keypair.json",G="/home/solv",U=`${G}/${m_}`,LC=`${G}/${h_}`,w=`${G}/${$T}`,Y_=`${G}/${WT}`,MC=`${G}/${XT}`,u=`${G}/${jT}`,F_=`${G}/${zT}`,pC=`${G}/${ZT}`,V=`${G}/solana-validator.log`,i_=G+"/start-validator.sh",f="/mnt/ledger",I_="/mnt/accounts",n_="/mnt/snapshots",Lt="solana-validator",Mt="agave-validator",pt="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var Ve=3;var ut="https://api.mainnet-beta.solana.com",mt="https://verify.validators.solutions/solv-migrate",ht="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 Bt=Object.values(HE),be="So11111111111111111111111111111111111111112",we="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",YE="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var gt="SOLV420",yt={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"},J_=["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"],x_=["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 _s=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"),Q_=_s;var Kt="agave-validator",es=t(()=>{try{return Kt}catch(_){return console.error(_),Kt}},"getSolanaCLI"),T_=es;var s_="3.0.10",e_="3.0.10",Re="",Ce="3.0.10",B_="3.0.10",d_="",JE="3.0.10",ce="3.0.10",g_="_patch1",Gt="3.0.10",y_="3.0.10";var kt="20.17.0",q_="0.802.30008",D_="0.802.30008";var ve=t(async(_,e=!1,E=!1)=>{let o=Re,n=`${`v${_}`}${o}`;Q_(n,e,E)},"updateVersion"),de=t(async(_,e=!1,E=10)=>{let o=T_(),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 Bo from"chalk";var K_;(function(_){_.EN="en",_.JA="ja"})(K_||(K_={}));var Vt;(function(_){_[_.DOUBLE=0]="DOUBLE",_[_.SINGLE=1]="SINGLE",_[_.TRIPLE=2]="TRIPLE"})(Vt||(Vt={}));var bt;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(bt||(bt={}));var P_;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(P_||(P_={}));var wt;(function(_){_.VALIDATOR="validator",_.RPC="rpc"})(wt||(wt={}));var vt;(function(_){_.SOLANA="solana",_.JITO="jito",_.AGAVE="agave",_.FIREDANCER="firedancer"})(vt||(vt={}));var Ht;(function(_){_.CO_HOST_RELAYER="co-host-relayer",_.SEPARATED_RELAYER="separated-relayer",_.WITHOUT_RELAYER="without-relayer"})(Ht||(Ht={}));var Yt;(function(_){_.FIREDANCER="firedancer",_.FRANKENDANCER="frankendancer"})(Yt||(Yt={}));var He;(function(_){_[_.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",_[_.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",_[_.RPC_NODE=2]="RPC_NODE"})(He||(He={}));var Ye;(function(_){_.SOLANA_CLIENT="SolanaClient",_.JITO_MEV="JitoMev",_.FIREDANCER="Firedancer"})(Ye||(Ye={}));var Qt=!1,qt=!1,$t=!1,Wt=!1,Xt=!1,jt=!1,W={ID:"solv",LANG:K_.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"},r_={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},g={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"},p=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"),f_=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}/${r_.LOG}`,i=M.ACCOUNTS,n=M.LEDGER,T=M.SNAPSHOTS,s=`${H.ROOT}/${r_.STARTUP_SCRIPT}`;return{identity:e,voteAccount:E,log:o,accounts:i,ledger:n,scriptPath:s,snapshots:T}},"startupScriptPaths");var t_="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",xE="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",zt="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",Zt=9,S_="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",_o="So11111111111111111111111111111111111111112",eo="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Eo="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",Jt;(function(_){_[_.ELSOL=S_]="ELSOL",_[_.SOL=_o]="SOL",_[_.USDC=eo]="USDC",_[_.EPCT=Eo]="EPCT"})(Jt||(Jt={}));var xt;(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"})(xt||(xt={}));var xC={[_o]:9,[S_]:9,[eo]:6,[Eo]:6},Je="/home/solv/currentEpoch.json";var xe="https://api.testnet.solana.com";import{spawnSync as QE}from"child_process";var to=t(()=>{QE("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let _=W.NODE_VERSION;QE(`pnpm env use ${_} --global`,{shell:!0,stdio:"inherit"}),QE("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");import{spawnSync as Y}from"child_process";var Qe=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 ts,writeFile as os}from"fs/promises";import{homedir as is}from"os";var G_=t(async _=>{let E=`${is()}/${r_.JITO_CONFIG}`,i={...JSON.parse(await ts(E,"utf8")),..._},n=JSON.stringify(i,null,2);await os(E,n),console.log(`Updated ${E} with new values.`)},"updateJitoSolvConfig");import{spawnSync as oo}from"child_process";import ns from"inquirer";var io=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";oo(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${E}`,{shell:!0,stdio:"inherit"});let n=`solana vote-update-commission ${o} ${_} ${E} --keypair ${E}`;oo(n,{shell:!0,stdio:"inherit"})},"updateCommission"),no=t(async()=>await ns.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Ne}from"@skeet-framework/utils";import Ts from"chalk";import ss from"inquirer";var To=t(async()=>{let _=await ss.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Ne("sudo ufw delete allow 8899/udp"),await Ne("sudo ufw delete allow 8899/tcp"),await Ne(`sudo ufw allow from ${_.ip} to any port 8899 proto tcp`),await Ne(`sudo ufw allow from ${_.ip} to any port 8899 proto udp`),await Ne("sudo ufw reload"),console.log(Ts.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var rs=t(()=>ft,"getSolvVersion"),$_=rs;import{readFile as Rs,writeFile as Cs}from"fs/promises";import{existsAsync as cs}from"@skeet-framework/utils";var qE;(function(_){_.EN="en",_.JA="ja"})(qE||(qE={}));var Oc=Object.values(qE),O;(function(_){_.MAINNET="mainnet-beta",_.TESTNET="testnet"})(O||(O={}));var so=Object.values(O),D;(function(_){_.RPC="rpc",_.VALIDATOR="validator"})(D||(D={}));var ro=Object.values(D),F;(function(_){_.SOLANA="solana",_.AGAVE="agave",_.JITO="jito",_.FRANKENDANCER="frankendancer",_.BAM="bam",_.NONE="none"})(F||(F={}));var lc=Object.values(F).filter(_=>_!=="none"),v;(function(_){_.AGAVE="agave",_.JITO="jito",_.NONE="none"})(v||(v={}));var So=Object.values(v).filter(_=>_!=="none"),X;(function(_){_.SINGLE="single",_.DOUBLE="double",_.TRIPLE="triple"})(X||(X={}));var as={NETWORK:O.TESTNET,NODE_TYPE:D.RPC,VALIDATOR_TYPE:F.NONE,RPC_TYPE:v.AGAVE,MNT_DISK_TYPE:X.TRIPLE,TESTNET_SOLANA_VERSION:s_,MAINNET_SOLANA_VERSION:e_,NODE_VERSION:kt,TESTNET_DELINQUENT_STAKE:10,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:pt,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:I_,SNAPSHOTS_PATH:n_,MOD:!1},N_=as;import{homedir as ds}from"os";var Ns=t(async()=>{let e=`${ds()}/${ke}`;return await cs(e)?JSON.parse(await Rs(e,"utf-8")):(console.log("Creating default config file at",e),await Cs(e,JSON.stringify(N_,null,2)),N_)},"readConfig"),b=Ns;import Os from"node-fetch";var a_=t(async _=>{try{let e=await b();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 Os(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 Ps}from"child_process";import{Connection as ao}from"@solana/web3.js";var Oe=t(async(_,e,E=!1,o=200)=>{let i={pubkey:e,isActive:!1,reason:""};try{let n=E?new ao("https://api.testnet.solana.com"):new ao(_,"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 r=s.lastVote,a=await n.getSlot()-r;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 ls}from"child_process";var m=t(_=>{let e=`solana address --keypair ${_}`,{stdout:E}=ls(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolanaAddress");var Fs=t(_=>new Promise(e=>setTimeout(e,_)),"sleep"),J=Fs;import{sendDiscord as Is}from"@skeet-framework/utils";var Ro=30,Ds=t(async _=>{try{let e=_.NETWORK===O.TESTNET,{mainnetValidatorVoteKey:E,testnetValidatorVoteKey:o}=p(),n=m(e?o:E),T=await Oe(_.RPC_URL,n,e),s=0;for(;!T.isActive;){if(s>=Ro){console.log("Max retries reached, exiting...");let r=`\u26A0\uFE0F Validator is not active for ${Ro} minutes!
4
4
  Account: ${T.pubkey}
5
5
  Reason: ${T.reason}
6
6
  Message: Max retries reached, exiting catchup check...
7
- Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Fs(S),!1}console.log("Waiting for validator to catch up..."),await J(60*1e3),T=await de(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),so=Is;var Ps=t(async _=>{let e=_.NETWORK===d.MAINNET,E=_.VALIDATOR_TYPE===l.FRANKENDANCER,o=_.VALIDATOR_TYPE===l.BAM,{mainnetValidatorKey:i,testnetValidatorKey:n}=u(),T=e?i:n,s=!1;E?s=e?Yt:Jt:o?s=e?xt:Qt:s=e?vt:Ht,s=s&&_.AUTO_RESTART;let S=p(T),r=`**${S}** updated solv to **${Q_()}**`;if(await r_(r),s){let a=`Restarting **${S}**
8
- _ _`;await r_(a);try{Ds("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(I){let N=`Error restarting **${S}**: ${I?.message||"Unknown error"}`;return await r_(N),!1}let R=Math.floor(Date.now()/1e3),c=`**${S}** has restarted, catching up...
7
+ Please check your validator node \u{1F477}\u200D\u2640\uFE0F`;return await Is(r),!1}console.log("Waiting for validator to catch up..."),await J(60*1e3),T=await Oe(_.RPC_URL,n,e),s++}return!0}catch(e){return console.log("Error in waitCatchup:",e),!1}},"waitCatchup"),Co=Ds;var fs=t(async _=>{let e=_.NETWORK===O.MAINNET,E=_.VALIDATOR_TYPE===F.FRANKENDANCER,o=_.VALIDATOR_TYPE===F.BAM,{mainnetValidatorKey:i,testnetValidatorKey:n}=p(),T=e?i:n,s=!1;E?s=e?$t:Wt:o?s=e?Xt:jt:s=e?Qt:qt,s=s&&_.AUTO_RESTART;let r=m(T),S=`**${r}** updated solv to **${$_()}**`;if(await a_(S),s){let a=`Restarting **${r}**
8
+ _ _`;await a_(a);try{Ps("solv update && solv update --config && solv update -b",{stdio:"inherit",shell:!0})}catch(l){let d=`Error restarting **${r}**: ${l?.message||"Unknown error"}`;return await a_(d),!1}let R=Math.floor(Date.now()/1e3),c=`**${r}** has restarted, catching up...
9
9
  at: <t:${R}> (${R})
10
- _ _`;await r_(c),await J(180*1e3);let C=await so(_);if(C){let N=Math.floor(Date.now()/1e3)-R,O=Math.floor(N/60),A=N%60,P=O>0?`${O}m ${A}s`:`${A}s`,L=`**${S}** has caught up!
10
+ _ _`;await a_(c),await J(180*1e3);let C=await Co(_);if(C){let d=Math.floor(Date.now()/1e3)-R,N=Math.floor(d/60),A=d%60,P=N>0?`${N}m ${A}s`:`${A}s`,L=`**${r}** has caught up!
11
11
  at: <t:${R}> (${R})
12
- **${S}** took **${P}** to catch up after restart!
13
- _ _`;await r_(L)}else{let I=`**${S}** failed to catch up after update`;await r_(I)}return C}return!0},"autoUpdate"),So=Ps;import{homedir as fs}from"os";import{readFile as Us,writeFile as ro}from"fs/promises";import{existsAsync as As}from"@skeet-framework/utils";var m=t(async _=>{let E=`${fs()}/${ye}`;await As(E)||(console.log("Creating default config file at",E),await ro(E,JSON.stringify(c_,null,2)));let i={...JSON.parse(await Us(E,"utf8")),..._},n=JSON.stringify(i,null,2);await ro(E,n)},"updateDefaultConfig");var Ls={description:"\u{1F48E} Solana Validator All-in-One CLI \u{1F48E}",version:"Output the current version",help:"Display help for solv commands",subcmdHelp:"Display help for subcommands",server:"Open solv Dashboard",start:"Start Solana Validator",stop:"Stop Solana Validator",status:"Show Solana Validator Status",restart:"Restart Solana Validator",update:"Update Solana Validator Version",get:"Get Solana Validator Info Commands",log:"Tail Solana Validator Log",catchup:"Catchup Solana Validator",monitor:"Monitor Solana Validator",config:"Show Solana Validator Config",install:"Install/Update Solana Version",stake:"Solana Delegate Stake",check:"Check Solana Validator",scp:"Download/Upload Solana Validator Keypairs",cron:"Run Schedule Tasks",setup:"Setup Solana Validator",epoch:"Show Current Epoch",slot:"Show Current Slot",solv:"Endroll Solv AA",installer:"Please select an option:",unstake:"UnStake"},Je=Ls;var Ms={description:"\u{1F48E} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30AA\u30FC\u30EB\u30A4\u30F3\u30EF\u30F3 CLI \u30C4\u30FC\u30EB \u{1F48E}",version:"\u73FE\u5728\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B",help:"solv \u30B3\u30DE\u30F3\u30C9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u8A73\u7D30\u3092\u8868\u793A",subcmdHelp:"\u30B5\u30D6\u30B3\u30DE\u30F3\u30C9\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A",server:"solv \u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\u3092\u958B\u304F",start:"\u30CE\u30FC\u30C9\u3092\u8D77\u52D5",stop:"\u30CE\u30FC\u30C9\u3092\u505C\u6B62",status:"\u30CE\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u8868\u793A",restart:"\u30CE\u30FC\u30C9\u3092\u518D\u8D77\u52D5",update:"\u30CE\u30FC\u30C9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0",get:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u60C5\u5831\u3092\u53D6\u5F97 \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",log:"\u30CE\u30FC\u30C9\u306E\u30ED\u30B0\u3092\u8868\u793A",catchup:"\u30CE\u30FC\u30C9\u3092\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7",monitor:"\u30CE\u30FC\u30C9\u3092\u76E3\u8996",config:"\u30CE\u30FC\u30C9\u306E\u8A2D\u5B9A\u3092\u8868\u793A",install:"\u30BD\u30E9\u30CA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u66F4\u65B0/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",stake:"\u30BD\u30E9\u30CA\u306E\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",unstake:"\u30BD\u30E9\u30CA\u306E\u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",check:"\u30CE\u30FC\u30C9\u306E\u72B6\u614B\u3092\u30C1\u30A7\u30C3\u30AF",scp:"scp \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",cron:"\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30BF\u30B9\u30AF \u30B5\u30D6\u30B3\u30DE\u30F3\u30C9",setup:"\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u3092\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7",epoch:"\u73FE\u5728\u306E\u30A8\u30DD\u30C3\u30AF\u3092\u8868\u793A",slot:"\u73FE\u5728\u306E\u30B9\u30ED\u30C3\u30C8\u3092\u8868\u793A",solv:"Solv\u30A8\u30F3\u30C9\u30ED\u30FC\u30EB AA \u3092\u8868\u793A",installer:"\u4EE5\u4E0B\u304B\u3089\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:"},ao=Ms;var us={success:{created:"Created"},error:{failed:"Failed"},installer:{welcomeMsg:"\u{1F525} Welcome to the solv installer \u{1F525}",description:"solv is born and ready for running Solana Validator Nodes \u{1F680}"}},xe=us;var ps={success:{created:"\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F"},error:{failed:"\u5931\u6557\u3057\u307E\u3057\u305F"},installer:{welcomeMsg:"\u{1F525} \u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u30C4\u30FC\u30EB solv \u3078\u3088\u3046\u3053\u305D \u{1F525}",description:"\u3042\u306A\u305F\u306F\u3082\u3046\u3001\u30BD\u30E9\u30CA\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306B\u306A\u308B\u6E96\u5099\u304C\u3067\u304D\u3066\u3044\u307E\u3059\u3002"}},Ro=ps;var Qe=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],qe=[[],[") Check Validator Status",") Show Validator Logs",") Start Validator",") Stop Validator",") Restart Validator (no fetch snapshot)",") Restart Validator (fetch snapshot)",") Return to Main Menu"],[") Show Validator Config",") Register Validator Info",") Show Validator Keys Path/Address/Balance",") Get Current Epoch/Slot",") Get Solana Validator Catchup Info",") Get Solana Validator Monitor Info",") Return to Main Menu"],[") Backup Validator Keyfiles",") Set Validator Keyfile/Network",") Return to Main Menu"],[") Stake",") Unstake",") Return to Main Menu"],[],[]];var Co=[") \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9 - Solana\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8/\u30C0\u30A6\u30F3\u30B0\u30EC\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B/\u30ED\u30B0\u3092\u78BA\u8A8D\u30FB\u307E\u305F\u306F\u958B\u59CB/\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u60C5\u5831",") \u9375\u306E\u8A2D\u5B9A",") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"],co=[[],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30ED\u30B0\u3092\u8868\u793A",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u958B\u59CB",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u505C\u6B62",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u306A\u3057)",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u3092\u518D\u8D77\u52D5 (fetch snapshot \u3042\u308A)",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u8A2D\u5B9A\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u60C5\u5831\u3092\u767B\u9332\u3059\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u9375\u306E \u30D1\u30B9/\u30A2\u30C9\u30EC\u30B9/\u6B8B\u9AD8 \u3092\u898B\u308B",") \u73FE\u5728\u306E \u30A8\u30DD\u30C3\u30AF/\u30B9\u30ED\u30C3\u30C8 \u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E Catchup \u60C5\u5831\u3092\u898B\u308B",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u30E2\u30CB\u30BF\u30FC\u60C5\u5831\u3092\u898B\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[") \u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30A2\u30F3\u30B9\u30C6\u30FC\u30AD\u30F3\u30B0\u3092\u884C\u3046",") \u30E1\u30A4\u30F3\u30E1\u30CB\u30E5\u30FC\u306B\u623B\u308B"],[],[]];var ms={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},$e=ms;var hs={server:{description:"Open solv Dashboard"},start:{description:"Start Solana Validator"},stop:{description:"Stop Solana Validator"},status:{description:"Show Solana Validator Status"},restart:{description:"Restart Solana Validator"},update:{description:"Update Solana Validator Version"},get:{description:"Get Solana Validator Info"},log:{description:"Tail Solana Validator Log"},catchup:{description:"Catchup Solana Validator"},monitor:{description:"Monitor Solana Validator"},config:{description:"Show Solana Validator Config"},install:{description:"Install/Update Solana Version"},stake:{description:"Solana Delegate Stake"},unstake:{description:"UnStake"},check:{description:"Check Solana Validator"},scp:{description:"Download/Upload Solana Validator Keypairs"},cron:{description:"Run Schedule Tasks"},setup:{description:"Setup Solana Validator"},epoch:{description:"Show Current Epoch"},slot:{description:"Show Current Slot"},solv:{description:"Endroll Solv AA"}},No=hs;var We=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Oo=[") \u30D0\u30EA\u30C7\u30FC\u30BF-\u306E\u72B6\u614B\u3092\u78BA\u8A8D",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u4F5C\u6210",") \u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306E\u9375\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",") \u9375/\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3092\u8A2D\u5B9A\u3059\u308B",") \u30A2\u30F3\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",") \u7D42\u4E86"];var Bs=t(_=>{let e={cmds:Je,subCmds:$e,logs:xe,installer:Qe,installerSub:qe,clientCmds:We};switch(_){case B_.EN:e={cmds:Je,subCmds:$e,logs:xe,installer:Qe,installerSub:qe,clientCmds:We};break;case B_.JA:e={cmds:ao,subCmds:No,logs:Ro,installer:Co,installerSub:co,clientCmds:Oo};break;default:e={cmds:Je,subCmds:$e,logs:xe,installer:Qe,installerSub:qe,clientCmds:We}}return e},"readLocale"),lo=Bs;import{existsSync as Gs,readFileSync as ks,writeFileSync as Fo}from"fs";import{readFileSync as gs,writeFileSync as ys}from"fs";import{homedir as Ks}from"os";var q_=t(_=>{let E=`${Ks()}/${s_.CONFIG}`,i={...JSON.parse(gs(E,"utf8")),..._},n=JSON.stringify(i,null,2);ys(E,n)},"updateSolvConfig");import{homedir as Vs}from"os";var Io=t(()=>{let e=`${Vs()}/${s_.CONFIG}`;Gs(e)||(Fo(e,JSON.stringify($,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(ks(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Fo(e,JSON.stringify($,null,2)),E=$}let o=lo(E.LANG);return E.RPC_URL||(E.RPC_URL=$.RPC_URL,q_({RPC_URL:$.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,q_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",q_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as k}from"child_process";import{promises as Do}from"fs";import ws from"path";var bs=t(()=>{let _="/home/solv/firedancer/mod.diff",e=String.raw`diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
12
+ **${r}** took **${P}** to catch up after restart!
13
+ _ _`;await a_(L)}else{let l=`**${r}** failed to catch up after update`;await a_(l)}return C}return!0},"autoUpdate"),co=fs;import{homedir as Us}from"os";import{readFile as As,writeFile as No}from"fs/promises";import{existsAsync as Ls}from"@skeet-framework/utils";var h=t(async _=>{let E=`${Us()}/${ke}`;await Ls(E)||(console.log("Creating default config file at",E),await No(E,JSON.stringify(N_,null,2)));let i={...JSON.parse(await As(E,"utf8")),..._},n=JSON.stringify(i,null,2);await No(E,n)},"updateDefaultConfig");var Ms={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"},qe=Ms;var ps={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:"},Oo=ps;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}"}},$e=us;var ms={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"}},lo=ms;var We=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Xe=[[],[") 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 Fo=[") \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"],Io=[[],[") \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 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"}},je=hs;var Bs={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"}},Do=Bs;var ze=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Po=[") \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 gs=t(_=>{let e={cmds:qe,subCmds:je,logs:$e,installer:We,installerSub:Xe,clientCmds:ze};switch(_){case K_.EN:e={cmds:qe,subCmds:je,logs:$e,installer:We,installerSub:Xe,clientCmds:ze};break;case K_.JA:e={cmds:Oo,subCmds:Do,logs:lo,installer:Fo,installerSub:Io,clientCmds:Po};break;default:e={cmds:qe,subCmds:je,logs:$e,installer:We,installerSub:Xe,clientCmds:ze}}return e},"readLocale"),fo=gs;import{existsSync as ks,readFileSync as Vs,writeFileSync as Uo}from"fs";import{readFileSync as ys,writeFileSync as Ks}from"fs";import{homedir as Gs}from"os";var W_=t(_=>{let E=`${Gs()}/${r_.CONFIG}`,i={...JSON.parse(ys(E,"utf8")),..._},n=JSON.stringify(i,null,2);Ks(E,n)},"updateSolvConfig");import{homedir as bs}from"os";var Ao=t(()=>{let e=`${bs()}/${r_.CONFIG}`;ks(e)||(Uo(e,JSON.stringify(W,null,2)),console.log(`Created default config file at ${e}`));let E;try{E=JSON.parse(Vs(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Uo(e,JSON.stringify(W,null,2)),E=W}let o=fo(E.LANG);return E.RPC_URL||(E.RPC_URL=W.RPC_URL,W_({RPC_URL:W.RPC_URL})),E.IS_MEV_MODE===void 0&&(E.IS_MEV_MODE=!1,W_({IS_MEV_MODE:!1})),E.DISCORD_WEBHOOK_URL||(E.DISCORD_WEBHOOK_URL="",W_({DISCORD_WEBHOOK_URL:""})),{config:E,locale:o}},"readOrCreateDefaultConfig");import{spawnSync as k}from"child_process";import{promises as Lo}from"fs";import vs from"path";var ws=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,104 +5795,35 @@ index 479e0f1829..a97f5778d4 100644
5795
5795
 
5796
5796
  /* FD_LOG_NOTICE(( ... printf style arguments ... )) will send a message
5797
5797
  at the NOTICE level to the logger. E.g. for a typical fd_log
5798
- `;return{filePath:_,body:e}},"modDiff"),Xe=bs;var je=t(async(_,e,E=!1)=>{let o=_.NETWORK===d.TESTNET,i=e||(o?x_:F_),n=E||_.MOD,{filePath:T,body:s}=Xe();k("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),n?(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),k('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),await Do.mkdir(ws.dirname(T),{recursive:!0}),await Do.writeFile(T,s,"utf8"),k(`sudo chown solv:solv "${T}"`,{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer apply ${T}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add /home/solv/firedancer/src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("git -C /home/solv/firedancer add /home/solv/firedancer/book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k('git -C /home/solv/firedancer commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(k("git -C /home/solv/firedancer fetch origin",{shell:!0,stdio:"inherit"}),k(`git -C /home/solv/firedancer checkout v${i}`,{shell:!0,stdio:"inherit"}),k("git -C /home/solv/firedancer submodule update --init --recursive",{shell:!0,stdio:"inherit"})),k("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),k("sudo systemctl restart frankendancer",{shell:!0,stdio:"inherit"}),k("sudo systemctl restart port-relay",{shell:!0,stdio:"inherit"})},"frankendancerUpdate");import{spawnSync as vs}from"node:child_process";import{spawnSync as x}from"child_process";var ze=t((_,e=!1,E=!1)=>{x("sudo apt install --only-upgrade doublezero doublezero-solana -y",{shell:!0,stdio:"inherit"}),x("sudo systemctl restart doublezerod",{shell:!0,stdio:"inherit"}),E?e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(x(`mkdir /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`cd /tmp/${_}-bam`,{shell:!0,stdio:"inherit"}),x(`git clone https://github.com/jito-labs/bam-client.git --recurse-submodules /tmp/${_}`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),x(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),x(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),x("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),x(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),x(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"})):e?x(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):x(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"bamUpdate");var fo=t(_=>{let e=_.NETWORK===d.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===l.JITO,i=_.VALIDATOR_TYPE===l.BAM,n=_.VALIDATOR_TYPE===l.FRANKENDANCER,T=_.AUTO_RESTART,s=_.MOD,S=10;T&&!e&&(S=30);let r=e?T_:__;o&&(r=l_,e&&(r=ae)),i&&(r=VE,e&&(r=kE)),n&&(r=F_,e&&(r=x_)),E&&(r=h_,o&&(r=ht)),F.command("update").alias("u").description("Update Command").option("-v, --version <version>",`Solana Version e.g ${r}`,r).option("-b, --background","No Monitor Delinquent Stake Update",!1).option("-c, --commission","Update Commission",!1).option("-f, --firewall","Update Firewall",!1).option("--migrate-config","Migrate Solv Config",!1).option("--config","Update Solv Config Default Solana Version",!1).option("--auto","Auto Update",!1).option("--mod","Modified Versions",!1).action(async a=>{let R=Q_(),c=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(Po.white(`Current solv version: ${R}`)),a.auto){await So(_);return}if(a.migrateConfig){let C=Io().config,I=W.TRIPLE;C.DISK_TYPES===0?I=W.DOUBLE:C.DISK_TYPES===1?I=W.SINGLE:I=W.TRIPLE;let N=C.SOLANA_NETWORK===I_.TESTNET,O=C.SOLV_TYPE===be.RPC_NODE,A=C.MAINNET_TYPE===we.JITO_MEV,P={NETWORK:N?d.TESTNET:d.MAINNET,NODE_TYPE:O?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:I,RPC_TYPE:O?v.JITO:v.NONE,VALIDATOR_TYPE:A?l.JITO:N?l.AGAVE:l.SOLANA,TESTNET_SOLANA_VERSION:C.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:C.MAINNET_SOLANA_VERSION,NODE_VERSION:C.NODE_VERSION,TESTNET_DELINQUENT_STAKE:C.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:C.MAINNET_DELINQUENT_STAKE,COMMISSION:C.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:C.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:C.STAKE_ACCOUNT,HARVEST_ACCOUNT:C.HARVEST_ACCOUNT,IS_MEV_MODE:C.IS_MEV_MODE,RPC_URL:C.RPC_URL,KEYPAIR_PATH:C.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:C.DISCORD_WEBHOOK_URL,AUTO_UPDATE:C.AUTO_UPDATE,AUTO_RESTART:C.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:C.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots",MOD:!1};await m(P)}if(a.config){if(await m({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__}),o){let C=e?ae:l_;await g_({version:C,tag:`v${C}`})}if(i){let C=e?kE:VE;await g_({version:C,tag:`v${C}`})}console.log(Po.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await Eo();return}if(a.background){let C=a.version,I=!!C.startsWith("3");if(await m({TESTNET_SOLANA_VERSION:T_,MAINNET_SOLANA_VERSION:__}),o){let O=m_,A=`v${C}-jito`,P=`v${C}-mod`,L=a.mod||s?`${P}${O}`:`${A}${O}`;Ye(L,a.mod||s,I),await g_({version:C,tag:`v${C}`}),await Ce(c,!0,S);return}if(i){let O=Re,A=`v${C}-bam`,P=`v${C}-mod`,L=a.mod||s?`${P}${O}`:`${A}${O}`;ze(L,a.mod||s,I),await g_({version:C,tag:`v${C}`}),await Ce(c,!0,S);return}if(n){await je(_,C,a.mod||s),await Ce(c,!0,S);return}await Ve(C,a.mod||s,I);let N=e?10:5;e&&vs("solv start",{stdio:"inherit",shell:!0}),await Ce(N,!0,S);return}else if(a.commission){let C=await eo();_o(C.commission,e)}else zt()})},"updateCommands");import{spawnSync as Hs}from"node:child_process";var Uo=t(_=>{try{let{log:e}=D_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Hs(E,{shell:!0,stdio:"inherit"});if(o.error)throw o.error;o.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):o.status!==0&&(console.error(`Child process exited with code ${o.status}`),process.exit(o.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Ao=t(()=>{F.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(_=>{Uo(_)})},"logCommands");import d_ from"chalk";import{spawnSync as Ys}from"child_process";import{homedir as Js}from"os";var Ze=t(_=>{let e=Js(),E=u(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=I_.TESTNET,s=_.COMMISSION;_.NETWORK===d.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=I_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let S=_.RPC_URL||T;_.NETWORK===d.TESTNET&&(S=I_.TESTNET);let r=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${S} --keypair ${i}`;Ys(r,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as _E}from"child_process";import{existsSync as Lo,readdirSync as xs,rmSync as Qs}from"fs";import{homedir as qs}from"os";import Mo from"path";var eE=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[y.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===d.TESTNET?(e=[y.TESTNET_VALIDATOR_KEY,y.TESTNET_VALITATOR_AUTHORITY_KEY,y.TESTNET_VALIDATOR_VOTE_KEY,y.MAINNET_VALIDATOR_KEY,y.MAINNET_VALITATOR_AUTHORITY_KEY,y.MAINNET_VALIDATOR_VOTE_KEY],E=6):(e=[y.MAINNET_VALIDATOR_KEY,y.MAINNET_VALITATOR_AUTHORITY_KEY,y.MAINNET_VALIDATOR_VOTE_KEY],E=3);let o=`solana-keygen grind --starts-and-ends-with E:SV:${E}`;_E(o,{shell:!0,stdio:"ignore"});let i=xs("./").filter(S=>S.endsWith("SV.json")),n=qs(),T=Mo.join(n,"unstaked-identity.json");Lo(T)&&_E(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let S of i){let r=Mo.join(n,e[s]);if(s++,Lo(r)){console.log(`${r} is already exist!`),Qs(S,{recursive:!0});continue}let a=`mv ${S} ${r}`;_E(a,{shell:!0,stdio:"inherit"})}_E("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${n}`)},"createSolvKeyPairs");import{spawnSync as po}from"child_process";var $s=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
5799
- Description=Jupiter API Service Instance
5800
- After=network.target
5801
-
5802
- [Service]
5803
- Type=simple
5804
- ExecStart=/home/solv/jupiter-swap-api --rpc-url ${_} --yellowstone-grpc-endpoint ${e} --yellowstone-grpc-x-token "${E}" --port ${o}
5805
- WorkingDirectory=/home/solv
5806
- Restart=always
5807
- User=solv
5808
- Environment=NODE_ENV=production
5809
- Environment=RUST_LOG=info
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
-
5812
- [Install]
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
- wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
5815
- unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
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}=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
-
5819
- $ solv jupiter --help`))},"jupiterAPISetup"),mo=js;var y_={version:"2.3.10",tag:"v2.3.10",commissionBps:0,relayerUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",blockEngineUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",shredReceiverAddr:"64.130.50.14:1002",bamUrl:"http://frankfurt.mainnet.bam.jito.wtf"},Ne={TESTNET:{Dallas:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002",BAM_URL:"http://dallas.testnet.bam.jito.wtf"},NewYork:{BLOCK_ENGINE_URL:"https://ny.testnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.35.224:1002",BAM_URL:"http://ny.testnet.bam.jito.wtf"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://dallas.testnet.block-engine.jito.wtf",RELAYER_URL:"http://dallas.testnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.218.12:1002",BAM_URL:"http://ny.testnet.bam.jito.wtf"}},MAINNET:{Amsterdam:{BLOCK_ENGINE_URL:"https://amsterdam.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://amsterdam.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"74.118.140.240:1002",BAM_URL:"http://amsterdam.mainnet.bam.jito.wtf"},London:{BLOCK_ENGINE_URL:"https://london.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://london.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"142.91.127.175:1002",BAM_URL:"http://london.mainnet.bam.jito.wtf"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.50.14:1002",BAM_URL:"http://frankfurt.mainnet.bam.jito.wtf"},NewYork:{BLOCK_ENGINE_URL:"https://ny.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://ny.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"141.98.216.96:1002",BAM_URL:"http://ny.mainnet.bam.jito.wtf"},Tokyo:{BLOCK_ENGINE_URL:"https://tokyo.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://tokyo.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.9.160:1002",BAM_URL:"http://tokyo.mainnet.bam.jito.wtf"},SaltLakeCity:{BLOCK_ENGINE_URL:"https://slc.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://slc.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.53.8:1002",BAM_URL:"http://slc.mainnet.bam.jito.wtf"},Singapore:{BLOCK_ENGINE_URL:"https://singapore.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://singapore.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"202.8.11.224:1002",BAM_URL:"http://singapore.mainnet.bam.jito.wtf"},Dublin:{BLOCK_ENGINE_URL:"https://dublin.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://dublin.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"64.130.61.8:1002",BAM_URL:""}}};import{existsAsync as zs}from"@skeet-framework/utils";import{readFile as Zs,writeFile as ho}from"fs/promises";import{homedir as _S}from"os";import eS from"path";var t_=t(async()=>{let _=_S(),e=eS.join(_,s_.JITO_CONFIG);await zs(e)||(await ho(e,JSON.stringify(y_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Zs(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await ho(e,JSON.stringify(y_,null,2)),E=y_}return E},"readOrCreateJitoConfig");import{spawnSync as ES}from"child_process";var Oe=t(()=>{ES("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import le from"chalk";import EE from"inquirer";import tS from"inquirer";var Bo=t(async _=>{let E=Object.keys(_?Ne.TESTNET:Ne.MAINNET),o=_?Ne.TESTNET:Ne.MAINNET,i=await tS.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:E}]),n=i.region,T=o[n];return{version:y_.version,tag:y_.tag,commissionBps:i.commissionBps,blockEngineUrl:T.BLOCK_ENGINE_URL,relayerUrl:T.RELAYER_URL,shredReceiverAddr:T.SHRED_RECEIVER_ADDR,bamUrl:T.BAM_URL}},"askJitoSetting");var oS=t(async()=>{try{let _=l.NONE,e=v.AGAVE,E=c_.COMMISSION,o=!1,i=await EE.prompt([{name:"network",type:"list",message:"Choose Network",choices:to,default:d.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:oo,default:D.RPC}]),n=i.network===d.TESTNET;if(i.nodeType===D.VALIDATOR){let S=i.network===d.MAINNET?[l.JITO,l.SOLANA]:[l.AGAVE,l.JITO,l.FRANKENDANCER,l.BAM];_=await EE.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:S,default:l.AGAVE}).then(r=>r.validatorType),e=v.NONE}if(i.nodeType===D.RPC&&(e=await EE.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:io,default:v.AGAVE}).then(S=>S.rpcType)),i.nodeType===D.VALIDATOR){let S=await EE.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${c_.COMMISSION}%)'`,default:c_.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(E=S.commission,o=S.isDummy,_===l.JITO||_===l.FRANKENDANCER||_===l.BAM){await t_();let r=await Bo(n);await g_(r)}}let{network:T,nodeType:s}=i;return console.log(le.white("Network:",T)),console.log(le.white("Node Type:",s)),console.log(le.white("Validator Type:",_)),console.log(le.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(le.white("Commission:",E)),await m({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),go=oS;import{spawnSync as X}from"child_process";var Fe=t((_=l_,e=!1,E=!1)=>{E?e?X(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(X(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),X(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} clone https://github.com/jito-foundation/jito-solana.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),X(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),X(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),X("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),X(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),X(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"}),X("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})):e?X(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):X(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var yo=t(()=>`#!/bin/bash
5820
- exec agave-validator \\
5821
- --identity ${U} \\
5822
- --log ${w} \\
5823
- --accounts ${v_} \\
5824
- --ledger ${f} \\
5825
- --snapshots ${i_} \\
5826
- --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5827
- --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5828
- --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
5829
- --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
5830
- --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
5831
- --known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\
5832
- --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
5833
- --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
5834
- --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
5835
- --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
5836
- --expected-shred-version 50093 \\
5837
- --only-known-rpc \\
5838
- --full-rpc-api \\
5839
- --no-voting \\
5840
- --private-rpc \\
5841
- --enable-cpi-and-log-storage \\
5842
- --no-skip-initial-accounts-db-clean \\
5843
- --dynamic-port-range 8000-8025 \\
5844
- --rpc-bind-address 127.0.0.1 \\
5845
- --rpc-port 8899 \\
5846
- --no-port-check \\
5847
- --account-index program-id spl-token-mint spl-token-owner \\
5848
- --enable-rpc-transaction-history \\
5849
- --rpc-pubsub-enable-block-subscription \\
5850
- --rpc-pubsub-enable-vote-subscription \\
5851
- --no-wait-for-vote-to-start-leader \\
5852
- --account-index-include-key Stake11111111111111111111111111111111111111 \\
5853
- --account-index-include-key Config1111111111111111111111111111111111111 \\
5854
- --account-index-include-key AddressLookupTab1e1111111111111111111111111 \\
5855
- --wal-recovery-mode skip_any_corrupted_record \\
5856
- --use-snapshot-archives-at-startup when-newest \\
5857
- --limit-ledger-size 400000000 \\
5858
- `,"startJitoRPCScript");import{existsAsync as TS}from"@skeet-framework/utils";import{writeFile as sS}from"fs/promises";import{spawnSync as iS}from"node:child_process";var nS=t(()=>{let _=`sudo chmod +x ${O_}`;iS(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Ie=nS;var Ko=t(()=>`#!/bin/bash
5798
+ `;return{filePath:_,body:e}},"modDiff"),Ze=ws;var _E=t(async(_,e,E=!1)=>{let o=_.NETWORK===O.TESTNET,i=e||(o?q_:D_),n=E||_.MOD,{filePath:T,body:s}=Ze();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 Lo.mkdir(vs.dirname(T),{recursive:!0}),await Lo.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 _r}from"node:child_process";import{spawnSync as x}from"child_process";var eE=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 Mo=t(()=>`#!/bin/bash
5859
5799
  exec agave-validator \\
5860
5800
  --identity ${U} \\
5861
- --log ${w} \\
5862
- --accounts ${v_} \\
5801
+ --vote-account ${F_} \\
5802
+ --authorized-voter ${u} \\
5803
+ --log ${V} \\
5804
+ --accounts ${I_} \\
5863
5805
  --ledger ${f} \\
5864
- --snapshots ${i_} \\
5865
- --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5866
- --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5867
- --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
5868
- --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
5869
- --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
5870
- --known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\
5871
- --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
5872
- --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
5873
- --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
5874
- --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
5875
- --expected-shred-version 50093 \\
5806
+ --entrypoint entrypoint.testnet.solana.com:8001 \\
5807
+ --entrypoint entrypoint2.testnet.solana.com:8001 \\
5808
+ --entrypoint entrypoint3.testnet.solana.com:8001 \\
5809
+ --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \\
5810
+ --known-validator phz4F5mHZcZGC21GRUT6j3AqJxTUGDVAiCKiyucnyy1 \\
5811
+ --known-validator rad1u8GKZoyVWxVAKy1cjL84dqhS9mp57uAezPt4iQg \\
5876
5812
  --only-known-rpc \\
5877
- --full-rpc-api \\
5878
- --no-voting \\
5879
- --private-rpc \\
5880
- --enable-cpi-and-log-storage \\
5881
- --no-skip-initial-accounts-db-clean \\
5813
+ --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5882
5814
  --dynamic-port-range 8000-8025 \\
5883
- --rpc-bind-address 127.0.0.1 \\
5884
5815
  --rpc-port 8899 \\
5885
- --no-port-check \\
5886
- --account-index program-id spl-token-mint spl-token-owner \\
5887
- --enable-rpc-transaction-history \\
5888
- --rpc-pubsub-enable-block-subscription \\
5889
- --rpc-pubsub-enable-vote-subscription \\
5890
- --no-wait-for-vote-to-start-leader \\
5891
5816
  --wal-recovery-mode skip_any_corrupted_record \\
5817
+ --wait-for-supermajority 361144649 \\
5818
+ --expected-shred-version 41708 \\
5819
+ --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
5892
5820
  --use-snapshot-archives-at-startup when-newest \\
5893
- --limit-ledger-size 400000000 \\
5894
- `,"startRPCNodeScript");var SS=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case v.AGAVE:console.log("Agave RPC Node Setup"),J_(_.TESTNET_SOLANA_VERSION),E=Ko();break;case v.JITO:console.log("JITO RPC Node Setup");let o=m_,n=`${`v${ae}-jito`}${o}`;Fe(n),E=yo();break;default:console.log("Unknown RPC Node Setup");break}if(await TS(O_)){console.log("Startup script already exists. Skipping...");return}await sS(O_,E,"utf-8"),Ie()},"setupRpcNode"),Go=SS;import{spawnSync as rS}from"node:child_process";var aS=t(_=>{rS(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),JE=aS;import ko from"chalk";import{spawnSync as RS}from"child_process";var Vo=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;RS(e,{shell:!0,stdio:"inherit"})}catch{console.log(ko.yellow(`You might need to install the Solana SPL CLI:
5895
- `)),console.log(ko.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as cS}from"os";import{spawnSync as CS}from"child_process";var P_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=CS(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import dS from"chalk";import{spawnSync as NS}from"node:child_process";var bo=t(_=>{F.command("balance").alias("bal").alias("b").option("-s, --spl","Show SPL Token Balance",!1).description("Show Keypairs Balance").action(async e=>{if(e.spl){let o=`${cS()}/mainnet-authority-keypair.json`;await Vo(o),process.exit(0)}await OS(_),process.exit(0)})},"balanceCommands"),OS=t(async _=>{let e=j(_),E=`Validator Key: ${e.validatorKey}
5821
+ --limit-ledger-size 50000000 \\
5822
+ --block-production-method central-scheduler-greedy \\
5823
+ --maximum-full-snapshots-to-retain 1 \\
5824
+ --maximum-incremental-snapshots-to-retain 4 \\
5825
+ `,"startTestnetValidatorScript");import po from"chalk";import{spawnSync as Hs}from"child_process";var uo=t(async _=>{try{let e=`spl-token accounts --owner ${_}`;Hs(e,{shell:!0,stdio:"inherit"})}catch{console.log(po.yellow(`You might need to install the Solana SPL CLI:
5826
+ `)),console.log(po.white("$ cargo install spl-token-cli"))}},"splBalance");import{homedir as Js}from"os";import{spawnSync as Ys}from"child_process";var U_=t(_=>{let e=`solana balance --keypair ${_}`,{stdout:E}=Ys(e,{shell:!0,stdio:"pipe"});return E.toString().trim()},"getSolBalance");import xs from"chalk";import{spawnSync as Qs}from"node:child_process";var mo=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=`${Js()}/mainnet-authority-keypair.json`;await uo(o),process.exit(0)}await qs(_),process.exit(0)})},"balanceCommands"),qs=t(async _=>{let e=j(_),E=`Validator Key: ${e.validatorKey}
5896
5827
  Address: ${e.validatorKeyAddress}
5897
5828
  Balance: ${e.validatorKeyBalance}
5898
5829
  Vote Key: ${e.voteKey}
@@ -5904,53 +5835,75 @@ Balance: ${e.authorityKeyBalance}
5904
5835
  Active Identity:`;_.NODE_TYPE===D.RPC&&(E=`Validator Key: ${e.validatorKey}
5905
5836
  Address: ${e.validatorKeyAddress}
5906
5837
  Balance: ${e.validatorKeyBalance}
5907
- Active Identity:`),console.log(dS.white(E)),NS(`solana-keygen pubkey ${U}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),j=t(_=>{let e=u(),E=_.NETWORK===d.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:p(e.mainnetValidatorKey),validatorKeyBalance:P_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:p(e.testnetValidatorKey),validatorKeyBalance:P_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:p(e.testnetValidatorVoteKey),voteKeyBalance:P_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:p(e.testnetValidatorAuthorityKey),authorityKeyBalance:P_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:p(e.mainnetValidatorKey),validatorKeyBalance:P_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:p(e.mainnetValidatorVoteKey),voteKeyBalance:P_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:p(e.mainnetValidatorAuthorityKey),authorityKeyBalance:P_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");var wo=t((_=0,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),r=Y_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5838
+ Active Identity:`),console.log(xs.white(E)),Qs(`solana-keygen pubkey ${U}`,{stdio:"inherit",shell:!0})},"showKeypairsInfo"),j=t(_=>{let e=p(),E=_.NETWORK===O.TESTNET;return _.NODE_TYPE===D.RPC?{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:m(e.mainnetValidatorKey),validatorKeyBalance:U_(e.mainnetValidatorKey)}:E?{validatorKey:e.testnetValidatorKey,validatorKeyAddress:m(e.testnetValidatorKey),validatorKeyBalance:U_(e.testnetValidatorKey),voteKey:e.testnetValidatorVoteKey,voteKeyAddress:m(e.testnetValidatorVoteKey),voteKeyBalance:U_(e.testnetValidatorVoteKey),authorityKey:e.testnetValidatorAuthorityKey,authorityKeyAddress:m(e.testnetValidatorAuthorityKey),authorityKeyBalance:U_(e.testnetValidatorAuthorityKey)}:{validatorKey:e.mainnetValidatorKey,validatorKeyAddress:m(e.mainnetValidatorKey),validatorKeyBalance:U_(e.mainnetValidatorKey),voteKey:e.mainnetValidatorVoteKey,voteKeyAddress:m(e.mainnetValidatorVoteKey),voteKeyBalance:U_(e.mainnetValidatorVoteKey),authorityKey:e.mainnetValidatorAuthorityKey,authorityKeyAddress:m(e.mainnetValidatorAuthorityKey),authorityKeyBalance:U_(e.mainnetValidatorAuthorityKey)}},"getKeypairsInfo");var le=t((_,e="agave-validator")=>{let{validatorKeyAddress:E}=j(_),n=x_.filter(s=>s!==E).map(s=>`--known-validator ${s} \\`).join(`
5908
5839
  `);return`#!/bin/bash
5909
- exec ${n} \\
5840
+ exec ${e} \\
5910
5841
  --identity ${U} \\
5911
- --vote-account ${b_} \\
5912
- --authorized-voter ${b} \\
5913
- --log ${w} \\
5914
- --accounts ${i.ACCOUNTS_PATH} \\
5915
- --ledger ${i.LEDGER_PATH} \\
5916
- --snapshots ${i.SNAPSHOTS_PATH} \\
5842
+ --vote-account ${Y_} \\
5843
+ --authorized-voter ${w} \\
5844
+ --log ${V} \\
5845
+ --accounts ${_.ACCOUNTS_PATH} \\
5846
+ --ledger ${_.LEDGER_PATH} \\
5847
+ --snapshots ${_.SNAPSHOTS_PATH} \\
5917
5848
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5918
5849
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5919
5850
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
5920
5851
  --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
5921
5852
  --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
5922
- ${r}
5853
+ ${n}
5923
5854
  --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
5924
- --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
5925
- --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
5926
- --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
5927
- --commission-bps ${_} \\
5928
- --rpc-bind-address 127.0.0.1 \\
5929
- --block-engine-url ${E} \\
5930
- --shred-receiver-address ${o} \\
5855
+ --expected-shred-version 50093 \\
5931
5856
  --dynamic-port-range 8000-8025 \\
5857
+ --rpc-bind-address 127.0.0.1 \\
5932
5858
  --rpc-port 8899 \\
5933
5859
  --wal-recovery-mode skip_any_corrupted_record \\
5860
+ --use-snapshot-archives-at-startup when-newest \\
5934
5861
  --limit-ledger-size 50000000 \\
5935
5862
  --block-production-method central-scheduler-greedy \\
5936
5863
  --block-verification-method unified-scheduler \\
5937
5864
  --snapshot-interval-slots 0 \\
5938
5865
  --private-rpc \\
5939
- --full-rpc-api \\
5940
- `},"startJitoMainnetScript");var vo=t((_=1e4,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),r=H_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5866
+ `},"startMainnetValidatorScript");var Fe=t(_=>{let{validatorKeyAddress:e}=j(_),i=J_.filter(T=>T!==e).map(T=>`--known-validator ${T} \\`).join(`
5867
+ `);return`#!/bin/bash
5868
+ exec agave-validator \\
5869
+ --identity ${U} \\
5870
+ --vote-account ${F_} \\
5871
+ --authorized-voter ${u} \\
5872
+ --log ${V} \\
5873
+ --accounts ${_.ACCOUNTS_PATH} \\
5874
+ --ledger ${_.LEDGER_PATH} \\
5875
+ --snapshots ${_.SNAPSHOTS_PATH} \\
5876
+ --entrypoint entrypoint.testnet.solana.com:8001 \\
5877
+ --entrypoint entrypoint2.testnet.solana.com:8001 \\
5878
+ --entrypoint entrypoint3.testnet.solana.com:8001 \\
5879
+ ${i}
5880
+ --only-known-rpc \\
5881
+ --rpc-bind-address 0.0.0.0 \\
5882
+ --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
5883
+ --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5884
+ --dynamic-port-range 8000-8025 \\
5885
+ --rpc-port 8899 \\
5886
+ --wal-recovery-mode skip_any_corrupted_record \\
5887
+ --expected-shred-version 41708 \\
5888
+ --limit-ledger-size 50000000 \\
5889
+ --block-production-method central-scheduler-greedy \\
5890
+ --block-verification-method unified-scheduler \\
5891
+ --maximum-full-snapshots-to-retain 1 \\
5892
+ --maximum-incremental-snapshots-to-retain 2 \\
5893
+ `},"startTestnetAgaveValidatorScript");var EE=t((_=1e4,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),S=J_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
5941
5894
  `);return`#!/bin/bash
5942
5895
  exec ${n} \\
5943
5896
  --identity ${U} \\
5944
- --vote-account ${w_} \\
5945
- --authorized-voter ${g} \\
5946
- --log ${w} \\
5897
+ --vote-account ${F_} \\
5898
+ --authorized-voter ${u} \\
5899
+ --log ${V} \\
5947
5900
  --accounts ${i.ACCOUNTS_PATH} \\
5948
5901
  --ledger ${i.LEDGER_PATH} \\
5949
5902
  --snapshots ${i.SNAPSHOTS_PATH} \\
5950
5903
  --entrypoint entrypoint.testnet.solana.com:8001 \\
5951
5904
  --entrypoint entrypoint2.testnet.solana.com:8001 \\
5952
5905
  --entrypoint entrypoint3.testnet.solana.com:8001 \\
5953
- ${r}
5906
+ ${S}
5954
5907
  --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\
5955
5908
  --tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\
5956
5909
  --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
@@ -5969,77 +5922,55 @@ ${r}
5969
5922
  --expected-shred-version 41708 \\
5970
5923
  --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
5971
5924
  --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5972
- `},"startJitoTestnetScript");var Ho=t((_,e="agave-validator")=>{let{validatorKeyAddress:E}=j(_),n=Y_.filter(s=>s!==E).map(s=>`--known-validator ${s} \\`).join(`
5925
+ `},"startJitoTestnetScript");var tE=t((_=1e4,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(`
5973
5926
  `);return`#!/bin/bash
5974
- exec ${e} \\
5975
- --identity ${U} \\
5976
- --vote-account ${b_} \\
5977
- --authorized-voter ${b} \\
5978
- --log ${w} \\
5979
- --accounts ${_.ACCOUNTS_PATH} \\
5980
- --ledger ${_.LEDGER_PATH} \\
5981
- --snapshots ${_.SNAPSHOTS_PATH} \\
5982
- --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
5983
- --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
5984
- --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
5985
- --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
5986
- --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
5987
- ${n}
5988
- --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
5989
- --expected-shred-version 50093 \\
5990
- --dynamic-port-range 8000-8025 \\
5991
- --rpc-bind-address 127.0.0.1 \\
5992
- --rpc-port 8899 \\
5993
- --wal-recovery-mode skip_any_corrupted_record \\
5994
- --use-snapshot-archives-at-startup when-newest \\
5995
- --limit-ledger-size 50000000 \\
5996
- --block-production-method central-scheduler-greedy \\
5997
- --block-verification-method unified-scheduler \\
5998
- --snapshot-interval-slots 0 \\
5999
- --private-rpc \\
6000
- `},"startMainnetValidatorScript");var xE=t(_=>{let{validatorKeyAddress:e}=j(_),i=H_.filter(T=>T!==e).map(T=>`--known-validator ${T} \\`).join(`
6001
- `);return`#!/bin/bash
6002
- exec agave-validator \\
5927
+ exec ${T} \\
6003
5928
  --identity ${U} \\
6004
- --vote-account ${w_} \\
6005
- --authorized-voter ${g} \\
6006
- --log ${w} \\
6007
- --accounts ${_.ACCOUNTS_PATH} \\
6008
- --ledger ${_.LEDGER_PATH} \\
6009
- --snapshots ${_.SNAPSHOTS_PATH} \\
5929
+ --vote-account ${F_} \\
5930
+ --authorized-voter ${u} \\
5931
+ --log ${V} \\
5932
+ --accounts ${n.ACCOUNTS_PATH} \\
5933
+ --ledger ${n.LEDGER_PATH} \\
5934
+ --snapshots ${n.SNAPSHOTS_PATH} \\
6010
5935
  --entrypoint entrypoint.testnet.solana.com:8001 \\
6011
5936
  --entrypoint entrypoint2.testnet.solana.com:8001 \\
6012
5937
  --entrypoint entrypoint3.testnet.solana.com:8001 \\
6013
- ${i}
6014
- --only-known-rpc \\
5938
+ ${a}
5939
+ --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\
5940
+ --tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\
5941
+ --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
5942
+ --commission-bps ${_} \\
6015
5943
  --rpc-bind-address 0.0.0.0 \\
6016
- --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
6017
- --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5944
+ --block-engine-url ${E} \\
5945
+ --shred-receiver-address ${o} \\
5946
+ --bam-url ${i} \\
6018
5947
  --dynamic-port-range 8000-8025 \\
6019
5948
  --rpc-port 8899 \\
6020
5949
  --wal-recovery-mode skip_any_corrupted_record \\
6021
- --expected-shred-version 41708 \\
6022
5950
  --limit-ledger-size 50000000 \\
6023
5951
  --block-production-method central-scheduler-greedy \\
6024
5952
  --block-verification-method unified-scheduler \\
6025
5953
  --maximum-full-snapshots-to-retain 1 \\
6026
5954
  --maximum-incremental-snapshots-to-retain 2 \\
6027
- `},"startTestnetAgaveValidatorScript");import{writeFile as jo}from"fs/promises";var Yo=t((_=0,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=Y_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
5955
+ --expected-shred-version 41708 \\
5956
+ --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
5957
+ --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
5958
+ `},"startBamTestnetScript");import{writeFile as er}from"node:fs/promises";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"},Ie={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 $s}from"@skeet-framework/utils";import{readFile as Ws,writeFile as ho}from"fs/promises";import{homedir as Xs}from"os";import js from"path";var Q=t(async()=>{let _=Xs(),e=js.join(_,r_.JITO_CONFIG);await $s(e)||(await ho(e,JSON.stringify(k_,null,2)),console.log(`Created jito config file at ${e}`));let E;try{E=JSON.parse(await Ws(e,"utf-8"))}catch(o){console.log(`readOrCreateJitoConfig - ${o}`),await ho(e,JSON.stringify(k_,null,2)),E=k_}return E},"readOrCreateJitoConfig");var oE=t((_=0,e,E,o,i,n="agave-validator")=>{let{validatorKeyAddress:T}=j(i),S=x_.filter(R=>R!==T).map(R=>`--known-validator ${R} \\`).join(`
6028
5959
  `);return`#!/bin/bash
6029
- exec ${T} \\
5960
+ exec ${n} \\
6030
5961
  --identity ${U} \\
6031
- --vote-account ${b_} \\
6032
- --authorized-voter ${b} \\
6033
- --log ${w} \\
6034
- --accounts ${n.ACCOUNTS_PATH} \\
6035
- --ledger ${n.LEDGER_PATH} \\
6036
- --snapshots ${n.SNAPSHOTS_PATH} \\
5962
+ --vote-account ${Y_} \\
5963
+ --authorized-voter ${w} \\
5964
+ --log ${V} \\
5965
+ --accounts ${i.ACCOUNTS_PATH} \\
5966
+ --ledger ${i.LEDGER_PATH} \\
5967
+ --snapshots ${i.SNAPSHOTS_PATH} \\
6037
5968
  --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
6038
5969
  --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
6039
5970
  --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
6040
5971
  --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
6041
5972
  --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
6042
- ${a}
5973
+ ${S}
6043
5974
  --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
6044
5975
  --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
6045
5976
  --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
@@ -6048,7 +5979,6 @@ ${a}
6048
5979
  --rpc-bind-address 127.0.0.1 \\
6049
5980
  --block-engine-url ${E} \\
6050
5981
  --shred-receiver-address ${o} \\
6051
- --bam-url ${i} \\
6052
5982
  --dynamic-port-range 8000-8025 \\
6053
5983
  --rpc-port 8899 \\
6054
5984
  --wal-recovery-mode skip_any_corrupted_record \\
@@ -6058,25 +5988,28 @@ ${a}
6058
5988
  --snapshot-interval-slots 0 \\
6059
5989
  --private-rpc \\
6060
5990
  --full-rpc-api \\
6061
- `},"startBamMainnetScript");import{spawnSync as z}from"child_process";var QE=t((_,e=!1,E=!1)=>{E?e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):(z(`mkdir /tmp/${_}`,{shell:!0,stdio:"inherit"}),z(`cd /tmp/${_}`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} clone https://github.com/jito-labs/bam-client.git --recurse-submodules .`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} checkout ${_}`,{shell:!0,stdio:"inherit"}),z(`git -C /tmp/${_} submodule update --init --recursive`,{shell:!0,stdio:"inherit"}),z(`CI_COMMIT=$(git -C /tmp/${_} rev-parse HEAD) /tmp/${_}/scripts/cargo-install-all.sh /home/solv/.local/share/solana/install/releases/${_}`,{shell:!0,stdio:"inherit"}),z("sudo rm -rf /home/solv/.local/share/solana/install/active_release",{shell:!0,stdio:"inherit"}),z(`sudo ln -sfn /home/solv/.local/share/solana/install/releases/${_} /home/solv/.local/share/solana/install/active_release`,{shell:!0,stdio:"inherit"}),z(`sudo rm -rf /tmp/${_}`,{shell:!0,stdio:"inherit"}),z("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})):e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-bam/${_}/installer)"`,{shell:!0,stdio:"inherit"}):z(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installBam");var Jo=t((_=1e4,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=H_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
5991
+ `},"startJitoMainnetScript");var iE=t((_=0,e,E,o,i,n,T="agave-validator")=>{let{validatorKeyAddress:s}=j(n),a=x_.filter(c=>c!==s).map(c=>`--known-validator ${c} \\`).join(`
6062
5992
  `);return`#!/bin/bash
6063
5993
  exec ${T} \\
6064
5994
  --identity ${U} \\
6065
- --vote-account ${w_} \\
6066
- --authorized-voter ${g} \\
6067
- --log ${w} \\
5995
+ --vote-account ${Y_} \\
5996
+ --authorized-voter ${w} \\
5997
+ --log ${V} \\
6068
5998
  --accounts ${n.ACCOUNTS_PATH} \\
6069
5999
  --ledger ${n.LEDGER_PATH} \\
6070
6000
  --snapshots ${n.SNAPSHOTS_PATH} \\
6071
- --entrypoint entrypoint.testnet.solana.com:8001 \\
6072
- --entrypoint entrypoint2.testnet.solana.com:8001 \\
6073
- --entrypoint entrypoint3.testnet.solana.com:8001 \\
6001
+ --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
6002
+ --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
6003
+ --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
6004
+ --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
6005
+ --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
6074
6006
  ${a}
6075
- --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \\
6076
- --tip-distribution-program-pubkey F2Zu7QZiTYUhPd7u9ukRVwxh7B71oA3NMJcHuCHc29P2 \\
6007
+ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
6008
+ --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
6009
+ --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
6077
6010
  --merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
6078
6011
  --commission-bps ${_} \\
6079
- --rpc-bind-address 0.0.0.0 \\
6012
+ --rpc-bind-address 127.0.0.1 \\
6080
6013
  --block-engine-url ${E} \\
6081
6014
  --shred-receiver-address ${o} \\
6082
6015
  --bam-url ${i} \\
@@ -6086,16 +6019,110 @@ ${a}
6086
6019
  --limit-ledger-size 50000000 \\
6087
6020
  --block-production-method central-scheduler-greedy \\
6088
6021
  --block-verification-method unified-scheduler \\
6089
- --maximum-full-snapshots-to-retain 1 \\
6090
- --maximum-incremental-snapshots-to-retain 2 \\
6091
- --expected-shred-version 41708 \\
6092
- --expected-bank-hash 4NuNyboT36pwwGJvMPZLreFqYpkbpBjX82nkt4AkJ9QT \\
6093
- --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \\
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
6022
+ --snapshot-interval-slots 0 \\
6023
+ --private-rpc \\
6024
+ --full-rpc-api \\
6025
+ `},"startBamMainnetScript");import{spawnSync as zs}from"node:child_process";var Zs=t(()=>{let _=`sudo chmod +x ${i_}`;zs(_,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),V_=Zs;var go=t(_=>{let e=_.NETWORK===O.TESTNET,E=_.NODE_TYPE===D.RPC,o=_.VALIDATOR_TYPE===F.JITO,i=_.VALIDATOR_TYPE===F.BAM,n=_.VALIDATOR_TYPE===F.FRANKENDANCER,T=_.AUTO_RESTART,s=_.MOD,r=10;T&&!e&&(r=30);let S=e?s_:e_;o&&(S=B_,e&&(S=Ce)),i&&(S=ce,e&&(S=JE)),n&&(S=D_,e&&(S=q_)),E&&(S=y_,o&&(S=Gt)),I.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).option("--startup","Start up Script",!1).action(async a=>{let R=$_(),c=e?_.TESTNET_DELINQUENT_STAKE:_.MAINNET_DELINQUENT_STAKE;if(console.log(Bo.white(`Current solv version: ${R}`)),a.auto){await co(_);return}if(a.migrateConfig){let C=Ao().config,l=X.TRIPLE;C.DISK_TYPES===0?l=X.DOUBLE:C.DISK_TYPES===1?l=X.SINGLE:l=X.TRIPLE;let d=C.SOLANA_NETWORK===P_.TESTNET,N=C.SOLV_TYPE===He.RPC_NODE,A=C.MAINNET_TYPE===Ye.JITO_MEV,P={NETWORK:d?O.TESTNET:O.MAINNET,NODE_TYPE:N?D.RPC:D.VALIDATOR,MNT_DISK_TYPE:l,RPC_TYPE:N?v.JITO:v.NONE,VALIDATOR_TYPE:A?F.JITO:d?F.AGAVE:F.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 h(P)}if(a.config){if(await h({TESTNET_SOLANA_VERSION:s_,MAINNET_SOLANA_VERSION:e_}),o){let C=e?Ce:B_;await G_({version:C,tag:`v${C}`})}if(i){let C=e?JE:ce;await G_({version:C,tag:`v${C}`})}console.log(Bo.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 To();return}if(a.startup){let C=_.VALIDATOR_TYPE,l="";switch(C){case F.SOLANA:l=e?Mo():le(_);break;case F.AGAVE:l=e?Fe(_):le(_);break;case F.JITO:let d=await Q();l=e?EE(d.commissionBps,d.relayerUrl,d.blockEngineUrl,d.shredReceiverAddr,_):oE(d.commissionBps,d.relayerUrl,d.blockEngineUrl,d.shredReceiverAddr,_);break;case F.BAM:let N=await Q();l=e?tE(N.commissionBps,N.relayerUrl,N.blockEngineUrl,N.shredReceiverAddr,N.bamUrl,_):iE(N.commissionBps,N.relayerUrl,N.blockEngineUrl,N.shredReceiverAddr,N.bamUrl,_);break;default:console.log("Unknown Validator Type for Update Script");break}await er(i_,l,"utf-8"),V_();return}if(a.background){let C=a.version,l=!!C.startsWith("3");if(await h({TESTNET_SOLANA_VERSION:s_,MAINNET_SOLANA_VERSION:e_}),o){let N=d_,A=`v${C}-jito`,P=`v${C}-mod`,L=a.mod||s?`${P}${N}`:`${A}${N}`;Qe(L,a.mod||s,l),await G_({version:C,tag:`v${C}`}),await de(c,!0,r);return}if(i){let N=g_,A=`v${C}-bam`,P=`v${C}-mod`,L=a.mod||s?`${P}${N}`:`${A}${N}`;eE(L,a.mod||s,l),await G_({version:C,tag:`v${C}`}),await de(c,!0,r);return}if(n){await _E(_,C,a.mod||s),await de(c,!0,r);return}await ve(C,a.mod||s,l);let d=e?10:5;e&&_r("solv start",{stdio:"inherit",shell:!0}),await de(d,!0,r);return}else if(a.commission){let C=await no();io(C.commission,e)}else to()})},"updateCommands");import{spawnSync as Er}from"node:child_process";var yo=t(_=>{try{let{log:e}=f_(),E=`tail -f ${e}`;_.error?E+=" | grep '\\(WARN\\|ERR\\)'":_.info?E+=" | grep INFO":_.warning&&(E+=" | grep WARN"),console.log(E);let o=Er(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 Ko=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(_=>{yo(_)})},"logCommands");import O_ from"chalk";import{spawnSync as tr}from"child_process";import{homedir as or}from"os";var nE=t(_=>{let e=or(),E=p(e),o=E.testnetValidatorVoteKey,i=E.testnetValidatorKey,n=E.testnetValidatorAuthorityKey,T=P_.TESTNET,s=_.COMMISSION;_.NETWORK===O.MAINNET&&(o=E.mainnetValidatorVoteKey,i=E.mainnetValidatorKey,n=E.mainnetValidatorAuthorityKey,T=P_.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${s} - ${T}`);let r=_.RPC_URL||T;_.NETWORK===O.TESTNET&&(r=P_.TESTNET);let S=`solana create-vote-account ${o} ${i} ${n} --commission ${s} --url ${r} --keypair ${i}`;tr(S,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as TE}from"child_process";import{existsSync as Go,readdirSync as ir,rmSync as nr}from"fs";import{homedir as Tr}from"os";import ko from"path";var sE=t(_=>{let e=[],E=0;_.NODE_TYPE===D.RPC&&(e=[y.MAINNET_VALIDATOR_KEY],E=1),_.NETWORK===O.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}`;TE(o,{shell:!0,stdio:"ignore"});let i=ir("./").filter(r=>r.endsWith("SV.json")),n=Tr(),T=ko.join(n,"unstaked-identity.json");Go(T)&&TE(`mv ${T} ${n}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let s=0;for(let r of i){let S=ko.join(n,e[s]);if(s++,Go(S)){console.log(`${S} is already exist!`),nr(r,{recursive:!0});continue}let a=`mv ${r} ${S}`;TE(a,{shell:!0,stdio:"inherit"})}TE("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 bo}from"child_process";var sr=t((_,e,E,o=2001)=>{let i="/etc/systemd/system/jupiter-api.service",n=`[Unit]
6026
+ Description=Jupiter API Service Instance
6027
+ After=network.target
6028
+
6029
+ [Service]
6030
+ Type=simple
6031
+ ExecStart=/home/solv/jupiter-swap-api --rpc-url ${_} --yellowstone-grpc-endpoint ${e} --yellowstone-grpc-x-token "${E}" --port ${o}
6032
+ WorkingDirectory=/home/solv
6033
+ Restart=always
6034
+ User=solv
6035
+ Environment=NODE_ENV=production
6036
+ Environment=RUST_LOG=info
6037
+ 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
6038
+
6039
+ [Install]
6040
+ WantedBy=multi-user.target`;return{filePath:i,body:n}},"jupiterAPIService"),Vo=sr;import rr from"inquirer";import Sr from"chalk";var ar=t(async()=>{let _=await rr.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"}]);bo(`sudo apt-get install unzip wget -y
6041
+ wget https://github.com/jup-ag/jupiter-swap-api/releases/download/v6.0.25/jupiter-swap-api-x86_64-unknown-linux-gnu.zip
6042
+ unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
6043
+ chmod +x jupiter-swap-api
6044
+ rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:E,body:o}=Vo(_.rpcUrl,_.grpcUrl,_.grpcToken);bo(`echo '${o}' | sudo tee ${E}`,{shell:!0,stdio:"inherit"}),console.log(Sr.white(`\u{1F7E2} Jupiter Swap API Setup Completed
6045
+
6046
+ $ solv jupiter --help`))},"jupiterAPISetup"),wo=ar;import{spawnSync as Rr}from"child_process";var De=t(()=>{Rr("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import Pe from"chalk";import rE from"inquirer";import Cr from"inquirer";var vo=t(async _=>{let E=Object.keys(_?Ie.TESTNET:Ie.MAINNET),o=_?Ie.TESTNET:Ie.MAINNET,i=await Cr.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 cr=t(async()=>{try{let _=F.NONE,e=v.AGAVE,E=N_.COMMISSION,o=!1,i=await rE.prompt([{name:"network",type:"list",message:"Choose Network",choices:so,default:O.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:ro,default:D.RPC}]),n=i.network===O.TESTNET;if(i.nodeType===D.VALIDATOR){let r=i.network===O.MAINNET?[F.JITO,F.SOLANA]:[F.AGAVE,F.JITO,F.FRANKENDANCER,F.BAM];_=await rE.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:r,default:F.AGAVE}).then(S=>S.validatorType),e=v.NONE}if(i.nodeType===D.RPC&&(e=await rE.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:So,default:v.AGAVE}).then(r=>r.rpcType)),i.nodeType===D.VALIDATOR){let r=await rE.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=r.commission,o=r.isDummy,_===F.JITO||_===F.FRANKENDANCER||_===F.BAM){await Q();let S=await vo(n);await G_(S)}}let{network:T,nodeType:s}=i;return console.log(Pe.white("Network:",T)),console.log(Pe.white("Node Type:",s)),console.log(Pe.white("Validator Type:",_)),console.log(Pe.white("RPC Type:",e)),s===D.VALIDATOR&&console.log(Pe.white("Commission:",E)),await h({NETWORK:T,NODE_TYPE:s,VALIDATOR_TYPE:_,RPC_TYPE:e,COMMISSION:E,IS_DUMMY:o}),!0}catch(_){throw new Error(_)}},"initialConfigSetup"),Ho=cr;import{spawnSync as z}from"child_process";var fe=t((_=B_,e=!1,E=!1)=>{E?e?z(`sh -c "$(curl --netrc-optional -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${_}/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-foundation/jito-solana.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-solana/${_}/installer)"`,{shell:!0,stdio:"inherit"}):z(`sh -c "$(curl --netrc-optional -sSfL https://release.jito.wtf/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installJito");var Yo=t(()=>`#!/bin/bash
6047
+ exec agave-validator \\
6048
+ --identity ${U} \\
6049
+ --log ${V} \\
6050
+ --accounts ${I_} \\
6051
+ --ledger ${f} \\
6052
+ --snapshots ${n_} \\
6053
+ --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
6054
+ --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
6055
+ --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
6056
+ --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
6057
+ --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
6058
+ --known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\
6059
+ --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
6060
+ --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
6061
+ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
6062
+ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
6063
+ --expected-shred-version 50093 \\
6064
+ --only-known-rpc \\
6065
+ --full-rpc-api \\
6066
+ --no-voting \\
6067
+ --private-rpc \\
6068
+ --enable-cpi-and-log-storage \\
6069
+ --no-skip-initial-accounts-db-clean \\
6070
+ --dynamic-port-range 8000-8025 \\
6071
+ --rpc-bind-address 127.0.0.1 \\
6072
+ --rpc-port 8899 \\
6073
+ --no-port-check \\
6074
+ --account-index program-id spl-token-mint spl-token-owner \\
6075
+ --enable-rpc-transaction-history \\
6076
+ --rpc-pubsub-enable-block-subscription \\
6077
+ --rpc-pubsub-enable-vote-subscription \\
6078
+ --no-wait-for-vote-to-start-leader \\
6079
+ --account-index-include-key Stake11111111111111111111111111111111111111 \\
6080
+ --account-index-include-key Config1111111111111111111111111111111111111 \\
6081
+ --account-index-include-key AddressLookupTab1e1111111111111111111111111 \\
6082
+ --wal-recovery-mode skip_any_corrupted_record \\
6083
+ --use-snapshot-archives-at-startup when-newest \\
6084
+ --limit-ledger-size 400000000 \\
6085
+ `,"startJitoRPCScript");import{existsAsync as dr}from"@skeet-framework/utils";import{writeFile as Nr}from"fs/promises";var Jo=t(()=>`#!/bin/bash
6086
+ exec agave-validator \\
6087
+ --identity ${U} \\
6088
+ --log ${V} \\
6089
+ --accounts ${I_} \\
6090
+ --ledger ${f} \\
6091
+ --snapshots ${n_} \\
6092
+ --entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
6093
+ --entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
6094
+ --entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
6095
+ --entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
6096
+ --entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
6097
+ --known-validator Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24 \\
6098
+ --known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
6099
+ --known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
6100
+ --known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
6101
+ --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
6102
+ --expected-shred-version 50093 \\
6103
+ --only-known-rpc \\
6104
+ --full-rpc-api \\
6105
+ --no-voting \\
6106
+ --private-rpc \\
6107
+ --enable-cpi-and-log-storage \\
6108
+ --no-skip-initial-accounts-db-clean \\
6109
+ --dynamic-port-range 8000-8025 \\
6110
+ --rpc-bind-address 127.0.0.1 \\
6111
+ --rpc-port 8899 \\
6112
+ --no-port-check \\
6113
+ --account-index program-id spl-token-mint spl-token-owner \\
6114
+ --enable-rpc-transaction-history \\
6115
+ --rpc-pubsub-enable-block-subscription \\
6116
+ --rpc-pubsub-enable-vote-subscription \\
6117
+ --no-wait-for-vote-to-start-leader \\
6118
+ --wal-recovery-mode skip_any_corrupted_record \\
6119
+ --use-snapshot-archives-at-startup when-newest \\
6120
+ --limit-ledger-size 400000000 \\
6121
+ `,"startRPCNodeScript");var Or=t(async _=>{let e=_.RPC_TYPE,E="";switch(e){case v.AGAVE:console.log("Agave RPC Node Setup"),Q_(_.TESTNET_SOLANA_VERSION),E=Jo();break;case v.JITO:console.log("JITO RPC Node Setup");let o=d_,n=`${`v${Ce}-jito`}${o}`;fe(n),E=Yo();break;default:console.log("Unknown RPC Node Setup");break}if(await dr(i_)){console.log("Startup script already exists. Skipping...");return}await Nr(i_,E,"utf-8"),V_()},"setupRpcNode"),xo=Or;import{spawnSync as lr}from"node:child_process";var Fr=t(_=>{lr(`sh -c "$(curl --netrc-optional -sSfL https://release.solana.com/${_}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),XE=Fr;import{writeFile as zo}from"fs/promises";import{spawnSync as Z}from"child_process";var jE=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");import{spawnSync as B}from"child_process";import{promises as ZE}from"fs";import Ur from"path";var Ir=t(()=>({filePath:"/home/solv/start-firedancer.sh",body:`#!/usr/bin/env bash
6095
6122
  sudo chmod -R 755 /mnt
6096
6123
  sudo fdctl configure init all --config /home/solv/firedancer/config.toml
6097
6124
  sudo chown -R solv:solv /mnt
6098
- sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),xo=lS;var FS=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6125
+ sudo fdctl run --config /home/solv/firedancer/config.toml`}),"startFiredancerScript"),Qo=Ir;var Dr=t(()=>({filePath:"/etc/systemd/system/frankendancer.service",body:`[Unit]
6099
6126
  Description=Firedancer Solana
6100
6127
  After=network.target
6101
6128
  StartLimitIntervalSec=0
@@ -6111,7 +6138,7 @@ ExecStart=/home/solv/start-firedancer.sh
6111
6138
 
6112
6139
  [Install]
6113
6140
  WantedBy=multi-user.target
6114
- `}),"firedancerService"),Qo=FS;var IS=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6141
+ `}),"firedancerService"),qo=Dr;var Pr=t((_,e)=>{let E="/home/solv/firedancer/config.toml",o=`name = "fd1"
6115
6142
  user = "solv"
6116
6143
 
6117
6144
  [log]
@@ -6278,7 +6305,7 @@ user = "solv"
6278
6305
  commission_bps = 10000
6279
6306
 
6280
6307
  [tiles.pack]
6281
- schedule_strategy = "balanced"`:o}},"configToml"),qo=IS;var DS=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6308
+ schedule_strategy = "balanced"`:o}},"configToml"),$o=Pr;var fr=t(()=>({filePath:"/etc/systemd/system/port-relay.service",body:`[Unit]
6282
6309
  Description=Relay port 9600 to localhost:80
6283
6310
  After=network.target
6284
6311
 
@@ -6288,7 +6315,7 @@ Restart=always
6288
6315
 
6289
6316
  [Install]
6290
6317
  WantedBy=multi-user.target
6291
- `}),"portRelayService"),$o=DS;var qE=t((_=$.USERNAME,e)=>{let{log:E}=D_(),o=e?"frankendancer":"agave",i=`${E} {
6318
+ `}),"portRelayService"),Wo=fr;var zE=t((_=W.USERNAME,e)=>{let{log:E}=f_(),o=e?"frankendancer":"agave",i=`${E} {
6292
6319
  su ${_} ${_}
6293
6320
  daily
6294
6321
  rotate 1
@@ -6320,14 +6347,14 @@ WantedBy=multi-user.target
6320
6347
  compress
6321
6348
  copytruncate
6322
6349
  }
6323
- `),i)},"logRotates");import{existsSync as Wo}from"fs";import{execSync as Xo}from"child_process";function $_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&Wo(B.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!Wo(B.SOL_LOGROTATE)){let e=qE("solv",_);Xo(`echo "${e}" | sudo tee ${B.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=qE("solv",_);Xo(`echo "${e}" | sudo tee ${B.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t($_,"setupLogrotate");var fS=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===d.TESTNET),o=E?x_:F_,{filePath:i,body:n}=Xe();_?(h('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),h('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),h("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),h(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await $E.mkdir(PS.dirname(i),{recursive:!0}),await $E.writeFile(i,n,"utf8"),h(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),h(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(h("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),h(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),h("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),h("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await t_(),{filePath:s,body:S}=xo();h(`echo "${S}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),h(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let r=Qo();h(`echo "${r.body}" | sudo tee ${r.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=$o();h("sudo apt install socat",{shell:!0,stdio:"inherit"}),h("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),h(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),h("sudo systemctl daemon-reload",{shell:!0});let R=qo(E,T);await $E.writeFile(R.filePath,R.body,"utf-8"),console.log(`config.toml written to ${R.filePath}`),h(`sudo chown solv:solv "${R.filePath}"`,{shell:!0,stdio:"inherit"}),$_(!0)},"setupFiredancer"),De=fS;var US=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===d.MAINNET?(console.log("Mainnet Validator Node Setup"),await AS(_,e)):E===d.TESTNET?(console.log("Testnet Validator Node Setup"),await LS(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),AS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MAINNET_SOLANA_VERSION:o,MOD:i}=_;e=i;let n="",T=!!o.startsWith("3");switch(E){case l.SOLANA:let s=re,r=`${`v${o}`}${s}`;JE(r),n=Ho(_);break;case l.JITO:console.log("JITO Validator Setup for Mainnet");let a=await t_(),R=m_,c=`v${o}-jito`,C=`v${o}-mod`,I=e?`${C}${R}`:`${c}${R}`;Fe(I,e,T),n=wo(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,_);break;case l.BAM:console.log("JITO Validator Setup for Mainnet");let N=await t_(),O=Re,A=`v${o}-bam`,P=`v${o}-mod`,L=e?`${P}${O}`:`${A}${O}`;QE(L,e,T),n=Yo(N.commissionBps,N.relayerUrl,N.blockEngineUrl,N.shredReceiverAddr,N.bamUrl,_);break;case l.FRANKENDANCER:await De(e,_);break;default:console.log("Unknown Validator Type for Mainnet");break}await jo(O_,n,"utf-8"),Ie()},"setupMainnetValidator"),LS=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o,TESTNET_SOLANA_VERSION:i}=_;e=o;let n="",T=!!i.startsWith("3"),s=re,r=`${`v${i}`}${s}`,a=m_,R=`v${i}-jito`,c=`v${i}-mod`,C=e?`${c}${a}`:`${R}${a}`,I=Re,N=`v${i}-bam`,O=`v${i}-mod`,A=e?`${O}${I}`:`${N}${I}`;switch(E){case l.SOLANA:JE(r),n=xE(_);case l.AGAVE:console.log("Agave Validator Setup for Testnet"),J_(r,e,T),n=xE(_);break;case l.JITO:console.log("JITO Validator Setup for Testnet");let P=await t_();Fe(C,e,T),n=vo(P.commissionBps,P.relayerUrl,P.blockEngineUrl,P.shredReceiverAddr,_);break;case l.BAM:console.log("BAM Validator Setup for Mainnet");let L=await t_();QE(A,e,T),n=Jo(L.commissionBps,L.relayerUrl,L.blockEngineUrl,L.shredReceiverAddr,L.bamUrl,_);break;case l.FRANKENDANCER:console.log("FRANKENDANCER Validator Setup for Mainnet"),await De(e,_);break;default:console.log("Unknown Validator Type for Testnet");break}await jo(O_,n,"utf-8"),Ie()},"setupTestnetValidator"),zo=US;import zE from"chalk";import{execSync as Zo}from"node:child_process";function _i(_){try{Zo(`test -d ${_}`),console.log(`${_} already exists.`)}catch{Zo(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(_i,"createDirectoryIfNotExists");var ei=t(()=>{try{let _=[M.ACCOUNTS,M.LEDGER,M.SNAPSHOTS];for(let e of _)_i(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as MS}from"child_process";function uS(){let e=MS("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6324
- `).slice(1),E=[],o=e.map(N=>N.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,S="";for(let N of e){let[O,A,P]=N.trim().split(/\s+/);if(!O||!A)continue;let L=parseInt(A,10);if(isNaN(L))continue;let R_=P!==void 0&&P!=="";P==="/"&&(S=O.replace(/p?\d*$/,""));let M_=o.some(se=>se!==O&&se.startsWith(O)),Te=O.startsWith("nvme")?"NVMe":"SATA";L>=400*1024*1024*1024&&E.push({name:O,size:L,mountpoint:P||"",isMounted:R_,hasPartition:M_,type:Te})}console.log("Found root disk name: ",S);let r=o.filter(N=>N.startsWith(S));r.forEach(N=>console.log("Found root disk partition: ",N));let R=E.filter(N=>!r.includes(N.name)).sort((N,O)=>O.size-N.size),c=R.filter(N=>N.type==="NVMe").sort((N,O)=>O.size-N.size),C=R.filter(N=>N.type==="SATA").sort((N,O)=>O.size-N.size),I=[...c,...C];if(I.length>0){let N=I[0];if(N.size>=850*1024*1024*1024&&!N.isMounted&&(i=!0),N.size>=1250*1024*1024*1024&&N.isMounted&&(T=!0),I.length>1){let O=I[1];O.size>=400*1024*1024*1024&&!O.isMounted&&(n=!0)}if(I.length>2){let O=I[2];O.size>=400*1024*1024*1024&&!O.isMounted&&(s=!0)}}return I.forEach((N,O)=>console.log(`Prioritized Disk ${O+1}: ${N.name} ${N.size}`)),{disks:I,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(uS,"getPreferredDisks");var Pe=uS;import{spawnSync as W_}from"child_process";var f_=t(_=>{if(W_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return W_("sudo udevadm trigger --action=change",{shell:!0}),W_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return W_(E,{shell:!0,stdio:"inherit"}),W_("sudo udevadm trigger --action=change",{shell:!0}),W_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as tE}from"child_process";async function WE(_){for(let e=1;e<=5;e++){let o=tE(`sudo blkid -s UUID -o value ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim();if(o)return console.log(`[SUCCESS] Found UUID for ${_}: ${o}`),`UUID=${o}`;console.warn(`[WARN] Attempt ${e}: Failed to get UUID for ${_}`),await J(5e3)}return console.error(`[ERROR] Giving up: No UUID for ${_}, using raw path`),_}t(WE,"getUUID");var fe=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await WE(_),T=await WE(e),s=await WE(E),S=`${n} ${M.ROOT} ext4 defaults 0 0`;o&&(S=`${n} ${M.LEDGER} ext4 defaults 0 0
6325
- ${T} ${M.ACCOUNTS} ext4 defaults 0 0`),i&&(S=`${n} ${M.LEDGER} ext4 defaults 0 0
6350
+ `),i)},"logRotates");import{existsSync as Xo}from"fs";import{execSync as jo}from"child_process";function X_(_=!1){if(console.log("Creating logrotate configuration for solana"),!_&&Xo(g.SOL_LOGROTATE)&&console.log("SOL_LOGROTATE_PATH already exists. Skipping logrotate configuration."),!_&&!Xo(g.SOL_LOGROTATE)){let e=zE("solv",_);jo(`echo "${e}" | sudo tee ${g.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}if(_){let e=zE("solv",_);jo(`echo "${e}" | sudo tee ${g.SOL_LOGROTATE} > /dev/null`),console.log("Logrotate configuration created.")}}t(X_,"setupLogrotate");var Ar=t(async(_=!1,e)=>{let E=!!(e&&e.NETWORK===O.TESTNET),o=E?q_:D_,{filePath:i,body:n}=Ze();_?(B('git -C /home/solv/firedancer config --global user.email "you@example.com"',{shell:!0,stdio:"inherit"}),B('git -C /home/solv/firedancer config --global user.name "Your Name"',{shell:!0,stdio:"inherit"}),B("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),B(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),await ZE.mkdir(Ur.dirname(i),{recursive:!0}),await ZE.writeFile(i,n,"utf8"),B(`sudo chown solv:solv "${i}"`,{shell:!0,stdio:"inherit"}),B(`git apply ${i}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),B("git add ./src/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),B("git add ./book/*",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),B('git commit -m "add mods"',{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})):(B("git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git",{shell:!0,stdio:"inherit"}),B(`git checkout v${o}`,{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),B("git submodule update --init --recursive",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"})),B("export FD_AUTO_INSTALL_PACKAGES=1 && ./deps.sh fetch check install",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),B("make -j fdctl solana",{shell:!0,stdio:"inherit",cwd:"/home/solv/firedancer"}),B("sudo ln -s /home/solv/firedancer/build/native/gcc/bin/fdctl /usr/local/bin/fdctl",{shell:!0,stdio:"inherit"});let T=await Q(),{filePath:s,body:r}=Qo();B(`echo "${r}" | sudo tee ${s} > /dev/null`,{shell:!0,stdio:"inherit"}),B(`sudo chmod +x ${s}`,{shell:!0,stdio:"inherit"});let S=qo();B(`echo "${S.body}" | sudo tee ${S.filePath} > /dev/null`,{shell:!0,stdio:"inherit"});let a=Wo();B("sudo apt install socat",{shell:!0,stdio:"inherit"}),B("sudo ufw allow 9600/tcp",{shell:!0,stdio:"inherit"}),B(`echo "${a.body}" | sudo tee ${a.filePath} > /dev/null`,{shell:!0,stdio:"inherit"}),B("sudo systemctl daemon-reload",{shell:!0});let R=$o(E,T);await ZE.writeFile(R.filePath,R.body,"utf-8"),console.log(`config.toml written to ${R.filePath}`),B(`sudo chown solv:solv "${R.filePath}"`,{shell:!0,stdio:"inherit"}),X_(!0)},"setupFiredancer"),Ue=Ar;var Lr=t(async(_,e=!1)=>{let{NETWORK:E,MOD:o}=_;e=o,E===O.MAINNET?(console.log("Mainnet Validator Node Setup"),await Mr(_,e)):E===O.TESTNET?(console.log("Testnet Validator Node Setup"),await pr(_,e)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Mr=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MAINNET_SOLANA_VERSION:o,MOD:i}=_;e=i;let n="",T=!!o.startsWith("3");switch(E){case F.SOLANA:let s=Re,S=`${`v${o}`}${s}`;XE(S),n=le(_);break;case F.JITO:console.log("JITO Validator Setup for Mainnet");let a=await Q(),R=d_,c=`v${o}-jito`,C=`v${o}-mod`,l=e?`${C}${R}`:`${c}${R}`;fe(l,e,T),n=oE(a.commissionBps,a.relayerUrl,a.blockEngineUrl,a.shredReceiverAddr,_);break;case F.BAM:console.log("JITO Validator Setup for Mainnet");let d=await Q(),N=g_,A=`v${o}-bam`,P=`v${o}-mod`,L=e?`${P}${N}`:`${A}${N}`;jE(L,e,T),n=iE(d.commissionBps,d.relayerUrl,d.blockEngineUrl,d.shredReceiverAddr,d.bamUrl,_);break;case F.FRANKENDANCER:await Ue(e,_);break;default:console.log("Unknown Validator Type for Mainnet");break}await zo(i_,n,"utf-8"),V_()},"setupMainnetValidator"),pr=t(async(_,e=!1)=>{let{VALIDATOR_TYPE:E,MOD:o,TESTNET_SOLANA_VERSION:i}=_;e=o;let n="",T=!!i.startsWith("3"),s=Re,S=`${`v${i}`}${s}`,a=d_,R=`v${i}-jito`,c=`v${i}-mod`,C=e?`${c}${a}`:`${R}${a}`,l=g_,d=`v${i}-bam`,N=`v${i}-mod`,A=e?`${N}${l}`:`${d}${l}`;switch(E){case F.SOLANA:XE(S),n=Fe(_);case F.AGAVE:console.log("Agave Validator Setup for Testnet"),Q_(S,e,T),n=Fe(_);break;case F.JITO:console.log("JITO Validator Setup for Testnet");let P=await Q();fe(C,e,T),n=EE(P.commissionBps,P.relayerUrl,P.blockEngineUrl,P.shredReceiverAddr,_);break;case F.BAM:console.log("BAM Validator Setup for Mainnet");let L=await Q();jE(A,e,T),n=tE(L.commissionBps,L.relayerUrl,L.blockEngineUrl,L.shredReceiverAddr,L.bamUrl,_);break;case F.FRANKENDANCER:console.log("FRANKENDANCER Validator Setup for Mainnet"),await Ue(e,_);break;default:console.log("Unknown Validator Type for Testnet");break}await zo(i_,n,"utf-8"),V_()},"setupTestnetValidator"),Zo=Lr;import tt from"chalk";import{execSync as _i}from"node:child_process";function ei(_){try{_i(`test -d ${_}`),console.log(`${_} already exists.`)}catch{_i(`sudo mkdir -p ${_}`),console.log(`${_} has been created.`)}}t(ei,"createDirectoryIfNotExists");var Ei=t(()=>{try{let _=[M.ACCOUNTS,M.LEDGER,M.SNAPSHOTS];for(let e of _)ei(e)}catch(_){throw new Error(`setupDirs Error: ${_}`)}},"setupDirs");import{execSync as ur}from"child_process";function mr(){let e=ur("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
6351
+ `).slice(1),E=[],o=e.map(d=>d.trim().split(/\s+/)[0]),i=!1,n=!1,T=!1,s=!1,r="";for(let d of e){let[N,A,P]=d.trim().split(/\s+/);if(!N||!A)continue;let L=parseInt(A,10);if(isNaN(L))continue;let C_=P!==void 0&&P!=="";P==="/"&&(r=N.replace(/p?\d*$/,""));let u_=o.some(Se=>Se!==N&&Se.startsWith(N)),re=N.startsWith("nvme")?"NVMe":"SATA";L>=400*1024*1024*1024&&E.push({name:N,size:L,mountpoint:P||"",isMounted:C_,hasPartition:u_,type:re})}console.log("Found root disk name: ",r);let S=o.filter(d=>d.startsWith(r));S.forEach(d=>console.log("Found root disk partition: ",d));let R=E.filter(d=>!S.includes(d.name)).sort((d,N)=>N.size-d.size),c=R.filter(d=>d.type==="NVMe").sort((d,N)=>N.size-d.size),C=R.filter(d=>d.type==="SATA").sort((d,N)=>N.size-d.size),l=[...c,...C];if(l.length>0){let d=l[0];if(d.size>=850*1024*1024*1024&&!d.isMounted&&(i=!0),d.size>=1250*1024*1024*1024&&d.isMounted&&(T=!0),l.length>1){let N=l[1];N.size>=400*1024*1024*1024&&!N.isMounted&&(n=!0)}if(l.length>2){let N=l[2];N.size>=400*1024*1024*1024&&!N.isMounted&&(s=!0)}}return l.forEach((d,N)=>console.log(`Prioritized Disk ${N+1}: ${d.name} ${d.size}`)),{disks:l,has850GB:i,has400GB:n,hasUsed1250GB:T,hasThirdDisk400GB:s}}t(mr,"getPreferredDisks");var Ae=mr;import{spawnSync as j_}from"child_process";var A_=t(_=>{if(j_(`sudo blkid ${_}`,{shell:!0,encoding:"utf8"}).stdout.trim())return j_("sudo udevadm trigger --action=change",{shell:!0}),j_("sudo udevadm settle",{shell:!0}),console.log(`${_} is already formatted.`),!1;{let E=`sudo mkfs.ext4 ${_}`;return j_(E,{shell:!0,stdio:"inherit"}),j_("sudo udevadm trigger --action=change",{shell:!0}),j_("sudo udevadm settle",{shell:!0}),console.log(`${_} has been formatted.`),!0}},"formatDisk");import{spawnSync as SE}from"child_process";async function _t(_){for(let e=1;e<=5;e++){let o=SE(`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(_t,"getUUID");var Le=t(async(_,e="",E="",o=!1,i=!1)=>{let n=await _t(_),T=await _t(e),s=await _t(E),r=`${n} ${M.ROOT} ext4 defaults 0 0`;o&&(r=`${n} ${M.LEDGER} ext4 defaults 0 0
6352
+ ${T} ${M.ACCOUNTS} ext4 defaults 0 0`),i&&(r=`${n} ${M.LEDGER} ext4 defaults 0 0
6326
6353
  ${T} ${M.ACCOUNTS} ext4 defaults 0 0
6327
- ${s} ${M.SNAPSHOTS} ext4 defaults 0 0`);let r=[S],R=tE("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,c=[];for(let C of r)R.includes(C)||(console.log(`[INFO] Line to add: ${C}`),c.push(C));if(c.length){console.log(`[INFO] Lines to add all: ${c}`);let C=`echo "${c.join(`
6328
- `)}" | sudo tee -a /etc/fstab`;tE(C,{shell:!0,encoding:"utf8"}),tE("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6354
+ ${s} ${M.SNAPSHOTS} ext4 defaults 0 0`);let S=[r],R=SE("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,c=[];for(let C of S)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(`
6355
+ `)}" | sudo tee -a /etc/fstab`;SE(C,{shell:!0,encoding:"utf8"}),SE("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
6329
6356
  ${c.join(`
6330
- `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as pS}from"child_process";var Ei=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=pS(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var mS=t(async()=>{let _=Pe(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await m({MNT_DISK_TYPE:W.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=f_(E),T=f_(o),s=f_(i),S=n?E:"",r=T?o:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await J(5e3),await fe(n?S:"",T?r:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await m({MNT_DISK_TYPE:W.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=f_(E),n=f_(o);await fe(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await m({MNT_DISK_TYPE:W.SINGLE}),e.includes("/mnt")){Ei(e);let E="/dev/"+_.disks[0].name;f_(E),await fe(E)}else{let E="/dev/"+_.disks[0].name;f_(E),await fe(E)}},"mountDirs"),ti=mS;import{spawnSync as hS}from"child_process";var oi=t(()=>{let _=[`sudo mkdir -p ${M.ROOT}`,`sudo chown -R solv:solv ${M.ROOT}`,`sudo chmod -R 755 ${M.ROOT}`,`sudo mkdir -p ${M.ACCOUNTS}`,`sudo chown -R solv:solv ${M.ACCOUNTS}`,`sudo chmod -R 755 ${M.ACCOUNTS}`,`sudo mkdir -p ${M.LEDGER}`,`sudo chown -R solv:solv ${M.LEDGER}`,`sudo chmod -R 755 ${M.LEDGER}`,`sudo mkdir -p ${M.SNAPSHOTS}`,`sudo chown -R solv:solv ${M.SNAPSHOTS}`,`sudo chmod -R 755 ${M.SNAPSHOTS}`];for(let e of _)hS(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as oE}from"child_process";import{existsSync as BS}from"fs";function ii(){if(!BS(B.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6357
+ `)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as hr}from"child_process";var ti=t(_=>{try{let e=`sudo umount ${_}`,{stderr:E}=hr(e,{shell:!0,stdio:"inherit"});return!E.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Br=t(async()=>{let _=Ae(),e=_.disks[0].mountpoint;if(_.has850GB&&_.has400GB&&_.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await h({MNT_DISK_TYPE:X.TRIPLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i="/dev/"+_.disks[2].name,n=A_(E),T=A_(o),s=A_(i),r=n?E:"",S=T?o:"",a=s?i:"";console.log("Waiting for formatting to finish..."),await J(5e3),await Le(n?r:"",T?S:"",s?a:"",!1,!0)}else if(_.has850GB&&_.has400GB){console.log("Setting up DOUBLE DISK..."),await h({MNT_DISK_TYPE:X.DOUBLE});let E="/dev/"+_.disks[0].name,o="/dev/"+_.disks[1].name,i=A_(E),n=A_(o);await Le(i?i?E:"":"",n?n?o:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await h({MNT_DISK_TYPE:X.SINGLE}),e.includes("/mnt")){ti(e);let E="/dev/"+_.disks[0].name;A_(E),await Le(E)}else{let E="/dev/"+_.disks[0].name;A_(E),await Le(E)}},"mountDirs"),oi=Br;import{spawnSync as gr}from"child_process";var ii=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 _)gr(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as aE}from"child_process";import{existsSync as yr}from"fs";function ni(){if(!yr(g.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let _=`
6331
6358
  # Increase UDP buffer sizes
6332
6359
  net.core.rmem_default = 134217728
6333
6360
  net.core.rmem_max = 134217728
@@ -6342,7 +6369,7 @@ fs.nr_open = 1000000
6342
6369
  `,e=`
6343
6370
  # Increase process file descriptor count limit
6344
6371
  * - nofile 1000000
6345
- `;oE(`echo "${_}" | sudo tee ${B.SOL_SYSTEM_CONFIG21} > /dev/null`),oE(`sudo sysctl -p ${B.SOL_SYSTEM_CONFIG21}`),oE(`echo "DefaultFILE=1000000" | sudo tee -a ${B.SOL_SYSTEM_CONF}`),oE(`echo "${e}" | sudo tee ${B.SOL_NOFILES_CONF} > /dev/null`)}}t(ii,"setupSystemd");var gS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",yS="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",KS=`/home/${$.USERNAME}/.local/share/solana/install/active_release/bin`,ni=t((_=!0)=>{let{scriptPath:e}=D_(_),E=_?yS:gS,o=KS;return`[Unit]
6372
+ `;aE(`echo "${_}" | sudo tee ${g.SOL_SYSTEM_CONFIG21} > /dev/null`),aE(`sudo sysctl -p ${g.SOL_SYSTEM_CONFIG21}`),aE(`echo "DefaultFILE=1000000" | sudo tee -a ${g.SOL_SYSTEM_CONF}`),aE(`echo "${e}" | sudo tee ${g.SOL_NOFILES_CONF} > /dev/null`)}}t(ni,"setupSystemd");var Kr="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password",Gr="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea",kr=`/home/${W.USERNAME}/.local/share/solana/install/active_release/bin`,Ti=t((_=!0)=>{let{scriptPath:e}=f_(_),E=_?Gr:Kr,o=kr;return`[Unit]
6346
6373
  Description=Solana Validator
6347
6374
  After=network.target
6348
6375
  StartLimitIntervalSec=0
@@ -6354,14 +6381,14 @@ RestartSec=1
6354
6381
  LimitNOFILE=1000000
6355
6382
  LimitMEMLOCK=infinity
6356
6383
  LogRateLimitIntervalSec=0
6357
- User=${$.USERNAME}
6384
+ User=${W.USERNAME}
6358
6385
  Environment=PATH=${o}
6359
6386
  WorkingDirectory=${H.ROOT}
6360
6387
  Environment="${E}"
6361
6388
  ExecStart=${e}
6362
6389
 
6363
6390
  [Install]
6364
- WantedBy=multi-user.target`},"solvService");import{execSync as GS}from"child_process";function Ti(_=!0){console.log("Creating solvService configuration for solana");let e=ni(_);GS(`echo "${e}" | sudo tee ${B.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(Ti,"setupSolvService");var si=t((_=!0)=>{$_(),Ti(_),ii()},"makeServices");import{spawnSync as XE}from"node:child_process";var Si=t(_=>{try{eE(_);let e=_.NETWORK;return e===d.TESTNET?(XE(`solana config set --url ${e} -k ${g}`,{shell:!0,stdio:"inherit"}),XE(`solana airdrop 1 --url ${e} -k ${g}`,{shell:!0,stdio:"inherit"})):XE(`solana config set --url ${e} -k ${b}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&Ze(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as ri}from"node:child_process";var iE=t((_=!1,e="45",E=i_,o=__,i=_?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",n=!1)=>{try{let T=`docker run -it --rm -v ${E}:${E} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${E} --min_download_speed ${e} --version ${o} --rpc ${i}`;if(_&&n){ri(`wget --trust-server-names https://snapshots.avorio.network/testnet/snapshot.tar.bz2 https://snapshots.avorio.network/testnet/incremental-snapshot.tar.bz2 && for file in snapshot-* incremental-snapshot-*; do mv "$file" "$(echo "$file" | sed 's/\\?.*$//')"; done`,{shell:!0,stdio:"inherit",cwd:E});return}ri(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as kS}from"node:child_process";var nE=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`];kS(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as VS}from"node:child_process";var bS=t(()=>{try{VS('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),ai=bS;import jE from"fs";import{promisify as Ci}from"util";import{execSync as Ri}from"child_process";var wS=Ci(jE.readFile),vS=Ci(jE.access),TE="/etc/sysctl.conf",HS=`# set default and maximum socket buffer sizes to 128MB
6391
+ WantedBy=multi-user.target`},"solvService");import{execSync as Vr}from"child_process";function si(_=!0){console.log("Creating solvService configuration for solana");let e=Ti(_);Vr(`echo "${e}" | sudo tee ${g.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}t(si,"setupSolvService");var ri=t((_=!0)=>{X_(),si(_),ni()},"makeServices");import{spawnSync as et}from"node:child_process";var Si=t(_=>{try{sE(_);let e=_.NETWORK;return e===O.TESTNET?(et(`solana config set --url ${e} -k ${u}`,{shell:!0,stdio:"inherit"}),et(`solana airdrop 1 --url ${e} -k ${u}`,{shell:!0,stdio:"inherit"})):et(`solana config set --url ${e} -k ${w}`,{shell:!0,stdio:"inherit"}),_.NODE_TYPE!==D.RPC&&nE(_),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as ai}from"node:child_process";var RE=t((_=!1,e="45",E=n_,o=e_,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){ai(`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}ai(T,{shell:!0,stdio:"inherit"})}catch(T){throw new Error(`getSnapshot Error: ${T}`)}},"getSnapshot");import{spawnSync as br}from"node:child_process";var CE=t(_=>{let E=[`sudo systemctl start ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];br(E[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as wr}from"node:child_process";var vr=t(()=>{try{wr('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Ri=vr;import Et from"fs";import{promisify as ci}from"util";import{execSync as Ci}from"child_process";var Hr=ci(Et.readFile),Yr=ci(Et.access),cE="/etc/sysctl.conf",Jr=`# set default and maximum socket buffer sizes to 128MB
6365
6392
  net.core.rmem_default=134217728
6366
6393
  net.core.wmem_default=134217728
6367
6394
  net.core.rmem_max=134217728
@@ -6372,19 +6399,19 @@ net.ipv4.tcp_rmem=10240 87380 134217728
6372
6399
  net.ipv4.tcp_wmem=10240 87380 134217728
6373
6400
 
6374
6401
  # Enable TCP westwood for kernels greater than or equal to 2.6.13
6375
- net.ipv4.tcp_congestion_control=westwood`;async function YS(){try{await vS(TE,jE.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${TE} does not exist`)}try{let _=await wS(TE,"utf8");if(!_.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=_.replace(/net\.core\.(rmem_default|wmem_default|rmem_max|wmem_max)=.*\n/g,"");e=e.replace(/net\.ipv4\.tcp_(rmem|wmem|congestion_control)=.*\n/g,""),e+=`
6376
- ${HS}
6377
- `,Ri(`echo "${e}" | sudo tee ${TE} > /dev/null`),Ri("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(YS,"updateSysctlConfig");var ci=YS;import{spawnSync as JS}from"child_process";var di=t(()=>{JS("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as xS}from"node:child_process";var Ni=t(()=>{xS("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Oi}from"child_process";var li=t((_=!1,e=!1)=>{_?qS():QS(e)},"createSymLink"),QS=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),Oi(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),qS=t(()=>{Oi("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import sE from"chalk";var $S=t(()=>{let _=`${sE.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${sE.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6402
+ net.ipv4.tcp_congestion_control=westwood`;async function xr(){try{await Yr(cE,Et.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${cE} does not exist`)}try{let _=await Hr(cE,"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+=`
6403
+ ${Jr}
6404
+ `,Ci(`echo "${e}" | sudo tee ${cE} > /dev/null`),Ci("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(_){console.error(`Error: ${_}`)}}t(xr,"updateSysctlConfig");var di=xr;import{spawnSync as Qr}from"child_process";var Ni=t(()=>{Qr("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as qr}from"node:child_process";var Oi=t(()=>{qr("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as li}from"child_process";var Fi=t((_=!1,e=!1)=>{_?Wr():$r(e)},"createSymLink"),$r=t((_=!1)=>{let e="mainnet";_&&(e="testnet"),li(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),Wr=t(()=>{li("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import dE from"chalk";var Xr=t(()=>{let _=`${dE.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${dE.blueBright(`${_} Solana Private RPC Connection API Key ${_}`)}
6378
6405
 
6379
6406
  We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
6380
6407
  It's our way of supporting the community and empowering you with fast, reliable connections.
6381
6408
 
6382
6409
  To get your free API key, simply join us through the link below:
6383
6410
 
6384
- Validators DAO: ${sE.white("`https://discord.gg/X4BgkBHavp`")}
6411
+ Validators DAO: ${dE.white("`https://discord.gg/X4BgkBHavp`")}
6385
6412
 
6386
6413
  Unlock fast connections and elevate your experience with your very own API key \u{1F680}
6387
- `;console.log(sE.cyan(e))},"rpcLog"),K_=$S;var Fi=t(async(_,e,E,o)=>{try{_||(console.log(zE.white("\u{1F7E2} Initializing Setup")),await V(),await go());let i=await V(),n=i.NETWORK===d.TESTNET;switch(e||(console.log(zE.white("\u{1F7E2} Entering Mount Phase")),ei(),await ti()),si(n),di(),ai(),await ci(),e||Si(i),li(i.IS_DUMMY,n),i=await V(),i.NODE_TYPE){case D.RPC:await Go(i);break;case D.VALIDATOR:await zo(i,o);break;default:throw new Error("Unknown Node Type")}e||oi(),Oe(),i.VALIDATOR_TYPE!==l.FRANKENDANCER&&(E||(i=await V(),Ni(),iE(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),e||nE(i),console.log(zE.white("\u{1F7E2} Setup Completed")),K_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var Ii=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6414
+ `;console.log(dE.cyan(e))},"rpcLog"),b_=Xr;var Ii=t(async(_,e,E,o)=>{try{_||(console.log(tt.white("\u{1F7E2} Initializing Setup")),await b(),await Ho());let i=await b(),n=i.NETWORK===O.TESTNET;switch(e||(console.log(tt.white("\u{1F7E2} Entering Mount Phase")),Ei(),await oi()),ri(n),Ni(),Ri(),await di(),e||Si(i),Fi(i.IS_DUMMY,n),i=await b(),i.NODE_TYPE){case D.RPC:await xo(i);break;case D.VALIDATOR:await Zo(i,o);break;default:throw new Error("Unknown Node Type")}e||ii(),De(),i.VALIDATOR_TYPE!==F.FRANKENDANCER&&(E||(i=await b(),Oi(),RE(n,"100",i.SNAPSHOTS_PATH,n?i.TESTNET_SOLANA_VERSION:i.MAINNET_SOLANA_VERSION))),e||CE(i),console.log(tt.white("\u{1F7E2} Setup Completed")),b_()}catch(i){throw new Error(`Setup Error: ${i.message}`)}},"setupV2");var Di=t(_=>{let e="/etc/systemd/system/relayer.service",E=`# Example Systemd File for Co-Hosted Relayer
6388
6415
  [Unit]
6389
6416
  Description=Solana transaction relayer
6390
6417
  Requires=network-online.target
@@ -6410,7 +6437,7 @@ ExecStart=/home/solv/jito-relayer/target/release/jito-transaction-relayer \\
6410
6437
  --verifying-key-pem-path=/home/solv/public.pem
6411
6438
 
6412
6439
  [Install]
6413
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),Di=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6440
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"relayerService"),Pi=t(_=>{let e="/etc/systemd/system/relayer.service",E=`[Unit]
6414
6441
  Description=Solana transaction relayer
6415
6442
  Requires=network-online.target
6416
6443
  After=network-online.target
@@ -6433,45 +6460,45 @@ Environment=WEBSOCKET_SERVERS=wss://your.websocket.server
6433
6460
  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
6461
 
6435
6462
  [Install]
6436
- WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as SE,spawnSync as U_}from"child_process";var Pi=t(async(_,e=!0)=>{U_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),U_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),U_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),U_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),U_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),U_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?Ii(_):Di(_);SE(`echo "${o}" | sudo tee ${E} > /dev/null`),U_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),U_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),SE("sudo ufw allow 11228",{stdio:"inherit"}),SE("sudo ufw allow 11229",{stdio:"inherit"}),SE("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as ZE}from"node:child_process";var WS=t(_=>({filePath:"/home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json",defaultConfig:{libpath:"/home/solv/yellowstone-grpc/target/release/libyellowstone_grpc_geyser.so",log:{level:"info"},grpc:{address:"0.0.0.0:10000",compression:{accept:["gzip"],send:["gzip"]},max_decoding_message_size:"4_194_304",snapshot_plugin_channel_capacity:null,snapshot_client_channel_capacity:"50_000_000",channel_capacity:"100_000",unary_concurrency_limit:100,unary_disabled:!1,x_token:_},prometheus:{address:"0.0.0.0:8999"}}}),"geyserConfig"),fi=WS;import{spawnSync as XS}from"node:child_process";import{readFile as jS,writeFile as zS}from"fs/promises";var ZS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await jS(_,"utf-8")).split(`
6463
+ WantedBy=multi-user.target`;return{filePath:e,body:E}},"jitoRelayerSeparateService");import{execSync as NE,spawnSync as L_}from"child_process";var fi=t(async(_,e=!0)=>{L_("openssl",["genrsa","-out","/home/solv/private.pem"],{stdio:"inherit",shell:!0}),L_("openssl",["rsa","-in","/home/solv/private.pem","-pubout","-out","/home/solv/public.pem"],{stdio:"inherit",shell:!0}),L_("solana-keygen",["new","--no-bip39-passphrase","--outfile","/home/solv/relayer-keypair.json"],{stdio:"inherit",shell:!0}),L_("git",["clone","https://github.com/jito-foundation/jito-relayer.git"],{stdio:"inherit",shell:!0}),L_("git",["submodule","update","--init","--recursive"],{cwd:"jito-relayer",stdio:"inherit",shell:!0}),L_("cargo",["build","--release"],{cwd:"jito-relayer",stdio:"inherit",shell:!0});let{filePath:E,body:o}=e?Di(_):Pi(_);NE(`echo "${o}" | sudo tee ${E} > /dev/null`),L_("sudo",["systemctl","enable","relayer"],{stdio:"inherit"}),L_("sudo",["systemctl","start","relayer"],{stdio:"inherit"}),NE("sudo ufw allow 11228",{stdio:"inherit"}),NE("sudo ufw allow 11229",{stdio:"inherit"}),NE("sudo ufw allow 11226",{stdio:"inherit"})},"jitoRelayerSetup");import{spawnSync as ot}from"node:child_process";var jr=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"),Ui=jr;import{spawnSync as zr}from"node:child_process";import{readFile as Zr,writeFile as _S}from"fs/promises";var eS=t(async()=>{let _="/home/solv/start-validator.sh",E=(await Zr(_,"utf-8")).split(`
6437
6464
  `);E.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let o=E.join(`
6438
- `);await zS(_,o),XS(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Ui=ZS;import _r from"inquirer";import{writeFile as er}from"node:fs/promises";var Ai=t(async()=>{let e=(await _r.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,E="git clone https://github.com/rpcpool/yellowstone-grpc.git",o="cargo build -r",i="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";ZE(E,{shell:!0,stdio:"inherit"}),ZE(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),ZE(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=fi(e),s=JSON.stringify(T,null,2);await er(n,s,{encoding:"utf8"}),await Ui()},"yellowstoneGeyser");var Li=t(_=>{F.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).option("--mod","Modified install",!1).action(async e=>{let E=_.MOD||e.mod;try{if(e.vote)console.log(d_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ze(_),process.exit(0);else if(e.key)console.log(d_.white("\u{1F511} Setting up Validator Keypairs ...")),eE(_),process.exit(0);else if(e.relayer){console.log(d_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await t_()).blockEngineUrl;await Pi(i,!1),console.log(d_.green(`Jito Relayer Setup Completed
6465
+ `);await _S(_,o),zr(`chmod +x ${_}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Ai=eS;import ES from"inquirer";import{writeFile as tS}from"node:fs/promises";var Li=t(async()=>{let e=(await ES.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";ot(E,{shell:!0,stdio:"inherit"}),ot(o,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),ot(i,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:n,defaultConfig:T}=Ui(e),s=JSON.stringify(T,null,2);await tS(n,s,{encoding:"utf8"}),await Ai()},"yellowstoneGeyser");var Mi=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(O_.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),nE(_),process.exit(0);else if(e.key)console.log(O_.white("\u{1F511} Setting up Validator Keypairs ...")),sE(_),process.exit(0);else if(e.relayer){console.log(O_.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let i=(await Q()).blockEngineUrl;await fi(i,!1),console.log(O_.green(`Jito Relayer Setup Completed
6439
6466
 
6440
- $ solv relayer --help`)),Oe(),K_(),process.exit(0)}else if(e.jupiter)console.log(d_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await mo(),Oe(),K_(),process.exit(0);else if(e.geyser){console.log(d_.white("\u26A1\uFE0F Setting up Geyser ...")),await Ai();return}else if(e.firedancer){console.log(d_.white("\u{1F525} Setting up Firedancer ...")),await De(E);return}await Fi(e.skipInitConfig,e.skipMount,e.pivot,E)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(d_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(d_.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as Er}from"child_process";var _t=t(()=>{let E=Er("df -h").toString().split(`
6441
- `).slice(1).filter(i=>i.split(/\s+/)[0]!=="").map(i=>{let n=i.split(/\s+/);return{Filesystem:n[0],Size:n[1],Used:n[2],Avail:n[3],Use:n[4],MountedOn:n[5]}}).sort((i,n)=>G_(n.Avail)-G_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&G_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&G_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&G_(i.Size)>9e11-1&&console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: red")}),o?console.log("your mount point is correct"):E.filter(n=>n.Filesystem.startsWith("/dev/")&&G_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import Mi from"chalk";import tr from"cli-table3";var et=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>Mi.blue(o)),E=new tr({head:e,colWidths:[20,10,10,10,10,20]});_.forEach(o=>{E.push([o.Filesystem,o.Size,o.Used,o.Avail,o.Use,o.MountedOn].map(i=>Mi.white(i)))}),console.log(E.toString())},"displayTable");var ui=t(async()=>{F.command("df").description("Disk Free Command").action(()=>{let _=_t();et(_)})},"dfCommands"),G_=t(_=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},E=_.match(/[A-Za-z]+/)?.[0]||"",o=parseFloat(_);return e[E]?o*e[E]:o},"convertToBytes");var pi=t(_=>{F.command("start").description("Start Solana Validator").action(()=>{nE(_),process.exit(0)})},"startCommand");import{spawnSync as or}from"node:child_process";import ir from"chalk";var mi=t(async _=>{ir.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`];or(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var hi=t(_=>{F.command("stop").description("Stop Solana Validator").action(()=>{mi(_),process.exit(0)})},"stopCommand");import{spawnSync as Ue}from"node:child_process";import Bi from"chalk";var gi=t(_=>{let e=n_();F.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async E=>{let o=_.AUTO_RESTART,i=_.NETWORK===d.TESTNET,n=o&&i?10:30;E.rm&&(console.log(Bi.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Ue("solv stop",{stdio:"inherit",shell:!0}),Ue("solv rm:snapshot",{stdio:"inherit",shell:!0}),Ue("solv get snapshot",{stdio:"inherit",shell:!0}),Ue("solv start",{stdio:"inherit",shell:!0}),console.log(Bi.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let T=`${e} --ledger ${_.LEDGER_PATH} exit --max-delinquent-stake ${_.MAINNET_DELINQUENT_STAKE} --min-idle-time ${n}`;Ue(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var yi=t(_=>{let E=_.NETWORK===d.TESTNET?T_:__;_.NODE_TYPE===D.RPC&&(E=h_),F.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${E}`,E).option("-m, --mod <version>","Use modified installer",!1).action(async o=>{let i=_.VALIDATOR_TYPE===l.JITO,n=_.VALIDATOR_TYPE===l.BAM,T=_.VALIDATOR_TYPE===l.FRANKENDANCER,s=o.mod||_.MOD;if(i){let a=o.version||l_,R=`v${a}`,c=!!a.startsWith("3");Ye(R,s,c);return}if(n){let a=o.version||l_,R=`v${a}`,c=!!a.startsWith("3");ze(R,s,c);return}if(T){let a=o.version||F_;je(_,a,s);return}_.NODE_TYPE===D.RPC&&(E=h_);let r=o.version||E;await Ve(r,s)})},"installCommands");import{spawnSync as nr}from"child_process";var Ki=t(()=>{F.command("mtr").description("Mount Reload Command").action(()=>{nr("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),F.command("disks").description("Show unmounted disks").action(()=>{let _=Pe();console.log(_)})},"mountCommands");import{spawnSync as Sr}from"node:child_process";import Gi from"chalk";import{spawnSync as Tr}from"child_process";var sr=t(async()=>{try{let _=Tr("crontab",["-l"],{encoding:"utf-8"});if(_.status!==0)return console.log("No crontab for this user."),!1;let e=_.stdout;return console.log(e),e.includes("solv epochTimer")}catch(_){return console.error("Error reading crontab:",_),!1}},"hasEpochTimer"),rE=sr;var ki=t(()=>{F.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 14-22 * * *").action(async e=>{await rE()&&(console.log(Gi.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let o=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;Sr(o,{shell:!0,stdio:"inherit"}),console.log(Gi.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var Ae={SOLV_KEYPAIR_DOWNLOAD_PATH:"/solvKeys/download",SOLV_KEYPAIR_UPLOAD_PATH:"/solvKeys/upload",SOLV_KEYPAIR_UPLOAD_PATH_LINUX:"/home/solv",SOLV_KEYPAIR_TRASH_PATH:"/solvKeys/trash",SSH_PUBKEY_PATH:"/.ssh/id_rsa.pub"};import{existsSync as ar,mkdirSync as Rr}from"fs";import Cr from"inquirer";import{homedir as cr}from"os";import{spawnSync as rr}from"node:child_process";function Vi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return rr(i,{shell:!0,stdio:"inherit"}).status===0}t(Vi,"executeSCP");var Et=t(async(_="")=>{let e=_;_===""&&(e=(await Cr.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(u()),o=cr(),i=o.includes("/home/solv")?"/home/solv":o+Ae.SOLV_KEYPAIR_DOWNLOAD_PATH;ar(i)||Rr(i,{recursive:!0});let n=!0,T=o+"/"+It;E.push(T);for(let s of E){let S=s.split("/"),r=S[S.length-1];r=o.includes("/home/solv")?r:r.replace(".json",`-${e}.json`);let a=`${i}/${r}`;Vi(e,s,a,n)&&console.log(`Successfully Exported - ${a} \u{1F389}`)}},"download");import{spawnSync as dr}from"child_process";import{existsSync as Nr}from"fs";import Or from"inquirer";import lr from"os";var bi=t(async(_="")=>{let e=lr.userInfo().homedir,E=_;_===""&&(E=(await Or.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${Ae.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=Ae.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(u(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let S=`${o}/${s}`;if(!Nr(S))continue;let r=`scp -o StrictHostKeyChecking=no ${S} solv@${E}:${n}`;dr(r,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as Fr}from"child_process";import Ir from"inquirer";var wi=t(async()=>{let _=await Ir.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${H.ROOT}/.ssh && echo "${_.pubkey}" >> ${H.AUTHORIZED_KEYS}`;Fr(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import aE from"chalk";import{readFileSync as Dr}from"fs";import Pr from"os";var vi=t(()=>{try{let e=`${Pr.userInfo().homedir}/.ssh/id_rsa.pub`,E=Dr(e,"utf8");console.log(aE.white(`Your SSH Public Key is:
6442
- `)),console.log(aE.white(E))}catch(_){console.error(aE.white(`Error reading SSH Public Key
6443
- `)),console.error(aE.white(_))}},"cat");import{spawnSync as fr}from"child_process";var Hi=t(()=>{fr("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Ur}from"child_process";import{readFileSync as Ar}from"fs";import{Readable as Lr}from"stream";var Yi=t(async _=>new Promise((e,E)=>{try{let o=Ur("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6444
- `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),Mr=t(_=>{try{return JSON.parse(Ar(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),Ji=t(async(_,e)=>{let E=[],o=Lr.from(_);return o.on("data",async i=>{Mr(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import RE from"chalk";import{Presets as hr,SingleBar as Br}from"cli-progress";import xi from"chalk";import{spawnSync as ur}from"node:child_process";import pr from"node-fetch";var mr=t(async()=>{let _=await pr(At,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(xi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6445
- Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)ur(E,{shell:!0,stdio:"ignore"});return console.log(xi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),Qi=mr;var qi=t(()=>{let _=F.command("scp").description("Scp Commands").argument("<cmd>");_.command("download").alias("dl").option("--ip <ip>","Download Key to a Specific IP Address","").description("Export Solana Validator Keypair").action(async e=>{if(e.ip){await Et(e.ip);return}await Et()}),_.command("upload").alias("up").option("--vs","Upload Key to a New Validator Auto Operation Node",!1).option("--ip <ip>","Upload Key to a Specific IP Address","").description("Upload Solana Validator Keypair").action(async e=>{if(e.vs){await Qi();return}await bi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await wi()}),_.command("cat").description("Show SSH Public Key").action(()=>{vi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Hi()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new Br({},hr.shades_classic);e.start(1e4,0);let E=await Yi(e),o=await Ji(E,e);e.stop(),console.log(RE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(RE.green(`
6467
+ $ solv relayer --help`)),De(),b_(),process.exit(0)}else if(e.jupiter)console.log(O_.white("\u{1F30F} Setting up Jupiter Swap API ...")),await wo(),De(),b_(),process.exit(0);else if(e.geyser){console.log(O_.white("\u26A1\uFE0F Setting up Geyser ...")),await Li();return}else if(e.firedancer){console.log(O_.white("\u{1F525} Setting up Firedancer ...")),await Ue(E);return}await Ii(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 oS}from"child_process";var it=t(()=>{let E=oS("df -h").toString().split(`
6468
+ `).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)=>w_(n.Avail)-w_(i.Avail)).slice(0,10),o=E.some(i=>i.MountedOn==="/mnt"&&w_(i.Size)>9e11-1);return E.forEach(i=>{i.MountedOn==="/mnt"&&w_(i.Size)>9e11-1?console.log(`%c${i.Filesystem} ${i.Size} ${i.MountedOn}`,"color: green"):i.Filesystem.startsWith("/dev/")&&w_(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/")&&w_(n.Size)>899999999999).map(n=>n.Filesystem).length>0,E},"df");import pi from"chalk";import iS from"cli-table3";var nt=t(_=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(o=>pi.blue(o)),E=new iS({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=>pi.white(i)))}),console.log(E.toString())},"displayTable");var ui=t(async()=>{I.command("df").description("Disk Free Command").action(()=>{let _=it();nt(_)})},"dfCommands"),w_=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 mi=t(_=>{I.command("start").description("Start Solana Validator").action(()=>{CE(_),process.exit(0)})},"startCommand");import{spawnSync as nS}from"node:child_process";import TS from"chalk";var hi=t(async _=>{TS.white(console.log("Starting solv stop process..."));let E=[`sudo systemctl stop ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`];nS(E[0],{shell:!0,stdio:"inherit"})},"stopSolana");var Bi=t(_=>{I.command("stop").description("Stop Solana Validator").action(()=>{hi(_),process.exit(0)})},"stopCommand");import{spawnSync as Me}from"node:child_process";import gi from"chalk";var yi=t(_=>{let e=T_();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===O.TESTNET,n=o&&i?10:30;E.rm&&(console.log(gi.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),Me("solv stop",{stdio:"inherit",shell:!0}),Me("solv rm:snapshot",{stdio:"inherit",shell:!0}),Me("solv get snapshot",{stdio:"inherit",shell:!0}),Me("solv start",{stdio:"inherit",shell:!0}),console.log(gi.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}`;Me(T,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Ki=t(_=>{let E=_.NETWORK===O.TESTNET?s_:e_;_.NODE_TYPE===D.RPC&&(E=y_),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===F.JITO,n=_.VALIDATOR_TYPE===F.BAM,T=_.VALIDATOR_TYPE===F.FRANKENDANCER,s=o.mod||_.MOD;if(i){let a=o.version||B_,R=d_,c=`v${a}-jito`,C=`v${a}-mod`,l=s?`${C}${R}`:`${c}${R}`,d=!!a.startsWith("3");Qe(l,s,d);return}if(n){let a=o.version||ce,R=g_,c=`v${a}-bam`,C=`v${a}-mod`,l=s?`${C}${R}`:`${c}${R}`,d=!!a.startsWith("3");eE(l,s,d);return}if(T){let a=o.version||D_;_E(_,a,s);return}_.NODE_TYPE===D.RPC&&(E=y_);let S=o.version||E;await ve(S,s)})},"installCommands");import{spawnSync as sS}from"child_process";var Gi=t(()=>{I.command("mtr").description("Mount Reload Command").action(()=>{sS("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),I.command("disks").description("Show unmounted disks").action(()=>{let _=Ae();console.log(_)})},"mountCommands");import{spawnSync as aS}from"node:child_process";import ki from"chalk";import{spawnSync as rS}from"child_process";var SS=t(async()=>{try{let _=rS("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"),OE=SS;var Vi=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 OE()&&(console.log(ki.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 -`;aS(o,{shell:!0,stdio:"inherit"}),console.log(ki.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var pe={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 CS,mkdirSync as cS}from"fs";import dS from"inquirer";import{homedir as NS}from"os";import{spawnSync as RS}from"node:child_process";function bi(_,e,E,o){let i=o?`scp -o StrictHostKeyChecking=no solv@${_}:${e} ${E}`:`scp -o StrictHostKeyChecking=no ${e} solv@${_}:${E}`;return RS(i,{shell:!0,stdio:"inherit"}).status===0}t(bi,"executeSCP");var Tt=t(async(_="")=>{let e=_;_===""&&(e=(await dS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let E=Object.values(p()),o=NS(),i=o.includes("/home/solv")?"/home/solv":o+pe.SOLV_KEYPAIR_DOWNLOAD_PATH;CS(i)||cS(i,{recursive:!0});let n=!0,T=o+"/"+At;E.push(T);for(let s of E){let r=s.split("/"),S=r[r.length-1];S=o.includes("/home/solv")?S:S.replace(".json",`-${e}.json`);let a=`${i}/${S}`;bi(e,s,a,n)&&console.log(`Successfully Exported - ${a} \u{1F389}`)}},"download");import{spawnSync as OS}from"child_process";import{existsSync as lS}from"fs";import FS from"inquirer";import IS from"os";var wi=t(async(_="")=>{let e=IS.userInfo().homedir,E=_;_===""&&(E=(await FS.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=`${e}${pe.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(o=pe.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let i=Object.values(p(o));for(let n of i){let T=n.split("/"),s=T[T.length-1];if(!s.endsWith("keypair.json"))continue;let r=`${o}/${s}`;if(!lS(r))continue;let S=`scp -o StrictHostKeyChecking=no ${r} solv@${E}:${n}`;OS(S,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${s} \u{1F389}`)}},"upload");import{spawnSync as DS}from"child_process";import PS from"inquirer";var vi=t(async()=>{let _=await PS.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}`;DS(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import lE from"chalk";import{readFileSync as fS}from"fs";import US from"os";var Hi=t(()=>{try{let e=`${US.userInfo().homedir}/.ssh/id_rsa.pub`,E=fS(e,"utf8");console.log(lE.white(`Your SSH Public Key is:
6469
+ `)),console.log(lE.white(E))}catch(_){console.error(lE.white(`Error reading SSH Public Key
6470
+ `)),console.error(lE.white(_))}},"cat");import{spawnSync as AS}from"child_process";var Yi=t(()=>{AS("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as LS}from"child_process";import{readFileSync as MS}from"fs";import{Readable as pS}from"stream";var Ji=t(async _=>new Promise((e,E)=>{try{let o=LS("find",["/","-name","*.json","-size","-301c"]),i=[];o.stdout.on("data",n=>{i.push(...n.toString().split(`
6471
+ `).filter(T=>T)),_.increment()}),o.stderr.on("data",n=>{_.increment()}),o.on("close",n=>{e(i)})}catch(o){E(`search Error: ${o}`)}}),"search"),uS=t(_=>{try{return JSON.parse(MS(_,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),xi=t(async(_,e)=>{let E=[],o=pS.from(_);return o.on("data",async i=>{uS(i)&&E.push(i)}),new Promise((i,n)=>{o.on("end",()=>{i(E)}),o.on("error",T=>{n(T)})})},"processPaths");import FE from"chalk";import{Presets as gS,SingleBar as yS}from"cli-progress";import Qi from"chalk";import{spawnSync as mS}from"node:child_process";import hS from"node-fetch";var BS=t(async()=>{let _=await hS(mt,{method:"POST",headers:{"Content-Type":"application/json"}});if(_.status!==200)return console.log(Qi.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
6472
+ Please contact Discord Channel`)),!1;let e=await _.json();for(let E of e.cmds)mS(E,{shell:!0,stdio:"ignore"});return console.log(Qi.white("\u{1F7E2} Upload completed successfully!")),!0},"uploadVS"),qi=BS;var $i=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 Tt(e.ip);return}await Tt()}),_.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 wi(e.ip)}),_.command("create").alias("c").description("Create SSH Login Setting").action(async()=>{await vi()}),_.command("cat").description("Show SSH Public Key").action(()=>{Hi()}),_.command("init").description("Init SSH Key Pair").action(()=>{Yi()}),_.command("search").alias("sc").description("Search Solana Validator Key Pair").action(async()=>{console.log("start searching...");let e=new yS({},gS.shades_classic);e.start(1e4,0);let E=await Ji(e),o=await xi(E,e);e.stop(),console.log(FE.white(`\u{1F50D} Found ${o.length} Potential Solana Key Pairs \u{1F389}`)),o=o.slice(0,10),console.log(FE.green(`
6446
6473
  ${o.join(`
6447
- `)}`)),console.log(RE.white(`
6474
+ `)}`)),console.log(FE.white(`
6448
6475
  Only showing the first 10 results
6449
6476
 
6450
- `)),console.log(RE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as gr}from"child_process";var $i=t(_=>{F.command("status").description("Check Solana Validator Status").action(()=>{yr(_)})},"statusCommands"),yr=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===l.FRANKENDANCER?"frankendancer":"solv"}`;gr(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as Kr}from"node:child_process";var Wi=t(async(_,e)=>{try{let E=await V(),o=E.NETWORK===d.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?d.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return Kr(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import ji from"inquirer";import{spawnSync as Gr}from"node:child_process";var Xi=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=Gr(`solana create-stake-account ${_} ${e}`,{shell:!0,stdio:"pipe"}),n=i.stdout.toString()+i.stderr.toString();if(n.includes("Signature:"))return console.log("Stake account created successfully:",n),!0;if(n.includes("Error:"))console.log("Error encountered:",n),o++,console.log(`Retrying... (${o}/${E})`);else{console.log("Unknown output:",n);break}o===E&&console.log("Failed to create stake account after retries.")}return!1},"createStakeAccount");import{addLeadingZero as kr,existsAsync as Vr}from"@skeet-framework/utils";import{execSync as br,spawnSync as cE}from"node:child_process";import wr from"node:os";var zi=t(async _=>{let e=_.NETWORK===d.TESTNET;if(!(await ji.prompt([{type:"confirm",name:"confirmCreateStakeAccount",message:"Would you like to create a new stake account?",default:!1}])).confirmCreateStakeAccount)return!1;cE(`solana config set --keypair ${e?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"}`,{shell:!0,stdio:"pipe"});let i=await ji.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await Hr(),s=_.STAKE_ACCOUNTS,S=Array.from(new Set([...s,n]));return q_({STAKE_ACCOUNT:S}),Xi(T,Number(i.solAmount))},"stakeAccountQuestion"),vr=wr.userInfo().homedir,CE=vr+"/stake-account",Hr=t(async()=>{await Vr(CE)||cE(`mkdir -p ${CE}`,{shell:!0});let _=cE(`ls ${CE}`,{shell:!0}).stdout.toString().split(`
6451
- `).filter(n=>n.includes(".json")),e=kr(_.length+1),E=`${CE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return cE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:br(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as Yr}from"node:child_process";var Zi=t(async _=>{try{let E=(await V()).NETWORK===d.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return Yr(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as Jr}from"node:child_process";var _n=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return Jr(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import Z_ from"chalk";import{Connection as xr,PublicKey as Qr}from"@solana/web3.js";import{stakePoolInfo as qr}from"@solana/spl-stake-pool";var dE=t(async(_,e=E_)=>{try{let E=new xr(_),o=new Qr(e);return await qr(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as $r}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as Wr}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as Xr}from"@metaplex-foundation/umi";var en=t(async(_,e)=>{try{let E=Xr(e);console.log(`mintPubkey: ${E}`);let o=Wr(_),i=await $r(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import Le from"chalk";import En from"inquirer";var tn=t(async _=>{let e=await En.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:E_}]);try{let E=await dE(_,e.stakePoolAddress);if(!E)return console.log(Le.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6477
+ `)),console.log(FE.white("$ mv <your-key> /mt/solana/<solvKeyName>.json"))})},"scpCommands");import{spawnSync as KS}from"child_process";var Wi=t(_=>{I.command("status").description("Check Solana Validator Status").action(()=>{GS(_)})},"statusCommands"),GS=t(_=>{let E=`sudo systemctl status ${_.VALIDATOR_TYPE===F.FRANKENDANCER?"frankendancer":"solv"}`;KS(E,{shell:!0,stdio:"inherit"}),process.exit(0)},"systemctlStatusSolv");import{spawnSync as kS}from"node:child_process";var Xi=t(async(_,e)=>{try{let E=await b(),o=E.NETWORK===O.TESTNET,n=E.NODE_TYPE===D.RPC?E.RPC_URL:o?O.TESTNET:E.RPC_URL,s=[`solana delegate-stake ${_} ${e} --stake-authority ${o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json"} --url ${n}`];return kS(s.join(" && "),{shell:!0,stdio:"inherit"}),!0}catch(E){throw new Error(`delegateStake: ${E}`)}},"delegateStake");import zi from"inquirer";import{spawnSync as VS}from"node:child_process";var ji=t((_,e,E=5)=>{let o=0;for(;o<E;){let i=VS(`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 bS,existsAsync as wS}from"@skeet-framework/utils";import{execSync as vS,spawnSync as DE}from"node:child_process";import HS from"node:os";var Zi=t(async _=>{let e=_.NETWORK===O.TESTNET;if(!(await zi.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 zi.prompt([{type:"input",name:"solAmount",message:"How many SOL would you like to stake?",default:"1"}]),{stakeKeypair:n,stakeKeypairPath:T}=await JS(),s=_.STAKE_ACCOUNTS,r=Array.from(new Set([...s,n]));return W_({STAKE_ACCOUNT:r}),ji(T,Number(i.solAmount))},"stakeAccountQuestion"),YS=HS.userInfo().homedir,IE=YS+"/stake-account",JS=t(async()=>{await wS(IE)||DE(`mkdir -p ${IE}`,{shell:!0});let _=DE(`ls ${IE}`,{shell:!0}).stdout.toString().split(`
6478
+ `).filter(n=>n.includes(".json")),e=bS(_.length+1),E=`${IE}/stake${e}.json`,o=`solana-keygen new --outfile ${E} --no-bip39-passphrase`;return DE(o,{shell:!0,stdio:"inherit"}),{stakeKeypair:vS(`solana-keygen pubkey ${E}`).toString().trim(),stakeKeypairPath:E}},"createStakeKeypair");import{spawnSync as xS}from"node:child_process";var _n=t(async _=>{try{let E=(await b()).NETWORK===O.TESTNET?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",o=`solana deactivate-stake ${_} --stake-authority ${E}`;return xS(o,{shell:!0,stdio:"inherit"}),!0}catch(e){throw new Error(`deactivateStake: ${e}`)}},"deactivateStake");import{spawnSync as QS}from"node:child_process";var en=t(async(_,e,E)=>{try{let o=`solana withdraw-stake ${_} ${e} ${E}`;return QS(o,{shell:!0,stdio:"inherit"}),!0}catch(o){throw new Error(`withdrawStake: ${o}`)}},"withdrawStake");import ee from"chalk";import{Connection as qS,PublicKey as $S}from"@solana/web3.js";import{stakePoolInfo as WS}from"@solana/spl-stake-pool";var PE=t(async(_,e=t_)=>{try{let E=new qS(_),o=new $S(e);return await WS(E,o)}catch{return console.log(`Stake Pool not found: ${e}`),null}},"getStakePoolInfo");import{fetchDigitalAsset as XS}from"@metaplex-foundation/mpl-token-metadata";import{createUmi as jS}from"@metaplex-foundation/umi-bundle-defaults";import{publicKey as zS}from"@metaplex-foundation/umi";var En=t(async(_,e)=>{try{let E=zS(e);console.log(`mintPubkey: ${E}`);let o=jS(_),i=await XS(o,E);return{name:i.metadata.name,symbol:i.metadata.symbol,uri:i.metadata.uri,mint:e}}catch{return null}},"getTokenInfo");import ue from"chalk";import tn from"inquirer";var on=t(async _=>{let e=await tn.prompt([{type:"input",name:"stakePoolAddress",message:"Enter Stake Pool Address(default: elSOL)",default:t_}]);try{let E=await PE(_,e.stakePoolAddress);if(!E)return console.log(ue.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6452
6479
  Please check the correct address and try again.
6453
- `)),console.log(Le.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}
6480
+ `)),console.log(ue.white(`For stake pool information
6481
+ \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
6482
  Name: ${n.name}
6456
- Token Mint: ${n.mint}`;return(await En.prompt([{type:"confirm",name:"confirm",message:T+`
6457
- Is this the correct Stake Pool?`}])).confirm?n:(console.log(Le.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(Le.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6483
+ Token Mint: ${n.mint}`;return(await tn.prompt([{type:"confirm",name:"confirm",message:T+`
6484
+ Is this the correct Stake Pool?`}])).confirm?n:(console.log(ue.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(ue.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
6458
6485
  Please check the correct address and try again.
6459
- `)),console.log(Le.white(`For stake pool information
6460
- \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Sa}from"fs/promises";import pe from"inquirer";import{existsAsync as ra}from"@skeet-framework/utils";import{Connection as Sn,Keypair as oa,PublicKey as ue}from"@solana/web3.js";import{Connection as jr,PublicKey as zr,Keypair as Zr}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as _a}from"@solana/spl-token";var Me=t(async(_,e,E,o,i=!1)=>{try{let n=Zr.fromSecretKey(new Uint8Array(e)),T=new zr(E),s=new jr(_);return(await _a(s,n,T,o,i)).address.toBase58()}catch(n){throw console.log("Error in getOrCreateDestinationAddress",n),new Error(JSON.stringify(n))}},"getOrCreateDestinationAddress");import{Spinner as ia}from"cli-spinner";import k_ from"chalk";import{PublicKey as nn,Keypair as Tn,Transaction as on,ComputeBudgetProgram as ea,LAMPORTS_PER_SOL as Ea}from"@solana/web3.js";import*as sn from"@solana/spl-stake-pool";var X_=t(async(_,e,E,o=new nn(E_),i,n,T)=>{try{let s=Tn.fromSecretKey(new Uint8Array(e)),S=E*Ea,{instructions:r,signers:a}=await ta(_,e,S,o,i,n,T),R=new on().add(...r);R.feePayer=s.publicKey;let c=await _.getLatestBlockhashAndContext({commitment:"finalized"});R.recentBlockhash=c.value.blockhash,R.sign(...a,s);let C=new on().add(...r).add(ea.setComputeUnitPrice({microLamports:1e3}));C.feePayer=s.publicKey,C.recentBlockhash=c.value.blockhash,C.sign(...a,s);let I=await _.sendRawTransaction(C.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...c.value,signature:I},"finalized"),{status:"success",signature:I}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),ta=t(async(_,e,E,o=new nn(E_),i,n,T)=>{let S=Tn.fromSecretKey(new Uint8Array(e)).publicKey;return await sn.depositSol(_,o,S,E,i,n,T)},"depositSOLInstruction");import{sleep as rn}from"@skeet-framework/utils";var NE=t(async(_,e,E,o)=>{console.log(k_.white("Solana RPC URL:",_));let i=new Sn(_);E===0&&(E=await OE());let n=new ia("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(k_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new ue(e),s=oa.fromSecretKey(new Uint8Array(o)),S=S_;n.setSpinnerTitle(k_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=await Me(_,o,S,s.publicKey);await rn(1e3),n.setSpinnerTitle(k_.green("\u{1F504} Converting SOL to elSOL"));let a=await X_(i,o,E,T,new ue(r),new ue(bE),s.publicKey),R=0;for(;a.status!=="success";){if(R++,R>10)return n.stop(!0),console.log(k_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;n.setSpinnerTitle(k_.yellow(`\u23F3 ${R} Times Retrying...`)),await rn(3e3),i=new Sn(_),a=await X_(i,o,E,T,new ue(r),new ue(bE),s.publicKey)}return n.stop(!0),console.log(k_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6486
+ `)),console.log(ue.white(`For stake pool information
6487
+ \u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as aa}from"fs/promises";import Be from"inquirer";import{existsAsync as Ra}from"@skeet-framework/utils";import{Connection as Sn,Keypair as na,PublicKey as he}from"@solana/web3.js";import{Connection as ZS,PublicKey as _a,Keypair as ea}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as Ea}from"@solana/spl-token";var me=t(async(_,e,E,o,i=!1)=>{try{let n=ea.fromSecretKey(new Uint8Array(e)),T=new _a(E),s=new ZS(_);return(await Ea(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 Ta}from"cli-spinner";import v_ from"chalk";import{PublicKey as Tn,Keypair as sn,Transaction as nn,ComputeBudgetProgram as ta,LAMPORTS_PER_SOL as oa}from"@solana/web3.js";import*as rn from"@solana/spl-stake-pool";var z_=t(async(_,e,E,o=new Tn(t_),i,n,T)=>{try{let s=sn.fromSecretKey(new Uint8Array(e)),r=E*oa,{instructions:S,signers:a}=await ia(_,e,r,o,i,n,T),R=new nn().add(...S);R.feePayer=s.publicKey;let c=await _.getLatestBlockhashAndContext({commitment:"finalized"});R.recentBlockhash=c.value.blockhash,R.sign(...a,s);let C=new nn().add(...S).add(ta.setComputeUnitPrice({microLamports:1e3}));C.feePayer=s.publicKey,C.recentBlockhash=c.value.blockhash,C.sign(...a,s);let l=await _.sendRawTransaction(C.serialize(),{skipPreflight:!0});return await _.confirmTransaction({...c.value,signature:l},"finalized"),{status:"success",signature:l}}catch(s){return console.log("depositSol error",s),{status:"error",error:s}}},"depositSol"),ia=t(async(_,e,E,o=new Tn(t_),i,n,T)=>{let r=sn.fromSecretKey(new Uint8Array(e)).publicKey;return await rn.depositSol(_,o,r,E,i,n,T)},"depositSOLInstruction");import{sleep as an}from"@skeet-framework/utils";var fE=t(async(_,e,E,o)=>{console.log(v_.white("Solana RPC URL:",_));let i=new Sn(_);E===0&&(E=await UE());let n=new Ta("%s");n.setSpinnerString(18),n.start(),n.setSpinnerTitle(v_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let T=new he(e),s=na.fromSecretKey(new Uint8Array(o)),r=S_;n.setSpinnerTitle(v_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let S=await me(_,o,r,s.publicKey);await an(1e3),n.setSpinnerTitle(v_.green("\u{1F504} Converting SOL to elSOL"));let a=await z_(i,o,E,T,new he(S),new he(xE),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 an(3e3),i=new Sn(_),a=await z_(i,o,E,T,new he(S),new he(xE),s.publicKey)}return n.stop(!0),console.log(v_.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
6461
6488
 
6462
- Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as na,Keypair as Ta,PublicKey as j_}from"@solana/web3.js";import{Spinner as sa}from"cli-spinner";import z_ from"chalk";import{sleep as an}from"@skeet-framework/utils";var Rn=t(async(_,e,E,o,i)=>{let n=new na(_);E===0&&(E=await OE());let T=new sa("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(z_.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new j_(e),S=await dE(_,e);if(!S)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(z_.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let r=S.poolMint,a=Ta.fromSecretKey(new Uint8Array(o)),R=await Me(_,o,r,a.publicKey),c=await Me(_,o,r,new j_(qt),!0);await an(1e3),T.setSpinnerTitle(z_.green(`\u{1F504} Converting SOL to ${i}`));let C=await X_(n,o,E,s,new j_(R),new j_(c),a.publicKey),I=0;for(;C.status!=="success";){if(I++,I>10)return T.stop(!0),console.log(z_.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(z_.yellow(`\u23F3 ${I} Times Retrying...
6463
- `)),await an(1e3),C=await X_(n,o,E,s,new j_(R),new j_(c),a.publicKey)}return T.stop(!0),console.log(z_.white(`\u{1F4B0} You've got ${i} \u2728
6489
+ Signature:`,a.signature)),!0},"elSOLdeposit");import{Connection as sa,Keypair as ra,PublicKey as Z_}from"@solana/web3.js";import{Spinner as Sa}from"cli-spinner";import _e from"chalk";import{sleep as Rn}from"@skeet-framework/utils";var Cn=t(async(_,e,E,o,i)=>{let n=new sa(_);E===0&&(E=await UE());let T=new Sa("%s");T.setSpinnerString(18),T.start(),T.setSpinnerTitle(_e.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let s=new Z_(e),r=await PE(_,e);if(!r)return console.log("Stake Pool not found"),!1;T.setSpinnerTitle(_e.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let S=r.poolMint,a=ra.fromSecretKey(new Uint8Array(o)),R=await me(_,o,S,a.publicKey),c=await me(_,o,S,new Z_(zt),!0);await Rn(1e3),T.setSpinnerTitle(_e.green(`\u{1F504} Converting SOL to ${i}`));let C=await z_(n,o,E,s,new Z_(R),new Z_(c),a.publicKey),l=0;for(;C.status!=="success";){if(l++,l>10)return T.stop(!0),console.log(_e.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(_e.yellow(`\u23F3 ${l} Times Retrying...
6490
+ `)),await Rn(1e3),C=await z_(n,o,E,s,new Z_(R),new Z_(c),a.publicKey)}return T.stop(!0),console.log(_e.white(`\u{1F4B0} You've got ${i} \u2728
6464
6491
 
6465
- Signature:`,C.signature)),!0},"depositeLST");import{execSync as lE}from"node:child_process";import{homedir as aa}from"os";var Cn=t(_=>{F.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let E=Number(e.amount);console.log("RPC URL:",_.RPC_URL);let o=E_,i=_.NETWORK===d.TESTNET,n=aa(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(lE(`solana config set --keypair ${T}`),!await ra(T)){console.log(Z_.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6466
- `)),console.log(Z_.white(T));return}let s=JSON.parse(await Sa(T,"utf-8"));if(e.elsol){await NE(_.RPC_URL,o,E,s);return}else if(e.lst){let S=await tn(_.RPC_URL);if(!S)return;o=S.stakePoolAddress,await Rn(_.RPC_URL,o,E,s,S.symbol);return}else{if(!await zi(_))return;let r=await V(),{validatorVoteAccount:a,stakeAccounts:R}=await Ca(r);for await(let c of R)try{await Wi(c,a)}catch{console.log(Z_.yellow(`Network might be busy, please try again later
6492
+ Signature:`,C.signature)),!0},"depositeLST");import{execSync as AE}from"node:child_process";import{homedir as Ca}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=t_,i=_.NETWORK===O.TESTNET,n=Ca(),T=i?`${n}/testnet-authority-keypair.json`:`${n}/mainnet-authority-keypair.json`;if(AE(`solana config set --keypair ${T}`),!await Ra(T)){console.log(ee.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
6493
+ `)),console.log(ee.white(T));return}let s=JSON.parse(await aa(T,"utf-8"));if(e.elsol){await fE(_.RPC_URL,o,E,s);return}else if(e.lst){let r=await on(_.RPC_URL);if(!r)return;o=r.stakePoolAddress,await Cn(_.RPC_URL,o,E,s,r.symbol);return}else{if(!await Zi(_))return;let S=await b(),{validatorVoteAccount:a,stakeAccounts:R}=await da(S);for await(let c of R)try{await Xi(c,a)}catch{console.log(ee.yellow(`Network might be busy, please try again later
6467
6494
  You can use a custom RPC endpoint to avoid this issue
6468
- `))}}}),F.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await da();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await Ra();for await(let o of E)try{await Zi(o)}catch{console.log(Z_.yellow(`Network might be busy, please try again later
6495
+ `))}}}),I.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await Oa();if(e==="Deactivate Stake"){let{stakeAccounts:E}=await ca();for await(let o of E)try{await _n(o)}catch{console.log(ee.yellow(`Network might be busy, please try again later
6469
6496
  You can use a custom RPC endpoint to avoid this issue
6470
- `))}}else{let E=await Na();await _n(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),OE=t(async()=>{let _=lE("solana address").toString().trim(),e=lE("solana balance").toString().replace("SOL","").trim();console.log(Z_.white(`\u{1F4D7} Selected Wallet: ${_}
6471
- \u{1F4B0} Account Balance:`,e+" SOL")),console.log(Z_.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await pe.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),Ra=t(async()=>{let _=await V();return await pe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),Ca=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===d.TESTNET?ca(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await pe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to delegate stake to?",choices:e},{type:"input",name:"validatorVoteAccount",message:"What is the Validator Vote Account Address?",default(){return E}}])},"delegateStakeAsk"),ca=t(_=>{let o=`/home/solv/${_.NETWORK===d.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return lE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),da=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await pe.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),Na=t(async()=>{let _=(await V()).STAKE_ACCOUNTS;return await pe.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:_},{type:"input",name:"destinationAddress",message:"What is the destination address for the withdrawn SOL?",default(){return"xxxxxxxx"}},{type:"input",name:"solAmount",message:"How many SOL would you like to withdraw?",default(){return"1"}}])},"withdrawStakeAsk");import{execSync as Oa}from"child_process";var cn=t(()=>{try{return Oa("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as la}from"child_process";var dn=t(()=>{try{return la("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getSlot Error: ${_}`}},"getSlot");import N_ from"chalk";import{Spinner as Fa}from"cli-spinner";var _e;(function(_){_.successHex=N_.hex("#39A845"),_.warningHex=N_.hex("#FFD02E"),_.errorHex=N_.hex("#B5332E"),_.syncHex=N_.hex("#3073B7"),_.greyHex=N_.hex("#BEBDBD"),_.indigoHex=N_.hex("#3950A0"),_.pinkHex=N_.hex("#D8A1C4"),_.normal=e=>{console.log(N_.white(e))},_.syncSpinner=e=>{let E=new Fa(N_.white(e)+` %s
6497
+ `))}}else{let E=await la();await en(E.stakeAccounts,E.destinationAddress,E.solAmount)}})},"stakeCommands"),UE=t(async()=>{let _=AE("solana address").toString().trim(),e=AE("solana balance").toString().replace("SOL","").trim();console.log(ee.white(`\u{1F4D7} Selected Wallet: ${_}
6498
+ \u{1F4B0} Account Balance:`,e+" SOL")),console.log(ee.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let E=await Be.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(E.amount)},"askAmount"),ca=t(async()=>{let _=await b();return await Be.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:_.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),da=t(async _=>{let e=_.STAKE_ACCOUNTS,E=_.NETWORK===O.TESTNET?Na(_):_.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY;return await Be.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"),Na=t(_=>{let o=`/home/solv/${_.NETWORK===O.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return AE(`solana-keygen pubkey ${o}`).toString()},"getVoteAccountAddress"),Oa=t(async()=>{let _=["Deactivate Stake","Withdraw Stake"];return await Be.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:_,default:_[0]}])},"unstakeAsk"),la=t(async()=>{let _=(await b()).STAKE_ACCOUNTS;return await Be.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 Fa}from"child_process";var dn=t(()=>{try{return Fa("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(_){return`getEpoch Error: ${_}`}},"getEpoch");import{execSync as Ia}from"child_process";var Nn=t(()=>{try{return Ia("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 Da}from"cli-spinner";var Ee;(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 Da(l_.white(e)+` %s
6472
6499
  `);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
6500
  ${e}`),console.log(`${E}`),console.log(`${o}`),console.log(`${i}`),console.log(`${n}`),console.log(`${T}
6474
- `),console.log(`Solv Version: v${ge}
6501
+ `),console.log(`Solv Version: v${Ge}
6475
6502
  `)},_.installMessage=()=>{let e=_.warningHex("\u{1F525} Welcome to Solana Validator Tool Solv \u{1F525}"),E=`
6476
6503
  Solv is born and ready for running Solana Validator \u{1F680}
6477
6504
 
@@ -6492,18 +6519,18 @@ $ solv mt -p <fileSystem>
6492
6519
  $ solv umt -p <fileSystem>
6493
6520
  `,i=`mount reload
6494
6521
  $ solv mtr
6495
- `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(_e||(_e={}));import o_ from"chalk";import{spawnSync as Ia}from"node:child_process";var FE=t(_=>{Ia("solana config get",{shell:!0,stdio:"inherit"});let E=D_();console.log(o_.white("start-validator.sh: ")+E.scriptPath),console.log(o_.white("solv.service: ")+B.SOL_SERVICE),console.log(o_.white("logrotate: ")+B.SOL_LOGROTATE),console.log(o_.white("logrotate (fd): ")+B.FRANKENDANCER_LOGROTATE),console.log(o_.white("sysctl.d: ")+B.SOL_SYSTEM_CONFIG21),console.log(o_.white("limits.d: ")+B.SOL_NOFILES_CONF),console.log(o_.white("system.conf: ")+B.SOL_SYSTEM_CONF),console.log(o_.white("ledger: ")+E.ledger),console.log(o_.white("accounts: ")+E.accounts),console.log(o_.white("snapshots: ")+E.snapshots),console.log(o_.white("mount type: ")+_.MNT_DISK_TYPE)},"showConfig");import{spawnSync as Nn}from"node:child_process";import Da from"chalk";var On=t(_=>{let e=_.NETWORK===d.TESTNET,E=e?T_:__;_.NODE_TYPE===D.RPC&&(E=h_);let o=F.command("get").description("Get Solana Validator's Information").argument("<cmd>","Subcommands: epoch, slot, catchup, snapshot, contact, config");o.command("epoch").description("Show Validator's Epoch").action(()=>{let i=cn();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=Nn(i,{shell:!0,stdio:"pipe"});console.log(Da.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=dn();console.log({slot:i})}),o.command("snapshot").alias("sn").option("-m, --minDownloadSpeed <minDownloadSpeed>","Minimum download speed","100").option("-s, --snapshotPath <snapshotPath>","Snapshot Path",_.SNAPSHOTS_PATH).option("-v, --version <version>","Specific Version Node",E).option("-r, --rpcUrl <rpcUrl>","RPC URL",e?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com").option("-a, --avorio <version>","Use Avorio Network (Testnet only)",!1).description("Download the latest snapshot").action(i=>{let n=i.minDownloadSpeed,T=i.snapshotPath,s=i.version,S=i.rpcUrl,r=i.avorio;iE(e,n,T,s,S,r)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${n_()} --ledger /mnt/ledger/ contact-info`;Nn(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{FE(_)}),o.command("aa").description("Show Solv AA").option("-c, --client","Show Solv Client Mode AA",!1).action(i=>{_e.solvAA(),i.client?_e.installClientMessage():_e.installMessage()}),o.addHelpCommand("help [cmd]","Get Solana Validator Information")},"getCommands");import{spawnSync as Pa}from"node:child_process";var ln=t(()=>{Pa("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as fa}from"node:child_process";var Fn=t(()=>{fa("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as Ua}from"node:child_process";var In=t(()=>{Ua("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Aa}from"node:child_process";var Dn=t(()=>{Aa("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as La}from"node:child_process";var Pn=t((_=!1)=>{La(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import tt from"chalk";import{spawnSync as ua}from"child_process";import{spawnSync as Ma}from"node:child_process";var fn=t(()=>{Ma("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var Un=t(()=>{let _=F.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{ln()}),_.command("start").description("Start Relayer").action(()=>{Fn()}),_.command("stop").description("Stop Relayer").action(()=>{In()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{Pn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{Dn()}),_.command("enable").description("Enable Relayer").action(()=>{fn()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(tt.red("Please provide a URL"));return}let E=`${n_()} --ledger ${f} set-relayer-config --relayer-url ${e.url}`;console.log(tt.white("Setting Relayer URL ...")),ua(E,{shell:!0,stdio:"inherit"}),console.log(tt.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as ha}from"child_process";import{spawnSync as pa}from"child_process";var IE=t(()=>{pa("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as ma}from"child_process";var An=t(()=>{ma("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var Ln=t(_=>{IE();let e=`sudo rm -rf ${B.SOL_LOGROTATE}`;ha(e,{shell:!0,stdio:"inherit"}),$_(_),An()},"updateLogrotate");var Mn=t(_=>{F.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";Ln(e),process.exit(0)})},"logrotateCommand");import{spawnSync as ot}from"node:child_process";var un=t(_=>{ot("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&ot(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),ot("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as Ba}from"node:child_process";var pn=t(_=>{let E=`${n_()} --ledger ${_.LEDGER_PATH} monitor`;Ba(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as ga}from"node:child_process";var mn=t(()=>{ga("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import DE from"inquirer";import{execSync as PE,spawnSync as it}from"child_process";import me from"chalk";import{homedir as ya}from"os";var hn=1e3,nt;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(nt||(nt={}));var fE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(fE||(fE={}));var Ka=Object.values(nt),Bn=t(_=>{F.command("transfer").alias("tr").option("-s, --spl","Show SPL Token Balance",!1).description("Transfer Solana Tokens/SPL Tokens").action(async e=>{e.spl&&(console.log(me.blue(`\u2728 Coming Soon
6522
+ `;console.log(e),console.log(_.greyHex(E)),console.log(_.greyHex(o)),console.log(_.greyHex(i))}})(Ee||(Ee={}));import o_ from"chalk";import{spawnSync as Pa}from"node:child_process";var LE=t(_=>{Pa("solana config get",{shell:!0,stdio:"inherit"});let E=f_();console.log(o_.white("start-validator.sh: ")+E.scriptPath),console.log(o_.white("solv.service: ")+g.SOL_SERVICE),console.log(o_.white("logrotate: ")+g.SOL_LOGROTATE),console.log(o_.white("logrotate (fd): ")+g.FRANKENDANCER_LOGROTATE),console.log(o_.white("sysctl.d: ")+g.SOL_SYSTEM_CONFIG21),console.log(o_.white("limits.d: ")+g.SOL_NOFILES_CONF),console.log(o_.white("system.conf: ")+g.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 On}from"node:child_process";import fa from"chalk";var ln=t(_=>{let e=_.NETWORK===O.TESTNET,E=e?s_:e_;_.NODE_TYPE===D.RPC&&(E=y_);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=dn();console.log({epoch:i})}),o.command("ip").description("Show Validator's IP Address").action(()=>{let i="curl ipinfo.io/ip",{stdout:n}=On(i,{shell:!0,stdio:"pipe"});console.log(fa.white(`${n}`))}),o.command("slot").description("Show Current Slot").action(()=>{let i=Nn();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,r=i.rpcUrl,S=i.avorio;RE(e,n,T,s,r,S)}),o.command("contact").description("Show Validator Contact Information").action(()=>{let n=`${T_()} --ledger /mnt/ledger/ contact-info`;On(n,{shell:!0,stdio:"inherit"})}),o.command("config").description("Show Solv Config").alias("c").action(async()=>{LE(_)}),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 Ua}from"node:child_process";var Fn=t(()=>{Ua("sudo systemctl status relayer.service",{shell:!0,stdio:"inherit"})},"relayerStatus");import{spawnSync as Aa}from"node:child_process";var In=t(()=>{Aa("sudo systemctl start relayer.service",{shell:!0,stdio:"inherit"})},"relayerStart");import{spawnSync as La}from"node:child_process";var Dn=t(()=>{La("sudo systemctl stop relayer.service",{shell:!0,stdio:"inherit"})},"relayerStop");import{spawnSync as Ma}from"node:child_process";var Pn=t(()=>{Ma("sudo systemctl restart relayer.service",{shell:!0,stdio:"inherit"})},"relayerRestart");import{spawnSync as pa}from"node:child_process";var fn=t((_=!1)=>{pa(_?"journalctl -u relayer.service -xef | grep ERROR":"journalctl -u relayer.service -xef",{shell:!0,stdio:"inherit"})},"relayerLog");import st from"chalk";import{spawnSync as ma}from"child_process";import{spawnSync as ua}from"node:child_process";var Un=t(()=>{ua("sudo systemctl enable relayer.service",{shell:!0,stdio:"inherit"})},"relayerEnable");var An=t(()=>{let _=I.command("relayer").description("Jito Relayer Commands");_.command("status").description("Show Relayer Status").action(()=>{Fn()}),_.command("start").description("Start Relayer").action(()=>{In()}),_.command("stop").description("Stop Relayer").action(()=>{Dn()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Relayer Logs").action(e=>{fn(e.error)}),_.command("restart").description("Restart Relayer").action(()=>{Pn()}),_.command("enable").description("Enable Relayer").action(()=>{Un()}),_.command("set:url").option("-u, --url <url>","Set Relayer URL","").description("Set Relayer URL on Validator").action(e=>{if(e.url===""){console.log(st.red("Please provide a URL"));return}let E=`${T_()} --ledger ${f} set-relayer-config --relayer-url ${e.url}`;console.log(st.white("Setting Relayer URL ...")),ma(E,{shell:!0,stdio:"inherit"}),console.log(st.green("\u{1F7E2} Relayer URL Set"))})},"relayerCommands");import{spawnSync as ga}from"child_process";import{spawnSync as ha}from"child_process";var ME=t(()=>{ha("sudo rm -rf /home/solv/solana-validator.log.*",{shell:!0,stdio:"inherit"})},"rmLogs");import{spawnSync as Ba}from"child_process";var Ln=t(()=>{Ba("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");var Mn=t(_=>{ME();let e=`sudo rm -rf ${g.SOL_LOGROTATE}`;ga(e,{shell:!0,stdio:"inherit"}),X_(_),Ln()},"updateLogrotate");var pn=t(_=>{I.command("logrotate").description("Refresh Logrotate").action(()=>{let e=_.VALIDATOR_TYPE==="frankendancer";Mn(e),process.exit(0)})},"logrotateCommand");import{spawnSync as rt}from"node:child_process";var un=t(_=>{rt("sudo rm -rf /mnt/ledger/*",{shell:!0,stdio:"inherit"}),_.SNAPSHOTS_PATH!=="/mnt/ledger"&&rt(`sudo rm -rf ${_.SNAPSHOTS_PATH}/*`,{shell:!0,stdio:"inherit"}),rt("sudo rm -rf /mnt/accounts/*",{shell:!0,stdio:"inherit"})},"rmSnapshot");import{spawnSync as ya}from"node:child_process";var mn=t(_=>{let E=`${T_()} --ledger ${_.LEDGER_PATH} monitor`;ya(E,{shell:!0,stdio:"inherit"})},"monitorSolana");import{spawnSync as Ka}from"node:child_process";var hn=t(()=>{Ka("solana catchup --our-localhost",{shell:!0,stdio:"inherit"})},"solanaCatchup");import pE from"inquirer";import{execSync as uE,spawnSync as St}from"child_process";import ge from"chalk";import{homedir as Ga}from"os";var Bn=1e3,at;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account"})(at||(at={}));var mE;(function(_){_.VALIDATOR="Validator Account",_.AUTHORITY="Authority Account",_.OTHER="Other Account"})(mE||(mE={}));var ka=Object.values(at),gn=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(ge.blue(`\u2728 Coming Soon
6496
6523
  This Feature is Currently Under Development
6497
- Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await Ga(),n="0";try{let R=it(`solana balance ${i} --url ${_.RPC_URL}`,{shell:!0});if(R.status!==0)throw new Error("Invalid Wallet Address");n=R.stdout.toString(),console.log("toBalance:",n)}catch{console.log(me.red(`\u274C To Wallet is Invalid
6498
- Please Check the Wallet Address`)),process.exit(0)}let T=PE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(me.white(`\u{1F3E6} From Wallet: ${o}
6499
- \u{1F4B0} Balance: ${T}`)),console.log(me.white(`\u{1F3E6} To Wallet: ${i}
6500
- \u{1F4B0} Balance: ${n}`));let{amount:s}=await DE.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),S=`solana transfer ${i} ${s} --allow-unfunded-recipient --keypair ${E} --url ${_.RPC_URL}`,r=it(S,{shell:!0,stdio:"inherit"}),a=Ke;for(;r.status!==0&&a>0;)console.log(me.red(`\u274C Transaction Failed
6501
- Retrying Transaction in ${hn}ms
6502
- Retries Left: ${a}`)),await J(hn),r=it(S,{shell:!0,stdio:"inherit"}),a--;process.exit(0)})},"transferCommands"),Tt=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Ga=t(async()=>{let _=ya(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=PE(`solana address -k ${o}`).toString().trim(),n=await DE.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:Ka}]),T=n.from==="Validator Account"?Object.values(fE).filter(R=>R!=="Validator Account"):Object.values(fE).filter(R=>R!=="Authority Account");if((await DE.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:T}])).to==="Other Account"){let{to:R}=await DE.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:Tt}]);i=R}else{let R=n.from==="Validator Account"?e:E;o=`${_}/${R}`,i=PE(`solana address -k ${o}`).toString().trim()}let S=n.from==="Validator Account"?E:e,r=`${_}/${S}`,a=PE(`solana address -k ${r}`).toString().trim();return{fromWalletPath:r,fromAddress:a,toAddress:i}},"selectFromKeypairs");import gn from"chalk";import ka from"inquirer";import{execSync as st,spawnSync as Va}from"node:child_process";var yn=t(async(_,e=!1)=>{let E=_.NETWORK===d.TESTNET,o=E?He:_.RPC_URL,i=E?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",n=E?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",T=E?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",s=st(`solana balance ${T}`).toString().replace("SOL","").trim(),S=0,r=Number(s)-.03;if(e)S=r;else{console.log(gn.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(gn.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let C=await ka.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${r}`,default:String(r)}]);S=Number(C.sol)}let a=st(`solana address --keypair ${T}`).toString().trim(),R=st(`solana address --keypair ${n}`).toString().trim(),c=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${a} ${R} ${S} --authorized-withdrawer ${n} --url ${o}`;Va(c,{shell:!0,stdio:"inherit"})},"withdraw");var Kn=t(_=>{F.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await yn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as ja,spawnSync as za}from"node:child_process";import{BN as kn}from"bn.js";import{LAMPORTS_PER_SOL as St}from"@solana/web3.js";import{Connection as Ha,LAMPORTS_PER_SOL as Ya}from"@solana/web3.js";import{Keypair as ba}from"@solana/web3.js";import{readFile as wa}from"fs/promises";var va=t(async _=>{let e=JSON.parse(await wa(_,"utf8"));return ba.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),Gn=va;import{homedir as Ja}from"os";var a_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(a_||(a_={}));var xa={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},Qa=t(async(_,e="auth",E=!1)=>{let o=new Ha(_),i=Ja(),n=u(i),s=`${E?"testnet":"mainnet"}${xa[e]}`,S=n[s],r=await Gn(S),a=await o.getBalance(r.publicKey),c=Number(a)/Ya;if(isNaN(c))throw new Error("Failed to get balance");return c},"getBalance"),A_=Qa;var qa=new kn(3*St),Vn=t(async _=>{let e=await A_(_,a_.VALIDATOR),o=new kn(Number(Number(e)*St)).sub(qa),i=Number(o)/St;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import he from"chalk";import{Keypair as $a,Connection as Wa,PublicKey as Xa,SystemProgram as bn,ComputeBudgetProgram as UE,VersionedTransaction as wn,TransactionMessage as vn}from"@solana/web3.js";var Hn=t(async(_,e,E,o)=>{let i=0;try{let n=new Wa(_,"finalized"),T=$a.fromSecretKey(new Uint8Array(Array.from(e))),s=new Xa(E),S=o;for(;;)try{let r=[bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),UE.setComputeUnitLimit({units:2e5}),UE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],a=await n.getLatestBlockhashAndContext({commitment:"finalized"}),R=new wn(new vn({instructions:r,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message()),c=await n.simulateTransaction(R,{replaceRecentBlockhash:!0,sigVerify:!1});R.sign([T]);let C=[bn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:S}),UE.setComputeUnitLimit({units:c.value.unitsConsumed?Math.trunc(c.value.unitsConsumed*1.2):2e5}),UE.setComputeUnitPrice({microLamports:1e3})],I=new wn(new vn({instructions:C,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message());I.sign([T]);let N=await n.sendRawTransaction(I.serialize());return await n.confirmTransaction({...a.value,signature:N},"finalized"),console.log("finalized signature:",N),N}catch(r){if(i++,i>Ke)throw new Error(JSON.stringify(r));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${r}`),await J(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as Za}from"fs/promises";import{LAMPORTS_PER_SOL as _R}from"@solana/web3.js";var rt=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=u();await A_(_,a_.VOTE)<1?(console.log(he.white("Vote Account Balance is less than 1 SOL")),console.log(he.white("Skip withdrawing SOL from Vote Account to Authority Account"))):za("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await Vn(_);console.log(he.white(`Transferable Balance: ${i} SOL`));let n=i*_R;if(i<1)console.log(he.white("Validator Account Balance is less than 1 SOL")),console.log(he.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=ja(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await Za(E,"utf-8"));await Hn(_,s,T,n)}return!0},"collectSOL");import{readFile as aR}from"fs/promises";import RR from"inquirer";import at from"chalk";import{execSync as eR}from"child_process";import{homedir as ER}from"os";var tR=t(async _=>{try{let e=ER(),{mainnetValidatorAuthorityKey:E}=u(e),o=`spl-token balance ${S_} --owner ${E} --url ${_}`,i=eR(o).toString().trim();return Number(i)}catch(e){return console.log(at.red(`Error: ${e}`)),console.log(at.yellow(`You might need to install the Solana SPL CLI:
6503
- `)),console.log(at.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Yn=tR;import ME from"chalk";import{Connection as oR,PublicKey as Jn,Keypair as iR,ComputeBudgetProgram as AE,VersionedTransaction as xn,TransactionMessage as Qn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as qn,createTransferInstruction as $n,TOKEN_PROGRAM_ID as Wn}from"@solana/spl-token";var Xn=t(async(_,e,E,o,i,n)=>{try{let T=new oR(_,"finalized"),s=iR.fromSecretKey(new Uint8Array(e)),S=new Jn(E),r=new Jn(i),a=Math.trunc(o*Math.pow(10,n)),R=await qn(T,s,r,s.publicKey),c=await qn(T,s,r,S,!0);for(;;)try{let C=[$n(R.address,c.address,s.publicKey,a,[],Wn),AE.setComputeUnitLimit({units:2e5}),AE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],I=await T.getLatestBlockhashAndContext({commitment:"finalized"}),N=new xn(new Qn({instructions:C,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message()),O=await T.simulateTransaction(N,{replaceRecentBlockhash:!0,sigVerify:!1});N.sign([s]);let A=[$n(R.address,c.address,s.publicKey,a,[],Wn),AE.setComputeUnitLimit({units:O.value.unitsConsumed?Math.trunc(O.value.unitsConsumed*1.2):2e5}),AE.setComputeUnitPrice({microLamports:1e3})],P=new xn(new Qn({instructions:A,payerKey:s.publicKey,recentBlockhash:I.value.blockhash}).compileToV0Message());P.sign([s]);let L=await T.sendRawTransaction(P.serialize());return await T.confirmTransaction({...I.value,signature:L},"finalized"),console.log("finalized signature:",L),L}catch(C){console.error("Transfer failed, retrying...",C)}}catch(T){throw console.error(T),T}},"transferSPLToken");import LE from"inquirer";import{spawnSync as jn}from"child_process";import Rt from"chalk";import{promises as zn}from"fs";var nR=t(async(_="epochTimer")=>{try{let e=jn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Rt.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6524
+ Please Check Back Later`)),process.exit(0));let{fromWalletPath:E,fromAddress:o,toAddress:i}=await Va(),n="0";try{let R=St(`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(ge.red(`\u274C To Wallet is Invalid
6525
+ Please Check the Wallet Address`)),process.exit(0)}let T=uE(`solana balance ${o} --url ${_.RPC_URL}`).toString();console.log(ge.white(`\u{1F3E6} From Wallet: ${o}
6526
+ \u{1F4B0} Balance: ${T}`)),console.log(ge.white(`\u{1F3E6} To Wallet: ${i}
6527
+ \u{1F4B0} Balance: ${n}`));let{amount:s}=await pE.prompt([{type:"number",name:"amount",message:"Enter Amount to Transfer",default:.1}]),r=`solana transfer ${i} ${s} --allow-unfunded-recipient --keypair ${E} --url ${_.RPC_URL}`,S=St(r,{shell:!0,stdio:"inherit"}),a=Ve;for(;S.status!==0&&a>0;)console.log(ge.red(`\u274C Transaction Failed
6528
+ Retrying Transaction in ${Bn}ms
6529
+ Retries Left: ${a}`)),await J(Bn),S=St(r,{shell:!0,stdio:"inherit"}),a--;process.exit(0)})},"transferCommands"),Rt=t(_=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(_)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Va=t(async()=>{let _=Ga(),e="mainnet-authority-keypair.json",E="mainnet-validator-keypair.json",o=`${_}/${e}`,i=uE(`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(mE).filter(R=>R!=="Validator Account"):Object.values(mE).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:Rt}]);i=R}else{let R=n.from==="Validator Account"?e:E;o=`${_}/${R}`,i=uE(`solana address -k ${o}`).toString().trim()}let r=n.from==="Validator Account"?E:e,S=`${_}/${r}`,a=uE(`solana address -k ${S}`).toString().trim();return{fromWalletPath:S,fromAddress:a,toAddress:i}},"selectFromKeypairs");import yn from"chalk";import ba from"inquirer";import{execSync as Ct,spawnSync as wa}from"node:child_process";var Kn=t(async(_,e=!1)=>{let E=_.NETWORK===O.TESTNET,o=E?xe:_.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=Ct(`solana balance ${T}`).toString().replace("SOL","").trim(),r=0,S=Number(s)-.03;if(e)r=S;else{console.log(yn.white("\u{1F4B0} Current Vote Account Balance:",s+" SOL")),console.log(yn.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let C=await ba.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${S}`,default:String(S)}]);r=Number(C.sol)}let a=Ct(`solana address --keypair ${T}`).toString().trim(),R=Ct(`solana address --keypair ${n}`).toString().trim(),c=`solana withdraw-from-vote-account --keypair ${i} --commitment finalized ${a} ${R} ${r} --authorized-withdrawer ${n} --url ${o}`;wa(c,{shell:!0,stdio:"inherit"})},"withdraw");var Gn=t(_=>{I.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await Kn(_,e.all),process.exit(0)})},"withdrawCommands");import{execSync as Za,spawnSync as _R}from"node:child_process";import{BN as Vn}from"bn.js";import{LAMPORTS_PER_SOL as ct}from"@solana/web3.js";import{Connection as Ja,LAMPORTS_PER_SOL as xa}from"@solana/web3.js";import{Keypair as va}from"@solana/web3.js";import{readFile as Ha}from"fs/promises";var Ya=t(async _=>{let e=JSON.parse(await Ha(_,"utf8"));return va.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),kn=Ya;import{homedir as Qa}from"os";var R_;(function(_){_.VALIDATOR="validator",_.AUTH="auth",_.VOTE="vote"})(R_||(R_={}));var qa={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},$a=t(async(_,e="auth",E=!1)=>{let o=new Ja(_),i=Qa(),n=p(i),s=`${E?"testnet":"mainnet"}${qa[e]}`,r=n[s],S=await kn(r),a=await o.getBalance(S.publicKey),c=Number(a)/xa;if(isNaN(c))throw new Error("Failed to get balance");return c},"getBalance"),M_=$a;var Wa=new Vn(3*ct),bn=t(async _=>{let e=await M_(_,R_.VALIDATOR),o=new Vn(Number(Number(e)*ct)).sub(Wa),i=Number(o)/ct;return i=Math.round(i*1e9)/1e9,i},"getHarvestBalance");import ye from"chalk";import{Keypair as Xa,Connection as ja,PublicKey as za,SystemProgram as wn,ComputeBudgetProgram as hE,VersionedTransaction as vn,TransactionMessage as Hn}from"@solana/web3.js";var Yn=t(async(_,e,E,o)=>{let i=0;try{let n=new ja(_,"finalized"),T=Xa.fromSecretKey(new Uint8Array(Array.from(e))),s=new za(E),r=o;for(;;)try{let S=[wn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:r}),hE.setComputeUnitLimit({units:2e5}),hE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],a=await n.getLatestBlockhashAndContext({commitment:"finalized"}),R=new vn(new Hn({instructions:S,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message()),c=await n.simulateTransaction(R,{replaceRecentBlockhash:!0,sigVerify:!1});R.sign([T]);let C=[wn.transfer({fromPubkey:T.publicKey,toPubkey:s,lamports:r}),hE.setComputeUnitLimit({units:c.value.unitsConsumed?Math.trunc(c.value.unitsConsumed*1.2):2e5}),hE.setComputeUnitPrice({microLamports:1e3})],l=new vn(new Hn({instructions:C,payerKey:T.publicKey,recentBlockhash:a.value.blockhash}).compileToV0Message());l.sign([T]);let d=await n.sendRawTransaction(l.serialize());return await n.confirmTransaction({...a.value,signature:d},"finalized"),console.log("finalized signature:",d),d}catch(S){if(i++,i>Ve)throw new Error(JSON.stringify(S));console.log(`solanaTransfer failed, ${i} times retrying... Error: ${S}`),await J(1e3)}}catch(n){throw console.log(`solanaTransfer: ${n}`),new Error(JSON.stringify(n))}},"solanaTransfer");import{readFile as eR}from"fs/promises";import{LAMPORTS_PER_SOL as ER}from"@solana/web3.js";var dt=t(async _=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:E}=p();await M_(_,R_.VOTE)<1?(console.log(ye.white("Vote Account Balance is less than 1 SOL")),console.log(ye.white("Skip withdrawing SOL from Vote Account to Authority Account"))):_R("solv withdraw --all",{shell:!0,stdio:"inherit"});let i=await bn(_);console.log(ye.white(`Transferable Balance: ${i} SOL`));let n=i*ER;if(i<1)console.log(ye.white("Validator Account Balance is less than 1 SOL")),console.log(ye.white("Skip transferring SOL from Validator Account to Authority Account"));else{let T=Za(`solana address --keypair ${e}`).toString().trim(),s=JSON.parse(await eR(E,"utf-8"));await Yn(_,s,T,n)}return!0},"collectSOL");import{readFile as CR}from"fs/promises";import cR from"inquirer";import Nt from"chalk";import{execSync as tR}from"child_process";import{homedir as oR}from"os";var iR=t(async _=>{try{let e=oR(),{mainnetValidatorAuthorityKey:E}=p(e),o=`spl-token balance ${S_} --owner ${E} --url ${_}`,i=tR(o).toString().trim();return Number(i)}catch(e){return console.log(Nt.red(`Error: ${e}`)),console.log(Nt.yellow(`You might need to install the Solana SPL CLI:
6530
+ `)),console.log(Nt.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),Jn=iR;import yE from"chalk";import{Connection as nR,PublicKey as xn,Keypair as TR,ComputeBudgetProgram as BE,VersionedTransaction as Qn,TransactionMessage as qn}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as $n,createTransferInstruction as Wn,TOKEN_PROGRAM_ID as Xn}from"@solana/spl-token";var jn=t(async(_,e,E,o,i,n)=>{try{let T=new nR(_,"finalized"),s=TR.fromSecretKey(new Uint8Array(e)),r=new xn(E),S=new xn(i),a=Math.trunc(o*Math.pow(10,n)),R=await $n(T,s,S,s.publicKey),c=await $n(T,s,S,r,!0);for(;;)try{let C=[Wn(R.address,c.address,s.publicKey,a,[],Xn),BE.setComputeUnitLimit({units:2e5}),BE.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],l=await T.getLatestBlockhashAndContext({commitment:"finalized"}),d=new Qn(new qn({instructions:C,payerKey:s.publicKey,recentBlockhash:l.value.blockhash}).compileToV0Message()),N=await T.simulateTransaction(d,{replaceRecentBlockhash:!0,sigVerify:!1});d.sign([s]);let A=[Wn(R.address,c.address,s.publicKey,a,[],Xn),BE.setComputeUnitLimit({units:N.value.unitsConsumed?Math.trunc(N.value.unitsConsumed*1.2):2e5}),BE.setComputeUnitPrice({microLamports:1e3})],P=new Qn(new qn({instructions:A,payerKey:s.publicKey,recentBlockhash:l.value.blockhash}).compileToV0Message());P.sign([s]);let L=await T.sendRawTransaction(P.serialize());return await T.confirmTransaction({...l.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 gE from"inquirer";import{spawnSync as zn}from"child_process";import Ot from"chalk";import{promises as Zn}from"fs";var sR=t(async(_="epochTimer")=>{try{let e=zn("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Ot.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let o=e.stdout.split(`
6504
6531
  `).filter(n=>!n.includes(_)).join(`
6505
- `),i="/tmp/temp_crontab";await zn.writeFile(i,o,"utf-8"),jn("crontab",[i]),await zn.unlink(i),console.log(Rt.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Rt.red("Error removing cron job:",e))}},"removeCronJob"),Zn=nR;import _T from"chalk";var TR=t(async _=>{let e=_.NETWORK===d.TESTNET,E=await LE.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!E.mevOn)return await rE()&&await Zn(),await m({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6506
- ${_T.green("No more Login to the server to update \u{1F331}")}
6532
+ `),i="/tmp/temp_crontab";await Zn.writeFile(i,o,"utf-8"),zn("crontab",[i]),await Zn.unlink(i),console.log(Ot.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Ot.red("Error removing cron job:",e))}},"removeCronJob"),_T=sR;import eT from"chalk";var rR=t(async _=>{let e=_.NETWORK===O.TESTNET,E=await gE.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 OE()&&await _T(),await h({IS_MEV_MODE:E.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let o=`\u2728 About Auto Update & Restart \u2728
6533
+ ${eT.green("No more Login to the server to update \u{1F331}")}
6507
6534
 
6508
6535
  If you enable this, solv will update automatically when the solv/solana version is updated.
6509
6536
 
@@ -6511,97 +6538,97 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
6511
6538
 
6512
6539
  AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
6513
6540
  \u203B Please turn off if you are using no-downtime migration.
6514
- `;console.log(_T.white(o));let i=await LE.prompt([{type:"confirm",name:"autoUpdate",message:"Do you want to enable AUTO UPDATE? (Recommended)",default:!1},{type:"confirm",name:"autoRestart",message:"Do you want to enable AUTO RESTART?",default:!1}]),n=_.RPC_URL,T="",s=await LE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await LE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await m({HARVEST_ACCOUNT:T,IS_MEV_MODE:E.mevOn,RPC_URL:n,DISCORD_WEBHOOK_URL:s.discordWebhookUrl,AUTO_UPDATE:i.autoUpdate,AUTO_RESTART:i.autoRestart}),!0},"mevOn"),eT=TR;import{spawnSync as CR}from"node:child_process";import{Connection as rR}from"@solana/web3.js";import{Connection as sR}from"@solana/web3.js";var SR=t(async(_,e=10,E=.4)=>{try{let i=await new sR(_).getRecentPerformanceSamples(e);if(i.length===0)return console.warn("No performance samples available. Using fallback slot time."),E;let n=i.filter(s=>s.numSlots!==0);return n.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),E):n.reduce((s,S)=>s+S.samplePeriodSecs/S.numSlots,0)/n.length}catch(o){return console.error(`getAverageSlotTime failed: ${o}. Using fallback slot time.`),E}},"getAverageSlotTime"),ET=SR;var Ct=t(async _=>{try{let E=await new rR(_).getEpochInfo();if(E.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let o=await ET(_);console.log("timePerSlotSeconds",o);let n=(E.slotsInEpoch-E.slotIndex)*o,T=(E.slotIndex/E.slotsInEpoch*100).toFixed(2),s=Math.floor(n/(3600*24)),S=Math.floor(n%(3600*24)/3600),r=Math.floor(n%3600/60),a=Math.floor(n%60),R=`${s}d ${S}h ${r}m ${a}s`;return s===0&&(R=`${S}h ${r}m ${a}s`),{...E,estimatedTimeUntilNextEpoch:R,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var cR=.03,tT=t(_=>{F.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await dR(_),{mainnetValidatorAuthorityKey:E}=u();console.log("Harvesting SOL..."),await rt(_.RPC_URL);let o=await A_(_.RPC_URL,a_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await J(1e3),await rt(_.RPC_URL),o=await A_(_.RPC_URL,a_.VOTE),i++;let n=JSON.parse(await aR(E,"utf-8")),T=await A_(_.RPC_URL,a_.AUTH);if(T<1)console.log(ME.white("Authority Account Balance is less than 1 SOL")),console.log(ME.white("Skip converting SOL to elSOL"));else{let S=T-cR;if(S=Math.round(S*1e9)/1e9,console.log(`Converting ${S} SOL to elSOL`),!await NE(_.RPC_URL,E_,S,n))throw new Error("Failed to convert SOL to elSOL")}let s=await Yn(_.RPC_URL);if(s<1){let S=await Ct(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let r=`elSOL Balance is less than 1 elSOL for ${S.epoch}`;await r_(r),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await Xn(_.RPC_URL,n,e,s,S_,$t),_.IS_MEV_MODE){let r=`\u{1F4B0} Harvested Rewards for ${(await Ct(_.RPC_URL)).epoch} \u{1F4B0}
6515
- Validator Address: ${p(E)}
6541
+ `;console.log(eT.white(o));let i=await gE.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 gE.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:_.DISCORD_WEBHOOK_URL}]);return e?T="":n=(await gE.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:_.RPC_URL}])).rpcUrl,await h({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=rR;import{spawnSync as dR}from"node:child_process";import{Connection as RR}from"@solana/web3.js";import{Connection as SR}from"@solana/web3.js";var aR=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,r)=>s+r.samplePeriodSecs/r.numSlots,0)/n.length}catch(o){return console.error(`getAverageSlotTime failed: ${o}. Using fallback slot time.`),E}},"getAverageSlotTime"),tT=aR;var lt=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 tT(_);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)),r=Math.floor(n%(3600*24)/3600),S=Math.floor(n%3600/60),a=Math.floor(n%60),R=`${s}d ${r}h ${S}m ${a}s`;return s===0&&(R=`${r}h ${S}m ${a}s`),{...E,estimatedTimeUntilNextEpoch:R,displayRatio:T}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var NR=.03,oT=t(_=>{I.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await OR(_),{mainnetValidatorAuthorityKey:E}=p();console.log("Harvesting SOL..."),await dt(_.RPC_URL);let o=await M_(_.RPC_URL,R_.VOTE),i=0;for(;o>1&&i<3;)console.log("Retrying Harvesting SOL..."),await J(1e3),await dt(_.RPC_URL),o=await M_(_.RPC_URL,R_.VOTE),i++;let n=JSON.parse(await CR(E,"utf-8")),T=await M_(_.RPC_URL,R_.AUTH);if(T<1)console.log(yE.white("Authority Account Balance is less than 1 SOL")),console.log(yE.white("Skip converting SOL to elSOL"));else{let r=T-NR;if(r=Math.round(r*1e9)/1e9,console.log(`Converting ${r} SOL to elSOL`),!await fE(_.RPC_URL,t_,r,n))throw new Error("Failed to convert SOL to elSOL")}let s=await Jn(_.RPC_URL);if(s<1){let r=await lt(_.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let S=`elSOL Balance is less than 1 elSOL for ${r.epoch}`;await a_(S),process.exit(0)}if(console.log(`Transferring ${s} elSOL to Harvest Address`),await jn(_.RPC_URL,n,e,s,S_,Zt),_.IS_MEV_MODE){let S=`\u{1F4B0} Harvested Rewards for ${(await lt(_.RPC_URL)).epoch} \u{1F4B0}
6542
+ Validator Address: ${m(E)}
6516
6543
  Total Reward: ${s} elSOL
6517
- Harvest Address: ${e}`;await r_(r)}console.log(ME.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),F.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await eT(_)&&(CR("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(ME.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),dR=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await RR.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:Tt}]);return await m({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as hR}from"@skeet-framework/utils";import{writeFile as NR}from"fs/promises";var OR=t(async _=>{await NR(ve,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),L_=OR;var lR=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await L_({...e,isLessThan1Day:!0})},"isLessThan1Day"),oT=lR;var FR=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await L_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),iT=FR;var IR=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await L_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),nT=IR;var DR=t(async(_,e)=>{let E=e.NETWORK===d.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=u(),T=E?p(n):p(i);await L_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6544
+ Harvest Address: ${e}`;await a_(S)}console.log(yE.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),I.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await ET(_)&&(dR("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(yE.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),OR=t(async _=>{try{let e=_.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let E=await cR.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:Rt}]);return await h({HARVEST_ACCOUNT:E.harvestAddress}),E.harvestAddress}},"getHarvestAddress");import{format as gR}from"@skeet-framework/utils";import{writeFile as lR}from"fs/promises";var FR=t(async _=>{await lR(Je,JSON.stringify({..._},null,2),"utf-8")},"writeEpochDataToFile"),p_=FR;var IR=t(async(_,e,E,o)=>{_<24*60&&_>=8*60&&!e.isLessThan1Day&&await p_({...e,isLessThan1Day:!0})},"isLessThan1Day"),iT=IR;var DR=t(async(_,e,E,o)=>{_<8*60&&_>=60&&!e.isLessThan8Hours&&await p_({...e,isLessThan8Hours:!0})},"lessThan8Hour"),nT=DR;var PR=t(async(_,e,E,o)=>_<60&&!e.isLessThan1Hour?(await p_({...e,isLessThan1Hour:!0}),!0):!1,"lessThan1Hour"),TT=PR;var fR=t(async(_,e)=>{let E=e.NETWORK===O.TESTNET,o={epoch:_.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:i,testnetValidatorKey:n}=p(),T=E?m(n):m(i);await p_(o),console.log("Epoch has been updated!");let s=`===\u23F3 ${_.epoch} \u23F3===
6518
6545
  Validator: ${T}
6519
6546
  Network: ${e.NETWORK}
6520
6547
  CurrentEpoch: ${_.epoch}
6521
6548
  Epoch has been updated!
6522
- Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),TT=DR;import{existsAsync as PR}from"@skeet-framework/utils";import{readFile as fR,writeFile as UR}from"fs/promises";import AR from"chalk";import{homedir as LR}from"os";var MR=t(async()=>{let e=LR().includes("/home/solv")?ve:"./currentEpoch.json";if(await PR(e))return JSON.parse(await fR(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await UR(e,JSON.stringify(E,null,2),"utf-8"),console.log(AR.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),sT=MR;async function uR(_="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${_}`,E=await fetch(e);if(!E.ok)throw new Error(`HTTP error! status: ${E.status}`);return(await E.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${_}:`,e),null}}t(uR,"getNpmLatestVersion");var ST=uR;async function pR(){let _=Q_(),e=await ST();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(pR,"isVersionSame");var rT=pR;import{spawnSync as BR}from"child_process";import{spawnSync as mR}from"node:child_process";var aT=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=mR(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6523
- `),n=i.find(c=>c.includes("Epoch Completed Time:")),T=i.find(c=>c.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),s=Number(i.find(c=>c.includes("Epoch:"))?.replace("Epoch:",""));if(!n||!T||!s)throw new Error("Epoch Completed Time not found");let r=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",r);let a=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,R=r.match(a);if(R){let c=R[1]?parseInt(R[1]):0,C=R[2]?parseInt(R[2]):0,I=R[3]?parseInt(R[3]):0,N=R[4]?parseInt(R[4]):0,O=c*24*60+C*60+I+Math.floor(N/60);return{epoch:s,day:c,hour:C,min:I,sec:N,totalMinutes:O,epochRemainingTime:r,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var gR=t(async _=>{let e=_.NETWORK===d.TESTNET,E=e?He:_.RPC_URL,o=hR(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await sT(),n=aT(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=u(),r=await de(E,p(e?s:T));if(console.log(`Validator is active: ${r.isActive}`),!await rT()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),BR("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await TT(n,_),"Epoch has been updated!";let R=n.totalMinutes,c=[nT,iT,oT];for(let C of c)if(await C(R,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),RT=gR;var CT=t(_=>{F.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await RT(_),process.exit(0)})},"epochTimerCommands");import MT from"inquirer";import{join as OT}from"path";import{spawnSync as te}from"node:child_process";import Z from"chalk";import{spawnSync as yR}from"node:child_process";var KR=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=yR(`ssh -i ${i} -o StrictHostKeyChecking=no solv@${_} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:o});return T.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
6549
+ Until Next Epoch: Approximately 2 days`;return"Epoch has been updated!"},"newEpoch"),sT=fR;import{existsAsync as UR}from"@skeet-framework/utils";import{readFile as AR,writeFile as LR}from"fs/promises";import MR from"chalk";import{homedir as pR}from"os";var uR=t(async()=>{let e=pR().includes("/home/solv")?Je:"./currentEpoch.json";if(await UR(e))return JSON.parse(await AR(e,"utf-8"));let E={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await LR(e,JSON.stringify(E,null,2),"utf-8"),console.log(MR.white("\u2714\uFE0F Initial epoch data has been created!")),E},"initOrReadEpochFile"),rT=uR;async function mR(_="@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(mR,"getNpmLatestVersion");var ST=mR;async function hR(){let _=$_(),e=await ST();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",_),console.log("latestVersion:",e),_===e}t(hR,"isVersionSame");var aT=hR;import{spawnSync as yR}from"child_process";import{spawnSync as BR}from"node:child_process";var RT=t(_=>{try{let e=`solana epoch-info --url '${_}'`,{stdout:E}=BR(e,{shell:!0,stdio:"pipe"}),i=E.toString().split(`
6550
+ `),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 S=n.split("(")[1].replace(" remaining)","");console.log("remainingTime:",S);let a=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,R=S.match(a);if(R){let c=R[1]?parseInt(R[1]):0,C=R[2]?parseInt(R[2]):0,l=R[3]?parseInt(R[3]):0,d=R[4]?parseInt(R[4]):0,N=c*24*60+C*60+l+Math.floor(d/60);return{epoch:s,day:c,hour:C,min:l,sec:d,totalMinutes:N,epochRemainingTime:S,epochCompletedPercent:T}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var KR=t(async _=>{let e=_.NETWORK===O.TESTNET,E=e?xe:_.RPC_URL,o=gR(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${o}`);let i=await rT(),n=RT(E),{mainnetValidatorVoteKey:T,testnetValidatorVoteKey:s}=p(),S=await Oe(E,m(e?s:T));if(console.log(`Validator is active: ${S.isActive}`),!await aT()&&_.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),yR("solv update && solv update --config && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(i.epoch<n.epoch)return await sT(n,_),"Epoch has been updated!";let R=n.totalMinutes,c=[TT,nT,iT];for(let C of c)if(await C(R,i,n,_))break;return"Epoch has not been changed!"},"epochTimer"),CT=KR;var cT=t(_=>{I.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await CT(_),process.exit(0)})},"epochTimerCommands");import pT from"inquirer";import{join as lT}from"path";import{spawnSync as ie}from"node:child_process";import __ from"chalk";import{spawnSync as GR}from"node:child_process";var kR=t((_,e,E,o="pipe",i="~/.ssh/id_rsa")=>{let n;try{let T=GR(`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
6551
  $ ssh solv@${_}
6525
6552
 
6526
- Failed Cmd: ${e}`),n={status:T.status,stdout:String(T.stdout),stderr:T.stderr.toString()},n):(n={status:T.status,stdout:T.stdout.toString(),stderr:T.stderr.toString()},n)}catch(T){return console.log(`scpSSH Error: ${T}`),n={status:null,stdout:"",stderr:String(T)},n}},"scpSSH"),uE=KR;import cT from"chalk";var GR=t((_,e,E)=>{console.log(cT.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=p(_).trim(),i=uE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(cT.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6553
+ 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"),KE=kR;import dT from"chalk";var VR=t((_,e,E)=>{console.log(dT.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let o=m(_).trim(),i=KE(e,`solana-keygen pubkey ${_}`,E).stdout.toString().trim();return o!==i?(console.log(dT.yellow(`\u26A0\uFE0F Destination Identity Key is different.
6527
6554
  Please check your Validator
6528
6555
  $ ssh ${E}@${e}
6529
6556
 
6530
6557
  Local Identity Key: ${o}
6531
- Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),ee=GR;var kR="agave-validator -l /mnt/ledger",VR="sudo fdctl",bR="--config /home/solv/firedancer/config.toml ",wR=t(_=>_==="agave"?[kR,""]:[VR,bR],"getSolanaCLIActive"),Ee=wR;var dT="agave-validator -l /mnt/ledger",vR=t(()=>{try{return dT}catch(_){return console.error(_),dT}},"getSolanaCLIAgave"),pE=vR;import ct from"chalk";var mE=t(async(_,e)=>{try{console.log(ct.white("\u{1F50D} Detecting client type from remote configuration..."));let E=uE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:l.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case l.AGAVE:n="agave";break;case l.FRANKENDANCER:n="frankendancer";break;case l.JITO:n="agave";break;default:n="agave"}return console.log(ct.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(ct.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:l.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as HR}from"fs/promises";import dt from"chalk";import{existsSync as YR}from"fs";var hE=t(async()=>{try{console.log(dt.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!YR(_))return{client:"agave",validatorType:l.AGAVE,success:!1,error:"Local configuration file not found"};let e=await HR(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case l.AGAVE:i="agave";break;case l.FRANKENDANCER:i="frankendancer";break;case l.JITO:i="agave";break;default:i="agave"}return console.log(dt.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(dt.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:l.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var BE=OT(G,p_),NT=OT(G,u_),lT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===d.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;T&&(s=g);let S=await hE(),r=await mE(_,o),a=S.success?S.client:"agave",R=r.success?r.client:"agave";console.log(Z.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=Ee(a),[I,N]=Ee(R),O=pE();if(!ee(s,_,o))return;if(i){console.log(Z.white("\u{1F7E2} Waiting for restart window..."));let se=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(te(se,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6558
+ Destination Identity Key: ${i}`)),!1):!0},"checkValidatorKey"),te=VR;var bR="agave-validator -l /mnt/ledger",wR="sudo fdctl",vR="--config /home/solv/firedancer/config.toml ",HR=t(_=>_==="agave"?[bR,""]:[wR,vR],"getSolanaCLIActive"),oe=HR;var NT="agave-validator -l /mnt/ledger",YR=t(()=>{try{return NT}catch(_){return console.error(_),NT}},"getSolanaCLIAgave"),GE=YR;import Ft from"chalk";var kE=t(async(_,e)=>{try{console.log(Ft.white("\u{1F50D} Detecting client type from remote configuration..."));let E=KE(_,"cat /home/solv/solv4.config.json",e,"pipe");if(E.status!==0)return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Could not read remote configuration file"};let i=JSON.parse(E.stdout).VALIDATOR_TYPE,n;switch(i){case F.AGAVE:n="agave";break;case F.FRANKENDANCER:n="frankendancer";break;case F.JITO:n="agave";break;default:n="agave"}return console.log(Ft.green(`\u2705 Detected remote client type: ${n} (${i})`)),{client:n,validatorType:i,success:!0}}catch(E){return console.log(Ft.yellow(`\u26A0\uFE0F Could not auto-detect client type: ${E}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(E)}}},"getRemoteClientType");import{readFile as JR}from"fs/promises";import It from"chalk";import{existsSync as xR}from"fs";var VE=t(async()=>{try{console.log(It.white("\u{1F50D} Detecting local client type from configuration..."));let _="/home/solv/solv4.config.json";if(!xR(_))return{client:"agave",validatorType:F.AGAVE,success:!1,error:"Local configuration file not found"};let e=await JR(_,"utf-8"),o=JSON.parse(e).VALIDATOR_TYPE,i;switch(o){case F.AGAVE:i="agave";break;case F.FRANKENDANCER:i="frankendancer";break;case F.JITO:i="agave";break;default:i="agave"}return console.log(It.green(`\u2705 Detected local client type: ${i} (${o})`)),{client:i,validatorType:o,success:!0}}catch(_){return console.log(It.yellow(`\u26A0\uFE0F Could not auto-detect local client type: ${_}`)),{client:"agave",validatorType:F.AGAVE,success:!1,error:String(_)}}},"getLocalClientType");var bE=lT(G,h_),OT=lT(G,m_),FT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===O.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?u:w;T&&(s=u);let r=await VE(),S=await kE(_,o),a=r.success?r.client:"agave",R=S.success?S.client:"agave";console.log(__.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=oe(a),[l,d]=oe(R),N=GE();if(!te(s,_,o))return;if(i){console.log(__.white("\u{1F7E2} Waiting for restart window..."));let Se=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${N} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(ie(Se,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6532
6559
  $ ssh ${o}@${_}
6533
6560
 
6534
- Failed Cmd: ${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(Z.white("\u{1F7E2} Setting identity on the remote validator..."));let P=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${I} set-identity ${N}${BE}'`;if(te(P,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6561
+ Failed Cmd: ${N} 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 P=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${l} set-identity ${d}${bE}'`;if(ie(P,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6535
6562
  $ ssh ${o}@${_}
6536
6563
 
6537
- Failed Cmd: ${I} set-identity ${N}${BE}`));return}if(console.log(Z.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),te(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${BE} ${NT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6564
+ Failed Cmd: ${l} set-identity ${d}${bE}`));return}if(console.log(__.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ie(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${bE} ${OT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6538
6565
  $ ssh ${o}@${_}
6539
6566
 
6540
- Failed Cmd: ln -sf ${BE} ${NT}`));return}if(console.log(Z.white("\u{1F7E2} Uploading the tower file to the new validator...")),te(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6567
+ Failed Cmd: ln -sf ${bE} ${OT}`));return}if(console.log(__.white("\u{1F7E2} Uploading the tower file to the new validator...")),ie(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6541
6568
  $ ssh ${o}@${_}
6542
6569
 
6543
- Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(Z.white("\u{1F7E2} Setting identity on the local validator...")),te(`${c} set-identity ${C}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6570
+ Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(__.white("\u{1F7E2} Setting identity on the local validator...")),ie(`${c} set-identity ${C}--require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6544
6571
 
6545
6572
  Failed Cmd: ${c} set-identity ${C}${s}
6546
- ln -sf ${s} ${U}`));return}if(te(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(Z.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6573
+ ln -sf ${s} ${U}`));return}if(ie(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(__.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6547
6574
 
6548
- Failed Cmd: ln -sf ${s} ${U}`));return}console.log(Z.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as DT}from"path";import Q from"chalk";import{spawnSync as oe}from"node:child_process";var FT=DT(G,p_),JR=DT(G,u_),IT="~/.ssh/id_rsa",PT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===d.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;T&&(s=g);let S=await hE(),r=await mE(_,o),a=S.success?S.client:"agave",R=r.success?r.client:"agave";console.log(Q.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=Ee(a),[I,N]=Ee(R),O=pE();if(!ee(s,_,o))return;let P=`${O} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,L=`${c} set-identity ${C}${FT}`,R_=`ln -sf ${FT} ${JR}`,M_=`scp ${f}/tower-1_9-${e}.bin ${o}@${_}:${f}`,C_=`${I} set-identity ${N}--require-tower ${s}`,Te=`ln -sf ${s} ${U}`;if(i&&(console.log(Q.white("\u{1F7E2} Waiting for restart window...")),oe(P,{shell:!0,stdio:"inherit"}).status!==0)){console.log(Q.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6575
+ Failed Cmd: ln -sf ${s} ${U}`));return}console.log(__.white("\u{1F7E2} Identity changed successfully!")),await h({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as PT}from"path";import q from"chalk";import{spawnSync as ne}from"node:child_process";var IT=PT(G,h_),QR=PT(G,m_),DT="~/.ssh/id_rsa",fT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===O.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?u:w;T&&(s=u);let r=await VE(),S=await kE(_,o),a=r.success?r.client:"agave",R=S.success?S.client:"agave";console.log(q.green(`\u2705 Local client: ${a}, Remote client: ${R}`));let[c,C]=oe(a),[l,d]=oe(R),N=GE();if(!te(s,_,o))return;let P=`${N} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,L=`${c} set-identity ${C}${IT}`,C_=`ln -sf ${IT} ${QR}`,u_=`scp ${f}/tower-1_9-${e}.bin ${o}@${_}:${f}`,c_=`${l} set-identity ${d}--require-tower ${s}`,re=`ln -sf ${s} ${U}`;if(i&&(console.log(q.white("\u{1F7E2} Waiting for restart window...")),ne(P,{shell:!0,stdio:"inherit"}).status!==0)){console.log(q.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6549
6576
 
6550
- Failed Cmd: ${P}`));return}if(console.log(Q.white("\u{1F7E2} Setting identity on the new validator...")),oe(L,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6577
+ Failed Cmd: ${P}`));return}if(console.log(q.white("\u{1F7E2} Setting identity on the new validator...")),ne(L,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6551
6578
 
6552
- Failed Cmd: ${L}`));return}if(console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),oe(R_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6579
+ Failed Cmd: ${L}`));return}if(console.log(q.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ne(C_,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6553
6580
 
6554
- Failed Cmd: ${R_}`));return}if(console.log(Q.white("\u{1F7E2} Uploading the tower file to the new validator...")),oe(M_,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6581
+ Failed Cmd: ${C_}`));return}if(console.log(q.white("\u{1F7E2} Uploading the tower file to the new validator...")),ne(u_,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your Validator
6555
6582
 
6556
- Failed Cmd: ${M_}`));return}console.log(Q.white("\u{1F7E2} Setting identity on the new validator..."));let YT=`ssh -i ${IT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${C_}'`;oe(YT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(Q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6583
+ Failed Cmd: ${u_}`));return}console.log(q.white("\u{1F7E2} Setting identity on the new validator..."));let JT=`ssh -i ${DT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${c_}'`;ne(JT,{shell:!0,stdio:"inherit"}).status!==0&&console.log(q.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
6557
6584
  $ ssh ${o}@${_}
6558
6585
 
6559
- Failed Cmd: ${C_}`)),console.log(Q.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let JT=`ssh -i ${IT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${Te}'`;if(oe(JT,{shell:!0,stdio:"inherit"}).status!==0){console.log(Q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6586
+ Failed Cmd: ${c_}`)),console.log(q.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let xT=`ssh -i ${DT} -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${re}'`;if(ne(xT,{shell:!0,stdio:"inherit"}).status!==0){console.log(q.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
6560
6587
 
6561
- Failed Cmd: ${Te}`));return}console.log(Q.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as xR}from"node:child_process";function fT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return xR(E,{shell:!0,stdio:"inherit"}).status===0}t(fT,"checkSSHConnection");import Be from"chalk";import{join as AT}from"path";import{spawnSync as ie}from"node:child_process";import e_ from"chalk";var gE=AT(G,p_),UT=AT(G,u_),LT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===d.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?g:b;if(T&&(s=g),!ee(s,_,o))return;let r=Dt,a=Pt;if(i){console.log(e_.white("\u{1F7E2} Waiting for restart window..."));let A=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(ie(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6588
+ Failed Cmd: ${re}`));return}console.log(q.white("\u{1F7E2} Identity changed successfully!")),await h({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as qR}from"node:child_process";function UT(_,e){let E=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${_} exit`;return qR(E,{shell:!0,stdio:"inherit"}).status===0}t(UT,"checkSSHConnection");import Ke from"chalk";import{join as LT}from"path";import{spawnSync as Te}from"node:child_process";import E_ from"chalk";var wE=LT(G,h_),AT=LT(G,m_),MT=t(async(_,e,E,o,i=!0)=>{let n=E.NETWORK===O.TESTNET,T=E.NODE_TYPE===D.RPC,s=n?u:w;if(T&&(s=u),!te(s,_,o))return;let S=Lt,a=Mt;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 && ${S} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Te(A,{shell:!0,stdio:"inherit"}).status!==0){console.log(E_.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
6562
6589
  $ ssh ${o}@${_}
6563
6590
 
6564
- Failed Cmd: ${r} -l ${f} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}}console.log(e_.white("\u{1F7E2} Setting identity on the new validator..."));let R=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ${r} -l ${f} set-identity ${gE}'`;if(ie(R,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6591
+ Failed Cmd: ${S} -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 && ${S} -l ${f} set-identity ${wE}'`;if(Te(R,{shell:!0,stdio:"inherit"}).status!==0){console.log(E_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6565
6592
  $ ssh ${o}@${_}
6566
6593
 
6567
- Failed Cmd: ${r} -l ${f} set-identity ${gE}`));return}if(console.log(e_.white("\u{1F7E2} Changing the Symlink to the new validator keypair...")),ie(`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ${o}@${_} -p 22 'cd ~ && source ~/.profile && ln -sf ${gE} ${UT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6594
+ Failed Cmd: ${S} -l ${f} set-identity ${wE}`));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 ${wE} ${AT}'`,{shell:!0,stdio:"inherit"}).status!==0){console.log(E_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6568
6595
  $ ssh ${o}@${_}
6569
6596
 
6570
- Failed Cmd: ln -sf ${gE} ${UT}`));return}if(console.log(e_.white("\u{1F7E2} Uploading the tower file to the new validator...")),ie(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6597
+ Failed Cmd: ln -sf ${wE} ${AT}`));return}if(console.log(E_.white("\u{1F7E2} Uploading the tower file to the new validator...")),Te(`scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(E_.yellow(`\u26A0\uFE0F Upload Tower File Failed. Please check your tower file
6571
6598
  $ ssh ${o}@${_}
6572
6599
 
6573
- Failed Cmd: scp ${o}@${_}:${f}/tower-1_9-${e}.bin ${f}`));return}if(console.log(e_.white("\u{1F7E2} Setting identity on the new validator...")),ie(`${a} -l ${f} set-identity --require-tower ${s}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
6600
+ 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...")),Te(`${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
6601
 
6575
6602
  Failed Cmd: ${a} -l ${f} set-identity ${s}
6576
- ln -sf ${s} ${U}`));return}if(ie(`ln -sf ${s} ${U}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(e_.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
6603
+ ln -sf ${s} ${U}`));return}if(Te(`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
6604
 
6578
- Failed Cmd: ln -sf ${s} ${U}`));return}console.log(e_.white("\u{1F7E2} Identity changed successfully!")),await m({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var QR=["Incoming","Outgoing"],uT=t(async(_,e)=>{_.command("switch").option("--ip <ip>","IP Address of the New Validator","").option("--switchType <switchType>","Switch Type","").option("--v2-migrate-incoming","Switch V1 to V2 Incoming",!1).option("--user <user>","SSH User","solv").option("--unsafe","Switch without waiting for a restart window",!1).description("Switch Validator Identity with No Downtime").action(async E=>{try{let o=e.NETWORK===d.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?g:b;i&&(T=g);let s=E.user,S=p(T),r=E.switchType,a=E.ip;if(r===""||a===""||s===""){let c=await MT.prompt([{name:"switchType",type:"list",message:"Which switch type do you want to perform?",choices:["Incoming","Outgoing"]},{name:"ip",type:"input",message:"What is the IP address of the new validator?",default(){return"1.1.1.1"}},{name:"user",type:"list",message:"Which user would you want to SSH as?",choices:["solv"]}]);r=c.switchType,a=c.ip,s=c.user}if(!QR.includes(r)){console.log(Be.yellow(`\u26A0\uFE0F Invalid Switch Type
6579
- You can choose only Incoming or Outgoing`));return}if(!fT(a,s)){console.log("SSH Connection Failed");return}if(r==="Incoming"){if(E.v2MigrateIncoming){(await MT.prompt([{name:"confirm",type:"confirm",message:"Are you sure you want to migrate V1 to V2 Incoming? This node must be running V2 and the remote node must be running V1."}])).confirm||(console.log(Be.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Be.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await LT(a,S,e,s,n);return}await lT(a,S,e,s,n)}else await PT(a,S,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Be.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Be.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as qR}from"node:child_process";var $R=t((_="306450862",e=f,E=i_)=>{try{let o=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${E} --hard-fork ${_} -- ${_} ${e}`;console.log("Parameters to createSnapshot:",_,e,E),console.log("Command:",o);let i=qR(o,{shell:!0,stdio:"pipe",cwd:e});if(i.status!==0)throw new Error(`createSnapshot: ${i.error}`)}catch(o){throw new Error(`createSnapshot: ${o}`)}},"createSnapshot"),pT=$R;import ne from"inquirer";import tC from"dotenv";import V_ from"chalk";var yE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:GE,associationAccount:"",decimal:9},JitoSOL:{tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSOL:{tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSOL:{tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},EPCT:{tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUP:{tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},BONK:{tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},JTO:{tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}},Nt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Ge,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:ke,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:GE,associationAccount:"",decimal:9},J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:{symbol:"jitoSOL",tokenMint:"J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",associationAccount:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",decimal:9},mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:{symbol:"mSOL",tokenMint:"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",associationAccount:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",decimal:9},bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:{symbol:"bSOL",tokenMint:"bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",associationAccount:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",decimal:9},CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:{symbol:"EPCT",tokenMint:"CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",associationAccount:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",decimal:6},JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:{symbol:"JUP",tokenMint:"JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",associationAccount:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",decimal:6},DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:{symbol:"BONK",tokenMint:"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",associationAccount:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",decimal:5},jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:{symbol:"JTO",tokenMint:"jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL",associationAccount:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo",decimal:9}};import{readFile as jR}from"fs/promises";import{Connection as zR,Keypair as ZR,VersionedTransaction as _C}from"@solana/web3.js";import q from"chalk";import eC from"inquirer";import EC from"dotenv";var WR=t(async(_,e,E,o,i)=>{try{let n=`${_}/quote?inputMint=${E}&outputMint=${o}&amount=${i}`,T=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return T.status===429?"Too many requests, please try again later":T.status===401?"Unauthorized, please check your API key":await T.json()}catch(n){throw new Error(`Error getJupiterQuote: ${n}`)}},"getJupiterQuote"),mT=WR;var XR=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=pt[i];T?n={swapRequest:{quoteResponse:E,userPublicKey:o,feeAccount:T,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:n={swapRequest:{quoteResponse:E,userPublicKey:o,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let s=`${_}/swap`,S=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(n.swapRequest)});return S.status===429?"Too many requests, please try again later":await S.json()}catch(i){throw new Error(`Error postJupiterSwap: ${i}`)}},"postJupiterSwap"),hT=XR;EC.config();var BT=t(async(_,e,E,o,i,n,T,s=!0)=>{let S=new zR(_,"confirmed"),r=await mT(e,E,i,n,T);if(typeof r=="string"){r.includes("Unauthorized")&&(console.error(q.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6580
- `)),console.log(q.white("Get Your API key \u{1F447}")),console.log(q.white(Se+`
6581
- `)),process.exit(0));let C_=`${q.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6605
+ Failed Cmd: ln -sf ${s} ${U}`));return}console.log(E_.white("\u{1F7E2} Identity changed successfully!")),await h({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var $R=["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===O.TESTNET,i=e.NODE_TYPE===D.RPC,n=E.unsafe===!1,T=o?u:w;i&&(T=u);let s=E.user,r=m(T),S=E.switchType,a=E.ip;if(S===""||a===""||s===""){let c=await pT.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"]}]);S=c.switchType,a=c.ip,s=c.user}if(!$R.includes(S)){console.log(Ke.yellow(`\u26A0\uFE0F Invalid Switch Type
6606
+ You can choose only Incoming or Outgoing`));return}if(!UT(a,s)){console.log("SSH Connection Failed");return}if(S==="Incoming"){if(E.v2MigrateIncoming){(await pT.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(Ke.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(Ke.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await MT(a,r,e,s,n);return}await FT(a,r,e,s,n)}else await fT(a,r,e,s,n);process.exit(0)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(Ke.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(Ke.red(`Switch Error: ${o.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as WR}from"node:child_process";var XR=t((_="306450862",e=f,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=WR(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"),mT=XR;import se from"inquirer";import iC from"dotenv";import H_ from"chalk";var vE={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:YE,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}},Dt={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:be,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:we,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:YE,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 ZR}from"fs/promises";import{Connection as _C,Keypair as eC,VersionedTransaction as EC}from"@solana/web3.js";import $ from"chalk";import tC from"inquirer";import oC from"dotenv";var jR=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"),hT=jR;var zR=t(async(_,e,E,o)=>{try{let i=E.outputMint,n,T=yt[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`,r=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(n.swapRequest)});return r.status===429?"Too many requests, please try again later":await r.json()}catch(i){throw new Error(`Error postJupiterSwap: ${i}`)}},"postJupiterSwap"),BT=zR;oC.config();var gT=t(async(_,e,E,o,i,n,T,s=!0)=>{let r=new _C(_,"confirmed"),S=await hT(e,E,i,n,T);if(typeof S=="string"){S.includes("Unauthorized")&&(console.error($.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6607
+ `)),console.log($.white("Get Your API key \u{1F447}")),console.log($.white(ae+`
6608
+ `)),process.exit(0));let c_=`${$.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6582
6609
 
6583
6610
  You can upgrade your API key to increase your rate limits.
6584
6611
  Get Your API key \u{1F447}
6585
- Validators Solutions: ${Se}
6586
- `;console.error(q.white(C_)),process.exit(0)}let a=Nt[i],R=Nt[n],c=`\u{1F504} Swap Quote \u{1F504}
6612
+ Validators Solutions: ${ae}
6613
+ `;console.error($.white(c_)),process.exit(0)}let a=Dt[i],R=Dt[n],c=`\u{1F504} Swap Quote \u{1F504}
6587
6614
 
6588
6615
  - \u{1F3E6} Input Token: ${a.symbol} (${i})
6589
6616
  - \u{1F4B0} Input Amount: ${T/Math.pow(10,a.decimal)} ${a.symbol}
6590
6617
 
6591
6618
  - \u{1F3E6} Output Token: ${R.symbol} (${n})
6592
- - \u{1F4B0} Output Amount: ${Number(r?.outAmount)/Math.pow(10,R.decimal)} ${R.symbol}
6619
+ - \u{1F4B0} Output Amount: ${Number(S?.outAmount)/Math.pow(10,R.decimal)} ${R.symbol}
6593
6620
 
6594
6621
  \u203B This quote is based on the current market rate and may change before the swap is completed.
6595
- `;console.log(q.white(c)),console.log(q.gray(`You can also swap using the following command:
6622
+ `;console.log($.white(c)),console.log($.gray(`You can also swap using the following command:
6596
6623
  $ solv swap --input ${i} --output ${n} --amount ${T} --skip-confirm
6597
- `));let C=!1;s?C=(await eC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log(q.cyan("Skipping confirmation...")),C=!0),C||(console.log(q.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),r||process.exit(0);let I=JSON.parse(await jR(o,"utf8")),N=ZR.fromSecretKey(new Uint8Array(Array.from(I))),O=await hT(e,E,r,N.publicKey.toString());if(typeof O=="string"){O.includes("Unauthorized")&&(console.error(q.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6598
- `)),console.log(q.white("Get Your API key \u{1F447}")),console.log(q.white(Se+`
6599
- `)),process.exit(0));let C_=`${q.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6624
+ `));let C=!1;s?C=(await tC.prompt([{type:"confirm",name:"confirm",message:"Do you want to proceed with the swap?",default:!1}])).confirm:(console.log($.cyan("Skipping confirmation...")),C=!0),C||(console.log($.yellow("\u26A0\uFE0F Swap cancelled")),process.exit(0)),S||process.exit(0);let l=JSON.parse(await ZR(o,"utf8")),d=eC.fromSecretKey(new Uint8Array(Array.from(l))),N=await BT(e,E,S,d.publicKey.toString());if(typeof N=="string"){N.includes("Unauthorized")&&(console.error($.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
6625
+ `)),console.log($.white("Get Your API key \u{1F447}")),console.log($.white(ae+`
6626
+ `)),process.exit(0));let c_=`${$.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
6600
6627
 
6601
6628
  You can upgrade your API key to increase your rate limits.
6602
6629
  Get Your API key \u{1F447}
6603
- Validators Solutions: ${Se}
6604
- `;console.error(q.white(C_)),process.exit(0)}let A=Buffer.from(O.swapTransaction,"base64"),P=_C.deserialize(A);P.sign([N]);let L=P.serialize(),R_=await S.sendRawTransaction(L,{skipPreflight:!0,maxRetries:2}),M_=P.message.recentBlockhash;return console.log(`Swapping...
6605
- Transaction ID: ${R_}`),await S.confirmTransaction({blockhash:M_,lastValidBlockHeight:O.lastValidBlockHeight,signature:R_},"confirmed"),R_},"swap");tC.config();var gT=t(async(_,e)=>{_.command("swap").description("Swap tokens").option("-i, --input <input>","Input token mint","").option("-o, --output <output>","Output token mint","").option("-a, --amount <amount>","Input amount in lamports","0").option("-s, --skip-confirm","Skip confirmation",!1).option("-c, --init-config","Initialize config",!1).action(async E=>{try{await oC(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,E.input,E.output,Number(E.amount),!E.skipConfirm,E.initConfig)}catch(o){o.message.includes("User force closed the prompt")&&(console.error(V_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(V_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),oC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(V_.white("Solana RPC URL:",_)),console.log(V_.white("KeyfilePath:",e)),(!e||e===""||s)&&await iC();let S=Lt,r=[...Mt,"Other"],a=o,R="",c=i,C=n;if(a===""){let O=await ne.prompt([{type:"list",name:"name",message:"Select input mint",choices:r,default:Ge}]);O.name==="Other"?a=(await ne.prompt([{type:"input",name:"address",message:"Enter input mint address",default:ke}])).address:(R=O.name,a=yE[R].tokenMint)}if(c===""){r=r.filter(P=>P!==R);let O=await ne.prompt([{type:"list",name:"name",message:"Select output mint",choices:r}]);if(O.name==="Other")c=(await ne.prompt([{type:"input",name:"address",message:"Enter output mint address",default:S_}])).address;else{let P=O.name;c=yE[P].tokenMint}let A=O.name;c=yE[A].tokenMint}if(C===0){let O=await ne.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);C=Number(O.amount)}let N=await BT(_,S,!E||E===""?ut:E,e,a,c,C,T);N||process.exit(0),console.log(V_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(V_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${N}`))},"swapCmd");var iC=t(async()=>{let _=await ne.prompt([{type:"input",name:"RPC_URL",message:"Enter Solana RPC URL",default:"https://api.mainnet-beta.solana.com"},{type:"input",name:"KEYPAIR_PATH",message:"Enter Keypair Path",default:"/home/solv/mainnet-validator-keypair.json"},{type:"input",name:"API_KEY",message:"Enter Jupiter API Key(Optional)",default:""}]);await m(_),console.log(V_.green(`\u2714\uFE0E Config Updated Successfully!
6606
- `)),K_()},"askForConfig");import{spawnSync as nC}from"node:child_process";var yT=t(()=>{nC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as TC}from"node:child_process";var KT=t(()=>{TC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as sC}from"node:child_process";var GT=t(()=>{sC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as SC}from"node:child_process";var kT=t(()=>{SC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as rC}from"node:child_process";var VT=t((_=!1)=>{rC(_?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as aC}from"node:child_process";var bT=t(()=>{aC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var wT=t(()=>{let _=F.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{yT()}),_.command("start").description("Start Jupiter").action(()=>{KT()}),_.command("stop").description("Stop Jupiter").action(()=>{GT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{VT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{kT()}),_.command("enable").description("Enable Jupiter").action(()=>{bT()})},"jupiterCommands");import dC from"chalk";import{spawnSync as RC}from"node:child_process";var CC=t(()=>{let{stdout:_}=RC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),vT=CC;var F=new cC;F.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(ge,"-V","Display version");async function NC(){try{let _=await V();pi(_),gi(_),hi(_),$i(_),fo(_),Ao(),yi(_),Cn(_),On(_),qi(),ki(),Li(_),bo(_),Ki(),Un(),Bn(_),Kn(_),tT(_),ui(),gT(F,_),CT(_),uT(F,_),wT(),Mn(_),F.command("rm:log").description("Remove Logs").action(()=>{IE()}),F.command("rm:snapshot").description("Remove Snapshot").action(()=>{un(_)}),F.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",_.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",_.SNAPSHOTS_PATH).action(e=>{console.log(dC.white("\u{1F4DD} Creating Snapshot...")),pT(e.slot,e.ledger,e.snapshots)}),F.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{pn(_)}),F.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{mn()}),F.command("config").description("Show Solv Config").action(()=>{FE(_)}),F.command("vv").description("Show Solv Version").action(()=>{let e=vT();console.log("version:",e)}),await F.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(_){console.log(_),process.exit(0)}}t(NC,"main");NC();export{F as program};
6630
+ Validators Solutions: ${ae}
6631
+ `;console.error($.white(c_)),process.exit(0)}let A=Buffer.from(N.swapTransaction,"base64"),P=EC.deserialize(A);P.sign([d]);let L=P.serialize(),C_=await r.sendRawTransaction(L,{skipPreflight:!0,maxRetries:2}),u_=P.message.recentBlockhash;return console.log(`Swapping...
6632
+ Transaction ID: ${C_}`),await r.confirmTransaction({blockhash:u_,lastValidBlockHeight:N.lastValidBlockHeight,signature:C_},"confirmed"),C_},"swap");iC.config();var yT=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 nC(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(H_.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(H_.red(`Swap Error: ${o.message}`)),process.exit(0)}})},"swapCommand"),nC=t(async(_,e,E,o="",i="",n=0,T=!0,s=!1)=>{console.log(H_.white("Solana RPC URL:",_)),console.log(H_.white("KeyfilePath:",e)),(!e||e===""||s)&&await TC();let r=ht,S=[...Bt,"Other"],a=o,R="",c=i,C=n;if(a===""){let N=await se.prompt([{type:"list",name:"name",message:"Select input mint",choices:S,default:be}]);N.name==="Other"?a=(await se.prompt([{type:"input",name:"address",message:"Enter input mint address",default:we}])).address:(R=N.name,a=vE[R].tokenMint)}if(c===""){S=S.filter(P=>P!==R);let N=await se.prompt([{type:"list",name:"name",message:"Select output mint",choices:S}]);if(N.name==="Other")c=(await se.prompt([{type:"input",name:"address",message:"Enter output mint address",default:S_}])).address;else{let P=N.name;c=vE[P].tokenMint}let A=N.name;c=vE[A].tokenMint}if(C===0){let N=await se.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);C=Number(N.amount)}let d=await gT(_,r,!E||E===""?gt:E,e,a,c,C,T);d||process.exit(0),console.log(H_.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(H_.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${d}`))},"swapCmd");var TC=t(async()=>{let _=await se.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 h(_),console.log(H_.green(`\u2714\uFE0E Config Updated Successfully!
6633
+ `)),b_()},"askForConfig");import{spawnSync as sC}from"node:child_process";var KT=t(()=>{sC("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as rC}from"node:child_process";var GT=t(()=>{rC("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as SC}from"node:child_process";var kT=t(()=>{SC("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as aC}from"node:child_process";var VT=t(()=>{aC("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as RC}from"node:child_process";var bT=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 CC}from"node:child_process";var wT=t(()=>{CC("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var vT=t(()=>{let _=I.command("jupiter").description("Jupiter API Commands");_.command("status").description("Show Jupiter Status").action(()=>{KT()}),_.command("start").description("Start Jupiter").action(()=>{GT()}),_.command("stop").description("Stop Jupiter").action(()=>{kT()}),_.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{bT(e.error),process.exit(0)}),_.command("restart").description("Restart Jupiter").action(()=>{VT()}),_.command("enable").description("Enable Jupiter").action(()=>{wT()})},"jupiterCommands");import OC from"chalk";import{spawnSync as cC}from"node:child_process";var dC=t(()=>{let{stdout:_}=cC("solana --version",{shell:!0});return(_?String(_):"Unknown").trim()},"getSolanaVersion"),HT=dC;var I=new NC;I.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(Ge,"-V","Display version");async function lC(){try{let _=await b();mi(_),yi(_),Bi(_),Wi(_),go(_),Ko(),Ki(_),cn(_),ln(_),$i(),Vi(),Mi(_),mo(_),Gi(),An(),gn(_),Gn(_),oT(_),ui(),yT(I,_),cT(_),uT(I,_),vT(),pn(_),I.command("rm:log").description("Remove Logs").action(()=>{ME()}),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(OC.white("\u{1F4DD} Creating Snapshot...")),mT(e.slot,e.ledger,e.snapshots)}),I.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{mn(_)}),I.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{hn()}),I.command("config").description("Show Solv Config").action(()=>{LE(_)}),I.command("vv").description("Show Solv Version").action(()=>{let e=HT();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(lC,"main");lC();export{I as program};
6607
6634
  //# sourceMappingURL=index.js.map