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