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