@gabrielhicks/solv 4.8.35 → 4.8.37
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 +33 -33
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var ii=Object.defineProperty;var r=(t,e)=>ii(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as Rd}from"commander";var Fo="4.8.35";var Yo={name:"@gabrielhicks/solv",version:Fo,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"}};var de=Yo.version;var jt="https://validators.solutions";var ue="solv4.config.json";var St="identity.json",yt="unstaked-identity.json",jo="relayer-keypair.json",li="mainnet-validator-keypair.json",mi="mainnet-vote-account-keypair.json",pi="mainnet-authority-keypair.json",di="testnet-validator-keypair.json",ui="testnet-vote-account-keypair.json",fi="testnet-authority-keypair.json",C="/home/solv",k=`${C}/${St}`,Vd=`${C}/${yt}`,D=`${C}/${li}`,fe=`${C}/${mi}`,$d=`${C}/${pi}`,I=`${C}/${di}`,Bo=`${C}/${ui}`,Dd=`${C}/${fi}`,q=`${C}/solana-validator.log`,Q=C+"/start-validator.sh",T="/mnt/ledger",Rt="/mnt/accounts",X="/mnt/snapshots",Jo="solana-validator",Go="agave-validator",zo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var he=3,Wo="https://api.testnet.solana.com",qo="https://api.mainnet-beta.solana.com",Qo="https://verify.validators.solutions/solv-migrate",Xo="https://jup.validators.solutions/v1/jup",io;(function(t){t.SOL="SOL",t.USDC="USDC",t.elSOL="elSOL",t.JitoSOL="JitoSOL",t.mSOL="mSOL",t.bSOL="bSOL",t.EPCT="EPCT",t.JUP="JUP",t.BONK="BONK",t.JTO="JTO"})(io||(io={}));var Zo=Object.values(io),Se="So11111111111111111111111111111111111111112",ye="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",co="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var tr="SOLV420",er={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as Ti}from"child_process";import{spawnSync as hi}from"node:child_process";var Si=r(t=>{hi(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${t}-mod/installer)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Ct=Si;var or="agave-validator",yi=r(()=>{try{return or}catch(t){return console.error(t),or}},"getSolanaCLI"),K=yi;var Te=r(async t=>{Ct(t)},"updateVersion"),lo=r(async(t,e=!1)=>{let o=K(),n=`${o} --ledger ${T} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${T} exit --max-delinquent-stake ${t}`),Ti(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Yr from"chalk";var Tt;(function(t){t.EN="en",t.JA="ja"})(Tt||(Tt={}));var rr;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(rr||(rr={}));var nr;(function(t){t.SINGLE="single",t.DOUBLE="double"})(nr||(nr={}));var mt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(mt||(mt={}));var sr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(sr||(sr={}));var ar;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(ar||(ar={}));var ir;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(ir||(ir={}));var cr;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(cr||(cr={}));var Ee;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(Ee||(Ee={}));var ge;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(ge||(ge={}));var pr=!1,dr=!0,M={ID:"solv",LANG:Tt.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"2.0.8",MAINNET_SOLANA_VERSION:"1.18.23",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"},b={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},O={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},Z={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},L={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",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"},R={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"},N=r((t=b.ROOT)=>{let e=t===b.ROOT?b.ROOT:t,o=`${e}/${R.MAINNET_VALIDATOR_KEY}`,n=`${e}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${R.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${R.TESTNET_VALIDATOR_KEY}`,i=`${e}/${R.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${R.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),pt=r((t=!0)=>{let e=t?`${b.ROOT}/${R.TESTNET_VALIDATOR_KEY}`:`${b.ROOT}/${R.MAINNET_VALIDATOR_KEY}`,o=t?`${b.ROOT}/${R.TESTNET_VALIDATOR_VOTE_KEY}`:`${b.ROOT}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${b.ROOT}/${Z.LOG}`,s=O.ACCOUNTS,a=O.LEDGER,i=O.SNAPSHOTS,c=`${b.ROOT}/${Z.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:c,snapshots:i}},"startupScriptPaths");var z="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",mo="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",ur="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",fr=9,tt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",hr="So11111111111111111111111111111111111111112",Sr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",yr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",lr;(function(t){t[t.ELSOL=tt]="ELSOL",t[t.SOL=hr]="SOL",t[t.USDC=Sr]="USDC",t[t.EPCT=yr]="EPCT"})(lr||(lr={}));var mr;(function(t){t.V6_BASE_URL="https://quote-api.jup.ag/v6",t.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",t.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(mr||(mr={}));var Qd={[hr]:9,[tt]:9,[Sr]:6,[yr]:6},Ae="/home/solv/currentEpoch.json",po=.5,we="https://api.testnet.solana.com";import{spawnSync as uo}from"child_process";var Tr=r(()=>{uo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=M.NODE_VERSION;uo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),uo("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var at={version:"2.1.14",tag:"v2.1.14-mod",commissionBps:1e3,relayerUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",blockEngineUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",shredReceiverAddr:"145.40.93.84:1002"},fo={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"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"145.40.93.84:1002"},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"},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"},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"}};import{spawnSync as Ei}from"child_process";var _e=r((t=at.tag)=>{Ei(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${t}/installer)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as gi,writeFile as Ai}from"fs/promises";import{homedir as wi}from"os";var Bt=r(async t=>{let o=`${wi()}/${Z.JITO_CONFIG}`,s={...JSON.parse(await gi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Ai(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Er}from"child_process";import _i from"inquirer";var gr=r((t,e=!0)=>{let o=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",n=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";Er(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${o}`,{shell:!0,stdio:"inherit"});let a=`solana vote-update-commission ${n} ${t} ${o} --keypair ${o}`;Er(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Ar=r(async()=>await _i.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Jt}from"@skeet-framework/utils";import Ni from"chalk";import Oi from"inquirer";var wr=r(async()=>{let t=await Oi.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Jt("sudo ufw delete allow 8899/udp"),await Jt("sudo ufw delete allow 8899/tcp"),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Jt("sudo ufw reload"),console.log(Ni.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var vi=r(()=>Fo,"getSolvVersion"),Pt=vi;import{readFile as Ci,writeFile as Pi}from"fs/promises";import{existsAsync as Ii}from"@skeet-framework/utils";var ho;(function(t){t.EN="en",t.JA="ja"})(ho||(ho={}));var Ou=Object.values(ho),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var _r=Object.values(u),E;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(E||(E={}));var Nr=Object.values(E),A;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(A||(A={}));var vu=Object.values(A).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var Or=Object.values($).filter(t=>t!=="none"),W;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(W||(W={}));var et="2.1.14",ot="2.1.14",Et="2.1.14",Gt="2.1.14",vr="2.1.14",gt="2.1.14";var kr="20.17.0";var Rr="0.404.20113";var Ri={NETWORK:u.TESTNET,NODE_TYPE:E.RPC,VALIDATOR_TYPE:A.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:W.TRIPLE,TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot,NODE_VERSION:kr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:zo,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:qo,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:T,ACCOUNTS_PATH:Rt,SNAPSHOTS_PATH:X},it=Ri;import{homedir as Li}from"os";var xi=r(async()=>{let e=`${Li()}/${ue}`;return await Ii(e)?JSON.parse(await Ci(e,"utf-8")):(console.log("Creating default config file at",e),await Pi(e,JSON.stringify(it,null,2)),it)},"readConfig"),x=xi;import Vi from"node-fetch";var V=r(async t=>{try{let e=await x();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
|
|
2
|
+
var ii=Object.defineProperty;var r=(t,e)=>ii(t,"name",{value:e,configurable:!0});import"dotenv/config";import{Command as Rd}from"commander";var Fo="4.8.37";var Yo={name:"@gabrielhicks/solv",version:Fo,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"}};var de=Yo.version;var jt="https://validators.solutions";var ue="solv4.config.json";var St="identity.json",yt="unstaked-identity.json",jo="relayer-keypair.json",li="mainnet-validator-keypair.json",mi="mainnet-vote-account-keypair.json",pi="mainnet-authority-keypair.json",di="testnet-validator-keypair.json",ui="testnet-vote-account-keypair.json",fi="testnet-authority-keypair.json",C="/home/solv",k=`${C}/${St}`,Vd=`${C}/${yt}`,D=`${C}/${li}`,fe=`${C}/${mi}`,$d=`${C}/${pi}`,I=`${C}/${di}`,Bo=`${C}/${ui}`,Dd=`${C}/${fi}`,q=`${C}/solana-validator.log`,Q=C+"/start-validator.sh",T="/mnt/ledger",Rt="/mnt/accounts",X="/mnt/snapshots",Jo="solana-validator",Go="agave-validator",zo="ELLB9W7ZCwRCV3FzWcCWoyKP6NjZJKArLyGtkqefnHcG";var he=3,Wo="https://api.testnet.solana.com",qo="https://api.mainnet-beta.solana.com",Qo="https://verify.validators.solutions/solv-migrate",Xo="https://jup.validators.solutions/v1/jup",io;(function(t){t.SOL="SOL",t.USDC="USDC",t.elSOL="elSOL",t.JitoSOL="JitoSOL",t.mSOL="mSOL",t.bSOL="bSOL",t.EPCT="EPCT",t.JUP="JUP",t.BONK="BONK",t.JTO="JTO"})(io||(io={}));var Zo=Object.values(io),Se="So11111111111111111111111111111111111111112",ye="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",co="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC";var tr="SOLV420",er={So11111111111111111111111111111111111111112:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn:"HPj87TFMPZfm5nk1HmTH9a382RXn7h9oWftiFr3Xs12a",mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So:"8CX5tE9KvJ59HcoXwWf6tCZoRuz2JFSmunnbKC1ryaK9",bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1:"782MdvLby3VfvKdfDYn9tX3DfNAtg7TcytNNFuepcoMH",CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP:"BhR2L6J5q3xF1TxReXyHjaUh4MF6qV99tMsipzPAKeB",JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN:"212yg3Ev7khq4p1mESFGenF4nWefmkbC8f7mHM68j4vg",DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263:"61Ndjv9392jPRVGALdYgjjxGYa6TT6Gn2WLDSsmugE6U",jtojtomepa8beP8AuQc6eXt5FriJwfFMwQx2v2f9mCL:"2c9qVh8RQ6j2E2VdAEcCrRXMrd6g1vvPNZvAR6sbaGWo"};import{spawnSync as Ti}from"child_process";import{spawnSync as hi}from"node:child_process";var Si=r(t=>{hi(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/agave/v${t}-mod/installer)"`,{shell:!0,stdio:"inherit"})},"installAgave"),Ct=Si;var or="agave-validator",yi=r(()=>{try{return or}catch(t){return console.error(t),or}},"getSolanaCLI"),K=yi;var Te=r(async t=>{Ct(t)},"updateVersion"),lo=r(async(t,e=!1)=>{let o=K(),n=`${o} --ledger ${T} exit --max-delinquent-stake ${t} --monitor`;e&&(n=`${o} --ledger ${T} exit --max-delinquent-stake ${t}`),Ti(n,{shell:!0,stdio:"inherit"})},"monitorUpdate");import Yr from"chalk";var Tt;(function(t){t.EN="en",t.JA="ja"})(Tt||(Tt={}));var rr;(function(t){t[t.DOUBLE=0]="DOUBLE",t[t.SINGLE=1]="SINGLE"})(rr||(rr={}));var nr;(function(t){t.SINGLE="single",t.DOUBLE="double"})(nr||(nr={}));var mt;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(mt||(mt={}));var sr;(function(t){t.VALIDATOR="validator",t.RPC="rpc"})(sr||(sr={}));var ar;(function(t){t.SOLANA="solana",t.JITO="jito",t.AGAVE="agave",t.FIREDANCER="firedancer"})(ar||(ar={}));var ir;(function(t){t.CO_HOST_RELAYER="co-host-relayer",t.SEPARATED_RELAYER="separated-relayer",t.WITHOUT_RELAYER="without-relayer"})(ir||(ir={}));var cr;(function(t){t.FIREDANCER="firedancer",t.FRANKENDANCER="frankendancer"})(cr||(cr={}));var Ee;(function(t){t[t.TESTNET_VALIDATOR=0]="TESTNET_VALIDATOR",t[t.MAINNET_VALIDATOR=1]="MAINNET_VALIDATOR",t[t.RPC_NODE=2]="RPC_NODE"})(Ee||(Ee={}));var ge;(function(t){t.SOLANA_CLIENT="SolanaClient",t.JITO_MEV="JitoMev",t.FIREDANCER="Firedancer"})(ge||(ge={}));var pr=!1,dr=!0,M={ID:"solv",LANG:Tt.EN,USERNAME:"solv",TESTNET_SOLANA_VERSION:"2.0.8",MAINNET_SOLANA_VERSION:"1.18.23",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"},b={ROOT:"/home/solv",AUTHORIZED_KEYS:"/home/solv/.ssh/authorized_keys"},v={ROOT:"/mnt",ACCOUNTS:"/mnt/accounts",LEDGER:"/mnt/ledger",SNAPSHOTS:"/mnt/snapshots"},Z={LOG:"solana-validator.log",STARTUP_SCRIPT:"start-validator.sh",CONFIG:"solv.config.json",JITO_CONFIG:"jito.config.json"},L={SOL_SERVICE:"/etc/systemd/system/solv.service",SOL_LOGROTATE:"/etc/logrotate.d/solana",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"},R={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"},N=r((t=b.ROOT)=>{let e=t===b.ROOT?b.ROOT:t,o=`${e}/${R.MAINNET_VALIDATOR_KEY}`,n=`${e}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,s=`${e}/${R.MAINNET_VALITATOR_AUTHORITY_KEY}`,a=`${e}/${R.TESTNET_VALIDATOR_KEY}`,i=`${e}/${R.TESTNET_VALIDATOR_VOTE_KEY}`,c=`${e}/${R.TESTNET_VALITATOR_AUTHORITY_KEY}`;return{mainnetValidatorKey:o,mainnetValidatorVoteKey:n,mainnetValidatorAuthorityKey:s,testnetValidatorKey:a,testnetValidatorVoteKey:i,testnetValidatorAuthorityKey:c}},"getAllKeyPaths"),pt=r((t=!0)=>{let e=t?`${b.ROOT}/${R.TESTNET_VALIDATOR_KEY}`:`${b.ROOT}/${R.MAINNET_VALIDATOR_KEY}`,o=t?`${b.ROOT}/${R.TESTNET_VALIDATOR_VOTE_KEY}`:`${b.ROOT}/${R.MAINNET_VALIDATOR_VOTE_KEY}`,n=`${b.ROOT}/${Z.LOG}`,s=v.ACCOUNTS,a=v.LEDGER,i=v.SNAPSHOTS,c=`${b.ROOT}/${Z.STARTUP_SCRIPT}`;return{identity:e,voteAccount:o,log:n,accounts:s,ledger:a,scriptPath:c,snapshots:i}},"startupScriptPaths");var z="So1vW4Bm6ZURzJJHZy1JpsjoVY68z4cDgF4tTLwYMa5",mo="7tAfLKgRVd9eywSQPuMbVNd51KGkaveZQuTjapL74Fwv",ur="EiwSTx1Z2uJATDut682U7xzzquFR4UpQJUij3wSxVoSV",fr=9,tt="ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC",hr="So11111111111111111111111111111111111111112",Sr="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",yr="CvB1ztJvpYQPvdPBePtRzjL4aQidjydtUz61NWgcgQtP",lr;(function(t){t[t.ELSOL=tt]="ELSOL",t[t.SOL=hr]="SOL",t[t.USDC=Sr]="USDC",t[t.EPCT=yr]="EPCT"})(lr||(lr={}));var mr;(function(t){t.V6_BASE_URL="https://quote-api.jup.ag/v6",t.V6_QUOTE_URL="https://quote-api.jup.ag/v6/quote",t.V6_SWAP_URL="https://quote-api.jup.ag/v6/swap"})(mr||(mr={}));var Qd={[hr]:9,[tt]:9,[Sr]:6,[yr]:6},Ae="/home/solv/currentEpoch.json",po=.5,we="https://api.testnet.solana.com";import{spawnSync as uo}from"child_process";var Tr=r(()=>{uo("pnpm add -g pnpm",{shell:!0,stdio:"inherit"});let t=M.NODE_VERSION;uo(`pnpm env use ${t} --global`,{shell:!0,stdio:"inherit"}),uo("pnpm add -g @gabrielhicks/solv",{shell:!0,stdio:"inherit"})},"updateSolv");var at={version:"2.1.14",tag:"v2.1.14-mod",commissionBps:1e3,relayerUrl:"https://frankfurt.mainnet.block-engine.jito.wtf",blockEngineUrl:"http://frankfurt.mainnet.relayer.jito.wtf:8100",shredReceiverAddr:"145.40.93.84:1002"},fo={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"},Frankfurt:{BLOCK_ENGINE_URL:"https://frankfurt.mainnet.block-engine.jito.wtf",RELAYER_URL:"http://frankfurt.mainnet.relayer.jito.wtf:8100",SHRED_RECEIVER_ADDR:"145.40.93.84:1002"},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"},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"},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"}};import{spawnSync as Ei}from"child_process";var _e=r((t=at.tag)=>{Ei(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${t}/installer)"`,{shell:!0,stdio:"inherit"})},"jitoUpdate");import{readFile as gi,writeFile as Ai}from"fs/promises";import{homedir as wi}from"os";var Bt=r(async t=>{let o=`${wi()}/${Z.JITO_CONFIG}`,s={...JSON.parse(await gi(o,"utf8")),...t},a=JSON.stringify(s,null,2);await Ai(o,a),console.log(`Updated ${o} with new values.`)},"updateJitoSolvConfig");import{spawnSync as Er}from"child_process";import _i from"inquirer";var gr=r((t,e=!0)=>{let o=e?"/home/solv/testnet-validator-keypair.json":"/home/solv/mainnet-validator-keypair.json",n=e?"/home/solv/testnet-vote-account-keypair.json":"/home/solv/mainnet-vote-account-keypair.json";Er(`solana config set --url ${e?"testnet":"mainnet-beta"} --keypair ${o}`,{shell:!0,stdio:"inherit"});let a=`solana vote-update-commission ${n} ${t} ${o} --keypair ${o}`;Er(a,{shell:!0,stdio:"inherit"})},"updateCommission"),Ar=r(async()=>await _i.prompt([{type:"number",name:"commission",message:"Enter new commission",default:7}]),"updateCommissionAsk");import{execAsync as Jt}from"@skeet-framework/utils";import Ni from"chalk";import vi from"inquirer";var wr=r(async()=>{let t=await vi.prompt([{name:"ip",type:"input",message:"Enter your IP address to allow access to RPC NODE:",default:"1.2.3.4"}]);await Jt("sudo ufw delete allow 8899/udp"),await Jt("sudo ufw delete allow 8899/tcp"),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto tcp`),await Jt(`sudo ufw allow from ${t.ip} to any port 8899 proto udp`),await Jt("sudo ufw reload"),console.log(Ni.white("\u2714\uFE0F Firewall updated!"))},"updateFirewall");var Oi=r(()=>Fo,"getSolvVersion"),Pt=Oi;import{readFile as Ci,writeFile as Pi}from"fs/promises";import{existsAsync as Ii}from"@skeet-framework/utils";var ho;(function(t){t.EN="en",t.JA="ja"})(ho||(ho={}));var vu=Object.values(ho),u;(function(t){t.MAINNET="mainnet-beta",t.TESTNET="testnet"})(u||(u={}));var _r=Object.values(u),E;(function(t){t.RPC="rpc",t.VALIDATOR="validator"})(E||(E={}));var Nr=Object.values(E),A;(function(t){t.SOLANA="solana",t.AGAVE="agave",t.JITO="jito",t.FRANKENDANCER="frankendancer",t.NONE="none"})(A||(A={}));var Ou=Object.values(A).filter(t=>t!=="none"),$;(function(t){t.AGAVE="agave",t.JITO="jito",t.NONE="none"})($||($={}));var vr=Object.values($).filter(t=>t!=="none"),W;(function(t){t.SINGLE="single",t.DOUBLE="double",t.TRIPLE="triple"})(W||(W={}));var et="2.1.14",ot="2.1.14",Et="2.1.14",Gt="2.1.14",Or="2.1.14",gt="2.1.14";var kr="20.17.0";var Rr="0.404.20113";var Ri={NETWORK:u.TESTNET,NODE_TYPE:E.RPC,VALIDATOR_TYPE:A.NONE,RPC_TYPE:$.AGAVE,MNT_DISK_TYPE:W.TRIPLE,TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot,NODE_VERSION:kr,TESTNET_DELINQUENT_STAKE:5,MAINNET_DELINQUENT_STAKE:5,COMMISSION:5,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:zo,STAKE_ACCOUNTS:[],HARVEST_ACCOUNT:"",IS_MEV_MODE:!1,RPC_URL:qo,KEYPAIR_PATH:"",DISCORD_WEBHOOK_URL:"",AUTO_UPDATE:!1,AUTO_RESTART:!1,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:T,ACCOUNTS_PATH:Rt,SNAPSHOTS_PATH:X},it=Ri;import{homedir as Li}from"os";var xi=r(async()=>{let e=`${Li()}/${ue}`;return await Ii(e)?JSON.parse(await Ci(e,"utf-8")):(console.log("Creating default config file at",e),await Pi(e,JSON.stringify(it,null,2)),it)},"readConfig"),x=xi;import Vi from"node-fetch";var V=r(async t=>{try{let e=await x();if(e.DISCORD_WEBHOOK_URL==="")throw new Error(`DISCORD_WEBHOOK_URL is empty
|
|
3
3
|
Please set DISCORD_WEBHOOK_URL in .env`);let o={content:t,username:"\u{1FA84} Solv Notifier"};return(await Vi(e.DISCORD_WEBHOOK_URL,{method:"POST",body:JSON.stringify(o),headers:{"Content-Type":"application/json"}})).status===204}catch{return console.log({error:`Skeet sendDiscord Error - ${t}`}),!1}},"sendDiscord");import{spawnSync as Hi}from"child_process";import{Connection as Cr}from"@solana/web3.js";var zt=r(async(t,e,o=!1,n=200)=>{let s={pubkey:e,isActive:!1,reason:""};try{let a=o?new Cr("https://api.testnet.solana.com"):new Cr(t,"confirmed"),i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e);if(!c)return i.delinquent.find(h=>h.votePubkey===e)?(s.isActive=!1,s.reason="Validator is delinquent.",s):(s.isActive=!1,s.reason="Validator is not found in both current and delinquent lists.",s);if(i=await a.getVoteAccounts(),c=i.current.find(p=>p.votePubkey===e),!c)return s.isActive=!1,s.reason="Validator is not found in the current list.",s;let l=c.lastVote,d=await a.getSlot()-l;return d>n?(s.isActive=!1,s.reason=`Validator has not voted for ${d} slots.`,s):(s.isActive=!0,s.reason="Validator is active and voting.",s)}catch(a){return console.error(a),s.isActive=!1,s.reason="Failed to check validator status.",s}},"isValidatorActive");import{spawnSync as $i}from"child_process";var _=r(t=>{let e=`solana address --keypair ${t}`,{stdout:o}=$i(e,{shell:!0,stdio:"pipe"});return o.toString().trim()},"getSolanaAddress");var Di=r(t=>new Promise(e=>setTimeout(e,t)),"sleep"),rt=Di;import{sendDiscord as Ki}from"@skeet-framework/utils";var Pr=60,bi=r(async t=>{try{let e=t.NETWORK===u.TESTNET,{mainnetValidatorVoteKey:o,testnetValidatorVoteKey:n}=N(),a=_(e?n:o),i=await zt(t.RPC_URL,a,e),c=0;for(;!i.isActive;){if(c>=Pr){console.log("Max retries reached, exiting...");let l=`\u26A0\uFE0F Validator is not active for ${Pr} minutes!
|
|
4
4
|
Account: ${i.pubkey}
|
|
5
5
|
Reason: ${i.reason}
|
|
@@ -22,7 +22,7 @@ Now Catching up... \u{1F69B}\u{1F4A8}
|
|
|
22
22
|
`;await V(d),await rt(180*1e3);let p=await Ir(t);if(p){let h=`== \u{1F7E2} Your Node has caught up! ==
|
|
23
23
|
Address: ${c}
|
|
24
24
|
\u2728 Auto Update Completed \u2728
|
|
25
|
-
`;await V(h)}return p}return!0},"autoUpdate"),Lr=Fi;import{homedir as Yi}from"os";import{readFile as ji,writeFile as xr}from"fs/promises";import{existsAsync as Bi}from"@skeet-framework/utils";var v=r(async t=>{let o=`${Yi()}/${ue}`;await Bi(o)||(console.log("Creating default config file at",o),await xr(o,JSON.stringify(it,null,2)));let s={...JSON.parse(await ji(o,"utf8")),...t},a=JSON.stringify(s,null,2);await xr(o,a)},"updateDefaultConfig");var Ji={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"},Oe=Ji;var Gi={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:"},Vr=Gi;var zi={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}"}},ve=zi;var Wi={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"}},$r=Wi;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Re=[[],[") 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 Dr=[") \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"],Kr=[[],[") \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 qi={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"}},Ce=qi;var Qi={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"}},br=Qi;var Pe=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Ur=[") \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 Xi=r(t=>{let e={cmds:Oe,subCmds:Ce,logs:ve,installer:ke,installerSub:Re,clientCmds:Pe};switch(t){case Tt.EN:e={cmds:Oe,subCmds:Ce,logs:ve,installer:ke,installerSub:Re,clientCmds:Pe};break;case Tt.JA:e={cmds:Vr,subCmds:br,logs:$r,installer:Dr,installerSub:Kr,clientCmds:Ur};break;default:e={cmds:Oe,subCmds:Ce,logs:ve,installer:ke,installerSub:Re,clientCmds:Pe}}return e},"readLocale"),Mr=Xi;import{existsSync as oc,readFileSync as rc,writeFileSync as Hr}from"fs";import{readFileSync as Zi,writeFileSync as tc}from"fs";import{homedir as ec}from"os";var It=r(t=>{let o=`${ec()}/${Z.CONFIG}`,s={...JSON.parse(Zi(o,"utf8")),...t},a=JSON.stringify(s,null,2);tc(o,a)},"updateSolvConfig");import{homedir as nc}from"os";var Fr=r(()=>{let e=`${nc()}/${Z.CONFIG}`;oc(e)||(Hr(e,JSON.stringify(M,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(rc(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Hr(e,JSON.stringify(M,null,2)),o=M}let n=Mr(o.LANG);return o.RPC_URL||(o.RPC_URL=M.RPC_URL,It({RPC_URL:M.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,It({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",It({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var jr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===E.RPC,n=t.VALIDATOR_TYPE===A.JITO,s=e?et:ot;n&&(s=Gt,e&&(s=Et)),o&&(s=gt,n&&(s=vr)),f.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).action(async a=>{let i=Pt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(Yr.white(`Current solv version: ${i}`)),a.auto){await Lr(t);return}if(a.migrateConfig){let l=Fr().config,m=l.SOLANA_NETWORK===mt.TESTNET,d=l.SOLV_TYPE===Ee.RPC_NODE,p=l.MAINNET_TYPE===ge.JITO_MEV,h={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?E.RPC:E.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?W.DOUBLE:W.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?A.JITO:m?A.AGAVE:A.SOLANA,TESTNET_SOLANA_VERSION:l.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:l.MAINNET_SOLANA_VERSION,NODE_VERSION:l.NODE_VERSION,TESTNET_DELINQUENT_STAKE:l.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:l.MAINNET_DELINQUENT_STAKE,COMMISSION:l.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:l.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:l.STAKE_ACCOUNT,HARVEST_ACCOUNT:l.HARVEST_ACCOUNT,IS_MEV_MODE:l.IS_MEV_MODE,RPC_URL:l.RPC_URL,KEYPAIR_PATH:l.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:l.DISCORD_WEBHOOK_URL,AUTO_UPDATE:l.AUTO_UPDATE,AUTO_RESTART:l.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:l.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots"};await v(h)}if(a.config){if(await v({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){let l=e?Et:Gt;await Bt({version:l,tag:`v${l}-mod`})}console.log(Yr.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await wr();return}if(a.background){let l=a.version;if(await v({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){_e(),await Bt({version:l,tag:`v${l}-mod`}),await lo(c,!0);return}await Te(l),await lo(e?5:5,!0);return}else if(a.commission){let l=await Ar();gr(l.commission,e)}else Tr()})},"updateCommands");import{spawnSync as sc}from"node:child_process";var Br=r(t=>{try{let{log:e}=pt(),o=`tail -f ${e}`;t.error?o+=" | grep '\\(WARN\\|ERR\\)'":t.info?o+=" | grep INFO":t.warning&&(o+=" | grep WARN"),console.log(o);let n=sc(o,{shell:!0,stdio:"inherit"});if(n.error)throw n.error;n.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):n.status!==0&&(console.error(`Child process exited with code ${n.status}`),process.exit(n.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Jr=r(()=>{f.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(t=>{Br(t)})},"logCommands");import ct from"chalk";import{spawnSync as ac}from"child_process";import{homedir as ic}from"os";var Ie=r(t=>{let e=ic(),o=N(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=mt.TESTNET,c=t.COMMISSION;t.NETWORK===u.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=mt.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===u.TESTNET&&(l=mt.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;ac(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Le}from"child_process";import{existsSync as Gr,readdirSync as cc,rmSync as lc}from"fs";import{homedir as mc}from"os";import zr from"path";var xe=r(t=>{let e=[],o=0;t.NODE_TYPE===E.RPC&&(e=[R.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[R.TESTNET_VALIDATOR_KEY,R.TESTNET_VALITATOR_AUTHORITY_KEY,R.TESTNET_VALIDATOR_VOTE_KEY,R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;Le(n,{shell:!0,stdio:"ignore"});let s=cc("./").filter(l=>l.endsWith("SV.json")),a=mc(),i=zr.join(a,"unstaked-identity.json");Gr(i)&&Le(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=zr.join(a,e[c]);if(c++,Gr(m)){console.log(`${m} is already exist!`),lc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;Le(d,{shell:!0,stdio:"inherit"})}Le("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${a}`)},"createSolvKeyPairs");import{spawnSync as qr}from"child_process";var pc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
|
|
25
|
+
`;await V(h)}return p}return!0},"autoUpdate"),Lr=Fi;import{homedir as Yi}from"os";import{readFile as ji,writeFile as xr}from"fs/promises";import{existsAsync as Bi}from"@skeet-framework/utils";var O=r(async t=>{let o=`${Yi()}/${ue}`;await Bi(o)||(console.log("Creating default config file at",o),await xr(o,JSON.stringify(it,null,2)));let s={...JSON.parse(await ji(o,"utf8")),...t},a=JSON.stringify(s,null,2);await xr(o,a)},"updateDefaultConfig");var Ji={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=Ji;var Gi={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:"},Vr=Gi;var zi={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}"}},Oe=zi;var Wi={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"}},$r=Wi;var ke=[") Upgrade - Update/Downgrade Solana Version",") Check Validator Logs/Status or Start/Stop",") Get Validator Config Info",") Backup Validator Keyfiles",") Staking",") Uninstall",") Exit"],Re=[[],[") 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 Dr=[") \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"],Kr=[[],[") \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 qi={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"}},Ce=qi;var Qi={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"}},br=Qi;var Pe=[") Check Validator Status",") Download Validator Keyfiles",") Generate Validator Keyfiles",") Upload Validator Keyfiles",") Set Validator Keyfile/Network",") Uninstall",") Exit"];var Ur=[") \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 Xi=r(t=>{let e={cmds:ve,subCmds:Ce,logs:Oe,installer:ke,installerSub:Re,clientCmds:Pe};switch(t){case Tt.EN:e={cmds:ve,subCmds:Ce,logs:Oe,installer:ke,installerSub:Re,clientCmds:Pe};break;case Tt.JA:e={cmds:Vr,subCmds:br,logs:$r,installer:Dr,installerSub:Kr,clientCmds:Ur};break;default:e={cmds:ve,subCmds:Ce,logs:Oe,installer:ke,installerSub:Re,clientCmds:Pe}}return e},"readLocale"),Mr=Xi;import{existsSync as oc,readFileSync as rc,writeFileSync as Hr}from"fs";import{readFileSync as Zi,writeFileSync as tc}from"fs";import{homedir as ec}from"os";var It=r(t=>{let o=`${ec()}/${Z.CONFIG}`,s={...JSON.parse(Zi(o,"utf8")),...t},a=JSON.stringify(s,null,2);tc(o,a)},"updateSolvConfig");import{homedir as nc}from"os";var Fr=r(()=>{let e=`${nc()}/${Z.CONFIG}`;oc(e)||(Hr(e,JSON.stringify(M,null,2)),console.log(`Created default config file at ${e}`));let o;try{o=JSON.parse(rc(e,"utf-8"))}catch{console.log("Error parsing config file. Renewing config file."),Hr(e,JSON.stringify(M,null,2)),o=M}let n=Mr(o.LANG);return o.RPC_URL||(o.RPC_URL=M.RPC_URL,It({RPC_URL:M.RPC_URL})),o.IS_MEV_MODE===void 0&&(o.IS_MEV_MODE=!1,It({IS_MEV_MODE:!1})),o.DISCORD_WEBHOOK_URL||(o.DISCORD_WEBHOOK_URL="",It({DISCORD_WEBHOOK_URL:""})),{config:o,locale:n}},"readOrCreateDefaultConfig");var jr=r(t=>{let e=t.NETWORK===u.TESTNET,o=t.NODE_TYPE===E.RPC,n=t.VALIDATOR_TYPE===A.JITO,s=e?et:ot;n&&(s=Gt,e&&(s=Et)),o&&(s=gt,n&&(s=Or)),f.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).action(async a=>{let i=Pt(),c=e?t.TESTNET_DELINQUENT_STAKE:t.MAINNET_DELINQUENT_STAKE;if(console.log(Yr.white(`Current solv version: ${i}`)),a.auto){await Lr(t);return}if(a.migrateConfig){let l=Fr().config,m=l.SOLANA_NETWORK===mt.TESTNET,d=l.SOLV_TYPE===Ee.RPC_NODE,p=l.MAINNET_TYPE===ge.JITO_MEV,h={NETWORK:m?u.TESTNET:u.MAINNET,NODE_TYPE:d?E.RPC:E.VALIDATOR,MNT_DISK_TYPE:l.DISK_TYPES===0?W.DOUBLE:W.SINGLE,RPC_TYPE:d?$.JITO:$.NONE,VALIDATOR_TYPE:p?A.JITO:m?A.AGAVE:A.SOLANA,TESTNET_SOLANA_VERSION:l.TESTNET_SOLANA_VERSION,MAINNET_SOLANA_VERSION:l.MAINNET_SOLANA_VERSION,NODE_VERSION:l.NODE_VERSION,TESTNET_DELINQUENT_STAKE:l.TESTNET_DELINQUENT_STAKE,MAINNET_DELINQUENT_STAKE:l.MAINNET_DELINQUENT_STAKE,COMMISSION:l.COMMISSION,DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY:l.DEFAULT_VALIDATOR_VOTE_ACCOUNT_PUBKEY,STAKE_ACCOUNTS:l.STAKE_ACCOUNT,HARVEST_ACCOUNT:l.HARVEST_ACCOUNT,IS_MEV_MODE:l.IS_MEV_MODE,RPC_URL:l.RPC_URL,KEYPAIR_PATH:l.KEYPAIR_PATH,DISCORD_WEBHOOK_URL:l.DISCORD_WEBHOOK_URL,AUTO_UPDATE:l.AUTO_UPDATE,AUTO_RESTART:l.AUTO_RESTART,IS_DUMMY:!1,API_KEY:"",LEDGER_PATH:l.LEDGER_PATH,ACCOUNTS_PATH:"/mnt/accounts",SNAPSHOTS_PATH:"/mnt/snapshots"};await O(h)}if(a.config){if(await O({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){let l=e?Et:Gt;await Bt({version:l,tag:`v${l}-mod`})}console.log(Yr.green("\u2714\uFE0F Updated Solv Config Default Solana Version\n\n You can now run `solv i` to install the latest version"));return}if(a.firewall){await wr();return}if(a.background){let l=a.version;if(await O({TESTNET_SOLANA_VERSION:et,MAINNET_SOLANA_VERSION:ot}),n){_e(),await Bt({version:l,tag:`v${l}-mod`}),await lo(c,!0);return}await Te(l),await lo(e?5:5,!0);return}else if(a.commission){let l=await Ar();gr(l.commission,e)}else Tr()})},"updateCommands");import{spawnSync as sc}from"node:child_process";var Br=r(t=>{try{let{log:e}=pt(),o=`tail -f ${e}`;t.error?o+=" | grep '\\(WARN\\|ERR\\)'":t.info?o+=" | grep INFO":t.warning&&(o+=" | grep WARN"),console.log(o);let n=sc(o,{shell:!0,stdio:"inherit"});if(n.error)throw n.error;n.signal==="SIGINT"?(console.log("Child process terminated due to receipt of SIGINT signal"),process.exit(0)):n.status!==0&&(console.error(`Child process exited with code ${n.status}`),process.exit(n.status))}catch(e){console.error(`tail Error: ${e}`),process.exit(1)}},"tail");var Jr=r(()=>{f.command("log").description("tail logs").alias("l").description("tail logs").option("-i, --info","Follow INFO output",!1).option("-w, --warning","Follow WARN output",!1).option("-e, --error","Follow ERR/WARN output",!1).option("-a, --all","Follow All output",!1).action(t=>{Br(t)})},"logCommands");import ct from"chalk";import{spawnSync as ac}from"child_process";import{homedir as ic}from"os";var Ie=r(t=>{let e=ic(),o=N(e),n=o.testnetValidatorVoteKey,s=o.testnetValidatorKey,a=o.testnetValidatorAuthorityKey,i=mt.TESTNET,c=t.COMMISSION;t.NETWORK===u.MAINNET&&(n=o.mainnetValidatorVoteKey,s=o.mainnetValidatorKey,a=o.mainnetValidatorAuthorityKey,i=mt.MAINNET),console.log(`\u231B\uFE0F Creating vote account with commission ${c} - ${i}`);let l=t.RPC_URL||i;t.NETWORK===u.TESTNET&&(l=mt.TESTNET);let m=`solana create-vote-account ${n} ${s} ${a} --commission ${c} --url ${l} --keypair ${s}`;ac(m,{shell:!0,stdio:"inherit"})},"setupVoteAccount");import{spawnSync as Le}from"child_process";import{existsSync as Gr,readdirSync as cc,rmSync as lc}from"fs";import{homedir as mc}from"os";import zr from"path";var xe=r(t=>{let e=[],o=0;t.NODE_TYPE===E.RPC&&(e=[R.MAINNET_VALIDATOR_KEY],o=1),t.NETWORK===u.TESTNET?(e=[R.TESTNET_VALIDATOR_KEY,R.TESTNET_VALITATOR_AUTHORITY_KEY,R.TESTNET_VALIDATOR_VOTE_KEY,R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=6):(e=[R.MAINNET_VALIDATOR_KEY,R.MAINNET_VALITATOR_AUTHORITY_KEY,R.MAINNET_VALIDATOR_VOTE_KEY],o=3);let n=`solana-keygen grind --starts-and-ends-with E:SV:${o}`;Le(n,{shell:!0,stdio:"ignore"});let s=cc("./").filter(l=>l.endsWith("SV.json")),a=mc(),i=zr.join(a,"unstaked-identity.json");Gr(i)&&Le(`mv ${i} ${a}/unstaked-identity.backup.json`,{shell:!0,stdio:"ignore"});let c=0;for(let l of s){let m=zr.join(a,e[c]);if(c++,Gr(m)){console.log(`${m} is already exist!`),lc(l,{recursive:!0});continue}let d=`mv ${l} ${m}`;Le(d,{shell:!0,stdio:"inherit"})}Le("solana-keygen new -s --no-bip39-passphrase -o /home/solv/unstaked-identity.json",{shell:!0,stdio:"ignore"}),console.log(`Generated keypairs - ${a}`)},"createSolvKeyPairs");import{spawnSync as qr}from"child_process";var pc=r((t,e,o,n=2001)=>{let s="/etc/systemd/system/jupiter-api.service",a=`[Unit]
|
|
26
26
|
Description=Jupiter API Service Instance
|
|
27
27
|
After=network.target
|
|
28
28
|
|
|
@@ -43,7 +43,7 @@ unzip jupiter-swap-api-x86_64-unknown-linux-gnu.zip
|
|
|
43
43
|
chmod +x jupiter-swap-api
|
|
44
44
|
rm jupiter-swap-api-x86_64-unknown-linux-gnu.zip`,{shell:!0,stdio:"inherit"});let{filePath:o,body:n}=Wr(t.rpcUrl,t.grpcUrl,t.grpcToken);qr(`echo '${n}' | sudo tee ${o}`,{shell:!0,stdio:"inherit"}),console.log(uc.white(`\u{1F7E2} Jupiter Swap API Setup Completed
|
|
45
45
|
|
|
46
|
-
$ solv jupiter --help`))},"jupiterAPISetup"),Qr=fc;import{existsAsync as hc}from"@skeet-framework/utils";import{readFile as Sc,writeFile as Xr}from"fs/promises";import{homedir as yc}from"os";import Tc from"path";var At=r(async()=>{let t=yc(),e=Tc.join(t,Z.JITO_CONFIG);await hc(e)||(await Xr(e,JSON.stringify(at,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await Sc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await Xr(e,JSON.stringify(at,null,2)),o=at}return o},"readOrCreateJitoConfig");import{spawnSync as Ec}from"child_process";var Wt=r(()=>{Ec("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import qt from"chalk";import Ve from"inquirer";import gc from"inquirer";var Zr=r(async()=>{let e=Object.keys(fo),o=await gc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=fo[n];return{version:at.version,tag:at.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Ac=r(async()=>{try{let t=A.NONE,e=$.AGAVE,o=it.COMMISSION,n=!1,s=await Ve.prompt([{name:"network",type:"list",message:"Choose Network",choices:_r,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Nr,default:E.RPC}]);if(s.nodeType===E.VALIDATOR){let c=s.network===u.MAINNET?[A.JITO,A.SOLANA]:[A.AGAVE,A.JITO,A.FRANKENDANCER];t=await Ve.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:A.AGAVE}).then(l=>l.validatorType),e=$.NONE}if(s.nodeType===E.RPC&&(e=await Ve.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:
|
|
46
|
+
$ solv jupiter --help`))},"jupiterAPISetup"),Qr=fc;import{existsAsync as hc}from"@skeet-framework/utils";import{readFile as Sc,writeFile as Xr}from"fs/promises";import{homedir as yc}from"os";import Tc from"path";var At=r(async()=>{let t=yc(),e=Tc.join(t,Z.JITO_CONFIG);await hc(e)||(await Xr(e,JSON.stringify(at,null,2)),console.log(`Created jito config file at ${e}`));let o;try{o=JSON.parse(await Sc(e,"utf-8"))}catch(n){console.log(`readOrCreateJitoConfig - ${n}`),await Xr(e,JSON.stringify(at,null,2)),o=at}return o},"readOrCreateJitoConfig");import{spawnSync as Ec}from"child_process";var Wt=r(()=>{Ec("sudo systemctl daemon-reload",{shell:!0,stdio:"inherit"})},"daemonReload");import qt from"chalk";import Ve from"inquirer";import gc from"inquirer";var Zr=r(async()=>{let e=Object.keys(fo),o=await gc.prompt([{name:"commissionBps",type:"number",message:"Enter commission bps",default:1e3},{name:"region",type:"list",message:"Select region",choices:e}]),n=o.region,s=fo[n];return{version:at.version,tag:at.tag,commissionBps:o.commissionBps,blockEngineUrl:s.BLOCK_ENGINE_URL,relayerUrl:s.RELAYER_URL,shredReceiverAddr:s.SHRED_RECEIVER_ADDR}},"askJitoSetting");var Ac=r(async()=>{try{let t=A.NONE,e=$.AGAVE,o=it.COMMISSION,n=!1,s=await Ve.prompt([{name:"network",type:"list",message:"Choose Network",choices:_r,default:u.MAINNET},{name:"nodeType",type:"list",message:"Choose Node Type",choices:Nr,default:E.RPC}]);if(s.nodeType===E.VALIDATOR){let c=s.network===u.MAINNET?[A.JITO,A.SOLANA]:[A.AGAVE,A.JITO,A.FRANKENDANCER];t=await Ve.prompt({name:"validatorType",type:"list",message:"Choose Validator Type",choices:c,default:A.AGAVE}).then(l=>l.validatorType),e=$.NONE}if(s.nodeType===E.RPC&&(e=await Ve.prompt({name:"rpcType",type:"list",message:"Choose RPC Type",choices:vr,default:$.AGAVE}).then(c=>c.rpcType)),s.nodeType===E.VALIDATOR){let c=await Ve.prompt([{name:"commission",type:"number",message:`What is your commission rate? You can change it later (default: ${it.COMMISSION}%)'`,default:it.COMMISSION},{name:"isDummy",type:"confirm",message:"Do you want to setup as a dummy(Inactive) node?(\u203BFor Migration)",default:!0}]);if(o=c.commission,n=c.isDummy,t===A.JITO){await At();let l=await Zr();await Bt(l)}}let{network:a,nodeType:i}=s;return console.log(qt.white("Network:",a)),console.log(qt.white("Node Type:",i)),console.log(qt.white("Validator Type:",t)),console.log(qt.white("RPC Type:",e)),i===E.VALIDATOR&&console.log(qt.white("Commission:",o)),await O({NETWORK:a,NODE_TYPE:i,VALIDATOR_TYPE:t,RPC_TYPE:e,COMMISSION:o,IS_DUMMY:n}),!0}catch(t){throw new Error(t)}},"initialConfigSetup"),tn=Ac;import{spawnSync as wc}from"child_process";var Qt=r((t=Et)=>{let e=`v${t}-mod`;wc(`sh -c "$(curl -sSfL https://raw.githubusercontent.com/gabrielhicks/jito-solana/${e}/installer)"`,{shell:!0,stdio:"inherit"})},"installJito");var en=r(()=>`#!/bin/bash
|
|
47
47
|
exec agave-validator \\
|
|
48
48
|
--identity ${k} \\
|
|
49
49
|
--log ${q} \\
|
|
@@ -82,7 +82,7 @@ exec agave-validator \\
|
|
|
82
82
|
--wal-recovery-mode skip_any_corrupted_record \\
|
|
83
83
|
--use-snapshot-archives-at-startup when-newest \\
|
|
84
84
|
--limit-ledger-size 400000000 \\
|
|
85
|
-
`,"startJitoRPCScript");import{existsAsync as
|
|
85
|
+
`,"startJitoRPCScript");import{existsAsync as vc}from"@skeet-framework/utils";import{writeFile as Oc}from"fs/promises";import{spawnSync as _c}from"node:child_process";var Nc=r(()=>{let t=`sudo chmod +x ${Q}`;_c(t,{shell:!0,stdio:"inherit"})},"updateStartupScriptPermission"),Xt=Nc;var on=r(()=>`#!/bin/bash
|
|
86
86
|
exec agave-validator \\
|
|
87
87
|
--identity ${k} \\
|
|
88
88
|
--log ${q} \\
|
|
@@ -118,7 +118,7 @@ exec agave-validator \\
|
|
|
118
118
|
--wal-recovery-mode skip_any_corrupted_record \\
|
|
119
119
|
--use-snapshot-archives-at-startup when-newest \\
|
|
120
120
|
--limit-ledger-size 400000000 \\
|
|
121
|
-
`,"startRPCNodeScript");var kc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case $.AGAVE:console.log("Agave RPC Node Setup"),Ct(t.TESTNET_SOLANA_VERSION),o=on();break;case $.JITO:console.log("JITO RPC Node Setup"),Qt(Et),o=en();break;default:console.log("Unknown RPC Node Setup");break}if(await
|
|
121
|
+
`,"startRPCNodeScript");var kc=r(async t=>{let e=t.RPC_TYPE,o="";switch(e){case $.AGAVE:console.log("Agave RPC Node Setup"),Ct(t.TESTNET_SOLANA_VERSION),o=on();break;case $.JITO:console.log("JITO RPC Node Setup"),Qt(Et),o=en();break;default:console.log("Unknown RPC Node Setup");break}if(await vc(Q)){console.log("Startup script already exists. Skipping...");return}await Oc(Q,o,"utf-8"),Xt()},"setupRpcNode"),rn=kc;import{spawnSync as Rc}from"node:child_process";var Cc=r(t=>{Rc(`sh -c "$(curl -sSfL https://release.solana.com/v${t}/install)"`,{shell:!0,stdio:"inherit"})},"installSolana"),To=Cc;var Eo=r((t=1e3,e,o,n,s,a="agave-validator")=>`#!/bin/bash
|
|
122
122
|
exec ${a} \\
|
|
123
123
|
--identity ${k} \\
|
|
124
124
|
--vote-account ${fe} \\
|
|
@@ -210,14 +210,14 @@ exec agave-validator \\
|
|
|
210
210
|
--block-production-method central-scheduler \\
|
|
211
211
|
--block-verification-method unified-scheduler \\
|
|
212
212
|
--full-rpc-api \\
|
|
213
|
-
`,"startTestnetAgaveValidatorScript");import{existsAsync as sn}from"@skeet-framework/utils";import{writeFile as an}from"fs/promises";var Pc=r(async t=>{let{NETWORK:e}=t;e===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await Ic(t)):e===u.TESTNET?(console.log("Testnet Validator Node Setup"),await Lc(t)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Ic=r(async t=>{let{VALIDATOR_TYPE:e,MAINNET_SOLANA_VERSION:o}=t,n="";switch(e){case A.SOLANA:To(o),n=nn(t);break;case A.JITO:console.log("JITO Validator Setup for Mainnet");let s=await At();Qt(o),n=Eo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await sn(Q)){console.log("Startup script already exists. Skipping...");return}await an(Q,n,"utf-8"),Xt()},"setupMainnetValidator"),Lc=r(async t=>{let{VALIDATOR_TYPE:e}=t,o="";switch(e){case A.SOLANA:To(t.TESTNET_SOLANA_VERSION),o=go(t);case A.AGAVE:console.log("Agave Validator Setup for Testnet"),Ct(t.TESTNET_SOLANA_VERSION),o=go(t);break;case A.JITO:console.log("JITO Validator Setup for Testnet");let n=await At();Qt(t.TESTNET_SOLANA_VERSION),o=Eo(n.commissionBps,n.relayerUrl,n.blockEngineUrl,n.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Testnet");break}if(await sn(Q)){console.log("Startup script already exists. Skipping...");return}await an(Q,o,"utf-8"),Xt()},"setupTestnetValidator"),cn=Pc;import Dn from"chalk";import{execSync as ln}from"node:child_process";function mn(t){try{ln(`test -d ${t}`),console.log(`${t} already exists.`)}catch{ln(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(mn,"createDirectoryIfNotExists");var pn=r(()=>{try{let t=[
|
|
214
|
-
`).slice(1),o=[],n=e.map(S=>S.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c=!1,l="";for(let S of e){let[y,Y,P]=S.trim().split(/\s+/);if(!y||!Y)continue;let G=parseInt(Y,10);if(isNaN(G))continue;let
|
|
215
|
-
${e} ${
|
|
216
|
-
${e} ${
|
|
217
|
-
${o} ${
|
|
213
|
+
`,"startTestnetAgaveValidatorScript");import{existsAsync as sn}from"@skeet-framework/utils";import{writeFile as an}from"fs/promises";var Pc=r(async t=>{let{NETWORK:e}=t;e===u.MAINNET?(console.log("Mainnet Validator Node Setup"),await Ic(t)):e===u.TESTNET?(console.log("Testnet Validator Node Setup"),await Lc(t)):console.log("Unknown Network Validator Node Setup")},"setupValidatorNode"),Ic=r(async t=>{let{VALIDATOR_TYPE:e,MAINNET_SOLANA_VERSION:o}=t,n="";switch(e){case A.SOLANA:To(o),n=nn(t);break;case A.JITO:console.log("JITO Validator Setup for Mainnet");let s=await At();Qt(o),n=Eo(s.commissionBps,s.relayerUrl,s.blockEngineUrl,s.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Mainnet");break}if(await sn(Q)){console.log("Startup script already exists. Skipping...");return}await an(Q,n,"utf-8"),Xt()},"setupMainnetValidator"),Lc=r(async t=>{let{VALIDATOR_TYPE:e}=t,o="";switch(e){case A.SOLANA:To(t.TESTNET_SOLANA_VERSION),o=go(t);case A.AGAVE:console.log("Agave Validator Setup for Testnet"),Ct(t.TESTNET_SOLANA_VERSION),o=go(t);break;case A.JITO:console.log("JITO Validator Setup for Testnet");let n=await At();Qt(t.TESTNET_SOLANA_VERSION),o=Eo(n.commissionBps,n.relayerUrl,n.blockEngineUrl,n.shredReceiverAddr,t);break;default:console.log("Unknown Validator Type for Testnet");break}if(await sn(Q)){console.log("Startup script already exists. Skipping...");return}await an(Q,o,"utf-8"),Xt()},"setupTestnetValidator"),cn=Pc;import Dn from"chalk";import{execSync as ln}from"node:child_process";function mn(t){try{ln(`test -d ${t}`),console.log(`${t} already exists.`)}catch{ln(`sudo mkdir -p ${t}`),console.log(`${t} has been created.`)}}r(mn,"createDirectoryIfNotExists");var pn=r(()=>{try{let t=[v.ACCOUNTS,v.LEDGER,v.SNAPSHOTS];for(let e of t)mn(e)}catch(t){throw new Error(`setupDirs Error: ${t}`)}},"setupDirs");import{execSync as xc}from"child_process";function Vc(){let e=xc("lsblk -l -b -o NAME,SIZE,MOUNTPOINT",{encoding:"utf8"}).split(`
|
|
214
|
+
`).slice(1),o=[],n=e.map(S=>S.trim().split(/\s+/)[0]),s=!1,a=!1,i=!1,c=!1,l="";for(let S of e){let[y,Y,P]=S.trim().split(/\s+/);if(!y||!Y)continue;let G=parseInt(Y,10);if(isNaN(G))continue;let Ot=P!==void 0&&P!=="";P==="/"&&(l=y.replace(/p?\d*$/,""));let Yt=n.some(Mo=>Mo!==y&&Mo.startsWith(y)),ai=y.startsWith("nvme")?"NVMe":"SATA";G>=400*1024*1024*1024&&o.push({name:y,size:G,mountpoint:P||"",isMounted:Ot,hasPartition:Yt,type:ai})}console.log("Found root disk name: ",l);let m=n.filter(S=>S.startsWith(l));m.forEach(S=>console.log("Found root disk partition: ",S));let p=o.filter(S=>!m.includes(S.name)).sort((S,y)=>y.size-S.size),h=p.filter(S=>S.type==="NVMe").sort((S,y)=>y.size-S.size),g=p.filter(S=>S.type==="SATA").sort((S,y)=>y.size-S.size),w=[...h,...g];if(w.length>0){let S=w[0];if(S.size>=850*1024*1024*1024&&!S.isMounted&&(s=!0),S.size>=1250*1024*1024*1024&&S.isMounted&&(i=!0),w.length>1){let y=w[1];y.size>=400*1024*1024*1024&&!y.isMounted&&(a=!0)}if(w.length>2){let y=w[2];y.size>=400*1024*1024*1024&&!y.isMounted&&(c=!0)}}return w.forEach((S,y)=>console.log(`Prioritized Disk ${y+1}: ${S.name} ${S.size}`)),{disks:w,has850GB:s,has400GB:a,hasUsed1250GB:i,hasThirdDisk400GB:c}}r(Vc,"getPreferredDisks");var Zt=Vc;import{spawnSync as dn}from"child_process";var dt=r(t=>{if(dn(`sudo blkid ${t}`,{shell:!0,encoding:"utf8"}).stdout.trim())return console.log(`${t} is already formatted.`),!1;{let o=`sudo mkfs.ext4 ${t}`;return dn(o,{shell:!0,stdio:"inherit"}),console.log(`${t} has been formatted.`),!0}},"formatDisk");import{spawnSync as Ao}from"child_process";var te=r((t,e="",o="",n=!1,s=!1)=>{let a=`${t} ${v.ROOT} ext4 auto 0 0`;n&&(a=`${t} ${v.LEDGER} ext4 auto 0 0
|
|
215
|
+
${e} ${v.ACCOUNTS} ext4 auto 0 0`),s&&(a=`${t} ${v.LEDGER} ext4 auto 0 0
|
|
216
|
+
${e} ${v.ACCOUNTS} ext4 auto 0 0
|
|
217
|
+
${o} ${v.SNAPSHOTS} ext4 auto 0 0`);let i=[a],l=Ao("cat /etc/fstab",{shell:!0,encoding:"utf8"}).stdout,m=[];for(let d of i)l.includes(d)||m.push(d);if(m.length){let d=`echo "${m.join(`
|
|
218
218
|
`)}" | sudo tee -a /etc/fstab`;Ao(d,{shell:!0,encoding:"utf8"}),Ao("sudo mount --all --verbose",{shell:!0,encoding:"utf8"}),console.log(`Added lines to /etc/fstab:
|
|
219
219
|
${m.join(`
|
|
220
|
-
`)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as $c}from"child_process";var un=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=$c(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Dc=r(async()=>{let t=Zt(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB&&t.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await
|
|
220
|
+
`)}`)}else console.log("All lines are already present in /etc/fstab")},"ensureFstabEntries");import{spawnSync as $c}from"child_process";var un=r(t=>{try{let e=`sudo umount ${t}`,{stderr:o}=$c(e,{shell:!0,stdio:"inherit"});return!o.includes("busy")}catch(e){return console.log(`umount: ${e}`),!1}},"umount");var Dc=r(async()=>{let t=Zt(),e=t.disks[0].mountpoint;if(t.has850GB&&t.has400GB&&t.disks.length>=3){console.log("Setting up TRIPLE DISK..."),await O({MNT_DISK_TYPE:W.TRIPLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s="/dev/"+t.disks[2].name,a=dt(o),i=dt(n),c=dt(s);te(a?a?o:"":"",i?i?n:"":"",c?c?s:"":"",!1,!0)}else if(t.has850GB&&t.has400GB){console.log("Setting up DOUBLE DISK..."),await O({MNT_DISK_TYPE:W.DOUBLE});let o="/dev/"+t.disks[0].name,n="/dev/"+t.disks[1].name,s=dt(o),a=dt(n);te(s?s?o:"":"",a?a?n:"":"","",!0)}else if(console.log("Setting up SINGLE DISK..."),await O({MNT_DISK_TYPE:W.SINGLE}),e.includes("/mnt")){un(e);let o="/dev/"+t.disks[0].name;dt(o),te(o)}else{let o="/dev/"+t.disks[0].name;dt(o),te(o)}},"mountDirs"),fn=Dc;import{spawnSync as Kc}from"child_process";var hn=r(()=>{let t=[`sudo mkdir -p ${v.ROOT}`,`sudo chown -R solv:solv ${v.ROOT}`,`sudo chmod -R 755 ${v.ROOT}`,`sudo mkdir -p ${v.ACCOUNTS}`,`sudo chown -R solv:solv ${v.ACCOUNTS}`,`sudo chmod -R 755 ${v.ACCOUNTS}`,`sudo mkdir -p ${v.LEDGER}`,`sudo chown -R solv:solv ${v.LEDGER}`,`sudo chmod -R 755 ${v.LEDGER}`,`sudo mkdir -p ${v.SNAPSHOTS}`,`sudo chown -R solv:solv ${v.SNAPSHOTS}`,`sudo chmod -R 755 ${v.SNAPSHOTS}`];for(let e of t)Kc(e,{shell:!0,stdio:"ignore"})},"setupPermissions");import{execSync as $e}from"child_process";import{existsSync as bc}from"fs";function Sn(){if(!bc(L.SOL_SYSTEM_CONFIG21)){console.log("Creating solana-validator.conf sysctl configuration file");let t=`
|
|
221
221
|
# Increase UDP buffer sizes
|
|
222
222
|
net.core.rmem_default = 134217728
|
|
223
223
|
net.core.rmem_max = 134217728
|
|
@@ -261,7 +261,7 @@ Environment="${o}"
|
|
|
261
261
|
ExecStart=${e}
|
|
262
262
|
|
|
263
263
|
[Install]
|
|
264
|
-
WantedBy=multi-user.target`},"solvService");import{execSync as jc}from"child_process";function gn(t=!0){console.log("Creating solvService configuration for solana");let e=En(t);jc(`echo "${e}" | sudo tee ${L.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(gn,"setupSolvService");var An=r((t=!0)=>{Tn(),gn(t),Sn()},"makeServices");import{spawnSync as wo}from"node:child_process";var wn=r(t=>{try{xe(t);let e=t.NETWORK;return e===u.TESTNET?(wo(`solana config set --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"}),wo(`solana airdrop 1 --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"})):wo(`solana config set --url ${e} -k ${D}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==E.RPC&&Ie(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as _n}from"node:child_process";var De=r((t=!1,e="45",o=X,n,s=t?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",a=!1)=>{try{let i=`docker run -it --rm -v ${o}:${o} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${o} --min_download_speed ${e} --version ${n} --rpc ${s}`;if(t&&a){_n(`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:o});return}_n(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");import{spawnSync as Bc}from"node:child_process";var Ke=r(t=>{let o=[`sudo systemctl start ${t.VALIDATOR_TYPE===A.FRANKENDANCER?"frankendancer":"solv"}`];Bc(o[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as Jc}from"node:child_process";var Gc=r(()=>{try{Jc('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Nn=Gc;import _o from"fs";import{promisify as
|
|
264
|
+
WantedBy=multi-user.target`},"solvService");import{execSync as jc}from"child_process";function gn(t=!0){console.log("Creating solvService configuration for solana");let e=En(t);jc(`echo "${e}" | sudo tee ${L.SOL_SERVICE} > /dev/null`),console.log("solv.service configuration created.")}r(gn,"setupSolvService");var An=r((t=!0)=>{Tn(),gn(t),Sn()},"makeServices");import{spawnSync as wo}from"node:child_process";var wn=r(t=>{try{xe(t);let e=t.NETWORK;return e===u.TESTNET?(wo(`solana config set --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"}),wo(`solana airdrop 1 --url ${e} -k ${I}`,{shell:!0,stdio:"inherit"})):wo(`solana config set --url ${e} -k ${D}`,{shell:!0,stdio:"inherit"}),t.NODE_TYPE!==E.RPC&&Ie(t),!0}catch(e){throw new Error(`setupKeys Error: ${e}`)}},"setupKeys");import{spawnSync as _n}from"node:child_process";var De=r((t=!1,e="45",o=X,n,s=t?"https://api.testnet.solana.com":"https://api.mainnet-beta.solana.com",a=!1)=>{try{let i=`docker run -it --rm -v ${o}:${o} --user $(id -u):$(id -g) c29r3/solana-snapshot-finder:latest --snapshot_path ${o} --min_download_speed ${e} --version ${n} --rpc ${s}`;if(t&&a){_n(`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:o});return}_n(i,{shell:!0,stdio:"inherit"})}catch(i){throw new Error(`getSnapshot Error: ${i}`)}},"getSnapshot");import{spawnSync as Bc}from"node:child_process";var Ke=r(t=>{let o=[`sudo systemctl start ${t.VALIDATOR_TYPE===A.FRANKENDANCER?"frankendancer":"solv"}`];Bc(o[0],{shell:!0,stdio:"inherit"})},"startSolana");import{execSync as Jc}from"node:child_process";var Gc=r(()=>{try{Jc('echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor')}catch{}},"setupCpuGovernor"),Nn=Gc;import _o from"fs";import{promisify as On}from"util";import{execSync as vn}from"child_process";var zc=On(_o.readFile),Wc=On(_o.access),be="/etc/sysctl.conf",qc=`# set default and maximum socket buffer sizes to 128MB
|
|
265
265
|
net.core.rmem_default=134217728
|
|
266
266
|
net.core.wmem_default=134217728
|
|
267
267
|
net.core.rmem_max=134217728
|
|
@@ -274,7 +274,7 @@ net.ipv4.tcp_wmem=10240 87380 134217728
|
|
|
274
274
|
# Enable TCP westwood for kernels greater than or equal to 2.6.13
|
|
275
275
|
net.ipv4.tcp_congestion_control=westwood`;async function Qc(){try{await Wc(be,_o.constants.F_OK)}catch{return console.log(`Skipping updateSysctlConfig: ${be} does not exist`)}try{let t=await zc(be,"utf8");if(!t.includes("rmem_default")){console.log("No need to update sysctl.conf");return}let e=t.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+=`
|
|
276
276
|
${qc}
|
|
277
|
-
`,
|
|
277
|
+
`,vn(`echo "${e}" | sudo tee ${be} > /dev/null`),vn("sudo sysctl -p"),console.log("sysctl.conf updated successfully")}catch(t){console.error(`Error: ${t}`)}}r(Qc,"updateSysctlConfig");var kn=Qc;import{spawnSync as Xc}from"child_process";var Rn=r(()=>{Xc("sudo systemctl restart logrotate",{shell:!0,stdio:"inherit"})},"restartLogrotate");import{spawnSync as Zc}from"node:child_process";var Cn=r(()=>{Zc("sudo systemctl enable solv",{shell:!0,stdio:"inherit"})},"enableSolv");import{spawnSync as Pn}from"child_process";var In=r((t=!1,e=!1)=>{t?el():tl(e)},"createSymLink"),tl=r((t=!1)=>{let e="mainnet";t&&(e="testnet"),Pn(`ln -sf /home/solv/${e}-validator-keypair.json /home/solv/identity.json`,{shell:!0,stdio:"inherit"})},"createActiveSymLink"),el=r(()=>{Pn("ln -sf /home/solv/unstaked-identity.json /home/solv/identity.json",{shell:!0,stdio:"inherit"})},"createInactiveSymLink");import Ue from"chalk";var ol=r(()=>{let t=`${Ue.yellow("\u26A1\uFE0F\u26A1\uFE0F\u26A1\uFE0F")}`,e=`${Ue.blueBright(`${t} Solana Private RPC Connection API Key ${t}`)}
|
|
278
278
|
|
|
279
279
|
We're excited to offer a free API key exclusively for the Validators DAO community \u{1F389}
|
|
280
280
|
It's our way of supporting the community and empowering you with fast, reliable connections.
|
|
@@ -429,8 +429,8 @@ WantedBy=multi-user.target`;return{filePath:e,body:o}},"jitoRelayerSeparateServi
|
|
|
429
429
|
`);o.splice(-1,0,"--geyser-plugin-config /home/solv/yellowstone-grpc/yellowstone-grpc-geyser/config.json \\");let n=o.join(`
|
|
430
430
|
`);await pl(t,n),ll(`chmod +x ${t}`,{shell:!0,stdio:"inherit"})},"addConfigToStartupScript"),Fn=dl;import ul from"inquirer";import{writeFile as fl}from"node:fs/promises";var Yn=r(async()=>{let e=(await ul.prompt([{type:"input",name:"xToken",message:"Enter the xToken",default:"xToken"}])).xToken,o="git clone https://github.com/rpcpool/yellowstone-grpc.git",n="cargo build -r",s="cargo-fmt && cargo run --bin config-check -- --config yellowstone-grpc-geyser/config.json";No(o,{shell:!0,stdio:"inherit"}),No(n,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"}),No(s,{shell:!0,stdio:"inherit",cwd:"/home/solv/yellowstone-grpc"});let{filePath:a,defaultConfig:i}=Hn(e),c=JSON.stringify(i,null,2);await fl(a,c,{encoding:"utf8"}),await Fn()},"yellowstoneGeyser");var jn=r(t=>{f.command("setup").description("Setup Solana Validator").option("--vote","Setup Vote Account",!1).option("--key","Setup Validator Keypairs",!1).option("--relayer","Setup Jito Relayer",!1).option("--jupiter","Setup Jupiter Swap API",!1).option("--geyser","Setup Geyser",!1).option("--firedancer","Setup Firedancer",!1).option("--skip-init-config","Skip Initial Config",!1).option("--skip-mount","Skip Mount",!1).option("--pivot","Pivot install",!1).action(async e=>{try{if(e.vote)console.log(ct.white("\u{1F5F3}\uFE0F Setting up Vote Account ...")),Ie(t),process.exit(0);else if(e.key)console.log(ct.white("\u{1F511} Setting up Validator Keypairs ...")),xe(t),process.exit(0);else if(e.relayer){console.log(ct.white("\u{1F6F0}\uFE0F Setting up Jito Relayer ..."));let n=(await At()).blockEngineUrl;await Mn(n,!1),console.log(ct.green(`Jito Relayer Setup Completed
|
|
431
431
|
|
|
432
|
-
$ solv relayer --help`)),Wt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Qr(),Wt(),wt(),process.exit(0);else if(e.geyser){console.log(ct.white("\u26A1\uFE0F Setting up Geyser ...")),await Yn();return}else if(e.firedancer){console.log(ct.white("\u{1F525} Setting up Firedancer ...")),await Me();return}await Kn(e.skipInitConfig,e.skipMount,e.pivot)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(ct.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ct.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as hl}from"child_process";var
|
|
433
|
-
`).slice(1).filter(s=>s.split(/\s+/)[0]!=="").map(s=>{let a=s.split(/\s+/);return{Filesystem:a[0],Size:a[1],Used:a[2],Avail:a[3],Use:a[4],MountedOn:a[5]}}).sort((s,a)=>_t(a.Avail)-_t(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&_t(s.Size)>9e11-1&&console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: red")}),n?console.log("your mount point is correct"):o.filter(a=>a.Filesystem.startsWith("/dev/")&&_t(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import Bn from"chalk";import Sl from"cli-table3";var
|
|
432
|
+
$ solv relayer --help`)),Wt(),wt(),process.exit(0)}else if(e.jupiter)console.log(ct.white("\u{1F30F} Setting up Jupiter Swap API ...")),await Qr(),Wt(),wt(),process.exit(0);else if(e.geyser){console.log(ct.white("\u26A1\uFE0F Setting up Geyser ...")),await Yn();return}else if(e.firedancer){console.log(ct.white("\u{1F525} Setting up Firedancer ...")),await Me();return}await Kn(e.skipInitConfig,e.skipMount,e.pivot)}catch(o){(o.message.includes("User force closed the prompt")||o.message.includes("initialConfigSetup"))&&(console.error(ct.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(ct.red(`Setup Error: ${o.message}`)),process.exit(0)}})},"setupCommands");import{execSync as hl}from"child_process";var vo=r(()=>{let o=hl("df -h").toString().split(`
|
|
433
|
+
`).slice(1).filter(s=>s.split(/\s+/)[0]!=="").map(s=>{let a=s.split(/\s+/);return{Filesystem:a[0],Size:a[1],Used:a[2],Avail:a[3],Use:a[4],MountedOn:a[5]}}).sort((s,a)=>_t(a.Avail)-_t(s.Avail)).slice(0,10),n=o.some(s=>s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1);return o.forEach(s=>{s.MountedOn==="/mnt"&&_t(s.Size)>9e11-1?console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: green"):s.Filesystem.startsWith("/dev/")&&_t(s.Size)>9e11-1&&console.log(`%c${s.Filesystem} ${s.Size} ${s.MountedOn}`,"color: red")}),n?console.log("your mount point is correct"):o.filter(a=>a.Filesystem.startsWith("/dev/")&&_t(a.Size)>899999999999).map(a=>a.Filesystem).length>0,o},"df");import Bn from"chalk";import Sl from"cli-table3";var Oo=r(t=>{let e=["Filesystem","Size","Used","Avail","Use","MountedOn"].map(n=>Bn.blue(n)),o=new Sl({head:e,colWidths:[20,10,10,10,10,20]});t.forEach(n=>{o.push([n.Filesystem,n.Size,n.Used,n.Avail,n.Use,n.MountedOn].map(s=>Bn.white(s)))}),console.log(o.toString())},"displayTable");var Jn=r(async()=>{f.command("df").description("Disk Free Command").action(()=>{let t=vo();Oo(t)})},"dfCommands"),_t=r(t=>{let e={K:1e3,KB:1e3,M:1e6,MB:1e6,G:1e9,GB:1e9,T:1e12,TB:1e12},o=t.match(/[A-Za-z]+/)?.[0]||"",n=parseFloat(t);return e[o]?n*e[o]:n},"convertToBytes");var Gn=r(t=>{f.command("start").description("Start Solana Validator").action(()=>{Ke(t),process.exit(0)})},"startCommand");import{spawnSync as yl}from"node:child_process";var zn=r(t=>{let o=[`sudo systemctl stop ${t.VALIDATOR_TYPE===A.FRANKENDANCER?"frankendancer":"solv"}`];yl(o[0],{shell:!0,stdio:"inherit"})},"stopSolana");var Wn=r(t=>{f.command("stop").description("Stop Solana Validator").action(()=>{zn(t),process.exit(0)})},"stopCommand");import{spawnSync as ee}from"node:child_process";import qn from"chalk";var Qn=r(t=>{let e=K();f.command("restart").description("Restart Solana Validator").option("-r, --rm","Remove Snapshot and Restart Validator",!1).action(async o=>{o.rm&&(console.log(qn.white("\u{1F477}\u200D\u2640\uFE0F Removing Snapshot and Restarting Validator...")),ee("solv stop",{stdio:"inherit",shell:!0}),ee("solv rm:snapshot",{stdio:"inherit",shell:!0}),ee("solv get snapshot",{stdio:"inherit",shell:!0}),ee("solv start",{stdio:"inherit",shell:!0}),console.log(qn.green("\u2714\uFE0E Successfully Restarted Validator")),process.exit(0));let n=`${e} --ledger ${t.LEDGER_PATH} exit --max-delinquent-stake ${t.MAINNET_DELINQUENT_STAKE}`;ee(n,{shell:!0,stdio:"inherit"}),process.exit(0)})},"restartCommand");var Xn=r(t=>{let o=t.NETWORK===u.TESTNET?et:ot;t.NODE_TYPE===E.RPC&&(o=gt),f.command("install").alias("i").description("Install Solana Client").option("-v, --version <version>",`Solana Version e.g. ${o}`,o).action(async n=>{if(t.VALIDATOR_TYPE===A.JITO){let l=`v${n.version||Gt}-mod`;_e(l);return}t.NODE_TYPE===E.RPC&&(o=gt);let i=n.version||o;await Te(i)})},"installCommands");import{spawnSync as Tl}from"child_process";var Zn=r(()=>{f.command("mtr").description("Mount Reload Command").action(()=>{Tl("sudo mount --all --verbose",{shell:!0,stdio:"inherit"})}),f.command("disks").description("Show unmounted disks").action(()=>{let t=Zt();console.log(t)})},"mountCommands");import{spawnSync as Al}from"node:child_process";import ts from"chalk";import{spawnSync as El}from"child_process";var gl=r(async()=>{try{let t=El("crontab",["-l"],{encoding:"utf-8"});if(t.status!==0)return console.log("No crontab for this user."),!1;let e=t.stdout;return console.log(e),e.includes("solv epochTimer")}catch(t){return console.error("Error reading crontab:",t),!1}},"hasEpochTimer"),Fe=gl;var es=r(()=>{f.command("cron").description("Cron Job Commands").command("epoch").description("Solv Epoch Timer Discord Notification Command").option("-c, --cron <value>","Cron Job","*/5 * * * *").action(async e=>{await Fe()&&(console.log(ts.green("\u26A0\uFE0F Epoch Timer Cron Job already set")),process.exit(1));let n=`(crontab -l 2>/dev/null; echo "${e.cron} . /home/solv/.profile && solv epochTimer >> /home/solv/cron.log 2>&1") | crontab -`;Al(n,{shell:!0,stdio:"inherit"}),console.log(ts.green("\u2705 Epoch Timer Cron Job Set"))})},"cronCommands");var oe={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 _l,mkdirSync as Nl}from"fs";import vl from"inquirer";import{homedir as Ol}from"os";import{spawnSync as wl}from"node:child_process";function os(t,e,o,n){let s=n?`scp -o StrictHostKeyChecking=no solv@${t}:${e} ${o}`:`scp -o StrictHostKeyChecking=no ${e} solv@${t}:${o}`;return wl(s,{shell:!0,stdio:"inherit"}).status===0}r(os,"executeSCP");var ko=r(async(t="")=>{let e=t;t===""&&(e=(await vl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let o=Object.values(N()),n=Ol(),s=n.includes("/home/solv")?"/home/solv":n+oe.SOLV_KEYPAIR_DOWNLOAD_PATH;_l(s)||Nl(s,{recursive:!0});let a=!0,i=n+"/"+jo;o.push(i);for(let c of o){let l=c.split("/"),m=l[l.length-1];m=n.includes("/home/solv")?m:m.replace(".json",`-${e}.json`);let d=`${s}/${m}`;os(e,c,d,a)&&console.log(`Successfully Exported - ${d} \u{1F389}`)}},"download");import{spawnSync as kl}from"child_process";import{existsSync as Rl}from"fs";import Cl from"inquirer";import Pl from"os";var rs=r(async(t="")=>{let e=Pl.userInfo().homedir,o=t;t===""&&(o=(await Cl.prompt([{type:"input",name:"ip",message:"Enter your Ubuntu Server IP",default(){return"1.1.1.1"}}])).ip);let n=`${e}${oe.SOLV_KEYPAIR_UPLOAD_PATH}`;e.includes("/home/solv")&&(n=oe.SOLV_KEYPAIR_UPLOAD_PATH_LINUX);let s=Object.values(N(n));for(let a of s){let i=a.split("/"),c=i[i.length-1];if(!c.endsWith("keypair.json"))continue;let l=`${n}/${c}`;if(!Rl(l))continue;let m=`scp -o StrictHostKeyChecking=no ${l} solv@${o}:${a}`;kl(m,{shell:!0,stdio:"inherit"}),console.log(`Successfully Uploaded - ${c} \u{1F389}`)}},"upload");import{spawnSync as Il}from"child_process";import Ll from"inquirer";var ns=r(async()=>{let t=await Ll.prompt({type:"input",name:"pubkey",message:"Enter your SSH Public Key",default(){return"xxxxxxxpubkeyxxxxxxxx"}}),e=`mkdir -p ${b.ROOT}/.ssh && echo "${t.pubkey}" >> ${b.AUTHORIZED_KEYS}`;Il(e,{shell:!0,stdio:"inherit"}),console.log("Successfully Created SSH Login Setting \u{1F389}")},"scpCreate");import Ye from"chalk";import{readFileSync as xl}from"fs";import Vl from"os";var ss=r(()=>{try{let e=`${Vl.userInfo().homedir}/.ssh/id_rsa.pub`,o=xl(e,"utf8");console.log(Ye.white(`Your SSH Public Key is:
|
|
434
434
|
`)),console.log(Ye.white(o))}catch(t){console.error(Ye.white(`Error reading SSH Public Key
|
|
435
435
|
`)),console.error(Ye.white(t))}},"cat");import{spawnSync as $l}from"child_process";var as=r(()=>{$l("ssh-keygen -t rsa -b 4096",{shell:!0,stdio:"inherit"})},"init");import{spawn as Dl}from"child_process";import{readFileSync as Kl}from"fs";import{Readable as bl}from"stream";var is=r(async t=>new Promise((e,o)=>{try{let n=Dl("find",["/","-name","*.json","-size","-301c"]),s=[];n.stdout.on("data",a=>{s.push(...a.toString().split(`
|
|
436
436
|
`).filter(i=>i)),t.increment()}),n.stderr.on("data",a=>{t.increment()}),n.on("close",a=>{e(s)})}catch(n){o(`search Error: ${n}`)}}),"search"),Ul=r(t=>{try{return JSON.parse(Kl(t,"utf-8")).length===64}catch{return!1}},"checkIfSolanaKey"),cs=r(async(t,e)=>{let o=[],n=bl.from(t);return n.on("data",async s=>{Ul(s)&&o.push(s)}),new Promise((s,a)=>{n.on("end",()=>{s(o)}),n.on("error",i=>{a(i)})})},"processPaths");import je from"chalk";import{Presets as Yl,SingleBar as jl}from"cli-progress";import ls from"chalk";import{spawnSync as Ml}from"node:child_process";import Hl from"node-fetch";var Fl=r(async()=>{let t=await Hl(Qo,{method:"POST",headers:{"Content-Type":"application/json"}});if(t.status!==200)return console.log(ls.yellow(`\u26A0\uFE0F This Node is not Registered as Auto Operation Node.
|
|
@@ -449,18 +449,18 @@ Token Mint: ${a.mint}`;return(await gs.prompt([{type:"confirm",name:"confirm",me
|
|
|
449
449
|
Is this the correct Stake Pool?`}])).confirm?a:(console.log(re.yellow("\u2714\uFE0F Canceled")),null)}catch{return console.log(re.yellow(`\u26A0\uFE0F Invalid Stake Pool Address
|
|
450
450
|
Please check the correct address and try again.
|
|
451
451
|
`)),console.log(re.white(`For stake pool information
|
|
452
|
-
\u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Am}from"fs/promises";import ae from"inquirer";import{existsAsync as wm}from"@skeet-framework/utils";import{Connection as
|
|
452
|
+
\u{1F517} https://solanacompass.com/stake-pools/`)),null}},"selectLST");import{readFile as Am}from"fs/promises";import ae from"inquirer";import{existsAsync as wm}from"@skeet-framework/utils";import{Connection as Os,Keypair as Sm,PublicKey as se}from"@solana/web3.js";import{Connection as lm,PublicKey as mm,Keypair as pm}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as dm}from"@solana/spl-token";var ne=r(async(t,e,o,n,s=!1)=>{try{let a=pm.fromSecretKey(new Uint8Array(e)),i=new mm(o),c=new lm(t);return(await dm(c,a,i,n,s)).address.toBase58()}catch(a){throw console.log("Error in getOrCreateDestinationAddress",a),new Error(JSON.stringify(a))}},"getOrCreateDestinationAddress");import{Spinner as ym}from"cli-spinner";import Nt from"chalk";import{PublicKey as _s,Keypair as Ns,Transaction as ws,ComputeBudgetProgram as um,LAMPORTS_PER_SOL as fm}from"@solana/web3.js";import*as vs from"@solana/spl-stake-pool";var Lt=r(async(t,e,o,n=new _s(z),s,a,i)=>{try{let c=Ns.fromSecretKey(new Uint8Array(e)),l=o*fm,{instructions:m,signers:d}=await hm(t,e,l,n,s,a,i),p=new ws().add(...m);p.feePayer=c.publicKey;let h=await t.getLatestBlockhashAndContext({commitment:"finalized"});p.recentBlockhash=h.value.blockhash,p.sign(...d,c);let g=new ws().add(...m).add(um.setComputeUnitPrice({microLamports:1e3}));g.feePayer=c.publicKey,g.recentBlockhash=h.value.blockhash,g.sign(...d,c);let w=await t.sendRawTransaction(g.serialize(),{skipPreflight:!0});return await t.confirmTransaction({...h.value,signature:w},"finalized"),{status:"success",signature:w}}catch(c){return console.log("depositSol error",c),{status:"error",error:c}}},"depositSol"),hm=r(async(t,e,o,n=new _s(z),s,a,i)=>{let l=Ns.fromSecretKey(new Uint8Array(e)).publicKey;return await vs.depositSol(t,n,l,o,s,a,i)},"depositSOLInstruction");import{sleep as ks}from"@skeet-framework/utils";var ze=r(async(t,e,o,n)=>{console.log(Nt.white("Solana RPC URL:",t));let s=new Os(t);o===0&&(o=await We());let a=new ym("%s");a.setSpinnerString(18),a.start(),a.setSpinnerTitle(Nt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let i=new se(e),c=Sm.fromSecretKey(new Uint8Array(n)),l=tt;a.setSpinnerTitle(Nt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=await ne(t,n,l,c.publicKey);await ks(1e3),a.setSpinnerTitle(Nt.green("\u{1F504} Converting SOL to elSOL"));let d=await Lt(s,n,o,i,new se(m),new se(mo),c.publicKey),p=0;for(;d.status!=="success";){if(p++,p>10)return a.stop(!0),console.log(Nt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;a.setSpinnerTitle(Nt.yellow(`\u23F3 ${p} Times Retrying...`)),await ks(3e3),s=new Os(t),d=await Lt(s,n,o,i,new se(m),new se(mo),c.publicKey)}return a.stop(!0),console.log(Nt.white(`\u{1F4B0} Finished Deposit - You've got elSOL \u2728
|
|
453
453
|
|
|
454
454
|
Signature:`,d.signature)),!0},"elSOLdeposit");import{Connection as Tm,Keypair as Em,PublicKey as xt}from"@solana/web3.js";import{Spinner as gm}from"cli-spinner";import Vt from"chalk";import{sleep as Rs}from"@skeet-framework/utils";var Cs=r(async(t,e,o,n,s)=>{let a=new Tm(t);o===0&&(o=await We());let i=new gm("%s");i.setSpinnerString(18),i.start(),i.setSpinnerTitle(Vt.green(`\u2714\uFE0E Checking Stake Pool ${e}...`));let c=new xt(e),l=await Ge(t,e);if(!l)return console.log("Stake Pool not found"),!1;i.setSpinnerTitle(Vt.green("\u{1F50D} Getting or Creating AssociatedTokenAccount"));let m=l.poolMint,d=Em.fromSecretKey(new Uint8Array(n)),p=await ne(t,n,m,d.publicKey),h=await ne(t,n,m,new xt(ur),!0);await Rs(1e3),i.setSpinnerTitle(Vt.green(`\u{1F504} Converting SOL to ${s}`));let g=await Lt(a,n,o,c,new xt(p),new xt(h),d.publicKey),w=0;for(;g.status!=="success";){if(w++,w>10)return i.stop(!0),console.log(Vt.red("Failed to deposit.Please try again later \u{1F64F}")),!1;console.log(Vt.yellow(`\u23F3 ${w} Times Retrying...
|
|
455
455
|
`)),await Rs(1e3),g=await Lt(a,n,o,c,new xt(p),new xt(h),d.publicKey)}return i.stop(!0),console.log(Vt.white(`\u{1F4B0} You've got ${s} \u2728
|
|
456
456
|
|
|
457
457
|
Signature:`,g.signature)),!0},"depositeLST");import{execSync as qe}from"node:child_process";import{homedir as _m}from"os";var Ps=r(t=>{f.command("stake").description("Stake SOL").option("-l, --lst","Convert to Liquid Stake Token").option("-e, --elsol","Convert to elSOL",!1).option("-a, --amount <amount>","Amount of SOL to stake","0").action(async e=>{let o=Number(e.amount);console.log("RPC URL:",t.RPC_URL);let n=z,s=t.NETWORK===u.TESTNET,a=_m(),i=s?`${a}/testnet-authority-keypair.json`:`${a}/mainnet-authority-keypair.json`;if(qe(`solana config set --keypair ${i}`),!await wm(i)){console.log($t.yellow(`\u26A0\uFE0F No keypair found. Please place your keypair in the following path:
|
|
458
|
-
`)),console.log($t.white(i));return}let c=JSON.parse(await Am(i,"utf-8"));if(e.elsol){await ze(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await As(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Cs(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await Ss(t))return;let m=await x(),{validatorVoteAccount:d,stakeAccounts:p}=await
|
|
458
|
+
`)),console.log($t.white(i));return}let c=JSON.parse(await Am(i,"utf-8"));if(e.elsol){await ze(t.RPC_URL,n,o,c);return}else if(e.lst){let l=await As(t.RPC_URL);if(!l)return;n=l.stakePoolAddress,await Cs(t.RPC_URL,n,o,c,l.symbol);return}else{if(!await Ss(t))return;let m=await x(),{validatorVoteAccount:d,stakeAccounts:p}=await vm(m);for await(let h of p)try{await us(h,d)}catch{console.log($t.yellow(`Network might be busy, please try again later
|
|
459
459
|
You can use a custom RPC endpoint to avoid this issue
|
|
460
460
|
`))}}}),f.command("unstake").description("Unstake SOL").action(async()=>{let{unstakeOption:e}=await km();if(e==="Deactivate Stake"){let{stakeAccounts:o}=await Nm();for await(let n of o)try{await ys(n)}catch{console.log($t.yellow(`Network might be busy, please try again later
|
|
461
461
|
You can use a custom RPC endpoint to avoid this issue
|
|
462
462
|
`))}}else{let o=await Rm();await Ts(o.stakeAccounts,o.destinationAddress,o.solAmount)}})},"stakeCommands"),We=r(async()=>{let t=qe("solana address").toString().trim(),e=qe("solana balance").toString().replace("SOL","").trim();console.log($t.white(`\u{1F4D7} Selected Wallet: ${t}
|
|
463
|
-
\u{1F4B0} Account Balance:`,e+" SOL")),console.log($t.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ae.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Nm=r(async()=>{let t=await x();return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),
|
|
463
|
+
\u{1F4B0} Account Balance:`,e+" SOL")),console.log($t.yellow("\u26A0\uFE0F 0.03 SOL will be remaining in the account if you just press enter."));let o=await ae.prompt([{type:"input",name:"amount",message:"Enter amount of SOL to stake:",default:String(Number(e)-.03)}]);return Number(o.amount)},"askAmount"),Nm=r(async()=>{let t=await x();return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to deactivate stake from?",choices:t.STAKE_ACCOUNTS}])},"deactivateStakeAsk"),vm=r(async t=>{let e=t.STAKE_ACCOUNTS,o=t.NETWORK===u.TESTNET?Om(t):t.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 o}}])},"delegateStakeAsk"),Om=r(t=>{let n=`/home/solv/${t.NETWORK===u.TESTNET?"testnet-vote-account":"mainnet-vote-account"}-keypair.json`;return qe(`solana-keygen pubkey ${n}`).toString()},"getVoteAccountAddress"),km=r(async()=>{let t=["Deactivate Stake","Withdraw Stake"];return await ae.prompt([{type:"list",name:"unstakeOption",message:"What would you like to do?",choices:t,default:t[0]}])},"unstakeAsk"),Rm=r(async()=>{let t=(await x()).STAKE_ACCOUNTS;return await ae.prompt([{type:"checkbox",name:"stakeAccounts",message:"Which Stake Account would you like to withdraw stake from?",choices:t},{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 Cm}from"child_process";var Is=r(()=>{try{return Cm("solana epoch --commitment finalized -ul",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getEpoch Error: ${t}`}},"getEpoch");import{execSync as Pm}from"child_process";var Ls=r(()=>{try{return Pm("solana --url http://127.0.0.1:8899 slot",{encoding:"utf-8"}).toString().replace(/\n/g,"")}catch(t){return`getSlot Error: ${t}`}},"getSlot");import lt from"chalk";import{Spinner as Im}from"cli-spinner";var Dt;(function(t){t.successHex=lt.hex("#39A845"),t.warningHex=lt.hex("#FFD02E"),t.errorHex=lt.hex("#B5332E"),t.syncHex=lt.hex("#3073B7"),t.greyHex=lt.hex("#BEBDBD"),t.indigoHex=lt.hex("#3950A0"),t.pinkHex=lt.hex("#D8A1C4"),t.normal=e=>{console.log(lt.white(e))},t.syncSpinner=e=>{let o=new Im(lt.white(e)+` %s
|
|
464
464
|
`);try{return o.setSpinnerString(18),o.start(),o}catch(n){throw o.stop(!0),new Error(`syncSpinner Error: ${n}`)}},t.solvAA=()=>{let e=t.syncHex(" _ "),o=t.syncHex(" | | "),n=t.syncHex(" ___ ___ | |")+t.errorHex("_ __ "),s=t.syncHex("/ __|/ _ \\| |")+t.errorHex("\\ \\ / /"),a=t.syncHex("\\__ \\ (_) | |")+t.errorHex(" \\ V / "),i=t.syncHex("|___/\\___/|_|")+t.errorHex(" \\_/ ");console.log(`
|
|
465
465
|
${e}`),console.log(`${o}`),console.log(`${n}`),console.log(`${s}`),console.log(`${a}`),console.log(`${i}
|
|
466
466
|
`),console.log(`Solv Version: v${de}
|
|
@@ -507,7 +507,7 @@ Retrying Transaction in ${Ws}ms
|
|
|
507
507
|
Retries Left: ${d}`)),await rt(Ws),m=Po(l,{shell:!0,stdio:"inherit"}),d--;process.exit(0)})},"transferCommands"),ce=r(t=>/^[1-9A-HJ-NP-Za-km-z]{43,44}$/.test(t)?!0:"Invalid Solana keygen string. Please enter a valid key.","validateSolanaKey"),Zm=r(async()=>{let t=Qm(),e="mainnet-authority-keypair.json",o="mainnet-validator-keypair.json",n=`${t}/${e}`,s=Ze(`solana address -k ${n}`).toString().trim(),a=await Xe.prompt([{type:"list",name:"from",message:"Select Transfer From Account",choices:Xm}]),i=a.from==="Validator Account"?Object.values(to).filter(p=>p!=="Validator Account"):Object.values(to).filter(p=>p!=="Authority Account");if((await Xe.prompt([{type:"list",name:"to",message:"Select Transfer To Account",choices:i}])).to==="Other Account"){let{to:p}=await Xe.prompt([{type:"input",name:"to",message:"Enter Transfer To Account",validate:ce}]);s=p}else{let p=a.from==="Validator Account"?e:o;n=`${t}/${p}`,s=Ze(`solana address -k ${n}`).toString().trim()}let l=a.from==="Validator Account"?o:e,m=`${t}/${l}`,d=Ze(`solana address -k ${m}`).toString().trim();return{fromWalletPath:m,fromAddress:d,toAddress:s}},"selectFromKeypairs");import Qs from"chalk";import tp from"inquirer";import{execSync as Lo,spawnSync as ep}from"node:child_process";var Xs=r(async(t,e=!1)=>{let o=t.NETWORK===u.TESTNET,n=o?we:t.RPC_URL,s=o?"~/testnet-validator-keypair.json":"~/mainnet-validator-keypair.json",a=o?"~/testnet-authority-keypair.json":"~/mainnet-authority-keypair.json",i=o?"~/testnet-vote-account-keypair.json":"~/mainnet-vote-account-keypair.json",c=Lo(`solana balance ${i}`).toString().replace("SOL","").trim(),l=0,m=Number(c)-.03;if(e)l=m;else{console.log(Qs.white("\u{1F4B0} Current Vote Account Balance:",c+" SOL")),console.log(Qs.yellow("\u26A0\uFE0F 0.03 SOL will be left in the account if you just press enter."));let g=await tp.prompt([{type:"input",name:"sol",message:`How many SOL? e.g. ${m}`,default:String(m)}]);l=Number(g.sol)}let d=Lo(`solana address --keypair ${i}`).toString().trim(),p=Lo(`solana address --keypair ${a}`).toString().trim(),h=`solana withdraw-from-vote-account --keypair ${s} --commitment finalized ${d} ${p} ${l} --authorized-withdrawer ${a} --url ${n}`;ep(h,{shell:!0,stdio:"inherit"})},"withdraw");var Zs=r(t=>{f.command("withdraw").option("-a, --all","Withdraw All SOL",!1).description("Withdraw SOL from Vote Account to Authority Account").action(async e=>{await Xs(t,e.all),process.exit(0)})},"withdrawCommands");import{execSync as fp,spawnSync as hp}from"node:child_process";import{BN as ea}from"bn.js";import{LAMPORTS_PER_SOL as xo}from"@solana/web3.js";import{Connection as sp,LAMPORTS_PER_SOL as ap}from"@solana/web3.js";import{Keypair as op}from"@solana/web3.js";import{readFile as rp}from"fs/promises";var np=r(async t=>{let e=JSON.parse(await rp(t,"utf8"));return op.fromSecretKey(new Uint8Array(e))},"loadKeypairFromFile"),ta=np;import{homedir as ip}from"os";var j;(function(t){t.VALIDATOR="validator",t.AUTH="auth",t.VOTE="vote"})(j||(j={}));var cp={validator:"ValidatorKey",auth:"ValidatorAuthorityKey",vote:"ValidatorVoteKey"},lp=r(async(t,e="auth",o=!1)=>{let n=new sp(t),s=ip(),a=N(s),c=`${o?"testnet":"mainnet"}${cp[e]}`,l=a[c],m=await ta(l),d=await n.getBalance(m.publicKey),h=Number(d)/ap;if(isNaN(h))throw new Error("Failed to get balance");return h},"getBalance"),st=lp;var mp=new ea(3*xo),oa=r(async t=>{let e=await st(t,j.VALIDATOR),n=new ea(Number(Number(e)*xo)).sub(mp),s=Number(n)/xo;return s=Math.round(s*1e9)/1e9,s},"getHarvestBalance");import le from"chalk";import{Keypair as pp,Connection as dp,PublicKey as up,SystemProgram as ra,ComputeBudgetProgram as eo,VersionedTransaction as na,TransactionMessage as sa}from"@solana/web3.js";var aa=r(async(t,e,o,n)=>{let s=0;try{let a=new dp(t,"finalized"),i=pp.fromSecretKey(new Uint8Array(Array.from(e))),c=new up(o),l=n;for(;;)try{let m=[ra.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),eo.setComputeUnitLimit({units:2e5}),eo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],d=await a.getLatestBlockhashAndContext({commitment:"finalized"}),p=new na(new sa({instructions:m,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message()),h=await a.simulateTransaction(p,{replaceRecentBlockhash:!0,sigVerify:!1});p.sign([i]);let g=[ra.transfer({fromPubkey:i.publicKey,toPubkey:c,lamports:l}),eo.setComputeUnitLimit({units:h.value.unitsConsumed?Math.trunc(h.value.unitsConsumed*1.2):2e5}),eo.setComputeUnitPrice({microLamports:1e3})],w=new na(new sa({instructions:g,payerKey:i.publicKey,recentBlockhash:d.value.blockhash}).compileToV0Message());w.sign([i]);let S=await a.sendRawTransaction(w.serialize());return await a.confirmTransaction({...d.value,signature:S},"finalized"),console.log("finalized signature:",S),S}catch(m){if(s++,s>he)throw new Error(JSON.stringify(m));console.log(`solanaTransfer failed, ${s} times retrying... Error: ${m}`),await rt(1e3)}}catch(a){throw console.log(`solanaTransfer: ${a}`),new Error(JSON.stringify(a))}},"solanaTransfer");import{readFile as Sp}from"fs/promises";import{LAMPORTS_PER_SOL as yp}from"@solana/web3.js";var Vo=r(async t=>{let{mainnetValidatorAuthorityKey:e,mainnetValidatorKey:o}=N();await st(t,j.VOTE)<1?(console.log(le.white("Vote Account Balance is less than 1 SOL")),console.log(le.white("Skip withdrawing SOL from Vote Account to Authority Account"))):hp("solv withdraw --all",{shell:!0,stdio:"inherit"});let s=await oa(t);console.log(le.white(`Transferable Balance: ${s} SOL`));let a=s*yp;if(s<1)console.log(le.white("Validator Account Balance is less than 1 SOL")),console.log(le.white("Skip transferring SOL from Validator Account to Authority Account"));else{let i=fp(`solana address --keypair ${e}`).toString().trim(),c=JSON.parse(await Sp(o,"utf-8"));await aa(t,c,i,a)}return!0},"collectSOL");import{readFile as Rp}from"fs/promises";import Cp from"inquirer";import $o from"chalk";import{execSync as Tp}from"child_process";import{homedir as Ep}from"os";var gp=r(async t=>{try{let e=Ep(),{mainnetValidatorAuthorityKey:o}=N(e),n=`spl-token balance ${tt} --owner ${o} --url ${t}`,s=Tp(n).toString().trim();return Number(s)}catch(e){return console.log($o.red(`Error: ${e}`)),console.log($o.yellow(`You might need to install the Solana SPL CLI:
|
|
508
508
|
`)),console.log($o.white("$ cargo install spl-token-cli")),0}},"getElSOLBalance"),ia=gp;import no from"chalk";import{Connection as Ap,PublicKey as ca,Keypair as wp,ComputeBudgetProgram as oo,VersionedTransaction as la,TransactionMessage as ma}from"@solana/web3.js";import{getOrCreateAssociatedTokenAccount as pa,createTransferInstruction as da,TOKEN_PROGRAM_ID as ua}from"@solana/spl-token";var fa=r(async(t,e,o,n,s,a)=>{try{let i=new Ap(t,"finalized"),c=wp.fromSecretKey(new Uint8Array(e)),l=new ca(o),m=new ca(s),d=Math.trunc(n*Math.pow(10,a)),p=await pa(i,c,m,c.publicKey),h=await pa(i,c,m,l,!0);for(;;)try{let g=[da(p.address,h.address,c.publicKey,d,[],ua),oo.setComputeUnitLimit({units:2e5}),oo.setComputeUnitPrice({microLamports:Math.ceil(5e6)})],w=await i.getLatestBlockhashAndContext({commitment:"finalized"}),S=new la(new ma({instructions:g,payerKey:c.publicKey,recentBlockhash:w.value.blockhash}).compileToV0Message()),y=await i.simulateTransaction(S,{replaceRecentBlockhash:!0,sigVerify:!1});S.sign([c]);let Y=[da(p.address,h.address,c.publicKey,d,[],ua),oo.setComputeUnitLimit({units:y.value.unitsConsumed?Math.trunc(y.value.unitsConsumed*1.2):2e5}),oo.setComputeUnitPrice({microLamports:1e3})],P=new la(new ma({instructions:Y,payerKey:c.publicKey,recentBlockhash:w.value.blockhash}).compileToV0Message());P.sign([c]);let G=await i.sendRawTransaction(P.serialize());return await i.confirmTransaction({...w.value,signature:G},"finalized"),console.log("finalized signature:",G),G}catch(g){console.error("Transfer failed, retrying...",g)}}catch(i){throw console.error(i),i}},"transferSPLToken");import ro from"inquirer";import{spawnSync as ha}from"child_process";import Do from"chalk";import{promises as Sa}from"fs";var _p=r(async(t="epochTimer")=>{try{let e=ha("crontab",["-l"],{encoding:"utf-8"});e.status!==0&&(console.log(Do.red("\u26A0\uFE0F Could not read crontab.")),process.exit(1));let n=e.stdout.split(`
|
|
509
509
|
`).filter(a=>!a.includes(t)).join(`
|
|
510
|
-
`),s="/tmp/temp_crontab";await Sa.writeFile(s,n,"utf-8"),ha("crontab",[s]),await Sa.unlink(s),console.log(Do.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Do.red("Error removing cron job:",e))}},"removeCronJob"),ya=_p;import Ta from"chalk";var Np=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await ro.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await Fe()&&await ya(),await
|
|
510
|
+
`),s="/tmp/temp_crontab";await Sa.writeFile(s,n,"utf-8"),ha("crontab",[s]),await Sa.unlink(s),console.log(Do.green("\u2705 Cron Job successfully removed."))}catch(e){console.log(Do.red("Error removing cron job:",e))}},"removeCronJob"),ya=_p;import Ta from"chalk";var Np=r(async t=>{let e=t.NETWORK===u.TESTNET,o=await ro.prompt([{type:"confirm",name:"mevOn",message:"Do you want to enable solv Auto Operation Mode?(You can change it again)",default:!1}]);if(!o.mevOn)return await Fe()&&await ya(),await O({IS_MEV_MODE:o.mevOn,AUTO_UPDATE:!1,AUTO_RESTART:!1}),!1;let n=`\u2728 About Auto Update & Restart \u2728
|
|
511
511
|
${Ta.green("No more Login to the server to update \u{1F331}")}
|
|
512
512
|
|
|
513
513
|
If you enable this, solv will update automatically when the solv/solana version is updated.
|
|
@@ -516,33 +516,33 @@ AUTO UPDATE: If you enable this, solv will update automatically when the solv ve
|
|
|
516
516
|
|
|
517
517
|
AUTO RESTART: If you enable this, solv will restart automatically when the solana version is updated.
|
|
518
518
|
\u203B Please turn off if you are using no-downtime migration.
|
|
519
|
-
`;console.log(Ta.white(n));let s=await ro.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}]),a=t.RPC_URL,i=t.HARVEST_ACCOUNT===""?"Enter your Harvest Address":t.HARVEST_ACCOUNT,c=await ro.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await ro.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL},{type:"input",name:"harvestAddress",message:"Enter your Harvest Address",default:i,validate:ce}]);i=l.harvestAddress,a=l.rpcUrl}return await
|
|
519
|
+
`;console.log(Ta.white(n));let s=await ro.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}]),a=t.RPC_URL,i=t.HARVEST_ACCOUNT===""?"Enter your Harvest Address":t.HARVEST_ACCOUNT,c=await ro.prompt([{type:"input",name:"discordWebhookUrl",message:"Enter your Discord Webhook URL",default:t.DISCORD_WEBHOOK_URL}]);if(e)i="";else{let l=await ro.prompt([{type:"input",name:"rpcUrl",message:"Enter your RPC URL",default:t.RPC_URL},{type:"input",name:"harvestAddress",message:"Enter your Harvest Address",default:i,validate:ce}]);i=l.harvestAddress,a=l.rpcUrl}return await O({HARVEST_ACCOUNT:i,IS_MEV_MODE:o.mevOn,RPC_URL:a,DISCORD_WEBHOOK_URL:c.discordWebhookUrl,AUTO_UPDATE:s.autoUpdate,AUTO_RESTART:s.autoRestart}),!0},"mevOn"),Ea=Np;import{spawnSync as Pp}from"node:child_process";import{Connection as kp}from"@solana/web3.js";import{Connection as vp}from"@solana/web3.js";var Op=r(async(t,e=10,o=.4)=>{try{let s=await new vp(t).getRecentPerformanceSamples(e);if(s.length===0)return console.warn("No performance samples available. Using fallback slot time."),o;let a=s.filter(c=>c.numSlots!==0);return a.length===0?(console.warn("All performance samples have numSlots equal to 0. Using fallback slot time."),o):a.reduce((c,l)=>c+l.samplePeriodSecs/l.numSlots,0)/a.length}catch(n){return console.error(`getAverageSlotTime failed: ${n}. Using fallback slot time.`),o}},"getAverageSlotTime"),ga=Op;var Ko=r(async t=>{try{let o=await new kp(t).getEpochInfo();if(o.slotsInEpoch===0)throw new Error("slotsInEpoch is 0, causing division by zero.");let n=await ga(t);console.log("timePerSlotSeconds",n);let a=(o.slotsInEpoch-o.slotIndex)*n,i=(o.slotIndex/o.slotsInEpoch*100).toFixed(2),c=Math.floor(a/(3600*24)),l=Math.floor(a%(3600*24)/3600),m=Math.floor(a%3600/60),d=Math.floor(a%60),p=`${c}d ${l}h ${m}m ${d}s`;return c===0&&(p=`${l}h ${m}m ${d}s`),{...o,estimatedTimeUntilNextEpoch:p,displayRatio:i}}catch(e){throw new Error(`getEpochInfo failed: ${e}`)}},"getEpochInfo");var Ip=.03,Aa=r(t=>{f.command("harvest").alias("hv").description("Harvest SOL from Validator Account to Authority Account").action(async()=>{let e=await Lp(t),{mainnetValidatorAuthorityKey:o}=N();console.log("Harvesting SOL..."),await Vo(t.RPC_URL);let n=await st(t.RPC_URL,j.VOTE),s=0;for(;n>1&&s<3;)console.log("Retrying Harvesting SOL..."),await rt(1e3),await Vo(t.RPC_URL),n=await st(t.RPC_URL,j.VOTE),s++;let a=JSON.parse(await Rp(o,"utf-8")),i=await st(t.RPC_URL,j.AUTH);if(i<1)console.log(no.white("Authority Account Balance is less than 1 SOL")),console.log(no.white("Skip converting SOL to elSOL"));else{let l=i-Ip;if(l=Math.round(l*1e9)/1e9,console.log(`Converting ${l} SOL to elSOL`),!await ze(t.RPC_URL,z,l,a))throw new Error("Failed to convert SOL to elSOL")}let c=await ia(t.RPC_URL);if(c<1){let l=await Ko(t.RPC_URL);console.log("elSOL Balance is less than 1 elSOL");let m=`elSOL Balance is less than 1 elSOL for ${l.epoch}`;await V(m),process.exit(0)}if(console.log(`Transferring ${c} elSOL to Harvest Address`),await fa(t.RPC_URL,a,e,c,tt,fr),t.IS_MEV_MODE){let m=`\u{1F4B0} Harvested Rewards for ${(await Ko(t.RPC_URL)).epoch} \u{1F4B0}
|
|
520
520
|
Validator Address: ${_(o)}
|
|
521
521
|
Total Reward: ${c} elSOL
|
|
522
|
-
Harvest Address: ${e}`;await V(m)}console.log(no.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),f.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Ea(t)&&(Pp("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(no.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),Lp=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await Cp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:ce}]);return await
|
|
522
|
+
Harvest Address: ${e}`;await V(m)}console.log(no.green("\u2714\uFE0E Successfully Harvested SOL")),process.exit(0)}),f.command("auto").alias("mev").description("Enable Auto Operation Mode").action(async()=>{await Ea(t)&&(Pp("solv cron epoch",{stdio:"inherit",shell:!0}),console.log(no.green("\u2714\uFE0E Auto Operation Mode Enabled"))),process.exit(0)})},"harvestCommands"),Lp=r(async t=>{try{let e=t.HARVEST_ACCOUNT;if(e==="")throw new Error("Harvest Address not found");return e}catch{let o=await Cp.prompt([{type:"input",name:"harvestAddress",message:"Enter Harvest Address",validate:ce}]);return await O({HARVEST_ACCOUNT:o.harvestAddress}),o.harvestAddress}},"getHarvestAddress");import{format as td}from"@skeet-framework/utils";import{writeFile as xp}from"fs/promises";var Vp=r(async t=>{await xp(Ae,JSON.stringify({...t},null,2),"utf-8")},"writeEpochDataToFile"),ht=Vp;var $p=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=n?_(a):_(s),c=`===\u23F3 ${t.epoch} \u23F3===
|
|
523
523
|
Validator: ${i}
|
|
524
524
|
Network: ${o.NETWORK}
|
|
525
525
|
CurrentEpoch: ${t.epoch}
|
|
526
526
|
Next epoch is coming in less than ${e}!
|
|
527
527
|
Epoch Completed: ${t.epochCompletedPercent}%
|
|
528
|
-
Until Next Epoch: ${t.epochRemainingTime}`;await V(c)},"alertMessage"),Kt=$p;var Dp=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await ht({...e,isLessThan1Day:!0}),await Kt(o,"1 Day",n))},"isLessThan1Day"),wa=Dp;var Kp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await ht({...e,isLessThan8Hours:!0}),await Kt(o,"8 Hours",n))},"lessThan8Hour"),_a=Kp;import{spawnSync as Up}from"child_process";import Mp from"chalk";var bp=r(async(t,e)=>{let o=Math.floor(Math.random()*(e-t+1)+t);return await new Promise(n=>setTimeout(n,o*1e3)),o},"randomSleep"),Na=bp;var Hp=r(async(t,e,o,n)=>{let s=n.IS_MEV_MODE,a=n.NETWORK===u.MAINNET;if(t<60&&!e.isLessThan1Hour){if(await ht({...e,isLessThan1Hour:!0}),await Kt(o,"1 Hour",n),s&&a){let i=await Na(1,100);console.log(Mp.white(`\u23F3 Waiting for ${i} seconds before running solv harvest...`)),Up("solv",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),
|
|
528
|
+
Until Next Epoch: ${t.epochRemainingTime}`;await V(c)},"alertMessage"),Kt=$p;var Dp=r(async(t,e,o,n)=>{t<24*60&&t>=8*60&&!e.isLessThan1Day&&(await ht({...e,isLessThan1Day:!0}),await Kt(o,"1 Day",n))},"isLessThan1Day"),wa=Dp;var Kp=r(async(t,e,o,n)=>{t<8*60&&t>=60&&!e.isLessThan8Hours&&(await ht({...e,isLessThan8Hours:!0}),await Kt(o,"8 Hours",n))},"lessThan8Hour"),_a=Kp;import{spawnSync as Up}from"child_process";import Mp from"chalk";var bp=r(async(t,e)=>{let o=Math.floor(Math.random()*(e-t+1)+t);return await new Promise(n=>setTimeout(n,o*1e3)),o},"randomSleep"),Na=bp;var Hp=r(async(t,e,o,n)=>{let s=n.IS_MEV_MODE,a=n.NETWORK===u.MAINNET;if(t<60&&!e.isLessThan1Hour){if(await ht({...e,isLessThan1Hour:!0}),await Kt(o,"1 Hour",n),s&&a){let i=await Na(1,100);console.log(Mp.white(`\u23F3 Waiting for ${i} seconds before running solv harvest...`)),Up("solv",["harvest"],{stdio:"inherit",shell:!0})}return!0}return!1},"lessThan1Hour"),va=Hp;var Fp=r(async(t,e)=>{let o=e.NETWORK===u.TESTNET,n={epoch:t.epoch,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1},{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?_(a):_(s);await ht(n),console.log("Epoch has been updated!");let c=`===\u23F3 ${t.epoch} \u23F3===
|
|
529
529
|
Validator: ${i}
|
|
530
530
|
Network: ${e.NETWORK}
|
|
531
531
|
CurrentEpoch: ${t.epoch}
|
|
532
532
|
Epoch has been updated!
|
|
533
|
-
Until Next Epoch: Approximately 2 days`;return await V(c),"Epoch has been updated!"},"newEpoch"),
|
|
533
|
+
Until Next Epoch: Approximately 2 days`;return await V(c),"Epoch has been updated!"},"newEpoch"),Oa=Fp;import{existsAsync as Yp}from"@skeet-framework/utils";import{readFile as jp,writeFile as Bp}from"fs/promises";import Jp from"chalk";import{homedir as Gp}from"os";var zp=r(async()=>{let e=Gp().includes("/home/solv")?Ae:"./currentEpoch.json";if(await Yp(e))return JSON.parse(await jp(e,"utf-8"));let o={epoch:0,isLessThan1Hour:!1,isLessThan8Hours:!1,isLessThan1Day:!1};return await Bp(e,JSON.stringify(o,null,2),"utf-8"),console.log(Jp.white("\u2714\uFE0F Initial epoch data has been created!")),o},"initOrReadEpochFile"),ka=zp;import Wp from"chalk";var qp=r(async t=>{let e=t.RPC_URL,o=t.NETWORK===u.TESTNET;if(o&&(e=Wo),await st(e,j.VALIDATOR,o)<po){let{mainnetValidatorKey:s,testnetValidatorKey:a}=N(),i=o?_(a):_(s),c=`\u26A0\uFE0F Validator Account Balance is less than ${po} SOL
|
|
534
534
|
Please top up your Validator Account
|
|
535
535
|
Address: ${i}`;return await V(c),!1}return console.log(Wp.green("\u2714\uFE0F Validator Account Balance is sufficient")),!0},"checkBalance"),Ra=qp;async function Qp(t="@gabrielhicks/solv"){try{let e=`https://registry.npmjs.org/${t}`,o=await fetch(e);if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return(await o.json())["dist-tags"].latest}catch(e){return console.error(`Error fetching latest version for package ${t}:`,e),null}}r(Qp,"getNpmLatestVersion");var Ca=Qp;async function Xp(){let t=Pt(),e=await Ca();if(!e)throw new Error("Failed to get NPM API");return console.log("currentVersion:",t),console.log("latestVersion:",e),t===e}r(Xp,"isVersionSame");var Pa=Xp;import{spawnSync as ed}from"child_process";import{spawnSync as Zp}from"node:child_process";var Ia=r(t=>{try{let e=`solana epoch-info --url '${t}'`,{stdout:o}=Zp(e,{shell:!0,stdio:"pipe"}),s=o.toString().split(`
|
|
536
536
|
`),a=s.find(h=>h.includes("Epoch Completed Time:")),i=s.find(h=>h.includes("Epoch Completed Percent:"))?.replace("Epoch Completed Percent:",""),c=Number(s.find(h=>h.includes("Epoch:"))?.replace("Epoch:",""));if(!a||!i||!c)throw new Error("Epoch Completed Time not found");let m=a.split("(")[1].replace(" remaining)","");console.log("remainingTime:",m);let d=/(?:(\d+)day\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s\s*)?/,p=m.match(d);if(p){let h=p[1]?parseInt(p[1]):0,g=p[2]?parseInt(p[2]):0,w=p[3]?parseInt(p[3]):0,S=p[4]?parseInt(p[4]):0,y=h*24*60+g*60+w+Math.floor(S/60);return{epoch:c,day:h,hour:g,min:w,sec:S,totalMinutes:y,epochRemainingTime:m,epochCompletedPercent:i}}else throw new Error("Time information could not be parsed")}catch(e){throw new Error(`getEpochInfoByRust failed: ${e}`)}},"getEpochInfoByRust");var od=r(async t=>{let e=t.NETWORK===u.TESTNET,o=e?we:t.RPC_URL,n=td(new Date,"yyyy-MM-dd HH:mm:ss");console.log(`Checking Epoch at ${n}`);let s=await ka(),a=Ia(o),{mainnetValidatorVoteKey:i,testnetValidatorVoteKey:c}=N(),m=await zt(o,_(e?c:i));if(m.isActive||await V(`\u26A0\uFE0F Validator is not active!
|
|
537
537
|
VoteAccount: ${m.pubkey}
|
|
538
538
|
Reason: ${m.reason}
|
|
539
539
|
Network: ${t.NETWORK}
|
|
540
|
-
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await Ra(t),!await Pa()&&t.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),ed("solv update && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await
|
|
541
|
-
$ ssh
|
|
540
|
+
Please check your validator node \u{1F477}\u200D\u2640\uFE0F`),console.log(`Validator is active: ${m.isActive}`),await Ra(t),!await Pa()&&t.AUTO_UPDATE)return console.log("Found new version of solv! Updating..."),ed("solv update && solv update --auto",{stdio:"inherit",shell:!0}),"Node has been restarted!";if(s.epoch<a.epoch)return await Oa(a,t),"Epoch has been updated!";let p=a.totalMinutes,h=[va,_a,wa];for(let g of h)if(await g(p,s,a,t))break;return"Epoch has not been changed!"},"epochTimer"),La=od;var xa=r(t=>{f.command("epochTimer").description("Check Solana Epoch Timer").action(async()=>{await La(t),process.exit(0)})},"epochTimerCommands");import Ja from"inquirer";import{join as Ka}from"path";import{spawnSync as Ut}from"node:child_process";import B from"chalk";import{spawnSync as rd}from"node:child_process";var nd=r((t,e,o,n="pipe",s="~/.ssh/id_rsa")=>{let a;try{let i=rd(`ssh -i ${s} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${e}'`,{shell:!0,stdio:n});return i.status!==0?(console.log(`\u26A0\uFE0F CMD Failed. Please check your SSH connection.
|
|
541
|
+
$ ssh solv@${t}
|
|
542
542
|
|
|
543
543
|
Failed Cmd: ${e}`),a={status:i.status,stdout:String(i.stdout),stderr:i.stderr.toString()},a):(a={status:i.status,stdout:i.stdout.toString(),stderr:i.stderr.toString()},a)}catch(i){return console.log(`scpSSH Error: ${i}`),a={status:null,stdout:"",stderr:String(i)},a}},"scpSSH"),Va=nd;import $a from"chalk";var sd=r((t,e,o)=>{console.log($a.white("\u{1F50D} Checking If Destination Validator Key is the same..."));let n=_(t).trim(),s=Va(e,`solana-keygen pubkey ${t}`,o).stdout.toString().trim();return n!==s?(console.log($a.yellow(`\u26A0\uFE0F Destination Identity Key is different.
|
|
544
544
|
Please check your Validator
|
|
545
|
-
$ ssh
|
|
545
|
+
$ ssh solv@${e}
|
|
546
546
|
|
|
547
547
|
Local Identity Key: ${n}
|
|
548
548
|
Destination Identity Key: ${s}`)),!1):!0},"checkValidatorKey"),bt=sd;var me=Ka(C,yt),Da=Ka(C,St),ba=r(async(t,e,o,n)=>{let s=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===E.RPC,i=s?I:D;a&&(i=I);let c=K();if(!bt(i,t,"solv"))return;console.log(B.white("\u{1F7E2} Waiting for restart window..."));let m=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${T} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ut(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
@@ -562,7 +562,7 @@ Failed Cmd: scp solv@${t}:${T}/tower-1_9-${e}.bin ${T}`));return}console.log(B.w
|
|
|
562
562
|
Failed Cmd: ${c} -l ${T} set-identity ${i}
|
|
563
563
|
ln -sf ${i} ${k}`));return}if(Ut(`ln -sf ${i} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(B.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
564
564
|
|
|
565
|
-
Failed Cmd: ln -sf ${i} ${k}`));return}console.log(B.white("\u{1F7E2} Identity changed successfully!")),await
|
|
565
|
+
Failed Cmd: ln -sf ${i} ${k}`));return}console.log(B.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!1})},"changeIdentityIncoming");import{join as Ma}from"path";import F from"chalk";import{spawnSync as Mt}from"node:child_process";var bo=Ma(C,yt),ad=Ma(C,St),Ua="~/.ssh/id_rsa",Ha=r(async(t,e,o,n)=>{let s=o.NETWORK===u.TESTNET,a=o.NODE_TYPE===E.RPC,i=s?I:D;a&&(i=I);let c=K();if(!bt(i,t,"solv"))return;let m=`${c} -l ${T} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`,d=n==="fd"?`cd ~/firedancer && sudo fdctl set-identity --config ~/firedancer/config.toml ${bo}`:`${c} -l ${T} set-identity ${bo}`,p=`ln -sf ${bo} ${ad}`,h=`scp ${T}/tower-1_9-${e}.bin solv@${t}:${T}`,g=n==="fd"?`cd ~/firedancer && sudo fdctl set-identity --config ~/firedancer/config.toml --require-tower ${i}`:`${c} -l ${T} set-identity --require-tower ${i}`,w=`ln -sf ${i} ${k}`;if(console.log(F.white("\u{1F7E2} Waiting for restart window...")),Mt(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
566
566
|
|
|
567
567
|
Failed Cmd: ${m}`));return}if(console.log(F.white("\u{1F7E2} Setting identity on the new validator...")),Mt(d,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F set-identity Failed. Please check your Validator
|
|
568
568
|
|
|
@@ -575,7 +575,7 @@ $ ssh solv@${t}
|
|
|
575
575
|
|
|
576
576
|
Failed Cmd: ${g}`)),console.log(F.white("\u{1F7E2} Changing the Symlink to the new validator keypair..."));let Yt=`ssh -i ${Ua} -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${w}'`;if(Mt(Yt,{shell:!0,stdio:"inherit"}).status!==0){console.log(F.yellow(`\u26A0\uFE0F Symlink Failed. Please check your Validator
|
|
577
577
|
|
|
578
|
-
Failed Cmd: ${w}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await
|
|
578
|
+
Failed Cmd: ${w}`));return}console.log(F.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!0})},"changeIdentityOutgoing");import{spawnSync as id}from"node:child_process";function Fa(t,e){let o=`ssh -o BatchMode=yes -o ConnectTimeout=5 solv@${t} exit`;return id(o,{shell:!0,stdio:"inherit"}).status===0}r(Fa,"checkSSHConnection");import pe from"chalk";import{join as ja}from"path";import{spawnSync as Ht}from"node:child_process";import J from"chalk";var so=ja(C,yt),Ya=ja(C,St),Ba=r(async(t,e,o)=>{let n=o.NETWORK===u.TESTNET,s=o.NODE_TYPE===E.RPC,a=n?I:D;if(s&&(a=I),!bt(a,t,"solv"))return;let c=Jo,l=Go;console.log(J.white("\u{1F7E2} Waiting for restart window..."));let m=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${T} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check'`;if(Ht(m,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F wait-for-restart-window Failed. Please check your Validator
|
|
579
579
|
$ ssh solv@${t}
|
|
580
580
|
|
|
581
581
|
Failed Cmd: ${c} -l ${T} wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check`));return}console.log(J.white("\u{1F7E2} Setting identity on the new validator..."));let p=`ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no solv@${t} -p 22 'cd ~ && source ~/.profile && ${c} -l ${T} set-identity ${so}'`;if(Ht(p,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Set Identity Failed. Please check your Validator
|
|
@@ -592,8 +592,8 @@ Failed Cmd: scp solv@${t}:${T}/tower-1_9-${e}.bin ${T}`));return}if(console.log(
|
|
|
592
592
|
Failed Cmd: ${l} -l ${T} set-identity ${a}
|
|
593
593
|
ln -sf ${a} ${k}`));return}if(Ht(`ln -sf ${a} ${k}`,{shell:!0,stdio:"inherit"}).status!==0){console.log(J.yellow(`\u26A0\uFE0F Chaning Identity Key Symlink Failed. Please check your Validator
|
|
594
594
|
|
|
595
|
-
Failed Cmd: ln -sf ${a} ${k}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await
|
|
596
|
-
You can choose only Incoming or Outgoing`));return}if(!Fa(m,
|
|
595
|
+
Failed Cmd: ln -sf ${a} ${k}`));return}console.log(J.white("\u{1F7E2} Identity changed successfully!")),await O({IS_DUMMY:!1})},"changeIdentityIncomingV1toV2");var cd=["Incoming","Outgoing"],Ga=r(async(t,e)=>{t.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>","Service User","").description("Switch Validator Identity with No Downtime").action(async o=>{try{let n=e.NETWORK===u.TESTNET,s=e.NODE_TYPE===E.RPC,a=n?I:D;s&&(a=I);let i=o.user,c=_(a),l=o.switchType,m=o.ip;if(l===""||m===""||i===""){let p=await Ja.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 client would you like to switch with?",choices:["solv","fd"]}]);l=p.switchType,m=p.ip,i=p.user}if(!cd.includes(l)){console.log(pe.yellow(`\u26A0\uFE0F Invalid Switch Type
|
|
596
|
+
You can choose only Incoming or Outgoing`));return}if(!Fa(m,"solv")){console.log("SSH Connection Failed");return}if(l==="Incoming"){if(o.v2MigrateIncoming){(await Ja.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(pe.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.log(pe.white("\u{1F7E2} Migrating V1 to V2 Incoming...")),await Ba(m,c,e);return}await ba(m,c,e,i)}else await Ha(m,c,e,i);process.exit(0)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(pe.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(pe.red(`Switch Error: ${n.message}`)),process.exit(0)}})},"switchCommand");import{spawnSync as ld}from"node:child_process";var md=r((t="306450862",e=T,o=X)=>{try{let n=`agave-ledger-tool --ledger ${e} create-snapshot --incremental --snapshot-archive-path ${o} --hard-fork ${t} -- ${t} ${e}`;console.log("Parameters to createSnapshot:",t,e,o),console.log("Command:",n);let s=ld(n,{shell:!0,stdio:"pipe",cwd:e});if(s.status!==0)throw new Error(`createSnapshot: ${s.error}`)}catch(n){throw new Error(`createSnapshot: ${n}`)}},"createSnapshot"),za=md;import Ft from"inquirer";import Ed from"dotenv";import vt from"chalk";var ao={SOL:{tokenMint:"So11111111111111111111111111111111111111112",associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},USDC:{tokenMint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},elSOL:{tokenMint:co,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}},Uo={So11111111111111111111111111111111111111112:{symbol:"SOL",tokenMint:Se,associationAccount:"4Vwkpk3DTVrTGnUQTazsgQ1wxtU9QwZTmAXDaQRHg9Ra",decimal:9},EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v:{symbol:"USDC",tokenMint:ye,associationAccount:"J8sqx9ZEoPRqboFAXK3c1R38zm41tRNJgUn2FzyeYQDj",decimal:6},ELSoL1owwMWQ9foMsutweCsMKbTPVBD9pFqxQGidTaMC:{symbol:"elSOL",tokenMint:co,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 ud}from"fs/promises";import{Connection as fd,Keypair as hd,VersionedTransaction as Sd}from"@solana/web3.js";import U from"chalk";import yd from"inquirer";import Td from"dotenv";var pd=r(async(t,e,o,n,s)=>{try{let a=`${t}/quote?inputMint=${o}&outputMint=${n}&amount=${s}`,i=await fetch(a,{method:"GET",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`}});return i.status===429?"Too many requests, please try again later":i.status===401?"Unauthorized, please check your API key":await i.json()}catch(a){throw new Error(`Error getJupiterQuote: ${a}`)}},"getJupiterQuote"),Wa=pd;var dd=r(async(t,e,o,n)=>{try{let s=o.outputMint,a,i=er[s];i?a={swapRequest:{quoteResponse:o,userPublicKey:n,feeAccount:i,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}}:a={swapRequest:{quoteResponse:o,userPublicKey:n,dynamicComputeUnitLimit:!0,prioritizationFeeLamports:"auto",dynamicSlippage:{maxBps:500}}};let c=`${t}/swap`,l=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e,Authorization:`Bearer ${e}`},body:JSON.stringify(a.swapRequest)});return l.status===429?"Too many requests, please try again later":await l.json()}catch(s){throw new Error(`Error postJupiterSwap: ${s}`)}},"postJupiterSwap"),qa=dd;Td.config();var Qa=r(async(t,e,o,n,s,a,i,c=!0)=>{let l=new fd(t,"confirmed"),m=await Wa(e,o,s,a,i);if(typeof m=="string"){m.includes("Unauthorized")&&(console.error(U.yellow(`\u26A0\uFE0F Invalid API key, please check your API key \u26A0\uFE0F
|
|
597
597
|
`)),console.log(U.white("Get Your API key \u{1F447}")),console.log(U.white(jt+`
|
|
598
598
|
`)),process.exit(0));let kt=`${U.yellow("\u26A0\uFE0F Too many requests, please try again later \u26A0\uFE0F")}
|
|
599
599
|
|
|
@@ -618,7 +618,7 @@ $ solv swap --input ${s} --output ${a} --amount ${i} --skip-confirm
|
|
|
618
618
|
You can upgrade your API key to increase your rate limits.
|
|
619
619
|
Get Your API key \u{1F447}
|
|
620
620
|
Validators Solutions: ${jt}
|
|
621
|
-
`;console.error(U.white(kt)),process.exit(0)}let Y=Buffer.from(y.swapTransaction,"base64"),P=Sd.deserialize(Y);P.sign([S]);let G=P.serialize(),
|
|
622
|
-
Transaction ID: ${
|
|
623
|
-
`)),wt()},"askForConfig");import{spawnSync as wd}from"node:child_process";var Za=r(()=>{wd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as _d}from"node:child_process";var ti=r(()=>{_d("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Nd}from"node:child_process";var ei=r(()=>{Nd("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as
|
|
621
|
+
`;console.error(U.white(kt)),process.exit(0)}let Y=Buffer.from(y.swapTransaction,"base64"),P=Sd.deserialize(Y);P.sign([S]);let G=P.serialize(),Ot=await l.sendRawTransaction(G,{skipPreflight:!0,maxRetries:2}),Yt=P.message.recentBlockhash;return console.log(`Swapping...
|
|
622
|
+
Transaction ID: ${Ot}`),await l.confirmTransaction({blockhash:Yt,lastValidBlockHeight:y.lastValidBlockHeight,signature:Ot},"confirmed"),Ot},"swap");Ed.config();var Xa=r(async(t,e)=>{t.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 o=>{try{await gd(e.RPC_URL,e.KEYPAIR_PATH,e.API_KEY,o.input,o.output,Number(o.amount),!o.skipConfirm,o.initConfig)}catch(n){n.message.includes("User force closed the prompt")&&(console.error(vt.cyan("Exiting...\u{1F31B}")),process.exit(0)),console.error(vt.red(`Swap Error: ${n.message}`)),process.exit(0)}})},"swapCommand"),gd=r(async(t,e,o,n="",s="",a=0,i=!0,c=!1)=>{console.log(vt.white("Solana RPC URL:",t)),console.log(vt.white("KeyfilePath:",e)),(!e||e===""||c)&&await Ad();let l=Xo,m=[...Zo,"Other"],d=n,p="",h=s,g=a;if(d===""){let y=await Ft.prompt([{type:"list",name:"name",message:"Select input mint",choices:m,default:Se}]);y.name==="Other"?d=(await Ft.prompt([{type:"input",name:"address",message:"Enter input mint address",default:ye}])).address:(p=y.name,d=ao[p].tokenMint)}if(h===""){m=m.filter(P=>P!==p);let y=await Ft.prompt([{type:"list",name:"name",message:"Select output mint",choices:m}]);if(y.name==="Other")h=(await Ft.prompt([{type:"input",name:"address",message:"Enter output mint address",default:tt}])).address;else{let P=y.name;h=ao[P].tokenMint}let Y=y.name;h=ao[Y].tokenMint}if(g===0){let y=await Ft.prompt([{type:"input",name:"amount",message:"Enter input amount in LAMPORTS. e.g. 0.01 SOL",default:"10000000"}]);g=Number(y.amount)}let S=await Qa(t,l,!o||o===""?tr:o,e,d,h,g,i);S||process.exit(0),console.log(vt.green("\u2714\uFE0E Sent Tx Successfully!")),console.log(vt.white(`Check Your TX \u{1F449}: https://solscan.io/tx/${S}`))},"swapCmd");var Ad=r(async()=>{let t=await Ft.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 O(t),console.log(vt.green(`\u2714\uFE0E Config Updated Successfully!
|
|
623
|
+
`)),wt()},"askForConfig");import{spawnSync as wd}from"node:child_process";var Za=r(()=>{wd("sudo systemctl status jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStatus");import{spawnSync as _d}from"node:child_process";var ti=r(()=>{_d("sudo systemctl start jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStart");import{spawnSync as Nd}from"node:child_process";var ei=r(()=>{Nd("sudo systemctl stop jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterStop");import{spawnSync as vd}from"node:child_process";var oi=r(()=>{vd("sudo systemctl restart jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterRestart");import{spawnSync as Od}from"node:child_process";var ri=r((t=!1)=>{Od(t?"journalctl -u jupiter-api.service -xef | grep ERROR":"journalctl -u jupiter-api.service -xef",{shell:!0,stdio:"inherit"})},"jupiterLog");import{spawnSync as kd}from"node:child_process";var ni=r(()=>{kd("sudo systemctl enable jupiter-api.service",{shell:!0,stdio:"inherit"})},"jupiterEnable");var si=r(()=>{let t=f.command("jupiter").description("Jupiter API Commands");t.command("status").description("Show Jupiter Status").action(()=>{Za()}),t.command("start").description("Start Jupiter").action(()=>{ti()}),t.command("stop").description("Stop Jupiter").action(()=>{ei()}),t.command("log").option("-e, --error","Show Error Logs",!1).description("Show Jupiter Logs").action(e=>{ri(e.error),process.exit(0)}),t.command("restart").description("Restart Jupiter").action(()=>{oi()}),t.command("enable").description("Enable Jupiter").action(()=>{ni()})},"jupiterCommands");import Cd from"chalk";var f=new Rd;f.name("solv").description("\u{1FA84} solv - Solana Validator Tool \u2728").helpOption("-h, --help","Display help for command").version(de,"-V","Display version");async function Pd(){try{let t=await x();Gn(t),Qn(t),Wn(t),ds(t),jr(t),Jr(),Xn(t),Ps(t),Vs(t),ps(),es(),jn(t),js(t),Zn(),Hs(),qs(t),Zs(t),Aa(t),Jn(),Xa(f,t),xa(t),Ga(f,t),si(),f.command("rm:log").description("Remove Logs").action(()=>{Bs()}),f.command("rm:snapshot").description("Remove Snapshot").action(()=>{Js(t)}),f.command("create:snapshot").description("Create Snapshot").option("-s, --slot <slot>","Slot","306450862").option("-l, --ledger <ledger>","Ledger",t.LEDGER_PATH).option("-n, --snapshots <snapshots>","Snapshots",t.SNAPSHOTS_PATH).action(e=>{console.log(Cd.white("\u{1F4DD} Creating Snapshot...")),za(e.slot,e.ledger,e.snapshots)}),f.command("monitor").alias("m").description("Monitor Solana Node").action(()=>{Gs(t)}),f.command("catchup").description("Check Solana Catchup Status").alias("c").alias("ca").action(()=>{zs()}),f.command("config").description("Show Solv Config").action(()=>{Qe(t)}),f.command("vv").description("Show Solv Version").action(()=>{let e=Ne();console.log("version:",e)}),await f.addHelpCommand("help [cmd]","Display help for command").parseAsync(process.argv),process.exit(0)}catch(t){console.log(t),process.exit(0)}}r(Pd,"main");Pd();export{f as program};
|
|
624
624
|
//# sourceMappingURL=index.js.map
|